fronde 0.5.0 → 0.6.1
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/data/themes/umaneti/css/style.css +2 -1
- 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
data/lib/tasks/org.rake
CHANGED
@@ -11,6 +11,9 @@ CLOBBER.push(
|
|
11
11
|
'var/lib/org-config.el', 'lib/htmlize.el'
|
12
12
|
)
|
13
13
|
|
14
|
+
HTMLIZE_TAG = 'release/1.58'
|
15
|
+
OX_GMI_TAG = 'v0.2'
|
16
|
+
|
14
17
|
namespace :org do
|
15
18
|
directory 'var/tmp'
|
16
19
|
|
@@ -19,37 +22,34 @@ namespace :org do
|
|
19
22
|
# Weird Rake issue, still executing the task even if the file exists
|
20
23
|
next if File.exist? 'var/tmp/org.tar.gz'
|
21
24
|
|
22
|
-
download = Thread.new
|
23
|
-
|
24
|
-
|
25
|
-
else
|
26
|
-
Fronde::CLI::Throbber.run(download, R18n.t.fronde.tasks.org.downloading)
|
25
|
+
download = Thread.new do
|
26
|
+
version = Fronde::Org.download
|
27
|
+
puts I18n.t('fronde.tasks.org.downloaded', version:) if verbose
|
27
28
|
end
|
29
|
+
Fronde::CLI::Throbber.run(
|
30
|
+
download, I18n.t('fronde.tasks.org.downloading'), verbose
|
31
|
+
)
|
28
32
|
rescue RuntimeError, Interrupt
|
29
|
-
warn
|
33
|
+
warn I18n.t('fronde.tasks.org.no_download') if verbose
|
30
34
|
end
|
31
35
|
|
32
36
|
desc 'Compile Org'
|
33
37
|
multitask compile: ['var/tmp/org.tar.gz', 'lib'] do |task|
|
34
38
|
# No need to force fetch last version as it is only interesting as
|
35
39
|
# part of the upgrade task
|
36
|
-
|
40
|
+
version = Fronde::Org.last_version
|
37
41
|
|
38
|
-
org_dir = "lib/org-#{
|
42
|
+
org_dir = "lib/org-#{version}"
|
39
43
|
next if Dir.exist?("#{org_dir}/lisp")
|
40
44
|
|
41
45
|
build = Thread.new do
|
42
|
-
Fronde::Org.compile(
|
43
|
-
task.prerequisites[0], org_version, org_dir, verbose: verbose
|
44
|
-
)
|
46
|
+
Fronde::Org.compile(task.prerequisites[0], version, org_dir, verbose:)
|
45
47
|
Dir.glob('lib/org-[0-9.]*').each { rm_r _1 unless _1 == org_dir }
|
48
|
+
puts I18n.t('fronde.tasks.org.installed', version:) if verbose
|
46
49
|
end
|
47
|
-
|
48
|
-
build.
|
49
|
-
|
50
|
-
else
|
51
|
-
Fronde::CLI::Throbber.run(build, R18n.t.fronde.tasks.org.installing)
|
52
|
-
end
|
50
|
+
Fronde::CLI::Throbber.run(
|
51
|
+
build, I18n.t('fronde.tasks.org.installing'), verbose
|
52
|
+
)
|
53
53
|
rescue RuntimeError, Interrupt
|
54
54
|
next
|
55
55
|
end
|
@@ -58,14 +58,14 @@ namespace :org do
|
|
58
58
|
|
59
59
|
file 'lib/htmlize.el' => 'lib' do
|
60
60
|
htmlize = URI(
|
61
|
-
|
61
|
+
"https://raw.githubusercontent.com/hniksic/emacs-htmlize/refs/tags/#{HTMLIZE_TAG}/htmlize.el"
|
62
62
|
).open.read
|
63
63
|
File.write 'lib/htmlize.el', htmlize
|
64
64
|
end
|
65
65
|
|
66
66
|
file 'lib/ox-gmi.el' => 'lib' do
|
67
67
|
ox_gmi = URI(
|
68
|
-
|
68
|
+
"https://git.umaneti.net/ox-gmi/plain/ox-gmi.el?h=#{OX_GMI_TAG}"
|
69
69
|
).open.read
|
70
70
|
File.write 'lib/ox-gmi.el', ox_gmi
|
71
71
|
end
|
data/lib/tasks/site.rake
CHANGED
@@ -5,79 +5,104 @@ require_relative '../fronde/index'
|
|
5
5
|
require_relative '../fronde/templater'
|
6
6
|
require_relative '../fronde/cli/throbber'
|
7
7
|
|
8
|
+
def remove_orphan_file_maybe(file_path)
|
9
|
+
print I18n.t('fronde.tasks.site.remove_orphan_file')
|
10
|
+
action = $stdin.gets.strip.downcase
|
11
|
+
return unless action == 'y'
|
12
|
+
|
13
|
+
FileUtils.rm file_path
|
14
|
+
end
|
15
|
+
|
8
16
|
namespace :site do
|
9
17
|
desc 'Build all your projects'
|
10
18
|
task :build, [:force?] => ['var/lib/org-config.el'] do |_, args|
|
11
19
|
args.with_defaults(force?: false)
|
20
|
+
|
21
|
+
FileUtils.rm_f 'var/tmp/keywords'
|
12
22
|
build_index = Thread.new do
|
13
23
|
all_index = Fronde::Index.all_blog_index
|
24
|
+
offset = 0
|
14
25
|
all_index.each do |index|
|
15
|
-
index.write_all_org(verbose:
|
26
|
+
index.write_all_org(verbose:)
|
27
|
+
offset = File.write('var/tmp/keywords', index.emacs_keywords, offset)
|
16
28
|
end
|
17
29
|
Thread.current[:all_indexes] = all_index
|
18
30
|
end
|
19
|
-
|
20
|
-
build_index.
|
21
|
-
|
22
|
-
Fronde::CLI::Throbber.run(
|
23
|
-
build_index, R18n.t.fronde.tasks.site.generating_indexes
|
24
|
-
)
|
25
|
-
end
|
31
|
+
Fronde::CLI::Throbber.run(
|
32
|
+
build_index, I18n.t('fronde.tasks.site.generating_indexes'), verbose
|
33
|
+
)
|
26
34
|
all_indexes = build_index[:all_indexes]
|
27
35
|
|
28
36
|
build_html = Thread.new do
|
29
|
-
|
30
|
-
Fronde::Emacs.new(verbose: verbose).publish
|
37
|
+
Fronde::Emacs.new(verbose:).publish(force: args[:force?])
|
31
38
|
end
|
32
|
-
Fronde::CLI::Throbber.run(
|
33
|
-
|
39
|
+
Fronde::CLI::Throbber.run(
|
40
|
+
build_html, I18n.t('fronde.tasks.site.building'), verbose
|
41
|
+
)
|
34
42
|
if all_indexes.any?
|
35
|
-
|
36
|
-
all_indexes.each
|
37
|
-
|
38
|
-
publish_feed = Thread.new do
|
39
|
-
all_indexes.each do |index|
|
40
|
-
index.write_all_feeds(verbose: false)
|
41
|
-
end
|
43
|
+
publish_feed = Thread.new do
|
44
|
+
all_indexes.each do |index|
|
45
|
+
index.write_all_feeds(verbose: false)
|
42
46
|
end
|
43
|
-
Fronde::CLI::Throbber.run(
|
44
|
-
publish_feed, R18n.t.fronde.tasks.site.publishing_feeds
|
45
|
-
)
|
46
47
|
end
|
48
|
+
Fronde::CLI::Throbber.run(
|
49
|
+
publish_feed, I18n.t('fronde.tasks.site.publishing_feeds'), verbose
|
50
|
+
)
|
47
51
|
end
|
48
52
|
|
49
53
|
next unless Fronde::CONFIG.sources.any? { |source| source.type == 'html' }
|
50
54
|
|
51
55
|
customize_html = Thread.new do
|
52
56
|
pubfolder = Fronde::CONFIG.get('html_public_folder')
|
53
|
-
Dir
|
57
|
+
Dir.glob("#{pubfolder}/**/*.html").each do |f|
|
58
|
+
if verbose
|
59
|
+
short_file = f.sub(/^#{Dir.pwd}/, '.')
|
60
|
+
puts I18n.t('fronde.tasks.site.customizing_file', file: short_file)
|
61
|
+
end
|
54
62
|
Fronde::Templater.customize_output(f)
|
55
63
|
end
|
56
64
|
end
|
57
65
|
Fronde::CLI::Throbber.run(
|
58
|
-
customize_html,
|
66
|
+
customize_html, I18n.t('fronde.tasks.site.customizing'), verbose
|
59
67
|
)
|
60
68
|
# :nocov:
|
61
69
|
rescue RuntimeError, Interrupt
|
62
|
-
warn
|
70
|
+
warn I18n.t('fronde.tasks.site.aborting')
|
63
71
|
next
|
64
72
|
# :nocov:
|
65
73
|
end
|
66
74
|
|
75
|
+
desc 'Build a single file'
|
76
|
+
task :build_file, %i[path force?] do |_, args|
|
77
|
+
args.with_defaults(force?: false)
|
78
|
+
Fronde::Emacs.new(verbose: true).publish_file(
|
79
|
+
args[:path], force: args[:force?]
|
80
|
+
)
|
81
|
+
puts I18n.t('fronde.tasks.site.customizing_file', file: args[:path])
|
82
|
+
Fronde::Templater.customize_output(args[:path])
|
83
|
+
end
|
84
|
+
|
67
85
|
desc 'Cleanup orphaned published files'
|
68
86
|
task :clean do
|
87
|
+
Fronde::Index.all_blog_index do |index|
|
88
|
+
project = index.project
|
89
|
+
all_tags = %w[index] + index.all_tags
|
90
|
+
Dir.glob("#{project['path']}/tags/*").each do |file_name|
|
91
|
+
slug = File.basename file_name, '.org'
|
92
|
+
next if all_tags.include?(slug)
|
93
|
+
|
94
|
+
short_file = file_name.sub(/^#{Dir.pwd}/, '.')
|
95
|
+
puts I18n.t('fronde.tasks.site.orphan_tag', file: short_file)
|
96
|
+
remove_orphan_file_maybe file_name
|
97
|
+
end
|
98
|
+
end
|
69
99
|
pubfolder = Fronde::CONFIG.get('html_public_folder')
|
70
|
-
Dir
|
100
|
+
Dir.glob("#{pubfolder}/**/*.html").each do |file_name|
|
71
101
|
source = Fronde::Org::File.new(file_name)
|
72
|
-
|
73
102
|
# Return if an org file has been found for this published file
|
74
103
|
next unless source.file == file_name
|
75
104
|
|
76
|
-
|
77
|
-
action = $stdin.gets.strip.downcase
|
78
|
-
next unless action == 'y'
|
79
|
-
|
80
|
-
rm file_name
|
105
|
+
remove_orphan_file_maybe file_name
|
81
106
|
end
|
82
107
|
end
|
83
108
|
|
data/lib/tasks/sync.rake
CHANGED
@@ -15,13 +15,9 @@ namespace :sync do
|
|
15
15
|
publish_thread = Fronde::Sync.pull_or_push(
|
16
16
|
:push, type, test: args[:test?], verbose: verbose
|
17
17
|
)
|
18
|
-
|
19
|
-
publish_thread
|
20
|
-
|
21
|
-
Fronde::CLI::Throbber.run(
|
22
|
-
publish_thread, format('Publishing %<fmt>s:', fmt: type)
|
23
|
-
)
|
24
|
-
end
|
18
|
+
Fronde::CLI::Throbber.run(
|
19
|
+
publish_thread, format('Publishing %<fmt>s:', fmt: type), verbose
|
20
|
+
)
|
25
21
|
rescue Fronde::Sync::Error => e
|
26
22
|
warn e
|
27
23
|
next
|
@@ -36,13 +32,9 @@ namespace :sync do
|
|
36
32
|
pull_thread = Fronde::Sync.pull_or_push(
|
37
33
|
:pull, type, test: args[:test?], verbose: verbose
|
38
34
|
)
|
39
|
-
|
40
|
-
pull_thread
|
41
|
-
|
42
|
-
Fronde::CLI::Throbber.run(
|
43
|
-
pull_thread, format('Pulling %<fmt>s:', fmt: type)
|
44
|
-
)
|
45
|
-
end
|
35
|
+
Fronde::CLI::Throbber.run(
|
36
|
+
pull_thread, format('Pulling %<fmt>s:', fmt: type), verbose
|
37
|
+
)
|
46
38
|
rescue Fronde::Sync::Error => e
|
47
39
|
warn e
|
48
40
|
next
|
data/locales/en.yml
CHANGED
@@ -1,86 +1,147 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
|
4
|
-
usage: 'Usage: fronde %1 [options]'
|
5
|
-
done: done
|
6
|
-
interrupted: interrupted
|
7
|
-
commands:
|
8
|
-
cmd_title: Commands
|
9
|
-
alias: Alias for ‘%1’.
|
10
|
-
new: Initialize a new Fronde instance.
|
11
|
-
update: >-
|
12
|
-
Update Fronde configuration and dependency (to be run after each
|
13
|
-
modification of the config.yml file and once in a while to stay
|
14
|
-
up-to-date with Org).
|
15
|
-
preview: Start a test web server to preview the generated website.
|
16
|
-
open: Open or create an org file.
|
17
|
-
build: Compile all org files to HTML or gemtext.
|
18
|
-
publish: Push local changes to the public web server.
|
19
|
-
help: Alias for the -h switch.
|
20
|
-
options:
|
21
|
-
cmd_title: Options
|
22
|
-
help: Display help for a command and exit.
|
23
|
-
version: Display Fronde version and exit.
|
24
|
-
default_title: New article
|
25
|
-
error:
|
2
|
+
en:
|
3
|
+
fronde:
|
26
4
|
bin:
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
5
|
+
usage: 'Usage: fronde %{label} [options]'
|
6
|
+
done: done
|
7
|
+
interrupted: interrupted
|
8
|
+
commands:
|
9
|
+
cmd_title: Commands
|
10
|
+
alias: Alias for ‘%{alias}’.
|
11
|
+
new: Initialize a new Fronde instance.
|
12
|
+
update: >-
|
13
|
+
Update Fronde configuration and dependency (to be run after each
|
14
|
+
modification of the config.yml file and once in a while to stay
|
15
|
+
up-to-date with Org).
|
16
|
+
preview: Start a test web server to preview the generated website.
|
17
|
+
open: Open or create an org file.
|
18
|
+
build: Compile all org files to HTML or gemtext.
|
19
|
+
publish: Push local changes to the public web server.
|
20
|
+
help: Alias for the -h switch.
|
21
|
+
options:
|
22
|
+
cmd_title: Options
|
23
|
+
help: Display help for a command and exit.
|
24
|
+
version: Display Fronde version and exit.
|
25
|
+
default_title: New article
|
26
|
+
error:
|
27
|
+
bin:
|
28
|
+
label: An error occurred.
|
29
|
+
explanation: >-
|
30
|
+
To see the error, run the same command again with more
|
31
|
+
verbosity, for example, fronde build -v
|
32
|
+
no_command: 'ERROR: no command or unknown command given.'
|
33
|
+
no_file: >-
|
34
|
+
Warning: No file path given. Default file will be used.
|
35
|
+
config:
|
36
|
+
deprecated_public_folder: >-
|
37
|
+
‘public_folder’ setting is deprecated. Please use either
|
38
|
+
‘html_public_folder’ or ‘gemini_public_folder’.
|
39
|
+
source:
|
40
|
+
no_path: Skipping %{source} as its ‘path’ key is missing.
|
41
|
+
duplicate: >-
|
42
|
+
Skipping %{source} as it appears at least twice in the sources
|
43
|
+
of type %{type}.
|
44
|
+
inclusion: >-
|
45
|
+
Skipping %{source} as it might be already embedded into the
|
46
|
+
other source %{other_source} of type %{type}.
|
47
|
+
org_file:
|
48
|
+
no_file_or_title: No file or title given.
|
49
|
+
no_project: No project found for %{file}. Publication will fail.
|
50
|
+
dangerous_code_block: >-
|
51
|
+
The file %{file} contains at least one code block to eval, which will
|
52
|
+
be ignored for security reasons. You can still evaluate it manually
|
53
|
+
from inside Org in order to have its result exported.
|
54
|
+
index:
|
55
|
+
wrong_sort_kind: '%{kind} not in %{accepted_values}'
|
56
|
+
templater:
|
57
|
+
no_element_found: >-
|
58
|
+
No element found with the selector %{source} in %{file}.
|
49
59
|
index:
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
published_on: Published on %1
|
58
|
-
all_tags: All tags
|
59
|
-
by_name: By alphabetical order
|
60
|
-
by_weight: By publication number
|
61
|
-
full_date_format: '%A %{date}'
|
62
|
-
full_date_with_time_format: '%{date} at %{time}'
|
63
|
-
index_generated: Generated index file for %{tag}.
|
64
|
-
atom_generated: Generated Atom feed for %{tag}.
|
65
|
-
org:
|
66
|
-
generate_blog_index: Generating blog home page for %{name}
|
67
|
-
postamble:
|
68
|
-
written_by: Written by %a
|
69
|
-
last_modification: Last modification on %C
|
70
|
-
with_emacs: with %c, and published with %n
|
71
|
-
with_emacs_html: with %c, and published with %N
|
72
|
-
tasks:
|
73
|
-
site:
|
74
|
-
aborting: Aborting
|
75
|
-
generating_indexes: 'Generating index files:'
|
76
|
-
building_indexes: 'Building index files:'
|
77
|
-
publishing_feeds: 'Publishing Atom feeds:'
|
78
|
-
building: 'Building:'
|
79
|
-
customizing: 'Customizing:'
|
80
|
-
remove_orphan_file: 'Remove it? [y/N]: '
|
60
|
+
unsorted: Unsorted
|
61
|
+
published_on: Published on %{date}
|
62
|
+
all_tags: All tags
|
63
|
+
by_name: By alphabetical order
|
64
|
+
by_weight: By publication number
|
65
|
+
index_generated: Generated index file for %{tag}.
|
66
|
+
atom_generated: Generated Atom feed for %{tag}.
|
81
67
|
org:
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
68
|
+
generate_blog_index: Generating blog home page for %{name}
|
69
|
+
postamble:
|
70
|
+
written_by: Written by %a
|
71
|
+
last_modification: Last modification on %C
|
72
|
+
with_emacs: with %c, and published with %n
|
73
|
+
with_emacs_html: with %c, and published with %N
|
74
|
+
neocities:
|
75
|
+
deleting: deleting %{path}
|
76
|
+
sha1_differ: SHA1 hash differ for %{uri}
|
77
|
+
tasks:
|
78
|
+
site:
|
79
|
+
aborting: Aborting
|
80
|
+
generating_indexes: 'Generating index files:'
|
81
|
+
building_indexes: 'Building index files:'
|
82
|
+
publishing_feeds: 'Publishing Atom feeds:'
|
83
|
+
building: 'Building:'
|
84
|
+
customizing: 'Customizing:'
|
85
|
+
customizing_file: 'Customizing file %{file}'
|
86
|
+
orphan_tag: The file %{file} refers to a tag, which is no more in use.
|
87
|
+
remove_orphan_file: 'Remove it? [y/N]: '
|
88
|
+
org:
|
89
|
+
downloaded: Org version %{version} has been downloaded.
|
90
|
+
downloading: 'Downloading Org:'
|
91
|
+
no_download: Impossible to download Org now. Please try again later.
|
92
|
+
installed: Org version %{version} has been locally installed.
|
93
|
+
installing: 'Installing Org:'
|
94
|
+
time:
|
95
|
+
formats:
|
96
|
+
default: '%a, %b %-d, %Y %H:%M:%S %z'
|
97
|
+
long: '%A, %B %-d, %Y at %R'
|
98
|
+
long_no_year: '%A, %B %-d at %R'
|
99
|
+
long_no_time: '%A, %B %-d, %Y'
|
100
|
+
long_no_time_no_year: '%A, %B %-d'
|
101
|
+
date:
|
102
|
+
abbr_day_names:
|
103
|
+
- Sun
|
104
|
+
- Mon
|
105
|
+
- Tue
|
106
|
+
- Wed
|
107
|
+
- Thu
|
108
|
+
- Fri
|
109
|
+
- Sat
|
110
|
+
abbr_month_names:
|
111
|
+
-
|
112
|
+
- Jan
|
113
|
+
- Feb
|
114
|
+
- Mar
|
115
|
+
- Apr
|
116
|
+
- May
|
117
|
+
- Jun
|
118
|
+
- Jul
|
119
|
+
- Aug
|
120
|
+
- Sep
|
121
|
+
- Oct
|
122
|
+
- Nov
|
123
|
+
- Dec
|
124
|
+
day_names:
|
125
|
+
- Sunday
|
126
|
+
- Monday
|
127
|
+
- Tuesday
|
128
|
+
- Wednesday
|
129
|
+
- Thursday
|
130
|
+
- Friday
|
131
|
+
- Saturday
|
132
|
+
formats:
|
133
|
+
default: '%Y-%m-%d'
|
134
|
+
month_names:
|
135
|
+
-
|
136
|
+
- January
|
137
|
+
- February
|
138
|
+
- March
|
139
|
+
- April
|
140
|
+
- May
|
141
|
+
- June
|
142
|
+
- July
|
143
|
+
- August
|
144
|
+
- September
|
145
|
+
- October
|
146
|
+
- November
|
147
|
+
- December
|