diff options
Diffstat (limited to 'src/frontend/File.zig')
| -rw-r--r-- | src/frontend/File.zig | 78 |
1 files changed, 14 insertions, 64 deletions
diff --git a/src/frontend/File.zig b/src/frontend/File.zig index e7c3b6d..fac6a03 100644 --- a/src/frontend/File.zig +++ b/src/frontend/File.zig @@ -1,6 +1,6 @@ -const std = @import("std"); +const Minifier = @import("Minifier.zig"); -pub fn File(comptime tag: ?[]const u8, Iterator: type) type { +pub fn File(comptime tag: ?[]const u8, comptime minifier: Minifier) type { const opening = if (tag) |t| "<" ++ t ++ ">" else ""; const closing = if (tag) |t| "</" ++ t ++ ">" else ""; @@ -22,70 +22,20 @@ pub fn File(comptime tag: ?[]const u8, Iterator: type) type { }; } - fn content(comptime self: @This()) []const u8 { - return opening ++ @embedFile(self.file) ++ closing; - } - - fn content_minified(comptime self: @This()) []const u8 { - var minified: []const u8 = ""; - var iterator: Iterator = .init(@embedFile(self.file)); - - while (iterator.next()) |segment| { - minified = minified ++ segment; - } - - return opening ++ minified ++ closing; - } - pub fn to_html_string(comptime self: @This()) []const u8 { - return if (self.do_minify) self.content_minified() else self.content(); - } - }; -} - -fn StringIterator(comptime quotes: []const u8) type { - return struct { - content: []const u8, - - pub fn init(content: []const u8) @This() { - return .{ .content = content }; - } - - pub fn next(self: *@This()) ?[]const u8 { - @setEvalBranchQuota(self.content.len * 20); - - self.content = std.mem.trimStart(u8, self.content, &std.ascii.whitespace); - - if (self.content.len == 0) return null; - - var index: usize = 0; - - while (self.content.len > index) { - const char = self.content[index]; - - if (std.mem.indexOfScalar(u8, quotes, char) != null) { - index += 1; - while (self.content.len > index) { - if (self.content[index] == char) { - index += 1; - break; - } - index += 1; - } - } else if (std.ascii.isWhitespace(char)) { - break; - } - index += 1; - } - - const block = self.content[0..index]; - self.content = self.content[index..]; - - return block ++ " "; + return opening ++ (if (self.do_minify) + minifier.minify(@embedFile(self.file)) + else + @embedFile(self.file)) ++ closing; } }; } -pub const Style = File("style", StringIterator("\"'")); -pub const Script = File("script", StringIterator("\"'`")); -pub const Html = File(null, StringIterator("\"'")); +/// When using regex in Javascript the spaces +/// might get trimmed since /re/ is a awful syntax +/// I don't what to add a rule for it currently, +/// Since a single `/` is a operator but if there are two on one line +/// it is a regex. +pub const Script = File("script", .js); +pub const Style = File("style", .css); +pub const Html = File(null, .html); |