class JekyllSvelteSlabs::Tag
Constants
- FULL_VALID_SYNTAX
- INVALID_SEQUENCES
- VALID_FILENAME_CHARS
- VALID_SYNTAX
- VARIABLE_SYNTAX
Public Class Methods
new(tag_name, markup, tokens)
click to toggle source
Calls superclass method
# File lib/jekyll-svelte-slabs.rb, line 22 def initialize(tag_name, markup, tokens) super markup = markup.strip matched = markup.match(VARIABLE_SYNTAX) if matched @file = matched["variable"].strip @params = matched["params"].strip else @file, @params = markup.split(%r!\s+!, 2) end validate_params if @params @tag_name = tag_name end
Public Instance Methods
blank?()
click to toggle source
# File lib/jekyll-svelte-slabs.rb, line 36 def blank? false end
clean_params(context, params)
click to toggle source
Remove a bind if specified, as well as any keys listed in the site config
# File lib/jekyll-svelte-slabs.rb, line 54 def clean_params(context, params) params.delete('bind') slab_config = context['site']['svelte_slabs'] return unless slab_config purge_keys = slab_config['remove_keys'] unless purge_keys.nil? purge_keys_from_hash(params, purge_keys) end end
parse_params(context)
click to toggle source
# File lib/jekyll-svelte-slabs.rb, line 66 def parse_params(context) params = {} @params.scan(VALID_SYNTAX) do |key, d_quoted, s_quoted, variable| value = if d_quoted d_quoted.include?('\\"') ? d_quoted.gsub('\\"', '"') : d_quoted elsif s_quoted s_quoted.include?("\\'") ? s_quoted.gsub("\\'", "'") : s_quoted elsif variable context[variable] end # Turn arrays of Documents into arrays of DocumentDrops # so that the to_json in render pulls the hash not the content if value.class == Array value = value.map {|v| v.class == Jekyll::Document ? v.to_liquid : v} end params[key] = value end params.each do |key, value| if key == 'bind' valueHash = {}.merge(value) params = valueHash.merge(params) next end end clean_params(context, params) params end
purge_keys_from_hash(params, keys)
click to toggle source
Iterate a hash (incl. arrays) to delete named keys
# File lib/jekyll-svelte-slabs.rb, line 41 def purge_keys_from_hash(params, keys) params.each do |k,v| value = v || k if value.is_a?(Hash) || value.is_a?(Array) purge_keys_from_hash(value, keys) else params.delete(k) if keys.include?(k) end end end
render(context)
click to toggle source
Calls superclass method
# File lib/jekyll-svelte-slabs.rb, line 131 def render(context) text = super # puts Base64.encode64(context[@data].to_json) # site = context.registers[:site] # puts site slab_config = context['site']['svelte_slabs'] || {} method = slab_config['method'] || "window" file = render_variable(context) || @file validate_file_name(file) svelte_data = @params ? parse_params(context).to_json : "{}" svelte_data = "\"#{Base64.strict_encode64(svelte_data)}\"" if method == "window_b" svelte_data = "`#{svelte_data.gsub("<", "&rawlt;").gsub("`", "\`")}`" if method == "window_e" endpoint = Digest::MD5.hexdigest(svelte_data) <<~MSG <script> window.svelteSlabs = window.svelteSlabs || {}; window.svelteSlabs["#{endpoint}"] = #{svelte_data}; </script> <div data-svelte-slab="#{file}" data-svelte-slab-props="#{method}:#{endpoint}"> #{text} </div> MSG end
render_variable(context)
click to toggle source
Render the variable if required
# File lib/jekyll-svelte-slabs.rb, line 126 def render_variable(context) Liquid::Template.parse(@file).render(context) if VARIABLE_SYNTAX.match?(@file) end
validate_file_name(file)
click to toggle source
# File lib/jekyll-svelte-slabs.rb, line 99 def validate_file_name(file) if INVALID_SEQUENCES.match?(file) || !VALID_FILENAME_CHARS.match?(file) raise ArgumentError, <<~MSG Invalid syntax for svelte tag. File contains invalid characters or sequences: #{file} Valid syntax: {% #{@tag_name} component-name param='value' param2='value' %} <p>HTML Content</p> {% end#{@tag_name} %} MSG end end
validate_params()
click to toggle source
# File lib/jekyll-svelte-slabs.rb, line 112 def validate_params unless FULL_VALID_SYNTAX.match?(@params) raise ArgumentError, <<~MSG Invalid syntax for svelte tag: #{@params} Valid syntax: {% #{@tag_name} component-name param='value' param2='value' %} <p>HTML Content</p> {% end#{@tag_name} %} MSG end end