pug-ruby 1.0.2 → 2.0.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|