literate_md 1.0.7 → 1.0.8

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7e85d3f76cb67bce1a27fc5cbe1143a42ed02c66
4
+ data.tar.gz: add64b54e4a2d80014786b53daf74240e08ac069
5
+ SHA512:
6
+ metadata.gz: d912ea5096a4189a47583a2218db2a233d58af4b92e1b9cd7127fc5a901b97a46444318ef1bc361a864914d809667c28a46805782915dcf81f1c8456182b7f02
7
+ data.tar.gz: 96f282fe63de0e4f72d2978daa701813b7a189774a4cb1c2e465547ece17c25b8adef97bb07e344123fe11305b3c4ef9c2ab792d0eb3029e7ca4065059629d0a
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/ruby -rubygems
2
2
 
3
- require 'coderay'
4
- require 'redcarpet'
3
+ require 'kramdown'
5
4
  require 'trollop'
6
5
  require 'fileutils'
7
6
 
@@ -16,51 +15,68 @@ end
16
15
 
17
16
  $allowed = '(\w| )*|((.*:)?\*)'
18
17
  html_opts = {
19
- :fenced_code_blocks => true,
20
- :superscript => true,
21
- :tables => true,
22
- :lax_html_blocks => true,
23
- :strikethrough => true
18
+ :enable_coderay => true,
19
+ :coderay_default_lang => opts.lang.to_sym,
20
+ :standalone => opts.standalone,
24
21
  }
25
22
  $ext_for_lang = {
26
23
  :ruby => 'rb',
27
24
  :c => 'c',
28
25
  }
29
26
 
