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