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