# frozen_string_literal: true # loaded really early module Plugin end class Plugin::Metadata OFFICIAL_PLUGINS ||= Set.new( %w[ discourse-adplugin discourse-affiliate discourse-ai discourse-akismet discourse-algolia discourse-apple-auth discourse-assign discourse-auto-deactivate discourse-automation discourse-bbcode discourse-bbcode-color discourse-bcc discourse-cakeday discourse-calendar discourse-categories-suppressed discourse-category-experts discourse-characters-required discourse-chat-integration discourse-code-review discourse-crowd discourse-data-explorer discourse-details discourse-docs discourse-encrypt discourse-follow discourse-fontawesome-pro discourse-footnote discourse-gamification discourse-github discourse-gradle-issue discourse-graphviz discourse-group-tracker discourse-invite-tokens discourse-lazy-videos discourse-local-dates discourse-login-with-amazon discourse-logster-rate-limit-checker discourse-logster-transporter discourse-lti discourse-math discourse-moderator-attention discourse-narrative-bot discourse-newsletter-integration discourse-no-bump discourse-oauth2-basic discourse-openid-connect discourse-patreon discourse-perspective-api discourse-linkedin-auth discourse-microsoft-auth discourse-policy discourse-post-voting discourse-presence discourse-prometheus discourse-prometheus-alert-receiver discourse-push-notifications discourse-reactions discourse-restricted-replies discourse-rss-polling discourse-salesforce discourse-saml discourse-saved-searches discourse-shared-edits discourse-signatures discourse-sitemap discourse-solved discourse-spoiler-alert discourse-staff-alias discourse-steam-login discourse-subscriptions discourse-teambuild discourse-templates discourse-tooltips discourse-topic-voting discourse-translator discourse-user-card-badges discourse-user-notes discourse-vk-auth discourse-whos-online discourse-yearly-review discourse-zendesk-plugin discourse-zoom docker_manager chat poll styleguide checklist ], ) FIELDS ||= %i[name about version authors contact_emails url required_version transpile_js] attr_accessor(*FIELDS) def self.parse(text) metadata = self.new text.each_line { |line| break unless metadata.parse_line(line) } metadata end def official? OFFICIAL_PLUGINS.include?(name) end def parse_line(line) line = line.strip unless line.empty? return false unless line[0] == "#" attribute, *description = line[1..-1].split(":") description = description.join(":") attribute = attribute.strip.gsub(/ /, "_").to_sym self.public_send("#{attribute}=", description.strip) if FIELDS.include?(attribute) end true end end