jekyll-mathjax-csp 1.3.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -41
  3. data/bin/mathjaxify +157 -0
  4. data/lib/jekyll-mathjax-csp.rb +68 -79
  5. metadata +9 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dedff31478ba8e4a3d89caa8bd3072675854d5bffc3fc1790edb858989c43df0
4
- data.tar.gz: bc1fd6b656b99bdcbbda7fe8b4c50e91b5cb18844f1cd18956ed61d2a5c17c5a
3
+ metadata.gz: 3cfec3c03b281adbf01ba53747ec25305c97542f8ed28c19dc1274f081c400ed
4
+ data.tar.gz: 96cb8d4012725a10c8d0b5e90cad63c7d2f7930180587d98221e4fa8c4d43085
5
5
  SHA512:
6
- metadata.gz: ca949bdb1aace4ed3a54012802a0b4b860d319c7dc6bfc13a2b35a31fee0b876c25a7f95d62b1f0abdd23f8c2fafc0402e77f8f8d5b70cc66781289e42a0e6e9
7
- data.tar.gz: 4b36d5a66c71d7decfeeac1845a3745dfa1e3f15e38312f23c957b437f33a628247895a09a4e46e527c2bfac5627a49d3156635a7453b6e8ae45a4dc852f748a
6
+ metadata.gz: 9a77f77aba3d98d53a9742952d1df2403161ac5f77529577c283d878981fc173741fcf6c70657c2672b07b93d3ed251d1cd0699a96181cd82dad9959a518aa31
7
+ data.tar.gz: 6ae23704a48e987c4f55e5795e0d363f5a48d44f214f80be5b65811918f296bc2f20226ddb7be750078e0aae40167c6464a396dac4a8357a1509a2f9bebb47ac
data/README.md CHANGED
@@ -1,18 +1,18 @@
1
1
  # jekyll-mathjax-csp
2
2
 
