erb-formatter 0.6.0 → 0.7.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.
- checksums.yaml +4 -4
 - data/README.md +6 -0
 - data/erb-formatter.gemspec +3 -0
 - data/lib/erb/formatter/command_line.rb +28 -5
 - data/lib/erb/formatter/version.rb +1 -1
 - data/lib/erb/formatter.rb +21 -9
 - metadata +31 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: a91fb15a3934ccb7a9589ebfefd60bd2b95610acb90259358a26239a34d7a3cb
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 576ac293a9932d8c81d2ef9a62cd98fc3a39a01da9c3b8ac7919438768e18c28
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 460305512646f76855effa266fb439083e571f9d14538e2b6417e00fec52859c2311d7ab2e2e44d32164320cb868d8d94e7c3118b2a855fd8270dfbb66303d17
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 9de4c93e2cf39ab24cf0b882b7c23291f812d9685fb6618b8787f425433288c1c3b9d4f3208118abedf54a193d01715734b3edbd523a8e694840a4eecd1230ba
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -125,6 +125,12 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run 
     | 
|
| 
       125 
125 
     | 
    
         | 
| 
       126 
126 
     | 
    
         
             
            To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
         
     | 
| 
       127 
127 
     | 
    
         | 
| 
      
 128 
     | 
    
         
            +
            In order to run a specific test, use the following command:
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
            ```bash
         
     | 
| 
      
 131 
     | 
    
         
            +
            m test/erb/test_formatter.rb:123
         
     | 
| 
      
 132 
     | 
    
         
            +
            ```
         
     | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
       128 
134 
     | 
    
         
             
            ## Contributing
         
     | 
| 
       129 
135 
     | 
    
         | 
| 
       130 
136 
     | 
    
         
             
            Bug reports and pull requests are welcome on GitHub at https://github.com/nebulab/erb-formatter.
         
     | 
    
        data/erb-formatter.gemspec
    CHANGED
    
    
| 
         @@ -3,6 +3,19 @@ require 'erb/formatter' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            require 'optparse'
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            class ERB::Formatter::CommandLine
         
     | 
| 
      
 6 
     | 
    
         
            +
              def self.tailwindcss_class_sorter(css_path)
         
     | 
| 
      
 7 
     | 
    
         
            +
                css = File.read(css_path)
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                css = css.tr("\n", " ").gsub(%r{\/\*.*?\*\/},"") # remove comments
         
     | 
