slimx 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/slimx/tilt.rb ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tilt"
4
+ require_relative "../slimx"
5
+
6
+ module SlimX
7
+ class Template < Tilt::Template
8
+ def prepare
9
+ @code = SlimX.compile(data, file: eval_file, **options)
10
+ end
11
+
12
+ def precompiled_template(_locals)
13
+ @code
14
+ end
15
+ end
16
+ end
17
+
18
+ Tilt.register(SlimX::Template, "slim")
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlimX
4
+ VERSION = "0.1.0"
5
+ end
data/lib/slimx.rb ADDED
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "slimx/version"
4
+ require_relative "slimx/ast"
5
+ require_relative "slimx/shortcuts"
6
+ require_relative "slimx/parser"
7
+ require_relative "slimx/compiler"
8
+ require_relative "slimx/runtime"
9
+ require_relative "slimx/formatter"
10
+
11
+ module SlimX
12
+ class Error < StandardError; end
13
+ class InvalidAttributeNameError < Error; end
14
+ class UnsafeFormattingError < Error; end
15
+
16
+ class SyntaxError < Error
17
+ attr_reader :error, :file, :line, :lineno, :column
18
+
19
+ def initialize(error, file, line, lineno, column)
20
+ @error = error
21
+ @file = file || "(__TEMPLATE__)"
22
+ @line = line.to_s
23
+ @lineno = lineno
24
+ @column = column
25
+ super(to_s)
26
+ end
27
+
28
+ def to_s
29
+ line = @line.lstrip
30
+ column = @column + line.size - @line.size
31
+ <<~MESSAGE
32
+ #{error}
33
+ #{file}, Line #{lineno}, Column #{@column}
34
+ #{line}
35
+ #{" " * column}^
36
+ MESSAGE
37
+ end
38
+ end
39
+
40
+ class << self
41
+ # Strict mode refuses any template that is not already in the layout `slimx fmt` writes.
42
+ attr_accessor :strict
43
+
44
+ # Shortcuts also read Tailwind class names, such as `.rounded-b-[3px]` or `.lg:hover:underline`. Off by
45
+ # default so that switching from Slim changes no template: Slim renders `.size-2.5` as two classes.
46
+ attr_accessor :tailwind_classes
47
+
48
+ def compile(source, file: nil, shortcuts: Shortcuts::DEFAULT, strict: self.strict, tailwind_classes: self.tailwind_classes,
49
+ **compiler_options)
50
+ ensure_formatted!(source, file, shortcuts, tailwind_classes) if strict
51
+ Compiler.new(**compiler_options).call(Parser.new(file:, shortcuts:, tailwind_classes:).call(source))
52
+ end
53
+
54
+ private
55
+
56
+ def ensure_formatted!(source, file, shortcuts, tailwind_classes)
57
+ formatted = Formatter.new(shortcuts:, tailwind_classes:).layout(source)
58
+ return if formatted == source
59
+
60
+ lines = source.split("\n", -1)
61
+ expected_lines = formatted.split("\n", -1)
62
+ index = lines.each_index.find { lines[it] != expected_lines[it] } || lines.size
63
+ raise SyntaxError.new("Not formatted, `slimx fmt` writes: #{expected_lines[index].inspect}", file, lines[index], index + 1, lines[index].to_s[/\A\s*/].size)
64
+ end
65
+ end
66
+ end
67
+
68
+ require_relative "slimx/railtie" if defined?(Rails::Railtie)
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: slimx
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Clément Joubert
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
12
+ description: 'A Slim template engine rewritten from scratch, without Temple: same
13
+ HTML as Slim 5, faster compilation and rendering with fewer allocations, a formatter
14
+ that cannot change a page, a strict mode, and a linter with HTML and accessibility
15
+ rules.'
16
+ executables:
17
+ - slimx
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - LICENSE
22
+ - exe/slimx
23
+ - lib/slimx.rb
24
+ - lib/slimx/ast.rb
25
+ - lib/slimx/cli.rb
26
+ - lib/slimx/compiler.rb
27
+ - lib/slimx/formatter.rb
28
+ - lib/slimx/linter.rb
29
+ - lib/slimx/linter/rules.rb
30
+ - lib/slimx/parallel.rb
31
+ - lib/slimx/parser.rb
32
+ - lib/slimx/rails_handler.rb
33
+ - lib/slimx/railtie.rb
34
+ - lib/slimx/runtime.rb
35
+ - lib/slimx/shortcuts.rb
36
+ - lib/slimx/tilt.rb
37
+ - lib/slimx/version.rb
38
+ licenses:
39
+ - MIT
40
+ metadata:
41
+ rubygems_mfa_required: 'true'
42
+ rdoc_options: []
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '3.4'
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ requirements: []
56
+ rubygems_version: 4.0.23
57
+ specification_version: 4
58
+ summary: 'Slim templates, rewritten: faster to compile and render, with a formatter
59
+ and a linter'
60
+ test_files: []