guides 0.6.8 → 0.6.8.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -201,7 +201,7 @@ module Guides
201
201
  <ol class="chapters">
202
202
  INDEX
203
203
 
204
- i = Indexer.new(body, warnings)
204
+ i = Indexer.new(body, warnings, @production)
205
205
  i.index
206
206
 
207
207
  # Set index for 2 levels
@@ -6,10 +6,11 @@ module Guides
6
6
  class Indexer
7
7
  attr_reader :body, :result, :warnings, :level_hash
8
8
 
9
- def initialize(body, warnings)
9
+ def initialize(body, warnings, production = false)
10
10
  @body = body
11
11
  @result = @body.dup
12
12
  @warnings = warnings
13
+ @production = production
13
14
  end
14
15
 
15
16
  def index
@@ -19,41 +20,40 @@ module Guides
19
20
  private
20
21
 
21
22
  def process(string, current_level=3, counters=[1])
23
+ if @production
24
+ # Ignore anything in construction tags
25
+ string = string.gsub(%r{<construction>.*?</construction>}m, '')
26
+ end
27
+
22
28
  s = StringScanner.new(string)
23
29
 
24
30
  level_hash = ActiveSupport::OrderedHash.new
25
31
 
26
- while !s.eos?
27
- re = %r{^h(\d)(?:\((#.*?)\))?\s*\.\s*(.*)$}
28
- s.match?(re)
29
- if matched = s.matched
30
- matched =~ re
31
- level, idx, title = $1.to_i, $2, $3.strip
32
+ while s.scan_until(%r{^h(\d)(?:\((#.*?)\))?\s*\.\s*(.*)$})
33
+ level, idx, title = s[1].to_i, s[2], s[3].strip
32
34
 
33
- if level < current_level
34
- # This is needed. Go figure.
35
- return level_hash
36
- elsif level == current_level
37
- index = counters.join(".")
38
- idx ||= '#' + title_to_idx(title)
35
+ if level < current_level
36
+ # This is needed. Go figure.
37
+ return level_hash
38
+ elsif level == current_level
39
+ index = counters.join(".")
40
+ idx ||= '#' + title_to_idx(title)
39
41
 
40
- raise "Parsing Fail" unless @result.sub!(matched, "h#{level}(#{idx}). #{index} #{title}")
42
+ raise "Parsing Fail" unless @result.sub!(s.matched, "h#{level}(#{idx}). #{index} #{title}")
41
43
 
42
- key = {
43
- :title => title,
44
- :id => idx
45
- }
46
- # Recurse
47
- counters << 1
48
- level_hash[key] = process(s.post_match, current_level + 1, counters)
49
- counters.pop
44
+ key = {
45
+ :title => title,
46
+ :id => idx
47
+ }
48
+ # Recurse
49
+ counters << 1
50
+ level_hash[key] = process(s.post_match, current_level + 1, counters)
51
+ counters.pop
50
52
 
51
- # Increment the current level
52
- last = counters.pop
53
- counters << last + 1
54
- end
53
+ # Increment the current level
54
+ last = counters.pop
55
+ counters << last + 1
55
56
  end
56
- s.getch
57
57
  end
58
58
  level_hash
59
59
  end
@@ -2,6 +2,14 @@ require "strscan"
2
2
  require "cgi"
3
3
 
4
4
  module Guides
5
+ module HTMLFormatter
6
+ include RedCloth::Formatters::HTML
7
+
8
+ def br(opts)
9
+ " "
10
+ end
11
+ end
12
+
5
13
  class TextileTransformer
6
14
  LANGUAGES = { "ruby" => "ruby", "sql" => "sql", "javascript" => "javascript",
7
15
  "css" => "css", "plain" => "plain", "erb" => "ruby; html-script: true",
@@ -61,23 +69,21 @@ module Guides
61
69
  end
62
70
 
63
71
  def consume_note(css_class)
64
- match = scan_until /(\r?\n){2}/
72
+ match = scan_until /(\r?\n){2,}/ # We need at least 2 line breaks but we want to match as many as exist
65
73
  note = match.pre_match.gsub(/\n\s*/, " ")
66
74
  note = RedCloth.new(note, [:lite_mode]).to_html
67
75
  @output << %{<div class="#{css_class}"><p>#{note}</p></div>\n}
68
76
  end
69
77
 
70
78
  def consume_construction
71
- if @production
72
- @string.sub!(%r{^.*</construction>}, '')
73
- else
74
- @string.sub!(%r{</construction>}, '')
79
+ match = scan_until(%r{</construction>})
80
+ unless @production
81
+ @string = match.pre_match + @string
75
82
  end
76
83
  end
77
84
 
78
85
  def flush_textile
79
- @pending_textile.gsub!(/(?<!\n)\n(?!\n)/, ' ') # Don't convert single \n to line-breaks
80
- @output << RedCloth.new(@pending_textile).to_html << "\n"
86
+ @output << RedCloth.new(@pending_textile).to(HTMLFormatter) << "\n"
81
87
  @pending_textile = ""
82
88
  end
83
89
  end
@@ -1,3 +1,3 @@
1
1
  module Guides
2
- VERSION = "0.6.8"
2
+ VERSION = "0.6.8.1"
3
3
  end
@@ -64,8 +64,20 @@ describe "Transformer" do
64
64
  @transformer.transform("This\nhas\nbreaks.\n\nAnd\nparagraphs.").should == "<p>This has breaks.</p>\n<p>And paragraphs.</p>\n"
65
65
  end
66
66
 
67
+ it "properly handles more than two line breaks" do
68
+ result = @transformer.transform("TIP: With \"link\":file.html.\n\n\nh4. Heading")
69
+ result.should == %{\n<div class="info"><p>With <a href="file.html">link</a>.</p></div>\n<h4>Heading</h4>\n}
70
+
71
+ result = @transformer.transform("Test\n\n\nh4. Heading")
72
+ result.should =="<p>Test</p>\n<h4>Heading</h4>\n"
73
+ end
74
+
75
+ it "handles single line returns outside of paragraphs" do
76
+ @transformer.transform("* One\n* Two\n* Three").should == "<ul>\n\t<li>One</li>\n\t<li>Two</li>\n\t<li>Three</li>\n</ul>\n"
77
+ end
78
+
67
79
  it "handles <construction>" do
68
- str = "Testing this out. <construction>Write more here later.</construction> This is awesome.\n"
80
+ str = "Testing this out. <construction>Write more\nhere later.</construction> This is awesome.\n"
69
81
  @transformer.transform(str).should == "<p>Testing this out. This is awesome.</p>\n"
70
82
  @dev_transformer.transform(str).should == "<p>Testing this out. Write more here later. This is awesome.</p>\n"
71
83
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: guides
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.6.8
5
+ version: 0.6.8.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Yehuda Katz