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
@@ -77,6 +77,18 @@ module Glyph
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
+
# Ensures that the macro receives the specified attribute
|
81
|
+
# @param [String, Symbol] name the name of the attribute
|
82
|
+
# @param [Hash] options a hash containing validation options
|
83
|
+
# @option options :level the error level (:error, :warning)
|
84
|
+
# @return [Boolean] whether the validation passed or not
|
85
|
+
# @since 0.4.0
|
86
|
+
def required_attribute(name, options={:level=>:error})
|
87
|
+
validate("Macro '#{@name}' requires a '#{name}' attribute", options) do
|
88
|
+
!raw_attribute(name.to_sym).blank?
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
80
92
|
# Ensures that the macro receives no parameters.
|
81
93
|
# @param [Hash] options a hash containing validation options
|
82
94
|
# @option options :level the error level (:error, :warning)
|
@@ -133,8 +145,31 @@ module Glyph
|
|
133
145
|
macro_error "Mutual Inclusion in #{check_type}(#{arg}): '#{check_value}'", Glyph::MutualInclusionError
|
134
146
|
end
|
135
147
|
end
|
136
|
-
end
|
137
148
|
|
138
|
-
|
149
|
+
# Ensure that the macros is within another
|
150
|
+
# @param [String, Symbol] arg the name of the container macro
|
151
|
+
# @param [Hash] options a hash containing validation options
|
152
|
+
# @option options :level the error level (:error, :warning)
|
153
|
+
# @return [Boolean] whether the validation passed or not
|
154
|
+
# @since 0.4.0
|
155
|
+
def within(arg, options={:level => :error})
|
156
|
+
validate("Macro '#{@name}' must be within a '#{arg}' macro", options) do
|
157
|
+
@node.find_parent {|n| Glyph.macro_eq? arg.to_sym, n[:name]}
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# Ensure that the macros is _not_ within another
|
162
|
+
# @param [String, Symbol] arg the name of the container macro
|
163
|
+
# @param [Hash] options a hash containing validation options
|
164
|
+
# @option options :level the error level (:error, :warning)
|
165
|
+
# @return [Boolean] whether the validation passed or not
|
166
|
+
# @since 0.4.0
|
167
|
+
def not_within(arg, options={:level => :error})
|
168
|
+
validate("Macro '#{@name}' must not be within a '#{arg}' macro", options) do
|
169
|
+
!@node.find_parent {|n| Glyph.macro_eq? arg.to_sym, n[:name]}
|
170
|
+
end
|
171
|
+
end
|
139
172
|
|
173
|
+
end
|
174
|
+
end
|
140
175
|
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
module Glyph
|
2
|
+
|
3
|
+
# This class is used to display statistics collected by a Glyph::Analyzer.
|
4
|
+
# @since 0.4.0
|
5
|
+
class Reporter
|
6
|
+
|
7
|
+
include Glyph::Utils
|
8
|
+
|
9
|
+
attr_accessor :detailed
|
10
|
+
|
11
|
+
# Initializes the reporter
|
12
|
+
# @param [Hash] stats the collected statistics
|
13
|
+
def initialize(stats)
|
14
|
+
@stats = stats
|
15
|
+
@detailed = true
|
16
|
+
end
|
17
|
+
|
18
|
+
# Displays the statistics
|
19
|
+
def display
|
20
|
+
[:files, :macros, :snippets, :bookmarks, :links,
|
21
|
+
:macro, :snippet, :bookmark, :link].each do |s|
|
22
|
+
unless @stats[s].blank? then
|
23
|
+
send :"display_#{s}"
|
24
|
+
puts
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def display_macros
|
32
|
+
s = @stats[:macros]
|
33
|
+
section :macros
|
34
|
+
total :macro_instances, s[:instances].length
|
35
|
+
total :macro_definitions, s[:definitions].length
|
36
|
+
total :macro_aliases, s[:aliases].length
|
37
|
+
total :used_macro_definitions, s[:used_definitions].length
|
38
|
+
if @detailed then
|
39
|
+
inline_list :macro_definitions, s[:definitions]
|
40
|
+
inline_list :used_macro_definitions, s[:used_definitions]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def display_macro
|
45
|
+
s = @stats[:macro]
|
46
|
+
alias_for = s[:alias_for] ? " (alias for: #{s[:alias_for]})" : " "
|
47
|
+
section "Macro '#{s[:param]}'#{alias_for}"
|
48
|
+
total :instances, s[:instances].length
|
49
|
+
occurrences s[:files] if @detailed
|
50
|
+
end
|
51
|
+
|
52
|
+
def display_bookmarks
|
53
|
+
s = @stats[:bookmarks]
|
54
|
+
section :bookmarks
|
55
|
+
total :bookmarks, s[:codes].length
|
56
|
+
total :referenced_bookmarks, s[:referenced].length
|
57
|
+
total :unreferenced_bookmarks, s[:unreferenced].length
|
58
|
+
if @detailed then
|
59
|
+
inline_list :bookmarks, s[:codes]
|
60
|
+
occurrences s[:referenced], "Referenced Bookmarks:"
|
61
|
+
inline_list :unreferenced_bookmarks, s[:unreferenced]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def display_bookmark
|
66
|
+
s = @stats[:bookmark]
|
67
|
+
b_type = (s[:type] != :bookmark) ? " (#{s[:type]})" : " "
|
68
|
+
section "Bookmark '#{s[:param]}'#{b_type}"
|
69
|
+
if s[:file] == s[:definition] then
|
70
|
+
info "Defined in: #{s[:file]}"
|
71
|
+
else
|
72
|
+
info "Defined in: #{s[:definition]} (pointing to: #{s[:file]})"
|
73
|
+
end
|
74
|
+
occurrences s[:references], "Referenced in:" if @detailed
|
75
|
+
end
|
76
|
+
|
77
|
+
def display_snippets
|
78
|
+
s = @stats[:snippets]
|
79
|
+
section :snippets
|
80
|
+
total :snippets, s[:definitions].length
|
81
|
+
total :used_snippets, s[:used].length
|
82
|
+
total :unused_snippets, s[:unused].length
|
83
|
+
if @detailed then
|
84
|
+
inline_list :snippets, s[:definitions]
|
85
|
+
inline_list :used_snippets, s[:used]
|
86
|
+
inline_list :unused_snippets, s[:unused]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def display_snippet
|
91
|
+
s = @stats[:snippet]
|
92
|
+
section "Snippet '#{s[:param]}'"
|
93
|
+
info "Definition:"
|
94
|
+
puts "-------------------"
|
95
|
+
puts SNIPPETS[s[:param]]
|
96
|
+
puts "-------------------"
|
97
|
+
total :used_instances, s[:stats][:total]
|
98
|
+
occurrences s[:stats][:files], "Usage Details:" if @detailed
|
99
|
+
end
|
100
|
+
|
101
|
+
def display_links
|
102
|
+
s = @stats[:links]
|
103
|
+
section :links
|
104
|
+
total :internal_links, s[:internal].length
|
105
|
+
occurrences s[:internal], "Internal Links" if @detailed
|
106
|
+
total :external_links, s[:external].length
|
107
|
+
occurrences s[:external], "External Links" if @detailed
|
108
|
+
end
|
109
|
+
|
110
|
+
def display_link
|
111
|
+
s = @stats[:link]
|
112
|
+
section "Links matching /#{s[:param]}/"
|
113
|
+
total :links, s[:stats].length
|
114
|
+
occurrences s[:stats], "Link Targets:"
|
115
|
+
grouped_occurrences s[:stats], "Details:" if @detailed
|
116
|
+
end
|
117
|
+
|
118
|
+
def display_files
|
119
|
+
s = @stats[:files]
|
120
|
+
section :files
|
121
|
+
total :files, s.values.inject{|sum, n| sum+n}
|
122
|
+
total "/text --", s[:text]
|
123
|
+
total "/images --", s[:images]
|
124
|
+
total "/styles --", s[:styles]
|
125
|
+
total "/layouts --", s[:layouts]
|
126
|
+
total "/lib --", s[:lib]
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def total(objects, total)
|
133
|
+
label = objects.is_a?(Symbol) ? "Total #{objects.to_s.title_case}:" : objects
|
134
|
+
info "#{label} #{total}"
|
135
|
+
end
|
136
|
+
|
137
|
+
def section(name)
|
138
|
+
puts "===== #{(name.is_a? Symbol) ? name.to_s.title_case : name}"
|
139
|
+
end
|
140
|
+
|
141
|
+
def inline_list(name, arr)
|
142
|
+
return if arr.blank?
|
143
|
+
label = name.to_s.title_case
|
144
|
+
columns = 5
|
145
|
+
max = arr.map{|e| e.to_s.length}.max
|
146
|
+
if arr.length < columns+1 then
|
147
|
+
info "#{label}: #{arr.join(', ')}"
|
148
|
+
else
|
149
|
+
info "#{label}:"
|
150
|
+
count = 0
|
151
|
+
arr.each do |i|
|
152
|
+
print " " if count%columns == 0
|
153
|
+
print "#{i}#{' '*(max-i.to_s.length+1)}"
|
154
|
+
print "\n" if count%columns == 4
|
155
|
+
count +=1
|
156
|
+
end
|
157
|
+
puts
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def occurrences(arr, label="Occurrences:")
|
162
|
+
return if arr.blank?
|
163
|
+
info label
|
164
|
+
arr.each do |f|
|
165
|
+
total = f[1].is_a?(Numeric) ? "(#{f[1]})" : ""
|
166
|
+
puts " - #{f[0]} #{total}"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def grouped_occurrences(arr, label="Details:")
|
171
|
+
return if arr.blank?
|
172
|
+
info label
|
173
|
+
arr.each do |f|
|
174
|
+
puts " - #{f[0]} (#{f[1][:total]})"
|
175
|
+
f[1][:files].each do |i|
|
176
|
+
puts " - #{i[0]} (#{i[1]})"
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
end
|
data/lib/glyph/syntax_node.rb
CHANGED
@@ -11,6 +11,18 @@ module Glyph
|
|
11
11
|
""
|
12
12
|
end
|
13
13
|
|
14
|
+
# @return [String] a textual representation of self
|
15
|
+
# @since 0.4.0
|
16
|
+
def inspect
|
17
|
+
string = ""
|
18
|
+
descend do |e, level|
|
19
|
+
# Remove document key to avoid endless resursion
|
20
|
+
hash = e.to_hash.reject{|k,v| k == :document}
|
21
|
+
string << " "*level+"(#{e.class})"+hash.inspect+"\n"
|
22
|
+
end
|
23
|
+
string.chomp
|
24
|
+
end
|
25
|
+
|
14
26
|
# @return [String] the value of the :value key
|
15
27
|
# @since 0.3.0
|
16
28
|
def evaluate(context, options={})
|
@@ -49,7 +61,7 @@ module Glyph
|
|
49
61
|
e = self[:escape] ? "=" : ""
|
50
62
|
"#{self[:name]}["+e+attributes.join+parameters.join("|")+e+"]"
|
51
63
|
end
|
52
|
-
|
64
|
+
|
53
65
|
# Expands the macro
|
54
66
|
# @return [String] the value of the macro
|
55
67
|
# @since 0.3.0
|
@@ -63,7 +75,16 @@ module Glyph
|
|
63
75
|
children.select{|n| n.is_a? ParameterNode }
|
64
76
|
end
|
65
77
|
|
66
|
-
#
|
78
|
+
# @return [Array<Glyph::MacroNode>] an array of the child macro nodes
|
79
|
+
# @since 0.4.0
|
80
|
+
def child_macros
|
81
|
+
macros = []
|
82
|
+
parameters.each do |p|
|
83
|
+
macros += p.children.select{|n| n.is_a? MacroNode }
|
84
|
+
end
|
85
|
+
macros
|
86
|
+
end
|
87
|
+
|
67
88
|
# Returns the parameter syntax node at the specified index
|
68
89
|
# @param [Fixnum] n the index of the parameter
|
69
90
|
# @return [Glyph::ParameterNode, nil] a parameter node
|
@@ -103,15 +124,21 @@ module Glyph
|
|
103
124
|
# @since 0.3.0
|
104
125
|
def expand(context)
|
105
126
|
xml_element(context)
|
106
|
-
self
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
:value => ""
|
111
|
-
})
|
127
|
+
self[:source] = context[:source]
|
128
|
+
self[:document] = context[:document]
|
129
|
+
self[:info] = context[:info]
|
130
|
+
self[:value] = ""
|
112
131
|
Glyph::Macro.new(self).expand
|
113
132
|
end
|
114
133
|
|
134
|
+
# Returns where the macro was used (used in Glyph::Analyzer)
|
135
|
+
# @since 0.4.0
|
136
|
+
def source
|
137
|
+
s = self[:source][:file] rescue nil
|
138
|
+
s ||= self[:source][:name] rescue nil
|
139
|
+
s
|
140
|
+
end
|
141
|
+
|
115
142
|
protected
|
116
143
|
|
117
144
|
def xml_element(context)
|
@@ -123,11 +150,11 @@ module Glyph
|
|
123
150
|
end
|
124
151
|
case
|
125
152
|
# Use XML syntax
|
126
|
-
when Glyph['
|
153
|
+
when Glyph['options.macro_set'] == 'xml' then
|
127
154
|
self[:element] = name
|
128
155
|
self[:name] = :"|xml|"
|
129
156
|
# Fallback to XML syntax
|
130
|
-
when Glyph[
|
157
|
+
when Glyph["options.xml_fallback"] then
|
131
158
|
unless known_macro then
|
132
159
|
self[:element] = name
|
133
160
|
self[:fallback] = true
|
@@ -1,49 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
# @param [#to_s] file the file to write to
|
5
|
-
# @param [Object] obj the object to serialize
|
6
|
-
def yaml_dump(file, obj)
|
7
|
-
File.open(file.to_s, 'w+') {|f| f.write obj.to_yaml}
|
8
|
-
end
|
9
|
-
|
10
|
-
# Loads and deserialiaze the contents of a YAML file
|
11
|
-
# @param [#to_s] file the YAML file to load
|
12
|
-
# @return [Object] the contents of the YAML file, deserialized
|
13
|
-
def yaml_load(file)
|
14
|
-
YAML.load_file(file.to_s)
|
15
|
-
end
|
16
|
-
|
17
|
-
# Loads the contents of a file
|
18
|
-
# @param [#to_s] file the file to load
|
19
|
-
# @return [String] the contents of the file
|
20
|
-
def file_load(file)
|
21
|
-
result = ""
|
22
|
-
File.open(file.to_s, 'r') do |f|
|
23
|
-
while l = f.gets
|
24
|
-
result << l
|
25
|
-
end
|
26
|
-
end
|
27
|
-
result
|
28
|
-
end
|
29
|
-
|
30
|
-
# Writes a string to a file
|
31
|
-
# @param [#to_s] file the file to write
|
32
|
-
# @param [String] contents the string to write
|
33
|
-
# @return [String] the string written to the file
|
34
|
-
def file_write(file, contents="")
|
35
|
-
File.open(file.to_s, 'w+') do |f|
|
36
|
-
f.print contents
|
37
|
-
end
|
38
|
-
contents
|
1
|
+
class Symbol
|
2
|
+
def <=>(b)
|
3
|
+
self.to_s <=> b.to_s
|
39
4
|
end
|
5
|
+
end
|
40
6
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# @param [Hash] options copy options
|
45
|
-
def file_copy(source, dest, options={})
|
46
|
-
FileUtils.cp source, dest, options
|
7
|
+
class String
|
8
|
+
def title_case
|
9
|
+
self.snake_case.split('_').map{|s| s.capitalize}.join(' ')
|
47
10
|
end
|
48
|
-
|
49
11
|
end
|
12
|
+
|
data/lib/glyph/utils.rb
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
module Glyph
|
2
|
+
#@since 0.4.0
|
3
|
+
module Utils
|
4
|
+
|
5
|
+
# Prints a message
|
6
|
+
# @param [String] message the message to print
|
7
|
+
def msg(message)
|
8
|
+
puts message unless Glyph['system.quiet']
|
9
|
+
end
|
10
|
+
|
11
|
+
# Prints an informational message
|
12
|
+
# @param [String] message the message to print
|
13
|
+
def info(message)
|
14
|
+
puts "-- #{message}" unless Glyph['system.quiet']
|
15
|
+
end
|
16
|
+
|
17
|
+
# Prints a warning
|
18
|
+
# @param [String] message the message to print
|
19
|
+
def warning(message)
|
20
|
+
puts "-> warning: #{message}" unless Glyph['system.quiet']
|
21
|
+
end
|
22
|
+
|
23
|
+
# Prints an error
|
24
|
+
# @param [String] message the message to print
|
25
|
+
def error(message)
|
26
|
+
puts "=> error: #{message}" unless Glyph['system.quiet']
|
27
|
+
end
|
28
|
+
|
29
|
+
# Prints a message if running in debug mode
|
30
|
+
# @param [String] message the message to print
|
31
|
+
def debug(message)
|
32
|
+
puts message if Glyph.debug?
|
33
|
+
end
|
34
|
+
|
35
|
+
# Dumps and serialize an object to a YAML file
|
36
|
+
# @param [#to_s] file the file to write to
|
37
|
+
# @param [Object] obj the object to serialize
|
38
|
+
def yaml_dump(file, obj)
|
39
|
+
File.open(file.to_s, 'w+') {|f| f.write obj.to_yaml}
|
40
|
+
end
|
41
|
+
|
42
|
+
# Loads and deserialiaze the contents of a YAML file
|
43
|
+
# @param [#to_s] file the YAML file to load
|
44
|
+
# @return [Object] the contents of the YAML file, deserialized
|
45
|
+
def yaml_load(file)
|
46
|
+
YAML.load_file(file.to_s)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Loads the contents of a file
|
50
|
+
# @param [#to_s] file the file to load
|
51
|
+
# @return [String] the contents of the file
|
52
|
+
def file_load(file)
|
53
|
+
result = ""
|
54
|
+
File.open(file.to_s, 'r') do |f|
|
55
|
+
while l = f.gets
|
56
|
+
result << l
|
57
|
+
end
|
58
|
+
end
|
59
|
+
result
|
60
|
+
end
|
61
|
+
|
62
|
+
# Writes a string to a file
|
63
|
+
# @param [#to_s] file the file to write
|
64
|
+
# @param [String] contents the string to write
|
65
|
+
# @return [String] the string written to the file
|
66
|
+
def file_write(file, contents="")
|
67
|
+
File.open(file.to_s, 'w+') do |f|
|
68
|
+
f.print contents
|
69
|
+
end
|
70
|
+
contents
|
71
|
+
end
|
72
|
+
|
73
|
+
# An alias for FileUtils#cp
|
74
|
+
# @param [String] source the source file
|
75
|
+
# @param [String] dest the destination file or directory
|
76
|
+
# @param [Hash] options copy options
|
77
|
+
def file_copy(source, dest, options={})
|
78
|
+
FileUtils.cp source, dest, options
|
79
|
+
end
|
80
|
+
|
81
|
+
# Loads all child elements of the given directory, matching a given extension
|
82
|
+
# @param [Pathname] dir the directory containing the files
|
83
|
+
# @param [String] extension the file extension to check
|
84
|
+
# @yield [file, contents] the file (Pathname) and its contents
|
85
|
+
# @since 0.4.0
|
86
|
+
def load_files_from_dir(dir, extension, &block)
|
87
|
+
if dir.exist? then
|
88
|
+
dir.children.each do |c|
|
89
|
+
block.call(c, file_load(c)) unless c.directory? || c.extname != extension
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Iterates through the files in a source directory recursively
|
95
|
+
# @param [String] dir the directory to operate on (mirrored in the output directory)
|
96
|
+
# @yield [src, dest] the source file and the corresponding output file
|
97
|
+
# @since 0.4.0
|
98
|
+
def with_files_from(dir, &block)
|
99
|
+
output = (Glyph['document.output'] == 'pdf') ? 'html' : Glyph['document.output']
|
100
|
+
dir_path = Glyph::PROJECT/"output/#{output}/#{dir}"
|
101
|
+
dir_path.mkpath
|
102
|
+
(Glyph::PROJECT/dir).find do |i|
|
103
|
+
if i.file? then
|
104
|
+
dest = "#{Glyph::PROJECT/"output/#{output}/#{dir}"}/#{i.relative_path_from(Glyph::PROJECT/dir)}"
|
105
|
+
src = i.to_s
|
106
|
+
Pathname.new(dest).parent.mkpath
|
107
|
+
block.call src, dest
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# Returns true if the macro name is used as an alias
|
113
|
+
# @param [String, Symbol] name the macro name to check
|
114
|
+
def macro_alias?(name)
|
115
|
+
ALIASES[:by_alias].include? name.to_sym
|
116
|
+
end
|
117
|
+
|
118
|
+
# Returns the name of the macro definition referenced by the supplied alias
|
119
|
+
# @param [String, Symbol] name the alias name to check
|
120
|
+
def macro_definition_for(name)
|
121
|
+
ALIASES[:by_alias][name.to_sym]
|
122
|
+
end
|
123
|
+
|
124
|
+
def macro_aliases_for(name)
|
125
|
+
ALIASES[:by_def][name.to_sym]
|
126
|
+
end
|
127
|
+
|
128
|
+
# Returns true if the macro names point to the same definition
|
129
|
+
# @param [String, Symbol] ident1 the first macro to compare
|
130
|
+
# @param [String, Symbol] ident2 the second macro to compare
|
131
|
+
def macro_eq?(ident1, ident2)
|
132
|
+
Glyph::MACROS[ident1.to_sym] == Glyph::MACROS[ident2.to_sym]
|
133
|
+
end
|
134
|
+
|
135
|
+
# Returns true if the PROJECT constant is set to a valid Glyph project directory
|
136
|
+
def project?
|
137
|
+
children = ["text", "snippets.yml", "config.yml", "document.glyph"].sort
|
138
|
+
actual_children = PROJECT.children.map{|c| c.basename.to_s}.sort
|
139
|
+
(actual_children & children) == children
|
140
|
+
end
|
141
|
+
|
142
|
+
# Returns true if multiple output files are being generated
|
143
|
+
def multiple_output_files?
|
144
|
+
Glyph["output.#{Glyph['document.output']}.multifile"]
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|