jekyll-documents 0.7.1 → 0.7.2

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: aa2578d6c2919197cbd6a80f56d4b93a55e3a41c6bc9801b6344094460a5e764
4
- data.tar.gz: 2905501bf1a5d4d7050852dbb7293d179cd9abd6a11218a7649f155ded19109e
3
+ metadata.gz: 884c3afc18e96312dcd25a2328f652ec8cb1417ad8ec26337b4aa4ee2f175517
4
+ data.tar.gz: 29e0d75b6b50c68acb124e0b31123cc85c3810789c39d562beb8da00c5c50a87
5
5
  SHA512:
6
- metadata.gz: 899348532a7c8df6f816ed8795070c63881999f7f01b060332ae80f4b14ff183864f5543a1b63b20b461a1650cef16642ab4739148e9af763c590f55b416d357
7
- data.tar.gz: e94844d7dd1614560fbbe0f8fe11d46a88f99e461aa778fc61cfc4765dfa26188d96986eebc46e693054ec3c6c4e3eb2a0661053c88278436cd1826000f3ed28
6
+ metadata.gz: c50ee45d94b33d62b344dadda31c9cf865d8d175de1b00e7c7f92aaeb046f0cef7fec3835de627e68ec0ce9849d925b8fbacb3012be5a5face435822c173b9c3
7
+ data.tar.gz: 3a28dee0ff0b8078cac42e4097676a991496e8510a38518bd7d6ea013275f2f9f804b15b5f4ab46e846f6ab2a5eaa8e72dfd4a535ed8a1b9c7cf338671a64019
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.7.2] - 2026-09-09
4
+
5
+ ### Fixed
6
+ - Replaced polynomial-time Liquid tag option regexes with a shared linear-time parser
7
+
3
8
  ## [0.7.1] - 2026-09-09
4
9
 
5
10
  ### Changed
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "strscan"
4
+
5
+ module Jekyll
6
+ module Documents
7
+ # Linear-time parser for Liquid tag markup key:value pairs.
8
+ # Replaces polynomial-redos-vulnerable regex scanning with
9
+ # anchored scans that advance through the input once.
10
+ module OptionsParser
11
+ module_function
12
+
13
+ def parse_options(markup)
14
+ scanner = StringScanner.new(markup.to_s)
15
+ options = {}
16
+
17
+ until scanner.eos?
18
+ scanner.skip(/\s+/)
19
+ break if scanner.eos?
20
+
21
+ key = scanner.scan(/\w+/)
22
+ unless key
23
+ scanner.getch
24
+ next
25
+ end
26
+
27
+ scanner.skip(/\s*/)
28
+ next unless scanner.scan(":")
29
+
30
+ scanner.skip(/\s*/)
31
+ value = if scanner.scan(/'([^']*)'/) || scanner.scan(/"([^"]*)"/)
32
+ scanner[1]
33
+ else
34
+ scanner.scan(/\S+/)
35
+ end
36
+ options[key] = value unless value.nil?
37
+ end
38
+
39
+ options
40
+ end
41
+ end
42
+ end
43
+ end
@@ -152,13 +152,7 @@ module Jekyll
152
152
  end
153
153
 
154
154
  def extract_options(text)
155
- options = {}
156
- text.to_s.scan(
157
- /(\w+)\s*:\s*(?:'([^']*)'|"([^"]*)"|([^\s]+))/
158
- ) do |key, single, double, bare|
159
- options[key] = single || double || bare
160
- end
161
- options
155
+ OptionsParser.parse_options(text)
162
156
  end
163
157
 
164
158
  def escape_html(value)
@@ -148,13 +148,7 @@ module Jekyll
148
148
  end
149
149
 
150
150
  def extract_options(text)
151
- options = {}
152
- text.to_s.scan(
153
- /(\w+)\s*:\s*(?:'([^']*)'|"([^"]*)"|([^\s]+))/
154
- ) do |key, single, double, bare|
155
- options[key] = single || double || bare
156
- end
157
- options
151
+ OptionsParser.parse_options(text)
158
152
  end
159
153
 
160
154
  def escape_html(value)
@@ -45,13 +45,7 @@ module Jekyll
45
45
 
46
46
  def parse_markup(markup)
47
47
  expression = markup.to_s.strip[/\A[^\s]+/]
48
- options = {}
49
- markup.to_s.scan(
50
- /(\w+)\s*:\s*(?:'([^']*)'|"([^"]*)"|([^\s]+))/
51
- ) do |key, single, double, bare|
52
- options[key] = single || double || bare
53
- end
54
- [expression, options]
48
+ [expression, OptionsParser.parse_options(markup)]
55
49
  end
56
50
 
57
51
  def escape_html(value)
@@ -46,19 +46,9 @@ module Jekyll
46
46
  })
47
47
  end
48
48
 
49
+ # supports: count:5 category:'referat'
49
50
  def parse_args(markup)
50
- # supports: count:5 category:'referat'
51
- args = {}
52
- # Safe: markup comes from Jekyll template authors (trusted), not end users
53
- # Runs only during static site generation, not on user requests
54
- markup.scan(/(\w+)\s*:\s*'([^']*)'|(\w+)\s*:\s*([^\s]+)/).each do |match|
55
- if match[0]
56
- args[match[0]] = match[1]
57
- else
58
- args[match[2]] = match[3]
59
- end
60
- end
61
- args
51
+ OptionsParser.parse_options(markup)
62
52
  end
63
53
  end
64
54
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Documents
5
- VERSION = "0.7.1"
5
+ VERSION = "0.7.2"
6
6
  end
7
7
  end
@@ -11,6 +11,7 @@ require_relative "jekyll/documents/text_extraction_manifest"
11
11
  require_relative "jekyll/documents/assets_generator"
12
12
  require_relative "jekyll/documents/json_index_generator"
13
13
  require_relative "jekyll/documents/layout_registrar"
14
+ require_relative "jekyll/documents/options_parser"
14
15
 
15
16
  # Liquid tag(s)
16
17
  require_relative "jekyll/documents/tags/latest_documents"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-documents
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Svend Gundestrup
@@ -154,6 +154,7 @@ files:
154
154
  - lib/jekyll/documents/generator.rb
155
155
  - lib/jekyll/documents/json_index_generator.rb
156
156
  - lib/jekyll/documents/layout_registrar.rb
157
+ - lib/jekyll/documents/options_parser.rb
157
158
  - lib/jekyll/documents/tags/doc_category.rb
158
159
  - lib/jekyll/documents/tags/doc_link.rb
159
160
  - lib/jekyll/documents/tags/document_icon.rb