Sha256: eb044e032914bf1693eeaca42bd7352b857b1524a754edeba1a5033ad4571f91

Contents?: true

Size: 1.67 KB

Versions: 17

Compression:

Stored size: 1.67 KB

Contents

# frozen_string_literal: true

module Decidim
  module ContentParsers
    # A parser that searches user mentions in content.
    #
    # A word starting with `@` will be considered as a possible mention if
    # they only contains letters, numbers or underscores.
    #
    # @see BaseParser Examples of how to use a content parser
    class UserParser < TagParser
      # Class used as a container for metadata
      #
      # @!attribute users
      #   @return [Array] an array of Decidim::User mentioned in content
      Metadata = Struct.new(:users)

      # Matches a nickname if contains letters, numbers or underscores.
      MENTION_REGEX = /\B@(\w*)\b/

      # (see BaseParser#metadata)
      def metadata
        Metadata.new(existing_mentionables)
      end

      private

      def tag_data_type
        "mention"
      end

      def replace_tags(text)
        text.gsub(MENTION_REGEX) do |match|
          mentionables[match[1..-1].downcase]&.to_global_id&.to_s || match
        end
      end

      def scan_tags(text)
        text.scan(MENTION_REGEX)
      end

      def mentionable_class
        Decidim::User
      end

      def mentionables
        @mentionables ||= existing_mentionables.index_by(&:nickname)
      end

      def existing_mentionables
        @existing_mentionables ||= mentionable_class.where(
          "decidim_organization_id = ? AND LOWER(nickname) IN (?)",
          current_organization.id,
          content_nicknames
        )
      end

      def content_nicknames
        @content_nicknames ||= content_tags.map(&:downcase)
      end

      def current_organization
        @current_organization ||= context[:current_organization]
      end
    end
  end
end

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
decidim-core-0.30.0.rc2 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.30.0.rc1 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.29.2 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.28.5 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.29.1 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.28.4 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.29.0 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.28.3 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.29.0.rc4 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.29.0.rc3 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.29.0.rc2 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.29.0.rc1 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.28.2 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.28.1 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.28.0 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.28.0.rc5 lib/decidim/content_parsers/user_parser.rb
decidim-core-0.28.0.rc4 lib/decidim/content_parsers/user_parser.rb