Class: JekyllSupport::JekyllTag

Inherits:
Liquid::Tag
  • Object
show all
Includes:
JekyllSupportError, ToString
Defined in:
lib/tag/jekyll_plugin_support_tag.rb,
lib/jekyll_plugin_support.rb

Overview

Base class for Jekyll tags

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ToString

#to_s

Methods included from JekyllSupportError

#exit_without_stack_trace, #format_error_message, #maybe_reraise_error, #remove_ansi_color, #warn_short_trace

Constructor Details

#initialize(tag_name, markup, parse_context) ⇒ void

Parameters:

  • tag_name (String)

    the name of the tag, which we usually know.

  • argument_string (String)

    the arguments passed to the tag, as a single string.

  • parse_context (Liquid::ParseContext)

    contains the following attributes: @depth might have the value 0 @error_mode might have the value :strict @line_number duplicates @ptions @locale duplicates @ptions @options is a hash with the following two keys that holds Liquid options:

    :locale is a Liquid::I18n object, used to display localized error messages on Liquid built-in tags and filters.
    :line_number is the line number containing the plugin invocation.
    See https://github.com/Shopify/liquid/wiki/Liquid-for-Programmers#create-your-own-tags
    

    @partial Boolean, unclear what this indicates @template_options Replicates @options @trim_whitespace might have the value false @warnings array

Raises:



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 24

def initialize(tag_name, markup, parse_context)
  super
  @tag_name = tag_name
  raise JekyllPluginSupportError, "markup is a #{markup.class} with value '#{markup}'." unless markup.instance_of? String

  # Vars in plugin parameters cannot be replaced yet
  @argument_string = markup.to_s # Lookup variable names with values in markup in render because site and config are not available here

  @logger = PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
  @logger.debug { "#{self.class}: respond_to?(:no_arg_parsing) #{respond_to?(:no_arg_parsing) ? 'yes' : 'no'}." }
  @helper = JekyllPluginHelper.new(tag_name, @argument_string, @logger, no_arg_parsing: respond_to?(:no_arg_parsing))

  @error_name = "#{tag_name.camelcase(:upper)}Error"
  ::JekyllSupport::CustomError.factory @error_name
end

Instance Attribute Details

#argument_stringObject (readonly)

Returns the value of attribute argument_string.



4
5
6
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 4

def argument_string
  @argument_string
end

#helperObject (readonly)

Returns the value of attribute helper.



4
5
6
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 4

def helper
  @helper
end

#highlighter_prefixObject (readonly)

Returns the value of attribute highlighter_prefix.



4
5
6
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 4

def highlighter_prefix
  @highlighter_prefix
end

#highlighter_suffixObject (readonly)

Returns the value of attribute highlighter_suffix.



4
5
6
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 4

def highlighter_suffix
  @highlighter_suffix
end

#jekyll_versionObject (readonly)

Returns the value of attribute jekyll_version.



4
5
6
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 4

def jekyll_version
  @jekyll_version
end

#line_numberObject (readonly)

Returns the value of attribute line_number.



4
5
6
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 4

def line_number
  @line_number
end

#loggerObject (readonly)

Returns the value of attribute logger.



4
5
6
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 4

def logger
  @logger
end

#pageObject (readonly)

Returns the value of attribute page.



4
5
6
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 4

def page
  @page
end

#raw_contentObject (readonly)

Returns the value of attribute raw_content.



4
5
6
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 4

def raw_content
  @raw_content
end

#siteObject (readonly)

Returns the value of attribute site.



4
5
6
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 4

def site
  @site
end

Instance Method Details

#render(liquid_context) ⇒ Object

Method prescribed by the Jekyll plugin lifecycle.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 41

def render(liquid_context)
  return if @helper.excerpt_caller

  @helper.liquid_context = JekyllSupport.inject_config_vars liquid_context # modifies liquid_context

  @envs      = liquid_context.environments.first
  @page      = liquid_context.registers[:page]
  @scopes    = liquid_context.scopes
  @site      = liquid_context.registers[:site]

  @config = @site.config
  @tag_config = @config[@tag_name]
  @jps = @config['jekyll_plugin_support']
  @pry_on_standard_error = @jps['pry_on_standard_error'] || false if @jps

  set_error_context

  # @envs.keys are :content, :highlighter_prefix, :highlighter_suffix, :jekyll, :layout, :page, :paginator, :site, :theme
  @highlighter_prefix = @envs[:highlighter_prefix]
  @highlighter_suffix = @envs[:highlighter_suffix]
  @jekyll_version = @envs[:jekyll]['version']
  @layout      = @envs[:layout]
  @paginator   = @envs[:paginator]
  @raw_content = @envs[:content]
  @theme       = @envs[:theme]

  env = @config['env']
  @mode = env&.key?('JEKYLL_ENV') ? env['JEKYLL_ENV'] : 'development'

  @argument_string = JekyllSupport.lookup_liquid_variables @logger, @helper.liquid_context, @argument_string.to_s.strip
  @helper.reinitialize @argument_string.to_s.strip

  render_impl
rescue StandardError => e
  e.shorten_backtrace
  file_name = e.backtrace[0]&.split(':')&.first
  in_file_name = "in '#{file_name}' " if file_name
  of_page = "of '#{@page['path']}'" if @page
  @logger.error { "#{e.class} on line #{@line_number} #{of_page} while processing #{tag_name} #{in_file_name}- #{e.message}" }
  binding.pry if @pry_on_standard_error && defined?(Pry) # rubocop:disable Lint/Debugger
  raise e if @die_on_standard_error

  <<~END_MSG
    <div class='standard_error'>
      #{e.class} on line #{@line_number} #{of_page} while processing #{tag_name} #{in_file_name} - #{JekyllPluginHelper.remove_html_tags e.message}
    </div>
  END_MSG
end

#render_implObject

Jekyll plugins must override this method, not render, so their plugin can be tested more easily The following variables are predefined:

@argument_string, @config, @envs, @helper, @highlighter_prefix, @highlighter_suffix, @layout, @logger, @mode, @page, @paginator, @raw_content, @site, @tag_name and @theme


93
94
95
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 93

def render_impl
  abort "#{self.class}.render_impl for tag #{@tag_name} must be overridden, but it was not."
end

#set_error_contextObject



97
98
99
100
101
102
103
104
105
# File 'lib/tag/jekyll_plugin_support_tag.rb', line 97

def set_error_context
  return unless Object.const_defined? @error_name

  error_class = Object.const_get @error_name
  error_class.class_variable_set(:@@argument_string, @argument_string)
  error_class.class_variable_set(:@@line_number, @line_number)
  error_class.class_variable_set(:@@path, @page['path'])
  error_class.class_variable_set(:@@tag_name, @tag_name)
end