jekyll-spaceship 0.6.0 → 0.7.1

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: 2abfd1cf82bdc535d470ecc9e5397dca1e1e82456897fdf7ee2035bb62ae19f4
4
- data.tar.gz: bab5a4df56d4ac49a1f9b2838b9a05d1ef5e720e9a0cb7838cc9db23a0a211a0
3
+ metadata.gz: 38acd43c5d713728eb8beefc21a41ccff0404503138429c5fc695d5a92b0fbb5
4
+ data.tar.gz: aa0e6b588b3f778ef332ec83604ba26a3d238de34bfb458a7f85d1c3b006c0f5
5
5
  SHA512:
6
- metadata.gz: ddb2c1c75889ada85e605ee06db3f67aa11392c2774d8db3115ced6fafecd4dcdb3d60bef85677502f511926cfaf358227bfe12aad10d622a0726e7e9d3802a2
7
- data.tar.gz: 00c0d8b4656c3c14db2a78742033cb7cb9d0b41d86bce8a45b7f332175ce1ec24a55aa32c3bf811d506b4ba07a354ae391ac46f06f71d2e5a790f0025648eae1
6
+ metadata.gz: 53ad3ff1458d8b5a1cde457ec7fa34672680f334fddb1613ebec356a461f0c7217faea14e361f0e022b3dceb7789d0ff7fa5d069d95c190343008d9485630f76
7
+ data.tar.gz: 97606894a42e2fa2fc34e66fb9b3cbb6013587696ed70bf8153a9b5bd2cf81f6444ee9337d13d672f3c3afe3c504039fd754b51deee9324c3df6287bee7c6b53
data/README.md CHANGED
@@ -64,8 +64,8 @@
64
64
 
65
65
  <div align="center">
66
66
  <h4>
67
- <a href="#requirements">Requirements</a> |
68
67
  <a href="#installation">Install</a> |
68
+ <a href="#configuration">Config</a> |
69
69
  <a href="#usage">Usage</a> |
70
70
  <a href="#credits">Credits</a> |
71
71
  <a href="#license">License</a>
@@ -80,10 +80,10 @@
80
80
  <br>
81
81
 
82
82
 
