jekyll-org 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.org +28 -0
- data/VERSION +1 -1
- data/jekyll-org.gemspec +5 -3
- data/lib/jekyll-org.rb +56 -86
- data/lib/jekyll-org/converter.rb +125 -0
- data/lib/jekyll-org/utils.rb +19 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1a71621e8118cb1ed2812a8925490ae238e3819aff428b35d251293fdc1ef5c
|
4
|
+
data.tar.gz: b95fd5972b6f8ce745a8dd9bc6b876952579b406e3df83e986cb59d677b80479
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91ff1246f7f50cbc49582c3f045ef249195e55cb38c955b4af07d09268fb459edec4db31c43de6f98aeb810b20d50a80daf7d624472699c3dd24e5ad1a8b62fe
|
7
|
+
data.tar.gz: 5ec57394490ade2960cdc7b6de5c551b201246e1b98b6365da49d449297a9254bf67aa75177476a0aa67d7fd2a3455f9d60c41a78aeaaa1aa843728d3a218534
|
data/README.org
CHANGED
@@ -53,6 +53,8 @@ plugins:
|
|
53
53
|
- jekyll-org
|
54
54
|
#+end_src
|
55
55
|
|
56
|
+
warning: If you are using Jekyll < 3.5.0 use the gems key instead of plugins.
|
57
|
+
|
56
58
|
** Usage
|
57
59
|
|
58
60
|
Create a new file with =.org= extension in =_posts=, and write the post
|
@@ -69,6 +71,32 @@ with no lines:
|
|
69
71
|
#+TAGS: jekyll org-mode "tag with spaces"
|
70
72
|
|
71
73
|
This is a blog post about Jekyll and Org mode.
|
74
|
+
|
75
|
+
** org-table demo
|
76
|
+
|
77
|
+
| a | b | c | d | e |
|
78
|
+
|---+---+---+---+---|
|
79
|
+
| 1 | 2 | 3 | 4 | 5 |
|
80
|
+
|
81
|
+
** Liquid demo
|
82
|
+
#+liquid: enabled
|
83
|
+
#+foo: hello world
|
84
|
+
{{ page.foo }}
|
85
|
+
|
86
|
+
or
|
87
|
+
|
88
|
+
{{ site.time | date_to_xmlschema }}
|
89
|
+
|
90
|
+
** Code highlighting
|
91
|
+
Jekyll-org also offers powerful support for code snippets:
|
92
|
+
#+begin_src ruby
|
93
|
+
def print_hi(name)
|
94
|
+
puts "Hi, #{name}"
|
95
|
+
end
|
96
|
+
print_hi('Tom')
|
97
|
+
|
98
|
+
#=> prints 'Hi, Tom' to STDOUT.
|
99
|
+
#+end_src
|
72
100
|
#+END_EXAMPLE
|
73
101
|
|
74
102
|
The value of =#+TAGS= is parsed into a list by splitting it on spaces,
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.1
|
data/jekyll-org.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: jekyll-org 1.1.
|
5
|
+
# stub: jekyll-org 1.1.1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "jekyll-org".freeze
|
9
|
-
s.version = "1.1.
|
9
|
+
s.version = "1.1.1"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["eggcaker".freeze]
|
14
|
-
s.date = "2019-12-
|
14
|
+
s.date = "2019-12-14"
|
15
15
|
s.description = "So you want org-mode support for Jekyll. Write your _posts in org-mode, then add 'gems: [jekyll-org]' to your _config.yml. Thats it!".freeze
|
16
16
|
s.email = "eggcaker@gmail.com".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -27,6 +27,8 @@ Gem::Specification.new do |s|
|
|
27
27
|
"VERSION",
|
28
28
|
"jekyll-org.gemspec",
|
29
29
|
"lib/jekyll-org.rb",
|
30
|
+
"lib/jekyll-org/converter.rb",
|
31
|
+
"lib/jekyll-org/utils.rb",
|
30
32
|
"script/bootstrap",
|
31
33
|
"script/cibuild",
|
32
34
|
"script/console",
|
data/lib/jekyll-org.rb
CHANGED
@@ -1,52 +1,21 @@
|
|
1
|
-
require 'csv'
|
2
|
-
require 'org-ruby'
|
3
|
-
|
4
1
|
if Jekyll::VERSION < '3.0'
|
5
2
|
raise Jekyll::FatalException, 'This version of jekyll-org is only compatible with Jekyll v3 and above.'
|
6
3
|
end
|
7
4
|
|
8
|
-
|
9
|
-
class OrgConverter < Converter
|
10
|
-
safe true
|
11
|
-
priority :low
|
12
|
-
|
13
|
-
def matches(ext)
|
14
|
-
ext =~ /org/i
|
15
|
-
end
|
16
|
-
|
17
|
-
def output_ext(ext)
|
18
|
-
'.html'
|
19
|
-
end
|
20
|
-
|
21
|
-
def convert(content)
|
22
|
-
content
|
23
|
-
end
|
24
|
-
end
|
5
|
+
require_relative './jekyll-org/converter'
|
25
6
|
|
7
|
+
module Jekyll
|
26
8
|
module Filters
|
27
|
-
def
|
28
|
-
site
|
29
|
-
converter = site.find_converter_instance(Jekyll::
|
9
|
+
def orgify(input)
|
10
|
+
site = @context.registers[:site]
|
11
|
+
converter = site.find_converter_instance(Jekyll::Converters::Org)
|
30
12
|
converter.convert(input)
|
31
13
|
end
|
32
14
|
end
|
33
15
|
|
34
16
|
module OrgDocument
|
35
17
|
def org_file?
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
def site
|
40
|
-
@site ||= Jekyll.configuration({})
|
41
|
-
end
|
42
|
-
|
43
|
-
def org_config
|
44
|
-
site.config["org"] || Hash.new()
|
45
|
-
end
|
46
|
-
|
47
|
-
# see https://github.com/bdewey/org-ruby/blob/master/lib/org-ruby/parser.rb
|
48
|
-
def _org_parser_options
|
49
|
-
org_config.fetch("_org_parser_options", { markup_file: 'html.tags.yml' })
|
18
|
+
Jekyll::Converters::Org.matches(extname)
|
50
19
|
end
|
51
20
|
|
52
21
|
## override: read file & parse YAML... in this case, don't parse YAML
|
@@ -55,66 +24,67 @@ module Jekyll
|
|
55
24
|
return super unless org_file? # defer to default behaviour when not org file
|
56
25
|
|
57
26
|
self.content = File.read(path, Utils.merged_file_read_opts(site, opts))
|
27
|
+
converter = site.find_converter_instance(Jekyll::Converters::Org)
|
28
|
+
parser, settings = converter.parse_org(self.content)
|
58
29
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
# Remove #+TITLE from the buffer settings to avoid double exporting
|
64
|
-
org_text.in_buffer_settings.delete(key) if key =~ /title/i
|
65
|
-
org_assign_setting(key, value)
|
66
|
-
end
|
30
|
+
@data = Utils.deep_merge_hashes(self.data, settings)
|
31
|
+
self.content = converter.actually_convert(parser)
|
32
|
+
end
|
33
|
+
end
|
67
34
|
|
68
|
-
|
35
|
+
module OrgPage
|
36
|
+
# Don't parse YAML blocks when working with an org file, parse it as
|
37
|
+
# an org file and then extracts the settings from there.
|
38
|
+
def read_yaml(base, name, opts = {})
|
39
|
+
extname = File.extname(name)
|
40
|
+
return super unless Jekyll::Converters::Org.matches(extname)
|
41
|
+
filename = File.join(base, name)
|
42
|
+
|
43
|
+
self.data ||= Hash.new()
|
44
|
+
self.content = File.read(@path || site.in_source_dir(base, name),
|
45
|
+
Utils.merged_file_read_opts(site, opts))
|
46
|
+
converter = site.find_converter_instance(Jekyll::Converters::Org)
|
47
|
+
parser, settings = converter.parse_org(self.content)
|
48
|
+
|
49
|
+
self.content = converter.actually_convert(parser)
|
50
|
+
self.data = Utils.deep_merge_hashes(self.data, settings)
|
69
51
|
end
|
52
|
+
end
|
70
53
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
# and use spaces instead of commas as column separator.
|
85
|
-
self.data[key] = CSV::parse_line(value, col_sep: ' ')
|
86
|
-
else
|
87
|
-
value_bool = _parse_boolean_value(value)
|
88
|
-
self.data[key] = (value_bool.nil?) ? value : value_bool
|
54
|
+
class Collection
|
55
|
+
# make jekyll collections aside from _posts also convert org files.
|
56
|
+
def read
|
57
|
+
filtered_entries.each do |file_path|
|
58
|
+
full_path = collection_dir(file_path)
|
59
|
+
next if File.directory?(full_path)
|
60
|
+
|
61
|
+
if Utils.has_yaml_header?(full_path) ||
|
62
|
+
Jekyll::Converters::Org.matches_path(full_path)
|
63
|
+
read_document(full_path)
|
64
|
+
else
|
65
|
+
read_static_file(file_path, full_path)
|
66
|
+
end
|
89
67
|
end
|
68
|
+
|
69
|
+
# TODO remove support for jekyll 3 on 4s release
|
70
|
+
(Jekyll::VERSION < '4.0') ? docs.sort! : sort_docs!
|
90
71
|
end
|
72
|
+
end
|
91
73
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
if @liquid_enabled
|
96
|
-
org_text.to_html.gsub("‘", "'").gsub("’", "'")
|
97
|
-
else
|
98
|
-
'{% raw %} ' + org_text.to_html + ' {% endraw %}'
|
99
|
-
end
|
74
|
+
class Reader
|
75
|
+
def retrieve_org_files(dir, files)
|
76
|
+
retrieve_pages(dir, files)
|
100
77
|
end
|
101
78
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
true
|
109
|
-
when *@@falsy_regexps
|
110
|
-
false
|
111
|
-
else
|
112
|
-
unless error_msg.nil?
|
113
|
-
Jekyll.logger.warn("OrgDocument:", error_msg + ": #{value}")
|
114
|
-
end
|
115
|
-
end
|
79
|
+
# don't interpret org files without YAML as static files.
|
80
|
+
def retrieve_static_files(dir, files)
|
81
|
+
org_files, static_files = files.partition(&Jekyll::Converters::Org.method(:matches_path))
|
82
|
+
|
83
|
+
retrieve_org_files(dir, org_files) unless org_files.empty?
|
84
|
+
site.static_files.concat(StaticFileReader.new(site, dir).read(static_files))
|
116
85
|
end
|
117
86
|
end
|
118
87
|
end
|
119
88
|
|
120
89
|
Jekyll::Document.prepend(Jekyll::OrgDocument)
|
90
|
+
Jekyll::Page.prepend(Jekyll::OrgPage)
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'csv'
|
2
|
+
require 'org-ruby'
|
3
|
+
require_relative './utils'
|
4
|
+
|
5
|
+
module Jekyll
|
6
|
+
module Converters
|
7
|
+
class Org < Converter
|
8
|
+
include Jekyll::OrgUtils
|
9
|
+
|
10
|
+
safe true
|
11
|
+
priority :low
|
12
|
+
|
13
|
+
# true if current file is an org file
|
14
|
+
def self.matches(ext)
|
15
|
+
ext =~ /org/i
|
16
|
+
end
|
17
|
+
|
18
|
+
# matches, but accepts complete path
|
19
|
+
def self.matches_path(path)
|
20
|
+
matches(File.extname(path))
|
21
|
+
end
|
22
|
+
|
23
|
+
def matches(ext)
|
24
|
+
self.class.matches ext
|
25
|
+
end
|
26
|
+
|
27
|
+
def output_ext(ext)
|
28
|
+
'.html'
|
29
|
+
end
|
30
|
+
|
31
|
+
# because by the time an org file reaches the
|
32
|
+
# converter... it will have already been converted.
|
33
|
+
def convert(content)
|
34
|
+
content
|
35
|
+
end
|
36
|
+
|
37
|
+
def actually_convert(content)
|
38
|
+
case content
|
39
|
+
when Orgmode::Parser
|
40
|
+
if liquid_enabled?(content)
|
41
|
+
content.to_html.gsub("‘", "'").gsub("’", "'")
|
42
|
+
else
|
43
|
+
'{% raw %} ' + content.to_html + ' {% endraw %}'
|
44
|
+
end
|
45
|
+
else
|
46
|
+
parser, variables = parse_org(content)
|
47
|
+
convert(parser)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def parse_org(content)
|
52
|
+
parser = Orgmode::Parser.new(content, parser_options)
|
53
|
+
settings = { :liquid => org_config.fetch("liquid", false) }
|
54
|
+
|
55
|
+
parser.in_buffer_settings.each_pair do |key, value|
|
56
|
+
# Remove #+TITLE from the buffer settings to avoid double exporting
|
57
|
+
parser.in_buffer_settings.delete(key) if key =~ /title/i
|
58
|
+
assign_setting(key, value, settings)
|
59
|
+
end
|
60
|
+
|
61
|
+
return parser, settings
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def config_liquid_enabled?
|
67
|
+
org_config.fetch("liquid", false)
|
68
|
+
end
|
69
|
+
|
70
|
+
def liquid_enabled?(parser)
|
71
|
+
tuple = parser.in_buffer_settings.each_pair.find do |key, _|
|
72
|
+
key =~ /liquid/i
|
73
|
+
end
|
74
|
+
|
75
|
+
if tuple.nil?
|
76
|
+
config_liquid_enabled? # default value, as per config
|
77
|
+
else
|
78
|
+
_parse_boolean(tuple[1], "unknown LIQUID setting")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# see https://github.com/bdewey/org-ruby/blob/master/lib/org-ruby/parser.rb
|
83
|
+
def parser_options
|
84
|
+
org_config.fetch("parser_options", { markup_file: 'html.tags.yml' })
|
85
|
+
end
|
86
|
+
|
87
|
+
def assign_setting(key, value, settings)
|
88
|
+
key = key.downcase
|
89
|
+
|
90
|
+
case key
|
91
|
+
when "liquid"
|
92
|
+
value = _parse_boolean(value, "unknown LIQUID setting")
|
93
|
+
settings[:liquid] = value unless value.nil?
|
94
|
+
when "tags", "categories"
|
95
|
+
# Parse a string of tags separated by spaces into a list.
|
96
|
+
# Tags containing spaces can be wrapped in quotes,
|
97
|
+
# e.g. '#+TAGS: foo "with spaces"'.
|
98
|
+
#
|
99
|
+
# The easiest way to do this is to use rubys builtin csv parser
|
100
|
+
# and use spaces instead of commas as column separator.
|
101
|
+
settings[key] = CSV::parse_line(value, col_sep: ' ')
|
102
|
+
else
|
103
|
+
value_bool = _parse_boolean(value)
|
104
|
+
settings[key] = (value_bool.nil?) ? value : value_bool
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
@@truthy_regexps = [/enabled/, /yes/, /true/]
|
109
|
+
@@falsy_regexps = [/disabled/, /no/, /false/]
|
110
|
+
|
111
|
+
def _parse_boolean(value, error_msg=nil)
|
112
|
+
case value.downcase
|
113
|
+
when *@@truthy_regexps
|
114
|
+
true
|
115
|
+
when *@@falsy_regexps
|
116
|
+
false
|
117
|
+
else
|
118
|
+
unless error_msg.nil?
|
119
|
+
Jekyll.logger.warn("OrgDocument:", error_msg + ": #{value}")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module OrgUtils
|
3
|
+
def self.site
|
4
|
+
@@site ||= Jekyll.configuration({})
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.org_config
|
8
|
+
site["org"] || Hash.new()
|
9
|
+
end
|
10
|
+
|
11
|
+
def site
|
12
|
+
OrgUtils.site
|
13
|
+
end
|
14
|
+
|
15
|
+
def org_config
|
16
|
+
OrgUtils.org_config
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-org
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- eggcaker
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-12-
|
11
|
+
date: 2019-12-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: org-ruby
|
@@ -153,6 +153,8 @@ files:
|
|
153
153
|
- VERSION
|
154
154
|
- jekyll-org.gemspec
|
155
155
|
- lib/jekyll-org.rb
|
156
|
+
- lib/jekyll-org/converter.rb
|
157
|
+
- lib/jekyll-org/utils.rb
|
156
158
|
- script/bootstrap
|
157
159
|
- script/cibuild
|
158
160
|
- script/console
|