glyph 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +19 -40
- data/benchmark.rb +1 -2
- data/book/config.yml +8 -8
- data/book/document.glyph +18 -19
- data/book/images/glyph/commands_tasks.png +0 -0
- data/book/lib/layouts/bookindex.glyph +113 -111
- data/book/lib/layouts/bookpage.glyph +112 -108
- data/book/lib/macros/reference.rb +2 -2
- data/book/lib/tasks/tasks.rake +1 -1
- data/book/text/acknowledgements.glyph +1 -0
- data/book/text/changelog.glyph +140 -112
- data/book/text/compiling/compiling.glyph +36 -24
- data/book/text/compiling/lite_mode.glyph +11 -11
- data/book/text/compiling/programmatic_usage.glyph +57 -57
- data/book/text/config/document.glyph +7 -1
- data/book/text/config/options.glyph +5 -3
- data/book/text/config/output.glyph +41 -8
- data/book/text/extending/bookmarks_headers.glyph +13 -11
- data/book/text/extending/command.glyph +1 -1
- data/book/text/extending/commands_tasks.glyph +2 -2
- data/book/text/extending/internals.glyph +29 -29
- data/book/text/extending/interpreting.glyph +48 -9
- data/book/text/extending/macro_def.glyph +80 -32
- data/book/text/extending/output_format.glyph +2 -2
- data/book/text/extending/placeholders.glyph +27 -15
- data/book/text/extending/validators.glyph +1 -1
- data/book/text/getting_started/configuration.glyph +1 -1
- data/book/text/getting_started/create_project.glyph +4 -5
- data/book/text/getting_started/structure.glyph +2 -2
- data/book/text/macros/macros_core.glyph +341 -199
- data/book/text/macros/macros_filters.glyph +1 -1
- data/book/text/macros/macros_inline.glyph +3 -3
- data/book/text/macros/macros_structure.glyph +1 -1
- data/book/text/ref_commands.glyph +98 -93
- data/book/text/snippets.glyph +18 -0
- data/book/text/stats/bookmarks.glyph +16 -16
- data/book/text/stats/links.glyph +23 -23
- data/book/text/stats/macros.glyph +14 -14
- data/book/text/stats/snippets.glyph +26 -26
- data/book/text/stats/stats.glyph +14 -15
- data/book/text/text_editing/attribute_intro.glyph +8 -8
- data/book/text/text_editing/code.glyph +16 -16
- data/book/text/text_editing/conditionals.glyph +12 -13
- data/book/text/text_editing/esc_quot.glyph +3 -3
- data/book/text/text_editing/evaluation.glyph +57 -3
- data/book/text/text_editing/inclusions.glyph +34 -25
- data/book/text/text_editing/macro_composition.glyph +28 -0
- data/book/text/text_editing/macro_intro.glyph +4 -4
- data/book/text/text_editing/section_aliases.glyph +23 -23
- data/book/text/text_editing/sections.glyph +22 -22
- data/book/text/text_editing/stylesheets.glyph +33 -33
- data/book/text/text_editing/topics.glyph +6 -6
- data/book/text/text_editing/xml_fallback.glyph +1 -1
- data/book/text/troubleshooting/errors_command.glyph +4 -4
- data/book/text/troubleshooting/errors_generic.glyph +16 -10
- data/book/text/troubleshooting/errors_macro.glyph +18 -21
- data/book/text/troubleshooting/errors_parser.glyph +7 -7
- data/config.yml +51 -29
- data/document.glyph +18 -18
- data/glyph.gemspec +39 -287
- data/layouts/web5/topic.glyph +1 -1
- data/lib/glyph.rb +42 -10
- data/lib/glyph/analyzer.rb +5 -2
- data/lib/glyph/bookmark.rb +3 -1
- data/lib/glyph/commands.rb +11 -9
- data/lib/glyph/commands/add.rb +3 -1
- data/lib/glyph/commands/compile.rb +10 -7
- data/lib/glyph/commands/config.rb +7 -5
- data/lib/glyph/commands/init.rb +2 -0
- data/lib/glyph/commands/outline.rb +2 -0
- data/lib/glyph/commands/stats.rb +3 -0
- data/lib/glyph/commands/todo.rb +2 -0
- data/lib/glyph/config.rb +2 -0
- data/lib/glyph/document.rb +34 -9
- data/lib/glyph/interpreter.rb +2 -0
- data/lib/glyph/macro.rb +97 -25
- data/lib/glyph/macro_validators.rb +9 -6
- data/lib/glyph/node.rb +3 -1
- data/lib/glyph/parser.rb +68 -33
- data/lib/glyph/reporter.rb +3 -1
- data/lib/glyph/syntax_node.rb +23 -28
- data/lib/glyph/system_extensions.rb +21 -0
- data/lib/glyph/utils.rb +24 -4
- data/macros/block.rb +111 -0
- data/macros/core.rb +163 -33
- data/macros/filters.rb +3 -2
- data/macros/inline.rb +97 -0
- data/macros/reps/html.rb +180 -0
- data/macros/reps/html5.rb +100 -0
- data/macros/reps/web.rb +4 -0
- data/macros/reps/web5.rb +4 -0
- data/macros/structure.rb +229 -0
- data/macros/xml.rb +29 -24
- data/spec/config.yml +7 -0
- data/spec/files/article.glyph +2 -2
- data/spec/files/web_doc.glyph +9 -5
- data/spec/lib/commands_spec.rb +13 -9
- data/spec/lib/config_spec.rb +2 -2
- data/spec/lib/document_spec.rb +10 -0
- data/spec/lib/glyph_spec.rb +30 -8
- data/spec/lib/macro_spec.rb +39 -4
- data/spec/lib/macro_validators_spec.rb +3 -4
- data/spec/lib/parser_spec.rb +7 -0
- data/spec/lib/reporter_spec.rb +1 -0
- data/spec/lib/syntax_node_spec.rb +40 -6
- data/spec/macros/core_spec.rb +154 -21
- data/spec/macros/filters_spec.rb +1 -1
- data/spec/macros/html5_spec.rb +4 -5
- data/spec/macros/macros_spec.rb +6 -7
- data/spec/macros/web5_spec.rb +3 -3
- data/spec/macros/web_spec.rb +10 -7
- data/spec/macros/xml_spec.rb +11 -2
- data/spec/spec_helper.rb +11 -5
- data/spec/tasks/generate_spec.rb +40 -5
- data/spec/tasks/load_spec.rb +1 -13
- data/styles/coderay.css +147 -38
- data/styles/default.css +19 -22
- data/styles/pagination.css +30 -30
- data/tasks/generate.rake +54 -18
- data/tasks/load.rake +9 -24
- data/tasks/project.rake +0 -2
- metadata +208 -207
- data/.gitignore +0 -7
- data/VERSION +0 -1
- data/book/snippets.yml +0 -18
- data/lib/glyph/macro_helpers.rb +0 -282
- data/macros/html/block.rb +0 -124
- data/macros/html/inline.rb +0 -42
- data/macros/html/structure.rb +0 -191
- data/macros/html5/block.rb +0 -69
- data/macros/html5/inline.rb +0 -24
- data/macros/html5/structure.rb +0 -140
data/layouts/web5/topic.glyph
CHANGED
data/lib/glyph.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Copyright (c) 2009-2010 Fabio Cevasco
|
2
2
|
# website: http://www.h3rald.com/glyph
|
3
3
|
# license: MIT
|
4
|
+
# encoding: utf-8
|
4
5
|
|
5
6
|
require 'rubygems'
|
6
7
|
require 'pathname'
|
@@ -31,7 +32,6 @@ module Glyph
|
|
31
32
|
require LIB/'bookmark'
|
32
33
|
require LIB/'document'
|
33
34
|
require LIB/'macro_validators'
|
34
|
-
require LIB/'macro_helpers'
|
35
35
|
require LIB/'macro'
|
36
36
|
require LIB/'syntax_node'
|
37
37
|
require LIB/'parser'
|
@@ -40,8 +40,13 @@ module Glyph
|
|
40
40
|
require LIB/'reporter'
|
41
41
|
extend Glyph::Utils
|
42
42
|
|
43
|
+
# A generic Glyph error.
|
43
44
|
class Error < RuntimeError; end
|
45
|
+
|
46
|
+
# A syntax error.
|
44
47
|
class SyntaxError < Error; end
|
48
|
+
|
49
|
+
# A macro error.
|
45
50
|
class MacroError < Error
|
46
51
|
include Glyph::Utils
|
47
52
|
attr_reader :macro
|
@@ -62,17 +67,19 @@ module Glyph
|
|
62
67
|
msg "#{"-"*54}\n#{@macro.node.to_s.gsub(/\t/, ' ')}\n#{"-"*54}" if Glyph.debug?
|
63
68
|
end
|
64
69
|
end
|
70
|
+
|
71
|
+
# An infinite recursion error
|
65
72
|
class MutualInclusionError < MacroError; end
|
66
73
|
|
67
74
|
# The current version of Glyph
|
68
|
-
VERSION =
|
69
|
-
|
70
|
-
# All the currently-loaded snippets
|
71
|
-
SNIPPETS = {}
|
75
|
+
VERSION = "0.5.0"
|
72
76
|
|
73
77
|
# All the currently-loaded macros
|
74
78
|
MACROS = {}
|
75
79
|
|
80
|
+
# All the currently-loaded macro representations
|
81
|
+
REPS = {}
|
82
|
+
|
76
83
|
# All macro aliases
|
77
84
|
ALIASES = {:by_alias => {}, :by_def => {}}
|
78
85
|
|
@@ -110,10 +117,13 @@ module Glyph
|
|
110
117
|
CONFIG = Glyph::Config.new :resettable => true, :mutable => false
|
111
118
|
|
112
119
|
home_dir = Pathname.new(RUBY_PLATFORM.match(/win32|mingw/) ? ENV['HOMEPATH'] : ENV['HOME'])
|
120
|
+
# System configuration
|
113
121
|
SYSTEM_CONFIG =
|
114
122
|
Glyph::Config.new(:file => HOME/'config.yml')
|
123
|
+
# Global configuration
|
115
124
|
GLOBAL_CONFIG =
|
116
125
|
Glyph.test? ? Glyph::Config.new(:file => SPEC_DIR/'.glyphrc') : Glyph::Config.new(:file => home_dir/'.glyphrc')
|
126
|
+
# Project configuration
|
117
127
|
PROJECT_CONFIG =
|
118
128
|
Glyph::Config.new(:file => PROJECT/'config.yml', :resettable => true) rescue Glyph::Config.new(:resettable => true, :mutable => true)
|
119
129
|
|
@@ -168,7 +178,7 @@ module Glyph
|
|
168
178
|
self.enable_all
|
169
179
|
self.config_reset
|
170
180
|
MACROS.clear
|
171
|
-
|
181
|
+
REPS.clear
|
172
182
|
end
|
173
183
|
|
174
184
|
# Reenables all Glyph Rake tasks
|
@@ -203,11 +213,34 @@ module Glyph
|
|
203
213
|
MACROS[name.to_sym] = block
|
204
214
|
end
|
205
215
|
|
206
|
-
|
207
|
-
#
|
216
|
+
# Defines a new macro representation
|
217
|
+
# @since 0.5.0
|
218
|
+
# @param [Symbol, String] name the name of the macro
|
219
|
+
def self.rep(name, &block)
|
220
|
+
REPS[name.to_sym] = block
|
221
|
+
# Mirror aliases as well
|
222
|
+
ALIASES[:by_def][name.to_sym].to_a.each { |a| REPS[a] = block }
|
223
|
+
end
|
224
|
+
|
225
|
+
# Loads macro representations for a given output
|
226
|
+
# @since 0.5.0
|
227
|
+
# @param [Symbol, String] output a valid output format
|
228
|
+
def self.reps_for(output)
|
229
|
+
Glyph.instance_eval file_load(Glyph::HOME/"macros/reps/#{output}.rb") rescue nil
|
230
|
+
end
|
231
|
+
|
232
|
+
# Loads project macro representations for a given output
|
233
|
+
# @since 0.5.0
|
234
|
+
# @param [Symbol, String] output a valid output format
|
235
|
+
def self.project_reps_for(output)
|
236
|
+
Glyph.instance_eval file_load(Glyph::PROJECT/"lib/macros/reps/#{output}.rb") rescue nil
|
237
|
+
end
|
238
|
+
|
239
|
+
#@since 0.5.0
|
240
|
+
# Defines a new macro in Glyph code.
|
208
241
|
# @param [Symbol, String] name the name of the macro
|
209
242
|
# @param [String] text the Glyph code used to define the macro
|
210
|
-
def self.
|
243
|
+
def self.define(name, text)
|
211
244
|
macro name do
|
212
245
|
body = text.dup
|
213
246
|
# Parameters
|
@@ -283,7 +316,6 @@ module Glyph
|
|
283
316
|
result
|
284
317
|
end
|
285
318
|
|
286
|
-
|
287
319
|
end
|
288
320
|
|
289
321
|
Glyph.setup
|
data/lib/glyph/analyzer.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
module Glyph
|
2
4
|
|
3
5
|
# @since 0.4.0
|
@@ -186,7 +188,8 @@ module Glyph
|
|
186
188
|
def stats_snippets
|
187
189
|
c = @stats[:snippets] = {}
|
188
190
|
snippets = {}
|
189
|
-
c[:definitions] =
|
191
|
+
c[:definitions] = @doc.snippets.keys.sort
|
192
|
+
c[:values] = @doc.snippets
|
190
193
|
c[:used] = []
|
191
194
|
c[:unused] = []
|
192
195
|
c[:total] = 0
|
@@ -204,7 +207,7 @@ module Glyph
|
|
204
207
|
def stats_snippet(name)
|
205
208
|
name = name.to_sym
|
206
209
|
snippets = {}
|
207
|
-
raise ArgumentError, "Snippet '#{name}' does not exist" unless
|
210
|
+
raise ArgumentError, "Snippet '#{name}' does not exist" unless @doc.snippet? name
|
208
211
|
with_macros(:snippet) do |n|
|
209
212
|
code = n.parameters[0].to_s.to_sym
|
210
213
|
if code == name then
|
data/lib/glyph/bookmark.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
module Glyph
|
2
4
|
|
3
5
|
# @since 0.4.0
|
@@ -31,7 +33,7 @@ module Glyph
|
|
31
33
|
|
32
34
|
# Returns true if the two bookmarks have the same ID and file
|
33
35
|
# @param [Glyph::Bookmark] b the bookmark to compare
|
34
|
-
# @
|
36
|
+
# @raise [RuntimeError] if the parameter supplied is not a bookmark
|
35
37
|
def ==(b)
|
36
38
|
raise RuntimeError, "#{b.inspect} is not a bookmark" unless b.is_a? Glyph::Bookmark
|
37
39
|
self.code == b.code && self.file == b.file
|
data/lib/glyph/commands.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
|
+
include GLI
|
3
4
|
|
4
5
|
GLI.desc "Enable debugging"
|
5
6
|
switch [:d, :debug]
|
6
7
|
|
8
|
+
GLI.desc "Prints the version of the program"
|
9
|
+
switch [:v, :version]
|
10
|
+
|
7
11
|
require Glyph::LIB/'commands/init'
|
8
12
|
require Glyph::LIB/'commands/add'
|
9
13
|
require Glyph::LIB/'commands/compile'
|
@@ -17,17 +21,16 @@ Glyph.run 'load:commands'
|
|
17
21
|
|
18
22
|
pre do |global,command,options,args|
|
19
23
|
# Pre logic here
|
20
|
-
# Return true to proceed; false to
|
24
|
+
# Return true to proceed; false to abort and not call the
|
21
25
|
# chosen command
|
22
26
|
if global[:d] then
|
23
27
|
Glyph.debug_mode = true
|
24
28
|
end
|
25
|
-
if !command || command.name == :help then
|
26
|
-
puts "====================================="
|
29
|
+
if global[:v] || !command || command.name == :help then
|
27
30
|
puts "Glyph v#{Glyph::VERSION}"
|
28
|
-
|
31
|
+
puts
|
29
32
|
end
|
30
|
-
true
|
33
|
+
global[:v] ? false : true
|
31
34
|
end
|
32
35
|
|
33
36
|
post do |global,command,options,args|
|
@@ -38,10 +41,9 @@ on_error do |exception|
|
|
38
41
|
raise if Glyph.library?
|
39
42
|
if exception.is_a? Glyph::MacroError then
|
40
43
|
exception.display
|
41
|
-
false
|
42
44
|
else
|
45
|
+
Glyph.warning exception.message
|
43
46
|
if Glyph.debug? then
|
44
|
-
Glyph.warning exception.message
|
45
47
|
puts "\n"+"-"*20+"[ Backtrace: ]"+"-"*20
|
46
48
|
puts "Backtrace:"
|
47
49
|
exception.backtrace.each do |b|
|
@@ -49,6 +51,6 @@ on_error do |exception|
|
|
49
51
|
end
|
50
52
|
Glyph.debug_mode = false
|
51
53
|
end
|
52
|
-
true
|
53
54
|
end
|
55
|
+
false
|
54
56
|
end
|
data/lib/glyph/commands/add.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
GLI.desc 'Add a new text file to the project'
|
2
4
|
arg_name "file_name"
|
3
5
|
command :add do |c|
|
4
6
|
c.action do |global_options,options,args|
|
5
|
-
|
7
|
+
exit_now! "Please specify a file name.", -20 if args.blank?
|
6
8
|
Glyph.run 'project:add', args[0]
|
7
9
|
end
|
8
10
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
GLI.desc 'Compile the project'
|
2
4
|
arg_name "[source_file] [destination_file]"
|
3
5
|
command :compile do |c|
|
@@ -8,7 +10,7 @@ command :compile do |c|
|
|
8
10
|
c.desc "Auto-regenerate output on file changes"
|
9
11
|
c.switch [:a, :auto]
|
10
12
|
c.action do |global_options, options, args|
|
11
|
-
|
13
|
+
exit_now! "Too many arguments", -12 if args.length > 2
|
12
14
|
Glyph.lite_mode = true unless args.blank?
|
13
15
|
Glyph.run! 'load:config'
|
14
16
|
original_config = Glyph::CONFIG.dup
|
@@ -18,14 +20,15 @@ command :compile do |c|
|
|
18
20
|
target = Glyph['document.output']
|
19
21
|
target = nil if target.blank?
|
20
22
|
target ||= Glyph["output.#{Glyph['document.output']}.filter_target"]
|
23
|
+
through = Glyph["output.#{target}.through"]
|
21
24
|
Glyph['document.source'] = options[:s] if options[:s]
|
22
25
|
if Glyph.multiple_output_files? then
|
23
26
|
Glyph["output.#{Glyph['document.output']}.base"] = Glyph::PROJECT/"output/#{Glyph['document.output']}/".to_s if Glyph["output.#{Glyph['document.output']}.base"].blank?
|
24
27
|
else
|
25
28
|
Glyph["output.#{Glyph['document.output']}.base"] = ""
|
26
29
|
end
|
27
|
-
|
28
|
-
|
30
|
+
exit_now! "Output target not specified", -30 unless target
|
31
|
+
exit_now! "Unknown output target '#{target}'", -31 unless output_targets.include? target.to_sym
|
29
32
|
|
30
33
|
# Lite mode
|
31
34
|
if Glyph.lite? then
|
@@ -35,15 +38,15 @@ command :compile do |c|
|
|
35
38
|
src_extension = Regexp.escape(source_file.extname)
|
36
39
|
dst_extension = "."+Glyph['document.output']
|
37
40
|
destination_file ||= Pathname.new(source_file.to_s.gsub(/#{src_extension}$/, dst_extension))
|
38
|
-
|
39
|
-
|
41
|
+
exit_now! "Source file '#{source_file}' does not exist", -32 unless source_file.exist?
|
42
|
+
exit_now! "Source and destination file are the same", -33 if source_file.to_s == destination_file.to_s
|
40
43
|
Glyph['document.filename'] = filename
|
41
44
|
Glyph['document.source'] = source_file.to_s
|
42
45
|
Glyph['document.output_dir'] = destination_file.parent.to_s # System use only
|
43
46
|
Glyph['document.output_file'] = destination_file.basename.to_s # System use only
|
44
47
|
end
|
45
48
|
begin
|
46
|
-
Glyph.run "generate:#{target}"
|
49
|
+
Glyph.run "generate:#{target}#{through ? "_through_#{through}" : ""}"
|
47
50
|
rescue Exception => e
|
48
51
|
message = e.message
|
49
52
|
if Glyph.debug? then
|
@@ -61,7 +64,7 @@ command :compile do |c|
|
|
61
64
|
begin
|
62
65
|
require 'directory_watcher'
|
63
66
|
rescue LoadError
|
64
|
-
|
67
|
+
exit_now! "DirectoryWatcher is not available. Install it with: gem install directory_watcher", -34
|
65
68
|
end
|
66
69
|
Glyph.info 'Auto-regeneration enabled'
|
67
70
|
Glyph.info 'Use ^C to interrupt'
|
@@ -1,7 +1,9 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
GLI.desc 'Get/set configuration settings'
|
2
4
|
arg_name "setting [new_value]"
|
3
5
|
command :config do |c|
|
4
|
-
c.desc "Save to global configuration"
|
6
|
+
c.desc "Read from/Save to global configuration"
|
5
7
|
c.switch [:g, :global]
|
6
8
|
c.action do |global_options,options,args|
|
7
9
|
Glyph.run 'load:config'
|
@@ -12,14 +14,14 @@ command :config do |c|
|
|
12
14
|
end
|
13
15
|
case args.length
|
14
16
|
when 0 then
|
15
|
-
|
17
|
+
exit_now! "Too few arguments.", -10
|
16
18
|
when 1 then # read current config
|
17
19
|
setting = Glyph[args[0]]
|
18
|
-
|
20
|
+
exit_now! "Unknown setting '#{args[0]}'", -11 if setting == nil
|
19
21
|
Glyph.info setting.inspect
|
20
22
|
when 2 then
|
21
23
|
if args[0].match /^system\..+/ then
|
22
|
-
|
24
|
+
exit_now! "Cannot reset '#@value' setting (system use only).", -11
|
23
25
|
else
|
24
26
|
# Remove all overrides
|
25
27
|
Glyph.config_reset
|
@@ -32,7 +34,7 @@ command :config do |c|
|
|
32
34
|
Glyph.config_refresh
|
33
35
|
end
|
34
36
|
else
|
35
|
-
|
37
|
+
exit_now! "Too many arguments.", -12
|
36
38
|
end
|
37
39
|
end
|
38
40
|
end
|
data/lib/glyph/commands/init.rb
CHANGED
data/lib/glyph/commands/stats.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
GLI.desc 'Display statistics'
|
2
4
|
command :stats do |c|
|
3
5
|
c.desc "Display stats about macros"
|
@@ -32,6 +34,7 @@ command :stats do |c|
|
|
32
34
|
no_flags = true
|
33
35
|
[:macro, :bookmark, :link, :snippet].each do |f|
|
34
36
|
if options[f] then
|
37
|
+
analyzer.stats_for :snippets if f == :snippet
|
35
38
|
analyzer.stats_for f, options[f]
|
36
39
|
no_flags = false
|
37
40
|
end
|
data/lib/glyph/commands/todo.rb
CHANGED
data/lib/glyph/config.rb
CHANGED
data/lib/glyph/document.rb
CHANGED
@@ -9,9 +9,11 @@ module Glyph
|
|
9
9
|
# as well as replacing placeholders.
|
10
10
|
class Document
|
11
11
|
|
12
|
-
|
12
|
+
# A Regexp containing the characters to escape
|
13
|
+
ESCAPES = /\\([\\\]\[\|\/=])/
|
13
14
|
|
14
|
-
attr_reader :bookmarks, :placeholders, :headers, :styles, :context
|
15
|
+
attr_reader :bookmarks, :placeholders, :headers, :styles, :context
|
16
|
+
attr_reader :errors, :todos, :topics, :links, :toc, :fragments, :snippets
|
15
17
|
|
16
18
|
# Creates a new document
|
17
19
|
# @param [GlyphSyntaxNode] tree the syntax tree to be evaluate
|
@@ -24,6 +26,8 @@ module Glyph
|
|
24
26
|
@placeholders = {}
|
25
27
|
@bookmarks = {}
|
26
28
|
@headers = {}
|
29
|
+
@snippets = {}
|
30
|
+
@fragments = {}
|
27
31
|
@styles = []
|
28
32
|
@errors = []
|
29
33
|
@todos = []
|
@@ -49,12 +53,14 @@ module Glyph
|
|
49
53
|
def inherit_from(document, data={})
|
50
54
|
@bookmarks = document.bookmarks unless data[:bookmarks] == false
|
51
55
|
@headers = document.headers unless data[:headers] == false
|
56
|
+
@snippets = document.snippets unless data[:snippets] == false
|
52
57
|
@todos = document.todos unless data[:todos] == false
|
53
58
|
@styles = document.styles unless data[:styles] == false
|
54
59
|
@topics = document.topics unless data[:topics] == false
|
55
60
|
@placeholders = document.placeholders unless data[:placeholders] == false
|
56
61
|
@toc = document.toc unless data[:toc] == false
|
57
|
-
@links = document.links unless data[:links] ==
|
62
|
+
@links = document.links unless data[:links] == false
|
63
|
+
@fragments = document.fragments unless data[:fragments] == false
|
58
64
|
self
|
59
65
|
end
|
60
66
|
|
@@ -75,7 +81,8 @@ module Glyph
|
|
75
81
|
end
|
76
82
|
|
77
83
|
# Stores a new bookmark
|
78
|
-
# @param [Hash] hash the bookmark hash
|
84
|
+
# @param [Hash] hash the bookmark hash
|
85
|
+
# @example {:id => "BookmarkID", :title => "Bookmark Title", :file => "dir/preface.glyph"}
|
79
86
|
# @return [Glyph::Bookmark] the stored bookmark
|
80
87
|
# @raise [RuntimeError] if the bookmark is already defined.
|
81
88
|
def bookmark(hash)
|
@@ -86,7 +93,8 @@ module Glyph
|
|
86
93
|
end
|
87
94
|
|
88
95
|
# Stores a new header
|
89
|
-
# @param [Hash] hash the header hash
|
96
|
+
# @param [Hash] hash the header hash
|
97
|
+
# @example {:id => "Bookmark_ID", :title => "Bookmark Title", :level => 3}
|
90
98
|
# @return [Glyph::Header] the stored header
|
91
99
|
# @raise [RuntimeError] if the bookmark is already defined.
|
92
100
|
def header(hash)
|
@@ -104,10 +112,27 @@ module Glyph
|
|
104
112
|
@headers[key.to_sym]
|
105
113
|
end
|
106
114
|
|
115
|
+
# Stores a new snippet
|
116
|
+
# @param [Symbol, String] key the snippet identifier
|
117
|
+
# @param [string] value the snippet contents
|
118
|
+
# @return [String] the stored snippet
|
119
|
+
# @since 0.5.0
|
120
|
+
def snippet(key, value)
|
121
|
+
@snippets[key.to_sym] = value
|
122
|
+
end
|
123
|
+
|
124
|
+
# Returns a stored snippet or nil
|
125
|
+
# @param [String, Symbol] key the snippet identifier
|
126
|
+
# @return [String, nil] the snippet contents or nil if no snippet is found
|
127
|
+
# @since 0.5.0
|
128
|
+
def snippet?(key)
|
129
|
+
@snippets[key.to_sym]
|
130
|
+
end
|
131
|
+
|
107
132
|
# @since 0.4.0
|
108
133
|
# Stores a stylesheet
|
109
134
|
# @param [String] file the stylesheet file
|
110
|
-
# @
|
135
|
+
# @raise [RuntimeError] if the stylesheet is already specified for the document (unless the output has more than one file)
|
111
136
|
def style(file)
|
112
137
|
f = Pathname.new file
|
113
138
|
if @styles.include?(f) && !Glyph.multiple_output_files? then
|
@@ -152,10 +177,10 @@ module Glyph
|
|
152
177
|
end
|
153
178
|
end
|
154
179
|
# Substitute escape sequences
|
155
|
-
@output.gsub!(ESCAPES) { |match| ($1 == '
|
156
|
-
toc[:contents].gsub!(ESCAPES) { |match| ($1 == '
|
180
|
+
@output.gsub!(ESCAPES) { |match| ($1 == '/') ? '' : $1 }
|
181
|
+
toc[:contents].gsub!(ESCAPES) { |match| ($1 == '/') ? '' : $1 } rescue nil
|
157
182
|
@topics.each do |t|
|
158
|
-
t[:contents].gsub!(ESCAPES) { |match| ($1 == '
|
183
|
+
t[:contents].gsub!(ESCAPES) { |match| ($1 == '/') ? '' : $1 }
|
159
184
|
end
|
160
185
|
@state = :finalized
|
161
186
|
end
|