83
- A Jekyll plugin to provide powerful supports for table, mathjax, plantuml, emoji, youtube, vimeo, dailymotion, etc.
83
+ Spaceship is a minimalistic, powerful and extremely customizable [Jekyll](https://jekyllrb.com/) plugin. It combines everything you may need for convenient work, without unnecessary complications, like a real spaceship.
84
84
 
85
85
  <p align="center">
86
- <img alt="Jekyll Spaceship Demo" src="https://user-images.githubusercontent.com/9413601/82250463-15451780-997e-11ea-8809-f411586d9508.gif" alt="Donate (Ko-fi)" />
86
+ <img alt="Jekyll Spaceship Demo" src="https://user-images.githubusercontent.com/9413601/82250463-15451780-997e-11ea-8809-f411586d9508.gif" />
87
87
  </p>
88
88
 
89
89
  **💡 Tip:** I hope you enjoy using this plugin. If you like this project, **a little star** for it is your way make a clear statement: **My work is valued**. I would appreciate your support! _Thank you!_
@@ -93,6 +93,7 @@ A Jekyll plugin to provide powerful supports for table, mathjax, plantuml, emoji
93
93
 
94
94
  - [Requirements](#requirements)
95
95
  - [Installation](#installation)
96
+ - [Configuration](#configuration)
96
97
  - [Usage](#usage)
97
98
  - [1. Table Usage](#1-table-usage)
98
99
  - [1.1 Rowspan and Colspan](#rowspan-and-colspan)
@@ -108,10 +109,13 @@ A Jekyll plugin to provide powerful supports for table, mathjax, plantuml, emoji
108
109
  - [4.1 Youtube Usage](#youtube-usage)
109
110
  - [4.2 Vimeo Usage](#vimeo-usage)
110
111
  - [4.3 DailyMotion Usage](#dailymotion-usage)
112
+ - [4.4 General Video Usage](#general-video-usage)
111
113
  - [5. Hybrid HTML with Markdown](#5-hybrid-html-with-markdown)
112
114
  - [6. Markdown Polyfill](#6-markdown-polyfill)
113
115
  - [6.1 Escape Ordered List](#escape-ordered-list)
114
116
  - [7. Emoji Usage](#7-emoji-usage)
117
+ - [7.1 Emoji Customizing](#71-emoji-customizing)
118
+ - [8. Modifying Element Usage](#8-modifying-element-usage)
115
119
  - [Credits](#credits)
116
120
  - [Contributing](#contributing)
117
121
  - [License](#license)
@@ -137,6 +141,34 @@ plugins:
137
141
 
138
142
  **💡 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))
139
143
 
144
+ ## Configuration
145
+
146
+ This plugin runs with the following configuration options by default. Alternative settings for these options can be explicitly specified in the configuration file `_config.yml`.
147
+
148
+ ```yml
149
+ # Where things are
150
+ jekyll-spaceship:
151
+ processors:
152
+ - table-processor
153
+ - mathjax-processor
154
+ - plantuml-processor
155
+ - polyfill-processor
156
+ - video-processor
157
+ - emoji-processor
158
+ - element-processor
159
+ mathjax-processor:
160
+ src: //cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML
161
+ config:
162
+ tex2jax:
163
+ inlineMath:
164
+ - ['$','$']
165
+ - ['\(','\)']
166
+ plantuml-processor:
167
+ src: http://www.plantuml.com/plantuml/png/
168
+ emoji-processor:
169
+ src: https://github.githubassets.com/images/icons/emoji/
170
+ ```
171
+
140
172
  ## Usage
141
173
 
142
174
  ### 1. Table Usage
@@ -548,6 +580,7 @@ While its not possible to embed a video in markdown, the best and easiest way is
548
580
  - Youtube
549
581
  - Vimeo
550
582
  - DailyMotion
583
+ - General Video ( mp4 | avi | webm | ogg | ogv | 3gp | flv | mov ... )
551
584
 
552
585
  There are two ways to embed a video in your Jekyll blog page:
553
586
 
@@ -606,6 +639,21 @@ the link as below:
606
639
  ![](https://dai.ly/x7tgcev?width=100%&height=400)
607
640
  ```
608
641
 
642
+ #### General Video Usage
643
+
644
+ ```markdown
645
+ ![](//www.html5rocks.com/en/tutorials/video/basics/devstories.webm)
646
+ ```
647
+
648
+ ```markdown
649
+ ![](//techslides.com/demos/sample-videos/small.ogv?allow=autoplay)
650
+ ```
651
+
652
+ ```markdown
653
+ ![](//techslides.com/demos/sample-videos/small.mp4?width=400)
654
+ ```
655
+
656
+
609
657
  ### 5. Hybrid HTML with Markdown
610
658
 
611
659
  As markdown is not only a lightweight markup language with plain-text-formatting syntax, but also an easy-to-read and easy-to-write plain text format, so writing a hybrid HTML with markdown is an awesome choice.
@@ -697,12 +745,114 @@ I give this plugin two :+1:!
697
745
 
698
746
  I give this plugin two :+1:!
699
747
 
748
+ #### 7.1 Emoji Customizing
749
+
750
+ If you'd like to serve emoji images locally, or use a custom emoji source, you can specify so in your `_config.yml` file:
751
+
752
+ ```yml
753
+ jekyll-spaceship:
754
+ emoji-processor:
755
+ src: "/assets/images/emoji"
756
+ ```
757
+
758
+ See the [Gemoji](https://github.com/github/gemoji) documentation for generating image files.
759
+
760
+ ### 8. Modifying Element Usage
761
+
762
+ It allows us to modify elements via `CSS3 selectors`. Through it you can easily
763
+ modify the attributes of an element tag, replace the children nodes and so on,
764
+ it's very flexible, but here is example usage for modifying a document:
765
+
766
+ ```yml
767
+ # Here is a comprehensive example
768
+ jekyll-spaceship:
769
+ element-processor:
770
+ css:
771
+ - a: '<h1>Test</h1>' # Replace all `a` tags (String Style)
772
+ - ['a.link1', 'a.link2']: # Replace all `a.link1`, `a.link2` tags (Hash Style)
773
+ name: img # Replace element tag name
774
+ props: # Replace element properties
775
+ title: Good image # Add a title attribute
776
+ src: ['(^.*$)', '\0?a=123'] # Add query string to src attribute by regex pattern
777
+ style: # Add style attribute (Hash Style)
778
+ color: red
779
+ font-size: '1.2em'
780
+ children: # Add children to the element
781
+ - # First empty for adding after the last child node
782
+ - "<span>Google</span>" # First child node (String Style)
783
+ - # Middle empty for wrapping the children nodes
784
+ - name: span # Second child node (Hash Style)
785
+ props:
786
+ prop1: "1" # Custom property1
787
+ prop2: "2" # Custom property2
788
+ prop3: "3" # Custom property3
789
+ children: # Add nested chidren nodes
790
+ - "<span>Jekyll</span>" # First child node (String Style)
791
+ - name: span # Second child node (Hash Style)
792
+ props: # Add attributes to child node (Hash Style)
793
+ prop1: "a"
794
+ prop2: "b"
795
+ prop3: "c"
796
+ children: "<b>Yap!</b>" # Add children nodes (String Style)
797
+ - # Last empty for adding before the first child node
798
+ - a.link: '<a href="//t.com">Link</a>' # Replace all `a.link` tags (String Style)
799
+ - 'h1#title': # Replace `h1#title` tags (Hash Style)
800
+ children: I'm a title! # Replace inner html to new text
801
+ ```
802
+
803
+ #### Example 1
804
+
805
+ Automatically adds a `target="_blank" rel="noopener noreferrer"` attribute to all external links in Jekyll's content.
806
+
807
+ ```yml
808
+ jekyll-spaceship:
809
+ element-processor:
810
+ css:
811
+ - a: # Replce all `a` tags
812
+ props:
813
+ class: ['(^.*$)', '\0 ext-link'] # Add `ext-link` to class by regex pattern
814
+ target: _blank # Replace `target` value to `_blank`
815
+ rel: noopener noreferrer # Replace `rel` value to `noopener noreferrer`
816
+ ```
817
+
818
+ #### Example 2
819
+
820
+ Automatically adds `loading="lazy"` to `img` and `iframe` tags to natively load lazily.
821
+ [Browser support](https://caniuse.com/#feat=loading-lazy-attr) is growing. If a browser does not support the `loading` attribute, it will load the resource just like it would normally.
822
+
823
+ ```yml
824
+ jekyll-spaceship:
825
+ element-processor:
826
+ css:
827
+ - a: # Replce all `a` tags
828
+ props: #
829
+ loading: lazy # Replace `lading` value to `lazy`
830
+ ```
831
+
832
+ In case you want to prevent loading some images/iframes lazily, add
833
+ `loading="eager"` to their tags. This might be useful to prevent flickering of
834
+ images during navigation (e.g. the site's logo).
835
+
836
+ See the following examples to prevent lazy loading.
837
+
838
+ ```yml
839
+ jekyll-spaceship:
840
+ element-processor:
841
+ css:
842
+ - a: # Replce all `a` tags
843
+ props: #
844
+ loading: eager # Replace `loading` value to `eager`
845
+ ```
846
+
847
+
700
848
  ## Credits
701
849
 
702
850
  - [Jekyll](https://github.com/jekyll/jekyll) - A blog-aware static site generator in Ruby.
703
851
  - [MultiMarkdown](https://fletcher.github.io/MultiMarkdown-6) - Lightweight markup processor to produce HTML, LaTeX, and more.
704
852
  - [markdown-it-multimd-table](https://github.com/RedBug312/markdown-it-multimd-table) - Multimarkdown table syntax plugin for markdown-it markdown parser.
705
853
  - [jmoji](https://github.com/jekyll/jemoji) - GitHub-flavored emoji plugin for Jekyll.
854
+ - [jekyll-target-blank](https://github.com/keithmifsud/jekyll-target-blank) - Automatically opens external links in a new browser for Jekyll Pages, Posts and Docs.
855
+ - [jekyll-loading-lazy](https://github.com/gildesmarais/jekyll-loading-lazy) - Automatically adds loading="lazy" to img and iframe tags to natively load lazily.
706
856
 
707
857
  ## Contributing
708
858
 
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.version = Jekyll::Spaceship::VERSION
10
10
  spec.authors = ["jeffreytse"]
11
11
  spec.email = ["jeffreytse.mail@gmail.com"]
12
- spec.summary = "A Jekyll plugin to provide powerful supports for table, mathjax, plantuml, emoji, youtube, vimeo, dailymotion, etc."
12
+ spec.summary = "A Jekyll plugin to provide powerful supports for table, mathjax, plantuml, emoji, video, youtube, vimeo, dailymotion, etc."
13
13
  spec.homepage = "https://github.com/jeffreytse/jekyll-spaceship"
14
14
  spec.license = "MIT"
15
15
 
@@ -12,20 +12,9 @@ module Jekyll::Spaceship
12
12
  'plantuml-processor',
13
13
  'polyfill-processor',
14
14
  'video-processor',
15
- 'emoji-processor'
16
- ],
17
- 'mathjax-processor' => {
18
- 'src' => '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML',
19
- 'config' => {
20
- 'tex2jax' => { 'inlineMath' => [['$','$'], ['\\(','\\)']] }
21
- }
22
- },
23
- 'plantuml-processor' => {
24
- 'src' => 'http://www.plantuml.com/plantuml/png/'
25
- },
26
- 'emoji-processor' => {
27
- 'src' => 'https://github.githubassets.com/images/icons/emoji/'
28
- }
15
+ 'emoji-processor',
16
+ 'element-processor'
17
+ ]
29
18
  }
30
19
 
31
20
  @@store = {}
@@ -43,14 +32,16 @@ module Jekyll::Spaceship
43
32
  first.merge(second.to_h, &merger)
44
33
  end
45
34
 
46
- def self.store(section)
47
- @@store[section]
35
+ def self.store(section, default)
36
+ return if @@store[section].nil?
37
+ return @@store[section] if default.nil?
38
+ @@store[section] = deep_merge(default, @@store[section])
48
39
  end
49
40
 
50
- def self.load(filename = '_config.yml')
41
+ def self.load(config = self.site_config)
51
42
  config = deep_merge(
52
43
  { CONFIG_NAME => DEFAULT_CONFIG },
53
- YAML.load_file(File.expand_path(filename))
44
+ config
54
45
  )[CONFIG_NAME]
55
46
  @@store = config
56
47
  self.use_processors(config)
@@ -61,5 +52,9 @@ module Jekyll::Spaceship
61
52
  Register.use processor
62
53
  end
63
54
  end
55
+
56
+ def self.site_config
57
+ Jekyll.sites.first.config
58
+ end
64
59
  end
65
60
  end
@@ -41,7 +41,8 @@ module Jekyll::Spaceship
41
41
  self.initialize_register
42
42
  self.initialize_exclusions
43
43
  @logger = Logger.new(self.name)
44
- @config = Config.store(self.filename)
44
+ @config = Config.store(self.filename, self.class.config)
45
+ @handled_files = {}
45
46
  end
46
47
 
47
48
  def initialize_priority
@@ -56,7 +57,7 @@ module Jekyll::Spaceship
56
57
  def initialize_register
57
58
  if @@_registers.size.zero?
58
59
  self.class.register :pages, :pre_render, :post_render
59
- self.class.register :posts, :pre_render, :post_render
60
+ self.class.register :documents, :pre_render, :post_render
60
61
  end
61
62
  @registers = Array.new @@_registers
62
63
  @@_registers.clear
@@ -82,6 +83,9 @@ module Jekyll::Spaceship
82
83
  @@_exclusions = types
83
84
  end
84
85
 
86
+ def self.config
87
+ end
88
+
85
89
  def process?
86
90
  Type.html?(output_ext) or Type.markdown?(ext)
87
91
  end
@@ -140,7 +144,10 @@ module Jekyll::Spaceship
140
144
  end
141
145
 
142
146
  def on_handled
143
- file = page.path.gsub(/.*_posts\//, '')
147
+ source = page.site.source
148
+ file = page.path.sub(/^#{source}\//, '')
149
+ return if @handled_files.has_key? file
150
+ @handled_files[file] = true
144
151
  logger.log file
145
152
  end
146
153
 
@@ -149,13 +156,13 @@ module Jekyll::Spaceship
149
156
  @exclusions.each do |type|
150
157
  regex = nil
151
158
  if type == :code
152
- regex = /(`{3}\s*(\w*)((?:.|\n)*?)`{3})/
159
+ regex = /((`+)\s*(\w*)((?:.|\n)*?)\2)/
153
160
  end
154
161
  next if regex.nil?
155
162
  content.scan(regex) do |match_data|
156
163
  match = match_data[0]
157
164
  id = @exclusion_store.size
158
- content = content.gsub(match, "[//]: JEKYLL_EXCLUDE_##{id}")
165
+ content = content.sub(match, "[JEKYLL@#{object_id}@#{id}]")
159
166
  @exclusion_store.push match
160
167
  end
161
168
  end
@@ -166,7 +173,7 @@ module Jekyll::Spaceship
166
173
  while @exclusion_store.size > 0
167
174
  match = @exclusion_store.pop
168
175
  id = @exclusion_store.size
169
- content = content.gsub("[//]: JEKYLL_EXCLUDE_##{id}", match)
176
+ content = content.sub("[JEKYLL@#{object_id}@#{id}]", match)
170
177
  end
171
178
  @exclusion_store = []
172
179
  content
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nokogiri'
4
+
5
+ module Jekyll::Spaceship
6
+ class ElementProcessor < Processor
7
+ priority :lowest
8
+
9
+ def self.config
10
+ { 'css' => [] }
11
+ end
12
+
13
+ def on_handle_html(content)
14
+ return content if config['css'].size.zero?
15
+
16
+ # use nokogiri to parse html content
17
+ doc = Nokogiri::HTML(content)
18
+
19
+ # handle each css pattern
20
+ config['css'].each do |data|
21
+ data.each do |key, val|
22
+ key = [key] if key.kind_of? String
23
+ key.each do |pattern|
24
+ nodes = doc.css(pattern)
25
+ nodes.each do |element|
26
+ handle_css_pattern({
27
+ :doc => doc,
28
+ :element => element,
29
+ :data => val
30
+ })
31
+ end
32
+ self.handled = true
33
+ end
34
+ end
35
+ end
36
+
37
+ doc.to_html
38
+ end
39
+
40
+ def handle_css_pattern(data)
41
+ doc = data[:doc]
42
+ element = data[:element]
43
+ data = data[:data]
44
+
45
+ if data.kind_of? String
46
+ element.replace Nokogiri::HTML.fragment(data)
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({
71
+ :doc => doc,
72
+ :data => data['children']
73
+ })
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
+ end
104
+ end
105
+
106
+ def create_children(data)
107
+ doc = data[:doc]
108
+ data = data[:data]
109
+ root = Nokogiri::HTML.fragment("")
110
+
111
+ data = [data] unless data.kind_of? Array
112
+ data.each do |child_data|
113
+ node = self.create_element({
114
+ :doc => doc,
115
+ :data => child_data
116
+ })
117
+ next if node.nil?
118
+ unless child_data['children'].nil?
119
+ node.children = self.create_children({
120
+ :doc => doc,
121
+ :data => child_data['children']
122
+ })
123
+ end
124
+ root.add_child node
125
+ end
126
+ root.children
127
+ end
128
+
129
+ def create_element(data)
130
+ doc = data[:doc]
131
+ data = data[:data]
132
+
133
+ return if data.nil?
134
+ return Nokogiri::HTML.fragment(data) if data.kind_of? String
135
+ return if data['name'].nil?
136
+
137
+ # create node
138
+ node = doc.create_element(data['name'])
139
+
140
+ # set props
141
+ data['props']&.each do |prop, val|
142
+ if val.kind_of? Hash
143
+ result = []
144
+ val.each { |k, v| result.push "#{k}: #{v}" }
145
+ val = result.join(";")
146
+ end
147
+ node.set_attribute(prop, val)
148
+ end
149
+ node
150
+ end
151
+ end
152
+ end
@@ -6,6 +6,10 @@ require 'gemoji'
6
6
 
7
7
  module Jekyll::Spaceship
8
8
  class EmojiProcessor < Processor
9
+ def self.config
10
+ { 'src' => 'https://github.githubassets.com/images/icons/emoji/' }
11
+ end
12
+
9
13
  def on_handle_html(content)
10
14
  # handle emoji markup
11
15
  content.scan(/:([\w\d+-]+):/) do |match|
@@ -18,16 +22,16 @@ module Jekyll::Spaceship
18
22
 
19
23
  content = content.gsub(
20
24
  /(?<!\=")\s*:#{emoji_name}:\s*(?!"\s)/,
21
- "<img class=\"emoji\" \
22
- title=\":#{emoji.name}:\" \
23
- alt=\":#{emoji.name}:\" \
24
- raw=\"#{emoji.raw}\" \
25
- src=\"#{config['src']}#{emoji.image_filename}\" \
26
- style=\"vertical-align: middle; \
27
- max-width: 1em; visibility: hidden;\" \
28
- onload=\"this.style.visibility='visible'\" \
29
- onerror=\"this.replaceWith(this.getAttribute('raw'))\"> \
30
- </img>"
25
+ "<img class=\"emoji\""\
26
+ " title=\":#{emoji.name}:\""\
27
+ " alt=\":#{emoji.name}:\""\
28
+ " raw=\"#{emoji.raw}\""\
29
+ " src=\"#{config['src']}#{emoji.image_filename}\""\
30
+ " style=\"vertical-align: middle;"\
31
+ " max-width: 1em; visibility: hidden;\""\
32
+ " onload=\"this.style.visibility='visible'\""\
33
+ " onerror=\"this.replaceWith(this.getAttribute('raw'))\">"\
34
+ "</img>"
31
35
  )
32
36
  end
33
37
  content
@@ -4,6 +4,15 @@ require "nokogiri"
4
4
 
5
5
  module Jekyll::Spaceship
6
6
  class MathjaxProcessor < Processor
7
+ def self.config
8
+ {
9
+ 'src' => '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML',
10
+ 'config' => {
11
+ 'tex2jax' => { 'inlineMath' => [['$','$'], ['\\(','\\)']] }
12
+ }
13
+ }
14
+ end
15
+
7
16
  def process?
8
17
  return true if Type.html?(output_ext)
9
18
  end
@@ -7,17 +7,30 @@ module Jekyll::Spaceship
7
7
  class PlantumlProcessor < Processor
8
8
  exclude :none
9
9
 
10
+ PLANTUML_PATTERNS = [
11
+ /(\\?(@startuml)((?:.|\n)*?)@enduml)/,
12
+ /((`{3,})\s*plantuml((?:.|\n)*?)\2)/
13
+ ]
14
+
15
+ def self.config
16
+ { 'src' => 'http://www.plantuml.com/plantuml/png/' }
17
+ end
18
+
10
19
  def on_handle_markdown(content)
11
20
  # match default plantuml block and code block
12
- pattern = Regexp.union(
13
- /(\\?@startuml((?:.|\n)*?)@enduml)/,
14
- /(`{3}\s*plantuml((?:.|\n)*?)`{3})/
15
- )
21
+ PLANTUML_PATTERNS.each do |pattern|
22
+ content = handle_plantuml_block(pattern, content)
23
+ end
16
24
 
25
+ # handle escape default plantuml block
26
+ content.gsub(/\\(@startuml|@enduml)/, '\1')
27
+ end
28
+
29
+ def handle_plantuml_block(pattern, content)
17
30
  content.scan pattern do |match|
18
31
  match = match.select { |m| not m.nil? }
19
32
  block = match[0]
20
- code = match[1]
33
+ code = match[2]
21
34
 
22
35
  # skip escape default plantuml block
23
36
  if block.match(/(^\\@startuml|\\@enduml$)/)
@@ -31,9 +44,7 @@ module Jekyll::Spaceship
31
44
  handle_plantuml(code)
32
45
  )
33
46
  end
34
-
35
- # handle escape default plantuml block
36
- content.gsub(/\\(@startuml|@enduml)/, '\1')
47
+ content
37
48
  end
38
49
 
39
50
  def handle_plantuml(code)
@@ -157,7 +157,7 @@ module Jekyll::Spaceship
157
157
  if scope.table.multi_row_cells != cells and scope.table.multi_row_start
158
158
  for i in 0...scope.table.multi_row_cells.count do
159
159
  multi_row_cell = scope.table.multi_row_cells[i]
160
- multi_row_cell.content += " \n#{cells[i].content}"
160
+ multi_row_cell.inner_html += "<br>#{cells[i].inner_html}"
161
161
  end
162
162
  row.remove
163
163
  end
@@ -182,7 +182,7 @@ module Jekyll::Spaceship
182
182
  span_cell = scope.table.span_row_cells[scope.row.col_index]
183
183
  if span_cell and cell.content.match(/^\s*\^{2}/)
184
184
  cell.content = cell.content.gsub(/^\s*\^{2}/, '')
185
- span_cell.content += " \n#{cell.content}"
185
+ span_cell.inner_html += "<br>#{cell.inner_html}"
186
186
  rowspan = span_cell.get_attribute('rowspan') || 1
187
187
  rowspan = rowspan.to_i + 1
188
188
  span_cell.set_attribute('rowspan', "#{rowspan}")
@@ -207,11 +207,12 @@ module Jekyll::Spaceship
207
207
  align += 2
208
208
  end
209
209
 
210
+ # handle text align
211
+ return if align == 0
212
+
210
213
  # handle escape colon
211
214
  cell.content = cell.content.gsub(/\\:/, ':')
212
215
 
213
- # handle text align
214
- return if align == 0
215
216
  style = cell.get_attribute('style')
216
217
  if align == 1
217
218
  align = 'text-align: left'
@@ -234,8 +235,10 @@ module Jekyll::Spaceship
234
235
  cell = data.cell
235
236
  cvter = self.converter('markdown')
236
237
  return if cvter.nil?
237
- content = cell.content.gsub(/(?<!\\)\|/, '\\|')
238
- content = cvter.convert(content.strip)
238
+ content = cell.inner_html
239
+ .gsub(/(?<!\\)\|/, '\\|')
240
+ .gsub(/^\s+|\s+$/, '')
241
+ content = cvter.convert(content)
239
242
  cell.inner_html = Nokogiri::HTML.fragment(content)
240
243
  end
241
244
  end
@@ -5,11 +5,23 @@ require 'uri'
5
5
  module Jekyll::Spaceship
6
6
  class VideoProcessor < Processor
7
7
  def on_handle_markdown(content)
8
+ content = handle_normal_video(content)
8
9
  content = handle_youtube(content)
9
10
  content = handle_vimeo(content)
10
11
  content = handle_dailymotion(content)
11
12
  end
12
13
 
14
+ # Examples:
15
+ # ![video](//www.html5rocks.com/en/tutorials/video/basics/devstories.webm)
16
+ # ![video](//techslides.com/demos/sample-videos/small.ogv?allow=autoplay)
17
+ # ![video](//techslides.com/demos/sample-videos/small.mp4?width=400)
18
+ def handle_normal_video(content)
19
+ handle_video(content, {
20
+ host: '(https?:)?\\/\\/.*\\/',
21
+ id: '(.+?\\.(avi|mp4|webm|ogg|ogv|flv|mkv|mov|wmv|3gp|rmvb|asf))',
22
+ })
23
+ end
24
+
13
25
  # Examples:
14
26
  # ![youtube](https://www.youtube.com/watch?v=XA2WjJbmmoM "title")
15
27
  # ![youtube](http://www.youtube.com/embed/w-m_yZCLF5Q)
@@ -29,9 +41,7 @@ module Jekyll::Spaceship
29
41
  handle_video(content, {
30
42
  host: '(https?:)?\\/\\/vimeo\\.com\\/',
31
43
  id: '([0-9]+)',
32
- iframe_url: "https://player.vimeo.com/video/",
33
- width: 600,
34
- height: 350
44
+ iframe_url: "https://player.vimeo.com/video/"
35
45
  })
36
46
  end
37
47
 
@@ -77,25 +87,30 @@ module Jekyll::Spaceship
77
87
  next true if v == id or v == ''
78
88
  end
79
89
 
80
- width = qs['width'] || data[:width] || 600
81
- height = qs['height'] || data[:height] || 400
82
- style = "max-width: 100%" if width.nil?
90
+ css_id = qs['id'] || "video-#{id}"
91
+ css_class = qs['class'] || 'video'
92
+ width = qs['width'] || data[:width] || "100%"
93
+ height = qs['height'] || data[:height] || 350
94
+ frameborder = qs['frameborder'] || 0
95
+ style = qs['style'] || 'max-width: 600px'
96
+ allow = qs['allow'] || "encrypted-media; picture-in-picture"
83
97
 
84
- url = URI("#{iframe_url}#{id}").tap do |v|
98
+ url = URI(iframe_url ? "#{iframe_url}#{id}" : url).tap do |v|
85
99
  v.query = URI.encode_www_form(qs) if qs.size > 0
86
100
  end
87
101
 
88
- html = "<iframe \
89
- class=\"video\" \
90
- src=\"#{url}\" \
91
- title=\"#{title}\" \
92
- width=\"#{width}\" \
93
- height=\"#{height}\" \
94
- style=\"#{style}\" \
95
- allow=\"autoplay; encrypted-media\" \
96
- frameborder=\"0\" \
97
- allowfullscreen=\"\">\
98
- </iframe>"
102
+ html = "<iframe"\
103
+ " id=\"#{css_id}\""\
104
+ " class=\"#{css_class}\""\
105
+ " src=\"#{url}\""\
106
+ " title=\"#{title}\""\
107
+ " width=\"#{width}\""\
108
+ " height=\"#{height}\""\
109
+ " style=\"#{style}\""\
110
+ " allow=\"#{allow}\""\
111
+ " frameborder=\"#{frameborder}\""\
112
+ " allowfullscreen>" \
113
+ "</iframe>"
99
114
 
100
115
  content = content.gsub(match_data[0], html)
101
116
  self.handled = true
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Spaceship
5
- VERSION = "0.6.0"
5
+ VERSION = "0.7.1"
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.6.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - jeffreytse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-26 00:00:00.000000000 Z
11
+ date: 2020-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -137,6 +137,7 @@ files:
137
137
  - lib/jekyll-spaceship/cores/processor.rb
138
138
  - lib/jekyll-spaceship/cores/register.rb
139
139
  - lib/jekyll-spaceship/cores/type.rb
140
+ - lib/jekyll-spaceship/processors/element-processor.rb
140
141
  - lib/jekyll-spaceship/processors/emoji-processor.rb
141
142
  - lib/jekyll-spaceship/processors/mathjax-processor.rb
142
143
  - lib/jekyll-spaceship/processors/plantuml-processor.rb
@@ -172,5 +173,5 @@ rubygems_version: 2.7.7
172
173
  signing_key:
173
174
  specification_version: 4
174
175
  summary: A Jekyll plugin to provide powerful supports for table, mathjax, plantuml,
175
- emoji, youtube, vimeo, dailymotion, etc.
176
+ emoji, video, youtube, vimeo, dailymotion, etc.
176
177
  test_files: []