jektex 0.0.8 → 0.1.0
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 +4 -4
- data/README.md +18 -8
- data/lib/jektex/jektex.rb +29 -16
- data/lib/jektex/katex.min.js +1 -1
- data/lib/jektex/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a428ba8f2f9f71ee79b44ed698d5314bf89e240eb577f82a1e0e976878875f2b
|
4
|
+
data.tar.gz: 3db9e56ab288eec2e3f9457b4693851b0345f1ec7afabeaabaeba6884aa1c792
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '058eeb45c2e9c2bea5b8294084732d6c4b54e7344c360338bb62f6c9e5a8b2c55e99507be1de78cde4b81a14781a68ee4f530253e90980398ce4ea7c0da418ec'
|
7
|
+
data.tar.gz: b6de46d7eb8f639bb7c06ebd0f7aea6df75647d4f8c930fc779d580ec21c33bfa01c9fd909b0cc577c8862310df58c3e59680271ebba99fc95e9e403659bd345
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
[](https://rubygems.org/gems/jektex)
|
2
2
|
|
3
|
-
# Jektex
|
3
|
+
# 
|
4
4
|
A Jekyll plugin for blazing-fast server-side cached LaTeX rendering, with support for macros.
|
5
5
|
Enjoy the comfort of LaTeX and Markdown without cluttering your site with bloated JavaScript.
|
6
6
|
|
@@ -16,9 +16,9 @@ Enjoy the comfort of LaTeX and Markdown without cluttering your site with bloate
|
|
16
16
|
- Marks invalid expressions in document, printing its location during rendering
|
17
17
|
- Is highly configurable with sensible defaults
|
18
18
|
- Makes sure that cache does not contain expression rendered with outdated configuration
|
19
|
+
- Supports two major LaTeX notations
|
19
20
|
|
20
21
|
## Usage
|
21
|
-
|
22
22
|
Jektex supports both the built-in Kramdown math notation, and the newer LaTeX-only math notation.
|
23
23
|
|
24
24
|
### Kramdown notation
|
@@ -43,7 +43,7 @@ ea commodo consequat.
|
|
43
43
|
|
44
44
|
_Why Jektex does not use conventional single `$` for inline formulas and double `$$` for
|
45
45
|
display mode?
|
46
|
-
This is how [kramdown](https://kramdown.gettalong.org/)(Jekyll's markdown parser) works
|
46
|
+
This is how [kramdown](https://kramdown.gettalong.org/) (Jekyll's markdown parser) works
|
47
47
|
so I decided to respect this convention. It makes this plugin more consistent and universal._
|
48
48
|
|
49
49
|
|
@@ -69,6 +69,9 @@ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliqu
|
|
69
69
|
ea commodo consequat.
|
70
70
|
```
|
71
71
|
|
72
|
+
### Logo macro
|
73
|
+
There is a build in macro for jektex logo. You can use it as `\jektex`.
|
74
|
+
|
72
75
|
### Config
|
73
76
|
Jektex si highly configurable via your `_config.yml` file.
|
74
77
|
|
@@ -82,7 +85,6 @@ By default, Jektex cache will be saved in `.jekyll-cache` directory.
|
|
82
85
|
This results in its deletion when you call `jekyll clean`.
|
83
86
|
To prevent cache deletion or to change the cache location, you can specify `cache_dir` in `_config.yml`:
|
84
87
|
```yaml
|
85
|
-
# Jektex cache dir location
|
86
88
|
jektex:
|
87
89
|
cache_dir: ".jektex-cache"
|
88
90
|
```
|
@@ -92,7 +94,6 @@ By default, Jektex tries to render LaTeX in all files rendered by Jekyll.
|
|
92
94
|
This can sometimes be undesirable, for example when rendering an _RSS feed_ with excerpts containing LaTeX.
|
93
95
|
Jektex solves this by using the `ignore` option:
|
94
96
|
```yaml
|
95
|
-
# Jektex ignore files
|
96
97
|
jektex:
|
97
98
|
ignore: ["*.xml", "README.md", "_drafts/*" ]
|
98
99
|
```
|
@@ -103,7 +104,7 @@ This example configuration ignores all `.xml` files, `README.md` and all files i
|
|
103
104
|
Another way to ignore specific posts is setting the `jektex` attribute in front matter to `false`:
|
104
105
|
```yaml
|
105
106
|
---
|
106
|
-
|
107
|
+
title: "How Jektex works"
|
107
108
|
category: "Development"
|
108
109
|
jektex: false
|
109
110
|
layout: post
|
@@ -115,7 +116,6 @@ Setting `jektex` tag to `true` or not setting at all will result in Jektex rende
|
|
115
116
|
**Using macros**
|
116
117
|
You can define global macros:
|
117
118
|
```yaml
|
118
|
-
# Jektex macros
|
119
119
|
jektex:
|
120
120
|
macros:
|
121
121
|
- ["\\Q", "\\mathbb{Q}"]
|
@@ -124,12 +124,21 @@ jektex:
|
|
124
124
|
And yes, you have to escape the backlash (`\`) with another backlash.
|
125
125
|
This is due to the [yaml specification](https://yaml.org/).
|
126
126
|
|
127
|
+
**Silencing Jektex output**
|
128
|
+
Jektex periodically informs the user about rendered/cached equations.
|
129
|
+
If this is not desired, you can set the `silent` option (`false` by default).
|
130
|
+
```yaml
|
131
|
+
jektex:
|
132
|
+
silent: true
|
133
|
+
```
|
134
|
+
|
127
135
|
**Complete examples**
|
128
136
|
Recommended config:
|
129
137
|
```yaml
|
130
138
|
jektex:
|
131
139
|
cache_dir: ".jektex-cache"
|
132
140
|
ignore: ["*.xml"]
|
141
|
+
silent: false
|
133
142
|
macros:
|
134
143
|
- ["\\Q", "\\mathbb{Q}"]
|
135
144
|
- ["\\C", "\\mathbb{C}"]
|
@@ -140,6 +149,7 @@ Having no configuration is equivalent to this:
|
|
140
149
|
jektex:
|
141
150
|
cache_dir: ".jekyll-cache"
|
142
151
|
ignore: []
|
152
|
+
silent: false
|
143
153
|
macros: []
|
144
154
|
```
|
145
155
|
|
@@ -174,6 +184,6 @@ It is much better practice to download the [**css** file](https://cdn.jsdelivr.n
|
|
174
184
|
You can find more information on [KaTeX's website](https://katex.org/docs/browser.html).
|
175
185
|
|
176
186
|
## Contributions and bug reports
|
177
|
-
Feel free to
|
187
|
+
Feel free to report any bugs or even make feature request in [issues on official repository](https://github.com/yagarea/jektex/issues).
|
178
188
|
I am opened for pull requests as well.
|
179
189
|
|
data/lib/jektex/jektex.rb
CHANGED
@@ -9,6 +9,7 @@ CACHE_FILE = "jektex-cache.marshal"
|
|
9
9
|
KATEX = ExecJS.compile(open(PATH_TO_JS).read)
|
10
10
|
FRONT_MATTER_TAG = "jektex"
|
11
11
|
INDENT = " " * 13
|
12
|
+
HTML_ENTITY_PARSER = HTMLEntities.new
|
12
13
|
|
13
14
|
$global_macros = Hash.new
|
14
15
|
$updated_global_macros = Array.new
|
@@ -18,6 +19,7 @@ $count_newly_generated_expressions = 0
|
|
18
19
|
$path_to_cache = File.join(DEFAULT_CACHE_DIR, CACHE_FILE)
|
19
20
|
$cache = nil
|
20
21
|
$disable_disk_cache = false
|
22
|
+
$silent = false
|
21
23
|
|
22
24
|
$ignored = Array.new
|
23
25
|
|
@@ -54,7 +56,7 @@ def render_latex_notation(page)
|
|
54
56
|
# check if document is not set to be ignored
|
55
57
|
return page.content if !page.data || is_ignored?(page)
|
56
58
|
# convert HTML entities back to characters
|
57
|
-
post =
|
59
|
+
post = page.content.to_s
|
58
60
|
# render inline expressions
|
59
61
|
post = post.gsub(/(\\\()((.|\n)*?)(?<!\\)\\\)/) { |m| escape_method($1, $2, page.relative_path) }
|
60
62
|
# render display mode expressions
|
@@ -66,7 +68,7 @@ def render_kramdown_notation(page)
|
|
66
68
|
# check if document is not set to be ignored
|
67
69
|
return page.output if !page.data || is_ignored?(page)
|
68
70
|
# convert HTML entities back to characters
|
69
|
-
post =
|
71
|
+
post = page.output.to_s
|
70
72
|
# render inline expressions
|
71
73
|
post = post.gsub(/(\\\()((.|\n)*?)(?<!\\)\\\)/) { |m| escape_method($1, $2, page.relative_path) }
|
72
74
|
# render display mode expressions
|
@@ -74,10 +76,10 @@ def render_kramdown_notation(page)
|
|
74
76
|
return post
|
75
77
|
end
|
76
78
|
|
77
|
-
def escape_method(
|
79
|
+
def escape_method(type, expression, doc_path)
|
78
80
|
# detect if expression is in display mode
|
79
81
|
is_in_display_mode = type.downcase =~ /\[/
|
80
|
-
|
82
|
+
expression = HTML_ENTITY_PARSER.decode(expression)
|
81
83
|
# generate a hash from the math expression
|
82
84
|
expression_hash = Digest::SHA2.hexdigest(expression) + is_in_display_mode.to_s
|
83
85
|
|
@@ -85,7 +87,7 @@ def escape_method( type, expression, doc_path )
|
|
85
87
|
if($cache.has_key?(expression_hash) && !contains_updated_global_macro?(expression))
|
86
88
|
# check if expressin conains updated macro
|
87
89
|
$count_newly_generated_expressions += 1
|
88
|
-
print_stats
|
90
|
+
print_stats unless $silent
|
89
91
|
return $cache[expression_hash]
|
90
92
|
|
91
93
|
# else generate one and store it
|
@@ -104,7 +106,7 @@ def escape_method( type, expression, doc_path )
|
|
104
106
|
raise
|
105
107
|
rescue ExecJS::ProgramError => pe
|
106
108
|
# catch parse error
|
107
|
-
puts "\e[31m #{pe.message.gsub("ParseError: ", "")}\n\t#{doc_path}\e[0m"
|
109
|
+
puts "\e[31m #{pe.message.gsub("ParseError: ", "")}\n\t#{doc_path}\e[0m" unless $silent
|
108
110
|
# render expression with error highlighting enabled
|
109
111
|
return KATEX.call("katex.renderToString", expression,
|
110
112
|
{ displayMode: is_in_display_mode,
|
@@ -116,7 +118,7 @@ def escape_method( type, expression, doc_path )
|
|
116
118
|
$cache[expression_hash] = result
|
117
119
|
# update count of newly generated expressions
|
118
120
|
$count_newly_generated_expressions += 1
|
119
|
-
print_stats
|
121
|
+
print_stats unless $silent
|
120
122
|
return result
|
121
123
|
end
|
122
124
|
end
|
@@ -145,7 +147,7 @@ Jekyll::Hooks.register :site, :after_init do |site|
|
|
145
147
|
config = site.config["jektex"] || Hash.new
|
146
148
|
|
147
149
|
# check if there is defined custom cache location in config
|
148
|
-
|
150
|
+
$path_to_cache = File.join(config["cache_dir"].to_s, CACHE_FILE) if config.has_key?("cache_dir")
|
149
151
|
|
150
152
|
# load content of cache file if it exists
|
151
153
|
if File.exist?($path_to_cache)
|
@@ -164,19 +166,29 @@ Jekyll::Hooks.register :site, :after_init do |site|
|
|
164
166
|
end
|
165
167
|
end
|
166
168
|
|
169
|
+
# check is silent mode is activated
|
170
|
+
$silent = config["silent"] if config.has_key?("silent")
|
167
171
|
# make list of updated macros
|
168
172
|
$updated_global_macros = get_list_of_updated_global_macros($global_macros, $cache["cached_global_macros"])
|
173
|
+
|
169
174
|
# print macro information
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
"#{$global_macros.size
|
175
|
-
|
175
|
+
unless $silent
|
176
|
+
if $global_macros.empty?
|
177
|
+
puts "#{INDENT}LaTeX: no macros loaded" unless $silent
|
178
|
+
else
|
179
|
+
puts "#{INDENT}LaTeX: #{$global_macros.size} macro" \
|
180
|
+
"#{$global_macros.size == 1 ? "" : "s"} loaded" +
|
181
|
+
($updated_global_macros.empty? ? "" : " (#{$updated_global_macros.size} updated)") unless $silent
|
182
|
+
end
|
176
183
|
end
|
177
184
|
|
185
|
+
# add jektex logo macro
|
186
|
+
$global_macros['\jektex'] =
|
187
|
+
'\text{\raisebox{-0.55ex}{J}\kern{-0.3ex}E\kern{-0.25ex}\raisebox{-0.5ex}{K}\kern{-0.7ex}}\TeX'
|
188
|
+
|
178
189
|
# load list of ignored files
|
179
190
|
$ignored = config["ignore"] if config.has_key?("ignore")
|
191
|
+
$ignored.append("#{$path_to_cache}/*")
|
180
192
|
end
|
181
193
|
|
182
194
|
Jekyll::Hooks.register :site, :after_reset do
|
@@ -186,9 +198,9 @@ end
|
|
186
198
|
|
187
199
|
Jekyll::Hooks.register :site, :post_write do
|
188
200
|
# print stats once more to prevent them from being overwriten by error log
|
189
|
-
print_stats
|
201
|
+
print_stats unless $silent
|
190
202
|
# print new line to prevent overwriting previous output
|
191
|
-
print "\n"
|
203
|
+
print "\n" unless $silent
|
192
204
|
# check if caching is enabled
|
193
205
|
if !$disable_disk_cache
|
194
206
|
# save global macros to cache
|
@@ -200,3 +212,4 @@ Jekyll::Hooks.register :site, :post_write do
|
|
200
212
|
end
|
201
213
|
end
|
202
214
|
|
215
|
+
|