html2slim 0.0.1 → 0.0.2

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/README.md CHANGED
@@ -1,6 +1,10 @@
1
+ [![Build Status](https://travis-ci.org/slim-template/html2slim.png?branch=master)](https://travis-ci.org/slim-template/html2slim)
2
+
3
+ [![Code climate](https://codeclimate.com/github/slim-template/html2slim.png)](https://codeclimate.com/github/slim-template/html2slim)
4
+
1
5
  ## HTML2Slim
2
6
 
3
- Script for converting HTML (or sHTML) files to slim (slim-lang.org).
7
+ Script for converting HTML and ERB files to slim (slim-lang.org).
4
8
 
5
9
  It's not perfect, but certainly it helps a lot!
6
10
 
@@ -8,7 +12,7 @@ It's based on Hpricot. Yeah, I'm old school.
8
12
 
9
13
  ## Usage
10
14
 
11
- You may convert files using the included executable `html2slim`.
15
+ You may convert files using the included executables `html2slim` and `erb2slim`.
12
16
 
13
17
  # html2slim -h
14
18
 
@@ -18,7 +22,15 @@ You may convert files using the included executable `html2slim`.
18
22
  -h, --help Show this message
19
23
  -v, --version Print version
20
24
 
21
- Alternatively, to convert files or strings on the fly in your application, you may do so by calling `HTML2Slim.convert!`.
25
+ # erb2slim -h
26
+
27
+ Usage: erb2slim INPUT_FILENAME_OR_DIRECTORY [OUTPUT_FILENAME_OR_DIRECTORY] [options]
28
+ --trace Show a full traceback on error
29
+ -d, --delete Delete ERB files
30
+ -h, --help Show this message
31
+ -v, --version Print version
32
+
33
+ Alternatively, to convert files or strings on the fly in your application, you may do so by calling `HTML2Slim.convert!(file, format)` where format is either :html or :erb.
22
34
 
23
35
  ## License
24
36
 
@@ -34,6 +46,6 @@ https://github.com/slim-template/html2slim
34
46
 
35
47
  ## ROADMAP
36
48
 
37
- 1. Improve minitests
38
- 2. ERB support, I guess...
49
+ 1. ERB support is pre-alpha, and works only for 90% of the cases. Lotsa weird regexes. Gotta improve that.
50
+ 2. Use temple.
39
51
  3. Merge with other *2slim gems. Would be handy.
data/bin/erb2slim ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.dirname(__FILE__) + '/../lib'
4
+ require 'html2slim/command'
5
+
6
+ cmd = HTML2Slim::ERBCommand.new(ARGV)
7
+ cmd.run
data/bin/html2slim CHANGED
@@ -3,5 +3,5 @@
3
3
  $:.unshift File.dirname(__FILE__) + '/../lib'
4
4
  require 'html2slim/command'
5
5
 
6
- cmd = HTML2Slim::Command.new(ARGV)
6
+ cmd = HTML2Slim::HTMLCommand.new(ARGV)
7
7
  cmd.run
data/lib/html2slim.rb CHANGED
@@ -2,7 +2,11 @@ require_relative 'html2slim/version'
2
2
  require_relative 'html2slim/converter'
3
3
 
4
4
  module HTML2Slim
5
- def self.convert!(input)
6
- Converter.new(input)
5
+ def self.convert!(input, format=:html)
6
+ if format.to_s == "html"
7
+ HTMLConverter.new(input)
8
+ else
9
+ ERBConverter.new(input)
10
+ end
7
11
  end
8
12
  end
@@ -3,6 +3,7 @@ require 'html2slim'
3
3
 
4
4
  module HTML2Slim
5
5
  class Command
6
+
6
7
  def initialize(args)
7
8
  @args = args
8
9
  @options = {}
@@ -23,8 +24,16 @@ module HTML2Slim
23
24
 
24
25
  protected
25
26
 
27
+ def format
28
+ @format ||= (self.class.to_s =~ /ERB/ ? :erb : :html)
29
+ end
30
+
31
+ def command_name
32
+ @command_name ||= format == :html ? "html2slim" : "erb2slim"
33
+ end
34
+
26
35
  def set_opts(opts)
27
- opts.banner = "Usage: html2slim INPUT_FILENAME_OR_DIRECTORY [OUTPUT_FILENAME_OR_DIRECTORY] [options]"
36
+ opts.banner = "Usage: #{command_name} INPUT_FILENAME_OR_DIRECTORY [OUTPUT_FILENAME_OR_DIRECTORY] [options]"
28
37
 
29
38
  opts.on('--trace', :NONE, 'Show a full traceback on error') do
30
39
  @options[:trace] = true
@@ -36,11 +45,11 @@ module HTML2Slim
36
45
  end
37
46
 
38
47
  opts.on_tail('-v', '--version', 'Print version') do
39
- puts "html2slim #{HTML2Slim::VERSION}"
48
+ puts "#{command_name} #{HTML2Slim::VERSION}"
40
49
  exit
41
50
  end
42
51
 
43
- opts.on('-d', '--delete', 'Delete HTML files') do
52
+ opts.on('-d', '--delete', "Delete #{format.upcase} files") do
44
53
  @options[:delete] = true
45
54
  end
46
55
  end
@@ -80,10 +89,15 @@ module HTML2Slim
80
89
  end
81
90
 
82
91
  @options[:output] = slim_file && slim_file != '-' ? File.open(slim_file, 'w') : $stdout
83
- @options[:output].puts HTML2Slim.convert!(in_file)
92
+ # raise "|||#{self.class.inspect}|||"
93
+ @options[:output].puts HTML2Slim.convert!(in_file, format)
84
94
  @options[:output].close
85
95
 
86
96
  File.delete(file) if @options[:delete]
87
97
  end
88
98
  end
99
+ class HTMLCommand < Command
100
+ end
101
+ class ERBCommand < Command
102
+ end
89
103
  end
@@ -1,12 +1,34 @@
1
1
  require_relative 'hpricot_monkeypatches'
2
- # html = File.read(ARGV[0])
2
+
3
3
  module HTML2Slim
4
4
  class Converter
5
+ def to_s
6
+ @slim
7
+ end
8
+ end
9
+ class HTMLConverter < Converter
5
10
  def initialize(html)
6
11
  @slim = Hpricot(html).to_slim
7
12
  end
8
- def to_s
9
- @slim
13
+ end
14
+ class ERBConverter < Converter
15
+ def initialize(file)
16
+ # open.read makes it works for files & IO
17
+ erb = File.exists?(file) ? open(file).read : file
18
+
19
+ erb.gsub!(/<%(.+?)\s*\{\s*(\|.+?\|)?\s*%>/){ %(<%#{$1} do #{$2}%>) }
20
+
21
+ # while, case, if, for and blocks...
22
+ erb.gsub!(/<%(\s*while .+?|\s*case .+?|\s*if .+?|\s*for .+?|.+?do\s*(\|.+?\|)?\s*)%>/){ %(<ruby code="#{$1.gsub(/"/, '&quot;')}">) }
23
+ # else
24
+ erb.gsub!(/<%\s*else\s*%>/, %(</ruby><ruby code="else">))
25
+ # elsif
26
+ erb.gsub!(/<%\s*(elsif .+?)\s*%>/){ %(</ruby><ruby code="#{$1}">) }
27
+ # when
28
+ erb.gsub!(/<%\s*(when .+?)\s*%>/){ %(</ruby><ruby code="#{$1}">) }
29
+ erb.gsub!(/<%\s*(end|})\s*%>/, %(</ruby>))
30
+ erb.gsub!(/<%(.+?)\s*%>/){ %(<ruby code="#{$1.gsub(/"/, '&quot;')}"></ruby>) }
31
+ @slim ||= Hpricot(erb).to_slim
10
32
  end
11
33
  end
12
34
  end
@@ -1,5 +1,7 @@
1
1
  require 'hpricot'
2
2
 
3
+ Hpricot::XHTMLTransitional.tagset[:ruby] = [:code]
4
+ # raise Hpricot::XHTMLTransitional.tagset.inspect
3
5
  class Hpricot::BogusETag
4
6
  def to_slim(lvl=0)
5
7
  nil
@@ -8,22 +10,14 @@ end
8
10
 
9
11
  class Hpricot::Text
10
12
  def to_slim(lvl=0)
11
- if to_s.strip.empty?
12
- nil
13
- else
14
- (' ' * lvl) + %(| #{to_s.gsub(/\s+/, ' ')})
15
- end
13
+ return nil if to_s.strip.empty?
14
+ (' ' * lvl) + %(| #{to_s.gsub(/\s+/, ' ')})
16
15
  end
17
16
  end
18
17
 
19
18
  class Hpricot::Comment
20
19
  def to_slim(lvl=0)
21
- # For SHTML <!--#include virtual="foo.html" -->
22
- if self.content =~ /include (file|virtual)="(.+)"/
23
- (' ' * lvl) + "= render '#{$~[2]}'"
24
- else
25
- nil
26
- end
20
+ nil
27
21
  end
28
22
  end
29
23
 
@@ -36,22 +30,20 @@ end
36
30
  class Hpricot::Elem
37
31
  def slim(lvl=0)
38
32
  r = (' ' * lvl)
39
- if self.name == 'div' and (self.has_attribute?('id') || self.has_attribute?('class'))
40
- r += ''
41
- else
42
- r += self.name
43
- end
44
- if(self.has_attribute?('id'))
45
- r += "##{self['id']}"
46
- self.remove_attribute('id')
47
- end
48
- if(self.has_attribute?('class'))
49
- r += ".#{self['class'].split(/\s+/).join('.')}"
50
- self.remove_attribute('class')
51
- end
52
- unless attributes_as_html.to_s.strip.empty?
53
- r += "[#{attributes_as_html.to_s.strip}]"
33
+ if self.name == "ruby"
34
+ if self.attributes["code"].strip[0] == "="
35
+ return r += self.attributes["code"].strip
36
+ else
37
+ return r += "- " + self.attributes["code"].strip
38
+ end
54
39
  end
40
+
41
+ r += self.name unless self.name == 'div' and (self.has_attribute?('id') || self.has_attribute?('class'))
42
+ r += "##{self['id']}" if self.has_attribute?('id')
43
+ self.remove_attribute('id')
44
+ r += ".#{self['class'].split(/\s+/).join('.')}" if self.has_attribute?('class')
45
+ self.remove_attribute('class')
46
+ r += "[#{attributes_as_html.to_s.strip}]" unless attributes_as_html.to_s.strip.empty?
55
47
  r
56
48
  end
57
49
  def to_slim(lvl=0)
@@ -1,3 +1,3 @@
1
1
  module HTML2Slim
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: html2slim
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-16 00:00:00.000000000Z
12
+ date: 2013-04-17 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: hpricot
16
- requirement: &2152919480 !ruby/object:Gem::Requirement
16
+ requirement: &2153298760 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152919480
24
+ version_requirements: *2153298760
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: minitest
27
- requirement: &2152919060 !ruby/object:Gem::Requirement
27
+ requirement: &2153298340 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,21 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2152919060
35
+ version_requirements: *2153298340
36
+ - !ruby/object:Gem::Dependency
37
+ name: rake
38
+ requirement: &2153297920 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2153297920
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: slim
38
- requirement: &2152918540 !ruby/object:Gem::Requirement
49
+ requirement: &2153297400 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
@@ -43,18 +54,20 @@ dependencies:
43
54
  version: 1.0.0
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *2152918540
57
+ version_requirements: *2153297400
47
58
  description: Convert HTML to Slim templates. Because HTML sux and Slim rules. That's
48
59
  why.
49
60
  email:
50
61
  - maiz@lulk.in
51
62
  executables:
63
+ - erb2slim
52
64
  - html2slim
53
65
  extensions: []
54
66
  extra_rdoc_files:
55
67
  - README.md
56
68
  files:
57
69
  - README.md
70
+ - bin/erb2slim
58
71
  - bin/html2slim
59
72
  - lib/html2slim.rb
60
73
  - lib/html2slim/command.rb