jekyll-spaceship 0.8.1 → 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 03c21c812a08651efca92f4b47b56249235da50b32b9d3eecb53dc3900d4e96a
4
- data.tar.gz: abe8bcef58bcf94b21d9817fd502f05d6f603b0861dcb553b112a0c976a5be9b
3
+ metadata.gz: 5f3d45fd1335dcec7d9c05900219920869adaa418fd72b29b3fde3fcdfafc14d
4
+ data.tar.gz: 2e1fc457586b11bfa8d9fc215ba6c870a3f09ea85a78872d72a8692eeb12abcf
5
5
  SHA512:
6
- metadata.gz: f0ee89b992667b27dbd9aacc6b094fa4572c2cf6d97f9fe7d90577a3615af5b571af29dae255cf6d493b122c9eaa5af6ee2c5aa95c7ad6589acbecb133ef51b9
7
- data.tar.gz: 19effd2d66e6684a6cd8c8e784262f354ef26cefa1bd1a2cb97411e7f9f97cf9081c2acc350ac3bb2978c31889ad62ede73dd05616d7659ac6d6019ceb6a51e6
6
+ metadata.gz: 5c2b6900e10b029dbedad643eeb19c4d7a8332003e0bf8079af7c792bef622bc04ff550194e82d1dde365fd54fcd3f4f3997e25c357fac149db1f7eaca6cb414
7
+ data.tar.gz: 9a3b141d78a7d22aceea2e7ca8545c44a070303e4241db7f56adc301917d34bc91ff6dfb5e09df7dbf8a1739cb6c2f4a1c36c5f73fbc1a9884667350789c9bba
data/README.md CHANGED
@@ -101,6 +101,7 @@ Spaceship is a minimalistic, powerful and extremely customizable [Jekyll](https:
101
101
  - [1.3 Headerless](#headerless)
102
102
  - [1.4 Cell Alignment](#cell-alignment)
103
103
  - [1.5 Cell Markdown](#cell-markdown)
104
+ - [1.6 Cell Inline Attributes](#cell-inline-attributes)
104
105
  - [2. MathJax Usage](#2-mathjax-usage)
105
106
  - [2.1 Performance Optimization](#21-performance-optimization)
106
107
  - [2.2 How to use?](#22-how-to-use)
@@ -140,7 +141,12 @@ plugins:
140
141
  - jekyll-spaceship
141
142
  ```
142
143
 
143
- **💡 Tip:** Note that GitHub Pages runs in `safe` mode and only allows [a set of whitelisted plugins](https://pages.github.com/versions/). To use the gem in GitHub Pages, you need to build locally or use CI (e.g. [travis](https://travis-ci.org/), [github workflow](https://help.github.com/en/actions/configuring-and-managing-workflows/configuring-a-workflow)) and deploy to your `gh-pages` branch. [Click here for more information.](https://jekyllrb.com/docs/continuous-integration/github-actions/) (e.g. [https://github.com/jeffreytse/jekyll-jeffreytse-blog](https://github.com/jeffreytse/jekyll-jeffreytse-blog))
144
+ **💡 Tip:** Note that GitHub Pages runs in `safe` mode and only allows [a set of whitelisted plugins](https://pages.github.com/versions/). To use the gem in GitHub Pages, you need to build locally or use CI (e.g. [travis](https://travis-ci.org/), [github workflow](https://help.github.com/en/actions/configuring-and-managing-workflows/configuring-a-workflow)) and deploy to your `gh-pages` branch.
145
+
146
+ ### Additions
147
+
148
+ * Here is a GitHub Action named [jekyll-deploy-action](https://github.com/jeffreytse/jekyll-deploy-action) for Jekyll site deployment conveniently. 👍
149
+ * Here is a [Jekyll site](https://github.com/jeffreytse/jekyll-jeffreytse-blog) using Travis to build and deploy to GitHub Pages for your references.
144
150
 
145
151
  ## Configuration
146
152
 
@@ -529,6 +535,61 @@ Rowspan is 4
529
535
  </tbody>
530
536
  </table>
531
537
 
538
+ #### Cell Inline Attributes
539
+
540
+ This feature is very useful for custom cell such as using inline style. (e.g., background, color, font)
541
+ The idea and syntax comes from the [Maruku](http://maruku.rubyforge.org/) package.
542
+
543
+ [](https://kramdown.gettalong.org/syntax.html#block-ials)
544
+
545
+ Following are some examples of attributes definitions (ALDs) and afterwards comes the syntax explanation:
546
+
547
+ ```markdown
548
+ {:ref-name: #id .cls1 .cls2}
549
+ {:second: ref-name #id-of-other title="hallo you"}
550
+ {:other: ref-name second}
551
+ ```
552
+
553
+ An ALD line has the following structure:
554
+
555
+ - a left brace, optionally preceded by up to three spaces,
556
+ - followed by a colon, the id and another colon,
557
+ - followed by attribute definitions (allowed characters are backslash-escaped closing braces or any character except a not escaped closing brace),
558
+ - followed by a closing brace and optional spaces until the end of the line.
559
+
560
+ If there is more than one ALD with the same reference name, the attribute definitions of all the ALDs are processed like they are defined in one ALD.
561
+
562
+ An inline attribute list (IAL) is used to attach attributes to another element.
563
+ Here are some examples for span IALs:
564
+
565
+ ```markdown
566
+ {: #id .cls1 .cls2} <!-- #id <=> id="id", .cls1 .cls2 <=> class="cls1 cls2" -->
567
+ {: ref-name title="hallo you"}
568
+ {: ref-name class='.cls3' .cls4}
569
+ ```
570
+
571
+ Here is an example for custom table cell with IAL:
572
+
573
+ ```markdown
574
+ {:color-style: style="background: black;" }
575
+ {:color-style: style="color: white;" }
576
+ {:font-style: style="font-weight: 800;" }
577
+
578
+ |: Here's an Inline Attribute Lists example :||||
579
+ | ------- | ------------------------- | -------------------- | ----------- |
580
+ |: :|: <div style="color: red;"> &lt; Normal HTML Block > </div> :|||
581
+ | ^^ | Red {: .cls style="background: orange" } |||
582
+ | ^^ IALs | Green {: #id style="background: green; color: white" } |||
583
+ | ^^ | Blue {: style="background: blue; color: white" } |||
584
+ | ^^ | Black {: color-style font-weight} |||
585
+ ```
586
+
587
+ Code above would be parsed as:
588
+
589
+ <img width="580px" src="https://user-images.githubusercontent.com/9413601/88461592-738afb00-ced7-11ea-9aac-3179023742b0.png" alt="IALs">
590
+
591
+ Additionally, [here](https://kramdown.gettalong.org/syntax.html#block-ials) you can learn more details about IALs.
592
+
532
593
  ### 2. MathJax Usage
533
594
 
534
595
  [MathJax](http://www.mathjax.org/) is an open-source JavaScript display engine for LaTeX, MathML, and AsciiMath notation that works in all modern browsers.
@@ -65,7 +65,7 @@ module Jekyll::Spaceship
65
65
 
66
66
  def initialize_exclusions
67
67
  if @@_exclusions.size.zero?
68
- self.class.exclude :code, :block_quotes
68
+ self.class.exclude :code, :math, :liquid_filter
69
69
  end
70
70
  @exclusions = @@_exclusions.uniq
71
71
  @@_exclusions.clear
@@ -121,7 +121,7 @@ module Jekyll::Spaceship
121
121
  else
122
122
  if Type.html? output_ext
123
123
  method = 'on_handle_html'
124
- elsif css? output_ext
124
+ elsif Type.css? output_ext
125
125
  method = 'on_handle_css'
126
126
  end
127
127
  if self.respond_to? method
@@ -156,13 +156,17 @@ module Jekyll::Spaceship
156
156
  @exclusions.each do |type|
157
157
  regex = nil
158
158
  if type == :code
159
- regex = /((`+)\s*(\w*)((?:.|\n)*?)\2)/
159
+ regex = /(((?<!\\)`+)\s*(\w*)((?:.|\n)*?)\2)/
160
+ elsif type == :math
161
+ regex = /(((?<!\\)\${1,2})[^\n]*?\1)/
162
+ elsif type == :liquid_filter
163
+ regex = /((?<!\\)\{\{[^\n]*?\}\})/
160
164
  end
161
165
  next if regex.nil?
162
166
  content.scan(regex) do |match_data|
163
167
  match = match_data[0]
164
168
  id = @exclusion_store.size
165
- content = content.sub(match, "[JEKYLL@#{object_id}@#{id}]")
169
+ content = content.sub(match, "<!JEKYLL@#{object_id}@#{id}>")
166
170
  @exclusion_store.push match
167
171
  end
168
172
  end
@@ -173,7 +177,7 @@ module Jekyll::Spaceship
173
177
  while @exclusion_store.size > 0
174
178
  match = @exclusion_store.pop
175
179
  id = @exclusion_store.size
176
- content = content.sub("[JEKYLL@#{object_id}@#{id}]", match)
180
+ content = content.sub("<!JEKYLL@#{object_id}@#{id}>", match)
177
181
  end
178
182
  @exclusion_store = []
179
183
  content
@@ -45,61 +45,11 @@ module Jekyll::Spaceship
45
45
  if data.kind_of? String
46
46
  element.replace Nokogiri::HTML.fragment(data)
47
47
  elsif data.kind_of? Hash
48
- # set name
49
- element.name = data['name'] unless data['name'].nil?
50
-
51
- # set props
52
- data['props']&.each do |prop, val|
53
- next element.remove_attribute if val.nil?
54
- if val.kind_of? Array
55
- next if val.size != 2
56
- v = element[prop]
57
- v = '' if v.nil?
58
- val = v.sub(/#{val[0]}/, val[1])
59
- elsif val.kind_of? Hash
60
- result = []
61
- val.each { |k, v| result.push "#{k}: #{v}" }
62
- val = result.join(";")
63
- end
64
- element.set_attribute(prop, val)
65
- end
66
-
67
- # processing children
68
- return unless data.has_key?('children')
69
- return element.inner_html = "" if data['children'].nil?
70
- children = self.create_children({
48
+ handle_hash_element({
71
49
  :doc => doc,
72
- :data => data['children']
50
+ :element => element,
51
+ :data => data,
73
52
  })
74
-
75
- # replace whole inner html
76
- unless data['children'].kind_of? Array
77
- return element.inner_html = children
78
- end
79
-
80
- if element.children.size.zero?
81
- return element.inner_html = children
82
- end
83
-
84
- index = data['children'].index(nil)
85
- if index.nil?
86
- return element.inner_html = children
87
- end
88
-
89
- # insert to the end of children
90
- if index == 0
91
- return element.children.last.after(children)
92
- end
93
-
94
- # insert to the begin of children
95
- rindex = data['children'].rindex { |item| !item.nil? }
96
- if index == rindex + 1
97
- return element.children.first.before children
98
- end
99
-
100
- # wrap the children
101
- element.children.first.before children[0..index]
102
- element.children.last.after children[index..children.size]
103
53
  end
104
54
  end
105
55
 
@@ -126,6 +76,45 @@ module Jekyll::Spaceship
126
76
  root.children
127
77
  end
128
78
 
79
+ def handle_hash_element(data)
80
+ doc = data[:doc]
81
+ element = data[:element]
82
+ data = data[:data]
83
+
84
+ # set name
85
+ element.name = data['name'] unless data['name'].nil?
86
+
87
+ # set props
88
+ data['props']&.each do |prop, val|
89
+ next element.remove_attribute if val.nil?
90
+ if val.kind_of? Array
91
+ next if val.size != 2
92
+ v = element[prop]
93
+ v = '' if v.nil?
94
+ val = v.sub(/#{val[0]}/, val[1])
95
+ elsif val.kind_of? Hash
96
+ result = []
97
+ val.each { |k, v| result.push "#{k}: #{v}" }
98
+ val = result.join(";")
99
+ end
100
+ element.set_attribute(prop, val)
101
+ end
102
+
103
+ # processing children
104
+ return unless data.has_key?('children')
105
+ return element.inner_html = "" if data['children'].nil?
106
+ children = self.create_children({
107
+ :doc => doc,
108
+ :data => data['children']
109
+ })
110
+
111
+ handle_element_placement({
112
+ :data => data,
113
+ :element => element,
114
+ :children => children,
115
+ })
116
+ end
117
+
129
118
  def create_element(data)
130
119
  doc = data[:doc]
131
120
  data = data[:data]
@@ -148,5 +137,34 @@ module Jekyll::Spaceship
148
137
  end
149
138
  node
150
139
  end
140
+
141
+ def handle_element_placement(data)
142
+ element = data[:element]
143
+ children = data[:children]
144
+ data = data[:data]
145
+
146
+ # replace whole inner html
147
+ unless data['children'].kind_of? Array
148
+ return element.inner_html = children
149
+ end
150
+
151
+ if element.children.size.zero?
152
+ return element.inner_html = children
153
+ end
154
+
155
+ index = data['children'].index(nil)
156
+ rindex = data['children'].rindex { |item| !item.nil? }
157
+
158
+ if index.nil?
159
+ element.inner_html = children
160
+ elsif index == 0 # insert to the end of children
161
+ element.children.last.after(children)
162
+ elsif index == rindex + 1 # insert to the begin of children
163
+ element.children.first.before children
164
+ else # wrap the children
165
+ element.children.first.before children[0..index]
166
+ element.children.last.after children[index..children.size]
167
+ end
168
+ end
151
169
  end
152
170
  end
@@ -24,15 +24,16 @@ module Jekyll::Spaceship
24
24
 
25
25
  # escape plus sign
26
26
  emoji_name = emoji.name.gsub('+', '\\\+')
27
+ css_class = self.config['css']['class']
27
28
 
28
29
  content = content.gsub(
29
30
  /(?<!\=")\s*:#{emoji_name}:\s*(?!"\s)/,
30
- "<img class=\"\""\
31
+ "<img class=\"#{css_class}\""\
31
32
  " title=\":#{emoji.name}:\""\
32
33
  " alt=\":#{emoji.name}:\""\
33
34
  " raw=\"#{emoji.raw}\""\
34
35
  " src=\"#{config['src']}#{emoji.image_filename}\""\
35
- " style=\"vertical-align: middle;"\
36
+ " style=\"vertical-align: middle; display: inline;"\
36
37
  " max-width: 1em; visibility: hidden;\""\
37
38
  " onload=\"this.style.visibility='visible'\""\
38
39
  " onerror=\"this.replaceWith(this.getAttribute('raw'))\">"\
@@ -5,18 +5,21 @@ require "nokogiri"
5
5
 
6
6
  module Jekyll::Spaceship
7
7
  class TableProcessor < Processor
8
+ ATTR_LIST_PATTERN = /((?<!\\)\{:(?:([A-Za-z]\S*):)?(.*?)(?<!\\)\})/
9
+ ATTR_LIST_REFS = {}
10
+
8
11
  def on_handle_markdown(content)
9
12
  # pre-handle reference-style links
10
13
  references = {}
11
- content.scan(/(\[(.*)\]:\s*(.*))/) do |match_data|
14
+ content.scan(/\n\s*(\[(.*)\]:\s*(\S+(\s+".*?")?))/) do |match_data|
12
15
  ref_name = match_data[1]
13
16
  ref_value = match_data[2]
14
17
  references[ref_name] = ref_value
15
18
  end
16
19
  if references.size > 0
17
- content.scan(/.*(?<!\\)\|.*/) do |result|
20
+ content.scan(/[^\n]*(?<!\\)\|[^\n]*/) do |result|
18
21
  references.each do |key, val|
19
- replace = result.gsub(/\[(.*)\]\s*\[#{key}\]/, "[\1](#{val})")
22
+ replace = result.gsub(/\[([^\n]*)\]\s*\[#{key}\]/, "[\1](#{val})")
20
23
  next if result == replace
21
24
  content = content.gsub(result, replace)
22
25
  end
@@ -24,21 +27,37 @@ module Jekyll::Spaceship
24
27
  end
25
28
 
26
29
  # pre-handle row-span
27
- content = content.gsub(/(?<!\\)(\|.*\\\s*)\|\s*\n/, "\\1\n")
30
+ content = content.gsub(/(?<!\\)(\|[^\n]*\\\s*)\|\s*\n/, "\\1\n")
28
31
 
29
32
  # escape | and :
30
33
  content = content.gsub(/\|(?=\|)/, '\\|')
31
- .gsub(/\\:(?=.*?(?<!\\)\|)/, '\\\\\\\\:')
32
- .gsub(/((?<!\\)\|.*?)(\\:)/, '\1\\\\\\\\:')
34
+ .gsub(/\\:(?=[^\n]*?(?<!\\)\|)/, '\\\\\\\\:')
35
+ .gsub(/((?<!\\)\|[^\n]*?)(\\:)/, '\1\\\\\\\\:')
33
36
 
34
37
  # escape * and _ and $ etc.
35
- content.scan(/.*(?<!\\)\|.*/) do |result|
38
+ content.scan(/[^\n]*(?<!\\)\|[^\n]*/) do |result|
39
+ # skip for math expression within pipeline
40
+ next unless result
41
+ .gsub(/((?<!\\)\${1,2})[^\n]*?\1/, '')
42
+ .match(/(?<!\\)\|/)
36
43
  replace = result.gsub(
37
- /(?<!(?<!\\)\\)(\*|\$|\[|\(|\"|_)/,
38
- '\\\\\\\\\1')
44
+ /(?<!(?<!\\)\\)(\*|\$|\[|\(|\"|_)/, '\\\\\\\\\1')
39
45
  next if result == replace
40
46
  content = content.gsub(result, replace)
41
47
  end
48
+
49
+ # pre-handle attribute list (AL)
50
+ ATTR_LIST_REFS.clear()
51
+ content.scan(ATTR_LIST_PATTERN) do |result|
52
+ ref = result[1]
53
+ list = result[2]
54
+ next if ref.nil?
55
+ if ATTR_LIST_REFS.has_key? ref
56
+ ATTR_LIST_REFS[ref] += list
57
+ else
58
+ ATTR_LIST_REFS[ref] = list
59
+ end
60
+ end
42
61
  content
43
62
  end
44
63
 
@@ -50,6 +69,7 @@ module Jekyll::Spaceship
50
69
 
51
70
  # handle each table
52
71
  doc.css('table').each do |table|
72
+ next if table.ancestors('code, pre').size > 0
53
73
  rows = table.css('tr')
54
74
  data.table = table
55
75
  data.rows = rows
@@ -65,6 +85,7 @@ module Jekyll::Spaceship
65
85
  handle_multi_rows(data)
66
86
  handle_text_align(data)
67
87
  handle_rowspan(data)
88
+ handle_attr_list(data)
68
89
  end
69
90
  end
70
91
  rows.each do |row|
@@ -157,7 +178,7 @@ module Jekyll::Spaceship
157
178
  if scope.table.multi_row_cells != cells and scope.table.multi_row_start
158
179
  for i in 0...scope.table.multi_row_cells.count do
159
180
  multi_row_cell = scope.table.multi_row_cells[i]
160
- multi_row_cell.inner_html += "<br>#{cells[i].inner_html}"
181
+ multi_row_cell.inner_html += "\n<br>\n#{cells[i].inner_html}"
161
182
  end
162
183
  row.remove
163
184
  end
@@ -182,7 +203,7 @@ module Jekyll::Spaceship
182
203
  span_cell = scope.table.span_row_cells[scope.row.col_index]
183
204
  if span_cell and cell.content.match(/^\s*\^{2}/)
184
205
  cell.content = cell.content.gsub(/^\s*\^{2}/, '')
185
- span_cell.inner_html += "<br>#{cell.inner_html}"
206
+ span_cell.inner_html += "\n<br>\n#{cell.inner_html}"
186
207
  rowspan = span_cell.get_attribute('rowspan') || 1
187
208
  rowspan = rowspan.to_i + 1
188
209
  span_cell.set_attribute('rowspan', "#{rowspan}")
@@ -231,6 +252,52 @@ module Jekyll::Spaceship
231
252
  cell.set_attribute('style', style)
232
253
  end
233
254
 
255
+ # Examples:
256
+ # {:ref-name: .cls1 title="hello" }
257
+ # {: #id ref-name data="world" }
258
+ # {: #id title="hello" }
259
+ # {: .cls style="color: #333" }
260
+ def handle_attr_list(data)
261
+ cell = data.cell
262
+ content = cell.inner_html
263
+ # inline attribute list(IAL) handler
264
+ ial_handler = ->(list) do
265
+ list.scan(/(\S+)=("|')(.*?)\2|(\S+)/) do |attr|
266
+ key = attr[0]
267
+ val = attr[2]
268
+ single = attr[3]
269
+ if !key.nil?
270
+ val = (cell.get_attribute(key) || '') + val
271
+ cell.set_attribute(key, val)
272
+ elsif !single.nil?
273
+ if single.start_with? '#'
274
+ key = 'id'
275
+ val = single[1..-1]
276
+ elsif single.start_with? '.'
277
+ key = 'class'
278
+ val = cell.get_attribute(key) || ''
279
+ val += (val.size.zero? ? '' : ' ') + single[1..-1]
280
+ elsif ATTR_LIST_REFS.has_key? single
281
+ ial_handler.call ATTR_LIST_REFS[single]
282
+ end
283
+ unless key.nil?
284
+ cell.set_attribute(key, val)
285
+ end
286
+ end
287
+ end
288
+ end
289
+ # handle attribute list
290
+ content.scan(ATTR_LIST_PATTERN) do |result|
291
+ ref = result[1]
292
+ list = result[2]
293
+ # handle inline attribute list
294
+ ial_handler.call list if ref.nil?
295
+ # remove attr_list
296
+ content = content.sub(result[0], '')
297
+ end
298
+ cell.inner_html = content
299
+ end
300
+
234
301
  def handle_format(data)
235
302
  cell = data.cell
236
303
  cvter = self.converter('markdown')
@@ -238,8 +305,14 @@ module Jekyll::Spaceship
238
305
  content = cell.inner_html
239
306
  .gsub(/(?<!\\)\|/, '\\|')
240
307
  .gsub(/^\s+|\s+$/, '')
308
+ .gsub(/&lt;/, '<')
309
+ .gsub(/&gt;/, '>')
241
310
  content = cvter.convert(content)
242
- cell.inner_html = Nokogiri::HTML.fragment(content)
311
+ content = Nokogiri::HTML.fragment(content)
312
+ if content.children.first&.name == 'p'
313
+ content = content.children
314
+ end
315
+ cell.inner_html = content.inner_html
243
316
  end
244
317
  end
245
318
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Spaceship
5
- VERSION = "0.8.1"
5
+ VERSION = "0.8.6"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-spaceship
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - jeffreytse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-25 00:00:00.000000000 Z
11
+ date: 2020-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -169,8 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
169
  - !ruby/object:Gem::Version
170
170
  version: '0'
171
171
  requirements: []
172
- rubyforge_project:
173
- rubygems_version: 2.7.7
172
+ rubygems_version: 3.0.8
174
173
  signing_key:
175
174
  specification_version: 4
176
175
  summary: A Jekyll plugin to provide powerful supports for table, mathjax, plantuml,