30
- class Weave < Redcarpet::Render::XHTML
31
- attr_accessor :default_lang, :original_text, :standalone
32
- def initialize; super; @tokens = Hash.new end
33
- def block_code(code, lang)
34
- l_ang, r_ang, equiv = "__lang__", "__rang__", "__equiv__"
35
- line_num = @original_text[0,@original_text.index(code)].count("\n")+1
36
- code = code.
37
- gsub(/@(#{$allowed})@\s*\+=/) {|match| "#{l_ang}" + to_token(match) + "#{r_ang}+#{equiv}"}.
38
- gsub(/@(#{$allowed})@/) {|match| "#{l_ang}" + to_token(match) + "#{r_ang}"}
39
- code = CodeRay.
40
- scan(code, lang.nil? ? @default_lang : lang.to_sym).
41
- html(
42
- :wrap => :div,
43
- :css => :style,
44
- :line_numbers => :table,
45
- :line_number_start => line_num)
46
- code.gsub!(/#{l_ang}/,'&lang;')
47
- code.gsub!(/#{r_ang}/,'&rang;')
48
- code.gsub!(/#{equiv}/,'&equiv;')
49
- @tokens.each_pair {|k,v| code.gsub! v, k }
50
- code
51
- end
52
- def codespan(code); block_code(code,nil) end
53
- def doc_header
54
- @original_text.gsub!(/\t/,' ') # redcarpet converts tabs somewhere
55
- @standalone ? "<html><body>" : nil
56
- end
57
- def doc_footer; "</body></html>" if @standalone end
58
- def to_token code
59
- code = code[1, code.rindex('@')-1]
60
- if @tokens.has_key? code
61
- @tokens[code]
62
- else
63
- @tokens[code] = "__token#{@tokens.size}__"
27
+ module Kramdown::Converter
28
+ class Weave < Html
29
+
30
+ def initialize root, options
31
+ super(root, options)
32
+ @tokens, @default_lang, @original_text, @standalone =
33
+ Hash.new, options[:coderay_default_lang], options[:original_text], options[:standalone]
34
+ end
35
+
36
+ def convert_codeblock el, indent
37
+ code, lang = el.value, extract_code_language(el.attr)
38
+ l_ang, r_ang, equiv = "__lang__", "__rang__", "__equiv__"
39
+ line_num = @original_text[0,@original_text.index(code)].count("\n")+1
40
+ code = code.
41
+ gsub(/@(#{$allowed})@\s*\+=/) {|match| "#{l_ang}" + to_token(match) + "#{r_ang}+#{equiv}"}.
42
+ gsub(/@(#{$allowed})@/) {|match| "#{l_ang}" + to_token(match) + "#{r_ang}"}
43
+ code = CodeRay.
44
+ scan(code, lang.nil? ? @default_lang : lang.to_sym).
45
+ html(
46
+ :wrap => :div,
47
+ :css => :style,
48
+ :line_numbers => :table,
49
+ :line_number_start => line_num)
50
+ puts code
51
+ code.gsub!(/#{l_ang}/,'&lang;')
52
+ code.gsub!(/#{r_ang}/,'&rang;')
53
+ code.gsub!(/#{equiv}/,'&equiv;')
54
+ @tokens.each_pair {|k,v| code.gsub! v, k }
55
+ code
56
+ end
57
+
58
+ def convert_codespan el, indent
59
+ convert_codeblock el, indent
60
+ end
61
+
62
+ def convert_root(el, indent)
63
+ text = super(el, indent)
64
+ if @standalone
65
+ "<html><body>\n#{text}\n</body></html>"
66
+ else
67
+ text
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def to_token code
74
+ code = code[1, code.rindex('@')-1]
75
+ if @tokens.has_key? code
76
+ @tokens[code]
77
+ else
78
+ @tokens[code] = "__token#{@tokens.size}__"
79
+ end
64
80
  end
65
81
  end
66
82
  end
@@ -71,54 +87,65 @@ def write_to path, data
71
87
  end
72
88
 
73
89
  if opts.weave
74
- r = Redcarpet::Markdown.new(Weave, html_opts)
75
- r.renderer.default_lang = opts.lang.to_sym
76
- r.renderer.standalone = opts.standalone
77
90
  opts.files.split(',').each{|file|
78
- code = File.open(file, 'r'){|f|f.read}
79
- r.renderer.original_text = code
80
- html = r.render(code)
81
- write_to("#{opts.outputdir}/#{File.basename(file)}.html", html)
91
+ text = html_opts[:original_text] = File.read(file)
92
+ r = Kramdown::Document.new(text, html_opts)
93
+ html = r.to_weave
94
+ write_to("#{opts.outputdir}/#{File.basename(file)}.html", html)
82
95
  }
83
96
  end
84
97
 
85
- class Tangle < Redcarpet::Render::Base
86
- attr_accessor :default_lang, :links, :file_no_ext
87
- def block_code(code, lang)
88
- last_find = 0
89
- chunks =
90
- [{:start => last_find, :anchor => '*', :anchor_len => 0}] +
91
- code.scan(/(@(#{$allowed})@\s*\+=)/).map{|x|
92
- {:start => last_find = code.index(x[0], last_find), :anchor => x[1], :anchor_len => x[0].length}
93
- } +
94
- [{:start => code.length, :anchor_len => 0}]
95
- (1..chunks.length-1).each{|index|
96
- last, this = chunks[index-1], chunks[index]
97
- new_snippet = code[
98
- last[:start] + last[:anchor_len], # start index
99
- this[:start] - (last[:start] + last[:anchor_len]) # length of substr
100
- ]
101
- @links[normalise(last[:anchor],lang)] << new_snippet if not new_snippet.strip.empty?
102
- }
103
- nil
104
- end
105
- def normalise(link_name, lang)
106
- if link_name == '*'
107
- "#{@file_no_ext}.#{$ext_for_lang[lang.nil? ? @default_lang : lang.to_sym]}:*"
108
- else
109
- link_name
98
+ module Kramdown::Converter
99
+ class Tangle < Html
100
+
101
+ def initialize root, options
102
+ super(root, options)
103
+ @links, @file_no_ext, @default_lang =
104
+ options[:links], options[:file_no_ext], options[:coderay_default_lang]
105
+ end
106
+
107
+ def convert_codeblock el, indent
108
+ code, lang = el.value, extract_code_language(el.attr)
109
+ last_find = 0
110
+ chunks =
111
+ [{:start => last_find, :anchor => '*', :anchor_len => 0}] +
112
+ code.scan(/(@(#{$allowed})@\s*\+=)/).map{|x|
113
+ {:start => last_find = code.index(x[0], last_find), :anchor => x[1], :anchor_len => x[0].length}
114
+ } +
115
+ [{:start => code.length, :anchor_len => 0}]
116
+ (1..chunks.length-1).each{|index|
117
+ last, this = chunks[index-1], chunks[index]
118
+ new_snippet = code[
119
+ last[:start] + last[:anchor_len], # start index
120
+ this[:start] - (last[:start] + last[:anchor_len]) # length of substr
121
+ ]
122
+ @links[normalise(last[:anchor],lang)] << new_snippet if not new_snippet.strip.empty?
123
+ }
124
+ ''
125
+ end
126
+
127
+ def convert_codespan el, indent
128
+ convert_codeblock el, indent
129
+ end
130
+
131
+ private
132
+
133
+ def normalise(link_name, lang)
134
+ if link_name == '*'
135
+ "#{@file_no_ext}.#{$ext_for_lang[(lang || @default_lang).to_sym]}:*"
136
+ else
137
+ link_name
138
+ end
110
139
  end
111
140
  end
112
- def codespan(code); block_code(code,nil) end
113
141
  end
114
142
 
115
143
  if opts.tangle
116
- links = Hash.new{|h,k|h[k]=[]}
117
- r = Redcarpet::Markdown.new(Tangle, html_opts)
118
- r.renderer.default_lang, r.renderer.links = opts.lang.to_sym, links
144
+ links = html_opts[:links] = Hash.new{|h,k|h[k]=[]}
119
145
  opts.files.split(',').each{|file|
120
- r.renderer.file_no_ext = file[0,file.rindex('.')]
121
- r.render(File.open(file, 'r'){|f|f.read})
146
+ html_opts[:file_no_ext] = file[0,file.rindex('.')]
147
+ r = Kramdown::Document.new(File.read(file), html_opts)
148
+ r.to_tangle
122
149
  }
123
150
  resolve = lambda{|parts| parts.join('').gsub(/@(#{$allowed})@/) {|match|resolve.call(links[match[1..-2]])} }
124
151
  links.keys.reject{|k|!k.end_with? ':*'}.each{|root|
@@ -1,9 +1,9 @@
1
1
  <html><body>
2
- <h3>my file</h3>
3
-
2
+ <h3 id="my-file">my file</h3>
4
3
  <p>add some <em>text</em>:</p>
4
+
5
5
  <table class="CodeRay"><tr>
6
- <td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre><a href="#n5" name="n5">5</a>
6
+ <td class="line-numbers"><pre><a href="#n5" name="n5">5</a>
7
7
  <a href="#n6" name="n6">6</a>
8
8
  <a href="#n7" name="n7">7</a>
9
9
  <a href="#n8" name="n8">8</a>
@@ -19,9 +19,10 @@ int main() {
19
19
  </pre></td>
20
20
  </tr></table>
21
21
 
22
- <p>and some more text. we should probably say what dostuff is; it&#39;s:</p>
22
+ <p>and some more text. we should probably say what dostuff is; its:</p>
23
+
23
24
  <table class="CodeRay"><tr>
24
- <td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre><a href="#n16" name="n16">16</a>
25
+ <td class="line-numbers"><pre><a href="#n16" name="n16">16</a>
25
26
  <a href="#n17" name="n17">17</a>
26
27
  <a href="#n18" name="n18">18</a>
27
28
  <a href="#n19" name="n19">19</a>
@@ -30,8 +31,8 @@ int main() {
30
31
  <a href="#n22" name="n22">22</a>
31
32
  </pre></td>
32
33
  <td class="code"><pre>&lang;Do Stuff&rang;+&equiv;
33
- int* me = &amp;<span style="color:#00D">1</span>;
34
- *me++;
34
+ int* me = &amp;<span style="color:#00D">1</span>;
35
+ *me++;
35
36
  &lang;Do More Stuff&rang;+&equiv;
36
37
  <span style="background-color:hsla(300,100%,50%,0.06)"><span style="color:#404">/</span><span style="color:#808">* MORE! MORE! *</span><span style="color:#404">/</span></span>
37
38
  &lang;Do Stuff&rang;+&equiv;
@@ -40,10 +41,12 @@ int main() {
40
41
  </tr></table>
41
42
 
42
43
  <p>was that clearer? More stuff is the same as the first:</p>
44
+
43
45
  <table class="CodeRay"><tr>
44
- <td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre><a href="#n28" name="n28">28</a>
46
+ <td class="line-numbers"><pre><a href="#n28" name="n28">28</a>
45
47
  </pre></td>
46
48
  <td class="code"><pre>&lang;Do More Stuff&rang;+&equiv; &lang;Do Stuff&rang;
47
49
  </pre></td>
48
50
  </tr></table>
51
+
49
52
  </body></html>
@@ -1,16 +1,16 @@
1
1
 
2
2
  int main() {
3
3
 
4
- int* me = &1;
5
- *me++;
4
+ int* me = &1;
5
+ *me++;
6
6
 
7
7
  // again!
8
8
 
9
9
 
10
10
  /* MORE! MORE! */
11
11
 
12
- int* me = &1;
13
- *me++;
12
+ int* me = &1;
13
+ *me++;
14
14
 
15
15
  // again!
16
16
 
@@ -1,13 +1,13 @@
1
- require 'test/unit'
1
+ require 'minitest/autorun'
2
2
  require 'ostruct'
3
3
 
4
- class TestLiterateMD < Test::Unit::TestCase
4
+ class TestLiterateMD < Minitest::Test
5
5
  def run_and_verify opts, actual_file, expected_file
6
6
  tidy_up actual_file
7
7
  $opts = opts
8
8
  run_it
9
- expected = File.open(expected_file, 'r'){|f|f.read}
10
- actual = File.open(actual_file, 'r'){|f|f.read}
9
+ expected = File.read expected_file
10
+ actual = File.read actual_file
11
11
  assert_equal expected, actual
12
12
  tidy_up actual_file
13
13
  end
@@ -37,9 +37,9 @@ class TestLiterateMD < Test::Unit::TestCase
37
37
 
38
38
  def run_it
39
39
  begin
40
- load 'bin/literate_md'
41
- rescue SystemExit => e
40
+ load 'bin/literate_md'
41
+ rescue SystemExit => e
42
42
  assert_equal e.status, 0
43
- end
43
+ end
44
44
  end
45
45
  end
metadata CHANGED
@@ -1,50 +1,57 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: literate_md
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 1.0.7
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.8
6
5
  platform: ruby
7
- authors:
8
- - remis
9
- autorequire:
6
+ authors:
7
+ - remis
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
-
13
- date: 2013-02-21 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: redcarpet
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
19
- none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
24
- type: :runtime
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: trollop
28
- prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
30
- none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
35
- type: :runtime
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: coderay
39
- prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
46
- type: :runtime
47
- version_requirements: *id003
11
+ date: 2014-04-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: kramdown
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ requirement: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - '>='
23
+ - !ruby/object:Gem::Version
24
+ version: '0'
25
+ prerelease: false
26
+ type: :runtime
27
+ - !ruby/object:Gem::Dependency
28
+ name: trollop
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ prerelease: false
40
+ type: :runtime
41
+ - !ruby/object:Gem::Dependency
42
+ name: coderay
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ prerelease: false
54
+ type: :runtime
48
55
  description: |-
49
56
  Literate programming using markdown! Converts files to html or extracts the code snippets into one or more source files. To use:
50
57
  $ literate_md --help
@@ -56,47 +63,42 @@ description: |-
56
63
  --files, -f <s>: Files to process
57
64
  --standalone, -s: Weaves in html and body tags
58
65
  --help, -h: Show this message
59
- email:
60
- - remis.thoughts@gmail.com
61
- executables:
62
- - literate_md
66
+ email:
67
+ - remis.thoughts@gmail.com
68
+ executables:
69
+ - literate_md
63
70
  extensions: []
64
-
65
71
  extra_rdoc_files: []
66
-
67
- files:
68
- - licenses/LICENSE-2.0.txt
69
- - bin/literate_md
70
- - test/expected_test.html
71
- - test/expected_test.rb
72
- - test/test.md
73
- - test/test_literate_md.rb
72
+ files:
73
+ - licenses/LICENSE-2.0.txt
74
+ - bin/literate_md
75
+ - test/expected_test.html
76
+ - test/expected_test.rb
77
+ - test/test.md
78
+ - test/test_literate_md.rb
74
79
  homepage: http://remis-thoughts.blogspot.co.uk/2012/03/literate-programming-tool-this-is-last.html
75
- licenses:
76
- - The Apache Software License, Version 2.0
77
- post_install_message:
80
+ licenses:
81
+ - The Apache Software License, Version 2.0
82
+ metadata: {}
83
+ post_install_message:
78
84
  rdoc_options: []
79
-
80
- require_paths:
81
- - lib
82
- required_ruby_version: !ruby/object:Gem::Requirement
83
- none: false
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- version: "0"
88
- required_rubygems_version: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ">="
92
- - !ruby/object:Gem::Version
93
- version: "0"
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
94
97
  requirements: []
95
-
96
- rubyforge_project:
97
- rubygems_version: 1.8.24
98
- signing_key:
99
- specification_version: 3
98
+ rubyforge_project:
99
+ rubygems_version: 2.1.9
100
+ signing_key:
101
+ specification_version: 4
100
102
  summary: literate_md
101
- test_files:
102
- - test/expected_test.rb
103
+ test_files:
104
+ - test/expected_test.rb