jekyll-spaceship 0.6.3 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +47 -0
- data/lib/jekyll-spaceship/cores/config.rb +3 -2
- data/lib/jekyll-spaceship/processors/element-processor.rb +152 -0
- data/lib/jekyll-spaceship/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38113b9fb933fde7dbf9a201839d3529f22e27687baa2c8e5768097b47eb7eef
|
4
|
+
data.tar.gz: acb2c8d069864444b6d15ad235c13322e9a817ebbab83e8eab9058060979c256
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1ae51763f919f940079fe169d7c05889a234f69a42d9369cce5858670605a3b6bb88839162d4ce95ce8cc07d8cd035228069f1bc4e189bad3ca41ee13623cc85
|
7
|
+
data.tar.gz: 2f5dda310b60fd8d69460299a81844aa791fd0877e7cf8d9d58556f4a8e780996aef7512924fe5786080379dc5be5a33d8f67c55de65fa7c0a2c2070283ce2f4
|
data/README.md
CHANGED
@@ -115,6 +115,7 @@ Spaceship is a minimalistic, powerful and extremely customizable [Jekyll](https:
|
|
115
115
|
- [6.1 Escape Ordered List](#escape-ordered-list)
|
116
116
|
- [7. Emoji Usage](#7-emoji-usage)
|
117
117
|
- [7.1 Emoji Customizing](#71-emoji-customizing)
|
118
|
+
- [8. Modifying Element Usage](#8-modifying-element-usage)
|
118
119
|
- [Credits](#credits)
|
119
120
|
- [Contributing](#contributing)
|
120
121
|
- [License](#license)
|
@@ -154,6 +155,7 @@ jekyll-spaceship:
|
|
154
155
|
- polyfill-processor
|
155
156
|
- video-processor
|
156
157
|
- emoji-processor
|
158
|
+
- element-processor
|
157
159
|
mathjax-processor:
|
158
160
|
src: //cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML
|
159
161
|
config:
|
@@ -755,6 +757,51 @@ jekyll-spaceship:
|
|
755
757
|
|
756
758
|
See the [Gemoji](https://github.com/github/gemoji) documentation for generating image files.
|
757
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 a element tag, replace the child nodes and so on, it's
|
764
|
+
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 (String 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: # Modify 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
|
+
|
804
|
+
|
758
805
|
|
759
806
|
## Credits
|
760
807
|
|
@@ -12,7 +12,8 @@ module Jekyll::Spaceship
|
|
12
12
|
'plantuml-processor',
|
13
13
|
'polyfill-processor',
|
14
14
|
'video-processor',
|
15
|
-
'emoji-processor'
|
15
|
+
'emoji-processor',
|
16
|
+
'element-processor'
|
16
17
|
]
|
17
18
|
}
|
18
19
|
|
@@ -34,7 +35,7 @@ module Jekyll::Spaceship
|
|
34
35
|
def self.store(section, default)
|
35
36
|
return if @@store[section].nil?
|
36
37
|
return @@store[section] if default.nil?
|
37
|
-
@@store[section] = deep_merge(@@store[section]
|
38
|
+
@@store[section] = deep_merge(default, @@store[section])
|
38
39
|
end
|
39
40
|
|
40
41
|
def self.load(filename = '_config.yml')
|
@@ -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
|
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.
|
4
|
+
version: 0.7.0
|
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-
|
11
|
+
date: 2020-06-14 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
|