jekyll-antex 0.6.1 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d7e55a185748b2e917234281bb7f2242ddc40a4d36a81da3c82c63e394fa1f5
4
- data.tar.gz: e5f4058b0c13c5a0397fb181a9c1fc6c266b9ea1957d3265a35dbbdb6592cee5
3
+ metadata.gz: 2b5addd8c7dd7101a0e9c741f1841a84c7073c742c7b4f2edbb0817b5a38d76b
4
+ data.tar.gz: bc9649c9722b99f7785a69ca95555be020876ab488c71778b33d15469c2fb3f2
5
5
  SHA512:
6
- metadata.gz: f7d87025ca79d0f2bd6aa8e2f0f66d8c7fb1f2d5683bc24f01c5fbace55b6bc069b07e15f93cb78fdd41b9abc8f4809f7b48d4f96f9f404c8eb23d7aa99882ee
7
- data.tar.gz: babab2523a37de3b562008177980c36f37e7c8588c2de46888d9b428683e3c608e8fe012cefc3aba0891b9fc411dc79bac2f6dec4e50fdd9ae4b2de6e0888ad6
6
+ metadata.gz: e9c47f9570936bffe9f87f6fb26c6944b84f9c8edacecc8e8a43b431fc4f42620f318c188c279cb5eace24d71a65a34f302b54bc2ae14d508ce737b2112570ac
7
+ data.tar.gz: 4718eae474054f548305faa64f60f47b7df9e7b5bff3eaa3097a5f666df6680ee512b5e3acf690a4104cbc75009279e3fd468be3d99344dfc1e475b909a5bb81
@@ -14,6 +14,8 @@ module Jekyll
14
14
  end
15
15
 
16
16
  class Block < Liquid::Block
17
+ HASH_ATTR_NAME = 'data-antex-job-hash'
18
+
17
19
  def initialize(tag, markup, tokens)
18
20
  @markup = markup
19
21
  super
@@ -28,23 +30,73 @@ module Jekyll
28
30
  end
29
31
 
30
32
  def self.render_html(job)
31
- img_tag = render_img_tag job
33
+ placeholder_tag = render_placeholder_tag job
32
34
  classes = job.options['classes'].join(' ')
33
- "<span class='#{classes}'>#{img_tag}</span>"
35
+ "<span class='#{classes}'>#{placeholder_tag}</span>"
36
+ end
37
+
38
+ def self.replace_placeholders(content)
39
+ doc = Nokogiri::HTML.parse(content)
40
+ placeholders = doc.xpath("//object[@#{HASH_ATTR_NAME}]")
41
+ placeholders.each(&method(:replace_placeholder))
42
+ doc.to_s
43
+ end
44
+
45
+ def self.replace_placeholder(placeholder)
46
+ job = Jekyll::Antex.jobs[placeholder[HASH_ATTR_NAME]]
47
+ if job.options['inlining']
48
+ replace_placeholder_with_svg(placeholder)
49
+ else
50
+ replace_placeholder_with_img(placeholder)
51
+ end
52
+ end
53
+
54
+ def self.replace_placeholder_with_img(placeholder)
55
+ job = Jekyll::Antex.jobs[placeholder[HASH_ATTR_NAME]]
56
+ style = render_style_attribute_value(job.set_box)
57
+ img = Nokogiri::XML::Node.new('img', placeholder.document)
58
+ src = Jekyll::Antex::Block.img_url(job)
59
+ img.set_attribute('src', src)
60
+ img.set_attribute('style', style)
61
+ placeholder.add_next_sibling(img)
62
+ placeholder.remove()
63
+ end
64
+
65
+ def self.replace_placeholder_with_svg(placeholder)
66
+ job = Jekyll::Antex.jobs[placeholder[HASH_ATTR_NAME]]
67
+ style = render_style_attribute_value(job.set_box)
68
+ path = File.read(job.files['svg'])
69
+ svg = Nokogiri::XML(path).at_css('svg')
70
+ prefix_svg_symbols_ids(svg, placeholder[HASH_ATTR_NAME])
71
+ svg.remove_attribute('width')
72
+ svg.remove_attribute('height')
73
+ svg.set_attribute('style', style)
74
+ placeholder.add_next_sibling(svg)
75
+ placeholder.remove()
76
+ end
77
+
78
+ def self.prefix_svg_symbols_ids(doc, pfx)
79
+ # NOTE: in theory String#insert is destructive but node attribute getter/setters must be doing something weird...
80
+ doc.css("defs > [id]").each do |node|
81
+ node[:id] = node[:id].insert(0, pfx + "-")
82
+ end
83
+ doc.css("use").each do |node|
84
+ node[:"xlink:href"] = node[:"xlink:href"].insert(1, pfx + "-")
85
+ end
34
86
  end
35
87
 
36
- def self.render_img_tag(job)
37
- "<img data-antex='#{job.hash}' src='#{img_url(job)}' />"
88
+ def self.render_placeholder_tag(job)
89
+ "<object #{HASH_ATTR_NAME}='#{job.hash}'></object>"
38
90
  end
39
91
 
40
- def self.render_style_attribute(job_set_box, precision: 3)
92
+ def self.render_style_attribute_value(job_set_box, precision: 3)
41
93
  <<~IMG_TAG.gsub(/(\s\s+)/m, ' ').strip!
