literate_md 1.0.7 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -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