neruda 0.1.0 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/pablo +70 -33
- data/lib/neruda/config.rb +59 -16
- data/lib/neruda/config/lisp_config.rb +140 -79
- data/lib/neruda/config/org-config.el +6 -6
- data/lib/neruda/config/ox-neruda.el +28 -2
- data/lib/neruda/emacs.rb +44 -0
- data/lib/neruda/index.rb +58 -36
- data/lib/neruda/index/atom_generator.rb +16 -16
- data/lib/neruda/index/org_generator.rb +63 -41
- data/lib/neruda/org_file.rb +47 -14
- data/lib/neruda/org_file/class_methods.rb +38 -21
- data/lib/neruda/org_file/extracter.rb +12 -1
- data/lib/neruda/org_file/htmlizer.rb +6 -32
- data/lib/neruda/preview.rb +9 -7
- data/lib/neruda/templater.rb +3 -2
- data/lib/neruda/utils.rb +120 -35
- data/lib/neruda/version.rb +2 -1
- data/lib/tasks/org.rake +48 -26
- data/lib/tasks/site.rake +37 -34
- data/lib/tasks/sync.rake +6 -2
- data/lib/tasks/tags.rake +19 -0
- data/locales/en.yml +20 -1
- data/locales/fr.yml +20 -1
- metadata +59 -35
- data/themes/default/css/style.css +0 -216
- data/themes/default/fonts/Yanone_Kaffeesatz_400.woff +0 -0
- data/themes/default/fonts/Yanone_Kaffeesatz_400.woff2 +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 439ad28e63d071bfd98bd52e99c39ff1bfbfcde9f0e6c4e48bd501143b3a62f1
|
4
|
+
data.tar.gz: ac080451123c740352e8a6c0259d294ab03a40f375981cb05e68ece0c6c6243a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb9e592d2a1b61f5b0682023157f8a5b429fd21feb494e328fe0185ddbd27ba182ca5cfd77d82d63c66db208d4713478cec20c5f1d6c9a1bbe7de0e867f8973e
|
7
|
+
data.tar.gz: 827b583c447d97c43bfb8667b75c9e80b82903b1ce9ecb316e6c95c2dc407e7b601f2f2f3dc02969ca0eeaf487e022765cac070af8d68734462bf09c48b65995
|
data/bin/pablo
CHANGED
@@ -7,8 +7,8 @@ require 'r18n-core'
|
|
7
7
|
require 'neruda/utils'
|
8
8
|
require 'neruda/version'
|
9
9
|
|
10
|
-
R18n.
|
11
|
-
|
10
|
+
R18n.default_places = File.expand_path('../locales', __dir__)
|
11
|
+
R18n.set Neruda::Config.settings['lang']
|
12
12
|
|
13
13
|
# Pablo commands
|
14
14
|
module PabloCommands
|
@@ -20,58 +20,92 @@ module PabloCommands
|
|
20
20
|
Neruda::Config.save(Neruda::Config.settings.merge(cnf))
|
21
21
|
@rake.options.build_all = true
|
22
22
|
@rake.invoke_task('org:install')
|
23
|
-
|
24
|
-
|
23
|
+
return if File.exist? 'src/index.org'
|
24
|
+
Neruda::OrgFile.new('src/index.org', @options).write
|
25
25
|
end
|
26
26
|
alias_method :pablo_config, :pablo_init
|
27
27
|
|
28
28
|
def pablo_build(file = ARGV[0])
|
29
29
|
@rake.options.build_all = true
|
30
|
-
if
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
# Update org-config.el, if necessary
|
31
|
+
suffix = ''
|
32
|
+
if !file.nil?
|
33
|
+
suffix = ":one[#{file}]"
|
34
|
+
elsif @options[:force]
|
35
|
+
suffix = '[true]'
|
34
36
|
end
|
37
|
+
@rake.invoke_task("site:build#{suffix}")
|
35
38
|
end
|
36
39
|
|
37
40
|
def pablo_preview
|
41
|
+
Thread.new do
|
42
|
+
sleep 1
|
43
|
+
port = Neruda::Config.settings.dig('preview', 'server_port') || 5000
|
44
|
+
uri = "http://127.0.0.1:#{port}/"
|
45
|
+
current_os = Neruda::Utils.current_os
|
46
|
+
case current_os
|
47
|
+
when 'windows'
|
48
|
+
system 'start', uri
|
49
|
+
when 'apple'
|
50
|
+
system 'open', uri
|
51
|
+
else
|
52
|
+
system 'gio', 'open', uri
|
53
|
+
end
|
54
|
+
end
|
38
55
|
@rake.invoke_task('site:preview')
|
39
56
|
end
|
40
57
|
|
41
58
|
def pablo_open
|
42
|
-
filename = ARGV[0]
|
59
|
+
filename = new_file_name(ARGV[0])
|
43
60
|
FileUtils.mkdir_p File.dirname(filename)
|
44
61
|
o = Neruda::OrgFile.new(filename, @options)
|
45
62
|
o.write unless File.exist? filename
|
46
|
-
|
47
63
|
editor = ENV['EDITOR'] || ENV['VISUAL'] || 'emacs'
|
48
|
-
cmd = [editor, filename]
|
49
|
-
cmd.insert(1, '+6') if editor.match?(/^emacs/)
|
64
|
+
cmd = [editor, '+6', filename]
|
50
65
|
system(*cmd)
|
51
66
|
end
|
67
|
+
alias_method :pablo_edit, :pablo_open
|
68
|
+
|
69
|
+
def pablo_publish
|
70
|
+
@rake.invoke_task('sync:push')
|
71
|
+
end
|
52
72
|
|
53
|
-
def pablo_help(command = 'basic', error
|
73
|
+
def pablo_help(command = 'basic', error: false)
|
54
74
|
warn R18n.t.pablo.error.no_command if error
|
55
|
-
|
56
|
-
cmd_opt = Neruda::Utils::PABLO_COMMANDS[
|
75
|
+
cmd = Neruda::Utils.resolve_possible_alias(command)
|
76
|
+
cmd_opt = Neruda::Utils::PABLO_COMMANDS[cmd]
|
57
77
|
label = cmd_opt[:label] || command
|
58
|
-
warn "
|
59
|
-
|
60
|
-
|
61
|
-
|
78
|
+
warn format("%<label>s\n\n", label: R18n.t.pablo.usage(label))
|
79
|
+
if R18n.t.pablo.commands[cmd].translated?
|
80
|
+
warn format("%<label>s\n\n", label: R18n.t.pablo.commands[cmd])
|
81
|
+
end
|
82
|
+
warn help_command_body(cmd).join("\n")
|
62
83
|
exit 1 if error
|
63
84
|
exit
|
64
85
|
end
|
65
86
|
|
66
87
|
private
|
67
88
|
|
68
|
-
def new_file_name
|
69
|
-
title
|
89
|
+
def new_file_name(title)
|
90
|
+
title ||= @options[:title]
|
70
91
|
title = 'new' if title.nil? || title == ''
|
71
92
|
filename = Neruda::OrgFile.slug title
|
72
93
|
return "#{filename}.org" unless @options[:directory]
|
73
94
|
"#{filename}/index.org"
|
74
95
|
end
|
96
|
+
|
97
|
+
def help_command_body(command)
|
98
|
+
body = [
|
99
|
+
R18n.t.pablo.options.cmd_title,
|
100
|
+
Neruda::Utils.summarize_command(command)
|
101
|
+
]
|
102
|
+
return body unless command == 'basic'
|
103
|
+
body + [
|
104
|
+
'',
|
105
|
+
R18n.t.pablo.commands.cmd_title,
|
106
|
+
Neruda::Utils.list_commands
|
107
|
+
]
|
108
|
+
end
|
75
109
|
end
|
76
110
|
|
77
111
|
# Main pablo class
|
@@ -100,8 +134,8 @@ class Pablo
|
|
100
134
|
require 'r18n-core'
|
101
135
|
|
102
136
|
neruda_spec = Gem::Specification.find_by_name 'neruda'
|
103
|
-
R18n.
|
104
|
-
|
137
|
+
R18n.default_places = "\#{neruda_spec.gem_dir}/locales"
|
138
|
+
R18n.set(Neruda::Config.settings['lang'] || 'en')
|
105
139
|
R18n::Filters.on(:named_variables)
|
106
140
|
|
107
141
|
Dir.glob("\#{neruda_spec.gem_dir}/lib/tasks/*.rake").each { |r| import r }
|
@@ -112,14 +146,14 @@ class Pablo
|
|
112
146
|
end
|
113
147
|
end
|
114
148
|
|
115
|
-
|
116
|
-
optparser =
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
opts.send(opt[:meth] || :on, short, long, opt[:desc])
|
121
|
-
end
|
149
|
+
optparser = OptionParser.new
|
150
|
+
optparser.version = Neruda::VERSION
|
151
|
+
|
152
|
+
Neruda::Utils::PABLO_OPTIONS.each do |k, opt|
|
153
|
+
optparser.send(opt[:meth] || :on, *Neruda::Utils.decorate_option(k))
|
122
154
|
end
|
155
|
+
|
156
|
+
params = {}
|
123
157
|
optparser.parse!(into: params)
|
124
158
|
|
125
159
|
if params[:version]
|
@@ -133,10 +167,13 @@ if ARGV[0] == 'help'
|
|
133
167
|
end
|
134
168
|
pablo = Pablo.new(params)
|
135
169
|
command = "pablo_#{ARGV[0]}".to_sym
|
136
|
-
|
137
|
-
|
170
|
+
cmd_err = !pablo.respond_to?(command)
|
171
|
+
if params[:help] || cmd_err
|
172
|
+
cmd_err = false if params[:help] && !ARGV[0]
|
173
|
+
pablo.pablo_help(ARGV[0], error: cmd_err)
|
174
|
+
end
|
138
175
|
ARGV.shift
|
139
176
|
|
140
|
-
init_cmds = [
|
177
|
+
init_cmds = [:pablo_init, :pablo_config]
|
141
178
|
pablo.pablo_init unless File.exist?('config.yml') || init_cmds.include?(command)
|
142
179
|
pablo.send command
|
data/lib/neruda/config.rb
CHANGED
@@ -53,8 +53,17 @@ module Neruda
|
|
53
53
|
# @param new_config [Hash] the settings to save
|
54
54
|
# @return [Hash] the new settings after save
|
55
55
|
def save(new_config)
|
56
|
+
# Do not save obvious default config values. We'll always try to
|
57
|
+
# save author and lang as they default on system variables,
|
58
|
+
# which may be different from a system to another. Thus it may
|
59
|
+
# be confusing if one use neruda on two different computer and
|
60
|
+
# these params always change.
|
61
|
+
new_config.delete_if do |k, v|
|
62
|
+
['domain', 'public_folder', 'templates', 'theme'].include?(k) \
|
63
|
+
&& v == default_settings[k]
|
64
|
+
end
|
56
65
|
IO.write 'config.yml', new_config.to_yaml
|
57
|
-
|
66
|
+
load_settings # Reload config, taking default settings into account
|
58
67
|
end
|
59
68
|
|
60
69
|
# Load the given settings as if they comes from the ~config.yml~ file.
|
@@ -66,28 +75,62 @@ module Neruda
|
|
66
75
|
# @param config [Hash] the settings to artificially load
|
67
76
|
# @return [Hash] the new settings
|
68
77
|
def load_test(config)
|
69
|
-
@
|
70
|
-
|
78
|
+
@sources = nil # Reset sources
|
79
|
+
@config = default_settings.merge config
|
80
|
+
end
|
81
|
+
|
82
|
+
# Return the qualified projects sources list.
|
83
|
+
#
|
84
|
+
# @return [Array] the fully qualified projects sources list
|
85
|
+
def sources
|
86
|
+
return @sources if @sources
|
87
|
+
default_sources = [{ 'path' => 'src', 'target' => '.' }]
|
88
|
+
@sources = (settings['sources'] || default_sources).map do |s|
|
89
|
+
build_source(s)
|
90
|
+
end.compact
|
71
91
|
end
|
72
92
|
|
73
93
|
private
|
74
94
|
|
75
95
|
def load_settings
|
76
|
-
@
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
96
|
+
@sources = nil
|
97
|
+
conf_file = 'config.yml'
|
98
|
+
if File.exist? conf_file
|
99
|
+
@config = default_settings.merge(YAML.load_file(conf_file)).freeze
|
100
|
+
else
|
101
|
+
@config = default_settings
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def extract_lang_from_env(default)
|
106
|
+
(ENV['LANG'] || default).split('_', 2).first
|
107
|
+
end
|
108
|
+
|
109
|
+
def default_settings
|
110
|
+
return @default_settings if @default_settings
|
111
|
+
@default_settings = {
|
112
|
+
'author' => (ENV['USER'] || ''),
|
113
|
+
'domain' => '',
|
114
|
+
'lang' => extract_lang_from_env('en'),
|
115
|
+
'public_folder' => 'public_html',
|
116
|
+
'templates' => [],
|
117
|
+
'theme' => 'default'
|
118
|
+
}.freeze
|
81
119
|
end
|
82
120
|
|
83
|
-
def
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
121
|
+
def build_source(seed)
|
122
|
+
opts = { 'recursive' => true, 'is_blog' => false }
|
123
|
+
case seed
|
124
|
+
when String
|
125
|
+
opts['path'] = seed
|
126
|
+
when Hash
|
127
|
+
opts.merge! seed
|
128
|
+
end
|
129
|
+
return nil unless opts.has_key?('path')
|
130
|
+
opts['path'] = File.expand_path(opts['path'])
|
131
|
+
opts['name'] ||= File.basename(opts['path']).sub(/^\./, '')
|
132
|
+
opts['target'] ||= opts['name']
|
133
|
+
opts
|
91
134
|
end
|
92
135
|
end
|
93
136
|
end
|
@@ -1,28 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'open-uri'
|
4
|
+
require 'neruda/version'
|
4
5
|
|
5
6
|
module Neruda
|
6
7
|
# This module contains utilitary methods to ease ~org-config.el~
|
7
8
|
# file generation
|
8
9
|
module LispConfig
|
9
|
-
# Fetch and return the last published version of
|
10
|
+
# Fetch and return the last published version of Org.
|
10
11
|
#
|
11
|
-
# @return [String] the new x.x.x version string of
|
12
|
+
# @return [String] the new x.x.x version string of Org
|
12
13
|
def org_last_version
|
13
14
|
return @org_version if @org_version
|
14
|
-
|
15
|
+
if File.exist?('tmp/__last_org_version__')
|
16
|
+
@org_version = IO.read('tmp/__last_org_version__')
|
17
|
+
return @org_version
|
18
|
+
end
|
19
|
+
index = URI('https://orgmode.org/index.html').open.read
|
15
20
|
last_ver = index.match(/https:\/\/orgmode\.org\/org-([0-9.]+)\.tar\.gz/)
|
16
21
|
# :nocov:
|
17
22
|
if last_ver.nil?
|
18
23
|
warn 'Org last version not found'
|
19
24
|
return nil
|
20
25
|
end
|
26
|
+
FileUtils.mkdir_p 'tmp'
|
27
|
+
IO.write('tmp/__last_org_version__', last_ver[1])
|
21
28
|
# :nocov:
|
22
29
|
@org_version = last_ver[1]
|
23
30
|
end
|
24
31
|
|
25
|
-
# Generate emacs lisp configuration file for
|
32
|
+
# Generate emacs lisp configuration file for Org and write it.
|
26
33
|
#
|
27
34
|
# This method saves the generated configuration in the file
|
28
35
|
# ~org-config.el~ at the root of your project, overwriting it if it
|
@@ -30,15 +37,16 @@ module Neruda
|
|
30
37
|
#
|
31
38
|
# @return [Integer] the length written (as returned by the
|
32
39
|
# underlying ~IO.write~ method call)
|
33
|
-
def write_org_lisp_config
|
34
|
-
projects = org_generate_projects
|
40
|
+
def write_org_lisp_config(with_tags: false)
|
41
|
+
projects = org_generate_projects(with_tags: with_tags)
|
35
42
|
workdir = Dir.pwd
|
36
43
|
content = IO.read(File.expand_path('./org-config.el', __dir__))
|
44
|
+
.gsub('__VERSION__', Neruda::VERSION)
|
37
45
|
.gsub('__WORK_DIR__', workdir)
|
38
46
|
.gsub('__NERUDA_DIR__', __dir__)
|
39
47
|
.gsub('__ORG_VER__', org_last_version)
|
40
|
-
.gsub('__ALL_PROJECTS__', all_projects(projects)
|
41
|
-
.gsub('__THEME_CONFIG__',
|
48
|
+
.gsub('__ALL_PROJECTS__', all_projects(projects))
|
49
|
+
.gsub('__THEME_CONFIG__', org_default_theme_config)
|
42
50
|
.gsub('__ALL_PROJECTS_NAMES__', project_names(projects))
|
43
51
|
.gsub('__LONG_DATE_FMT__', r18n_full_datetime_format)
|
44
52
|
.gsub('__AUTHOR_EMAIL__', settings['author_email'] || '')
|
@@ -49,8 +57,8 @@ module Neruda
|
|
49
57
|
# Generate emacs directory variables file.
|
50
58
|
#
|
51
59
|
# This method generate the file ~.dir-locals.el~, which is
|
52
|
-
# responsible to load neruda
|
53
|
-
#
|
60
|
+
# responsible to load neruda Org settings when visiting an Org file
|
61
|
+
# of this neruda instance.
|
54
62
|
#
|
55
63
|
# @return [Integer] the length written (as returned by the
|
56
64
|
# underlying ~IO.write~ method call)
|
@@ -76,69 +84,136 @@ module Neruda
|
|
76
84
|
)
|
77
85
|
end
|
78
86
|
|
87
|
+
def ruby_to_lisp_boolean(value)
|
88
|
+
return 't' if value == true
|
89
|
+
'nil'
|
90
|
+
end
|
91
|
+
|
79
92
|
def project_names(projects)
|
80
|
-
projects.keys.map
|
81
|
-
|
93
|
+
names = projects.keys.map do |p|
|
94
|
+
["\"#{p}\"", "\"#{p}-assets\""]
|
95
|
+
end.flatten
|
96
|
+
unless settings['theme'] == 'default'
|
97
|
+
names << "\"theme-#{settings['theme']}\""
|
98
|
+
end
|
99
|
+
sources.each do |s|
|
100
|
+
# Default theme defined in settings is already included
|
101
|
+
next unless s['theme'] && s['theme'] != settings['theme']
|
102
|
+
# Never include theme named 'default' as it does not rely on any
|
103
|
+
# file to export.
|
104
|
+
next if s['theme'] == 'default'
|
105
|
+
theme = "\"theme-#{s['theme']}\""
|
106
|
+
next if names.include? theme
|
107
|
+
names << theme
|
108
|
+
end
|
109
|
+
names.join(' ')
|
82
110
|
end
|
83
111
|
|
84
112
|
def all_projects(projects)
|
85
113
|
projects.values.join("\n").strip
|
86
|
-
.gsub(/\n\n/, "\n")
|
114
|
+
.gsub(/\n\s*\n/, "\n")
|
87
115
|
.gsub(/\n/, "\n ")
|
88
116
|
end
|
89
117
|
|
90
|
-
|
91
|
-
|
92
|
-
|
118
|
+
# Return the full path to the publication path of a given project
|
119
|
+
# configuration.
|
120
|
+
#
|
121
|
+
# @param project [Hash] a project configuration (as extracted from
|
122
|
+
# the ~sources~ key)
|
123
|
+
# @return [String] the full path to the target dir of this project
|
124
|
+
def publication_path(project)
|
93
125
|
publish_in = [Dir.pwd, settings['public_folder']]
|
94
|
-
publish_in <<
|
95
|
-
publish_in
|
96
|
-
|
97
|
-
|
126
|
+
publish_in << project['target'] unless project['target'] == '.'
|
127
|
+
publish_in.join('/')
|
128
|
+
end
|
129
|
+
|
130
|
+
def org_project(project_name, opts)
|
131
|
+
publish_in = publication_path(opts)
|
132
|
+
other_lines = [
|
133
|
+
format(':recursive %<value>s',
|
134
|
+
value: ruby_to_lisp_boolean(opts['recursive']))
|
135
|
+
]
|
98
136
|
if opts['exclude']
|
99
|
-
|
100
|
-
|
101
|
-
recline << ":exclude \"#{default_ex_ptrn}\""
|
137
|
+
other_lines << format(':exclude "%<value>s"',
|
138
|
+
value: opts['exclude'])
|
102
139
|
end
|
140
|
+
themeconf = org_theme_config(opts['theme'])
|
103
141
|
<<~ORGPROJECT
|
104
142
|
("#{project_name}"
|
105
|
-
:base-directory "#{
|
143
|
+
:base-directory "#{opts['path']}"
|
106
144
|
:base-extension "org"
|
107
|
-
|
145
|
+
#{other_lines.join("\n ")}
|
108
146
|
:publishing-directory "#{publish_in}"
|
109
147
|
:publishing-function org-html-publish-to-html
|
110
148
|
:section-numbers nil
|
111
149
|
:with-toc nil
|
112
|
-
#{
|
150
|
+
#{opts['org_headers']})
|
113
151
|
("#{project_name}-assets"
|
114
|
-
:base-directory "#{
|
152
|
+
:base-directory "#{opts['path']}"
|
115
153
|
:base-extension "jpg\\\\\\|gif\\\\\\|png\\\\\\|svg\\\\\\|pdf"
|
116
|
-
|
154
|
+
#{other_lines[0]}
|
117
155
|
:publishing-directory "#{publish_in}"
|
118
156
|
:publishing-function org-publish-attachment)
|
157
|
+
#{themeconf}
|
119
158
|
ORGPROJECT
|
120
159
|
end
|
121
160
|
|
122
|
-
def
|
123
|
-
|
161
|
+
def org_default_postamble
|
162
|
+
<<~POSTAMBLE
|
124
163
|
<p><span class="author">#{R18n.t.neruda.org.postamble.written_by}</span>
|
125
164
|
#{R18n.t.neruda.org.postamble.with_emacs}</p>
|
126
165
|
<p class="date">#{R18n.t.neruda.org.postamble.last_modification}</p>
|
127
166
|
<p class="validation">%v</p>
|
128
167
|
POSTAMBLE
|
129
|
-
|
130
|
-
|
131
|
-
|
168
|
+
end
|
169
|
+
|
170
|
+
def org_default_html_head
|
171
|
+
<<~HTMLHEAD
|
172
|
+
<link rel="stylesheet" type="text/css" media="screen"
|
173
|
+
href="__DOMAIN__/assets/__THEME__/css/style.css">
|
174
|
+
<link rel="stylesheet" type="text/css" media="screen"
|
175
|
+
href="__DOMAIN__/assets/__THEME__/css/htmlize.css">
|
176
|
+
__ATOM_FEED__
|
177
|
+
HTMLHEAD
|
178
|
+
end
|
179
|
+
|
180
|
+
def org_default_html_options(project)
|
181
|
+
curtheme = project['theme'] || settings['theme']
|
182
|
+
if curtheme.nil? || curtheme == 'default'
|
183
|
+
return { 'html-head' => '__ATOM_FEED__',
|
184
|
+
'html-postamble' => org_default_postamble,
|
185
|
+
'html-head-include-default-style' => 't',
|
186
|
+
'html-head-include-scripts' => 't' }
|
187
|
+
end
|
188
|
+
{ 'html-head' => org_default_html_head,
|
189
|
+
'html-postamble' => org_default_postamble,
|
190
|
+
'html-head-include-default-style' => 'nil',
|
132
191
|
'html-head-include-scripts' => 'nil' }
|
133
192
|
end
|
134
193
|
|
135
|
-
def
|
136
|
-
|
137
|
-
|
194
|
+
def expand_vars_in_html_head(head, project)
|
195
|
+
curtheme = project['theme'] || settings['theme']
|
196
|
+
# Head may be frozen when coming from settings
|
197
|
+
head = head.gsub('__THEME__', curtheme)
|
198
|
+
.gsub('__DOMAIN__', settings['domain'])
|
199
|
+
return head.gsub('__ATOM_FEED__', '') unless project['is_blog']
|
200
|
+
atomfeed = <<~ATOMFEED
|
201
|
+
<link rel="alternate" type="application/atom+xml" title="Atom 1.0"
|
202
|
+
href="#{settings['domain']}/feeds/index.xml" />
|
203
|
+
ATOMFEED
|
204
|
+
head.gsub('__ATOM_FEED__', atomfeed)
|
205
|
+
end
|
206
|
+
|
207
|
+
def build_project_org_headers(project)
|
208
|
+
orgtplopts = org_default_html_options(project).merge(
|
209
|
+
settings['org-html'] || {}, project['org-html'] || {}
|
210
|
+
)
|
138
211
|
orgtpl = []
|
212
|
+
truthy_val = ['t', 'nil', '1'].freeze
|
139
213
|
orgtplopts.each do |k, v|
|
214
|
+
v = expand_vars_in_html_head(v, project) if k == 'html-head'
|
140
215
|
val = v.strip.gsub(/"/, '\"')
|
141
|
-
if
|
216
|
+
if truthy_val.include? val
|
142
217
|
orgtpl << ":#{k} #{val}"
|
143
218
|
else
|
144
219
|
orgtpl << ":#{k} \"#{val}\""
|
@@ -147,55 +222,41 @@ module Neruda
|
|
147
222
|
orgtpl.join("\n ")
|
148
223
|
end
|
149
224
|
|
150
|
-
def org_generate_projects
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
next unless opts.has_key?('path')
|
162
|
-
pname = File.basename(opts['path']).sub(/^\./, '')
|
163
|
-
projects[pname] = org_project(pname, opts)
|
225
|
+
def org_generate_projects(with_tags: false)
|
226
|
+
projects = {}
|
227
|
+
projects_sources = sources
|
228
|
+
if with_tags
|
229
|
+
tags_conf = build_source('tags')
|
230
|
+
tags_conf['recursive'] = false
|
231
|
+
projects_sources << tags_conf
|
232
|
+
end
|
233
|
+
projects_sources.each do |opts|
|
234
|
+
opts['org_headers'] = build_project_org_headers(opts)
|
235
|
+
projects[opts['name']] = org_project(opts['name'], opts)
|
164
236
|
end
|
165
237
|
projects
|
166
238
|
end
|
167
239
|
|
168
|
-
def
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
else
|
174
|
-
sourcedir = workdir
|
240
|
+
def org_default_theme_config
|
241
|
+
theme_config = org_theme_config(settings['theme'])
|
242
|
+
return theme_config if theme_config == ''
|
243
|
+
output = theme_config.split("\n").map do |line|
|
244
|
+
" #{line}"
|
175
245
|
end
|
176
|
-
|
177
|
-
("theme"
|
178
|
-
:base-directory "#{sourcedir}/themes/#{curtheme}"
|
179
|
-
:base-extension "jpg\\\\\\|gif\\\\\\|png\\\\\\|js\\\\\\|css\\\\\\|otf\\\\\\|ttf\\\\\\|woff2?"
|
180
|
-
:recursive t
|
181
|
-
:publishing-directory "#{workdir}/#{settings['public_folder']}/assets"
|
182
|
-
:publishing-function org-publish-attachment)
|
183
|
-
THEMECONFIG
|
246
|
+
format("\n%<conf>s", conf: output.join("\n"))
|
184
247
|
end
|
185
248
|
|
186
|
-
def
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
href="#{settings['domain']}/feeds/index.xml" />
|
198
|
-
ATOM
|
249
|
+
def org_theme_config(theme)
|
250
|
+
return '' if theme.nil? || theme == 'default'
|
251
|
+
workdir = Dir.pwd
|
252
|
+
<<~THEMECONFIG
|
253
|
+
("theme-#{theme}"
|
254
|
+
:base-directory "#{workdir}/themes/#{theme}"
|
255
|
+
:base-extension "jpg\\\\\\|gif\\\\\\|png\\\\\\|js\\\\\\|css\\\\\\|otf\\\\\\|ttf\\\\\\|woff2?"
|
256
|
+
:recursive t
|
257
|
+
:publishing-directory "#{workdir}/#{settings['public_folder']}/assets/#{theme}"
|
258
|
+
:publishing-function org-publish-attachment)
|
259
|
+
THEMECONFIG
|
199
260
|
end
|
200
261
|
end
|
201
262
|
end
|