pug-ruby 1.0.2 → 2.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/.rubocop.yml +81 -0
- data/.travis.yml +17 -8
- data/.yardopts +4 -0
- data/Gemfile +3 -3
- data/Gemfile.lock +32 -0
- data/LICENSE +21 -0
- data/README.md +256 -24
- data/Rakefile +74 -8
- data/lib/jade-pug/base.rb +178 -0
- data/lib/jade-pug/compiler.rb +166 -0
- data/lib/jade-pug/config.rb +60 -0
- data/lib/jade-pug/errors/compilation-error.rb +14 -0
- data/lib/jade-pug/errors/compiler-error.rb +13 -0
- data/lib/jade-pug/shipped-compiler.rb +80 -0
- data/lib/jade-pug/system-compiler.rb +139 -0
- data/lib/jade-ruby/compilation-essentials.rb +24 -0
- data/lib/jade-ruby/config.rb +17 -44
- data/lib/jade-ruby/errors/compilation-error.rb +14 -0
- data/lib/jade-ruby/errors/compiler-error.rb +13 -0
- data/lib/jade-ruby/shipped-compiler.rb +15 -0
- data/lib/jade-ruby/system-compiler.rb +15 -0
- data/lib/pug-ruby.rb +46 -5
- data/lib/pug-ruby/compilation-essentials.rb +29 -0
- data/lib/pug-ruby/config.rb +11 -37
- data/lib/pug-ruby/errors/compilation-error.rb +14 -0
- data/lib/pug-ruby/errors/compiler-error.rb +13 -0
- data/lib/pug-ruby/shipped-compiler.rb +15 -0
- data/lib/pug-ruby/system-compiler.rb +15 -0
- data/lib/pug-ruby/version.rb +7 -0
- data/package.json +11 -0
- data/pug-ruby.gemspec +19 -12
- data/support/browserify-jade-runtime.js +19 -0
- data/support/browserify-jade.js +17 -0
- data/support/browserify-pug-runtime.js +19 -0
- data/support/browserify-pug.js +23 -0
- data/support/minify-jade.js +11 -0
- data/support/minify-pug.js +11 -0
- data/test/helper.rb +202 -0
- data/test/jade/includes/includes/footer.jade +1 -1
- data/test/manual.html +21 -0
- data/test/manual.rb +25 -0
- data/test/pug/includes/includes/footer.pug +1 -1
- data/test/pug/index.pug +3 -3
- data/test/test-jade.rb +3 -67
- data/test/test-pug.rb +3 -67
- data/vendor/jade-1.0.0.min.js +1 -0
- data/vendor/jade-1.0.1.min.js +1 -0
- data/vendor/jade-1.0.2.min.js +1 -0
- data/vendor/jade-1.1.0.min.js +1 -0
- data/vendor/jade-1.1.1.min.js +1 -0
- data/vendor/jade-1.1.2.min.js +1 -0
- data/vendor/jade-1.1.3.min.js +1 -0
- data/vendor/jade-1.1.4.min.js +1 -0
- data/vendor/jade-1.1.5.min.js +1 -0
- data/vendor/jade-1.10.0.min.js +1 -0
- data/vendor/jade-1.11.0.min.js +1 -0
- data/vendor/jade-1.2.0.min.js +1 -0
- data/vendor/jade-1.3.0.min.js +1 -0
- data/vendor/jade-1.3.1.min.js +1 -0
- data/vendor/jade-1.4.0.min.js +1 -0
- data/vendor/jade-1.4.1.min.js +1 -0
- data/vendor/jade-1.4.2.min.js +1 -0
- data/vendor/jade-1.5.0.min.js +1 -0
- data/vendor/jade-1.6.0.min.js +1 -0
- data/vendor/jade-1.7.0.min.js +1 -0
- data/vendor/jade-1.8.0.min.js +1 -0
- data/vendor/jade-1.8.1.min.js +1 -0
- data/vendor/jade-1.8.2.min.js +1 -0
- data/vendor/jade-1.9.0.min.js +1 -0
- data/vendor/jade-1.9.1.min.js +1 -0
- data/vendor/jade-1.9.2.min.js +1 -0
- data/vendor/jade-runtime-1.0.0-license +22 -0
- data/vendor/jade-runtime-1.0.0.js +199 -0
- data/vendor/jade-runtime-1.0.1-license +22 -0
- data/vendor/jade-runtime-1.0.1.js +199 -0
- data/vendor/jade-runtime-1.0.2-license +22 -0
- data/vendor/jade-runtime-1.0.2.js +199 -0
- data/vendor/jade-runtime-1.1.0-license +22 -0
- data/vendor/jade-runtime-1.1.0.js +199 -0
- data/vendor/jade-runtime-1.1.1-license +22 -0
- data/vendor/jade-runtime-1.1.1.js +199 -0
- data/vendor/jade-runtime-1.1.2-license +22 -0
- data/vendor/jade-runtime-1.1.2.js +200 -0
- data/vendor/jade-runtime-1.1.3-license +22 -0
- data/vendor/jade-runtime-1.1.3.js +200 -0
- data/vendor/jade-runtime-1.1.4-license +22 -0
- data/vendor/jade-runtime-1.1.4.js +200 -0
- data/vendor/jade-runtime-1.1.5-license +22 -0
- data/vendor/jade-runtime-1.1.5.js +200 -0
- data/vendor/jade-runtime-1.10.0-license +22 -0
- data/vendor/jade-runtime-1.10.0.js +233 -0
- data/vendor/jade-runtime-1.11.0-license +22 -0
- data/vendor/jade-runtime-1.11.0.js +246 -0
- data/vendor/jade-runtime-1.2.0-license +22 -0
- data/vendor/jade-runtime-1.2.0.js +200 -0
- data/vendor/jade-runtime-1.3.0-license +22 -0
- data/vendor/jade-runtime-1.3.0.js +200 -0
- data/vendor/jade-runtime-1.3.1-license +22 -0
- data/vendor/jade-runtime-1.3.1.js +200 -0
- data/vendor/jade-runtime-1.4.0-license +22 -0
- data/vendor/jade-runtime-1.4.0.js +200 -0
- data/vendor/jade-runtime-1.4.1-license +22 -0
- data/vendor/jade-runtime-1.4.1.js +200 -0
- data/vendor/jade-runtime-1.4.2-license +22 -0
- data/vendor/jade-runtime-1.4.2.js +200 -0
- data/vendor/jade-runtime-1.5.0-license +22 -0
- data/vendor/jade-runtime-1.5.0.js +200 -0
- data/vendor/jade-runtime-1.6.0-license +22 -0
- data/vendor/jade-runtime-1.6.0.js +200 -0
- data/vendor/jade-runtime-1.7.0-license +22 -0
- data/vendor/jade-runtime-1.7.0.js +200 -0
- data/vendor/jade-runtime-1.8.0-license +22 -0
- data/vendor/jade-runtime-1.8.0.js +228 -0
- data/vendor/jade-runtime-1.8.1-license +22 -0
- data/vendor/jade-runtime-1.8.1.js +228 -0
- data/vendor/jade-runtime-1.8.2-license +22 -0
- data/vendor/jade-runtime-1.8.2.js +228 -0
- data/vendor/jade-runtime-1.9.0-license +22 -0
- data/vendor/jade-runtime-1.9.0.js +228 -0
- data/vendor/jade-runtime-1.9.1-license +22 -0
- data/vendor/jade-runtime-1.9.1.js +228 -0
- data/vendor/jade-runtime-1.9.2-license +22 -0
- data/vendor/jade-runtime-1.9.2.js +228 -0
- data/vendor/pug-2.0.0-beta.12-license +22 -0
- data/vendor/pug-2.0.0-beta.12.min.js +1 -0
- data/vendor/pug-2.0.0-beta1-license +22 -0
- data/vendor/pug-2.0.0-beta1.min.js +1 -0
- data/vendor/pug-2.0.0-beta10-license +22 -0
- data/vendor/pug-2.0.0-beta10.min.js +1 -0
- data/vendor/pug-2.0.0-beta11-license +22 -0
- data/vendor/pug-2.0.0-beta11.min.js +1 -0
- data/vendor/pug-2.0.0-beta2-license +22 -0
- data/vendor/pug-2.0.0-beta2.min.js +1 -0
- data/vendor/pug-2.0.0-beta3-license +22 -0
- data/vendor/pug-2.0.0-beta3.min.js +1 -0
- data/vendor/pug-2.0.0-beta4-license +22 -0
- data/vendor/pug-2.0.0-beta4.min.js +1 -0
- data/vendor/pug-2.0.0-beta5-license +22 -0
- data/vendor/pug-2.0.0-beta5.min.js +1 -0
- data/vendor/pug-2.0.0-beta6-license +22 -0
- data/vendor/pug-2.0.0-beta6.min.js +1 -0
- data/vendor/pug-2.0.0-beta7-license +22 -0
- data/vendor/pug-2.0.0-beta7.min.js +1 -0
- data/vendor/pug-2.0.0-beta8-license +22 -0
- data/vendor/pug-2.0.0-beta8.min.js +1 -0
- data/vendor/pug-2.0.0-beta9-license +22 -0
- data/vendor/pug-2.0.0-beta9.min.js +1 -0
- data/vendor/pug-2.0.0-rc.1-license +22 -0
- data/vendor/pug-2.0.0-rc.1.min.js +1 -0
- data/vendor/pug-2.0.0-rc.2-license +22 -0
- data/vendor/pug-2.0.0-rc.2.min.js +1 -0
- data/vendor/pug-2.0.0-rc.3-license +22 -0
- data/vendor/pug-2.0.0-rc.3.min.js +1 -0
- data/vendor/pug-runtime-2.0.0-license +19 -0
- data/vendor/pug-runtime-2.0.0.js +266 -0
- data/vendor/pug-runtime-2.0.1-license +19 -0
- data/vendor/pug-runtime-2.0.1.js +266 -0
- data/vendor/pug-runtime-2.0.2-license +19 -0
- data/vendor/pug-runtime-2.0.2.js +267 -0
- metadata +242 -13
- data/lib/jade-ruby/compile.rb +0 -79
- data/lib/pug-ruby/compile.rb +0 -88
data/Rakefile
CHANGED
@@ -1,12 +1,78 @@
|
|
1
|
-
# encoding:
|
1
|
+
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require
|
5
|
-
require 'bundler/gem_tasks'
|
4
|
+
require "rake/testtask"
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
ENV["TESTOPTS"] = "--verbose"
|
7
|
+
Rake::TestTask.new { |t| t.libs << "test" }
|
8
|
+
|
9
|
+
namespace "javascripts" do
|
10
|
+
task "build" do
|
11
|
+
require "json"
|
12
|
+
require "open3"
|
13
|
+
|
14
|
+
def run(*args)
|
15
|
+
puts(*args)
|
16
|
+
stdout, stderr, exit_status = Open3.capture3(*args)
|
17
|
+
raise stderr.strip.empty? ? stdout : stderr unless exit_status.success?
|
18
|
+
stdout
|
19
|
+
end
|
20
|
+
|
21
|
+
def load_all(url)
|
22
|
+
max = run("curl --head #{url}").match(/Link:[^\n\r]+/).to_s.scan(/page=(\d+)/).flatten.map(&:to_i).uniq.max || 1
|
23
|
+
(1..max).reduce([]) { |ary, p| ary + JSON.parse(run("curl #{url}?page=#{p}")) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def clone_repository(url, branch, dir)
|
27
|
+
run "[ -d #{dir} ] || git clone --single-branch --branch #{branch} --depth 1 --no-hardlinks #{url} #{dir}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def install_node_modules(dir)
|
31
|
+
run "[ -d #{dir} -a ! -d #{dir}/node_modules ] && cd #{dir} && npm install --only=production --ignore-scripts || true"
|
32
|
+
end
|
10
33
|
|
11
|
-
|
12
|
-
|
34
|
+
def build_template_compiler(engine, engine_dir, engine_version, output_file)
|
35
|
+
run "[ -f #{output_file} ] || (node support/browserify-#{engine}.js #{engine_dir} #{engine_version} #{output_file} &&
|
36
|
+
node support/minify-#{engine}.js #{output_file})"
|
37
|
+
end
|
38
|
+
|
39
|
+
def build_template_runtime(engine, engine_runtime_dir, engine_version, output_file)
|
40
|
+
run "[ -f #{output_file} ] || node support/browserify-#{engine}-runtime.js #{engine_runtime_dir} #{engine_version} #{output_file}"
|
41
|
+
end
|
42
|
+
|
43
|
+
def copy_license_file(engine, engine_dir, engine_version, output_file)
|
44
|
+
run "[ ! -f #{output_file} -a -f #{engine_dir}/LICENSE ] && cp #{engine_dir}/LICENSE #{output_file} || true"
|
45
|
+
end
|
46
|
+
|
47
|
+
tags = load_all("https://api.github.com/repos/pugjs/pug/releases").map { |x| x.fetch("tag_name") }
|
48
|
+
tags += load_all("https://api.github.com/repos/pugjs/pug/tags").map { |x| x.fetch("name") }
|
49
|
+
tags.uniq.each do |tag|
|
50
|
+
if tag.match?(/\A1/)
|
51
|
+
version = tag
|
52
|
+
clone_repository "https://github.com/pugjs/pug.git", tag, "tmp/jade-#{version}"
|
53
|
+
install_node_modules "tmp/jade-#{version}"
|
54
|
+
build_template_compiler :jade, "tmp/jade-#{version}", version, "vendor/jade-#{version}.min.js"
|
55
|
+
build_template_runtime :jade, "tmp/jade-#{version}", version, "vendor/jade-runtime-#{version}.js"
|
56
|
+
copy_license_file :jade, "tmp/jade-#{version}", version, "vendor/jade-runtime-#{version}-license"
|
57
|
+
|
58
|
+
elsif tag.match?(/\A(?:pug@|2)/) && !tag.match?(/alpha/)
|
59
|
+
version = tag.gsub(/\Apug@/, "")
|
60
|
+
clone_repository "https://github.com/pugjs/pug.git", tag, "tmp/pug-#{version}"
|
61
|
+
install_node_modules "tmp/pug-#{version}"
|
62
|
+
install_node_modules "tmp/pug-#{version}/packages/pug"
|
63
|
+
build_template_compiler :pug, "tmp/pug-#{version}", version, "vendor/pug-#{version}.min.js"
|
64
|
+
copy_license_file :pug, "tmp/pug-#{version}", version, "vendor/pug-#{version}-license"
|
65
|
+
copy_license_file :pug, "tmp/pug-#{version}/packages/pug", version, "vendor/pug-#{version}-license"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
tags = load_all("https://api.github.com/repos/pugjs/pug-runtime/tags").map { |x| x.fetch("name") }
|
70
|
+
tags.uniq.each do |tag|
|
71
|
+
next unless tag.match?(/\A2/)
|
72
|
+
version = tag
|
73
|
+
clone_repository "https://github.com/pugjs/pug-runtime.git", tag, "tmp/pug-runtime-#{version}"
|
74
|
+
build_template_runtime :pug, "tmp/pug-runtime-#{version}", version, "vendor/pug-runtime-#{version}.js"
|
75
|
+
copy_license_file :pug, "tmp/pug-runtime-#{version}", version, "vendor/pug-runtime-#{version}-license"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "memoist"
|
5
|
+
|
6
|
+
module JadePug
|
7
|
+
extend Memoist
|
8
|
+
|
9
|
+
#
|
10
|
+
# Compiles the template.
|
11
|
+
#
|
12
|
+
# @param source [String, #read]
|
13
|
+
# @param options [Hash]
|
14
|
+
# @return [String]
|
15
|
+
def compile(source, options = {})
|
16
|
+
compiler.compile(source, options)
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# Returns engine compiler for given version.
|
21
|
+
# Compilers are cached.
|
22
|
+
#
|
23
|
+
# @param wanted_version [String, :system]
|
24
|
+
# @return [JadePug::Compiler]
|
25
|
+
def compiler(wanted_version = version)
|
26
|
+
(@compilers ||= {})["#{name}-#{wanted_version}"] ||= begin
|
27
|
+
case wanted_version
|
28
|
+
when :system then self::SystemCompiler.new
|
29
|
+
else self::ShippedCompiler.new(wanted_version)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Switches compiler version.
|
36
|
+
#
|
37
|
+
# - If you want to switch compiler to one of that shipped with gem simple pass version as a string.
|
38
|
+
# - If you want to switch compiler to system pass :system as a version.
|
39
|
+
#
|
40
|
+
# Pass block to temporarily switch the version. Without block the version is switched permanently.
|
41
|
+
#
|
42
|
+
# @param wanted_version [String, :system]
|
43
|
+
# @return [String, :system] Returns the version if no block has been given.
|
44
|
+
# @return Passes through the returned value from the block if it has been given.
|
45
|
+
def use(wanted_version)
|
46
|
+
previous_version = version
|
47
|
+
@version = wanted_version
|
48
|
+
did_switch_version(previous_version, wanted_version)
|
49
|
+
|
50
|
+
return @version unless block_given?
|
51
|
+
|
52
|
+
begin
|
53
|
+
yield
|
54
|
+
ensure
|
55
|
+
@version = previous_version
|
56
|
+
did_switch_version(wanted_version, previous_version)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
#
|
61
|
+
# Executed after compiler version switched.
|
62
|
+
# Outputs some useful information about version being used.
|
63
|
+
#
|
64
|
+
# @param version_from [String, :system]
|
65
|
+
# @param version_to [String, :system]
|
66
|
+
# @return [nil]
|
67
|
+
def did_switch_version(version_from, version_to)
|
68
|
+
if version_from != version_to
|
69
|
+
if Symbol === version_to
|
70
|
+
echo "Using #{version_to} #{name}."
|
71
|
+
else
|
72
|
+
echo "Using #{name} #{version_to}. NOTE: Advanced features like includes, extends and blocks will not work."
|
73
|
+
end
|
74
|
+
end
|
75
|
+
nil
|
76
|
+
end
|
77
|
+
|
78
|
+
#
|
79
|
+
# Returns the list of all available engine compiler versions shipped with gem.
|
80
|
+
#
|
81
|
+
# @return [Array<String>]
|
82
|
+
def versions
|
83
|
+
sort_versions(Dir[File.expand_path("../../../vendor/#{name.downcase}-*.js", __FILE__)].map do |path|
|
84
|
+
match = File.basename(path).match(/\A#{name.downcase}-(?!runtime-)(?<v>.+)\.min\.js\z/)
|
85
|
+
match[:v] if match
|
86
|
+
end.compact)
|
87
|
+
end
|
88
|
+
memoize :versions
|
89
|
+
|
90
|
+
#
|
91
|
+
# Returns the list of all available engine runtime versions shipped with gem.
|
92
|
+
#
|
93
|
+
# @return [Array<String>]
|
94
|
+
def runtime_versions
|
95
|
+
sort_versions(Dir[File.expand_path("../../../vendor/#{name.downcase}-*.js", __FILE__)].map do |path|
|
96
|
+
match = File.basename(path).match(/\A#{name.downcase}-runtime-(?<v>.+)\.js\z/)
|
97
|
+
match[:v] if match
|
98
|
+
end.compact)
|
99
|
+
end
|
100
|
+
memoize :runtime_versions
|
101
|
+
|
102
|
+
#
|
103
|
+
# Returns version for system-wide installed engine compiler.
|
104
|
+
#
|
105
|
+
# @return [String]
|
106
|
+
def system_version
|
107
|
+
compiler(:system).version
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# Returns config object for engine.
|
112
|
+
# Executed only once per engine (return value is memoized).
|
113
|
+
#
|
114
|
+
# @return [JadePug::Config]
|
115
|
+
def config
|
116
|
+
self::Config.new
|
117
|
+
end
|
118
|
+
memoize :config
|
119
|
+
|
120
|
+
#
|
121
|
+
# Prints messages.
|
122
|
+
# By default messages are sent to the STDOUT by using {Kernel#puts}.
|
123
|
+
#
|
124
|
+
# @param *messages [Array<Object>]
|
125
|
+
# @return [nil]
|
126
|
+
def echo(*messages)
|
127
|
+
puts(*messages) unless silence?
|
128
|
+
end
|
129
|
+
|
130
|
+
#
|
131
|
+
# Turns the effect of {#echo} on or off.
|
132
|
+
#
|
133
|
+
# @param silence [true, false]
|
134
|
+
# @return [true, false]
|
135
|
+
def silence=(silence)
|
136
|
+
@silence = !!silence
|
137
|
+
end
|
138
|
+
|
139
|
+
#
|
140
|
+
# Returns true if {#echo} should print messages.
|
141
|
+
# Otherwise returns false.
|
142
|
+
#
|
143
|
+
# @return [true, false]
|
144
|
+
def silence?
|
145
|
+
!!@silence
|
146
|
+
end
|
147
|
+
|
148
|
+
#
|
149
|
+
# Returns version of currently used engine compiler.
|
150
|
+
# If no version has been set returns :system.
|
151
|
+
#
|
152
|
+
# Only for internal usage.
|
153
|
+
#
|
154
|
+
# To get the actual version of engine compiler refer to {Compiler#version}.
|
155
|
+
#
|
156
|
+
# Jade.compiler.version => "1.11.0"
|
157
|
+
#
|
158
|
+
# @return [String, :system]
|
159
|
+
def version
|
160
|
+
if instance_variable_defined?(:@version)
|
161
|
+
@version
|
162
|
+
else
|
163
|
+
:system
|
164
|
+
end
|
165
|
+
end
|
166
|
+
private :version
|
167
|
+
|
168
|
+
#
|
169
|
+
# Sorts versions in ascending order.
|
170
|
+
# @see {https://stackoverflow.com/a/33290373/2369428}
|
171
|
+
#
|
172
|
+
# @param versions [Array<String>]
|
173
|
+
# @return [Array<String>]
|
174
|
+
def sort_versions(versions)
|
175
|
+
versions.sort_by { |v| Gem::Version.new(v) }
|
176
|
+
end
|
177
|
+
private :sort_versions
|
178
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "memoist"
|
5
|
+
require "method-not-implemented"
|
6
|
+
require "json"
|
7
|
+
|
8
|
+
module JadePug
|
9
|
+
#
|
10
|
+
# Abstraction layer for engine compiler.
|
11
|
+
#
|
12
|
+
class Compiler
|
13
|
+
extend Memoist
|
14
|
+
|
15
|
+
#
|
16
|
+
# Returns the engine module.
|
17
|
+
#
|
18
|
+
# Used in such cases:
|
19
|
+
# - used to compute the name for engine
|
20
|
+
# - used to refer to the error classes
|
21
|
+
#
|
22
|
+
# @return [Jade, Pug]
|
23
|
+
attr_reader :engine
|
24
|
+
|
25
|
+
#
|
26
|
+
# Returns the version of engine compiler.
|
27
|
+
#
|
28
|
+
# @return [String]
|
29
|
+
attr_reader :version
|
30
|
+
|
31
|
+
#
|
32
|
+
# @param engine [Jade, Pug]
|
33
|
+
# @param version [String]
|
34
|
+
def initialize(engine, version)
|
35
|
+
@engine = engine
|
36
|
+
@version = version
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# Compiles template.
|
41
|
+
#
|
42
|
+
# By default does nothing.
|
43
|
+
#
|
44
|
+
# @abstract Derived compilers must implement it.
|
45
|
+
# @param source [String, #read]
|
46
|
+
# The template source code or any object which responds to #read and returns string.
|
47
|
+
# @param options [Hash]
|
48
|
+
# @return [String]
|
49
|
+
def compile(source, options = {})
|
50
|
+
method_not_implemented
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# Returns true if this compiler is a system compiler.
|
55
|
+
# Otherwise returns false.
|
56
|
+
#
|
57
|
+
# @return [true, false]
|
58
|
+
def system?
|
59
|
+
SystemCompiler === self
|
60
|
+
end
|
61
|
+
|
62
|
+
#
|
63
|
+
# Returns true if this compiler is a shipped compiler.
|
64
|
+
# Otherwise returns false.
|
65
|
+
#
|
66
|
+
# @return [true, false]
|
67
|
+
def shipped?
|
68
|
+
ShippedCompiler === self
|
69
|
+
end
|
70
|
+
|
71
|
+
protected
|
72
|
+
|
73
|
+
#
|
74
|
+
# Reads the template source code.
|
75
|
+
# Responds for pre-processing source code.
|
76
|
+
# Actually, it just checks if source code responds to #read and if so
|
77
|
+
#
|
78
|
+
# @param source [String, #read]
|
79
|
+
# @return [String]
|
80
|
+
def prepare_source(source)
|
81
|
+
source.respond_to?(:read) ? source.read : source
|
82
|
+
end
|
83
|
+
|
84
|
+
#
|
85
|
+
# Responds for preparing compilation options.
|
86
|
+
#
|
87
|
+
# The next steps are executed:
|
88
|
+
# - is merges options into the engine config
|
89
|
+
# - it camelizes and symbolizes every option key
|
90
|
+
# - it removes nil values from the options
|
91
|
+
#
|
92
|
+
# @param options [Hash]
|
93
|
+
# @return [Hash]
|
94
|
+
def prepare_options(options)
|
95
|
+
options = engine.config.to_hash.merge(options)
|
96
|
+
options.keys.each { |k, v| options[k.to_s.gsub(/_([a-z])/) { $1.upcase }.to_sym] = options[k] }
|
97
|
+
options.delete_if { |k, v| v.nil? }
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
# Generates the JavaScript code that is the bridge
|
102
|
+
# from the gem to the template engine compiler.
|
103
|
+
#
|
104
|
+
# The code responds for:
|
105
|
+
# - invoking compiler
|
106
|
+
# - rendering template function with given locals
|
107
|
+
# - returning the result
|
108
|
+
#
|
109
|
+
# @param :method [String]
|
110
|
+
# The name of engine method to call.
|
111
|
+
# @param :arguments [Array<Object>]
|
112
|
+
# The array of arguments to be passed to the method.
|
113
|
+
# @param :locals [Hash]
|
114
|
+
# The hash of template local variables to be used to render template.
|
115
|
+
# @param :options [Hash]
|
116
|
+
# The hash of options passed to {#compile}.
|
117
|
+
# @return [String]
|
118
|
+
def compilation_snippet(args)
|
119
|
+
method = args.fetch(:method)
|
120
|
+
arguments = args.fetch(:arguments)
|
121
|
+
locals = args.fetch(:locals)
|
122
|
+
options = args.fetch(:options)
|
123
|
+
|
124
|
+
<<-JAVASCRIPT
|
125
|
+
(function() {
|
126
|
+
var engine = #{npm_package_require_snippet};
|
127
|
+
var template = engine[#{ JSON.dump(method) }].apply(engine, #{ JSON.dump(arguments) });
|
128
|
+
|
129
|
+
if (typeof template === 'function') {
|
130
|
+
template = template(#{ JSON.dump(locals) });
|
131
|
+
}
|
132
|
+
|
133
|
+
if (typeof console === 'object' && console !== null && typeof console.log === 'function') {
|
134
|
+
console.log(template);
|
135
|
+
}
|
136
|
+
|
137
|
+
return template;
|
138
|
+
})()
|
139
|
+
JAVASCRIPT
|
140
|
+
end
|
141
|
+
|
142
|
+
#
|
143
|
+
# Returns the JavaScript code used to access engine NPM module.
|
144
|
+
#
|
145
|
+
# @abstract Derived compilers must implement it.
|
146
|
+
# @return [String]
|
147
|
+
def npm_package_require_snippet
|
148
|
+
method_not_implemented
|
149
|
+
end
|
150
|
+
|
151
|
+
#
|
152
|
+
# Responds for post-processing compilation result.
|
153
|
+
#
|
154
|
+
# By default removes leading and trailing whitespace
|
155
|
+
# by calling {String#strip} and returns the result.
|
156
|
+
# Derived compilers may override it for it's own special behavior.
|
157
|
+
#
|
158
|
+
# @param source [String] The source code of template.
|
159
|
+
# @param result [String] The compiled code of template.
|
160
|
+
# @param options [Hash] The compilation options.
|
161
|
+
# @return [String]
|
162
|
+
def process_result(source, result, options)
|
163
|
+
result.strip
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "regexp-match-polyfill"
|
5
|
+
|
6
|
+
module JadePug
|
7
|
+
#
|
8
|
+
# Defines template engine compiler configuration.
|
9
|
+
#
|
10
|
+
class Config
|
11
|
+
#
|
12
|
+
# Allows to dynamically set config attributes.
|
13
|
+
#
|
14
|
+
def method_missing(name, *args, &block)
|
15
|
+
return super if block
|
16
|
+
|
17
|
+
case args.size
|
18
|
+
when 0
|
19
|
+
|
20
|
+
# config.client?
|
21
|
+
if name =~ /\A(\w+)\?\z/
|
22
|
+
!!(respond_to?($1) ? send($1) : instance_variable_get("@#{$1}"))
|
23
|
+
|
24
|
+
# config.client
|
25
|
+
elsif name =~ /\A(\w+)\z/
|
26
|
+
instance_variable_get("@#{$1}")
|
27
|
+
|
28
|
+
else
|
29
|
+
super
|
30
|
+
end
|
31
|
+
|
32
|
+
when 1
|
33
|
+
# config.client=
|
34
|
+
if name =~ /\A(\w+)=\z/
|
35
|
+
instance_variable_set("@#{$1}", args.first)
|
36
|
+
else
|
37
|
+
super
|
38
|
+
end
|
39
|
+
else
|
40
|
+
super
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def respond_to_missing?(name, include_all)
|
45
|
+
name.match?(/\A\w+[=?]?\z/)
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# Transforms config to the hash with all keys symbolized.
|
50
|
+
#
|
51
|
+
# @return [Hash]
|
52
|
+
def to_hash
|
53
|
+
instance_variables.each_with_object({}) do |var, h|
|
54
|
+
h[var[1..-1].to_sym] = instance_variable_get(var)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
alias to_h to_hash
|
59
|
+
end
|
60
|
+
end
|