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.
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