fronde 0.3.3 → 0.4.0
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/bin/fronde +15 -30
- data/lib/ext/nil_time.rb +25 -0
- data/lib/ext/r18n.rb +17 -0
- data/lib/ext/time.rb +49 -0
- data/lib/fronde/cli/commands.rb +92 -103
- data/lib/fronde/cli/data/Rakefile +8 -0
- data/lib/fronde/cli/data/config.yml +13 -0
- data/lib/fronde/cli/data/gitignore +7 -0
- data/lib/fronde/cli/data/zsh_completion +37 -0
- data/lib/fronde/cli/helpers.rb +55 -0
- data/lib/fronde/cli/opt_parse.rb +143 -0
- data/lib/fronde/cli/throbber.rb +99 -0
- data/lib/fronde/cli.rb +41 -42
- data/lib/fronde/config/data/org-config.el +24 -0
- data/lib/fronde/config/{ox-fronde.el → data/ox-fronde.el} +1 -1
- data/lib/fronde/config/helpers.rb +80 -0
- data/lib/fronde/config/lisp.rb +70 -0
- data/lib/fronde/config.rb +135 -99
- data/lib/fronde/emacs.rb +23 -20
- data/lib/fronde/index/atom_generator.rb +55 -66
- data/lib/fronde/index/data/all_tags.org +14 -0
- data/lib/fronde/index/data/template.org +22 -0
- data/lib/fronde/index/data/template.xml +37 -0
- data/lib/fronde/index/org_generator.rb +70 -88
- data/lib/fronde/index.rb +56 -82
- data/lib/fronde/org/file.rb +287 -0
- data/lib/fronde/org/file_extracter.rb +98 -0
- data/lib/fronde/org.rb +103 -0
- data/lib/fronde/preview.rb +43 -39
- data/lib/fronde/slug.rb +27 -0
- data/lib/fronde/source/gemini.rb +39 -0
- data/lib/fronde/source/html.rb +67 -0
- data/lib/fronde/source.rb +204 -0
- data/lib/fronde/templater.rb +94 -71
- data/lib/fronde/version.rb +1 -1
- data/lib/tasks/cli.rake +33 -0
- data/lib/tasks/org.rake +63 -43
- data/lib/tasks/site.rake +68 -30
- data/lib/tasks/sync.rake +41 -21
- data/lib/tasks/tags.rake +11 -7
- data/locales/en.yml +60 -14
- data/locales/fr.yml +68 -14
- metadata +57 -156
- data/lib/fronde/config/lisp_config.rb +0 -340
- data/lib/fronde/config/org-config.el +0 -19
- data/lib/fronde/org_file/class_methods.rb +0 -72
- data/lib/fronde/org_file/extracter.rb +0 -72
- data/lib/fronde/org_file/htmlizer.rb +0 -43
- data/lib/fronde/org_file.rb +0 -298
- data/lib/fronde/utils.rb +0 -229
data/lib/tasks/site.rake
CHANGED
@@ -1,54 +1,92 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
require 'fronde/templater'
|
3
|
+
require_relative '../fronde/emacs'
|
4
|
+
require_relative '../fronde/index'
|
5
|
+
require_relative '../fronde/templater'
|
6
|
+
require_relative '../fronde/cli/throbber'
|
8
7
|
|
9
8
|
namespace :site do
|
10
|
-
desc '
|
11
|
-
task :
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
desc 'Build all your projects'
|
10
|
+
task :build, [:force?] => ['var/lib/org-config.el'] do |_, args|
|
11
|
+
args.with_defaults(force?: false)
|
12
|
+
build_index = Thread.new do
|
13
|
+
all_index = Fronde::Index.all_html_blog_index
|
14
|
+
all_index.each do |index|
|
15
|
+
index.write_all_org(verbose: verbose)
|
16
|
+
end
|
17
|
+
Thread.current[:all_indexes] = all_index
|
16
18
|
end
|
17
|
-
|
18
|
-
|
19
|
+
if verbose
|
20
|
+
build_index.join
|
21
|
+
else
|
22
|
+
Fronde::CLI::Throbber.run(
|
23
|
+
build_index, R18n.t.fronde.tasks.site.generating_indexes
|
24
|
+
)
|
19
25
|
end
|
20
|
-
|
21
|
-
next if index.empty?
|
22
|
-
Fronde::Config.write_org_lisp_config(with_tags: true)
|
23
|
-
end
|
26
|
+
all_indexes = build_index[:all_indexes]
|
24
27
|
|
25
|
-
desc 'Convert and customize all org files'
|
26
|
-
task :build, [:force?] => ['var/lib/org-config.el', :index] do |_, args|
|
27
|
-
args.with_defaults(:force? => false)
|
28
|
-
build_html = Thread.new do
|
29
|
-
rm_r 'var/tmp/timestamps', force: true if args[:force?]
|
30
|
-
Fronde::Emacs.new(verbose: verbose).publish
|
31
|
-
end
|
32
28
|
begin
|
33
|
-
|
29
|
+
build_html = Thread.new do
|
30
|
+
rm_r 'var/tmp/timestamps', force: true if args[:force?]
|
31
|
+
Fronde::Emacs.new(verbose: verbose).publish
|
32
|
+
end
|
33
|
+
Fronde::CLI::Throbber.run(build_html, R18n.t.fronde.tasks.site.building)
|
34
|
+
|
34
35
|
# :nocov:
|
35
36
|
rescue RuntimeError
|
36
|
-
warn
|
37
|
+
warn R18n.t.fronde.tasks.site.aborting
|
37
38
|
next
|
38
39
|
end
|
39
40
|
# :nocov:
|
41
|
+
|
42
|
+
if all_indexes.any?
|
43
|
+
if verbose
|
44
|
+
all_indexes.each(&:write_all_feeds)
|
45
|
+
else
|
46
|
+
publish_feed = Thread.new do
|
47
|
+
all_indexes.each do |index|
|
48
|
+
index.write_all_feeds(verbose: false)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
Fronde::CLI::Throbber.run(
|
52
|
+
publish_feed, R18n.t.fronde.tasks.site.publishing_feeds
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
next unless Fronde::CONFIG.sources.any? { |source| source.type == 'html' }
|
58
|
+
|
40
59
|
customize_html = Thread.new do
|
41
|
-
pubfolder = Fronde::
|
60
|
+
pubfolder = Fronde::CONFIG.get('html_public_folder')
|
42
61
|
Dir["#{pubfolder}/**/*.html"].each do |f|
|
43
62
|
Fronde::Templater.customize_output(f)
|
44
63
|
end
|
45
64
|
end
|
46
|
-
Fronde::
|
65
|
+
Fronde::CLI::Throbber.run(
|
66
|
+
customize_html, R18n.t.fronde.tasks.site.customizing
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
desc 'Cleanup orphaned published files'
|
71
|
+
task :clean do
|
72
|
+
pubfolder = Fronde::CONFIG.get('html_public_folder')
|
73
|
+
Dir["#{pubfolder}/**/*.html"].each do |file_name|
|
74
|
+
source = Fronde::Org::File.new(file_name)
|
75
|
+
|
76
|
+
# Return if an org file has been found for this published file
|
77
|
+
next unless source.file == file_name
|
78
|
+
|
79
|
+
print R18n.t.fronde.tasks.site.remove_orphan_file
|
80
|
+
action = $stdin.gets.strip.downcase
|
81
|
+
next unless action == 'y'
|
82
|
+
|
83
|
+
rm file_name
|
84
|
+
end
|
47
85
|
end
|
48
86
|
|
49
87
|
desc 'Start a test server'
|
50
88
|
task :preview do
|
51
|
-
|
52
|
-
Fronde.
|
89
|
+
require_relative '../fronde/preview'
|
90
|
+
Fronde::Preview.start
|
53
91
|
end
|
54
92
|
end
|
data/lib/tasks/sync.rake
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
require_relative '../fronde/config'
|
4
|
+
require_relative '../fronde/cli/throbber'
|
5
5
|
|
6
6
|
module Fronde
|
7
|
-
class SyncError <
|
7
|
+
class SyncError < ::StandardError; end
|
8
8
|
end
|
9
9
|
|
10
10
|
def rsync_command(test = nil)
|
11
|
-
rsync_command = Fronde::
|
11
|
+
rsync_command = Fronde::CONFIG.get('rsync')
|
12
12
|
return rsync_command unless rsync_command.nil?
|
13
|
+
|
13
14
|
optstring = []
|
14
15
|
optstring << 'n' if test
|
15
16
|
if verbose
|
@@ -20,37 +21,56 @@ def rsync_command(test = nil)
|
|
20
21
|
"rsync -#{optstring.join}rlt --delete"
|
21
22
|
end
|
22
23
|
|
23
|
-
def pull_or_push(direction,
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
raise Fronde::SyncError, 'No remote path set' if remote_path.nil?
|
29
|
-
public_folder = Fronde::Config.get('public_folder')
|
24
|
+
def pull_or_push(direction, type, test)
|
25
|
+
remote_path = Fronde::CONFIG.get("#{type}_remote")
|
26
|
+
raise Fronde::SyncError, "No #{type} remote path set" if remote_path.nil?
|
27
|
+
|
28
|
+
public_folder = Fronde::CONFIG.get("#{type}_public_folder")
|
30
29
|
# Default is to push
|
31
30
|
cmd = ["#{public_folder}/", remote_path]
|
32
31
|
cmd.reverse! if direction == :pull
|
33
32
|
rsync = rsync_command(test)
|
34
|
-
|
33
|
+
Thread.new do
|
35
34
|
sh "#{rsync} #{cmd.join(' ')}"
|
36
35
|
end
|
37
|
-
|
36
|
+
end
|
37
|
+
|
38
|
+
def source_types
|
39
|
+
Fronde::CONFIG.sources.map(&:type).uniq
|
38
40
|
end
|
39
41
|
|
40
42
|
namespace :sync do
|
41
43
|
desc 'Push changes to server'
|
42
44
|
task :push, :test? do |_, args|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
45
|
+
source_types.each do |type|
|
46
|
+
publish_thread = pull_or_push(:push, type, args[:test?])
|
47
|
+
if verbose
|
48
|
+
publish_thread.join
|
49
|
+
else
|
50
|
+
Fronde::CLI::Throbber.run(
|
51
|
+
publish_thread, format('Publishing %<fmt>s:', fmt: type)
|
52
|
+
)
|
53
|
+
end
|
54
|
+
rescue Fronde::SyncError => e
|
55
|
+
warn e
|
56
|
+
next
|
57
|
+
end
|
47
58
|
end
|
48
59
|
|
49
60
|
desc 'Pull changes from server'
|
50
61
|
task :pull, :test? do |_, args|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
62
|
+
source_types.each do |type|
|
63
|
+
pull_thread = pull_or_push(:pull, type, args[:test?])
|
64
|
+
if verbose
|
65
|
+
pull_thread.join
|
66
|
+
else
|
67
|
+
Fronde::CLI::Throbber.run(
|
68
|
+
pull_thread, format('Pulling %<fmt>s:', fmt: type)
|
69
|
+
)
|
70
|
+
end
|
71
|
+
rescue Fronde::SyncError => e
|
72
|
+
warn e
|
73
|
+
next
|
74
|
+
end
|
55
75
|
end
|
56
76
|
end
|
data/lib/tasks/tags.rake
CHANGED
@@ -1,19 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '../fronde/index'
|
4
4
|
|
5
5
|
namespace :tags do
|
6
6
|
desc 'List all tags by name'
|
7
7
|
task :name do
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
Fronde::Index.all_html_blog_index do |index|
|
9
|
+
next if index.empty?
|
10
|
+
|
11
|
+
puts index.sort_by(:name).join("\n")
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
13
15
|
desc 'List all tags by weight'
|
14
16
|
task :weight do
|
15
|
-
|
16
|
-
|
17
|
-
|
17
|
+
Fronde::Index.all_html_blog_index do |index|
|
18
|
+
next if index.empty?
|
19
|
+
|
20
|
+
puts index.sort_by(:weight).join("\n")
|
21
|
+
end
|
18
22
|
end
|
19
23
|
end
|
data/locales/en.yml
CHANGED
@@ -2,27 +2,55 @@
|
|
2
2
|
fronde:
|
3
3
|
bin:
|
4
4
|
usage: 'Usage: fronde %1 [options]'
|
5
|
+
done: done
|
5
6
|
commands:
|
6
7
|
cmd_title: Commands
|
7
|
-
alias: Alias for
|
8
|
-
|
9
|
-
update:
|
10
|
-
|
8
|
+
alias: Alias for ‘%1’.
|
9
|
+
new: Initialize a new Fronde instance.
|
10
|
+
update: >-
|
11
|
+
Update Fronde configuration and dependency (to be run after each
|
12
|
+
modification of the config.yml file and once in a while to stay
|
13
|
+
up-to-date with Org).
|
14
|
+
preview: Start a test web server to preview the generated website.
|
11
15
|
open: Open or create an org file.
|
12
|
-
build: Compile
|
13
|
-
publish: Push local changes to
|
16
|
+
build: Compile all org files to HTML or gemtext.
|
17
|
+
publish: Push local changes to the public web server.
|
14
18
|
help: Alias for the -h switch.
|
15
19
|
options:
|
16
20
|
cmd_title: Options
|
17
|
-
directory: Wrap the new org file in this named folder.
|
18
21
|
help: Display help for a command and exit.
|
19
22
|
version: Display Fronde version and exit.
|
20
|
-
|
21
|
-
no_command: 'ERROR: no command or unknown command given.'
|
22
|
-
no_file: 'ERROR: no file to open or edit.'
|
23
|
+
default_title: New article
|
23
24
|
error:
|
24
|
-
|
25
|
-
|
25
|
+
bin:
|
26
|
+
label: An error occurred.
|
27
|
+
explanation: >-
|
28
|
+
To see the error, run the same command again with more
|
29
|
+
verbosity, for example, fronde build -v
|
30
|
+
no_command: 'ERROR: no command or unknown command given.'
|
31
|
+
no_file: >-
|
32
|
+
Warning: No file path given. Default file will be used.
|
33
|
+
config:
|
34
|
+
deprecated_public_folder: >-
|
35
|
+
‘public_folder’ setting is deprecated. Please use either
|
36
|
+
‘html_public_folder’ or ‘gemini_public_folder’.
|
37
|
+
source:
|
38
|
+
no_path: Skipping %{source} as its ‘path’ key is missing.
|
39
|
+
duplicate: >-
|
40
|
+
Skipping %{source} as it appears at least twice in the sources
|
41
|
+
of type %{type}.
|
42
|
+
inclusion: >-
|
43
|
+
Skipping %{source} as it might be already embedded into the
|
44
|
+
other source %{other_source} of type %{type}.
|
45
|
+
org_file:
|
46
|
+
no_file_or_title: No file or title given.
|
47
|
+
no_project: No project found for %{file}. Publication will fail.
|
48
|
+
index:
|
49
|
+
wrong_sort_kind: '%{kind} not in %{accepted_values}'
|
50
|
+
templater:
|
51
|
+
no_element_found: >-
|
52
|
+
No element found with the selector %{source} in %{file}.
|
53
|
+
no_head_element: No head tag found in file %{file}.
|
26
54
|
index:
|
27
55
|
unsorted: Unsorted
|
28
56
|
published_on: Published on %1
|
@@ -31,9 +59,27 @@ fronde:
|
|
31
59
|
by_weight: By publication number
|
32
60
|
full_date_format: '%A %{date}'
|
33
61
|
full_date_with_time_format: '%{date} at %{time}'
|
62
|
+
index_generated: Generated index file for %{tag}.
|
63
|
+
atom_generated: Generated Atom feed for %{tag}.
|
34
64
|
org:
|
65
|
+
generate_blog_index: Generating blog home page for %{name}
|
35
66
|
postamble:
|
36
67
|
written_by: Written by %a
|
37
68
|
last_modification: Last modification on %C
|
38
|
-
with_emacs:
|
39
|
-
with_emacs_html:
|
69
|
+
with_emacs: with %c, and published with %n
|
70
|
+
with_emacs_html: with %c, and published with %N
|
71
|
+
tasks:
|
72
|
+
site:
|
73
|
+
aborting: Aborting
|
74
|
+
generating_indexes: 'Generating index files:'
|
75
|
+
building_indexes: 'Building index files:'
|
76
|
+
publishing_feeds: 'Publishing Atom feeds:'
|
77
|
+
building: 'Building:'
|
78
|
+
customizing: 'Customizing:'
|
79
|
+
remove_orphan_file: 'Remove it? [y/N]: '
|
80
|
+
org:
|
81
|
+
downloaded: Org version %{version} has been downloaded.
|
82
|
+
downloading: 'Downloading Org:'
|
83
|
+
no_download: Impossible to download Org now. Please try again later.
|
84
|
+
installed: Org version %{version} has been locally installed.
|
85
|
+
installing: 'Installing Org:'
|
data/locales/fr.yml
CHANGED
@@ -2,27 +2,61 @@
|
|
2
2
|
fronde:
|
3
3
|
bin:
|
4
4
|
usage: 'Usage : fronde %1 [options]'
|
5
|
+
done: fait
|
5
6
|
commands:
|
6
7
|
cmd_title: Commandes
|
7
|
-
alias: Alias pour
|
8
|
-
|
9
|
-
update:
|
10
|
-
|
8
|
+
alias: Alias pour ‘%1’.
|
9
|
+
new: Initialise une nouvelle instance de Fronde.
|
10
|
+
update: >-
|
11
|
+
Met à jour la configuration et les dépendances de Fronde (à
|
12
|
+
lancer après chaque modification du fichier config.yml et une
|
13
|
+
fois de temps à autre pour rester à jour avec Org).
|
14
|
+
preview: >-
|
15
|
+
Démarre un serveur web de test pour prévisualiser le site
|
16
|
+
généré.
|
11
17
|
open: Ouvre ou crée un fichier org.
|
12
|
-
build: Compile
|
13
|
-
publish:
|
18
|
+
build: Compile les fichiers org en HTML ou gemtext.
|
19
|
+
publish: >-
|
20
|
+
Pousse les changements locaux vers le serveur web public.
|
14
21
|
help: Alias pour l'argument -h.
|
15
22
|
options:
|
16
23
|
cmd_title: Options
|
17
|
-
directory: Place le nouveau fichier org dans un dossier à ce nom.
|
18
24
|
help: Affiche l'aide pour une commande et quitte.
|
19
25
|
version: Affiche la version de Fronde et quitte.
|
20
|
-
|
21
|
-
no_command: 'ERREUR : Aucune commande ou commande inconnue donnée.'
|
22
|
-
no_file: 'ERREUR : Aucun fichier à ouvrir ou éditer.'
|
26
|
+
default_title: Nouvel article
|
23
27
|
error:
|
24
|
-
|
25
|
-
|
28
|
+
bin:
|
29
|
+
label: Une erreur est survenue
|
30
|
+
explanation: >-
|
31
|
+
Pour voir le détail, lancez de nouveau la commande avec plus de
|
32
|
+
verbosité, par exemple fronde build -v
|
33
|
+
no_command: 'ERREUR : Aucune commande ou commande inconnue donnée.'
|
34
|
+
no_file: >-
|
35
|
+
Attention : Aucun chemin de fichier donné. Utilisation du
|
36
|
+
fichier par défaut.
|
37
|
+
config:
|
38
|
+
deprecated_public_folder: >-
|
39
|
+
La clé de configuration ‘public_folder’ est dépréciée. Merci
|
40
|
+
d’utiliser ‘html_public_folder’ ou ‘gemini_public_folder’ à la
|
41
|
+
place.
|
42
|
+
source:
|
43
|
+
no_path: >-
|
44
|
+
Ignore %{source} comme sa clé ‘path’ est manquante.
|
45
|
+
duplicate: >-
|
46
|
+
Ignore %{source} comme elle apparaît au moins deux fois dans les
|
47
|
+
sources de type %{type}.
|
48
|
+
inclusion: >-
|
49
|
+
Ignore %{source} qui semble être déjà inclue dans l’autre source
|
50
|
+
%{other_source} de type %{type}.
|
51
|
+
org_file:
|
52
|
+
no_file_or_title: Aucun chemin de fichier ou titre donné.
|
53
|
+
no_project: Aucun projet trouvé pour %{file}. Sa publication va échouer.
|
54
|
+
index:
|
55
|
+
wrong_sort_kind: '%{kind} n’est pas dans %{accepted_values}'
|
56
|
+
templater:
|
57
|
+
no_element_found: >-
|
58
|
+
Aucun élément trouvé avec le sélecteur %{source} dans %{file}.
|
59
|
+
no_head_element: Aucun élément head trouvé dans le fichier %{file}.
|
26
60
|
index:
|
27
61
|
unsorted: Non triés
|
28
62
|
published_on: Publié le %1
|
@@ -31,9 +65,29 @@ fronde:
|
|
31
65
|
by_weight: Par nombre de publication
|
32
66
|
full_date_format: '%A %{date}'
|
33
67
|
full_date_with_time_format: '%{date} à %{time}'
|
68
|
+
index_generated: Fichier d’index généré pour %{tag}.
|
69
|
+
atom_generated: Flux Atom généré pour %{tag}.
|
34
70
|
org:
|
71
|
+
generate_blog_index: Génération de la page d’accueil du blog pour %{name}
|
35
72
|
postamble:
|
36
73
|
written_by: Écrit par %a
|
37
74
|
last_modification: dernière modification le %C
|
38
|
-
with_emacs:
|
39
|
-
with_emacs_html:
|
75
|
+
with_emacs: avec %c et publié avec %n
|
76
|
+
with_emacs_html: avec %c et publié avec %N
|
77
|
+
tasks:
|
78
|
+
site:
|
79
|
+
aborting: Annulation
|
80
|
+
generating_indexes: 'Génération des fichiers d’index :'
|
81
|
+
building_indexes: 'Compilation des fichiers d’index :'
|
82
|
+
publishing_feeds: 'Publication des flux Atom :'
|
83
|
+
building: 'Compilation :'
|
84
|
+
customizing: 'Décoration :'
|
85
|
+
remove_orphan_file: 'Le supprimer ? [y/N]: '
|
86
|
+
org:
|
87
|
+
downloaded: La version %{version} de Org a été téléchargée.
|
88
|
+
downloading: 'Téléchargement de Org :'
|
89
|
+
no_download: >-
|
90
|
+
Impossible de télécharger Org maintenant. Merci de réessayer
|
91
|
+
plus tard.
|
92
|
+
installed: La version %{version} de Org a été installé localement.
|
93
|
+
installing: 'Installation de Org :'
|