glyph 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/AUTHORS.textile +8 -7
- data/CHANGELOG.textile +89 -8
- data/LICENSE.textile +1 -2
- data/README.textile +89 -61
- data/Rakefile +12 -10
- data/VERSION +1 -1
- data/benchmark.rb +1 -1
- data/book/config.yml +18 -4
- data/book/document.glyph +269 -45
- data/book/images/glyph/commands_tasks.png +0 -0
- data/book/images/{document_generation.png → glyph/document_generation.png} +0 -0
- data/book/images/glyph/glyph.eps +123 -0
- data/book/images/glyph/glyph.png +0 -0
- data/book/images/glyph/glyph.svg +29 -0
- data/book/lib/commands/commands.rb +11 -0
- data/book/lib/layouts/bookindex.glyph +127 -0
- data/book/lib/layouts/bookpage.glyph +129 -0
- data/book/lib/layouts/project.glyph +26 -0
- data/book/lib/macros/reference.rb +27 -7
- data/book/lib/tasks/tasks.rake +52 -0
- data/book/snippets.yml +1 -1
- data/book/text/{acknowledgement.glyph → acknowledgements.glyph} +4 -2
- data/book/text/changelog.glyph +29 -3
- data/book/text/compiling/compiling.glyph +44 -20
- data/book/text/compiling/lite_mode.glyph +0 -4
- data/book/text/compiling/programmatic_usage.glyph +1 -5
- data/book/text/config/document.glyph +35 -0
- data/book/text/config/filters.glyph +28 -0
- data/book/text/config/options.glyph +25 -0
- data/book/text/config/output.glyph +83 -0
- data/book/text/extending/bookmarks_headers.glyph +0 -5
- data/book/text/extending/command.glyph +56 -0
- data/book/text/extending/commands_tasks.glyph +39 -0
- data/book/text/extending/further_reading.glyph +0 -3
- data/book/text/extending/internals.glyph +3 -5
- data/book/text/extending/interpreting.glyph +0 -4
- data/book/text/extending/layouts.glyph +68 -0
- data/book/text/extending/macro_def.glyph +0 -5
- data/book/text/extending/output_format.glyph +78 -0
- data/book/text/extending/params_attrs.glyph +0 -3
- data/book/text/extending/placeholders.glyph +0 -4
- data/book/text/extending/task.glyph +46 -0
- data/book/text/extending/validators.glyph +5 -6
- data/book/text/getting_started/configuration.glyph +1 -5
- data/book/text/getting_started/create_project.glyph +1 -5
- data/book/text/getting_started/structure.glyph +0 -4
- data/book/text/introduction.glyph +100 -75
- data/book/text/license.glyph +1 -2
- data/book/text/macros/macros_block.glyph +8 -4
- data/book/text/macros/macros_core.glyph +0 -3
- data/book/text/macros/macros_filters.glyph +2 -7
- data/book/text/macros/macros_inline.glyph +0 -4
- data/book/text/macros/macros_structure.glyph +0 -4
- data/book/text/ref_commands.glyph +29 -7
- data/book/text/stats/bookmarks.glyph +49 -0
- data/book/text/stats/links.glyph +90 -0
- data/book/text/stats/macros.glyph +73 -0
- data/book/text/stats/snippets.glyph +50 -0
- data/book/text/stats/stats.glyph +79 -0
- data/book/text/text_editing/attribute_intro.glyph +22 -0
- data/book/text/text_editing/code.glyph +0 -5
- data/book/text/text_editing/conditionals.glyph +0 -4
- data/book/text/text_editing/esc_quot.glyph +64 -0
- data/book/text/text_editing/evaluation.glyph +0 -3
- data/book/text/text_editing/glyph_files.glyph +0 -3
- data/book/text/text_editing/images.glyph +0 -5
- data/book/text/text_editing/inclusions.glyph +0 -4
- data/book/text/text_editing/links.glyph +2 -7
- data/book/text/text_editing/macro_intro.glyph +1 -98
- data/book/text/text_editing/raw_html.glyph +0 -87
- data/book/text/text_editing/section_aliases.glyph +28 -0
- data/book/text/text_editing/sections.glyph +1 -32
- data/book/text/text_editing/stylesheets.glyph +3 -5
- data/book/text/text_editing/topics.glyph +33 -0
- data/book/text/text_editing/xml_fallback.glyph +73 -0
- data/book/text/troubleshooting/errors_command.glyph +0 -3
- data/book/text/troubleshooting/errors_generic.glyph +21 -6
- data/book/text/troubleshooting/errors_macro.glyph +11 -8
- data/book/text/troubleshooting/errors_parser.glyph +0 -3
- data/config.yml +60 -25
- data/glyph.gemspec +90 -36
- data/layouts/web/index.glyph +16 -0
- data/layouts/web/topic.glyph +15 -0
- data/layouts/web5/index.glyph +16 -0
- data/layouts/web5/topic.glyph +17 -0
- data/lib/glyph.rb +36 -49
- data/lib/glyph/analyzer.rb +253 -0
- data/lib/glyph/bookmark.rb +92 -0
- data/lib/glyph/commands.rb +9 -221
- data/lib/glyph/commands/add.rb +8 -0
- data/lib/glyph/commands/compile.rb +93 -0
- data/lib/glyph/commands/config.rb +38 -0
- data/lib/glyph/commands/init.rb +6 -0
- data/lib/glyph/commands/outline.rb +45 -0
- data/lib/glyph/commands/stats.rb +48 -0
- data/lib/glyph/commands/todo.rb +29 -0
- data/lib/glyph/config.rb +2 -0
- data/lib/glyph/document.rb +61 -30
- data/lib/glyph/interpreter.rb +2 -2
- data/lib/glyph/macro.rb +14 -5
- data/lib/glyph/macro_helpers.rb +280 -0
- data/lib/glyph/macro_validators.rb +37 -2
- data/lib/glyph/reporter.rb +182 -0
- data/lib/glyph/syntax_node.rb +37 -10
- data/lib/glyph/system_extensions.rb +8 -45
- data/lib/glyph/utils.rb +148 -0
- data/macros/core.rb +10 -15
- data/macros/filters.rb +4 -5
- data/macros/html/block.rb +46 -30
- data/macros/html/inline.rb +9 -35
- data/macros/html/structure.rb +59 -72
- data/macros/html5/block.rb +69 -0
- data/macros/html5/inline.rb +24 -0
- data/macros/html5/structure.rb +139 -0
- data/macros/xml.rb +1 -1
- data/spec/files/custom_command.rb +6 -0
- data/spec/files/custom_tasks.rake +6 -0
- data/spec/files/document_for_stats.glyph +12 -0
- data/spec/files/references.glyph +4 -0
- data/spec/files/web1.glyph +11 -0
- data/spec/files/web2.glyph +10 -0
- data/spec/files/web_doc.glyph +23 -0
- data/spec/lib/analyzer_spec.rb +137 -0
- data/spec/lib/bookmark_spec.rb +64 -0
- data/spec/lib/commands_spec.rb +30 -5
- data/spec/lib/document_spec.rb +49 -9
- data/spec/lib/glyph_spec.rb +21 -1
- data/spec/lib/macro_spec.rb +6 -6
- data/spec/lib/macro_validators_spec.rb +24 -0
- data/spec/lib/reporter_spec.rb +132 -0
- data/spec/macros/core_spec.rb +2 -3
- data/spec/macros/filters_spec.rb +2 -2
- data/spec/macros/html5_spec.rb +101 -0
- data/spec/macros/macros_spec.rb +16 -6
- data/spec/macros/web5_spec.rb +32 -0
- data/spec/macros/web_spec.rb +59 -0
- data/spec/macros/xml_spec.rb +1 -1
- data/spec/spec_helper.rb +24 -4
- data/spec/tasks/generate_spec.rb +54 -0
- data/spec/tasks/load_spec.rb +29 -3
- data/spec/tasks/project_spec.rb +21 -3
- data/styles/default.css +40 -4
- data/styles/pagination.css +59 -41
- data/tasks/generate.rake +110 -31
- data/tasks/load.rake +39 -7
- data/tasks/project.rake +9 -7
- metadata +115 -34
- data/book/images/glyph.png +0 -0
- data/book/images/glyph.svg +0 -351
- data/book/output/html/glyph.html +0 -4482
- data/book/output/html/images/document_generation.png +0 -0
- data/book/output/html/images/glyph.png +0 -0
- data/book/output/html/images/glyph.svg +0 -351
- data/book/output/pdf/glyph.pdf +4 -10254
- data/book/script/authors +0 -1
- data/book/script/changelog +0 -1
- data/book/script/license +0 -1
- data/book/script/readme +0 -1
- data/book/text/ref_config.glyph +0 -100
- data/book/text/ref_macros.glyph +0 -6
- data/book/text/troubleshooting/errors_intro.glyph +0 -3
data/spec/macros/filters_spec.rb
CHANGED
@@ -17,10 +17,10 @@ describe "Filter Macros" do
|
|
17
17
|
text = "textile[This is a _TEST_(TM).]"
|
18
18
|
interpret text
|
19
19
|
@p.document.output.should == "<p>This is a <em><span class=\"caps\">TEST</span></em>™.</p>"
|
20
|
-
Glyph['
|
20
|
+
Glyph["output.#{Glyph['document.output']}.filter_target"] = :latex
|
21
21
|
interpret text
|
22
22
|
@p.document.output.should == "This is a \\emph{TEST}\\texttrademark{}.\n\n"
|
23
|
-
Glyph['
|
23
|
+
Glyph["output.#{Glyph['document.output']}.filter_target"] = :html
|
24
24
|
Glyph['filters.redcloth.restrictions'] = [:no_span_caps]
|
25
25
|
interpret text
|
26
26
|
@p.document.output.should == "<p>This is a <em>TEST</em>™.</p>"
|
@@ -0,0 +1,101 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.join(File.dirname(__FILE__), "..", "spec_helper")
|
3
|
+
|
4
|
+
describe "Macro:" do
|
5
|
+
|
6
|
+
before do
|
7
|
+
reset_quiet
|
8
|
+
create_project
|
9
|
+
Glyph['document.output'] = 'html5'
|
10
|
+
Glyph.run! 'load:all'
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
Glyph.lite_mode = false
|
15
|
+
reset_quiet
|
16
|
+
delete_project
|
17
|
+
end
|
18
|
+
|
19
|
+
it "section, chapter, header (html5)" do
|
20
|
+
text = "chapter[@title[Chapter X] ... section[@title[Section Y]@id[sec-y] ... section[@title[Another section] ...]]]"
|
21
|
+
interpret text
|
22
|
+
doc = @p.document
|
23
|
+
doc.output.gsub(/\n|\t/, '').should == %{<section class="chapter">
|
24
|
+
<header><h1 id="h_1">Chapter X</h1></header>...
|
25
|
+
<section class="section">
|
26
|
+
<header><h1 id="sec-y">Section Y</h1></header>...
|
27
|
+
<section class="section">
|
28
|
+
<header><h1 id="h_3">Another section</h1></header>...
|
29
|
+
</section>
|
30
|
+
</section>
|
31
|
+
</section>
|
32
|
+
}.gsub(/\n|\t/, '')
|
33
|
+
doc.bookmark?(:"sec-y").should == Glyph::Bookmark.new({:id => :"sec-y", :title => "Section Y", :file => nil})
|
34
|
+
end
|
35
|
+
|
36
|
+
it "document, head, style (html5)" do
|
37
|
+
interpret "document[head[style[test.sass]]]"
|
38
|
+
@p.document.output.gsub(/\n|\t/, '').should == %{
|
39
|
+
<!DOCTYPE html>
|
40
|
+
<html lang="en">
|
41
|
+
<head>
|
42
|
+
<title>#{Glyph::CONFIG.get("document.title")}</title>
|
43
|
+
<meta name="author" content="#{Glyph["document.author"]}" />
|
44
|
+
<meta name="copyright" content="#{Glyph["document.author"]}" />
|
45
|
+
<meta name="generator" content="Glyph v#{Glyph::VERSION} (http://www.h3rald.com/glyph)" />
|
46
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
47
|
+
<style type=\"text/css\">#main { background-color: blue; }</style>
|
48
|
+
</head>
|
49
|
+
</html>
|
50
|
+
}.gsub(/\n|\t/, '')
|
51
|
+
end
|
52
|
+
|
53
|
+
it "toc (html5)" do
|
54
|
+
file_copy Glyph::PROJECT/'../files/document_with_toc.glyph', Glyph::PROJECT/'document.glyph'
|
55
|
+
interpret file_load(Glyph::PROJECT/'document.glyph')
|
56
|
+
doc = @p.document
|
57
|
+
doc.output.gsub!(/\n|\t/, '')
|
58
|
+
doc.output.slice(/(.+?<\/nav>)/, 1).should == %{
|
59
|
+
<nav class="contents">
|
60
|
+
<h1 class="toc-header" id="toc">Table of Contents</h1>
|
61
|
+
<ol class="toc">
|
62
|
+
<li class="section"><a href="#h_1">Container section</a></li>
|
63
|
+
<li class="section"><a href="#md">Markdown</a></li>
|
64
|
+
</ol>
|
65
|
+
</nav>
|
66
|
+
}.gsub(/\n|\t/, '')
|
67
|
+
end
|
68
|
+
|
69
|
+
it "fmi (html5)" do
|
70
|
+
interpret "fmi[this topic|#test] #[test|Test]"
|
71
|
+
@p.document.output.should == %{<span class="fmi">
|
72
|
+
for more information on <mark>this topic</mark>,
|
73
|
+
see <a href="#test">Test</a></span> <a id="test">Test</a>}.gsub(/\n|\t/, '')
|
74
|
+
end
|
75
|
+
|
76
|
+
it "figure (html5)" do
|
77
|
+
interpret "figure[@alt[ligature]ligature.jpg|Ligature]"
|
78
|
+
@p.document.output.gsub(/\t|\n/, '').should == %{
|
79
|
+
<figure>
|
80
|
+
<img src="images/ligature.jpg" alt="ligature" />
|
81
|
+
<figcaption>Ligature</figcaption>
|
82
|
+
</figure>
|
83
|
+
}.gsub(/\n|\t/, '')
|
84
|
+
end
|
85
|
+
|
86
|
+
it "draftcomment, todo (html5)" do
|
87
|
+
text1 = "dc[comment!]"
|
88
|
+
text2 = "![todo!]"
|
89
|
+
interpret text1
|
90
|
+
@p.document.output.should == ""
|
91
|
+
interpret text2
|
92
|
+
@p.document.output.should == ""
|
93
|
+
Glyph['document.draft'] = true
|
94
|
+
interpret text1
|
95
|
+
@p.document.output.should == %{<aside class="comment"><span class="comment-pre"><strong>Comment:</strong> </span>comment!</aside>}
|
96
|
+
interpret text2
|
97
|
+
@p.document.output.should == %{<aside class="todo"><span class="todo-pre"><strong>TODO:</strong> </span>todo!</aside>}
|
98
|
+
@p.document.todos.length.should == 1
|
99
|
+
Glyph['document.draft'] = false
|
100
|
+
end
|
101
|
+
end
|
data/spec/macros/macros_spec.rb
CHANGED
@@ -18,8 +18,8 @@ describe "Macro:" do
|
|
18
18
|
interpret "this is a #[test|test]."
|
19
19
|
doc = @p.document
|
20
20
|
doc.output.should == "this is a <a id=\"test\">test</a>."
|
21
|
-
doc.bookmarks
|
22
|
-
lambda { interpret "this is a #[test|test]. #[test|This won't work!]"; @p.document }.should raise_error
|
21
|
+
doc.bookmarks[:test].should == Glyph::Bookmark.new({:file => nil, :title => 'test', :id => :test})
|
22
|
+
lambda { interpret "this is a #[test|test]. #[test|This won't work!]"; @p.document }.should raise_error
|
23
23
|
end
|
24
24
|
|
25
25
|
it "section, chapter, header" do
|
@@ -36,7 +36,7 @@ describe "Macro:" do
|
|
36
36
|
</div>
|
37
37
|
</div>
|
38
38
|
}.gsub(/\n|\t/, '')
|
39
|
-
doc.bookmark?(:"sec-y").should == {:id => :"sec-y", :title => "Section Y"}
|
39
|
+
doc.bookmark?(:"sec-y").should == Glyph::Bookmark.new({:id => :"sec-y", :title => "Section Y", :file => nil})
|
40
40
|
end
|
41
41
|
|
42
42
|
it "document, head, style" do
|
@@ -50,6 +50,7 @@ describe "Macro:" do
|
|
50
50
|
<meta name="author" content="#{Glyph["document.author"]}" />
|
51
51
|
<meta name="copyright" content="#{Glyph["document.author"]}" />
|
52
52
|
<meta name="generator" content="Glyph v#{Glyph::VERSION} (http://www.h3rald.com/glyph)" />
|
53
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
53
54
|
<style type=\"text/css\">#main { background-color: blue; }</style>
|
54
55
|
</head>
|
55
56
|
</html>
|
@@ -66,6 +67,7 @@ describe "Macro:" do
|
|
66
67
|
<meta name="author" content="#{Glyph["document.author"]}" />
|
67
68
|
<meta name="copyright" content="#{Glyph["document.author"]}" />
|
68
69
|
<meta name="generator" content="Glyph v#{Glyph::VERSION} (http://www.h3rald.com/glyph)" />
|
70
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
69
71
|
<style type=\"text/css\">#main { background-color: blue; }</style>
|
70
72
|
</head>
|
71
73
|
</html>
|
@@ -78,6 +80,14 @@ describe "Macro:" do
|
|
78
80
|
@p.document.output.gsub(/\n|\t/, '').should == result
|
79
81
|
end
|
80
82
|
|
83
|
+
it "style should import and link stylesheets" do
|
84
|
+
Glyph['document.styles'] = 'import'
|
85
|
+
output_for("head[style[default.css]]").match(/@import url\("styles\/default\.css"\)/).blank?.should == false
|
86
|
+
Glyph['document.styles'] = 'link'
|
87
|
+
output_for("head[style[default.css]]").match(%{<link href="styles/default.css" rel="stylesheet" type="text/css" />}).blank?.should == false
|
88
|
+
Glyph['document.styles'] = 'embed'
|
89
|
+
end
|
90
|
+
|
81
91
|
it "toc" do
|
82
92
|
file_copy Glyph::PROJECT/'../files/document_with_toc.glyph', Glyph::PROJECT/'document.glyph'
|
83
93
|
interpret file_load(Glyph::PROJECT/'document.glyph')
|
@@ -85,10 +95,10 @@ describe "Macro:" do
|
|
85
95
|
doc.output.gsub!(/\n|\t/, '')
|
86
96
|
doc.output.slice(/(.+?<\/div>)/, 1).should == %{
|
87
97
|
<div class="contents">
|
88
|
-
<h2 class="toc-header" id="
|
98
|
+
<h2 class="toc-header" id="toc">Table of Contents</h2>
|
89
99
|
<ol class="toc">
|
90
|
-
<li class="
|
91
|
-
<li class="
|
100
|
+
<li class="section"><a href="#h_1">Container section</a></li>
|
101
|
+
<li class="section"><a href="#md">Markdown</a></li>
|
92
102
|
</ol>
|
93
103
|
</div>
|
94
104
|
}.gsub(/\n|\t/, '')
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.join(File.dirname(__FILE__), "..", "spec_helper")
|
3
|
+
|
4
|
+
describe "Macro:" do
|
5
|
+
|
6
|
+
before do
|
7
|
+
create_web_project
|
8
|
+
Glyph['document.output'] = 'web5'
|
9
|
+
Glyph['document.extension'] = '.html'
|
10
|
+
Glyph.run! 'load:all'
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
Glyph.lite_mode = false
|
15
|
+
reset_quiet
|
16
|
+
delete_project
|
17
|
+
end
|
18
|
+
|
19
|
+
it "section (topic)" do
|
20
|
+
interpret("contents[section[@src[a/web1.glyph]@title[Test]]]")
|
21
|
+
topic = @p.document.topics[0]
|
22
|
+
topic[:contents].match(/<article>/).blank?.should == false
|
23
|
+
end
|
24
|
+
|
25
|
+
it "navigation" do
|
26
|
+
Glyph.run! 'generate:web5'
|
27
|
+
web1 = Glyph.file_load(Glyph::PROJECT/'output/web5/a/web1.html')
|
28
|
+
web2 = Glyph.file_load(Glyph::PROJECT/'output/web5/a/b/web2.html')
|
29
|
+
web1.match(%{<nav><a href="/index.html">Contents</a><a href="/a/b/web2.html">→ Topic #2</a></nav>}).blank?.should == false
|
30
|
+
web2.match(%{<nav><a href="/a/web1.html">Topic #1 ←</a><a href="/index.html">Contents</a></nav>}).blank?.should == false
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.join(File.dirname(__FILE__), "..", "spec_helper")
|
3
|
+
|
4
|
+
describe "Macro:" do
|
5
|
+
|
6
|
+
before do
|
7
|
+
create_web_project
|
8
|
+
Glyph['document.output'] = 'web'
|
9
|
+
Glyph.run! 'load:all'
|
10
|
+
end
|
11
|
+
|
12
|
+
after do
|
13
|
+
Glyph.lite_mode = false
|
14
|
+
reset_quiet
|
15
|
+
delete_project
|
16
|
+
end
|
17
|
+
|
18
|
+
it "section (topic)" do
|
19
|
+
lambda { output_for("section[@src[test]]") }.should raise_error(Glyph::MacroError, "Macro 'section' requires a 'title' attribute")
|
20
|
+
interpret("section[@src[a/web1.glyph]@title[Test]]")
|
21
|
+
topic = @p.document.topics[0]
|
22
|
+
topic.blank?.should == false
|
23
|
+
topic[:id].should == :t_0
|
24
|
+
topic[:title].should == "Test"
|
25
|
+
topic[:src].should == "a/web1.glyph"
|
26
|
+
topic[:contents].match(/id="w1_3"/).blank?.should == false
|
27
|
+
Glyph['document.output'] = 'html'
|
28
|
+
Glyph.run! 'load:macros'
|
29
|
+
output_for("contents[section[@src[a/web1.glyph]@title[Test]]]").match(/id="w1_3"/).blank?.should == false
|
30
|
+
end
|
31
|
+
|
32
|
+
it "navigation" do
|
33
|
+
Glyph.run! 'generate:web'
|
34
|
+
web1 = Glyph.file_load(Glyph::PROJECT/'output/web/a/web1.html')
|
35
|
+
web2 = Glyph.file_load(Glyph::PROJECT/'output/web/a/b/web2.html')
|
36
|
+
web1.match(%{<div class="navigation"><a href="/index.html">Contents</a><a href="/a/b/web2.html">→ Topic #2</a></div>}).blank?.should == false
|
37
|
+
web2.match(%{<div class="navigation"><a href="/a/web1.html">Topic #1 ←</a><a href="/index.html">Contents</a></div>}).blank?.should == false
|
38
|
+
end
|
39
|
+
|
40
|
+
it "toc should only list topics" do
|
41
|
+
Glyph.run! 'generate:web'
|
42
|
+
index = Glyph.file_load(Glyph::PROJECT/'output/web/index.html')
|
43
|
+
index.match(%{<li class="section"><a href="#h_1">Web Document</a></li>}).blank?.should == true
|
44
|
+
index.match(%{href="/a/web1.html#h_2"}).blank?.should == false
|
45
|
+
index.match(%{href="/a/b/web2.html#h_6"}).blank?.should == false
|
46
|
+
delete_project
|
47
|
+
reset_quiet
|
48
|
+
create_web_project
|
49
|
+
Glyph['document.output'] = 'html'
|
50
|
+
Glyph.run! 'generate:html'
|
51
|
+
index = Glyph.file_load(Glyph::PROJECT/'output/html/test_project.html')
|
52
|
+
index.match(%{href="a/web1.html#h_2"}).blank?.should == true
|
53
|
+
index.match(%{href="a/b/web2.html#h_6"}).blank?.should == true
|
54
|
+
index.match(%{<li class="section"><a href="#h_1">Web Document</a></li>}).blank?.should == false
|
55
|
+
index.match(%{href="#h_2"}).blank?.should == false
|
56
|
+
index.match(%{href="#h_7"}).blank?.should == false # Header numbers are different...
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
data/spec/macros/xml_spec.rb
CHANGED
@@ -46,7 +46,7 @@ describe "Glyph Language" do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should notify the user that a macro is not found for invalid elements if xml_fallback is enabled" do
|
49
|
-
# Assuming
|
49
|
+
# Assuming options.xml_fallback = true
|
50
50
|
language('glyph')
|
51
51
|
lambda { interpret("*a[test]").document }.should raise_error(Glyph::MacroError, "Unknown macro '*a'")
|
52
52
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -39,6 +39,19 @@ def create_project
|
|
39
39
|
file_copy Glyph::SPEC_DIR/'files/ligature.jpg', Glyph::PROJECT/'images/ligature.jpg'
|
40
40
|
end
|
41
41
|
|
42
|
+
def create_web_project
|
43
|
+
reset_quiet
|
44
|
+
create_project_dir
|
45
|
+
return if Glyph.lite?
|
46
|
+
Glyph.run! 'project:create', Glyph::PROJECT.to_s
|
47
|
+
file_copy Glyph::SPEC_DIR/'files/web_doc.glyph', Glyph::PROJECT/'document.glyph'
|
48
|
+
(Glyph::PROJECT/'text/a/b').mkpath
|
49
|
+
file_copy Glyph::SPEC_DIR/'files/web1.glyph', Glyph::PROJECT/'text/a/web1.glyph'
|
50
|
+
file_copy Glyph::SPEC_DIR/'files/web2.glyph', Glyph::PROJECT/'text/a/b/web2.glyph'
|
51
|
+
file_copy Glyph::SPEC_DIR/'files/test.sass', Glyph::PROJECT/'styles/test.sass'
|
52
|
+
file_copy Glyph::SPEC_DIR/'files/ligature.jpg', Glyph::PROJECT/'images/ligature.jpg'
|
53
|
+
end
|
54
|
+
|
42
55
|
def delete_project_dir
|
43
56
|
return unless Glyph::PROJECT.exist?
|
44
57
|
Glyph::PROJECT.children.each do |f|
|
@@ -56,13 +69,20 @@ def delete_project
|
|
56
69
|
end
|
57
70
|
|
58
71
|
def run_command(cmd)
|
72
|
+
stdout_for do
|
73
|
+
GLI.run cmd
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def stdout_for(&block)
|
59
78
|
out = StringIO.new
|
79
|
+
err = StringIO.new
|
60
80
|
old_stdout = $stdout
|
61
81
|
old_stderr = $stderr
|
62
82
|
$stdout = out
|
63
|
-
$stderr =
|
83
|
+
$stderr = err
|
64
84
|
Glyph['system.quiet'] = false
|
65
|
-
|
85
|
+
block.call
|
66
86
|
Glyph['system.quiet'] = true
|
67
87
|
$stdout = old_stdout
|
68
88
|
$stderr = old_stderr
|
@@ -88,7 +108,7 @@ end
|
|
88
108
|
def language(set)
|
89
109
|
reset_quiet
|
90
110
|
Glyph.run 'load:config'
|
91
|
-
Glyph['
|
111
|
+
Glyph['options.macro_set'] = set
|
92
112
|
Glyph.run 'load:macros'
|
93
113
|
end
|
94
114
|
|
@@ -105,7 +125,7 @@ def create_tree(text)
|
|
105
125
|
end
|
106
126
|
|
107
127
|
def create_doc(tree)
|
108
|
-
Glyph::Document.new tree
|
128
|
+
Glyph::Document.new tree
|
109
129
|
end
|
110
130
|
|
111
131
|
def filter(text)
|
data/spec/tasks/generate_spec.rb
CHANGED
@@ -8,6 +8,7 @@ describe "generate" do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
after do
|
11
|
+
reset_quiet
|
11
12
|
delete_project
|
12
13
|
end
|
13
14
|
|
@@ -28,4 +29,57 @@ describe "generate" do
|
|
28
29
|
(Glyph::PROJECT/'output/html/images/test/ligature.jpg').exist?.should == true
|
29
30
|
end
|
30
31
|
|
32
|
+
it "should copy styles if necessary" do
|
33
|
+
Glyph['document.styles'] = 'import'
|
34
|
+
require 'sass'
|
35
|
+
file_write Glyph::PROJECT/'document.glyph', "head[style[default.css]\nstyle[test.sass]]"
|
36
|
+
lambda { Glyph.run! 'generate:html' }.should_not raise_error
|
37
|
+
(Glyph::PROJECT/'output/html/styles/default.css').exist?.should == true
|
38
|
+
(Glyph::PROJECT/'output/html/styles/test.css').exist?.should == true
|
39
|
+
end
|
40
|
+
|
41
|
+
it ":web should generate multiple html documents" do
|
42
|
+
reset_web = lambda do
|
43
|
+
delete_project
|
44
|
+
reset_quiet
|
45
|
+
create_web_project
|
46
|
+
Glyph['document.output'] = 'web'
|
47
|
+
Glyph['document.styles'] = 'link'
|
48
|
+
Glyph.run! 'load:all'
|
49
|
+
end
|
50
|
+
# check that the user didn't create a styles or images directory under /text
|
51
|
+
reset_web.call
|
52
|
+
(Glyph::PROJECT/'text/images').mkdir
|
53
|
+
lambda { Glyph.run! 'generate:web'}.should raise_error(RuntimeError, "You cannot have an 'images' directory under your 'text' directory.")
|
54
|
+
reset_web.call
|
55
|
+
(Glyph::PROJECT/'text/styles').mkdir
|
56
|
+
lambda { Glyph.run! 'generate:web'}.should raise_error(RuntimeError, "You cannot have a 'styles' directory under your 'text' directory.")
|
57
|
+
reset_web.call
|
58
|
+
# check that the task can be run without errors
|
59
|
+
reset_web.call
|
60
|
+
Glyph["output.#{Glyph['document.output']}.base"] = "/test/"
|
61
|
+
#lambda {
|
62
|
+
Glyph.run! 'generate:web'
|
63
|
+
#}.should_not raise_error
|
64
|
+
# check that images are copied
|
65
|
+
(Glyph::PROJECT/'output/web/images/ligature.jpg').exist?.should == true
|
66
|
+
# check that stylesheets are copied
|
67
|
+
(Glyph::PROJECT/'output/web/styles/default.css').exist?.should == true
|
68
|
+
(Glyph::PROJECT/'output/web/styles/test.css').exist?.should == true
|
69
|
+
# check that index.html is created
|
70
|
+
index = (Glyph::PROJECT/'output/web/index.html')
|
71
|
+
index.exist?.should == true
|
72
|
+
file_load(index).should match(/<li class="section"><a href="\/test\/a\/b\/web2.html#h_6">Topic #2<\/a>/)
|
73
|
+
# check that topics are copied in the proper directories
|
74
|
+
web1 = (Glyph::PROJECT/'output/web/a/web1.html')
|
75
|
+
web1.exist?.should == true
|
76
|
+
web2 = (Glyph::PROJECT/'output/web/a/b/web2.html')
|
77
|
+
web2.exist?.should == true
|
78
|
+
# Check that placeholders are replaced correctly and that links are valid
|
79
|
+
file_load(web2).match(/<a href="\/test\/a\/web1\.html#w1_3">Test #1b<\/a>/).blank?.should == false
|
80
|
+
file_load(web1).match(/<a href="\/test\/a\/b\/web2\.html#w2_1">Test #2a<\/a>/).blank?.should == false
|
81
|
+
file_load(web1).match(/<a href="#w1_3">Test #1b<\/a>/).blank?.should == false
|
82
|
+
end
|
83
|
+
|
84
|
+
|
31
85
|
end
|
data/spec/tasks/load_spec.rb
CHANGED
@@ -37,8 +37,8 @@ describe "load" do
|
|
37
37
|
|
38
38
|
it "[macros] should be able to load only core macros" do
|
39
39
|
language 'core'
|
40
|
-
output_for("$:[
|
41
|
-
Glyph['
|
40
|
+
output_for("$:[options.macro_set|glyph]").blank?.should == true
|
41
|
+
Glyph['options.macro_set'].should == 'glyph'
|
42
42
|
end
|
43
43
|
|
44
44
|
it "[macros] should be able to load only filter macros" do
|
@@ -47,7 +47,7 @@ describe "load" do
|
|
47
47
|
end
|
48
48
|
|
49
49
|
it "[config] should load configuration files and apply overrides" do
|
50
|
-
|
50
|
+
Glyph.config_refresh
|
51
51
|
lambda { Glyph.run! 'load:config'}.should_not raise_error
|
52
52
|
Glyph['system.quiet'] = true
|
53
53
|
Glyph::PROJECT_CONFIG.blank?.should == false
|
@@ -55,4 +55,30 @@ describe "load" do
|
|
55
55
|
Glyph['system.structure.headers'].class.to_s.should == "Array"
|
56
56
|
end
|
57
57
|
|
58
|
+
it "[macros] should load HTML macros as well when generating web output" do
|
59
|
+
Glyph['document.output'] = 'web'
|
60
|
+
Glyph.run! 'load:macros'
|
61
|
+
Glyph::MACROS[:section].blank?.should == false
|
62
|
+
end
|
63
|
+
|
64
|
+
it "[layouts] should load layouts" do
|
65
|
+
Glyph['document.output'] = 'web'
|
66
|
+
Glyph.run! 'load:macros'
|
67
|
+
Glyph::MACROS[:"layout:topic"].blank?.should == false
|
68
|
+
end
|
69
|
+
|
70
|
+
it "[tasks] should load tasks" do
|
71
|
+
reset_quiet
|
72
|
+
file_copy Glyph::PROJECT/"../files/custom_tasks.rake", Glyph::PROJECT/"lib/tasks/custom_tasks.rake"
|
73
|
+
Glyph.run 'load:all'
|
74
|
+
stdout_for { Glyph.run 'custom:hello'}.should == "Hello, World!\n"
|
75
|
+
end
|
76
|
+
|
77
|
+
it "[commands] should load tasks" do
|
78
|
+
reset_quiet
|
79
|
+
file_copy Glyph::PROJECT/"../files/custom_command.rb", Glyph::PROJECT/"lib/commands/custom_command.rb"
|
80
|
+
Glyph.run 'load:all'
|
81
|
+
run_command(['hello']).should == "Hello, World!\n"
|
82
|
+
end
|
83
|
+
|
58
84
|
end
|