42
- style='margin: #{job_set_box.mt.round(precision)}ex
43
- #{job_set_box.mr.round(precision)}ex
44
- #{job_set_box.mb.round(precision)}ex
45
- #{job_set_box.ml.round(precision)}ex;
46
- height: #{job_set_box.th.round(precision)}ex;
47
- width: #{job_set_box.wd.round(precision)}ex;'
94
+ margin: #{job_set_box.mt.round(precision)}ex
95
+ #{job_set_box.mr.round(precision)}ex
96
+ #{job_set_box.mb.round(precision)}ex
97
+ #{job_set_box.ml.round(precision)}ex;
98
+ height: #{job_set_box.th.round(precision)}ex;
99
+ width: #{job_set_box.wd.round(precision)}ex;
48
100
  IMG_TAG
49
101
  end
50
102
 
@@ -67,6 +119,7 @@ module Jekyll
67
119
  private
68
120
 
69
121
  def add_static_file(site, job)
122
+ return if job.options['inlining']
70
123
  site.static_files << Jekyll::StaticFile.new(
71
124
  site, *self.class.static_file_paths(job)
72
125
  )
@@ -142,3 +142,4 @@ aliases:
142
142
  /(?<code>\\[A-z]+)/x
143
143
  options:
144
144
  classes: [antex, inline]
145
+ inlining: false
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Antex
5
- VERSION = '0.6.1'
5
+ VERSION = '0.8.1'
6
6
  end
7
7
  end
data/lib/jekyll/antex.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'antex'
4
+ require 'nokogiri'
4
5
 
5
6
  require 'jekyll/antex/version'
6
7
  require 'jekyll/antex/dealiaser'
@@ -8,6 +9,17 @@ require 'jekyll/antex/block'
8
9
 
9
10
  module Jekyll
10
11
  module Antex
12
+ def self.gather_resources(site)
13
+ pages = site.pages
14
+ documents = site.collections.values.flat_map(&:docs)
15
+ [*pages, *documents].filter(&method(:allowed_resource?))
16
+ end
17
+
18
+ def self.allowed_resource?(resource)
19
+ # TODO: perhaps this should be configurable
20
+ File.fnmatch('*.{html,md}', resource.relative_path, File::FNM_EXTGLOB)
21
+ end
22
+
11
23
  def self.run_jobs
12
24
  jekyll_antex_jobs = Jekyll::Antex.jobs
13
25
  jobs_count = jekyll_antex_jobs.count
@@ -25,35 +37,26 @@ module Jekyll
25
37
  job.run!
26
38
  jekyll_logger_writer << ("\b" * progress.length)
27
39
  end
28
-
29
- def self.inject_style_attributes(output)
30
- output.gsub(/data-antex="(?<hash>.*?)"/) do
31
- job = Jekyll::Antex.jobs[Regexp.last_match[:hash]]
32
- Jekyll::Antex::Block.render_style_attribute(job.set_box)
33
- end
34
- end
35
40
  end
36
41
  end
37
42
 
38
43
  # NOTE: I'm conflicted, but regexp flags in yaml must be easy to use.
39
44
  SafeYAML::OPTIONS[:whitelisted_tags].push('!ruby/regexp')
40
45
 
41
- Jekyll::Hooks.register :site, :pre_render do
46
+ Jekyll::Hooks.register :site, :pre_render do |site|
42
47
  Jekyll::Antex.jobs = {}
43
- end
44
-
45
- # NOTE: we're not registering :posts since they are included in :documents.
46
- Jekyll::Hooks.register [:documents, :pages], :pre_render do |resource|
48
+ Jekyll::Antex.gather_resources(site).each do |resource|
47
49
  resource.content = Jekyll::Antex::Dealiaser.run(resource)
50
+ end
48
51
  end
49
52
 
50
53
  Liquid::Template.register_tag('antex', Jekyll::Antex::Block)
51
54
 
52
55
  Jekyll::Hooks.register :site, :post_render do |site|
53
56
  Jekyll::Antex.run_jobs
54
- [*site.pages, *site.documents].each do |resource|
57
+ Jekyll::Antex.gather_resources(site).each do |resource|
55
58
  # NOTE: skip unrendered resources e.g. when using --incremental
56
59
  next if resource.output.nil?
57
- resource.output = Jekyll::Antex.inject_style_attributes(resource.output)
60
+ resource.output = Jekyll::Antex::Block.replace_placeholders(resource.output)
58
61
  end
59
62
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-antex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paolo Brasolin
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-11 00:00:00.000000000 Z
11
+ date: 2022-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: antex
@@ -58,6 +58,20 @@ dependencies:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: 1.1.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: nokogiri
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1'
61
75
  - !ruby/object:Gem::Dependency
62
76
  name: byebug
63
77
  requirement: !ruby/object:Gem::Requirement
@@ -192,7 +206,7 @@ homepage: https://github.com/paolobrasolin/antex
192
206
  licenses:
193
207
  - MIT
194
208
  metadata: {}
195
- post_install_message:
209
+ post_install_message:
196
210
  rdoc_options: []
197
211
  require_paths:
198
212
  - lib
@@ -207,8 +221,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
207
221
  - !ruby/object:Gem::Version
208
222
  version: '0'
209
223
  requirements: []
210
- rubygems_version: 3.1.4
211
- signing_key:
224
+ rubygems_version: 3.2.3
225
+ signing_key:
212
226
  specification_version: 4
213
227
  summary: Universal TeX integration for Jekyll
214
228
  test_files: []