# frozen_string_literal: true module HighlightJs HIGHLIGHTJS_DIR = "#{Rails.root}/app/assets/javascripts/discourse/node_modules/@highlightjs/cdn-assets/" VERSION = 1 # bump to invalidate caches following core changes def self.languages langs = Dir.glob(HIGHLIGHTJS_DIR + "languages/*.js").map { |path| File.basename(path)[0..-8] } langs.sort end def self.bundle(langs) lang_js = langs.filter_map do |lang| File.read(HIGHLIGHTJS_DIR + "languages/#{lang}.min.js") rescue Errno::ENOENT # no file, don't care end <<~JS export default function registerLanguages(hljs) { #{lang_js.join("\n")} } JS end def self.cache @lang_string_cache ||= {} end def self.version(lang_string) cache_info = cache[RailsMultisite::ConnectionManagement.current_db] return cache_info[:digest] if cache_info&.[](:lang_string) == lang_string cache_info = { lang_string: lang_string, digest: Digest::SHA1.hexdigest( bundle(lang_string.split("|")) + "|#{VERSION}|#{GlobalSetting.asset_url_salt}", ), } cache[RailsMultisite::ConnectionManagement.current_db] = cache_info cache_info[:digest] end def self.path "/highlight-js/#{Discourse.current_hostname}/#{version SiteSetting.highlighted_languages}.js" end end