jekyll-gfm-admonitions 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -30
  3. data/lib/jekyll-gfm-admonitions.rb +52 -37
  4. metadata +7 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 36fde0cfed94f6d07ba07bb23551ddfb045ba9a1d587811a78b6be9407bc4ad9
4
- data.tar.gz: efcf212c70ccffeb7f4d834445adec477d2c748e15e2408ea94782bbee70852d
3
+ metadata.gz: 6e430262ea2a0d62b88656fc9d61a244f4840e6ae0a67699440f64c129671c98
4
+ data.tar.gz: 580f689cdf7e6072108a039164198ef17dd32e160879d7fdfc0ffe7dcce24ac6
5
5
  SHA512:
6
- metadata.gz: 230a0a16955e61fd32809530db0ca343730d9ce366f89416696ca5d8f85843f824121bfa3ab816aa5c264b9761aff3b3d1eabfa72264154b748a5fdaf4121c2e
7
- data.tar.gz: 2c4b40928769e81341fc9961e0a8b8c6a55c02d492e1ac93d9db6ba38912a8ba09a0c0a3c16448bf69d292282b1ccf3a2a3e837bd80287db5fe25cdb34b4b2d4
6
+ metadata.gz: 27109d0a6495fbec17fd52b46872362a3fa056832e5faa16a8837b77c4f4596c0177a08c9f53e020312370046530d9afd7f80bdaa7315245c30b9235ffd59bbc
7
+ data.tar.gz: eae65a1558f810cdd52d8af2b5cc91d8acfc210ae6cf5380f9047766baa94aff5961c20084793c486cb612100b7bd4aa621e3024adfe48878404b737b1d5f115
data/README.md CHANGED
@@ -61,16 +61,9 @@ group :jekyll_plugins do
61
61
 
62
62
  # ... Add this line:
63
63
  gem "jekyll-gfm-admonitions"
64
- gem "jekyll-optional-front-matter"
65
64
  end
66
65
  ```
67
66
 
68
- > [!TIP]
69
- >
70
- > By installing `jekyll-optional-front-matter` alongside this package, you won't need to
71
- > add ([visible](https://github.com/github/markup/issues/994)) frontmatter headers to each
72
- > of your files.
73
-
74
67
  Then run:
75
68
 
76
69
  ```bash
