2018-11-26 16:49:57 -05:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module SvgSprite
|
|
|
|
SVG_ICONS ||=
|
|
|
|
Set.new(
|
|
|
|
%w[
|
|
|
|
adjust
|
2020-01-27 08:29:43 -05:00
|
|
|
address-book
|
2023-02-08 14:21:39 -05:00
|
|
|
align-left
|
2018-12-07 07:00:02 -05:00
|
|
|
ambulance
|
2018-11-26 16:49:57 -05:00
|
|
|
anchor
|
|
|
|
angle-double-down
|
|
|
|
angle-double-up
|
2019-02-19 07:56:01 -05:00
|
|
|
angle-double-right
|
|
|
|
angle-double-left
|
2018-11-26 16:49:57 -05:00
|
|
|
angle-down
|
|
|
|
angle-right
|
|
|
|
angle-up
|
|
|
|
archive
|
|
|
|
arrow-down
|
|
|
|
arrow-left
|
2023-12-17 20:48:25 -05:00
|
|
|
arrow-right
|
2019-01-24 06:25:37 -05:00
|
|
|
arrow-up
|
|
|
|
arrows-alt-h
|
|
|
|
arrows-alt-v
|
2018-11-26 16:49:57 -05:00
|
|
|
at
|
2019-08-29 11:03:43 -04:00
|
|
|
asterisk
|
2018-11-26 16:49:57 -05:00
|
|
|
backward
|
|
|
|
ban
|
|
|
|
bars
|
|
|
|
bed
|
2019-09-09 11:03:57 -04:00
|
|
|
bell
|
2018-11-26 16:49:57 -05:00
|
|
|
bell-slash
|
|
|
|
bold
|
|
|
|
book
|
2019-08-27 08:09:00 -04:00
|
|
|
book-reader
|
2018-11-26 16:49:57 -05:00
|
|
|
bookmark
|
2023-08-09 04:51:09 -04:00
|
|
|
bookmark-delete
|
2018-11-26 16:49:57 -05:00
|
|
|
briefcase
|
2023-02-08 14:21:39 -05:00
|
|
|
bullseye
|
2018-11-26 16:49:57 -05:00
|
|
|
calendar-alt
|
|
|
|
caret-down
|
|
|
|
caret-left
|
|
|
|
caret-right
|
|
|
|
caret-up
|
|
|
|
certificate
|
|
|
|
chart-bar
|
|
|
|
chart-pie
|
|
|
|
check
|
|
|
|
check-circle
|
|
|
|
check-square
|
2023-02-08 14:21:39 -05:00
|
|
|
chevron-circle-down
|
2018-11-26 16:49:57 -05:00
|
|
|
chevron-down
|
2019-04-10 12:23:18 -04:00
|
|
|
chevron-left
|
2018-11-26 16:49:57 -05:00
|
|
|
chevron-right
|
|
|
|
chevron-up
|
|
|
|
circle
|
2023-02-08 14:21:39 -05:00
|
|
|
cloud-upload-alt
|
2018-11-26 16:49:57 -05:00
|
|
|
code
|
|
|
|
cog
|
|
|
|
columns
|
|
|
|
comment
|
|
|
|
compress
|
|
|
|
copy
|
|
|
|
crosshairs
|
|
|
|
cube
|
|
|
|
desktop
|
2021-04-08 09:58:12 -04:00
|
|
|
discourse-amazon
|
2019-12-19 14:39:29 -05:00
|
|
|
discourse-bell-exclamation
|
|
|
|
discourse-bell-one
|
|
|
|
discourse-bell-slash
|
2021-04-08 09:58:12 -04:00
|
|
|
discourse-bookmark-clock
|
2018-12-03 22:29:20 -05:00
|
|
|
discourse-compress
|
2024-01-31 17:56:07 -05:00
|
|
|
discourse-dnd
|
2021-06-23 11:12:48 -04:00
|
|
|
discourse-emojis
|
2018-12-03 22:29:20 -05:00
|
|
|
discourse-expand
|
2022-09-02 07:49:49 -04:00
|
|
|
discourse-other-tab
|
2023-10-19 18:30:27 -04:00
|
|
|
discourse-sparkles
|
2023-05-16 05:48:01 -04:00
|
|
|
discourse-threads
|
2024-03-06 06:16:28 -05:00
|
|
|
discourse-sidebar
|
2024-03-20 19:25:14 -04:00
|
|
|
discourse-chevron-collapse
|
|
|
|
discourse-chevron-expand
|
2018-11-26 16:49:57 -05:00
|
|
|
download
|
|
|
|
ellipsis-h
|
|
|
|
ellipsis-v
|
|
|
|
envelope
|
|
|
|
envelope-square
|
|
|
|
exchange-alt
|
|
|
|
exclamation-circle
|
|
|
|
exclamation-triangle
|
|
|
|
external-link-alt
|
2023-06-08 15:49:18 -04:00
|
|
|
eye
|
2018-12-07 10:49:18 -05:00
|
|
|
fab-android
|
2019-01-24 06:25:37 -05:00
|
|
|
fab-apple
|
2019-05-30 09:29:43 -04:00
|
|
|
fab-chrome
|
2019-08-30 05:54:19 -04:00
|
|
|
fab-discord
|
2018-11-28 09:53:06 -05:00
|
|
|
fab-discourse
|
2018-11-26 16:49:57 -05:00
|
|
|
fab-facebook-square
|
2019-02-27 09:52:06 -05:00
|
|
|
fab-facebook
|
2018-11-26 16:49:57 -05:00
|
|
|
fab-github
|
|
|
|
fab-instagram
|
2024-04-19 06:47:30 -04:00
|
|
|
fab-linkedin-in
|
2018-11-26 16:49:57 -05:00
|
|
|
fab-linux
|
2024-03-25 20:30:27 -04:00
|
|
|
fab-threads
|
|
|
|
fab-threads-square
|
2019-01-24 06:25:37 -05:00
|
|
|
fab-twitter
|
2018-11-26 16:49:57 -05:00
|
|
|
fab-twitter-square
|
2021-04-08 09:58:12 -04:00
|
|
|
fab-wikipedia-w
|
2018-11-26 16:49:57 -05:00
|
|
|
fab-windows
|
|
|
|
far-bell
|
|
|
|
far-bell-slash
|
|
|
|
far-calendar-plus
|
|
|
|
far-chart-bar
|
|
|
|
far-check-square
|
|
|
|
far-circle
|
|
|
|
far-clipboard
|
|
|
|
far-clock
|
|
|
|
far-comment
|
2020-12-10 12:02:07 -05:00
|
|
|
far-comments
|
2019-01-10 14:26:53 -05:00
|
|
|
far-copyright
|
2018-11-26 16:49:57 -05:00
|
|
|
far-dot-circle
|
|
|
|
far-edit
|
|
|
|
far-envelope
|
|
|
|
far-eye
|
|
|
|
far-eye-slash
|
|
|
|
far-file-alt
|
|
|
|
far-frown
|
|
|
|
far-heart
|
|
|
|
far-image
|
|
|
|
far-list-alt
|
2020-07-16 19:26:17 -04:00
|
|
|
far-meh
|
2018-11-26 16:49:57 -05:00
|
|
|
far-moon
|
|
|
|
far-smile
|
|
|
|
far-square
|
2021-06-01 04:33:40 -04:00
|
|
|
far-star
|
2018-11-26 16:49:57 -05:00
|
|
|
far-sun
|
|
|
|
far-thumbs-down
|
|
|
|
far-thumbs-up
|
|
|
|
far-trash-alt
|
|
|
|
fast-backward
|
|
|
|
fast-forward
|
|
|
|
file
|
|
|
|
file-alt
|
|
|
|
filter
|
|
|
|
flag
|
|
|
|
folder
|
|
|
|
folder-open
|
|
|
|
forward
|
|
|
|
gavel
|
2022-12-15 12:12:53 -05:00
|
|
|
gift
|
2018-11-26 16:49:57 -05:00
|
|
|
globe
|
|
|
|
globe-americas
|
2023-02-08 14:21:39 -05:00
|
|
|
grip-lines
|
2018-11-26 16:49:57 -05:00
|
|
|
hand-point-right
|
2019-03-08 03:48:35 -05:00
|
|
|
hands-helping
|
2018-11-26 16:49:57 -05:00
|
|
|
heart
|
2020-11-12 08:11:03 -05:00
|
|
|
history
|
2018-11-26 16:49:57 -05:00
|
|
|
home
|
2020-10-30 10:22:56 -04:00
|
|
|
hourglass-start
|
2019-12-09 14:15:47 -05:00
|
|
|
id-card
|
2022-03-08 12:39:46 -05:00
|
|
|
image
|
2023-07-13 03:06:17 -04:00
|
|
|
images
|
2022-09-29 00:28:01 -04:00
|
|
|
inbox
|
2018-11-26 16:49:57 -05:00
|
|
|
info-circle
|
|
|
|
italic
|
|
|
|
key
|
2022-07-22 01:06:47 -04:00
|
|
|
keyboard
|
2024-04-18 07:01:48 -04:00
|
|
|
language
|
2021-09-16 15:15:00 -04:00
|
|
|
layer-group
|
2018-11-26 16:49:57 -05:00
|
|
|
link
|
|
|
|
list
|
|
|
|
list-ol
|
|
|
|
list-ul
|
|
|
|
lock
|
|
|
|
magic
|
2019-01-24 06:25:37 -05:00
|
|
|
map-marker-alt
|
2018-11-26 16:49:57 -05:00
|
|
|
microphone-slash
|
|
|
|
minus
|
|
|
|
minus-circle
|
|
|
|
mobile-alt
|
2020-12-18 10:03:51 -05:00
|
|
|
moon
|
2018-11-26 16:49:57 -05:00
|
|
|
paint-brush
|
2023-12-17 20:48:25 -05:00
|
|
|
palette
|
2018-11-26 16:49:57 -05:00
|
|
|
paper-plane
|
2021-04-28 10:48:00 -04:00
|
|
|
pause
|
2018-11-26 16:49:57 -05:00
|
|
|
pencil-alt
|
2018-12-07 07:00:02 -05:00
|
|
|
play
|
2018-11-26 16:49:57 -05:00
|
|
|
plug
|
|
|
|
plus
|
|
|
|
plus-circle
|
|
|
|
plus-square
|
|
|
|
power-off
|
2024-03-12 19:18:08 -04:00
|
|
|
project-diagram
|
2019-02-20 14:58:31 -05:00
|
|
|
puzzle-piece
|
2018-11-26 16:49:57 -05:00
|
|
|
question
|
|
|
|
question-circle
|
|
|
|
quote-left
|
|
|
|
quote-right
|
|
|
|
random
|
|
|
|
redo
|
|
|
|
reply
|
2024-04-18 07:01:48 -04:00
|
|
|
robot
|
2018-11-26 16:49:57 -05:00
|
|
|
rocket
|
|
|
|
search
|
2023-07-13 03:06:17 -04:00
|
|
|
search-plus
|
|
|
|
search-minus
|
2018-11-26 16:49:57 -05:00
|
|
|
share
|
|
|
|
shield-alt
|
2019-03-27 09:25:04 -04:00
|
|
|
sign-in-alt
|
2018-11-26 16:49:57 -05:00
|
|
|
sign-out-alt
|
2019-01-24 06:25:37 -05:00
|
|
|
signal
|
2021-10-06 11:42:52 -04:00
|
|
|
sliders-h
|
2022-08-16 21:40:43 -04:00
|
|
|
square-full
|
2020-06-10 12:11:49 -04:00
|
|
|
star
|
2018-11-26 16:49:57 -05:00
|
|
|
step-backward
|
|
|
|
step-forward
|
2019-09-09 11:03:57 -04:00
|
|
|
stream
|
2020-03-16 14:32:38 -04:00
|
|
|
sync-alt
|
2018-11-26 16:49:57 -05:00
|
|
|
sync
|
|
|
|
table
|
|
|
|
tag
|
2021-06-03 18:33:36 -04:00
|
|
|
tags
|
2018-11-26 16:49:57 -05:00
|
|
|
tasks
|
2023-06-07 14:15:57 -04:00
|
|
|
th
|
2018-11-26 16:49:57 -05:00
|
|
|
thermometer-three-quarters
|
|
|
|
thumbs-down
|
|
|
|
thumbs-up
|
|
|
|
thumbtack
|
|
|
|
times
|
|
|
|
times-circle
|
2020-12-31 09:39:06 -05:00
|
|
|
toggle-off
|
|
|
|
toggle-on
|
2018-11-26 16:49:57 -05:00
|
|
|
trash-alt
|
|
|
|
undo
|
|
|
|
unlink
|
|
|
|
unlock
|
|
|
|
unlock-alt
|
|
|
|
upload
|
|
|
|
user
|
2022-07-18 22:35:02 -04:00
|
|
|
user-cog
|
2019-04-19 03:18:01 -04:00
|
|
|
user-edit
|
2021-07-20 13:58:38 -04:00
|
|
|
user-friends
|
2018-11-26 16:49:57 -05:00
|
|
|
user-plus
|
|
|
|
user-secret
|
2019-04-23 03:37:33 -04:00
|
|
|
user-shield
|
2018-11-26 16:49:57 -05:00
|
|
|
user-times
|
|
|
|
users
|
2020-03-30 17:17:00 -04:00
|
|
|
wrench
|
2022-05-02 11:10:26 -04:00
|
|
|
spinner
|
|
|
|
tippy-rounded-arrow
|
2018-11-26 16:49:57 -05:00
|
|
|
],
|
|
|
|
)
|
2023-01-09 07:10:19 -05:00
|
|
|
|
2018-11-26 16:49:57 -05:00
|
|
|
FA_ICON_MAP = { "far fa-" => "far-", "fab fa-" => "fab-", "fas fa-" => "", "fa-" => "" }
|
|
|
|
|
2019-03-15 02:16:15 -04:00
|
|
|
CORE_SVG_SPRITES = Dir.glob("#{Rails.root}/vendor/assets/svg-icons/**/*.svg")
|
|
|
|
|
|
|
|
THEME_SPRITE_VAR_NAME = "icons-sprite"
|
|
|
|
|
2023-09-13 01:00:26 -04:00
|
|
|
MAX_THEME_SPRITE_SIZE = 1024.kilobytes
|
2023-09-01 13:22:58 -04:00
|
|
|
|
2021-06-03 04:14:56 -04:00
|
|
|
def self.preload
|
|
|
|
settings_icons
|
|
|
|
group_icons
|
|
|
|
badge_icons
|
|
|
|
end
|
|
|
|
|
2023-03-20 12:41:23 -04:00
|
|
|
def self.symbols_for(svg_filename, sprite, strict:)
|
|
|
|
if strict
|
|
|
|
Nokogiri.XML(sprite) { |config| config.options = Nokogiri::XML::ParseOptions::NOBLANKS }
|
|
|
|
else
|
|
|
|
Nokogiri.XML(sprite)
|
|
|
|
end.css("symbol")
|
|
|
|
.filter_map do |sym|
|
|
|
|
icon_id = prepare_symbol(sym, svg_filename)
|
|
|
|
if icon_id.present?
|
|
|
|
sym.attributes["id"].value = icon_id
|
|
|
|
sym.css("title").each(&:remove)
|
|
|
|
[icon_id, sym.to_xml]
|
2023-03-14 14:11:45 -04:00
|
|
|
end
|
|
|
|
end
|
2023-03-20 12:41:23 -04:00
|
|
|
.to_h
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.core_svgs
|
|
|
|
@core_svgs ||=
|
|
|
|
CORE_SVG_SPRITES.reduce({}) do |symbols, path|
|
|
|
|
symbols.merge!(symbols_for(File.basename(path, ".svg"), File.read(path), strict: true))
|
|
|
|
end
|
2023-03-14 14:11:45 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# Just used in tests
|
|
|
|
def self.clear_plugin_svg_sprite_cache!
|
2023-03-20 12:41:23 -04:00
|
|
|
@plugin_svgs = nil
|
2023-03-14 14:11:45 -04:00
|
|
|
end
|
2021-06-22 14:07:23 -04:00
|
|
|
|
2023-03-20 12:41:23 -04:00
|
|
|
def self.plugin_svgs
|
|
|
|
@plugin_svgs ||=
|
2023-03-14 14:11:45 -04:00
|
|
|
begin
|
|
|
|
plugin_paths = []
|
|
|
|
Discourse
|
|
|
|
.plugins
|
|
|
|
.map { |plugin| File.dirname(plugin.path) }
|
|
|
|
.each { |path| plugin_paths << "#{path}/svg-icons/*.svg" }
|
|
|
|
|
|
|
|
custom_sprite_paths = Dir.glob(plugin_paths)
|
2019-03-15 02:16:15 -04:00
|
|
|
|
2023-03-20 12:41:23 -04:00
|
|
|
custom_sprite_paths.reduce({}) do |symbols, path|
|
|
|
|
symbols.merge!(symbols_for(File.basename(path, ".svg"), File.read(path), strict: true))
|
2021-06-22 14:07:23 -04:00
|
|
|
end
|
2023-03-14 14:11:45 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-03-20 12:41:23 -04:00
|
|
|
def self.theme_svgs(theme_id)
|
2023-03-14 14:11:45 -04:00
|
|
|
if theme_id.present?
|
2023-09-01 13:22:58 -04:00
|
|
|
cache
|
|
|
|
.defer_get_set_bulk(
|
|
|
|
Theme.transform_ids(theme_id),
|
|
|
|
lambda { |theme_id| "theme_svg_sprites_#{theme_id}" },
|
|
|
|
) do |theme_ids|
|
|
|
|
theme_field_uploads =
|
|
|
|
ThemeField.where(
|
|
|
|
type_id: ThemeField.types[:theme_upload_var],
|
|
|
|
name: THEME_SPRITE_VAR_NAME,
|
|
|
|
theme_id: theme_ids,
|
|
|
|
).pluck(:upload_id)
|
2023-03-14 14:11:45 -04:00
|
|
|
|
2023-09-01 13:22:58 -04:00
|
|
|
theme_sprites =
|
|
|
|
ThemeSvgSprite.where(theme_id: theme_ids).pluck(:theme_id, :upload_id, :sprite)
|
|
|
|
missing_sprites = (theme_field_uploads - theme_sprites.map(&:second))
|
2023-03-14 14:11:45 -04:00
|
|
|
|
2023-09-01 13:22:58 -04:00
|
|
|
if missing_sprites.present?
|
2023-03-20 12:41:23 -04:00
|
|
|
Rails.logger.warn(
|
2023-09-01 13:22:58 -04:00
|
|
|
"Missing ThemeSvgSprites for theme #{theme_id}, uploads #{missing_sprites.join(", ")}",
|
2023-03-20 12:41:23 -04:00
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2023-09-01 13:22:58 -04:00
|
|
|
theme_sprites
|
|
|
|
.map do |(theme_id, upload_id, sprite)|
|
|
|
|
begin
|
|
|
|
[theme_id, symbols_for("theme_#{theme_id}_#{upload_id}.svg", sprite, strict: false)]
|
|
|
|
rescue => e
|
|
|
|
Rails.logger.warn(
|
|
|
|
"Bad XML in custom sprite in theme with ID=#{theme_id}. Error info: #{e.inspect}",
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
.compact
|
|
|
|
.to_h
|
|
|
|
.values_at(*theme_ids)
|
2023-03-14 14:11:45 -04:00
|
|
|
end
|
2023-09-01 13:22:58 -04:00
|
|
|
.values
|
|
|
|
.compact
|
|
|
|
.reduce({}) { |a, b| a.merge!(b) }
|
2023-03-14 14:11:45 -04:00
|
|
|
else
|
2023-03-20 12:41:23 -04:00
|
|
|
{}
|
2019-03-15 02:16:15 -04:00
|
|
|
end
|
|
|
|
end
|
2019-01-12 09:59:12 -05:00
|
|
|
|
2023-03-20 12:41:23 -04:00
|
|
|
def self.custom_svgs(theme_id)
|
|
|
|
plugin_svgs.merge(theme_svgs(theme_id))
|
2023-03-14 14:11:45 -04:00
|
|
|
end
|
|
|
|
|
2021-06-15 02:57:17 -04:00
|
|
|
def self.all_icons(theme_id = nil)
|
|
|
|
get_set_cache("icons_#{Theme.transform_ids(theme_id).join(",")}") do
|
2019-02-06 10:51:23 -05:00
|
|
|
Set
|
|
|
|
.new()
|
|
|
|
.merge(settings_icons)
|
|
|
|
.merge(plugin_icons)
|
|
|
|
.merge(badge_icons)
|
|
|
|
.merge(group_icons)
|
2021-06-15 02:57:17 -04:00
|
|
|
.merge(theme_icons(theme_id))
|
|
|
|
.merge(custom_icons(theme_id))
|
2019-02-06 10:51:23 -05:00
|
|
|
.delete_if { |i| i.blank? || i.include?("/") }
|
|
|
|
.map! { |i| process(i.dup) }
|
|
|
|
.merge(SVG_ICONS)
|
|
|
|
.sort
|
|
|
|
end
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|
|
|
|
|
2021-06-15 02:57:17 -04:00
|
|
|
def self.version(theme_id = nil)
|
|
|
|
get_set_cache("version_#{Theme.transform_ids(theme_id).join(",")}") do
|
|
|
|
Digest::SHA1.hexdigest(bundle(theme_id))
|
2019-02-06 10:51:23 -05:00
|
|
|
end
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|
|
|
|
|
2021-06-15 02:57:17 -04:00
|
|
|
def self.path(theme_id = nil)
|
|
|
|
"/svg-sprite/#{Discourse.current_hostname}/svg-#{theme_id}-#{version(theme_id)}.js"
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.expire_cache
|
2019-02-06 10:51:23 -05:00
|
|
|
cache&.clear
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|
|
|
|
|
2023-03-20 12:41:23 -04:00
|
|
|
def self.svgs_for(theme_id)
|
|
|
|
svgs = core_svgs
|
|
|
|
svgs = svgs.merge(custom_svgs(theme_id)) if theme_id.present?
|
|
|
|
svgs
|
2019-03-15 02:16:15 -04:00
|
|
|
end
|
|
|
|
|
2021-06-15 02:57:17 -04:00
|
|
|
def self.bundle(theme_id = nil)
|
|
|
|
icons = all_icons(theme_id)
|
2018-11-26 16:49:57 -05:00
|
|
|
|
|
|
|
svg_subset =
|
|
|
|
"" \
|
|
|
|
"<!--
|
2019-03-06 09:21:31 -05:00
|
|
|
Discourse SVG subset of Font Awesome Free by @fontawesome - https://fontawesome.com
|
|
|
|
License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
2018-11-26 16:49:57 -05:00
|
|
|
-->
|
|
|
|
<svg xmlns='http://www.w3.org/2000/svg' style='display: none;'>
|
2023-01-09 07:10:19 -05:00
|
|
|
" \
|
2018-11-26 16:49:57 -05:00
|
|
|
"".dup
|
|
|
|
|
2023-03-20 12:41:23 -04:00
|
|
|
svg_subset << core_svgs.slice(*icons).values.join
|
|
|
|
svg_subset << custom_svgs(theme_id).values.join
|
2018-11-26 16:49:57 -05:00
|
|
|
|
|
|
|
svg_subset << "</svg>"
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.search(searched_icon)
|
|
|
|
searched_icon = process(searched_icon.dup)
|
|
|
|
|
2023-03-20 12:41:23 -04:00
|
|
|
svgs_for(SiteSetting.default_theme_id)[searched_icon] || false
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|
|
|
|
|
2023-02-12 17:24:47 -05:00
|
|
|
def self.icon_picker_search(keyword, only_available = false)
|
|
|
|
icons = all_icons(SiteSetting.default_theme_id) if only_available
|
2020-02-04 18:41:10 -05:00
|
|
|
|
2023-03-20 12:41:23 -04:00
|
|
|
symbols = svgs_for(SiteSetting.default_theme_id)
|
|
|
|
symbols.slice!(*icons) if only_available
|
|
|
|
symbols.reject! { |icon_id, sym| !icon_id.include?(keyword) } unless keyword.empty?
|
|
|
|
symbols.sort_by(&:first).map { |icon_id, symbol| { id: icon_id, symbol: symbol } }
|
2020-02-04 18:41:10 -05:00
|
|
|
end
|
|
|
|
|
2019-08-08 05:44:04 -04:00
|
|
|
# For use in no_ember .html.erb layouts
|
|
|
|
def self.raw_svg(name)
|
|
|
|
get_set_cache("raw_svg_#{name}") do
|
|
|
|
symbol = search(name)
|
|
|
|
break "" unless symbol
|
|
|
|
symbol = Nokogiri.XML(symbol).children.first
|
|
|
|
symbol.name = "svg"
|
|
|
|
<<~HTML
|
|
|
|
<svg class="fa d-icon svg-icon svg-node" aria-hidden="true">#{symbol}</svg>
|
|
|
|
HTML
|
|
|
|
end.html_safe
|
|
|
|
end
|
|
|
|
|
2019-03-15 02:16:15 -04:00
|
|
|
def self.theme_sprite_variable_name
|
|
|
|
THEME_SPRITE_VAR_NAME
|
|
|
|
end
|
|
|
|
|
2021-06-22 14:07:23 -04:00
|
|
|
def self.prepare_symbol(symbol, svg_filename = nil)
|
2018-11-26 16:49:57 -05:00
|
|
|
icon_id = symbol.attr("id")
|
|
|
|
|
|
|
|
case svg_filename
|
|
|
|
when "regular"
|
|
|
|
icon_id = icon_id.prepend("far-")
|
|
|
|
when "brands"
|
|
|
|
icon_id = icon_id.prepend("fab-")
|
|
|
|
end
|
|
|
|
|
|
|
|
icon_id
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.settings_icons
|
2021-06-03 04:14:56 -04:00
|
|
|
get_set_cache("settings_icons") do
|
|
|
|
# includes svg_icon_subset and any settings containing _icon (incl. plugin settings)
|
|
|
|
site_setting_icons = []
|
2018-11-26 16:49:57 -05:00
|
|
|
|
2021-06-03 04:14:56 -04:00
|
|
|
SiteSetting.settings_hash.select do |key, value|
|
|
|
|
site_setting_icons |= value.split("|") if key.to_s.include?("_icon") && String === value
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|
|
|
|
|
2021-06-03 04:14:56 -04:00
|
|
|
site_setting_icons
|
|
|
|
end
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.plugin_icons
|
|
|
|
DiscoursePluginRegistry.svg_icons
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.badge_icons
|
2021-06-03 04:14:56 -04:00
|
|
|
get_set_cache("badge_icons") { Badge.pluck(:icon).uniq }
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.group_icons
|
2021-06-03 04:14:56 -04:00
|
|
|
get_set_cache("group_icons") { Group.pluck(:flair_icon).uniq }
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|
|
|
|
|
2021-06-15 02:57:17 -04:00
|
|
|
def self.theme_icons(theme_id)
|
|
|
|
return [] if theme_id.blank?
|
2021-06-01 02:57:24 -04:00
|
|
|
|
2018-11-26 16:49:57 -05:00
|
|
|
theme_icon_settings = []
|
2021-06-17 22:16:26 -04:00
|
|
|
theme_ids = Theme.transform_ids(theme_id)
|
2018-11-26 16:49:57 -05:00
|
|
|
|
2019-02-06 10:51:23 -05:00
|
|
|
# Need to load full records for default values
|
2021-06-17 22:16:26 -04:00
|
|
|
Theme
|
|
|
|
.where(id: theme_ids)
|
|
|
|
.each do |theme|
|
2022-04-06 17:58:10 -04:00
|
|
|
_settings =
|
|
|
|
theme.cached_settings.each do |key, value|
|
2018-11-29 19:11:32 -05:00
|
|
|
if key.to_s.include?("_icon") && String === value
|
2018-11-26 16:49:57 -05:00
|
|
|
theme_icon_settings |= value.split("|")
|
|
|
|
end
|
2023-01-09 07:10:19 -05:00
|
|
|
end
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|
|
|
|
|
2021-06-17 22:16:26 -04:00
|
|
|
theme_icon_settings |= ThemeModifierHelper.new(theme_ids: theme_ids).svg_icons
|
2020-03-11 09:30:45 -04:00
|
|
|
|
2018-11-26 16:49:57 -05:00
|
|
|
theme_icon_settings
|
|
|
|
end
|
|
|
|
|
2021-06-15 02:57:17 -04:00
|
|
|
def self.custom_icons(theme_id)
|
2019-03-15 02:16:15 -04:00
|
|
|
# Automatically register icons in sprites added via themes or plugins
|
2023-03-20 12:41:23 -04:00
|
|
|
custom_svgs(theme_id).keys
|
2019-03-15 02:16:15 -04:00
|
|
|
end
|
|
|
|
|
2018-11-26 16:49:57 -05:00
|
|
|
def self.process(icon_name)
|
2020-02-04 18:41:10 -05:00
|
|
|
icon_name = icon_name.strip
|
|
|
|
FA_ICON_MAP.each { |k, v| icon_name = icon_name.sub(k, v) }
|
2020-05-26 14:53:32 -04:00
|
|
|
icon_name
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|
2019-02-06 10:51:23 -05:00
|
|
|
|
2021-06-03 02:02:40 -04:00
|
|
|
def self.get_set_cache(key, &block)
|
|
|
|
cache.defer_get_set(key, &block)
|
2019-02-06 10:51:23 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.cache
|
|
|
|
@cache ||= DistributedCache.new("svg_sprite")
|
|
|
|
end
|
2018-11-26 16:49:57 -05:00
|
|
|
end
|