3
- Render math on the server using [MathJax-node](https://github.com/mathjax/MathJax-node), while maintaining a strict [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) without `'unsafe-inline'`.
3
+ Render math on the server using the [MathJax 3 node API](https://github.com/mathjax/MathJax-demos-node), while maintaining a strict [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) without `'unsafe-inline'`.
4
4
 
5
5
  While MathJax is well equipped to render beautiful math in a browser, letting it run in the client has two distinctive disadvantages: It is quite CPU-intensive and crucially relies on inline `style` attributes and elements. This Jekyll plugin aims to resolve both issues at once by rendering formulas to SVG images on the server, extracting all generated `style` attributes into a single `<style>` element in the head of the page and computing a hash over its content that can then be added as a CSP `style-src`.
6
6
 
7
- The plugin runs the output of Jekyll's markdown parser [kramdown](http://kramdown.gettalong.org/) through the CLI converter `mjpage` offered by the npm package [`mathjax-node-page`](https://github.com/pkra/mathjax-node-page) and thus behaves exactly as client-side MathJax in SVG rendering mode would.
7
+ The plugin runs the output of Jekyll's markdown parser [kramdown](http://kramdown.gettalong.org/) through the [MathJax 3 node API](https://github.com/mathjax/MathJax-demos-node) and thus behaves exactly as client-side MathJax in SVG rendering mode would.
8
8
 
9
9
  ## Usage
10
10
 
11
- 1. Install the npm package `mathjax-node-page` from your top-level Jekyll directory:
11
+ 1. Install the npm packages `mathjax-full` and `yargs` from your top-level Jekyll directory:
12
12
 
13
13
  ```bash
14
14
  npm init -f # only if you don't have a package.json yet
15
- npm install mathjax-node-page@2.X
15
+ npm install mathjax-full yargs
16
16
  ```
17
17
 
18
18
  2. Install `jekyll-mathjax-csp`:
@@ -39,53 +39,29 @@ The plugin runs the output of Jekyll's markdown parser [kramdown](http://kramdow
39
39
 
40
40
  ## Dependencies
41
41
 
42
- * `mathjax-node-page` (npm): 2.0+
42
+ * `mathjax-full` (npm): 3.0+
43
+ * `yargs` (npm): 16.1.0+
43
44
  * `html-pipeline`: 2.3+
44
45
  * `jekyll`: 3.0+
45
46
 
46
47
  ## Configuration
47
48
 
48
- The following fields can be set in `_config.yml`; their default values are given in the sample below.
49
-
50
- ```yaml
51
- mathjax_csp:
52
- linebreaks: false
53
- single_dollars: false
54
- format: AsciiMath,TeX,MathML
55
- font: TeX
56
- semantics: false
57
- notexthints: false
58
- output: SVG
59
- eqno: none
60
- ex_size: 6
61
- width: 100
62
- extensions: ""
63
- font_url: "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/fonts/HTML-CSS"
64
- strip_css: false
65
- ```
66
- 'mathjax-node-page' adds a fixed inline stylesheet to every page containing math. If you want to serve this stylesheet as an external `.css`, you can advise the plugin to strip it from the output by adding the following lines to your `_config.yml`:
49
+ MathJax adds a fixed inline stylesheet to every page containing math. If you want to serve this stylesheet as an external `.css`, you can advise the plugin to strip it from the output by adding the following lines to your `_config.yml`:
67
50
 
68
51
  ```yaml
69
52
  mathjax_csp:
70
53
  strip_css: true
71
54
  ```
72
55
 
73
- Configuration for 'mathjax-node-page' is also available:
74
-
75
- | Key | Description | Default |
76
- | ---------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
77
- | `linebreaks` | Perform automatic line-breaking | `false` |
78
- | `single_dollars` | Allow single-dollar delimiters for inline math | `false` |
79
- | `format` | Input format(s) to look for | `AsciiMath,TeX,MathML` |
80
- | `font` | Web font to use in SVG output | `TeX` |
81
- | `semantics` | For TeX or Asciimath source and MathML output, add input in `<semantics>` tag | `false` |
82
- | `notexthints` | For TeX input and MathML output, don't add TeX-specific classes | `false` |
83
- | `output` | Output format: SVG, CommonHTML, or MML | `SVG` |
84
- | `eqno` | Equation number style (none, AMS, or all) | `none` |
85
- | `ex_size` | Ex-size, in pixels | `6` |
86
- | `width` | Width of equation container in `ex`. Used for line-breaking | `100` |
87
- | `extensions` | Extra MathJax extensions (e.g. `Safe,Tex/noUndefined`) | `""` |
88
- | `font_url` | URL to use for web fonts | `https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/fonts/HTML-CSS` |
56
+ Other configuration options for MathJax are also available:
57
+
58
+ | Key | Description | Default |
59
+ | ---------------- | ---------------------------------------------- | ------- |
60
+ | `em_size` | Em-size, in pixels | `12` |
61
+ | `ex_size` | Ex-size, in pixels | `6` |
62
+ | `single_dollars` | Allow single-dollar delimiters for inline math | `false` |
63
+ | `output` | Output format: `SVG` or `CommonHTML` | `SVG` |
64
+
89
65
 
90
66
  ## Local testing
91
67
 
@@ -110,4 +86,4 @@ Note that this cannot be used with frame-ancestors, report-uri, or sandbox.
110
86
 
111
87
  ## License
112
88
 
113
- MIT
89
+ MIT
data/bin/mathjaxify ADDED
@@ -0,0 +1,157 @@
1
+ #! /usr/bin/env node
2
+
3
+ // The MIT License (MIT)
4
+ // =====================
5
+ //
6
+ // Copyright © 2018 Fabian Henneke
7
+ //
8
+ // Permission is hereby granted, free of charge, to any person
9
+ // obtaining a copy of this software and associated documentation
10
+ // files (the “Software”), to deal in the Software without
11
+ // restriction, including without limitation the rights to use,
12
+ // copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ // copies of the Software, and to permit persons to whom the
14
+ // Software is furnished to do so, subject to the following
15
+ // conditions:
16
+ //
17
+ // The above copyright notice and this permission notice shall be
18
+ // included in all copies or substantial portions of the Software.
19
+ //
20
+ // THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
21
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
22
+ // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
24
+ // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
25
+ // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26
+ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27
+ // OTHER DEALINGS IN THE SOFTWARE.
28
+
29
+ /*************************************************************************
30
+ * Modified from MathJax-demos-node direct/tex2svg-page by Fabian Henneke
31
+ *
32
+ * Original copyright and licensing information:
33
+ * ----------------------------------------------------------------------
34
+ *
35
+ * Copyright (c) 2018 The MathJax Consortium
36
+ *
37
+ * Licensed under the Apache License, Version 2.0 (the "License");
38
+ * you may not use this file except in compliance with the License.
39
+ * You may obtain a copy of the License at
40
+ *
41
+ * http://www.apache.org/licenses/LICENSE-2.0
42
+ *
43
+ * Unless required by applicable law or agreed to in writing, software
44
+ * distributed under the License is distributed on an "AS IS" BASIS,
45
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
46
+ * See the License for the specific language governing permissions and
47
+ * limitations under the License.
48
+ */
49
+
50
+ //
51
+ // Load the packages needed for MathJax
52
+ //
53
+
54
+ const {mathjax} = require('mathjax-full/js/mathjax.js');
55
+ const {TeX} = require('mathjax-full/js/input/tex.js');
56
+ const {SVG} = require('mathjax-full/js/output/svg.js');
57
+ const {CHTML} = require('mathjax-full/js/output/chtml.js');
58
+ const {liteAdaptor} = require('mathjax-full/js/adaptors/liteAdaptor.js');
59
+ const {RegisterHTMLHandler} = require('mathjax-full/js/handlers/html.js');
60
+ const {AssistiveMmlHandler} = require('mathjax-full/js/a11y/assistive-mml.js');
61
+
62
+ const {AllPackages} = require('mathjax-full/js/input/tex/AllPackages.js');
63
+
64
+ require('mathjax-full/js/util/entities/all.js');
65
+
66
+ //
67
+ // Get the command-line arguments
68
+ //
69
+ var argv = require('yargs')
70
+ .demand(0).strict()
71
+ .usage('$0 [options] < input.json > output.json')
72
+ .options({
73
+ em: {
74
+ default: 12,
75
+ describe: 'em-size in pixels'
76
+ },
77
+ ex: {
78
+ default: 6,
79
+ describe: 'ex-size in pixels'
80
+ },
81
+ singleDollars: {
82
+ default: false,
83
+ type: 'boolean'
84
+ },
85
+ output: {
86
+ default: 'SVG',
87
+ choices: ['SVG', 'CommonHTML']
88
+ }
89
+ })
90
+ .argv;
91
+
92
+ //
93
+ // Read input JSON from stdin
94
+ //
95
+ const inputDocs = JSON.parse(require('fs').readFileSync(0, 'utf8'));
96
+
97
+ //
98
+ // Create DOM adaptor and register it for HTML documents
99
+ //
100
+ const adaptor = liteAdaptor({fontSize: argv.em});
101
+ AssistiveMmlHandler(RegisterHTMLHandler(adaptor));
102
+
103
+ //
104
+ // Create input and output jax and a document using them on the content from the HTML file
105
+ //
106
+ function getInput() {
107
+ const options = {packages: AllPackages};
108
+ if (argv.singleDollars) {
109
+ options.inlineMath = [['$', '$'], ['\\(', '\\)']]
110
+ }
111
+ return new TeX(options);
112
+ }
113
+
114
+ function getOutput() {
115
+ const options = {exFactor: argv.ex / argv.em};
116
+ switch (argv.output) {
117
+ case 'SVG':
118
+ return new SVG({...options, fontCache: 'global'});
119
+ case 'CommonHTML':
120
+ return new CHTML({...options, fontURL: 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/output/chtml/fonts/woff-v2'});
121
+ default:
122
+ throw new Error('Unrecognized output format: ' + argv.output);
123
+ }
124
+ }
125
+
126
+ const outputDocs = {};
127
+
128
+ // For each input path and HTML doc
129
+ Object.keys(inputDocs).forEach((path) => {
130
+ console.error("mathjaxify:", path);
131
+ const inputHTML = inputDocs[path];
132
+ const html = mathjax.document(inputHTML, {InputJax: getInput(), OutputJax: getOutput()});
133
+
134
+ //
135
+ // Typeset the document
136
+ //
137
+ html.render();
138
+
139
+ //
140
+ // If no math was found on the page, remove the stylesheet and font cache (if any)
141
+ //
142
+ if (argv.output === "SVG" && html.math.toArray().length === 0) {
143
+ adaptor.remove(html.outputJax.svgStyles);
144
+ const cache = adaptor.elementById(adaptor.body(html.document), 'MJX-SVG-global-cache');
145
+ if (cache) adaptor.remove(cache);
146
+ }
147
+
148
+ //
149
+ // Store the resulting HTML in the output
150
+ //
151
+ outputDocs[path] = adaptor.doctype(html.document)
152
+ + "\n"
153
+ + adaptor.outerHTML(adaptor.root(html.document));
154
+ });
155
+
156
+ // Write out all the documents in JSON format
157
+ console.log(JSON.stringify(outputDocs));
@@ -1,4 +1,5 @@
1
- # Server-side, CSP-aware math rendering for Jekyll using mathjax-node-page
1
+ # coding: utf-8
2
+ # Server-side, CSP-aware math rendering for Jekyll using MathJax's node API
2
3
  #
3
4
  # The MIT License (MIT)
4
5
  # =====================
@@ -35,46 +36,34 @@ require "set"
35
36
 
36
37
  module Jekyll
37
38
 
38
- # Run Jekyll documents through mathjax-node-page, transform style attributes into inline style
39
+ # Run Jekyll documents through MathJax's node engine, transform style attributes into inline style
39
40
  # tags and compute their hashes
40
41
  class Mathifier
41
42
  MATH_TAG_REGEX = /(<script[^>]*type="math\/tex|\\\[.*\\\]|\\\(.*\\\))/im
42
43
 
43
44
  FIELDS = {
44
- "format" => "--format",
45
- "font" => "--font",
46
- "ouput" => "--output",
47
- "equation_number" => "--eqno",
48
- "output" => "--output",
49
- "eqno" => "--eqno",
45
+ "em_size" => "--em",
50
46
  "ex_size" => "--ex",
51
- "width" => "--width",
52
- "extensions" => "--extensions",
53
- "font_url" => "--fontURL"
54
- }
55
- FLAGS = {
56
- "linebreaks" => "--linebreaks",
57
- "single_dollars" => "--dollars",
58
- "semantics" => "--semantics",
59
- "notexthints" => "--notexthints"
47
+ "single_dollars" => "--singleDollars",
48
+ "output" => "--output",
60
49
  }
61
50
 
62
51
  class << self
63
52
  attr_accessor :csp_hashes
64
53
 
65
- # Extract all style attributes from SVG elements and replace them by a new CSS class with a
66
- # deterministic name
54
+ # Extract all style attributes from SVG and container elements and replace them with a new
55
+ # CSS class with a deterministic name
67
56
  def extractStyleAttributes(parsed_doc)
68
57
  style_attributes = {}
69
- svg_tags = parsed_doc.css("svg[style]")
70
- for svg_tag in svg_tags do
71
- style_attribute = svg_tag["style"]
58
+ styled_tags = parsed_doc.css("svg[style],mjx-container[style]")
59
+ for styled_tag in styled_tags do
60
+ style_attribute = styled_tag["style"]
72
61
  digest = Digest::MD5.hexdigest(style_attribute)[0..15]
73
62
  style_attributes[digest] = style_attribute
74
63
 
75
64
  digest_class = "mathjax-inline-#{digest}"
76
- svg_tag["class"] = "#{svg_tag["class"] || ""} #{digest_class}"
77
- svg_tag.remove_attribute("style")
65
+ styled_tag["class"] = "#{styled_tag["class"] || ""} #{digest_class}"
66
+ styled_tag.remove_attribute("style")
78
67
  end
79
68
  return style_attributes
80
69
  end
@@ -96,71 +85,73 @@ module Jekyll
96
85
  hashStyleTag(style_tag)
97
86
  end
98
87
 
99
- # Run mathjax-node-page on a String containing an HTML doc
100
- def run_mjpage(config, output)
88
+ # Run the MathJax node backend on a JSON input containing an file: HTML map
89
+ def run_mathjaxify(config, input)
101
90
  mathified = ""
102
91
  exit_status = 0
103
-
104
- command = "node_modules/mathjax-node-page/bin/mjpage"
92
+ command = "node #{Gem.bin_path("jekyll-mathjax-csp", "mathjaxify")}"
105
93
 
106
94
  FIELDS.each do |name, flag|
107
95
  unless config[name].nil?
108
- command << " " << flag << " " << config[name].to_s
109
- end
110
- end
111
-
112
- FLAGS.each do |name, flag|
113
- unless config[name].nil?
114
- command << " " << flag
96
+ if [true, false].include? config[name]
97
+ command << " " << flag
98
+ else
99
+ command << " " << flag << " " << config[name].to_s
100
+ end
115
101
  end
116
102
  end
117
103
 
118
- begin
119
- Open3.popen2(command) {|i,o,t|
120
- i.print output
121
- i.close
122
- o.each {|line|
123
- mathified.concat(line)
124
- }
125
- exit_status = t.value
126
- }
127
- return mathified unless exit_status != 0
128
- Jekyll.logger.abort_with "mathjax_csp:", "'node_modules/mathjax-node-page/mjpage' not found"
129
- rescue
130
- Jekyll.logger.abort_with "mathjax_csp:", "Failed to execute 'node_modules/mathjax-node-page/mjpage'"
131
- end
132
-
104
+ node_path = Dir.pwd + "/node_modules"
105
+ Jekyll.logger.info "mathjax_csp:", "starting node #{command}"
106
+ mathified, status = Open3.capture2({"NODE_PATH" => node_path}, command, stdin_data: input)
107
+ return mathified unless status != 0
108
+ Jekyll.logger.abort_with "mathjax_csp:", "Failed to execute 'bin/mathjaxify'"
133
109
  end
134
110
 
135
- # Render math
136
- def mathify(doc, config)
137
- return unless MATH_TAG_REGEX.match?(doc.output)
138
-
139
- Jekyll.logger.info "Rendering math:", doc.relative_path
140
- parsed_doc = Nokogiri::HTML::Document.parse(doc.output)
141
- # Ensure that all styles we pick up weren't present before mjpage ran
142
- unless parsed_doc.css("svg[style]").empty?()
143
- Jekyll.logger.error "mathjax_csp:", "Inline style on <svg> element present before running mjpage"
144
- Jekyll.logger.abort_with "", "due to a misconfiguration or server-side style injection."
111
+ # Render math in batch for all documents
112
+ def mathify(docs, config)
113
+ docs = docs.select { |d| Jekyll::Mathifier.mathable?(d) } # can be mathified?
114
+ .select { |d| MATH_TAG_REGEX.match?(d.output) } # needs mathifying?
115
+ .reduce({}) { |h, d| h.merge!(d.path => d) } # use #path to identify a doc
116
+ return if docs.empty?
117
+
118
+ Jekyll.logger.info "mathjax_csp:", "Found #{docs.length} documents."
119
+
120
+ docs.each do |path, doc|
121
+ Jekyll.logger.info "Checking math:", path
122
+ parsed_doc = Nokogiri::HTML::Document.parse(doc.output)
123
+ # Ensure that all styles we pick up weren't present before MathJax ran
124
+ unless parsed_doc.css("svg[style],mjx-container[style]").empty?
125
+ Jekyll.logger.error "mathjax_csp:", "Inline style on <svg> or <mjx-container> element present"
126
+ Jekyll.logger.error "", "before rendering math due to misconfiguration or server-side"
127
+ Jekyll.logger.abort_with "", "style injection."
128
+ end
145
129
  end
146
130
 
147
- mjpage_output = run_mjpage(config, doc.output)
148
- parsed_doc = Nokogiri::HTML::Document.parse(mjpage_output)
149
- last_child = parsed_doc.at_css("head").last_element_child()
150
- if last_child.name == "style"
151
- # Set strip_css to true in _config.yml if you load the styles mjpage adds to the head
152
- # from an external *.css file
153
- if config["strip_css"]
154
- Jekyll.logger.info "", "Remember to <link> in external stylesheet!"
155
- last_child.remove
156
- else
157
- hashStyleTag(last_child)
131
+ mathjaxify_input = docs.reduce({}) { |h, (path, doc)| h.merge!(path => doc.output) }
132
+ .to_json
133
+ mathified_docs = JSON.parse(run_mathjaxify(config, mathjaxify_input))
134
+
135
+ mathified_docs.each do |path, mathified_html|
136
+ parsed_doc = Nokogiri::HTML::Document.parse(mathified_html)
137
+ last_child = parsed_doc.at_css("head").last_element_child()
138
+ if last_child.name == "style"
139
+ # Set strip_css to true in _config.yml if you load the styles MathJax adds to the head
140
+ # from an external *.css file
141
+ if config["strip_css"]
142
+ Jekyll.logger.info "", "Remember to <link> in external stylesheet!"
143
+ last_child.remove
144
+ else
145
+ hashStyleTag(last_child)
146
+ end
158
147
  end
148
+
149
+ style_attributes = extractStyleAttributes(parsed_doc)
150
+ compileStyleElement(parsed_doc, style_attributes)
151
+ docs[path].output = parsed_doc.to_html
159
152
  end
160
153
 
161
- style_attributes = extractStyleAttributes(parsed_doc)
162
- compileStyleElement(parsed_doc, style_attributes)
163
- doc.output = parsed_doc.to_html
154
+ Jekyll.logger.info "mathjax_csp:", "Mathified #{mathified_docs.length} documents."
164
155
  end
165
156
 
166
157
  def mathable?(doc)
@@ -215,12 +206,10 @@ Jekyll::Hooks.register [:documents, :pages], :pre_render do |doc|
215
206
  Jekyll::MathJaxSourcesTag.unrendered_docs[doc.relative_path] = doc.content
216
207
  end
217
208
 
218
- # Replace math blocks with SVG renderings using mathjax-node-page and collect inline styles in a
209
+ # Replace math blocks with SVG renderings using mathjaxify and collect inline styles in a
219
210
  # single <style> element
220
- Jekyll::Hooks.register [:documents, :pages], :post_render do |doc|
221
- if Jekyll::Mathifier.mathable?(doc)
222
- Jekyll::Mathifier.mathify(doc, doc.site.config["mathjax_csp"] || {})
223
- end
211
+ Jekyll::Hooks.register :site, :post_render do |site|
212
+ Jekyll::Mathifier.mathify(site.posts.docs + site.pages, site.config["mathjax_csp"] || {})
224
213
  end
225
214
 
226
215
  # Run over all documents with {% mathjax_sources %} Liquid tags again and insert the list of CSP
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-mathjax-csp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - Fabian Henneke
7
+ - Fabian Meumertzheim
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-25 00:00:00.000000000 Z
11
+ date: 2021-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: html-pipeline
@@ -45,15 +45,17 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: '5.0'
47
47
  description: Server-side MathJax rendering for Jekyll with a strict CSP
48
- email: fabian@henneke.me
49
- executables: []
48
+ email: fabian@meumertzhe.im
49
+ executables:
50
+ - mathjaxify
50
51
  extensions: []
51
52
  extra_rdoc_files:
52
53
  - README.md
53
54
  files:
54
55
  - README.md
56
+ - bin/mathjaxify
55
57
  - lib/jekyll-mathjax-csp.rb
56
- homepage: https://github.com/FabianHenneke/jekyll-mathjax-csp
58
+ homepage: https://github.com/fmeum/jekyll-mathjax-csp
57
59
  licenses:
58
60
  - MIT
59
61
  metadata: {}
@@ -72,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
74
  - !ruby/object:Gem::Version
73
75
  version: '0'
74
76
  requirements: []
75
- rubygems_version: 3.0.3
77
+ rubygems_version: 3.1.2
76
78
  signing_key:
77
79
  specification_version: 4
78
80
  summary: Server-side MathJax & CSP for Jekyll