@@ -84,7 +77,6 @@ Next, you need to enable the plugin in your Jekyll configuration file (`_config.
84
77
  ```yaml
85
78
  plugins:
86
79
  - jekyll-gfm-admonitions
87
- - jekyll-optional-front-matter
88
80
  ```
89
81
 
90
82
  Then, during `build`/`serve`, you should see logs similar to:
@@ -158,28 +150,6 @@ end
158
150
  gem 'jekyll-remote-theme'
159
151
  ```
160
152
 
161
- ### Add [front matter](https://jekyllrb.com/docs/front-matter/)
162
-
163
- This step is optional if you've added `jekyll-front-matter`. If you do not, any file
164
- without a front matter header will be ignored by Jekyll, and only partially included by
165
- the GitHub Pages plugin.
166
-
167
- Make sure that all your `.md` files begin with a valid front matter header:
168
-
169
- ```markdown
170
- ---
171
- ---
172
-
173
- Your markdown files should start like this.
174
- ```
175
-
176
- > [!IMPORTANT]
177
- >
178
- > Your root `README.md` front matter should contain the following `permalink` attribute:
179
- > ```yaml
180
- > permalink: /index.html
181
- > ```
182
-
183
153
  ## License
184
154
 
185
155
  This project is licensed under the MIT License. See the [LICENSE.txt](LICENSE.txt) file
@@ -23,60 +23,72 @@ module JekyllGFMAdmonitions
23
23
  # syntax with HTML markup that includes appropriate iconography and CSS styling.
24
24
  class GFMAdmonitionConverter < Jekyll::Generator
25
25
  safe true
26
- @@admonition_pages = []
26
+ priority :lowest
27
+ @admonition_pages = []
27
28
 
28
- def initialize(*args)
29
- super(*args)
30
- @converted = 0
29
+ def generate(site)
30
+ init_converter(site)
31
+ process_posts(site)
32
+ process_pages(site)
33
+ Jekyll.logger.info 'GFMA:', 'Converted adminitions in' \
34
+ " #{self.class.admonition_pages.length} file(s)."
31
35
  end
32
36
 
33
- def generate(site)
37
+ def init_converter(site)
34
38
  @markdown = site.converters.find { |c| c.is_a?(Jekyll::Converters::Markdown) }
35
- unless @markdown
36
- raise "Markdown converter not found. Please ensure that you have a markdown converter configured in your Jekyll site."
37
- end
39
+ return if @markdown
38
40
 
39
- # Process admonitions in posts
41
+ raise 'Markdown converter not found. Please ensure that you have a markdown' \
42
+ ' converter configured in your Jekyll site.'
43
+ end
44
+
45
+ def process_posts(site)
40
46
  site.posts.docs.each do |doc|
41
47
  Jekyll.logger.debug 'GFMA:', "Processing post '#{doc.path}' (#{doc.content.length} characters)."
42
- process(doc)
48
+ process_doc(doc)
43
49
  end
50
+ end
44
51
 
45
- # Process admonitions in pages
52
+ def process_pages(site)
46
53
  site.pages.each do |page|
47
- # Patch the root README for GitHub Pages builds
48
- if page.path == 'README.md' && page.dir == '/'
49
- Jekyll.logger.info 'GFMA:', "Patched /README.html to /index.html"
50
- page.instance_variable_set(:@url, '/index.html')
51
- end
52
54
  Jekyll.logger.debug 'GFMA:', "Processing page '#{page.path}' (#{page.content.length} characters)."
53
- process(page)
55
+ process_doc_content(page)
54
56
  end
55
-
56
- Jekyll.logger.info 'GFMA:', "Converted adminitions in #{@converted} file(s)."
57
57
  end
58
58
 
59
- def process(doc)
59
+ def process_doc_content(doc)
60
60
  original_content = doc.content.dup
61
- convert_admonitions(doc)
61
+ process_doc(doc)
62
62
 
63
63
  return unless doc.content != original_content
64
64
 
65
- @@admonition_pages << doc
66
- @converted += 1
65
+ # Store a reference to all the pages we modified, to inject the CSS post render
66
+ # (otherwise GitHub Pages sanitizes the CSS into plaintext)
67
+ self.class.admonition_pages << doc
67
68
  end
68
69
 
69
- def self.admonition_pages
70
- return @@admonition_pages
70
+ class << self
71
+ attr_reader :admonition_pages
71
72
  end
72
73
 
73
- def convert_admonitions(doc)
74
+ def process_doc(doc)
74
75
  code_blocks = []
75
- doc.content.gsub!(/```.*?```/m) do |match|
76
+ # Temporarily replace code blocks by a tag, so that we don't process any admonitions
77
+ # inside of code blocks.
78
+ doc.content.gsub!(/(?:^|\n)(?<!>)\s*```.*?```/m) do |match|
76
79
  code_blocks << match
77
80
  "```{{CODE_BLOCK_#{code_blocks.length - 1}}}```"
78
81
  end
79
82
 
83
+ convert_admonitions(doc)
84
+
85
+ # Put the code blocks back in place
86
+ doc.content.gsub!(/```\{\{CODE_BLOCK_(\d+)}}```/) do
87
+ code_blocks[::Regexp.last_match(1).to_i]
88
+ end
89
+ end
90
+
91
+ def convert_admonitions(doc)
80
92
  doc.content.gsub!(/>\s*\[!(IMPORTANT|NOTE|WARNING|TIP|CAUTION)\]\s*\n((?:>.*\n?)*)/) do
81
93
  type = ::Regexp.last_match(1).downcase
82
94
  title = type.capitalize
@@ -84,26 +96,29 @@ module JekyllGFMAdmonitions
84
96
  icon = Octicons::Octicon.new(ADMONITION_ICONS[type]).to_svg
85
97
  Jekyll.logger.debug 'GFMA:', "Converting #{type} admonition."
86
98
 
87
- "<div class='markdown-alert markdown-alert-#{type}'>
99
+ admonition_html(type, title, text, icon)
100
+ end
101
+ end
102
+
103
+ def admonition_html(type, title, text, icon)
104
+ "<div class='markdown-alert markdown-alert-#{type}'>
88
105
  <p class='markdown-alert-title'>#{icon} #{title}</p>
89
106
  <p>#{@markdown.convert(text)}</p>
90
107
  </div>\n\n"
91
- end
92
-
93
- doc.content.gsub!(/```\{\{CODE_BLOCK_(\d+)}}```/) do
94
- "```#{code_blocks[$1.to_i]}```"
95
- end
96
108
  end
97
109
  end
98
110
 
99
- Jekyll::Hooks.register :site, :post_render do |site|
100
- Jekyll.logger.info 'GFMA:', "Injecting admonition CSS in #{GFMAdmonitionConverter.admonition_pages.length} page(s)."
111
+ # Insert the minified CSS before the closing head tag of all pages we put admonitions on
112
+ Jekyll::Hooks.register :site, :post_render do
113
+ Jekyll.logger.info 'GFMA:', "Inserting admonition CSS in #{GFMAdmonitionConverter.admonition_pages.length} page(s)."
101
114
 
102
- for page in GFMAdmonitionConverter.admonition_pages do
115
+ GFMAdmonitionConverter.admonition_pages.each do |page|
103
116
  Jekyll.logger.debug 'GFMA:', "Appending admonition style to '#{page.path}'."
104
117
  css = File.read(File.expand_path('../assets/admonitions.css', __dir__))
105
118
 
106
- page.output += "<style>#{CSSminify.compress(css)}</style>"
119
+ page.output.gsub!(%r{<head>(.*?)</head>}m) do |match|
120
+ "#{match[0..-7]}<style>#{CSSminify.compress(css)}</style>#{match[-7..]}"
121
+ end
107
122
  end
108
123
  end
109
124
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-gfm-admonitions
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robin De Schepper
@@ -11,33 +11,33 @@ cert_chain: []
11
11
  date: 2024-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: jekyll
14
+ name: cssminify
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.0'
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '3.0'
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: cssminify
28
+ name: jekyll
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: '3.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.0'
40
+ version: '3.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: octicons
43
43
  requirement: !ruby/object:Gem::Requirement