1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
|
# frozen_string_literal: true
require_relative 'spec_helper'
describe 'Asciidoctor::PDF::Converter - Icon' do
it 'should display icon name if font-based icons are not enabled' do
pdf = to_pdf 'I icon:heart[] AsciiDoc.', analyze: true
(expect pdf.lines).to eql ['I [heart] AsciiDoc.']
end
it 'should read icon from image file when icons mode is image' do
(expect do
pdf = to_pdf <<~'EOS', analyze: :image
:icons:
:iconsdir: {imagesdir}
Look for files with the icon:logo[] icon.
EOS
images = pdf.images
(expect images).to have_size 1
(expect images[0][:width]).to eql 14.28
(expect images[0][:x]).to be > 48.24
end).to not_log_message
end
it 'should log warning if image file for icon not readable' do
input = <<~'EOS'
:icons:
:icontype: svg
I looked for icon:not-found[], but it was no where to be seen.
EOS
(expect do
pdf = to_pdf input, analyze: :image
images = pdf.images
(expect images).to be_empty
end).to log_message severity: :WARN, message: %(~image icon for 'not-found' not found or not readable: #{fixture_file 'icons/not-found.svg'})
(expect do
pdf = to_pdf input, analyze: true
lines = pdf.lines
(expect lines).to have_size 1
(expect lines[0]).to eql 'I looked for [not-found], but it was no where to be seen.'
end).to log_message
end
it 'should use icon name from specified icon set' do
pdf = to_pdf <<~'EOS', analyze: true
:icons: font
:icon-set: fas
A icon:wrench[] ought to fix it.
EOS
wink_text = pdf.find_text ?\uf0ad
(expect wink_text).to have_size 1
(expect wink_text[0][:font_name]).to eql 'FontAwesome5Free-Solid'
end
it 'should support icon set as suffix on icon name' do
pdf = to_pdf <<~'EOS', analyze: true
:icons: font
A icon:wrench@fas[] ought to fix it.
EOS
wink_text = pdf.find_text ?\uf0ad
(expect wink_text).to have_size 1
(expect wink_text[0][:font_name]).to eql 'FontAwesome5Free-Solid'
end
it 'should support icon set as prefix on icon name' do
pdf = to_pdf <<~'EOS', analyze: true
:icons: font
A icon:fas-wrench[] ought to fix it.
EOS
wink_text = pdf.find_text ?\uf0ad
(expect wink_text).to have_size 1
(expect wink_text[0][:font_name]).to eql 'FontAwesome5Free-Solid'
end
it 'should support icon set as prefix on icon name even if icon set is configured globally' do
pdf = to_pdf <<~'EOS', analyze: true
:icons: font
:icon-set: fab
A icon:fas-wrench[] ought to fix it.
EOS
wink_text = pdf.find_text ?\uf0ad
(expect wink_text).to have_size 1
(expect wink_text[0][:font_name]).to eql 'FontAwesome5Free-Solid'
end
it 'should not support icon set as prefix on icon name if explicit icon set is specified' do
(expect do
pdf = to_pdf <<~'EOS', analyze: true
:icons: font
A icon:fas-wrench[set=fab] ought to fix it.
EOS
wink_text = pdf.find_text ?\uf0ad
(expect wink_text).to be_empty
end).to log_message severity: :WARN, message: 'fas-wrench is not a valid icon name in the fab icon set'
end
it 'should apply larger font size to icon if size is lg' do
pdf = to_pdf <<~'EOS', analyze: true
:icons: font
If the icon:wrench[] doesn't do it, try a icon:wrench[lg] one.
EOS
wrench_texts = pdf.find_text ?\uf0ad
(expect wrench_texts).to have_size 2
(expect wrench_texts[0][:font_size]).to eql 10.5
(expect wrench_texts[0][:width]).to eql 10.5
(expect wrench_texts[1][:font_size].round 2).to eql 14.0
(expect wrench_texts[1][:width].round 2).to eql 14.0
end
it 'should apply specified custom font size to icon' do
pdf = to_pdf <<~'EOS', analyze: true
:icons: font
I icon:fas-heart[1.2x] AsciiDoc
EOS
heart_text = pdf.find_unique_text ?\uf004
(expect heart_text[:font_size]).to eql 12.6
end
it 'should use inherited size if font size is 1x' do
pdf = to_pdf <<~'EOS', analyze: true
:icons: font
I icon:fas-heart[1x] AsciiDoc
EOS
heart_text = pdf.find_unique_text ?\uf004
(expect heart_text[:font_size]).to eql pdf.text[0][:font_size]
end
it 'should reserve 1em of space for fw icon' do
pdf = to_pdf <<~'EOS', analyze: true
:icons: font
:icon-set: fas
*|* icon:arrows-alt-h[fw] *|* icon:arrows-alt-v[fw] *|*
EOS
guide_text = pdf.find_text '|', font_name: 'NotoSerif-Bold'
first_icon_gap = (guide_text[1][:x] - guide_text[0][:x]).round 2
second_icon_gap = (guide_text[2][:x] - guide_text[1][:x]).round 2
(expect first_icon_gap).to eql second_icon_gap
end
it 'should align fw icon in center of 1em space', visual: true do
to_file = to_pdf_file <<~'EOS', 'icon-fw.pdf'
:icons: font
:icon-set: fas
*|* icon:arrows-alt-h[fw] *|* icon:arrows-alt-v[fw] *|*
EOS
(expect to_file).to visually_match 'icon-fw.pdf'
end
it 'should use icon name as alt text and warn if icon name not found in icon set' do
[
['icon:no-such-icon[set=fas]', 'no such icon'],
['icon:no-such-icon@fas[]', 'no such icon@fas'],
['icon:fas-no-such-icon[]', 'fas no such icon'],
].each do |macro, alt|
(expect do
pdf = to_pdf <<~EOS, analyze: true
:icons: font
#{macro} will surely fail.
EOS
text = pdf.text
(expect text).to have_size 1
(expect text[0][:string]).to eql %([#{alt}] will surely fail.)
end).to log_message severity: :WARN, message: 'no-such-icon is not a valid icon name in the fas icon set'
end
end
it 'should remap legacy icon name if icon set is not specified and report remapping' do
(expect do
pdf = to_pdf <<~'EOS', analyze: true
:icons: font
Click the icon:hdd-o[] icon to see your files.
EOS
hdd_text = pdf.find_text ?\uf0a0
(expect hdd_text).to have_size 1
(expect hdd_text[0][:font_name]).to eql 'FontAwesome5Free-Regular'
end).to log_message severity: :INFO, message: 'hdd-o icon found in deprecated fa icon set; using hdd from far icon set instead', using_log_level: :INFO
end
it 'should resolve non-legacy icon name if icon set is not specified and report icon set in which it was found' do
(expect do
pdf = to_pdf <<~'EOS', analyze: true
:icons: font
Time to upgrade your icon set icon:smile-wink[]
EOS
wink_text = pdf.find_text ?\uf4da
(expect wink_text).to have_size 1
(expect wink_text[0][:font_name]).to eql 'FontAwesome5Free-Regular'
end).to log_message severity: :INFO, message: 'smile-wink icon not found in deprecated fa icon set; using match found in far icon set instead', using_log_level: :INFO
end
it 'should apply link to icon if link attribute is set and font-based icons are enabled' do
input = <<~'EOS'
:icons: font
gem icon:download[link=https://rubygems.org/downloads/asciidoctor-pdf-1.5.4.gem, window=_blank]
EOS
pdf = to_pdf input
annotations = get_annotations pdf, 1
(expect annotations).to have_size 1
link_annotation = annotations[0]
(expect link_annotation[:Subtype]).to be :Link
(expect link_annotation[:A][:URI]).to eql 'https://rubygems.org/downloads/asciidoctor-pdf-1.5.4.gem'
pdf = to_pdf input, analyze: true
link_text = (pdf.find_text ?\uf019)[0]
(expect link_text).not_to be_nil
(expect link_text[:font_name]).to eql 'FontAwesome5Free-Solid'
(expect link_text[:font_color]).to eql '428BCA'
link_text[:font_size] -= 1.5 # box appox is a little off
(expect link_annotation).to annotate link_text
end
it 'should apply link to alt text if link attribute is set and font-based icons are not enabled' do
input = <<~'EOS'
gem icon:download[link=https://rubygems.org/downloads/asciidoctor-pdf-1.5.4.gem, window=_blank]
EOS
pdf = to_pdf input
annotations = get_annotations pdf, 1
(expect annotations).to have_size 1
link_annotation = annotations[0]
(expect link_annotation[:Subtype]).to be :Link
(expect link_annotation[:A][:URI]).to eql 'https://rubygems.org/downloads/asciidoctor-pdf-1.5.4.gem'
pdf = to_pdf input, analyze: true
link_text = (pdf.find_text '[download]')[0]
(expect link_text).not_to be_nil
(expect link_text[:font_color]).to eql '428BCA'
(expect link_annotation).to annotate link_text
end
it 'should apply styles from role to icon' do
pdf = to_pdf <<~'EOS', pdf_theme: { role_red_font_color: 'FF0000' }, analyze: true
:icons: font
icon:heart[role=red]
EOS
heart_text = pdf.text[0]
(expect heart_text[:string]).to eql ?\uf004
(expect heart_text[:font_name]).to eql 'FontAwesome5Free-Regular'
(expect heart_text[:font_color]).to eql 'FF0000'
end
it 'should parse icon inside kbd macro' do
pdf = to_pdf <<~'EOS', analyze: true
:experimental:
:icons: font
:icon-set: fas
Press kbd:[Alt,icon:arrow-up[\]] to move the line up.
EOS
keyseq_text = pdf.text.find_all {|candidate| ['Alt', %(\u202f+\u202f), ?\uf062].include? candidate[:string] }
(expect keyseq_text.size).to be 3
(expect keyseq_text[0][:string]).to eql 'Alt'
(expect keyseq_text[0][:font_name]).to eql 'mplus1mn-regular'
(expect keyseq_text[1][:string]).to eql %(\u202f+\u202f)
(expect keyseq_text[2][:string]).to eql ?\uf062
(expect keyseq_text[2][:font_name]).to eql 'FontAwesome5Free-Solid'
end
end
|