Class: ContentBlockTools::ContentBlockReference

Inherits:
Data
  • Object
show all
Defined in:
lib/content_block_tools/content_block_reference.rb

Overview

Defines a reference pointer for a Content Block

Constant Summary collapse

SUPPORTED_DOCUMENT_TYPES =

An array of the supported document types

%w[contact content_block_pension content_block_contact].freeze
UUID_REGEX =

The regex used to find UUIDs

/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
CONTENT_ID_ALIAS_REGEX =

The regex used to find content ID aliases

/[a-z0-9\-–—]+/
FIELD_REGEX =

The regex to find optional field names after the UUID, begins with ‘/’

/(\/[a-z0-9_\-–—\/]*)?/
EMBED_REGEX =

The regex used when scanning a document using find_all_in_document

/({{embed:(#{SUPPORTED_DOCUMENT_TYPES.join('|')}):(#{UUID_REGEX}|#{CONTENT_ID_ALIAS_REGEX})#{FIELD_REGEX}}})/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#document_typeString (readonly)

The document type of the content block - this will be used to work out which Presenter will be used to render the content block. All supported document_types are documented in SUPPORTED_DOCUMENT_TYPES

Examples:

content_block_reference.document_type #=> "content_block_pension"

Returns:

  • (String)

    the document type



29
30
31
32
33
34
35
36
37
38
39
40
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
# File 'lib/content_block_tools/content_block_reference.rb', line 29

class ContentBlockReference < Data
  # An array of the supported document types
  SUPPORTED_DOCUMENT_TYPES = %w[contact content_block_pension content_block_contact].freeze
  # The regex used to find UUIDs
  UUID_REGEX = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
  # The regex used to find content ID aliases
  CONTENT_ID_ALIAS_REGEX = /[a-z0-9\-–—]+/
  # The regex to find optional field names after the UUID, begins with '/'
  FIELD_REGEX = /(\/[a-z0-9_\-–—\/]*)?/
  # The regex used when scanning a document using {ContentBlockTools::ContentBlockReference.find_all_in_document}
  EMBED_REGEX = /({{embed:(#{SUPPORTED_DOCUMENT_TYPES.join('|')}):(#{UUID_REGEX}|#{CONTENT_ID_ALIAS_REGEX})#{FIELD_REGEX}}})/

  # Returns if the identifier is an alias
  #
  # @return Boolean
  def identifier_is_alias?
    !identifier.match?(UUID_REGEX)
  end

  class << self
    # Finds all content block references within a document, using `ContentBlockReference::EMBED_REGEX`
    # to scan through the document
    #
    # @return [Array<ContentBlockReference>] An array of content block references
    def find_all_in_document(document)
      document.scan(ContentBlockReference::EMBED_REGEX).map do |match|
        match = prepare_match(match)
        ContentBlockTools.logger.info("Found Content Block Reference: #{match}")
        ContentBlockReference.new(document_type: match[1], identifier: match[2], embed_code: match[0])
      end
    end

  private

    # This replaces an en / em dashes in content block references with double or triple dashes. This can occur
    # because Kramdown (the markdown parser that Govspeak is based on) replaces double dashes with en dashes and
    # triple dashes with em dashes
    def prepare_match(match)
      [
        match[0],
        match[1],
        replace_dashes(match[2]),
        match[3],
      ]
    end

    def replace_dashes(value)
      value&.gsub("", "--")
        &.gsub("", "---")
    end
  end
end

#embed_codeString (readonly)

The embed_code used for a block

Examples:

content_block_reference.embed_code #=> "{{embed:content_block_pension:2b92cade-549c-4449-9796-e7a3957f3a86}}"

Returns:

  • (String)


29
30
31
32
33
34
35
36
37
38
39
40
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
# File 'lib/content_block_tools/content_block_reference.rb', line 29

class ContentBlockReference < Data
  # An array of the supported document types
  SUPPORTED_DOCUMENT_TYPES = %w[contact content_block_pension content_block_contact].freeze
  # The regex used to find UUIDs
  UUID_REGEX = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
  # The regex used to find content ID aliases
  CONTENT_ID_ALIAS_REGEX = /[a-z0-9\-–—]+/
  # The regex to find optional field names after the UUID, begins with '/'
  FIELD_REGEX = /(\/[a-z0-9_\-–—\/]*)?/
  # The regex used when scanning a document using {ContentBlockTools::ContentBlockReference.find_all_in_document}
  EMBED_REGEX = /({{embed:(#{SUPPORTED_DOCUMENT_TYPES.join('|')}):(#{UUID_REGEX}|#{CONTENT_ID_ALIAS_REGEX})#{FIELD_REGEX}}})/

  # Returns if the identifier is an alias
  #
  # @return Boolean
  def identifier_is_alias?
    !identifier.match?(UUID_REGEX)
  end

  class << self
    # Finds all content block references within a document, using `ContentBlockReference::EMBED_REGEX`
    # to scan through the document
    #
    # @return [Array<ContentBlockReference>] An array of content block references
    def find_all_in_document(document)
      document.scan(ContentBlockReference::EMBED_REGEX).map do |match|
        match = prepare_match(match)
        ContentBlockTools.logger.info("Found Content Block Reference: #{match}")
        ContentBlockReference.new(document_type: match[1], identifier: match[2], embed_code: match[0])
      end
    end

  private

    # This replaces an en / em dashes in content block references with double or triple dashes. This can occur
    # because Kramdown (the markdown parser that Govspeak is based on) replaces double dashes with en dashes and
    # triple dashes with em dashes
    def prepare_match(match)
      [
        match[0],
        match[1],
        replace_dashes(match[2]),
        match[3],
      ]
    end

    def replace_dashes(value)
      value&.gsub("", "--")
        &.gsub("", "---")
    end
  end
end

#identifierString (readonly)

The identifier for a block - can be a UUID or a slug. The UUID will refer to the ‘content_id` of a block within Publishing API, while the slug will refer to a block’s Content ID alias.

Examples:

content_block_reference.identifier #=> "2b92cade-549c-4449-9796-e7a3957f3a86"
content_block_reference.identifier #=> "some-slug"

Returns:

  • (String)


29
30
31
32
33
34
35
36
37
38
39
40
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
# File 'lib/content_block_tools/content_block_reference.rb', line 29

class ContentBlockReference < Data
  # An array of the supported document types
  SUPPORTED_DOCUMENT_TYPES = %w[contact content_block_pension content_block_contact].freeze
  # The regex used to find UUIDs
  UUID_REGEX = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
  # The regex used to find content ID aliases
  CONTENT_ID_ALIAS_REGEX = /[a-z0-9\-–—]+/
  # The regex to find optional field names after the UUID, begins with '/'
  FIELD_REGEX = /(\/[a-z0-9_\-–—\/]*)?/
  # The regex used when scanning a document using {ContentBlockTools::ContentBlockReference.find_all_in_document}
  EMBED_REGEX = /({{embed:(#{SUPPORTED_DOCUMENT_TYPES.join('|')}):(#{UUID_REGEX}|#{CONTENT_ID_ALIAS_REGEX})#{FIELD_REGEX}}})/

  # Returns if the identifier is an alias
  #
  # @return Boolean
  def identifier_is_alias?
    !identifier.match?(UUID_REGEX)
  end

  class << self
    # Finds all content block references within a document, using `ContentBlockReference::EMBED_REGEX`
    # to scan through the document
    #
    # @return [Array<ContentBlockReference>] An array of content block references
    def find_all_in_document(document)
      document.scan(ContentBlockReference::EMBED_REGEX).map do |match|
        match = prepare_match(match)
        ContentBlockTools.logger.info("Found Content Block Reference: #{match}")
        ContentBlockReference.new(document_type: match[1], identifier: match[2], embed_code: match[0])
      end
    end

  private

    # This replaces an en / em dashes in content block references with double or triple dashes. This can occur
    # because Kramdown (the markdown parser that Govspeak is based on) replaces double dashes with en dashes and
    # triple dashes with em dashes
    def prepare_match(match)
      [
        match[0],
        match[1],
        replace_dashes(match[2]),
        match[3],
      ]
    end

    def replace_dashes(value)
      value&.gsub("", "--")
        &.gsub("", "---")
    end
  end
end

Class Method Details

.find_all_in_document(document) ⇒ Array<ContentBlockReference>

Finds all content block references within a document, using ‘ContentBlockReference::EMBED_REGEX` to scan through the document

Returns:



53
54
55
56
57
58
59
# File 'lib/content_block_tools/content_block_reference.rb', line 53

def find_all_in_document(document)
  document.scan(ContentBlockReference::EMBED_REGEX).map do |match|
    match = prepare_match(match)
    ContentBlockTools.logger.info("Found Content Block Reference: #{match}")
    ContentBlockReference.new(document_type: match[1], identifier: match[2], embed_code: match[0])
  end
end

Instance Method Details

#identifier_is_alias?Boolean

Returns if the identifier is an alias

Returns:

  • (Boolean)

    Boolean



44
45
46
# File 'lib/content_block_tools/content_block_reference.rb', line 44

def identifier_is_alias?
  !identifier.match?(UUID_REGEX)
end