markascend 0.1
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/Gemfile +9 -0
- data/copying +18 -0
- data/doc/api.ma +65 -0
- data/doc/index.ma +23 -0
- data/doc/syntax.ma +264 -0
- data/lib/markascend.rb +172 -0
- data/lib/markascend/builtin_macros.rb +154 -0
- data/lib/markascend/env.rb +68 -0
- data/lib/markascend/line_unit.rb +226 -0
- data/lib/markascend/macro.rb +13 -0
- data/lib/markascend/parser.rb +220 -0
- data/lib/markascend/popular_company_macros.rb +87 -0
- data/rakefile +176 -0
- data/readme +4 -0
- data/test/builtin_macros_test.rb +73 -0
- data/test/line_unit_test.rb +40 -0
- data/test/markascend_test.rb +19 -0
- data/test/parser_test.rb +93 -0
- data/test/popular_company_macros_test.rb +42 -0
- data/test/test_helper.rb +21 -0
- metadata +64 -0
data/readme
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class BuiltinMacrosTest < BaseTest
|
4
|
+
def test_del_underline_sub_sup
|
5
|
+
%w[del underline sub sup].each do |x|
|
6
|
+
assert_equal "<#{x}>#{x}</#{x}>", parse("\\#{x}(#{x})")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_img
|
11
|
+
assert_equal %Q{<img src="src" alt="alt"/>}, parse("\\img(src alt='alt')")
|
12
|
+
assert_equal %Q{<a href="href"><img src="src" alt="alt"/></a>}, parse("\\img(src alt='alt' href='href')")
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_html
|
16
|
+
html = %Q{<a href="href">a</a> }
|
17
|
+
assert_equal html, parse("\\html{#{html}}")
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_slim
|
21
|
+
html = %Q{<a href="href">a</a>}
|
22
|
+
assert_equal html, parse("\\slim(a href='href' a)")
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_csv
|
26
|
+
res = Markascend.compile <<-MA
|
27
|
+
\\csv
|
28
|
+
name,type
|
29
|
+
"Ahri",Mage
|
30
|
+
"Miss Fortune",DPS
|
31
|
+
\\headless_csv
|
32
|
+
"Fizz",DPS
|
33
|
+
Sejuani,Tank
|
34
|
+
MA
|
35
|
+
table1 = "<thead><tr><th>name</th><th>type</th></tr></thead>" +
|
36
|
+
"<tbody><tr><td>Ahri</td><td>Mage</td></tr><tr><td>Miss Fortune</td><td>DPS</td></tr></tbody>"
|
37
|
+
table2 = "<tbody><tr><td>Fizz</td><td>DPS</td></tr><tr><td>Sejuani</td><td>Tank</td></tr></tbody>"
|
38
|
+
assert res.index table1
|
39
|
+
assert res.index table2
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_latex
|
43
|
+
assert_equal %Q{<code class="latex">\\frac{y}{x}</code>}, parse("\\latex{\\frac{y}{x}}")
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_dot
|
47
|
+
res = parse("\\dot(digraph G{main -> parse;})").strip
|
48
|
+
src = Nokogiri::XML(res).xpath('//@src').text[/(?<=,).+$/]
|
49
|
+
f = Tempfile.new('img')
|
50
|
+
f << Base64.decode64(src)
|
51
|
+
path = f.path
|
52
|
+
f.close
|
53
|
+
output = `file #{path}`
|
54
|
+
assert output.index('PNG image data'), %Q|generated data should be png: but got #{output.inspect}|
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_options
|
58
|
+
parse("\\options(a: [1, 2])")
|
59
|
+
assert_equal({"a" => [1, 2]}, @env.options)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_hi
|
63
|
+
parse("\\hi(none)")
|
64
|
+
assert_equal nil, @env.hi
|
65
|
+
parse("\\hi(c)\\hi(ruby)")
|
66
|
+
assert_equal 'ruby', @env.hi
|
67
|
+
end
|
68
|
+
|
69
|
+
def parse src
|
70
|
+
l = LineUnit.new @env, src, nil
|
71
|
+
l.parse
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class LineUnitTest < BaseTest
|
4
|
+
def test_nested_italic_and_bold
|
5
|
+
assert_equal 'outside<b><i>i</i>b</b>', parse('outside***i*b**').join
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_code
|
9
|
+
assert_equal '<code class="highlight">\\\\code</code>', parse('`\\\\code`').join
|
10
|
+
assert_equal '<code class="highlight">c`ode</code>', parse('``c`ode``').join
|
11
|
+
assert_equal '<code class="highlight"> </code>`', parse('`` ```').join
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_math
|
15
|
+
assert_equal '<code class="math">\\\\math\$ </code>', parse('$\\\\math\$ $').join
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_link
|
19
|
+
assert_equal '<a href="href">a</a>', parse('[a](href)').join
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_footnote
|
23
|
+
assert_equal '<a href="#footnote-1">1</a>', parse('[.](first note)').join
|
24
|
+
assert_equal '<a href="#footnote-2">two</a>', parse('[.two](second note)').join
|
25
|
+
assert_equal [:footnote_id_ref, 1], parse('[:1]').first
|
26
|
+
assert_equal [:footnote_id_ref, 22], parse('[:22]').first
|
27
|
+
assert_equal [:footnote_acronym_ref, "two"], parse('[:two]').first
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_sandbox_footnote
|
31
|
+
make_sandbox_env
|
32
|
+
first_note = '[.](first note)'
|
33
|
+
assert_equal first_note, parse('[.](first note)').join
|
34
|
+
end
|
35
|
+
|
36
|
+
def parse src
|
37
|
+
l = LineUnit.new @env, src, nil
|
38
|
+
l.parse []
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class MarkascendTest < BaseTest
|
4
|
+
def test_strip_tags
|
5
|
+
assert_equal '', Markascend.strip_tags('<script fraud-prop="></script>"></script>')
|
6
|
+
assert_equal 'Bold', Markascend.strip_tags('<b>Bold</b>')
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_toc
|
10
|
+
res = Markascend.compile <<-MA, toc: true
|
11
|
+
h1 h1
|
12
|
+
h5 h5
|
13
|
+
h3 h3
|
14
|
+
MA
|
15
|
+
dom = Nokogiri::HTML(res).xpath('//div[@id="toc"]/ol').first
|
16
|
+
assert_equal ['li', 'ol'], dom.children.map(&:name)
|
17
|
+
assert_equal ['ol', 'li'], dom.children[1].children.map(&:name)
|
18
|
+
end
|
19
|
+
end
|
data/test/parser_test.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class ParserTest < BaseTest
|
4
|
+
def test_hx
|
5
|
+
b = Parser.new @env, "h1#cen-tered lovely day!"
|
6
|
+
assert_equal "<h1 id=\"cen-tered\">lovely day!</h1>", b.parse
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_sandbox_hx
|
10
|
+
make_sandbox_env
|
11
|
+
b = Parser.new @env, "h1#cen-tered lovely day!"
|
12
|
+
assert_equal "<h1>lovely day!</h1>", b.parse
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_blocked_hx
|
16
|
+
b = Parser.new @env, "h3 followed by \\nop a block\n content of block"
|
17
|
+
assert_equal "<h3>followed by \\nop a block</h3>", b.parse
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_rec_block
|
21
|
+
b = Parser.new @env, <<-MA
|
22
|
+
- ul1
|
23
|
+
- ul2
|
24
|
+
+ ol1
|
25
|
+
+ ol2
|
26
|
+
- > quote1
|
27
|
+
quote2
|
28
|
+
MA
|
29
|
+
ol = "<ol><li>ol1</li>" + "<li>ol2</li></ol>"
|
30
|
+
quote = "<quote>quote1<br>quote2</quote>"
|
31
|
+
ul = "<ul><li>ul1</li>" + "<li>ul2#{ol}</li>" + "<li>#{quote}</li></ul>"
|
32
|
+
assert_equal ul, b.parse.strip
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_warning_line
|
36
|
+
# should generate warning for missing macro contents
|
37
|
+
b = Parser.new @env, <<-MA
|
38
|
+
- ul1
|
39
|
+
+ ol1
|
40
|
+
- ul2
|
41
|
+
+ ol2 \\img()
|
42
|
+
MA
|
43
|
+
b.parse
|
44
|
+
assert b.warnings[4]
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_code_block
|
48
|
+
code_text = proc do |b|
|
49
|
+
t = Nokogiri::HTML(b.parse.strip).xpath('//pre/code').text
|
50
|
+
CGI.unescape_html(t).strip
|
51
|
+
end
|
52
|
+
|
53
|
+
b = Parser.new @env, <<-MA
|
54
|
+
|ruby
|
55
|
+
puts 'hello world'
|
56
|
+
MA
|
57
|
+
assert_equal "puts 'hello world'", code_text[b]
|
58
|
+
|
59
|
+
b = Parser.new @env, <<-MA
|
60
|
+
|
|
61
|
+
puts 'hello world'
|
62
|
+
MA
|
63
|
+
assert_equal "puts 'hello world'", code_text[b]
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_inline_macro_fallback_but_block_macro_not
|
67
|
+
invalid = "\\invalid{ <content> }"
|
68
|
+
expected = "<p>#{CGI.escape_html invalid}</p>"
|
69
|
+
assert_equal expected, Parser.new(@env, invalid).parse
|
70
|
+
|
71
|
+
invalid = "\\invalid\n <content>"
|
72
|
+
assert_equal "<p>\\invalid</p>", Parser.new(@env, invalid).parse
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_sandbox_macro
|
76
|
+
make_sandbox_env
|
77
|
+
src = '\options(a.png)'
|
78
|
+
expected = "<p>#{CGI.escape_html src}</p>"
|
79
|
+
assert_equal expected, Parser.new(@env, src).parse
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_validate_default_macro_list
|
83
|
+
assert_equal Macro.instance_methods.grep(/parse_/).map(&:to_s).sort, Markascend::DEFAULT_MACROS.values.sort
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_validate_default_line_unit_parser_list
|
87
|
+
assert_equal LineUnit.instance_methods.grep(/parse_/).map(&:to_s).sort, Markascend::DEFAULT_LINE_UNITS.sort
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_footnote_validation
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class PopularCompanyMacrosTest < BaseTest
|
4
|
+
def test_twitter
|
5
|
+
assert_equal %Q{<a href="https://twitter.com/dhh">@dhh</a>}, parse("\\twitter(@dhh)")
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_weibo
|
9
|
+
assert_equal %Q{<a href="https://weibo.com/dhh">@dhh</a>}, parse("\\weibo(@dhh)")
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_wiki
|
13
|
+
assert_equal %Q|<a href="http://en.wikipedia.org/wiki/ruby(programing_language)">ruby(programing_language)</a>|, parse("\\wiki{ruby(programing_language)}")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_gist
|
17
|
+
res = %Q{<script src="https://gist.github.com/luikore/737238.js"></script>}
|
18
|
+
assert_equal res, parse("\\gist(luikore/737238)")
|
19
|
+
assert_equal res, parse("\\gist(luikore/737238.git)")
|
20
|
+
assert_equal res, parse("\\gist(gist.github.com/luikore/737238.git)")
|
21
|
+
assert_equal res, parse("\\gist(https://gist.github.com/luikore/737238)")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_video
|
25
|
+
youtube = parse("\\video(400x200 youtu.be/watch?v=TGPvtlnwH6E)")
|
26
|
+
assert youtube.start_with? '<iframe width="400" height="200"'
|
27
|
+
assert youtube.index('/embed/TGPvtlnwH6E'), youtube.inspect
|
28
|
+
|
29
|
+
vimeo = parse("\\video(400x200 vimeo.com/36820781)")
|
30
|
+
assert vimeo.start_with?('<iframe width="400" height="200"'), vimeo.inspect
|
31
|
+
assert vimeo.index('/video/36820781'), vimeo.inspect
|
32
|
+
|
33
|
+
nico = parse("\\video(400x200 sm32768)")
|
34
|
+
assert nico.start_with?('<script '), nico.inspect
|
35
|
+
assert nico.index('/thumb_watch/sm32768'), nico.inspect
|
36
|
+
end
|
37
|
+
|
38
|
+
def parse src
|
39
|
+
l = LineUnit.new @env, src, nil
|
40
|
+
l.parse
|
41
|
+
end
|
42
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require_relative "../lib/markascend"
|
3
|
+
begin
|
4
|
+
require "pry"
|
5
|
+
rescue LoadError
|
6
|
+
end
|
7
|
+
|
8
|
+
require "slim"
|
9
|
+
require "nokogiri" # for parsing the result
|
10
|
+
require "tempfile"
|
11
|
+
|
12
|
+
class BaseTest < Test::Unit::TestCase
|
13
|
+
include Markascend
|
14
|
+
def setup
|
15
|
+
@env = Env.new({})
|
16
|
+
end
|
17
|
+
|
18
|
+
def make_sandbox_env
|
19
|
+
@env = Env.new sandbox: true
|
20
|
+
end
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: markascend
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Zete Lui
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-04-08 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Extensible markdown-like, macro-powered html document syntax and processor
|
14
|
+
email:
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- readme
|
20
|
+
- copying
|
21
|
+
- lib/markascend/builtin_macros.rb
|
22
|
+
- lib/markascend/env.rb
|
23
|
+
- lib/markascend/line_unit.rb
|
24
|
+
- lib/markascend/macro.rb
|
25
|
+
- lib/markascend/parser.rb
|
26
|
+
- lib/markascend/popular_company_macros.rb
|
27
|
+
- lib/markascend.rb
|
28
|
+
- test/builtin_macros_test.rb
|
29
|
+
- test/line_unit_test.rb
|
30
|
+
- test/markascend_test.rb
|
31
|
+
- test/parser_test.rb
|
32
|
+
- test/popular_company_macros_test.rb
|
33
|
+
- test/test_helper.rb
|
34
|
+
- Gemfile
|
35
|
+
- rakefile
|
36
|
+
- doc/api.ma
|
37
|
+
- doc/index.ma
|
38
|
+
- doc/syntax.ma
|
39
|
+
homepage: https://github.com/luikore/markascend
|
40
|
+
licenses:
|
41
|
+
- BSD
|
42
|
+
metadata: {}
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: 2.0.0
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
requirements: []
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 2.0.3
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: Extensible markdown-like, macro-powered html document syntax and processor
|
63
|
+
test_files: []
|
64
|
+
has_rdoc: false
|