fronde 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ext/nil_time.rb +3 -6
- data/lib/ext/time.rb +11 -8
- data/lib/ext/time_no_time.rb +12 -8
- data/lib/fronde/cli/commands.rb +7 -7
- data/lib/fronde/cli/data/fish_completion +20 -0
- data/lib/fronde/cli/helpers.rb +0 -2
- data/lib/fronde/cli/opt_parse.rb +11 -11
- data/lib/fronde/cli/throbber.rb +13 -7
- data/lib/fronde/cli.rb +1 -1
- data/lib/fronde/config/data/ox-fronde.el +44 -36
- data/lib/fronde/config/helpers.rb +1 -1
- data/lib/fronde/config/lisp.rb +1 -4
- data/lib/fronde/config.rb +9 -7
- data/lib/fronde/emacs.rb +22 -8
- data/lib/fronde/index/atom_generator.rb +1 -1
- data/lib/fronde/index/org_generator.rb +8 -6
- data/lib/fronde/index.rb +8 -3
- data/lib/fronde/org/file.rb +33 -13
- data/lib/fronde/org/file_extracter.rb +8 -0
- data/lib/fronde/org.rb +3 -3
- data/lib/fronde/source/gemini.rb +4 -4
- data/lib/fronde/source/html.rb +4 -4
- data/lib/fronde/source.rb +4 -4
- data/lib/fronde/sync/neocities.rb +13 -13
- data/lib/fronde/sync/rsync.rb +3 -3
- data/lib/fronde/sync.rb +2 -2
- data/lib/fronde/templater.rb +22 -45
- data/lib/fronde/version.rb +1 -1
- data/lib/tasks/cli.rake +45 -13
- data/lib/tasks/org.rake +19 -19
- data/lib/tasks/site.rake +57 -32
- data/lib/tasks/sync.rake +6 -14
- data/locales/en.yml +143 -82
- data/locales/fr.yml +153 -90
- metadata +18 -18
- data/lib/ext/r18n.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d233f108a209e4d5a02633de060293ce6f4981393555ebf5f53f16a25f6d3d0
|
4
|
+
data.tar.gz: 9efa6cd46fc4d6d33e98bcee3e7cb1dd43a179736bafb552f6ac3e7a8c5bb8ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1c7f18af62f3fbd02be2f025c7d6305a7ea1c3751a35490eee4402de3a4aebf11c211cc3efcc4d57d0b82e99807a439ef920eb67182f0f8313905b20d89fd15
|
7
|
+
data.tar.gz: 315634038a4eb1df1c07f019894a0b86b591649f58068d771811bc0bbb92402cc03f79ada03f716caae0e8219075937d1df63ab3e6453827fadb03763203d4da
|
data/lib/ext/nil_time.rb
CHANGED
@@ -10,12 +10,9 @@ class NilTime
|
|
10
10
|
''
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
def l18n_long_date_string(*)
|
18
|
-
''
|
13
|
+
%i[l18n_short_date_string l18n_long_date_string
|
14
|
+
l18n_long_date_no_year_string].each do |name|
|
15
|
+
define_method(name) { '' }
|
19
16
|
end
|
20
17
|
|
21
18
|
def l18n_short_date_html
|
data/lib/ext/time.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'r18n'
|
4
|
-
using R18nPatch
|
5
|
-
|
6
3
|
# Monkey patch to add some helpers
|
7
4
|
module TimePatch
|
8
5
|
refine Time do
|
@@ -10,7 +7,7 @@ module TimePatch
|
|
10
7
|
#
|
11
8
|
# @return [String] the localized Time string representation
|
12
9
|
def l18n_short_date_string
|
13
|
-
|
10
|
+
I18n.l to_date
|
14
11
|
end
|
15
12
|
|
16
13
|
# Format the current Time as a HTML `time` tag showing a short date.
|
@@ -22,11 +19,17 @@ module TimePatch
|
|
22
19
|
|
23
20
|
# Returns the current Time instance as a localized long string.
|
24
21
|
#
|
25
|
-
# @param with_year [Boolean] whether or not the string must contain
|
26
|
-
# the year
|
27
22
|
# @return [String] the localized Time string representation
|
28
|
-
def l18n_long_date_string
|
29
|
-
|
23
|
+
def l18n_long_date_string
|
24
|
+
I18n.l self, format: :long
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the current Time instance as a localized long string
|
28
|
+
# without year.
|
29
|
+
#
|
30
|
+
# @return [String] the localized Time string representation
|
31
|
+
def l18n_long_date_no_year_string
|
32
|
+
I18n.l self, format: :long_no_year
|
30
33
|
end
|
31
34
|
|
32
35
|
# Format the current Time as a HTML `time` tag showing a long date.
|
data/lib/ext/time_no_time.rb
CHANGED
@@ -1,20 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'r18n'
|
4
|
-
using R18nPatch
|
5
|
-
|
6
3
|
using TimePatch
|
7
4
|
|
8
5
|
# A time emulator to keep the fact that the time information was
|
9
6
|
# missing, even if it behaves as a Time object for the given date.
|
10
7
|
class TimeNoTime < Time
|
11
|
-
# Returns the current Time instance as a localized long string
|
8
|
+
# Returns the current Time instance as a localized long string
|
9
|
+
# without time.
|
10
|
+
#
|
11
|
+
# @return [String] the localized Time string representation
|
12
|
+
def l18n_long_date_string
|
13
|
+
I18n.l self, format: :long_no_time
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns the current Time instance as a localized long string
|
17
|
+
# without time nor year.
|
12
18
|
#
|
13
|
-
# @param with_year [Boolean] wether or not the string must contain the
|
14
|
-
# year
|
15
19
|
# @return [String] the localized Time string representation
|
16
|
-
def
|
17
|
-
|
20
|
+
def l18n_long_date_no_year_string
|
21
|
+
I18n.l self, format: :long_no_time_no_year
|
18
22
|
end
|
19
23
|
|
20
24
|
def self.parse_no_time(string)
|
data/lib/fronde/cli/commands.rb
CHANGED
@@ -71,26 +71,26 @@ module Fronde
|
|
71
71
|
@command = @argv.shift || 'basic' if @command == 'help'
|
72
72
|
cmd_opt = OptParse.command_options(@command)
|
73
73
|
label = cmd_opt[:label] || @command
|
74
|
-
output = [format_label(
|
74
|
+
output = [format_label(I18n.t('fronde.bin.usage', label:))]
|
75
75
|
cmd = cmd_opt[:name] || @command
|
76
|
-
output << format_label(
|
76
|
+
output << format_label(I18n.t("fronde.bin.commands.#{cmd}"))
|
77
77
|
output << OptParse.help_command_body(cmd)
|
78
|
-
|
78
|
+
puts output.join
|
79
79
|
true
|
80
80
|
end
|
81
81
|
|
82
82
|
private
|
83
83
|
|
84
84
|
def format_label(label)
|
85
|
-
return '' if label == '' || label.
|
85
|
+
return '' if label == '' || label.start_with?('Translation missing:')
|
86
86
|
|
87
|
-
format("%<label>s\n\n", label:
|
87
|
+
format("%<label>s\n\n", label:)
|
88
88
|
end
|
89
89
|
|
90
90
|
def file_name_from_title
|
91
|
-
title = @options[:title] ||
|
91
|
+
title = @options[:title] || I18n.t('fronde.bin.options.default_title')
|
92
92
|
# No title, nor a reliable file_path? Better abort
|
93
|
-
raise
|
93
|
+
raise I18n.t('fronde.error.bin.no_file') if title == ''
|
94
94
|
|
95
95
|
"#{Fronde::Slug.slug(title)}.org"
|
96
96
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
function __fronde_main_commands
|
2
|
+
echo {{ comcomp }}
|
3
|
+
end
|
4
|
+
|
5
|
+
function __fronde_no_command_yet
|
6
|
+
set -f cmd (__fish_print_cmd_args_without_options)
|
7
|
+
{%- for com in commands %}
|
8
|
+
{% unless forloop.first %}and {% endunless %}not contains {{ com }} $cmd
|
9
|
+
{%- endfor %}
|
10
|
+
end
|
11
|
+
|
12
|
+
complete -c fronde -e
|
13
|
+
complete -c fronde -f
|
14
|
+
complete -c fronde -x -n '__fronde_no_command_yet' -a '(__fronde_main_commands)'
|
15
|
+
complete -c fronde -n 'contains help (__fish_print_cmd_args_without_options)' -a '{{ commands | join ' ' }}'
|
16
|
+
complete -c fronde -n 'contains new (__fish_print_cmd_args_without_options)' -F
|
17
|
+
complete -c fronde -n 'contains open (__fish_print_cmd_args_without_options)' -F
|
18
|
+
{%- for compopt in details %}
|
19
|
+
complete -c fronde{% unless compopt.command == 'basic' %} -n 'contains {{ compopt.command }} (__fish_print_cmd_args_without_options)'{% endunless %} -s {{ compopt.short_no_dash }} -l {{ compopt.long_no_dash }}{% if compopt.keyword %} -r{% endif %}{% if compopt.choices %} -a '{{ compopt.choices | join ' ' }}'{% endif %} -d {% if compopt.help %}'{{ compopt.help }}'{% else %}{{ compopt.long_no_dash | capitalize }}{% endif %}
|
20
|
+
{%- endfor %}
|
data/lib/fronde/cli/helpers.rb
CHANGED
data/lib/fronde/cli/opt_parse.rb
CHANGED
@@ -10,13 +10,13 @@ module Fronde
|
|
10
10
|
'-a' => { long: 'author' },
|
11
11
|
'-f' => { long: 'force', boolean: true },
|
12
12
|
'-h' => { long: 'help', boolean: true, method: :on_tail,
|
13
|
-
help:
|
13
|
+
help: I18n.t('fronde.bin.options.help') },
|
14
14
|
'-l' => { long: 'lang', keyword: 'LOCALE' },
|
15
15
|
'-o' => { long: 'output', keyword: 'FORMAT', choices: %w[gemini html] },
|
16
16
|
'-t' => { long: 'title' },
|
17
17
|
'-v' => { long: 'verbose', boolean: true, method: :on_tail },
|
18
18
|
'-V' => { long: 'version', boolean: true, method: :on_tail,
|
19
|
-
help:
|
19
|
+
help: I18n.t('fronde.bin.options.version') }
|
20
20
|
}.freeze
|
21
21
|
|
22
22
|
# TODO: jekyll new [path] / jekyll build / jekyll clean / jekyll serve
|
@@ -28,13 +28,13 @@ module Fronde
|
|
28
28
|
FRONDE_COMMANDS = {
|
29
29
|
'new' => { opts: ['-a', '-l', '-o', '-t', '-v'], label: 'new <path>' },
|
30
30
|
'init' => { alias: 'new' },
|
31
|
-
'update' => {},
|
31
|
+
'update' => { opts: ['-v'] },
|
32
32
|
'config' => { alias: 'update' },
|
33
33
|
'preview' => {},
|
34
|
-
'open' => { opts: ['-a', '-l', '-t'
|
34
|
+
'open' => { opts: ['-a', '-l', '-t'], label: 'open <path>' },
|
35
35
|
'edit' => { alias: 'open' },
|
36
|
-
'build' => { opts: ['-f'] },
|
37
|
-
'publish' => {},
|
36
|
+
'build' => { opts: ['-f', '-v'] },
|
37
|
+
'publish' => { opts: ['-v'] },
|
38
38
|
'help' => {},
|
39
39
|
'basic' => { opts: ['-h', '-V'], label: '<command>' }
|
40
40
|
}.freeze
|
@@ -59,7 +59,7 @@ module Fronde
|
|
59
59
|
config = [short, long]
|
60
60
|
else
|
61
61
|
key = opt[:keyword] || opt[:long].upcase
|
62
|
-
config = [short, format('%<long>s %<key>s', long
|
62
|
+
config = [short, format('%<long>s %<key>s', long:, key:)]
|
63
63
|
end
|
64
64
|
config.push opt[:choices], opt[:help]
|
65
65
|
config.compact
|
@@ -86,9 +86,9 @@ module Fronde
|
|
86
86
|
command_opts_doc = summarize_command(command)
|
87
87
|
return '' if command_opts_doc == ''
|
88
88
|
|
89
|
-
body = [
|
89
|
+
body = [I18n.t('fronde.bin.options.cmd_title'), command_opts_doc]
|
90
90
|
if command == 'basic'
|
91
|
-
body += ['',
|
91
|
+
body += ['', I18n.t('fronde.bin.commands.cmd_title'), list_commands]
|
92
92
|
end
|
93
93
|
body.join("\n")
|
94
94
|
end
|
@@ -102,9 +102,9 @@ module Fronde
|
|
102
102
|
|
103
103
|
line = [' ', cmd.ljust(10)]
|
104
104
|
if opt.has_key? :alias
|
105
|
-
line <<
|
105
|
+
line << I18n.t('fronde.bin.commands.alias', alias: opt[:alias])
|
106
106
|
else
|
107
|
-
line <<
|
107
|
+
line << I18n.t("fronde.bin.commands.#{cmd}")
|
108
108
|
end
|
109
109
|
line.join(' ')
|
110
110
|
end.join("\n")
|
data/lib/fronde/cli/throbber.rb
CHANGED
@@ -35,11 +35,11 @@ module Fronde
|
|
35
35
|
raise e
|
36
36
|
# :nocov: not sure how to emulate a Ctrl+c in rspec
|
37
37
|
rescue Interrupt => e
|
38
|
-
show_message Rainbow(
|
38
|
+
show_message Rainbow(I18n.t('fronde.bin.interrupted')).red, "\n"
|
39
39
|
raise e
|
40
40
|
# :nocov:
|
41
41
|
else
|
42
|
-
show_message Rainbow(
|
42
|
+
show_message Rainbow(I18n.t('fronde.bin.done')).green, "\n"
|
43
43
|
end
|
44
44
|
|
45
45
|
class << self
|
@@ -56,10 +56,16 @@ module Fronde
|
|
56
56
|
#
|
57
57
|
# @param thread [Thread] the long-running operation to decorate
|
58
58
|
# @param message [String] the message to display before the throbber
|
59
|
+
# @param verbose [Boolean] whether the decoration should be shown
|
60
|
+
# or skipped
|
59
61
|
# @return [void]
|
60
|
-
def run(thread, message)
|
61
|
-
|
62
|
-
|
62
|
+
def run(thread, message, verbose)
|
63
|
+
if verbose
|
64
|
+
thread.join
|
65
|
+
else
|
66
|
+
throbber = new(thread, message)
|
67
|
+
throbber.run
|
68
|
+
end
|
63
69
|
end
|
64
70
|
end
|
65
71
|
|
@@ -93,8 +99,8 @@ module Fronde
|
|
93
99
|
format(
|
94
100
|
"%<message>s %<label>s\n%<explanation>s",
|
95
101
|
message: @message,
|
96
|
-
label: Rainbow(
|
97
|
-
explanation: Rainbow(
|
102
|
+
label: Rainbow(I18n.t('fronde.error.bin.label')).bold.red,
|
103
|
+
explanation: Rainbow(I18n.t('fronde.error.bin.explanation')).bold
|
98
104
|
)
|
99
105
|
)
|
100
106
|
end
|
data/lib/fronde/cli.rb
CHANGED
@@ -47,31 +47,37 @@
|
|
47
47
|
"Location of the local Org temporary directory.
|
48
48
|
This is where to place org timestamps and id locations.")
|
49
49
|
|
50
|
+
(defvar fronde--keywords-slugs-alist nil
|
51
|
+
"A list associating each keywords to its related slug.
|
52
|
+
|
53
|
+
Can be hydrated with `fronde--build-keywords-list'.")
|
54
|
+
|
55
|
+
(defun fronde--build-keywords-list ()
|
56
|
+
(let ((keywords-file (format "%s/keywords" fronde-org-temp-dir))
|
57
|
+
keywords-slugs)
|
58
|
+
(when (file-readable-p keywords-file)
|
59
|
+
(let ((content (with-temp-buffer
|
60
|
+
(insert-file-contents keywords-file)
|
61
|
+
(string-trim-right (buffer-string)))))
|
62
|
+
(mapcar
|
63
|
+
(lambda (line)
|
64
|
+
(push (split-string line "\x1f") keywords-slugs))
|
65
|
+
(split-string content "\x1e"))))
|
66
|
+
keywords-slugs))
|
67
|
+
|
50
68
|
(defun fronde--format-rich-keywords (info function)
|
51
69
|
"Extract keywords from INFO and apply FUNCTION on them.
|
52
70
|
FUNCTION is expected to format each keyword for a rich display for the
|
53
71
|
current export backend. FUNCTION must receive 3 arguments: the current
|
54
72
|
KEYWORD, its related SLUG and the current project BASE-URI."
|
55
|
-
(let ((base-uri (plist-get info :fronde-base-uri))
|
56
|
-
(current-path (symbol-file 'fronde--format-rich-keywords))
|
57
|
-
sluglib)
|
58
|
-
(when current-path
|
59
|
-
(setq sluglib
|
60
|
-
(expand-file-name
|
61
|
-
(format "%s../../slug" (file-name-directory current-path)))))
|
73
|
+
(let ((base-uri (plist-get info :fronde-base-uri)))
|
62
74
|
(mapcar
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
(shell-quote-argument k))))
|
70
|
-
k)))
|
71
|
-
(funcall function k slug base-uri)))
|
72
|
-
(split-string
|
73
|
-
(org-export-data (plist-get info :keywords) info)
|
74
|
-
",+ *"))))
|
75
|
+
(lambda (k)
|
76
|
+
(let ((slug (cadr (assoc k fronde--keywords-slugs-alist))))
|
77
|
+
(funcall function k slug base-uri)))
|
78
|
+
(split-string
|
79
|
+
(org-export-data (plist-get info :keywords) info)
|
80
|
+
",+ *"))))
|
75
81
|
|
76
82
|
(defun fronde--org-html-format-spec (upstream info)
|
77
83
|
"Advise UPSTREAM to return format specification for preamble and postamble.
|
@@ -79,35 +85,35 @@ INFO is a plist used as a communication channel."
|
|
79
85
|
(let ((output (funcall upstream info)))
|
80
86
|
(push `(?A . ,(format "<span class=\"author\">%s</span>"
|
81
87
|
(org-export-data (plist-get info :author) info)))
|
82
|
-
|
88
|
+
output)
|
83
89
|
(push `(?k . ,(org-export-data (plist-get info :keywords) info)) output)
|
84
90
|
(push `(?K . ,(format "<ul class=\"keywords-list\">\n%s</ul>"
|
85
91
|
(apply #'concat
|
86
92
|
(fronde--format-rich-keywords
|
87
93
|
info
|
88
|
-
|
94
|
+
(lambda (k slug base-uri)
|
89
95
|
(format "<li class=\"keyword\"><a href=\"%stags/%s.html\">%s</a></li>\n"
|
90
96
|
base-uri slug k))))))
|
91
|
-
|
97
|
+
output)
|
92
98
|
(push `(?l . ,(org-export-data (plist-get info :language) info)) output)
|
93
99
|
(push `(?n . ,(format "Fronde %s" fronde-version)) output)
|
94
100
|
(push `(?N . ,(format "<a href=\"https://etienne.depar.is/fronde/\">Fronde</a> %s" fronde-version)) output)
|
95
101
|
(push `(?x . ,(org-export-data (plist-get info :description) info)) output)
|
96
102
|
(push `(?X . ,(format "<p>%s</p>"
|
97
103
|
(org-export-data (plist-get info :description) info)))
|
98
|
-
|
104
|
+
output)))
|
99
105
|
|
100
106
|
(defun fronde--org-gmi-format-spec (upstream info)
|
101
107
|
"Advise UPSTREAM to return format specification for gemini postamble.
|
102
108
|
INFO is a plist used as a communication channel."
|
103
109
|
(let ((output (funcall upstream info)))
|
104
110
|
(push `(?K . ,(org-gmi--build-links-list
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
+
(fronde--format-rich-keywords
|
112
|
+
info
|
113
|
+
(lambda (k slug base-uri)
|
114
|
+
(list (format "%stags/%s.gmi" base-uri slug)
|
115
|
+
(format "🏷️ %s" k))))))
|
116
|
+
output)
|
111
117
|
(push `(?n . ,(format "Fronde %s" fronde-version)) output)))
|
112
118
|
|
113
119
|
(defun fronde--org-i18n-export (link description backend)
|
@@ -135,21 +141,23 @@ INFO is a plist used as a communication channel."
|
|
135
141
|
;;; Set configuration options
|
136
142
|
|
137
143
|
(setq fronde-org-temp-dir (expand-file-name "var/tmp" fronde-current-work-dir)
|
144
|
+
fronde--keywords-slugs-alist (fronde--build-keywords-list)
|
138
145
|
org-publish-timestamp-directory (expand-file-name "timestamps/" fronde-org-temp-dir)
|
139
146
|
org-id-locations-file (expand-file-name "id-locations.el" fronde-org-temp-dir)
|
140
147
|
make-backup-files nil
|
141
|
-
enable-local-variables
|
142
|
-
|
148
|
+
enable-dir-local-variables nil
|
149
|
+
enable-local-variables t ;; enforce default
|
150
|
+
org-confirm-babel-evaluate t ;; enforce default
|
143
151
|
org-export-with-broken-links t
|
144
152
|
org-html-doctype "html5"
|
145
153
|
org-html-html5-fancy t
|
146
154
|
org-html-htmlize-output-type 'css
|
147
155
|
org-html-text-markup-alist '((bold . "<strong>%s</strong>")
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
156
|
+
(code . "<code>%s</code>")
|
157
|
+
(italic . "<em>%s</em>")
|
158
|
+
(strike-through . "<del>%s</del>")
|
159
|
+
(underline . "<span class=\"underline\">%s</span>")
|
160
|
+
(verbatim . "<code>%s</code>")))
|
153
161
|
(advice-add 'org-html-format-spec :around #'fronde--org-html-format-spec)
|
154
162
|
(advice-add 'org-gmi--format-spec :around #'fronde--org-gmi-format-spec)
|
155
163
|
|
@@ -14,7 +14,7 @@ module Fronde
|
|
14
14
|
def self.migrate(config)
|
15
15
|
return config unless config.has_key?('public_folder')
|
16
16
|
|
17
|
-
warn
|
17
|
+
warn I18n.t('fronde.error.config.deprecated_public_folder')
|
18
18
|
old_pub_folder = config.delete('public_folder')
|
19
19
|
return config if config.has_key?('html_public_folder')
|
20
20
|
|
data/lib/fronde/config/lisp.rb
CHANGED
@@ -6,9 +6,6 @@ require_relative '../version'
|
|
6
6
|
require_relative '../org'
|
7
7
|
require_relative 'helpers'
|
8
8
|
|
9
|
-
require_relative '../../ext/r18n'
|
10
|
-
using R18nPatch
|
11
|
-
|
12
9
|
module Fronde
|
13
10
|
module Config
|
14
11
|
# This module contains utilitary methods to ease ~org-config.el~
|
@@ -33,7 +30,7 @@ module Fronde
|
|
33
30
|
'work_dir' => workdir,
|
34
31
|
'fronde_data_dir' => File.expand_path('data', __dir__),
|
35
32
|
'org_version' => Fronde::Org.current_version,
|
36
|
-
'long_date_fmt' =>
|
33
|
+
'long_date_fmt' => I18n.t('time.formats.long'),
|
37
34
|
'author' => { 'email' => get('author_email', ''),
|
38
35
|
'name' => get('author') },
|
39
36
|
'domain' => get('domain'),
|
data/lib/fronde/config.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'yaml'
|
4
|
-
require '
|
4
|
+
require 'i18n'
|
5
5
|
require 'singleton'
|
6
6
|
|
7
7
|
require_relative 'config/lisp'
|
@@ -141,7 +141,7 @@ module Fronde
|
|
141
141
|
get('sources', default_sources).filter_map do |source_conf|
|
142
142
|
config = Source.canonical_config source_conf.dup
|
143
143
|
unless config['path']
|
144
|
-
warn
|
144
|
+
warn I18n.t('fronde.error.source.no_path', source: config.inspect)
|
145
145
|
next
|
146
146
|
end
|
147
147
|
Source.new_from_config config
|
@@ -153,7 +153,8 @@ module Fronde
|
|
153
153
|
return path unless collection[type].has_key?(path)
|
154
154
|
|
155
155
|
warn(
|
156
|
-
|
156
|
+
I18n.t(
|
157
|
+
'fronde.error.source.duplicate',
|
157
158
|
source: source['name'], type: type
|
158
159
|
)
|
159
160
|
)
|
@@ -182,7 +183,8 @@ module Fronde
|
|
182
183
|
def warn_on_existing_inclusion(type, other, possible_matchs, sources)
|
183
184
|
possible_matchs.each do |match|
|
184
185
|
warn(
|
185
|
-
|
186
|
+
I18n.t(
|
187
|
+
'fronde.error.source.inclusion',
|
186
188
|
source: sources[match]['title'],
|
187
189
|
other_source: other, type: type
|
188
190
|
)
|
@@ -221,8 +223,8 @@ module Fronde
|
|
221
223
|
CONFIG = Config::Store.instance
|
222
224
|
end
|
223
225
|
|
224
|
-
|
225
|
-
|
226
|
-
|
226
|
+
i18n_glob = File.expand_path('../../locales', __dir__)
|
227
|
+
I18n.load_path = Dir.glob("#{i18n_glob}/*.yml")
|
228
|
+
I18n.default_locale = Fronde::CONFIG.get('lang')
|
227
229
|
|
228
230
|
Fronde::CONFIG.load_sources
|
data/lib/fronde/emacs.rb
CHANGED
@@ -10,8 +10,22 @@ module Fronde
|
|
10
10
|
@command = nil
|
11
11
|
end
|
12
12
|
|
13
|
-
def publish(project = 'website')
|
14
|
-
|
13
|
+
def publish(project = 'website', force: false)
|
14
|
+
if force
|
15
|
+
build_command %[(org-publish "#{project}" t)]
|
16
|
+
else
|
17
|
+
build_command %[(org-publish "#{project}")]
|
18
|
+
end
|
19
|
+
run_command
|
20
|
+
end
|
21
|
+
|
22
|
+
def publish_file(file_path, force: false)
|
23
|
+
if force
|
24
|
+
build_command '(org-publish-current-file t)'
|
25
|
+
else
|
26
|
+
build_command '(org-publish-current-file)'
|
27
|
+
end
|
28
|
+
@command.insert(-2, %(--visit "#{file_path}"))
|
15
29
|
run_command
|
16
30
|
end
|
17
31
|
|
@@ -20,21 +34,21 @@ module Fronde
|
|
20
34
|
def run_command
|
21
35
|
cmd = @command.join(' ')
|
22
36
|
if @verbose
|
23
|
-
|
24
|
-
return system(cmd, exception: true)
|
37
|
+
puts cmd
|
38
|
+
return system(cmd, err: $stdout, exception: true)
|
25
39
|
end
|
26
40
|
system cmd, out: File::NULL, err: File::NULL, exception: true
|
27
41
|
end
|
28
42
|
|
29
43
|
def build_command(org_action)
|
30
44
|
default_emacs = Fronde::CONFIG.get('emacs')
|
31
|
-
@command = [
|
32
|
-
|
33
|
-
|
34
|
-
'--eval \'(setq enable-dir-local-variables nil)\'',
|
45
|
+
@command = [
|
46
|
+
default_emacs || 'emacs -Q --batch -nw',
|
47
|
+
'--eval \'(setq inhibit-message t)\'',
|
35
48
|
'-l ./var/lib/org-config.el',
|
36
49
|
"--eval '#{org_action}'"
|
37
50
|
]
|
51
|
+
@command.delete_at(1) if @verbose
|
38
52
|
end
|
39
53
|
end
|
40
54
|
end
|
@@ -22,7 +22,7 @@ module Fronde
|
|
22
22
|
FileUtils.mkdir_p "#{@project.publication_path}/feeds"
|
23
23
|
@index.each_key do |tag|
|
24
24
|
write_atom(tag)
|
25
|
-
|
25
|
+
puts I18n.t('fronde.index.atom_generated', tag:) if verbose
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -30,7 +30,7 @@ module Fronde
|
|
30
30
|
FileUtils.mkdir_p "#{@project['path']}/tags"
|
31
31
|
@index.each_key do |tag|
|
32
32
|
write_org(tag)
|
33
|
-
|
33
|
+
puts I18n.t('fronde.index.index_generated', tag:) if verbose
|
34
34
|
end
|
35
35
|
write_blog_home_page(verbose)
|
36
36
|
end
|
@@ -47,7 +47,9 @@ module Fronde
|
|
47
47
|
entries.map! do |article|
|
48
48
|
published = article['published']
|
49
49
|
unless published == ''
|
50
|
-
article['published'] =
|
50
|
+
article['published'] = I18n.with_locale(article['lang']) do
|
51
|
+
I18n.t('fronde.index.published_on', date: published)
|
52
|
+
end
|
51
53
|
end
|
52
54
|
article
|
53
55
|
end
|
@@ -60,7 +62,7 @@ module Fronde
|
|
60
62
|
'domain' => Fronde::CONFIG.get('domain'),
|
61
63
|
'lang' => Fronde::CONFIG.get('lang'),
|
62
64
|
'author' => Fronde::CONFIG.get('author'),
|
63
|
-
'unsorted' =>
|
65
|
+
'unsorted' => I18n.t('fronde.index.unsorted'),
|
64
66
|
'entries' => entries
|
65
67
|
)
|
66
68
|
end
|
@@ -73,11 +75,11 @@ module Fronde
|
|
73
75
|
'weight' => @index[tag].length
|
74
76
|
}
|
75
77
|
end
|
76
|
-
{ 'title' =>
|
78
|
+
{ 'title' => I18n.t("fronde.index.#{title}"), 'tags' => all_tags }
|
77
79
|
end
|
78
80
|
Config::Helpers.render_liquid_template(
|
79
81
|
File.read(File.expand_path('./data/all_tags.org', __dir__)),
|
80
|
-
'title' =>
|
82
|
+
'title' => I18n.t('fronde.index.all_tags'),
|
81
83
|
'lang' => Fronde::CONFIG.get('lang'),
|
82
84
|
'author' => Fronde::CONFIG.get('author'),
|
83
85
|
'domain' => Fronde::CONFIG.get('domain'),
|
@@ -90,7 +92,7 @@ module Fronde
|
|
90
92
|
def write_blog_home_page(verbose)
|
91
93
|
orgdest = format('%<root>s/index.org', root: @project['path'])
|
92
94
|
if verbose
|
93
|
-
|
95
|
+
puts I18n.t('fronde.org.generate_blog_index', name: @project['name'])
|
94
96
|
end
|
95
97
|
File.write(orgdest, blog_home_page)
|
96
98
|
end
|
data/lib/fronde/index.rb
CHANGED
@@ -8,7 +8,7 @@ module Fronde
|
|
8
8
|
# Generates website indexes and atom feeds for all the org documents
|
9
9
|
# keywords.
|
10
10
|
class Index
|
11
|
-
attr_reader :date
|
11
|
+
attr_reader :date, :project
|
12
12
|
|
13
13
|
def initialize(project)
|
14
14
|
@project = project
|
@@ -31,7 +31,8 @@ module Fronde
|
|
31
31
|
def sort_by(kind)
|
32
32
|
accepted_values = %i[name weight]
|
33
33
|
unless accepted_values.include?(kind)
|
34
|
-
error_msg =
|
34
|
+
error_msg = I18n.t(
|
35
|
+
'fronde.error.index.wrong_sort_kind',
|
35
36
|
kind: kind, accepted_values: accepted_values.inspect
|
36
37
|
)
|
37
38
|
raise ArgumentError, error_msg
|
@@ -43,6 +44,10 @@ module Fronde
|
|
43
44
|
# and avoid to scroll to find the beginning of the list.
|
44
45
|
end
|
45
46
|
|
47
|
+
def emacs_keywords
|
48
|
+
@tags_names.map { |slug, title| "#{title}\x1f#{slug}" }.join("\x1e")
|
49
|
+
end
|
50
|
+
|
46
51
|
class << self
|
47
52
|
def all_blog_index(&block)
|
48
53
|
all_blogs = CONFIG.sources.filter_map do |project|
|
@@ -91,7 +96,7 @@ module Fronde
|
|
91
96
|
all_keys = all_tags
|
92
97
|
{
|
93
98
|
by_name: all_keys.sort,
|
94
|
-
by_weight: all_keys.sort_by {
|
99
|
+
by_weight: all_keys.sort_by { [-@index[_1].length, _1] }
|
95
100
|
}
|
96
101
|
end
|
97
102
|
end
|