Class: JekyllSupport::JekyllBlock

Inherits:
Liquid::Block
  • Object
show all
Includes:
JekyllSupportError, ToString
Defined in:
lib/block/jekyll_plugin_support_block.rb,
lib/jekyll_plugin_support.rb

Overview

Base class for Jekyll block tags

Direct Known Subclasses

JekyllBlockNoArgParsing

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:



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/block/jekyll_plugin_support_block.rb', line 23

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

  # Lookup variable names with values in markup in render because site and config are not available here
  @argument_string = markup # Replace 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, markup, @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/block/jekyll_plugin_support_block.rb', line 4

def argument_string
  @argument_string
end

#helperObject (readonly)

Returns the value of attribute helper.



4
5
6
# File 'lib/block/jekyll_plugin_support_block.rb', line 4

def helper
  @helper
end

#highlighter_prefixObject (readonly)

Returns the value of attribute highlighter_prefix.



4
5
6
# File 'lib/block/jekyll_plugin_support_block.rb', line 4

def highlighter_prefix
  @highlighter_prefix
end

#highlighter_suffixObject (readonly)

Returns the value of attribute highlighter_suffix.



4
5
6
# File 'lib/block/jekyll_plugin_support_block.rb', line 4

def highlighter_suffix
  @highlighter_suffix
end

#jekyll_versionObject (readonly)

Returns the value of attribute jekyll_version.



4
5
6
# File 'lib/block/jekyll_plugin_support_block.rb', line 4

def jekyll_version
  @jekyll_version
end

#line_numberObject (readonly)

Returns the value of attribute line_number.



4
5
6
# File 'lib/block/jekyll_plugin_support_block.rb', line 4

def line_number
  @line_number
end

#loggerObject (readonly)

Returns the value of attribute logger.



4
5
6
# File 'lib/block/jekyll_plugin_support_block.rb', line 4

def logger
  @logger
end

#pageObject (readonly)

Returns the value of attribute page.



4
5
6
# File 'lib/block/jekyll_plugin_support_block.rb', line 4

def page
  @page
end

#raw_contentObject (readonly)

Returns the value of attribute raw_content.



4
5
6
# File 'lib/block/jekyll_plugin_support_block.rb', line 4

def raw_content
  @raw_content
end

#siteObject (readonly)

Returns the value of attribute site.



4
5
6
# File 'lib/block/jekyll_plugin_support_block.rb', line 4

def site
  @site
end

#textObject (readonly)

Returns the value of attribute text.



4
5
6
# File 'lib/block/jekyll_plugin_support_block.rb', line 4

def text
  @text
end

Instance Method Details

#blank?Boolean

Liquid::Block subclasses do not render if there is no content within the tag This override fixes that

Returns:

  • (Boolean)


41
42
43
# File 'lib/block/jekyll_plugin_support_block.rb', line 41

def blank?
  false
end

#render(liquid_context) ⇒ String

Method prescribed by the Jekyll plugin lifecycle. Defines @config, @envs, @mode, @page and @site

Returns:

  • (String)


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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/block/jekyll_plugin_support_block.rb', line 48

def render(liquid_context) # rubocop: disable Metrics/AbcSize
  @helper.liquid_context = ::JekyllSupport.inject_config_vars liquid_context # modifies liquid_context
  text = super # Liquid variable values in content are looked up and substituted

  @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

  @attribution = @helper.parameter_specified?('attribution') || false unless @no_arg_parsing
  @logger.debug { "@keys_values='#{@keys_values}'" }

  # @argument_string = JekyllSupport.lookup_liquid_variables @logger, liquid_context, @argument_string # Is this redundant?
  # @argument_string.strip! # Is this redundant?
  # @helper.reinitialize @argument_string # Is this redundant?

  render_impl(text)
rescue StandardError => e
  e.shorten_backtrace
  @logger.error e.full_message
  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 { "While processing line #{@line_number} #{of_page} for #{tag_name} #{in_file_name}- #{e.message}" }
  binding.pry if @pry_on_standard_error # rubocop:disable Lint/Debugger
  raise e if @die_on_standard_error

  <<~END_MSG
    <div class='standard_error'>
      #{e.class} on line #{@line_number} of #{e.backtrace[0].split(':').first} by #{@tag_name}: #{e.message}
    </div>
  END_MSG
end

#render_impl(text) ⇒ String

Jekyll plugins should override this method, not render, so they 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

Returns:

  • (String)

    The result to be rendered to the invoking page



109
110
111
# File 'lib/block/jekyll_plugin_support_block.rb', line 109

def render_impl(text)
  text
end

#set_error_contextObject



113
114
115
116
117
118
119
120
121
# File 'lib/block/jekyll_plugin_support_block.rb', line 113

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