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.
Files changed (164) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.rubocop.yml +81 -0
  4. data/.travis.yml +17 -8
  5. data/.yardopts +4 -0
  6. data/Gemfile +3 -3
  7. data/Gemfile.lock +32 -0
  8. data/LICENSE +21 -0
  9. data/README.md +256 -24
  10. data/Rakefile +74 -8
  11. data/lib/jade-pug/base.rb +178 -0
  12. data/lib/jade-pug/compiler.rb +166 -0
  13. data/lib/jade-pug/config.rb +60 -0
  14. data/lib/jade-pug/errors/compilation-error.rb +14 -0
  15. data/lib/jade-pug/errors/compiler-error.rb +13 -0
  16. data/lib/jade-pug/shipped-compiler.rb +80 -0
  17. data/lib/jade-pug/system-compiler.rb +139 -0
  18. data/lib/jade-ruby/compilation-essentials.rb +24 -0
  19. data/lib/jade-ruby/config.rb +17 -44
  20. data/lib/jade-ruby/errors/compilation-error.rb +14 -0
  21. data/lib/jade-ruby/errors/compiler-error.rb +13 -0
  22. data/lib/jade-ruby/shipped-compiler.rb +15 -0
  23. data/lib/jade-ruby/system-compiler.rb +15 -0
  24. data/lib/pug-ruby.rb +46 -5
  25. data/lib/pug-ruby/compilation-essentials.rb +29 -0
  26. data/lib/pug-ruby/config.rb +11 -37
  27. data/lib/pug-ruby/errors/compilation-error.rb +14 -0
  28. data/lib/pug-ruby/errors/compiler-error.rb +13 -0
  29. data/lib/pug-ruby/shipped-compiler.rb +15 -0
  30. data/lib/pug-ruby/system-compiler.rb +15 -0
  31. data/lib/pug-ruby/version.rb +7 -0
  32. data/package.json +11 -0
  33. data/pug-ruby.gemspec +19 -12
  34. data/support/browserify-jade-runtime.js +19 -0
  35. data/support/browserify-jade.js +17 -0
  36. data/support/browserify-pug-runtime.js +19 -0
  37. data/support/browserify-pug.js +23 -0
  38. data/support/minify-jade.js +11 -0
  39. data/support/minify-pug.js +11 -0
  40. data/test/helper.rb +202 -0
  41. data/test/jade/includes/includes/footer.jade +1 -1
  42. data/test/manual.html +21 -0
  43. data/test/manual.rb +25 -0
  44. data/test/pug/includes/includes/footer.pug +1 -1
  45. data/test/pug/index.pug +3 -3
  46. data/test/test-jade.rb +3 -67
  47. data/test/test-pug.rb +3 -67
  48. data/vendor/jade-1.0.0.min.js +1 -0
  49. data/vendor/jade-1.0.1.min.js +1 -0
  50. data/vendor/jade-1.0.2.min.js +1 -0
  51. data/vendor/jade-1.1.0.min.js +1 -0
  52. data/vendor/jade-1.1.1.min.js +1 -0
  53. data/vendor/jade-1.1.2.min.js +1 -0
  54. data/vendor/jade-1.1.3.min.js +1 -0
  55. data/vendor/jade-1.1.4.min.js +1 -0
  56. data/vendor/jade-1.1.5.min.js +1 -0
  57. data/vendor/jade-1.10.0.min.js +1 -0
  58. data/vendor/jade-1.11.0.min.js +1 -0
  59. data/vendor/jade-1.2.0.min.js +1 -0
  60. data/vendor/jade-1.3.0.min.js +1 -0
  61. data/vendor/jade-1.3.1.min.js +1 -0
  62. data/vendor/jade-1.4.0.min.js +1 -0
  63. data/vendor/jade-1.4.1.min.js +1 -0
  64. data/vendor/jade-1.4.2.min.js +1 -0
  65. data/vendor/jade-1.5.0.min.js +1 -0
  66. data/vendor/jade-1.6.0.min.js +1 -0
  67. data/vendor/jade-1.7.0.min.js +1 -0
  68. data/vendor/jade-1.8.0.min.js +1 -0
  69. data/vendor/jade-1.8.1.min.js +1 -0
  70. data/vendor/jade-1.8.2.min.js +1 -0
  71. data/vendor/jade-1.9.0.min.js +1 -0
  72. data/vendor/jade-1.9.1.min.js +1 -0
  73. data/vendor/jade-1.9.2.min.js +1 -0
  74. data/vendor/jade-runtime-1.0.0-license +22 -0
  75. data/vendor/jade-runtime-1.0.0.js +199 -0
  76. data/vendor/jade-runtime-1.0.1-license +22 -0
  77. data/vendor/jade-runtime-1.0.1.js +199 -0
  78. data/vendor/jade-runtime-1.0.2-license +22 -0
  79. data/vendor/jade-runtime-1.0.2.js +199 -0
  80. data/vendor/jade-runtime-1.1.0-license +22 -0
  81. data/vendor/jade-runtime-1.1.0.js +199 -0
  82. data/vendor/jade-runtime-1.1.1-license +22 -0
  83. data/vendor/jade-runtime-1.1.1.js +199 -0
  84. data/vendor/jade-runtime-1.1.2-license +22 -0
  85. data/vendor/jade-runtime-1.1.2.js +200 -0
  86. data/vendor/jade-runtime-1.1.3-license +22 -0
  87. data/vendor/jade-runtime-1.1.3.js +200 -0
  88. data/vendor/jade-runtime-1.1.4-license +22 -0
  89. data/vendor/jade-runtime-1.1.4.js +200 -0
  90. data/vendor/jade-runtime-1.1.5-license +22 -0
  91. data/vendor/jade-runtime-1.1.5.js +200 -0
  92. data/vendor/jade-runtime-1.10.0-license +22 -0
  93. data/vendor/jade-runtime-1.10.0.js +233 -0
  94. data/vendor/jade-runtime-1.11.0-license +22 -0
  95. data/vendor/jade-runtime-1.11.0.js +246 -0
  96. data/vendor/jade-runtime-1.2.0-license +22 -0
  97. data/vendor/jade-runtime-1.2.0.js +200 -0
  98. data/vendor/jade-runtime-1.3.0-license +22 -0
  99. data/vendor/jade-runtime-1.3.0.js +200 -0
  100. data/vendor/jade-runtime-1.3.1-license +22 -0
  101. data/vendor/jade-runtime-1.3.1.js +200 -0
  102. data/vendor/jade-runtime-1.4.0-license +22 -0
  103. data/vendor/jade-runtime-1.4.0.js +200 -0
  104. data/vendor/jade-runtime-1.4.1-license +22 -0
  105. data/vendor/jade-runtime-1.4.1.js +200 -0
  106. data/vendor/jade-runtime-1.4.2-license +22 -0
  107. data/vendor/jade-runtime-1.4.2.js +200 -0
  108. data/vendor/jade-runtime-1.5.0-license +22 -0
  109. data/vendor/jade-runtime-1.5.0.js +200 -0
  110. data/vendor/jade-runtime-1.6.0-license +22 -0
  111. data/vendor/jade-runtime-1.6.0.js +200 -0
  112. data/vendor/jade-runtime-1.7.0-license +22 -0
  113. data/vendor/jade-runtime-1.7.0.js +200 -0
  114. data/vendor/jade-runtime-1.8.0-license +22 -0
  115. data/vendor/jade-runtime-1.8.0.js +228 -0
  116. data/vendor/jade-runtime-1.8.1-license +22 -0
  117. data/vendor/jade-runtime-1.8.1.js +228 -0
  118. data/vendor/jade-runtime-1.8.2-license +22 -0
  119. data/vendor/jade-runtime-1.8.2.js +228 -0
  120. data/vendor/jade-runtime-1.9.0-license +22 -0
  121. data/vendor/jade-runtime-1.9.0.js +228 -0
  122. data/vendor/jade-runtime-1.9.1-license +22 -0
  123. data/vendor/jade-runtime-1.9.1.js +228 -0
  124. data/vendor/jade-runtime-1.9.2-license +22 -0
  125. data/vendor/jade-runtime-1.9.2.js +228 -0
  126. data/vendor/pug-2.0.0-beta.12-license +22 -0
  127. data/vendor/pug-2.0.0-beta.12.min.js +1 -0
  128. data/vendor/pug-2.0.0-beta1-license +22 -0
  129. data/vendor/pug-2.0.0-beta1.min.js +1 -0
  130. data/vendor/pug-2.0.0-beta10-license +22 -0
  131. data/vendor/pug-2.0.0-beta10.min.js +1 -0
  132. data/vendor/pug-2.0.0-beta11-license +22 -0
  133. data/vendor/pug-2.0.0-beta11.min.js +1 -0
  134. data/vendor/pug-2.0.0-beta2-license +22 -0
  135. data/vendor/pug-2.0.0-beta2.min.js +1 -0
  136. data/vendor/pug-2.0.0-beta3-license +22 -0
  137. data/vendor/pug-2.0.0-beta3.min.js +1 -0
  138. data/vendor/pug-2.0.0-beta4-license +22 -0
  139. data/vendor/pug-2.0.0-beta4.min.js +1 -0
  140. data/vendor/pug-2.0.0-beta5-license +22 -0
  141. data/vendor/pug-2.0.0-beta5.min.js +1 -0
  142. data/vendor/pug-2.0.0-beta6-license +22 -0
  143. data/vendor/pug-2.0.0-beta6.min.js +1 -0
  144. data/vendor/pug-2.0.0-beta7-license +22 -0
  145. data/vendor/pug-2.0.0-beta7.min.js +1 -0
  146. data/vendor/pug-2.0.0-beta8-license +22 -0
  147. data/vendor/pug-2.0.0-beta8.min.js +1 -0
  148. data/vendor/pug-2.0.0-beta9-license +22 -0
  149. data/vendor/pug-2.0.0-beta9.min.js +1 -0
  150. data/vendor/pug-2.0.0-rc.1-license +22 -0
  151. data/vendor/pug-2.0.0-rc.1.min.js +1 -0
  152. data/vendor/pug-2.0.0-rc.2-license +22 -0
  153. data/vendor/pug-2.0.0-rc.2.min.js +1 -0
  154. data/vendor/pug-2.0.0-rc.3-license +22 -0
  155. data/vendor/pug-2.0.0-rc.3.min.js +1 -0
  156. data/vendor/pug-runtime-2.0.0-license +19 -0
  157. data/vendor/pug-runtime-2.0.0.js +266 -0
  158. data/vendor/pug-runtime-2.0.1-license +19 -0
  159. data/vendor/pug-runtime-2.0.1.js +266 -0
  160. data/vendor/pug-runtime-2.0.2-license +19 -0
  161. data/vendor/pug-runtime-2.0.2.js +267 -0
  162. metadata +242 -13
  163. data/lib/jade-ruby/compile.rb +0 -79
  164. data/lib/pug-ruby/compile.rb +0 -88
data/Rakefile CHANGED
@@ -1,12 +1,78 @@
1
- # encoding: utf-8
1
+ # encoding: UTF-8
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'rake/testtask'
5
- require 'bundler/gem_tasks'
4
+ require "rake/testtask"
6
5
 
7
- Rake::TestTask.new do |t|
8
- t.libs << 'test'
9
- end
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
- desc 'Run test suite'
12
- task default: :test
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