fronde 0.3.0 → 0.3.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 +4 -4
- data/lib/fronde/config/lisp_config.rb +114 -57
- data/lib/fronde/config/org-config.el +2 -0
- data/lib/fronde/config/ox-fronde.el +9 -2
- data/lib/fronde/org_file.rb +0 -3
- data/lib/fronde/version.rb +1 -1
- data/lib/tasks/org.rake +8 -1
- data/locales/en.yml +4 -3
- data/locales/fr.yml +2 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2270e37b7e8d42fa6a70cc1844bcc883db47e21268e463db721887309b65ca23
|
4
|
+
data.tar.gz: 2c17f8cf073c980a6050fbad6a2bc91f07999dc0455b0add8d13b234b2609ed9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63906ee9ae84ab6a1b81417dae22e9ab2d90fd0c348c435d35c309568505e5d39d13f98ce5c86c80474f0927796422fe3e89518faebd5c5a1a298a3d16722392
|
7
|
+
data.tar.gz: 399c76bd432a76be07efe3729a538e6f2fcee1fa4448043ff637cc77aae7a14df858794f0160d455ffef74ed965267d2f3194a94207bd47bb588c2aa3bb58888
|
@@ -42,7 +42,7 @@ module Fronde
|
|
42
42
|
.gsub('__WORK_DIR__', workdir)
|
43
43
|
.gsub('__FRONDE_DIR__', __dir__)
|
44
44
|
.gsub('__ORG_VER__', org_last_version)
|
45
|
-
.gsub('__ALL_PROJECTS__',
|
45
|
+
.gsub('__ALL_PROJECTS__', projects.values.join("\n "))
|
46
46
|
.gsub('__THEME_CONFIG__', org_default_theme_config)
|
47
47
|
.gsub('__ALL_PROJECTS_NAMES__', project_names(projects))
|
48
48
|
.gsub('__LONG_DATE_FMT__', r18n_full_datetime_format)
|
@@ -109,12 +109,6 @@ module Fronde
|
|
109
109
|
names.join(' ')
|
110
110
|
end
|
111
111
|
|
112
|
-
def all_projects(projects)
|
113
|
-
projects.values.join("\n").strip
|
114
|
-
.gsub(/\n\s*\n/, "\n")
|
115
|
-
.gsub(/\n/, "\n ")
|
116
|
-
end
|
117
|
-
|
118
112
|
# Return the full path to the publication path of a given project
|
119
113
|
# configuration.
|
120
114
|
#
|
@@ -122,49 +116,60 @@ module Fronde
|
|
122
116
|
# the ~sources~ key)
|
123
117
|
# @return [String] the full path to the target dir of this project
|
124
118
|
def publication_path(project)
|
125
|
-
publish_in = [Dir.pwd
|
119
|
+
publish_in = [Dir.pwd]
|
120
|
+
if project['type'] == 'gemini'
|
121
|
+
publish_in << (settings['gemini_public_folder'] || 'public_gmi')
|
122
|
+
else
|
123
|
+
publish_in << settings['public_folder']
|
124
|
+
end
|
126
125
|
publish_in << project['target'] unless project['target'] == '.'
|
127
126
|
publish_in.join('/')
|
128
127
|
end
|
129
128
|
|
129
|
+
# Return the publication function needed for a given project
|
130
|
+
# configuration.
|
131
|
+
#
|
132
|
+
# @param project [Hash] a project configuration (as extracted from
|
133
|
+
# the ~sources~ key)
|
134
|
+
# @return [String] the org publication function name
|
135
|
+
def publication_function(project)
|
136
|
+
case project['type']
|
137
|
+
when 'gemini'
|
138
|
+
'org-gmi-publish-to-gemini'
|
139
|
+
else
|
140
|
+
'org-html-publish-to-html'
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
130
144
|
def org_project(project_name, opts)
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
145
|
+
shared_lines = org_project_shared_lines(opts)
|
146
|
+
project_config = [
|
147
|
+
org_project_config(project_name, opts, shared_lines),
|
148
|
+
org_assets_config(project_name, shared_lines)
|
135
149
|
]
|
136
|
-
if opts['exclude']
|
137
|
-
other_lines << format(':exclude "%<value>s"',
|
138
|
-
value: opts['exclude'])
|
139
|
-
end
|
140
150
|
themeconf = org_theme_config(opts['theme'])
|
141
|
-
|
142
|
-
|
143
|
-
:base-directory "#{opts['path']}"
|
144
|
-
:base-extension "org"
|
145
|
-
#{other_lines.join("\n ")}
|
146
|
-
:publishing-directory "#{publish_in}"
|
147
|
-
:publishing-function org-html-publish-to-html
|
148
|
-
#{opts['org_headers']})
|
149
|
-
("#{project_name}-assets"
|
150
|
-
:base-directory "#{opts['path']}"
|
151
|
-
:base-extension "jpg\\\\\\|gif\\\\\\|png\\\\\\|svg\\\\\\|pdf"
|
152
|
-
#{other_lines[0]}
|
153
|
-
:publishing-directory "#{publish_in}"
|
154
|
-
:publishing-function org-publish-attachment)
|
155
|
-
#{themeconf}
|
156
|
-
ORGPROJECT
|
151
|
+
project_config << themeconf unless themeconf == ''
|
152
|
+
project_config.join("\n ")
|
157
153
|
end
|
158
154
|
|
159
|
-
def
|
155
|
+
def org_default_html_postamble
|
160
156
|
<<~POSTAMBLE
|
161
157
|
<p><span class="author">#{R18n.t.fronde.org.postamble.written_by}</span>
|
162
|
-
#{R18n.t.fronde.org.postamble.
|
158
|
+
#{R18n.t.fronde.org.postamble.with_emacs_html}</p>
|
163
159
|
<p class="date">#{R18n.t.fronde.org.postamble.last_modification}</p>
|
164
160
|
<p class="validation">%v</p>
|
165
161
|
POSTAMBLE
|
166
162
|
end
|
167
163
|
|
164
|
+
def org_default_gemini_postamble
|
165
|
+
format(
|
166
|
+
"📅 %<date>s\n📝 %<author>s %<creator>s",
|
167
|
+
author: R18n.t.fronde.org.postamble.written_by,
|
168
|
+
creator: R18n.t.fronde.org.postamble.with_emacs,
|
169
|
+
date: R18n.t.fronde.org.postamble.last_modification
|
170
|
+
)
|
171
|
+
end
|
172
|
+
|
168
173
|
def org_default_html_head
|
169
174
|
<<~HTMLHEAD
|
170
175
|
<link rel="stylesheet" type="text/css" media="screen"
|
@@ -177,9 +182,7 @@ module Fronde
|
|
177
182
|
|
178
183
|
def org_default_html_options(project)
|
179
184
|
defaults = {
|
180
|
-
'
|
181
|
-
'with-toc' => 'nil',
|
182
|
-
'html-postamble' => org_default_postamble,
|
185
|
+
'html-postamble' => org_default_html_postamble,
|
183
186
|
'html-head' => '__ATOM_FEED__',
|
184
187
|
'html-head-include-default-style' => 't',
|
185
188
|
'html-head-include-scripts' => 't'
|
@@ -192,6 +195,23 @@ module Fronde
|
|
192
195
|
defaults
|
193
196
|
end
|
194
197
|
|
198
|
+
def org_publish_options(project)
|
199
|
+
defaults = {
|
200
|
+
'section-numbers' => 'nil',
|
201
|
+
'with-toc' => 'nil'
|
202
|
+
}
|
203
|
+
if project['type'] == 'gemini'
|
204
|
+
defaults['gemini-postamble'] = org_default_gemini_postamble
|
205
|
+
else
|
206
|
+
defaults.merge!(
|
207
|
+
org_default_html_options(project),
|
208
|
+
settings['org-html'] || {},
|
209
|
+
project['org-html'] || {}
|
210
|
+
)
|
211
|
+
end
|
212
|
+
defaults.merge(project['org-options'] || {})
|
213
|
+
end
|
214
|
+
|
195
215
|
def expand_vars_in_html_head(head, project)
|
196
216
|
curtheme = project['theme'] || settings['theme']
|
197
217
|
# Head may be frozen when coming from settings
|
@@ -212,21 +232,17 @@ module Fronde
|
|
212
232
|
end
|
213
233
|
|
214
234
|
def build_project_org_headers(project)
|
215
|
-
orgtplopts =
|
216
|
-
settings['org-html'] || {}, project['org-html'] || {}
|
217
|
-
)
|
218
|
-
orgtpl = []
|
235
|
+
orgtplopts = org_publish_options(project)
|
219
236
|
lisp_keywords = ['t', 'nil', '1', '-1', '0'].freeze
|
220
|
-
orgtplopts.
|
237
|
+
orgtplopts.map do |k, v|
|
221
238
|
v = expand_vars_in_html_head(v, project) if k == 'html-head'
|
222
239
|
val = cast_lisp_value(v)
|
223
240
|
if lisp_keywords.include? val
|
224
|
-
|
241
|
+
":#{k} #{val}"
|
225
242
|
else
|
226
|
-
|
243
|
+
":#{k} \"#{val}\""
|
227
244
|
end
|
228
245
|
end
|
229
|
-
orgtpl.join("\n ")
|
230
246
|
end
|
231
247
|
|
232
248
|
def org_generate_projects(with_tags: false)
|
@@ -247,23 +263,64 @@ module Fronde
|
|
247
263
|
def org_default_theme_config
|
248
264
|
theme_config = org_theme_config(settings['theme'])
|
249
265
|
return theme_config if theme_config == ''
|
250
|
-
|
251
|
-
" #{line}"
|
252
|
-
end
|
253
|
-
format("\n%<conf>s", conf: output.join("\n"))
|
266
|
+
format("\n %<conf>s", conf: theme_config)
|
254
267
|
end
|
255
268
|
|
256
269
|
def org_theme_config(theme)
|
257
270
|
return '' if theme.nil? || theme == 'default'
|
258
271
|
workdir = Dir.pwd
|
259
|
-
|
260
|
-
("theme
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
272
|
+
[
|
273
|
+
format('("theme-%<theme>s"', theme: theme),
|
274
|
+
format(' :base-directory "%<wd>s/themes/%<theme>s"',
|
275
|
+
wd: workdir, theme: theme),
|
276
|
+
# rubocop:disable Layout/LineLength
|
277
|
+
' :base-extension "jpg\\\\\\|gif\\\\\\|png\\\\\\|js\\\\\\|css\\\\\\|otf\\\\\\|ttf\\\\\\|woff2?"',
|
278
|
+
# rubocop:enable Layout/LineLength
|
279
|
+
' :recursive t',
|
280
|
+
format(' :publishing-directory "%<wd>s/%<pub>s/assets/%<theme>s"',
|
281
|
+
wd: workdir, pub: settings['public_folder'], theme: theme),
|
282
|
+
' :publishing-function org-publish-attachment)'
|
283
|
+
].join("\n ").strip
|
284
|
+
end
|
285
|
+
|
286
|
+
def org_project_shared_lines(project)
|
287
|
+
[
|
288
|
+
format(':base-directory "%<path>s"', path: project['path']),
|
289
|
+
format(
|
290
|
+
':publishing-directory "%<path>s"',
|
291
|
+
path: publication_path(project)
|
292
|
+
),
|
293
|
+
format(
|
294
|
+
':recursive %<rec>s',
|
295
|
+
rec: ruby_to_lisp_boolean(project['recursive'])
|
296
|
+
)
|
297
|
+
]
|
298
|
+
end
|
299
|
+
|
300
|
+
def org_project_config(project_name, project, shared_lines)
|
301
|
+
project_lines = [
|
302
|
+
format('"%<name>s"', name: project_name),
|
303
|
+
':base-extension "org"',
|
304
|
+
format(
|
305
|
+
':publishing-function %<fun>s',
|
306
|
+
fun: publication_function(project)
|
307
|
+
)
|
308
|
+
] + shared_lines + project['org_headers']
|
309
|
+
if project['exclude']
|
310
|
+
project_lines << format(
|
311
|
+
':exclude "%<value>s"', value: project['exclude']
|
312
|
+
)
|
313
|
+
end
|
314
|
+
format('(%<pr>s)', pr: project_lines.join("\n "))
|
315
|
+
end
|
316
|
+
|
317
|
+
def org_assets_config(project_name, shared_lines)
|
318
|
+
assets_lines = [
|
319
|
+
format('"%<name>s-assets"', name: project_name),
|
320
|
+
':base-extension "jpg\\\\\\|gif\\\\\\|png\\\\\\|svg\\\\\\|pdf"',
|
321
|
+
':publishing-function org-publish-attachment'
|
322
|
+
] + shared_lines
|
323
|
+
format('(%<assets>s)', assets: assets_lines.join("\n "))
|
267
324
|
end
|
268
325
|
end
|
269
326
|
end
|
@@ -9,9 +9,11 @@
|
|
9
9
|
user-mail-address "__AUTHOR_EMAIL__"
|
10
10
|
user-full-name "__AUTHOR_NAME__"
|
11
11
|
org-html-metadata-timestamp-format "__LONG_DATE_FMT__"
|
12
|
+
org-gmi-timestamp-format "__LONG_DATE_FMT__"
|
12
13
|
org-publish-project-alist
|
13
14
|
`(__ALL_PROJECTS____THEME_CONFIG__
|
14
15
|
("website" :components (__ALL_PROJECTS_NAMES__))))
|
15
16
|
|
16
17
|
;; Load fronde lib
|
18
|
+
(load-file (expand-file-name "ox-gmi.el" "__WORK_DIR__/lib"))
|
17
19
|
(load-file (expand-file-name "ox-fronde.el" "__FRONDE_DIR__"))
|
@@ -30,6 +30,7 @@
|
|
30
30
|
|
31
31
|
(require 'org)
|
32
32
|
(require 'ox-html)
|
33
|
+
(require 'ox-gmi)
|
33
34
|
|
34
35
|
;;; Function Declarations
|
35
36
|
|
@@ -65,6 +66,12 @@ INFO is a plist used as a communication channel."
|
|
65
66
|
(org-export-data (plist-get info :description) info)))
|
66
67
|
output)))
|
67
68
|
|
69
|
+
(defun fronde/org-gmi-format-spec (upstream info)
|
70
|
+
"Return format specification for gemini postamble.
|
71
|
+
INFO is a plist used as a communication channel."
|
72
|
+
(let ((output (funcall upstream info)))
|
73
|
+
(push `(?n . ,(format "Fronde %s" fronde/version)) output)))
|
74
|
+
|
68
75
|
(defun fronde/org-i18n-export (link description format)
|
69
76
|
"Export a i18n link"
|
70
77
|
(let* ((splitted-link (split-string link "|"))
|
@@ -77,8 +84,7 @@ INFO is a plist used as a communication channel."
|
|
77
84
|
path lang desc)
|
78
85
|
(format "<a href=\"%s\">%s</a>" path desc)))
|
79
86
|
(`latex (format "\\href{%s}{%s}" path desc))
|
80
|
-
(
|
81
|
-
(_ path))))
|
87
|
+
(_ (format "%s (%s)" desc path)))))
|
82
88
|
|
83
89
|
(defun fronde/org-i18n-follow (link)
|
84
90
|
"Visit a i18n link"
|
@@ -108,6 +114,7 @@ INFO is a plist used as a communication channel."
|
|
108
114
|
(underline . "<span class=\"underline\">%s</span>")
|
109
115
|
(verbatim . "<code>%s</code>")))
|
110
116
|
(advice-add 'org-html-format-spec :around #'fronde/org-html-format-spec)
|
117
|
+
(advice-add 'org-gmi--format-spec :around #'fronde/org-gmi-format-spec)
|
111
118
|
|
112
119
|
(provide 'ox-fronde)
|
113
120
|
|
data/lib/fronde/org_file.rb
CHANGED
@@ -109,9 +109,6 @@ module Fronde
|
|
109
109
|
# @option opts [String] title ('') the title of the new Org file
|
110
110
|
# @option opts [String] author (system user or '') the author of the
|
111
111
|
# document
|
112
|
-
# @option opts [Boolean] verbose (false) if the
|
113
|
-
# {Fronde::OrgFileHtmlizer#publish publish} method should output
|
114
|
-
# emacs process messages
|
115
112
|
# @option opts [String] project the project owning this file
|
116
113
|
# must be stored
|
117
114
|
# @return [Fronde::OrgFile] the new instance of Fronde::OrgFile
|
data/lib/fronde/version.rb
CHANGED
data/lib/tasks/org.rake
CHANGED
@@ -67,7 +67,14 @@ namespace :org do
|
|
67
67
|
IO.write 'lib/htmlize.el', htmlize
|
68
68
|
end
|
69
69
|
|
70
|
-
file '
|
70
|
+
file 'lib/ox-gmi.el' => 'lib' do
|
71
|
+
ox_gmi = URI(
|
72
|
+
'https://git.umaneti.net/ox-gmi.el/plain/ox-gmi.el'
|
73
|
+
).open.read
|
74
|
+
IO.write 'lib/ox-gmi.el', ox_gmi
|
75
|
+
end
|
76
|
+
|
77
|
+
file 'var/lib/org-config.el' => ['lib/htmlize.el', 'lib/ox-gmi.el'] do
|
71
78
|
Fronde::Config.write_org_lisp_config
|
72
79
|
end
|
73
80
|
|
data/locales/en.yml
CHANGED
@@ -20,8 +20,8 @@ fronde:
|
|
20
20
|
no_command: 'ERROR: no command or unknown command given.'
|
21
21
|
no_file: 'ERROR: no file to open or edit.'
|
22
22
|
error:
|
23
|
-
label: An error
|
24
|
-
explanation: To see
|
23
|
+
label: An error occurred.
|
24
|
+
explanation: To see the error, run your command again with more verbosity, for example, fronde build -v
|
25
25
|
index:
|
26
26
|
unsorted: Unsorted
|
27
27
|
published_on: Published on %1
|
@@ -33,5 +33,6 @@ fronde:
|
|
33
33
|
org:
|
34
34
|
postamble:
|
35
35
|
written_by: Written by %a
|
36
|
-
with_emacs: 'with %c, and published with %N'
|
37
36
|
last_modification: Last modification on %C
|
37
|
+
with_emacs: 'with %c, and published with %n'
|
38
|
+
with_emacs_html: 'with %c, and published with %N'
|
data/locales/fr.yml
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fronde
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Étienne Deparis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|