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.
- checksums.yaml +7 -0
- data/bin/literate_md +106 -79
- data/test/expected_test.html +11 -8
- data/test/expected_test.rb +4 -4
- data/test/test_literate_md.rb +7 -7
- metadata +83 -81
checksums.yaml
ADDED
@@ -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
|
data/bin/literate_md
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#!/usr/bin/ruby -rubygems
|
2
2
|
|
3
|
-
require '
|
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
|
-
:
|
20
|
-
:
|
21
|
-
:
|
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
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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}/,'⟨')
|
52
|
+
code.gsub!(/#{r_ang}/,'⟩')
|
53
|
+
code.gsub!(/#{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
|
-
|
79
|
-
r
|
80
|
-
|
81
|
-
|
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
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
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
|
-
|
121
|
-
|
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|
|
data/test/expected_test.html
CHANGED
@@ -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"
|
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
|
22
|
+
<p>and some more text. we should probably say what dostuff is; it’s:</p>
|
23
|
+
|
23
24
|
<table class="CodeRay"><tr>
|
24
|
-
<td class="line-numbers"
|
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>⟨Do Stuff⟩+≡
|
33
|
-
|
34
|
-
|
34
|
+
int* me = &<span style="color:#00D">1</span>;
|
35
|
+
*me++;
|
35
36
|
⟨Do More Stuff⟩+≡
|
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
|
⟨Do Stuff⟩+≡
|
@@ -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"
|
46
|
+
<td class="line-numbers"><pre><a href="#n28" name="n28">28</a>
|
45
47
|
</pre></td>
|
46
48
|
<td class="code"><pre>⟨Do More Stuff⟩+≡ ⟨Do Stuff⟩
|
47
49
|
</pre></td>
|
48
50
|
</tr></table>
|
51
|
+
|
49
52
|
</body></html>
|
data/test/expected_test.rb
CHANGED
data/test/test_literate_md.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
require '
|
1
|
+
require 'minitest/autorun'
|
2
2
|
require 'ostruct'
|
3
3
|
|
4
|
-
class TestLiterateMD < Test
|
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.
|
10
|
-
actual = File.
|
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
|
-
|
41
|
-
|
40
|
+
load 'bin/literate_md'
|
41
|
+
rescue SystemExit => e
|
42
42
|
assert_equal e.status, 0
|
43
|
-
|
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
|
-
|
5
|
-
version: 1.0.7
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.8
|
6
5
|
platform: ruby
|
7
|
-
authors:
|
8
|
-
|
9
|
-
autorequire:
|
6
|
+
authors:
|
7
|
+
- remis
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
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
|
-
|
61
|
-
executables:
|
62
|
-
|
66
|
+
email:
|
67
|
+
- remis.thoughts@gmail.com
|
68
|
+
executables:
|
69
|
+
- literate_md
|
63
70
|
extensions: []
|
64
|
-
|
65
71
|
extra_rdoc_files: []
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
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
|
-
|
77
|
-
|
80
|
+
licenses:
|
81
|
+
- The Apache Software License, Version 2.0
|
82
|
+
metadata: {}
|
83
|
+
post_install_message:
|
78
84
|
rdoc_options: []
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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
|
-
|
97
|
-
|
98
|
-
|
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
|
-
|
103
|
+
test_files:
|
104
|
+
- test/expected_test.rb
|