premonition 2.0.1 → 4.0.0.pre1
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 +30 -15
- data/lib/premonition/attributes/error.rb +32 -0
- data/lib/premonition/attributes/parser.rb +169 -0
- data/lib/premonition/attributes/stacker.rb +33 -0
- data/lib/premonition/hook.rb +18 -63
- data/lib/premonition/processor.rb +113 -0
- data/lib/premonition/resources.rb +27 -3
- data/lib/premonition/version.rb +3 -1
- data/lib/premonition.rb +9 -3
- metadata +59 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5790ecdffbb5137fc1deacc1e29077cc574a2c05c60988f2a41b8eca8e160765
|
4
|
+
data.tar.gz: e9c80f5a325c183790978ad6d81d48713946935b0ad14396cb28f55ffd8dcd99
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6ab0056c0d15c2e2a0a05af51a9291871f62694a733ed1d10dce35d801ca9ce395f3a9eaafd0261284b2d371d884750671ab8b8b4eebe47f64203f6531ef576
|
7
|
+
data.tar.gz: 00b78b8282be668dde7abd6328493a6e267ed8321f209a03675e02586f26df95a56df7752b777c0e2c0fc341f025958a01ea4f7b35813dddabc299921ea94aa8
|
data/README.md
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
# Premonition
|
2
2
|
|
3
|
-
|
3
|
+
[Demo site](https://lazee.github.io/premonition-demo/) | [Source code](https://github.com/lazee/premonition-demo)
|
4
4
|
|
5
|
-
Premonition is a [Jekyll](https://jekyllrb.com/) extension that
|
5
|
+
Premonition is a [Jekyll](https://jekyllrb.com/) extension that can convert Markdown block-quotes into beautiful block styled content.
|
6
6
|
|
7
|
-
By adding a special header to the first line of a [block quote](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#blockquotes),
|
8
|
-
Premonition will transform it into a markup block of your choice.
|
7
|
+
By simply adding a special header to the first line of a [block quote](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#blockquotes), Premonition will transform it into a markup block of your choice.
|
9
8
|
|
10
9
|
<p align="center">
|
11
10
|
<img src="https://github.com/lazee/premonition/raw/master/screen.png" height="450"/>
|
@@ -14,15 +13,26 @@ Premonition will transform it into a markup block of your choice.
|
|
14
13
|
## Features
|
15
14
|
|
16
15
|
* Highly customizable (Create your own styles and templates easily)
|
17
|
-
* Non-intrusive -
|
16
|
+
* Non-intrusive - Its just Markdown!
|
18
17
|
* Easy to install
|
19
|
-
* Comes with a stylesheet (Sass/Css) and templates for rendering
|
20
|
-
|
18
|
+
* Comes with a stylesheet (Sass/Css) and templates for rendering the most common boxes.
|
19
|
+
|
20
|
+
## Version 4 highlights
|
21
|
+
|
22
|
+
* Added Jekyll Excerpts support
|
23
|
+
* Kramdown reference links now supported
|
24
|
+
* Jekyll 4 support
|
25
|
+
* Added support for block attributes. This is in use in the new citation
|
26
|
+
block type:
|
27
|
+
|
28
|
+
`> citation "-- jakob" [ cite = "jvn" ]`
|
29
|
+
* Other minor bug fixes
|
30
|
+
|
21
31
|
|
22
32
|
## Requirements
|
23
33
|
|
24
34
|
* Jekyll 3.7.x or higher
|
25
|
-
* FontAwesome
|
35
|
+
* FontAwesome 5.x
|
26
36
|
|
27
37
|
## Installation
|
28
38
|
|
@@ -30,7 +40,7 @@ Add the following line to your `Gemfile`:
|
|
30
40
|
|
31
41
|
```
|
32
42
|
group :jekyll_plugins do
|
33
|
-
gem "premonition", "~>
|
43
|
+
gem "premonition", "~> 4.0.0"
|
34
44
|
end
|
35
45
|
```
|
36
46
|
|
@@ -78,7 +88,7 @@ Example:
|
|
78
88
|
Premonition will then convert this into something like:
|
79
89
|
|
80
90
|
~~~html
|
81
|
-
<div class="premonition info"><
|
91
|
+
<div class="premonition info"><i class="fas fa-check-square"></i><div class="content"><p class="header">Info</p><p>The body of the warning goes here. Premonition also allow you to write Markdown inside the block.</p></div></div>
|
82
92
|
~~~
|
83
93
|
|
84
94
|
You can change the markup into anything you like by adding your own template.
|
@@ -126,7 +136,7 @@ If you want to override the template for one of the default types (like note), d
|
|
126
136
|
```yaml
|
127
137
|
premonition:
|
128
138
|
types:
|
129
|
-
|
139
|
+
note:
|
130
140
|
template: 'Liquid template goes here'
|
131
141
|
```
|
132
142
|
|
@@ -146,10 +156,10 @@ Each type must have unique id (lowercase letters).
|
|
146
156
|
~~~yaml
|
147
157
|
premonition:
|
148
158
|
types:
|
149
|
-
|
159
|
+
custombox:
|
150
160
|
meta:
|
151
161
|
fa-icon: fa-exclamation-circle
|
152
|
-
|
162
|
+
advanced:
|
153
163
|
template: 'Liquid template goes here'
|
154
164
|
default_title: 'MY BLOCK'
|
155
165
|
meta:
|
@@ -164,11 +174,16 @@ as a Sass file or as plain css. The [Jekyll Documentation](https://jekyllrb.com/
|
|
164
174
|
Download the stylesheet from here : https://github.com/lazee/premonition/tree/master/stylesheet
|
165
175
|
|
166
176
|
In order to get the fancy icons, you will have to add [Font Awesome](https://fontawesome.com/) to your html header file.
|
167
|
-
Be aware that you have to use
|
177
|
+
Be aware that you have to use v5.x of Font Awesome together with our CSS.
|
168
178
|
|
169
179
|
The easiest way to get startet with Font Awesome is to add this to your html header file:
|
170
180
|
|
171
181
|
~~~html
|
172
|
-
<link rel="stylesheet" href="https://
|
182
|
+
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.12.1/css/all.css">
|
173
183
|
~~~~
|
174
184
|
|
185
|
+
If you need backward compability with v4:
|
186
|
+
|
187
|
+
~~~html
|
188
|
+
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.12.1/css/v4-shims.css">
|
189
|
+
~~~
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'strscan'
|
4
|
+
|
5
|
+
module Jekyll
|
6
|
+
module Premonition
|
7
|
+
module Attributes
|
8
|
+
# Public: Custom error for Premonition attributes parser errors.
|
9
|
+
class ParserError < StandardError
|
10
|
+
# Initialize a new ParserError
|
11
|
+
#
|
12
|
+
# msg - The error message
|
13
|
+
# raw - The raw string send to the parser initially.
|
14
|
+
# Used for syntax error output. If nil syntax
|
15
|
+
# error output is skipped.
|
16
|
+
# pos - The buffer position when error was raised.
|
17
|
+
# Used in both error message and syntax error output
|
18
|
+
# if raw attribute is set.
|
19
|
+
def initialize(msg, raw = nil, pos = 0)
|
20
|
+
if raw.nil?
|
21
|
+
super(msg)
|
22
|
+
else
|
23
|
+
super("#{msg} [#{pos}:#{raw.length}]")
|
24
|
+
print "Attribute syntax error:\n #{raw}\n"
|
25
|
+
pos.times { print ' ' }
|
26
|
+
print "^\n"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'strscan'
|
4
|
+
|
5
|
+
module Jekyll
|
6
|
+
module Premonition
|
7
|
+
module Attributes
|
8
|
+
# Public: Premonition block attributes parser.
|
9
|
+
#
|
10
|
+
# Parses attributes found in block headers like this:
|
11
|
+
# > "info" [ foo = abcd, bar = "zot", size = 3 ]
|
12
|
+
#
|
13
|
+
# The parser itself utilizes the StringScanner in ruby.
|
14
|
+
# Each character will be parsed, validated and pushed
|
15
|
+
# to a stack (array) according to the rules inside the
|
16
|
+
# parser itself.
|
17
|
+
#
|
18
|
+
# A stack object will be of a certain type:
|
19
|
+
#
|
20
|
+
# 0 : Outside an attributes block
|
21
|
+
# 1 : Inside an attributes block, but between keys or values
|
22
|
+
# 2 : Parsing an attribute key
|
23
|
+
# 3: Parsing an attribute value
|
24
|
+
#
|
25
|
+
# Upon parser errors a pretty syntax error will be printed to
|
26
|
+
# stdout, showing where the error is.
|
27
|
+
class Parser
|
28
|
+
# Get parsed attributes as a Hash
|
29
|
+
attr_reader :attributes
|
30
|
+
|
31
|
+
# Initialize a new Parser AND start parsing
|
32
|
+
#
|
33
|
+
# str - A string containing the attributes block to be parser.
|
34
|
+
def initialize(str)
|
35
|
+
@raw = str # Keeps th original string for later use
|
36
|
+
@buffer = StringScanner.new(str) # Create StringScanner buffer
|
37
|
+
@attributes = {} # Initialize the attributes hash
|
38
|
+
@stack = [Stacker.new(0)] # Initialize the parser stack with initial "state"
|
39
|
+
parse # Start parsing
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def parse
|
45
|
+
raise error('No attributes block found in given string') unless @raw.match(/^.*\[.*\].*/)
|
46
|
+
|
47
|
+
until @buffer.eos?
|
48
|
+
char = @buffer.getch
|
49
|
+
|
50
|
+
case @stack.last.type
|
51
|
+
when 0 # Outside block mode
|
52
|
+
push_stacker(1) if char == '['
|
53
|
+
when 1 # In between
|
54
|
+
parse_in_between(char)
|
55
|
+
when 2 # Key
|
56
|
+
parse_key(char)
|
57
|
+
when 3 # Value
|
58
|
+
parse_value(char)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse_in_between(char)
|
64
|
+
return if char == ' ' # Ignoring all spaces before, between and after keys and values.
|
65
|
+
|
66
|
+
if char == ']'
|
67
|
+
pop_attribute_from_stack
|
68
|
+
push_stacker(4)
|
69
|
+
elsif char == ','
|
70
|
+
raise error("Attribute separator ',' not allowed here.") if @attributes.length.zero?
|
71
|
+
push_stacker(2)
|
72
|
+
elsif char.match(/^[a-zA-z0-9\-_]$/)
|
73
|
+
push_stacker(2)
|
74
|
+
append_char(char)
|
75
|
+
else
|
76
|
+
raise error("Illegal character '#{char}' outside key and value")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def parse_key(char)
|
81
|
+
if char == '='
|
82
|
+
push_stacker(3)
|
83
|
+
value_mode('plain')
|
84
|
+
elsif char.match(/^[a-zA-z0-9\-_]$/)
|
85
|
+
append_char(char)
|
86
|
+
elsif char == ' '
|
87
|
+
m = @buffer.scan(/\s*\=\s*/)
|
88
|
+
raise error('Space not allowed inside attribute key') if m.nil?
|
89
|
+
push_stacker(3)
|
90
|
+
value_mode('plain')
|
91
|
+
else
|
92
|
+
raise error("Illegal character '#{char}' for attribute key")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def parse_value(char)
|
97
|
+
case char
|
98
|
+
when ']'
|
99
|
+
if plain_mode?
|
100
|
+
pop_attribute_from_stack
|
101
|
+
push_stacker(4)
|
102
|
+
end
|
103
|
+
when '"'
|
104
|
+
pop_attribute_from_stack unless plain_mode?
|
105
|
+
raise error('Illegal " found') unless @stack.last.value.nil? || @stack.last.value.empty?
|
106
|
+
value_mode('block')
|
107
|
+
when '\\'
|
108
|
+
raise error('Backslash is not allowed in unquoted values') if plain_mode?
|
109
|
+
raise error('Unsupported escaping of character inside string block') unless ['\\', '"'].include?(@buffer.peek(1))
|
110
|
+
append_char(@buffer.peek(1))
|
111
|
+
@buffer.pos += 1
|
112
|
+
when ','
|
113
|
+
if plain_mode?
|
114
|
+
pop_attribute_from_stack
|
115
|
+
push_stacker(1)
|
116
|
+
else
|
117
|
+
append_char(char)
|
118
|
+
end
|
119
|
+
when '='
|
120
|
+
raise error('Illegal use of equals character in unquoted value') if plain_mode?
|
121
|
+
append_char(char)
|
122
|
+
when ' '
|
123
|
+
if plain_mode?
|
124
|
+
raise error('Illegal spacing in unquoted value') if @buffer.check(/\s*[,\]]/).nil?
|
125
|
+
pop_attribute_from_stack
|
126
|
+
push_stacker(1)
|
127
|
+
else
|
128
|
+
append_char(char)
|
129
|
+
end
|
130
|
+
else
|
131
|
+
append_char(char)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def error(msg)
|
136
|
+
ParserError.new(msg, @raw, @buffer.pos)
|
137
|
+
end
|
138
|
+
|
139
|
+
def push_stacker(type)
|
140
|
+
@stack << Stacker.new(type)
|
141
|
+
end
|
142
|
+
|
143
|
+
def append_char(char)
|
144
|
+
@stack.last.append(char)
|
145
|
+
end
|
146
|
+
|
147
|
+
def pop_attribute_from_stack
|
148
|
+
v = @stack.pop
|
149
|
+
return if [0, 1, 2].include?(v.type) # Ignore these types from stack
|
150
|
+
k = @stack.pop
|
151
|
+
raise error("Expected key but got: #{k.value}, #{k.type}") unless k.type == 2
|
152
|
+
@attributes[k.value] = v.value
|
153
|
+
end
|
154
|
+
|
155
|
+
def plain_mode?
|
156
|
+
@stack.last.meta['mode'] == 'plain'
|
157
|
+
end
|
158
|
+
|
159
|
+
def block_mode?
|
160
|
+
@stack.last.meta['mode'] == 'block'
|
161
|
+
end
|
162
|
+
|
163
|
+
def value_mode(str)
|
164
|
+
@stack.last.meta['mode'] = str
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'strscan'
|
4
|
+
|
5
|
+
module Jekyll
|
6
|
+
module Premonition
|
7
|
+
module Attributes
|
8
|
+
# Instances of this class are pushed onto the parser stack upon parsing of block attributes.
|
9
|
+
class Stacker
|
10
|
+
# Get the string value from the stacker
|
11
|
+
attr_reader :value
|
12
|
+
# Get the stacker type. 0 = outside block, 1 = in_between, 2 = key, 3 = value
|
13
|
+
attr_reader :type
|
14
|
+
# Get and set meta attributes for stacker. Used for setting value mode.
|
15
|
+
attr_accessor :meta
|
16
|
+
|
17
|
+
# Initialize a new Stacker
|
18
|
+
#
|
19
|
+
# type - The stacker type
|
20
|
+
def initialize(type)
|
21
|
+
@value = nil
|
22
|
+
@type = type
|
23
|
+
@meta = {}
|
24
|
+
end
|
25
|
+
|
26
|
+
# Append a char to the stacker value
|
27
|
+
def append(char)
|
28
|
+
@value = @value.nil? ? char : "#{@value}#{char}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/premonition/hook.rb
CHANGED
@@ -1,82 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Premonition
|
3
5
|
class Hook < Generator
|
4
6
|
safe true
|
5
|
-
priority :
|
7
|
+
priority :high
|
6
8
|
|
7
9
|
def initialize(p)
|
8
10
|
super(p)
|
9
11
|
end
|
10
12
|
|
11
|
-
def
|
12
|
-
|
13
|
-
Hooks.register [:documents, :pages], :pre_render do |doc|
|
14
|
-
adder(doc)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def adder(doc)
|
19
|
-
o = []
|
20
|
-
b = nil
|
21
|
-
doc.content.each_line do |l|
|
22
|
-
if blockquote?(l) && empty_block?(b)
|
23
|
-
if (m = l.match(/^\s*\>\s+([a-z]+)\s+\"(.*)\"$/i))
|
24
|
-
y, t = m.captures
|
25
|
-
b = { 'title' => t.strip, 'type' => y.strip.downcase, 'content' => [] }
|
26
|
-
else
|
27
|
-
o << l
|
28
|
-
end
|
29
|
-
elsif blockquote?(l) && !empty_block?(b)
|
30
|
-
b['content'] << l.match(/^\s*\>\s?(.*)$/i).captures[0]
|
31
|
-
else
|
32
|
-
if !blockquote?(l) && !empty_block?(b)
|
33
|
-
o << render_block(b)
|
34
|
-
b = nil
|
35
|
-
end
|
36
|
-
o << l
|
37
|
-
end
|
38
|
-
end
|
39
|
-
o << render_block(b) unless empty_block?(b)
|
40
|
-
doc.content = o.join
|
13
|
+
def generate_excerpt?(doc)
|
14
|
+
!doc.data['excerpt_separator'].empty?
|
41
15
|
end
|
42
16
|
|
43
|
-
def
|
44
|
-
|
17
|
+
def process?(resources, doc)
|
18
|
+
resources.config['extensions'].include?(File.extname(doc.relative_path)[1..-1])
|
45
19
|
end
|
46
20
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
21
|
+
def generate(site)
|
22
|
+
resources = Resources.new site.config
|
23
|
+
processor = Processor.new resources
|
50
24
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
'header' => !t['title'].nil?,
|
58
|
-
'title' => t['title'],
|
59
|
-
'content' => c,
|
60
|
-
'type' => b['type'],
|
61
|
-
'meta' => t['meta']
|
62
|
-
},
|
63
|
-
strict_variables: true
|
64
|
-
)
|
65
|
-
end
|
25
|
+
Hooks.register [:posts], :pre_render do |doc|
|
26
|
+
if process?(resources, doc)
|
27
|
+
doc.content = processor.adder(doc.content)
|
28
|
+
doc.data['excerpt'] = Jekyll::Excerpt.new(doc) if generate_excerpt? doc
|
29
|
+
end
|
30
|
+
end
|
66
31
|
|
67
|
-
|
68
|
-
|
69
|
-
'template' => @resources.config['default']['template'],
|
70
|
-
'title' => @resources.config['default']['title'],
|
71
|
-
'meta' => @resources.config['default']['meta']
|
72
|
-
}
|
73
|
-
@resources.config['types'].each do |id, t|
|
74
|
-
next unless id == b['type']
|
75
|
-
c['title'] = b['title'].empty? || b['title'].nil? ? t['default_title'] : b['title']
|
76
|
-
c['template'] = t['template'] unless t['template'].nil?
|
77
|
-
c['meta'] = c['meta'].merge(t['meta']) unless t['meta'].nil?
|
32
|
+
Hooks.register [:pages], :pre_render do |doc|
|
33
|
+
doc.content = processor.adder(doc.content) if process?(resources, doc)
|
78
34
|
end
|
79
|
-
c
|
80
35
|
end
|
81
36
|
end
|
82
37
|
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
module Premonition
|
5
|
+
class Processor
|
6
|
+
def initialize(resources)
|
7
|
+
@resources = resources
|
8
|
+
end
|
9
|
+
|
10
|
+
def adder(content)
|
11
|
+
o = []
|
12
|
+
references = load_references(content)
|
13
|
+
b = nil
|
14
|
+
is_code_block = false
|
15
|
+
content.each_line do |l|
|
16
|
+
is_code_block = !is_code_block if code_block_line?(l)
|
17
|
+
if is_code_block
|
18
|
+
o << l
|
19
|
+
elsif blockquote?(l) && empty_block?(b)
|
20
|
+
if (m = l.match(/^\s*\>\s+([a-z]+)\s+\"(.*)\"\s+(\[.*\])?\s*$/i))
|
21
|
+
y, t, attrs = m.captures
|
22
|
+
b = { 'title' => t.strip, 'type' => y.strip.downcase, 'content' => [], 'attrs' => attrs }
|
23
|
+
else
|
24
|
+
o << l
|
25
|
+
end
|
26
|
+
elsif blockquote?(l) && !empty_block?(b)
|
27
|
+
b['content'] << l.match(/^\s*\>\s?(.*)$/i).captures[0]
|
28
|
+
else
|
29
|
+
if !blockquote?(l) && !empty_block?(b)
|
30
|
+
o << render_block(b, references)
|
31
|
+
b = nil
|
32
|
+
end
|
33
|
+
o << l
|
34
|
+
end
|
35
|
+
end
|
36
|
+
o << render_block(b, references) unless empty_block?(b)
|
37
|
+
o.join
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def load_references(content)
|
43
|
+
refs = ["\n"]
|
44
|
+
content.each_line do |l|
|
45
|
+
refs << l if l.strip!.match(/^\[.*\]:.*\".*\"$/i)
|
46
|
+
end
|
47
|
+
refs
|
48
|
+
end
|
49
|
+
|
50
|
+
def code_block_line?(line)
|
51
|
+
line.strip.start_with?('~~~')
|
52
|
+
end
|
53
|
+
|
54
|
+
def blockquote?(line)
|
55
|
+
line.strip.start_with?('>')
|
56
|
+
end
|
57
|
+
|
58
|
+
def empty_block?(block)
|
59
|
+
block.nil?
|
60
|
+
end
|
61
|
+
|
62
|
+
def render_block(block, references)
|
63
|
+
t = create_resource(block)
|
64
|
+
a = block['content'] + references
|
65
|
+
c = "#{@resources.markdown.convert(a.join("\n"))}\n\n"
|
66
|
+
attrs = {}
|
67
|
+
|
68
|
+
unless block['attrs'].nil?
|
69
|
+
parser = Jekyll::Premonition::Attributes::Parser.new(block['attrs'])
|
70
|
+
attrs = parser.attributes
|
71
|
+
end
|
72
|
+
|
73
|
+
template = Liquid::Template.parse(t['template'], error_mode: :strict)
|
74
|
+
template.render(
|
75
|
+
{
|
76
|
+
'header' => !t['title'].nil?,
|
77
|
+
'title' => t['title'],
|
78
|
+
'content' => c,
|
79
|
+
'type' => block['type'],
|
80
|
+
'meta' => t['meta'],
|
81
|
+
'attrs' => attrs
|
82
|
+
},
|
83
|
+
strict_variables: true
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
def create_resource(block)
|
88
|
+
c = {
|
89
|
+
'template' => @resources.config['default']['template'],
|
90
|
+
'title' => @resources.config['default']['title'],
|
91
|
+
'meta' => @resources.config['default']['meta']
|
92
|
+
}
|
93
|
+
|
94
|
+
unless @resources.config['types'].include? block['type']
|
95
|
+
c['title'] = ''
|
96
|
+
c['meta'] = { 'fa-icon' => 'fa-bug' }
|
97
|
+
c['template'] = '<div class="premonition error"><div class="fa {{meta.fa-icon}}"></div>'\
|
98
|
+
'<div class="content"><p class="header">PREMONITION ERROR: Invalid box type</p>You have specified an invalid box type "{{type}}". You can customize your own box types in `_config.yml`. See documentation for help.</div></div>'
|
99
|
+
return c
|
100
|
+
end
|
101
|
+
|
102
|
+
@resources.config['types'].each do |id, t|
|
103
|
+
next unless id == block['type']
|
104
|
+
|
105
|
+
c['title'] = block['title'].empty? || block['title'].nil? ? t['default_title'] : block['title']
|
106
|
+
c['template'] = t['template'] unless t['template'].nil?
|
107
|
+
c['meta'] = c['meta'].merge(t['meta']) unless t['meta'].nil?
|
108
|
+
end
|
109
|
+
c
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Premonition
|
3
5
|
class Resources
|
@@ -18,13 +20,14 @@ module Jekyll
|
|
18
20
|
cfg['default']['title'] = df['title'].strip unless df['title'].nil?
|
19
21
|
cfg['default']['meta'] = cfg['default']['meta'].merge(df['meta']) unless df['meta'].nil?
|
20
22
|
load_types p, cfg
|
23
|
+
load_extensions p, cfg
|
21
24
|
cfg
|
22
25
|
end
|
23
26
|
|
24
27
|
def default_config
|
25
28
|
{
|
26
29
|
'default' => {
|
27
|
-
'template' => '<div class="premonition {{type}}"><
|
30
|
+
'template' => '<div class="premonition {{type}}"><i class="fas {{meta.fa-icon}}"></i>'\
|
28
31
|
'<div class="content">{% if header %}<p class="header">{{title}}</p>{% endif %}{{content}}</div></div>',
|
29
32
|
'meta' => { 'fa-icon' => 'fa-check-square' },
|
30
33
|
'title' => nil
|
@@ -33,8 +36,17 @@ module Jekyll
|
|
33
36
|
'note' => { 'meta' => { 'fa-icon' => 'fa-check-square' } },
|
34
37
|
'info' => { 'meta' => { 'fa-icon' => 'fa-info-circle' } },
|
35
38
|
'warning' => { 'meta' => { 'fa-icon' => 'fa-exclamation-circle' } },
|
36
|
-
'error' => { 'meta' => { 'fa-icon' => 'fa-exclamation-triangle' } }
|
37
|
-
|
39
|
+
'error' => { 'meta' => { 'fa-icon' => 'fa-exclamation-triangle' } },
|
40
|
+
'citation' => { 'meta' => { 'fa-icon' => 'fa-quote-left' }, 'template' =>
|
41
|
+
'<div class="premonition {{type}}"><i class="fas {{meta.fa-icon}}"></i>'\
|
42
|
+
'<blockquote class="content blockquote"{% if attrs.cite %} cite="{{attrs.cite}}"{% endif %}>{{content}}{% if header %}'\
|
43
|
+
'<footer class="blockquote-footer">'\
|
44
|
+
'<cite title="{{title}}">{{title}}</cite></footer>{% endif %}</blockquote></div>' }
|
45
|
+
},
|
46
|
+
'extensions' => [
|
47
|
+
'md',
|
48
|
+
'markdown'
|
49
|
+
]
|
38
50
|
}
|
39
51
|
end
|
40
52
|
|
@@ -45,6 +57,7 @@ module Jekyll
|
|
45
57
|
|
46
58
|
def load_types(p, cfg)
|
47
59
|
return if p['types'].nil?
|
60
|
+
|
48
61
|
p['types'].each do |id, obj|
|
49
62
|
t = type_config id, obj
|
50
63
|
cfg['types'][id] = cfg['types'][id].merge(t) unless cfg['types'][id].nil?
|
@@ -52,6 +65,17 @@ module Jekyll
|
|
52
65
|
end
|
53
66
|
end
|
54
67
|
|
68
|
+
def load_extensions(p, cfg)
|
69
|
+
return if p['extensions'].nil?
|
70
|
+
return unless p['extensions'].is_a?(Array)
|
71
|
+
return if p['extensions'].empty?
|
72
|
+
|
73
|
+
cfg['extensions'] = []
|
74
|
+
p['extensions'].each do |v|
|
75
|
+
cfg['extensions'] << v unless cfg['extensions'].include?(v)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
55
79
|
def type_config(id, t)
|
56
80
|
validate_type(id, t)
|
57
81
|
{
|
data/lib/premonition/version.rb
CHANGED
data/lib/premonition.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'jekyll'
|
2
|
-
|
3
|
-
|
4
|
-
|
4
|
+
require_relative 'premonition/attributes/error'
|
5
|
+
require_relative 'premonition/attributes/stacker'
|
6
|
+
require_relative 'premonition/attributes/parser'
|
7
|
+
require_relative 'premonition/version'
|
8
|
+
require_relative 'premonition/processor'
|
9
|
+
require_relative 'premonition/resources'
|
10
|
+
require_relative 'premonition/hook'
|
5
11
|
|
6
12
|
module Jekyll
|
7
13
|
module Premonition
|
metadata
CHANGED
@@ -1,49 +1,49 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: premonition
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jakob Vad Nielsen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: jekyll
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
|
19
|
+
version: '3.7'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '5.0'
|
23
|
+
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.7'
|
30
|
+
- - "<"
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
32
|
+
version: '5.0'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
34
|
+
name: bundler
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- - "
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '2.0'
|
34
|
-
- - "<"
|
37
|
+
- - "~>"
|
35
38
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
39
|
+
version: 2.1.4
|
37
40
|
type: :development
|
38
41
|
prerelease: false
|
39
42
|
version_requirements: !ruby/object:Gem::Requirement
|
40
43
|
requirements:
|
41
|
-
- - "
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '2.0'
|
44
|
-
- - "<"
|
44
|
+
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: 2.1.4
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: mocha
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,6 +72,40 @@ dependencies:
|
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: 13.0.1
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rubocop
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.68.0
|
82
|
+
- - "<"
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 0.72.0
|
85
|
+
type: :development
|
86
|
+
prerelease: false
|
87
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 0.68.0
|
92
|
+
- - "<"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 0.72.0
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: rubocop-jekyll
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.10.0
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - "~>"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: 0.10.0
|
75
109
|
- !ruby/object:Gem::Dependency
|
76
110
|
name: turn
|
77
111
|
requirement: !ruby/object:Gem::Requirement
|
@@ -97,7 +131,11 @@ files:
|
|
97
131
|
- LICENSE
|
98
132
|
- README.md
|
99
133
|
- lib/premonition.rb
|
134
|
+
- lib/premonition/attributes/error.rb
|
135
|
+
- lib/premonition/attributes/parser.rb
|
136
|
+
- lib/premonition/attributes/stacker.rb
|
100
137
|
- lib/premonition/hook.rb
|
138
|
+
- lib/premonition/processor.rb
|
101
139
|
- lib/premonition/resources.rb
|
102
140
|
- lib/premonition/version.rb
|
103
141
|
homepage: http://github.com/lazee/premonition
|
@@ -116,9 +154,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
154
|
version: '0'
|
117
155
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
156
|
requirements:
|
119
|
-
- - "
|
157
|
+
- - ">"
|
120
158
|
- !ruby/object:Gem::Version
|
121
|
-
version:
|
159
|
+
version: 1.3.1
|
122
160
|
requirements: []
|
123
161
|
rubygems_version: 3.0.3
|
124
162
|
signing_key:
|