| 
      
 10 
     | 
    
         
            +
                css = css.gsub(%r<@media.*?\{>, "") # strip media queries
         
     | 
| 
      
 11 
     | 
    
         
            +
                css = css.scan(%r<(?:^|\}|\{) *(\S.*?) *\{>).join(" ") # extract selectors
         
     | 
| 
      
 12 
     | 
    
         
            +
                classes = css.tr(","," ").split(" ").grep(/\./).uniq.map { _1.split('.').last.gsub("\\", "") }
         
     | 
| 
      
 13 
     | 
    
         
            +
                indexed_classes = Hash[classes.zip((0...classes.size).to_a)]
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                ->(class_name) do
         
     | 
| 
      
 16 
     | 
    
         
            +
                  indexed_classes[class_name] || classes.index { _1.start_with?(class_name) } || -1
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
       6 
19 
     | 
    
         | 
| 
       7 
20 
     | 
    
         
             
              attr_reader :write, :filename, :read_stdin
         
     | 
| 
       8 
21 
     | 
    
         | 
| 
         @@ -41,6 +54,10 @@ class ERB::Formatter::CommandLine 
     | 
|
| 
       41 
54 
     | 
    
         
             
                    @single_class_per_line = value
         
     | 
| 
       42 
55 
     | 
    
         
             
                  end
         
     | 
| 
       43 
56 
     | 
    
         | 
| 
      
 57 
     | 
    
         
            +
                  parser.on("--tailwind-output-path PATH", "Set the path to the tailwind output file") do |value|
         
     | 
| 
      
 58 
     | 
    
         
            +
                    @tailwind_output_path = value
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
       44 
61 
     | 
    
         
             
                  parser.on("--[no-]debug", "Enable debug mode") do |value|
         
     | 
| 
       45 
62 
     | 
    
         
             
                    $DEBUG = value
         
     | 
| 
       46 
63 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -61,10 +78,6 @@ class ERB::Formatter::CommandLine 
     | 
|
| 
       61 
78 
     | 
    
         
             
                @ignore_list ||= ERB::Formatter::IgnoreList.new
         
     | 
| 
       62 
79 
     | 
    
         
             
              end
         
     | 
| 
       63 
80 
     | 
    
         | 
| 
       64 
     | 
    
         
            -
              def ignore?(filename)
         
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
              end
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
81 
     | 
    
         
             
              def run
         
     | 
| 
       69 
82 
     | 
    
         
             
                if read_stdin
         
     | 
| 
       70 
83 
     | 
    
         
             
                  abort "Can't read both stdin and a list of files" unless @argv.empty?
         
     | 
| 
         @@ -77,11 +90,21 @@ class ERB::Formatter::CommandLine 
     | 
|
| 
       77 
90 
     | 
    
         
             
                  end
         
     | 
| 
       78 
91 
     | 
    
         
             
                end
         
     | 
| 
       79 
92 
     | 
    
         | 
| 
      
 93 
     | 
    
         
            +
                if @tailwind_output_path
         
     | 
| 
      
 94 
     | 
    
         
            +
                  css_class_sorter = self.class.tailwindcss_class_sorter(@tailwind_output_path)
         
     | 
| 
      
 95 
     | 
    
         
            +
                end
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
       80 
97 
     | 
    
         
             
                files.each do |(filename, code)|
         
     | 
| 
       81 
98 
     | 
    
         
             
                  if ignore_list.should_ignore_file? filename
         
     | 
| 
       82 
99 
     | 
    
         
             
                    print code unless write
         
     | 
| 
       83 
100 
     | 
    
         
             
                  else
         
     | 
| 
       84 
     | 
    
         
            -
                    html = ERB::Formatter.new( 
     | 
| 
      
 101 
     | 
    
         
            +
                    html = ERB::Formatter.new(
         
     | 
| 
      
 102 
     | 
    
         
            +
                      code,
         
     | 
| 
      
 103 
     | 
    
         
            +
                      filename: filename,
         
     | 
| 
      
 104 
     | 
    
         
            +
                      line_width: @width || 80,
         
     | 
| 
      
 105 
     | 
    
         
            +
                      single_class_per_line: @single_class_per_line,
         
     | 
| 
      
 106 
     | 
    
         
            +
                      css_class_sorter: css_class_sorter
         
     | 
| 
      
 107 
     | 
    
         
            +
                    )
         
     | 
| 
       85 
108 
     | 
    
         | 
| 
       86 
109 
     | 
    
         
             
                    if write
         
     | 
| 
       87 
110 
     | 
    
         
             
                      File.write(filename, html)
         
     | 
    
        data/lib/erb/formatter.rb
    CHANGED
    
    | 
         @@ -48,10 +48,17 @@ class ERB::Formatter 
     | 
|
| 
       48 
48 
     | 
    
         | 
| 
       49 
49 
     | 
    
         
             
              SELF_CLOSING_TAG = /\A(area|base|br|col|command|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)\z/i
         
     | 
| 
       50 
50 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
               
     | 
| 
       52 
     | 
    
         
            -
                 
     | 
| 
       53 
     | 
    
         
            -
                 
     | 
| 
       54 
     | 
    
         
            -
               
     | 
| 
      
 51 
     | 
    
         
            +
              begin
         
     | 
| 
      
 52 
     | 
    
         
            +
                require 'prism' # ruby 3.3
         
     | 
| 
      
 53 
     | 
    
         
            +
                RUBY_OPEN_BLOCK = Prism.method(:parse_failure?)
         
     | 
| 
      
 54 
     | 
    
         
            +
              rescue LoadError
         
     | 
| 
      
 55 
     | 
    
         
            +
                require 'ripper'
         
     | 
| 
      
 56 
     | 
    
         
            +
                RUBY_OPEN_BLOCK = ->(code) do
         
     | 
| 
      
 57 
     | 
    
         
            +
                  # is nil when the parsing is broken, meaning it's an open expression
         
     | 
| 
      
 58 
     | 
    
         
            +
                  Ripper.sexp(code).nil?
         
     | 
| 
      
 59 
     | 
    
         
            +
                end.freeze
         
     | 
| 
      
 60 
     | 
    
         
            +
              end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
       55 
62 
     | 
    
         
             
              RUBY_CLOSE_BLOCK = /\Aend\z/
         
     | 
| 
       56 
63 
     | 
    
         
             
              RUBY_REOPEN_BLOCK = /\A(else|elsif\b(.*)|when\b(.*))\z/
         
     | 
| 
       57 
64 
     | 
    
         | 
| 
         @@ -68,7 +75,7 @@ class ERB::Formatter 
     | 
|
| 
       68 
75 
     | 
    
         
             
                new(source, filename: filename).html
         
     | 
| 
       69 
76 
     | 
    
         
             
              end
         
     | 
| 
       70 
77 
     | 
    
         | 
| 
       71 
     | 
    
         
            -
              def initialize(source, line_width: 80, single_class_per_line: false, filename: nil, debug: $DEBUG)
         
     | 
| 
      
 78 
     | 
    
         
            +
              def initialize(source, line_width: 80, single_class_per_line: false, filename: nil, css_class_sorter: nil, debug: $DEBUG)
         
     | 
| 
       72 
79 
     | 
    
         
             
                @original_source = source
         
     | 
| 
       73 
80 
     | 
    
         
             
                @filename = filename || '(erb)'
         
     | 
| 
       74 
81 
     | 
    
         
             
                @line_width = line_width
         
     | 
| 
         @@ -76,6 +83,7 @@ class ERB::Formatter 
     | 
|
| 
       76 
83 
     | 
    
         
             
                @html = +""
         
     | 
| 
       77 
84 
     | 
    
         
             
                @debug = debug
         
     | 
| 
       78 
85 
     | 
    
         
             
                @single_class_per_line = single_class_per_line
         
     | 
| 
      
 86 
     | 
    
         
            +
                @css_class_sorter = css_class_sorter
         
     | 
| 
       79 
87 
     | 
    
         | 
| 
       80 
88 
     | 
    
         
             
                html.extend DebugShovel if @debug
         
     | 
| 
       81 
89 
     | 
    
         | 
| 
         @@ -118,7 +126,9 @@ class ERB::Formatter 
     | 
|
| 
       118 
126 
     | 
    
         
             
                return "" if attrs.strip.empty?
         
     | 
| 
       119 
127 
     | 
    
         | 
| 
       120 
128 
     | 
    
         
             
                plain_attrs = attrs.tr("\n", " ").squeeze(" ").gsub(erb_tags_regexp, erb_tags)
         
     | 
| 
       121 
     | 
    
         
            -
                 
     | 
| 
      
 129 
     | 
    
         
            +
                within_line_width = "<#{tag_name} #{plain_attrs}#{tag_closing}".size <= line_width
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
                return " #{plain_attrs}" if within_line_width && !@css_class_sorter && !plain_attrs.match?(/ class=/)
         
     | 
| 
       122 
132 
     | 
    
         | 
| 
       123 
133 
     | 
    
         
             
                attr_html = ""
         
     | 
| 
       124 
134 
     | 
    
         
             
                tag_stack_push(['attr='], attrs)
         
     | 
| 
         @@ -133,8 +143,10 @@ class ERB::Formatter 
     | 
|
| 
       133 
143 
     | 
    
         
             
                  end
         
     | 
| 
       134 
144 
     | 
    
         | 
| 
       135 
145 
     | 
    
         
             
                  value_parts = value[1...-1].strip.split(/\s+/)
         
     | 
| 
      
 146 
     | 
    
         
            +
                  value_parts.sort_by!(&@css_class_sorter) if name == 'class' && @css_class_sorter
         
     | 
| 
       136 
147 
     | 
    
         | 
| 
       137 
     | 
    
         
            -
                  full_attr =  
     | 
| 
      
 148 
     | 
    
         
            +
                  full_attr = "#{name}=#{value[0]}#{value_parts.join(" ")}#{value[-1]}"
         
     | 
| 
      
 149 
     | 
    
         
            +
                  full_attr = within_line_width ? " #{full_attr}" : indented(full_attr)
         
     | 
| 
       138 
150 
     | 
    
         | 
| 
       139 
151 
     | 
    
         
             
                  if full_attr.size > line_width && MULTILINE_ATTR_NAMES.include?(name) && attr.match?(QUOTED_ATTR)
         
     | 
| 
       140 
152 
     | 
    
         
             
                    attr_html << indented("#{name}=#{value[0]}")
         
     | 
| 
         @@ -158,14 +170,14 @@ class ERB::Formatter 
     | 
|
| 
       158 
170 
     | 
    
         
             
                    end
         
     | 
| 
       159 
171 
     | 
    
         | 
| 
       160 
172 
     | 
    
         
             
                    tag_stack_pop('attr"', value)
         
     | 
| 
       161 
     | 
    
         
            -
                    attr_html << indented(value[-1])
         
     | 
| 
      
 173 
     | 
    
         
            +
                    attr_html << (within_line_width ? value[-1] : indented(value[-1]))
         
     | 
| 
       162 
174 
     | 
    
         
             
                  else
         
     | 
| 
       163 
175 
     | 
    
         
             
                    attr_html << full_attr
         
     | 
| 
       164 
176 
     | 
    
         
             
                  end
         
     | 
| 
       165 
177 
     | 
    
         
             
                end
         
     | 
| 
       166 
178 
     | 
    
         | 
| 
       167 
179 
     | 
    
         
             
                tag_stack_pop(['attr='], attrs)
         
     | 
| 
       168 
     | 
    
         
            -
                attr_html << indented("")
         
     | 
| 
      
 180 
     | 
    
         
            +
                attr_html << indented("") unless within_line_width
         
     | 
| 
       169 
181 
     | 
    
         
             
                attr_html
         
     | 
| 
       170 
182 
     | 
    
         
             
              end
         
     | 
| 
       171 
183 
     | 
    
         | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: erb-formatter
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.7.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Elia Schito
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2023-12- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2023-12-29 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: syntax_tree
         
     | 
| 
         @@ -24,6 +24,34 @@ dependencies: 
     | 
|
| 
       24 
24 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       25 
25 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       26 
26 
     | 
    
         
             
                    version: '6.0'
         
     | 
| 
      
 27 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 28 
     | 
    
         
            +
              name: tailwindcss-rails
         
     | 
| 
      
 29 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 30 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 31 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 32 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 33 
     | 
    
         
            +
                    version: '2.0'
         
     | 
| 
      
 34 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 35 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 36 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 37 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 38 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 39 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 40 
     | 
    
         
            +
                    version: '2.0'
         
     | 
| 
      
 41 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 42 
     | 
    
         
            +
              name: m
         
     | 
| 
      
 43 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 44 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 45 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 46 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 47 
     | 
    
         
            +
                    version: '1.0'
         
     | 
| 
      
 48 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 49 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 50 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 51 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 52 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 53 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 54 
     | 
    
         
            +
                    version: '1.0'
         
     | 
| 
       27 
55 
     | 
    
         
             
            description:
         
     | 
| 
       28 
56 
     | 
    
         
             
            email:
         
     | 
| 
       29 
57 
     | 
    
         
             
            - elia@schito.me
         
     | 
| 
         @@ -68,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       68 
96 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       69 
97 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       70 
98 
     | 
    
         
             
            requirements: []
         
     | 
| 
       71 
     | 
    
         
            -
            rubygems_version: 3.3 
     | 
| 
      
 99 
     | 
    
         
            +
            rubygems_version: 3.5.3
         
     | 
| 
       72 
100 
     | 
    
         
             
            signing_key:
         
     | 
| 
       73 
101 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       74 
102 
     | 
    
         
             
            summary: Format ERB files with speed and precision.
         
     |