increments/qiita-markdown

View on GitHub
lib/qiita/markdown/transformers/filter_script.rb

Summary

Maintainability
A
1 hr
Test Coverage
A
96%
module Qiita
  module Markdown
    module Transformers
      class FilterScript
        URL_WHITE_LIST = [
          Embed::CodePen::SCRIPT_URLS,
          Embed::Tweet::SCRIPT_URL,
          Embed::SpeekerDeck::SCRIPT_URLS,
          Embed::Docswell::SCRIPT_URLS,
        ].flatten.freeze

        HOST_WHITE_LIST = [
          Embed::Asciinema::SCRIPT_HOST,
        ].flatten.freeze

        def self.call(**args)
          new(**args).transform
        end

        def initialize(env)
          @env = env
        end

        def transform
          if name == "script"
            if URL_WHITE_LIST.include?(node["src"]) || HOST_WHITE_LIST.include?(host_of(node["src"]))
              node["async"] = "async" unless node.attributes.key?("async")
              node.children.unlink
            else
              node.unlink
            end
          end
        end

        private

        def name
          @env[:node_name]
        end

        def node
          @env[:node]
        end

        def host_of(url)
          if url
            scheme = URI.parse(url).scheme
            Addressable::URI.parse(url).host if %w[http https].include? scheme
          end
        rescue Addressable::URI::InvalidURIError, URI::InvalidURIError
          nil
        end
      end
    end
  end
end