fronde 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31ed851cf895abccd33ec85ab91459e4310c9716631d096efd89d18fd16bf190
|
4
|
+
data.tar.gz: 901e11daea515cff4336f05a13a67604a5d73ca9fc020efb8250b34fbdb72450
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1190105b49652d3bf177602a9ca37906f9a4659416f821734b17b5a49269825726019a6b69ad47b312937d75b362e658b93026003ffc42cd92859b601c9c8e96
|
7
|
+
data.tar.gz: 4e34d65345c82cc39237521c2e79365bbe4c23572fa4c4fa7d65e2d5aa7119d095a2956ec569e03c6cb459e7f1f37fe933aac3d2b0fdcefafb69f1cea8ef695b
|
data/bin/fronde
CHANGED
@@ -1,45 +1,30 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
require 'fronde/version'
|
8
|
-
require 'fronde/cli'
|
9
|
-
|
10
|
-
R18n.default_places = File.expand_path('../locales', __dir__)
|
11
|
-
R18n.set Fronde::Config.get('lang')
|
4
|
+
require_relative '../lib/fronde/config'
|
5
|
+
require_relative '../lib/fronde/version'
|
6
|
+
require_relative '../lib/fronde/cli'
|
12
7
|
|
8
|
+
require 'optparse'
|
13
9
|
optparser = OptionParser.new
|
14
10
|
optparser.version = Fronde::VERSION
|
15
11
|
|
16
|
-
Fronde::
|
17
|
-
optparser.send(opt[:
|
12
|
+
Fronde::CLI::OptParse::FRONDE_OPTIONS.each do |k, opt|
|
13
|
+
optparser.send(opt[:method] || :on, *Fronde::CLI::OptParse.decorate_option(k))
|
18
14
|
end
|
19
15
|
|
20
|
-
params = {}
|
21
|
-
|
16
|
+
params = { verbose: false }
|
17
|
+
begin
|
18
|
+
optparser.parse!(into: params)
|
19
|
+
rescue OptionParser::InvalidArgument => e
|
20
|
+
warn e.message
|
21
|
+
params.merge!(help: true, recover_from_error: true)
|
22
|
+
end
|
22
23
|
|
23
24
|
if params[:version]
|
24
25
|
warn optparser.ver
|
25
26
|
exit
|
26
27
|
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
ARGV.shift
|
31
|
-
end
|
32
|
-
fronde = Fronde::CLI.new(params)
|
33
|
-
command = "fronde_#{ARGV[0]}".to_sym
|
34
|
-
cmd_err = !fronde.respond_to?(command)
|
35
|
-
if params[:help] || cmd_err
|
36
|
-
cmd_err = false if params[:help] && !ARGV[0]
|
37
|
-
fronde.fronde_help(ARGV[0], error: cmd_err)
|
38
|
-
end
|
39
|
-
ARGV.shift
|
40
|
-
|
41
|
-
init_cmds = [:fronde_init, :fronde_config, :fronde_update]
|
42
|
-
unless File.exist?('config.yml') || init_cmds.include?(command)
|
43
|
-
fronde.fronde_init
|
44
|
-
end
|
45
|
-
fronde.send command
|
29
|
+
fronde = Fronde::CLI::App.new(params)
|
30
|
+
exit fronde.run(ARGV)
|
data/lib/ext/nil_time.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# A time emulator to handle cases where no time is available
|
4
|
+
class NilTime
|
5
|
+
def strftime(*)
|
6
|
+
''
|
7
|
+
end
|
8
|
+
|
9
|
+
def xmlschema(_ = 0)
|
10
|
+
''
|
11
|
+
end
|
12
|
+
|
13
|
+
def l18n_short_date_string
|
14
|
+
''
|
15
|
+
end
|
16
|
+
|
17
|
+
def l18n_long_date_string(*)
|
18
|
+
''
|
19
|
+
end
|
20
|
+
|
21
|
+
def l18n_short_date_html
|
22
|
+
'<time></time>'
|
23
|
+
end
|
24
|
+
alias_method :l18n_long_date_html, :l18n_long_date_string
|
25
|
+
end
|
data/lib/ext/r18n.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Monkey patch to add a little helper
|
4
|
+
module R18nPatch
|
5
|
+
refine R18n::Translation do
|
6
|
+
def full_datetime_format
|
7
|
+
date_fmt = fronde.index.full_date_format(
|
8
|
+
date: @locale.full_format
|
9
|
+
)
|
10
|
+
date_fmt = @locale.year_format.sub('_', date_fmt)
|
11
|
+
time_fmt = @locale.time_format.delete('_').strip
|
12
|
+
fronde.index.full_date_with_time_format(
|
13
|
+
date: date_fmt, time: time_fmt
|
14
|
+
)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/ext/time.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Monkey patch to add some helpers
|
4
|
+
module TimePatch
|
5
|
+
refine Time do
|
6
|
+
# Returns the current Time instance as a localized short string.
|
7
|
+
#
|
8
|
+
# @return [String] the localized Time string representation
|
9
|
+
def l18n_short_date_string
|
10
|
+
R18n.l to_date
|
11
|
+
end
|
12
|
+
|
13
|
+
# Format the current Time as a HTML `time` tag showing a short date.
|
14
|
+
#
|
15
|
+
# @return [String] the HTML `time` tag
|
16
|
+
def l18n_short_date_html
|
17
|
+
"<time datetime=\"#{xmlschema}\">#{l18n_short_date_string}</time>"
|
18
|
+
end
|
19
|
+
|
20
|
+
def no_time=(value)
|
21
|
+
@no_time = value
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns the current Time instance as a localized long string.
|
25
|
+
#
|
26
|
+
# @param with_year [Boolean] wether or not the string must contain the
|
27
|
+
# year
|
28
|
+
# @return [String] the localized Time string representation
|
29
|
+
def l18n_long_date_string(with_year: true)
|
30
|
+
locale = R18n.get.locale
|
31
|
+
long_fmt = R18n.t.fronde.index.full_date_format(
|
32
|
+
date: locale.format_date_full(self, year: with_year)
|
33
|
+
)
|
34
|
+
unless @no_time
|
35
|
+
long_fmt = R18n.t.fronde.index.full_date_with_time_format(
|
36
|
+
date: long_fmt, time: locale.time_format.delete('_').strip
|
37
|
+
)
|
38
|
+
end
|
39
|
+
locale.strftime(self, long_fmt)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Format the current Time as a HTML `time` tag showing a long date.
|
43
|
+
#
|
44
|
+
# @return [String] the HTML `time` tag
|
45
|
+
def l18n_long_date_html
|
46
|
+
"<time datetime=\"#{xmlschema}\">#{l18n_long_date_string}</time>"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/fronde/cli/commands.rb
CHANGED
@@ -1,125 +1,114 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'helpers'
|
4
|
+
require_relative 'opt_parse'
|
5
|
+
require_relative '../slug'
|
6
|
+
require_relative '../org/file'
|
7
|
+
|
3
8
|
module Fronde
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
module CLI
|
10
|
+
# Fronde commands
|
11
|
+
module Commands
|
12
|
+
def fronde_new
|
13
|
+
new_dir = @argv.first || 'my_fronde_website'
|
14
|
+
FileUtils.mkdir new_dir
|
15
|
+
Dir.chdir new_dir
|
16
|
+
Helpers.init_config_file @options
|
17
|
+
Fronde::CONFIG.reset # Correctly compute various path
|
18
|
+
Helpers.init_rakefile
|
19
|
+
init_rake
|
20
|
+
@rake['org:install'].invoke
|
21
|
+
@argv = ['src/index.org']
|
22
|
+
fronde_open
|
23
|
+
end
|
12
24
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
25
|
+
def fronde_update
|
26
|
+
Helpers.init_rakefile
|
27
|
+
init_rake
|
28
|
+
@rake.options.build_all = true
|
29
|
+
@rake['org:upgrade'].invoke
|
30
|
+
0
|
31
|
+
end
|
21
32
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
33
|
+
def fronde_build
|
34
|
+
@rake.options.build_all = true
|
35
|
+
@rake['site:build'].invoke @options[:force]
|
36
|
+
0
|
37
|
+
end
|
28
38
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
current_os = Fronde::Utils.current_os
|
35
|
-
case current_os
|
36
|
-
when 'windows'
|
37
|
-
system 'start', uri
|
38
|
-
when 'apple'
|
39
|
-
system 'open', uri
|
40
|
-
else
|
41
|
-
system 'gio', 'open', uri
|
39
|
+
def fronde_preview
|
40
|
+
Thread.new do
|
41
|
+
sleep 1
|
42
|
+
port = Fronde::CONFIG.get(%w[preview server_port], 5000)
|
43
|
+
Helpers.launch_app_for_uri "http://127.0.0.1:#{port}/"
|
42
44
|
end
|
45
|
+
@rake['site:preview'].invoke
|
46
|
+
0
|
43
47
|
end
|
44
|
-
@rake.invoke_task('site:preview')
|
45
|
-
end
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
49
|
+
def fronde_open
|
50
|
+
editor = ENV['EDITOR'] || ENV['VISUAL'] || 'emacs'
|
51
|
+
cmd = [editor]
|
52
|
+
file_path = @argv.first || Dir.pwd
|
53
|
+
unless File.file?(file_path)
|
54
|
+
# file_path may be updated with title given in options
|
55
|
+
file_path = create_new_file(file_path)
|
56
|
+
# Only move to the end of file for new file. Let the editor handle
|
57
|
+
# the best position for already existing files
|
58
|
+
cmd << '+6'
|
59
|
+
end
|
60
|
+
cmd << file_path
|
61
|
+
(system(*cmd) && 0) || 1
|
56
62
|
end
|
57
|
-
cmd << file_path
|
58
|
-
system(*cmd)
|
59
|
-
end
|
60
|
-
alias_method :fronde_edit, :fronde_open
|
61
63
|
|
62
|
-
|
63
|
-
|
64
|
-
|
64
|
+
def fronde_publish
|
65
|
+
@rake['sync:push'].invoke
|
66
|
+
0
|
67
|
+
end
|
65
68
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
69
|
+
def fronde_help
|
70
|
+
# Try to find command in next argv, otherwise fallback again.
|
71
|
+
@command = @argv.shift || 'basic' if @command == 'help'
|
72
|
+
cmd_opt = OptParse.command_options(@command)
|
73
|
+
label = cmd_opt[:label] || @command
|
74
|
+
warn format("%<label>s\n\n", label: R18n.t.fronde.bin.usage(label))
|
75
|
+
cmd = cmd_opt[:name] || @command
|
76
|
+
if R18n.t.fronde.bin.commands[cmd].translated?
|
77
|
+
warn format("%<label>s\n\n", label: R18n.t.fronde.bin.commands[cmd])
|
78
|
+
end
|
79
|
+
body = OptParse.help_command_body(cmd)
|
80
|
+
warn body unless body == ''
|
81
|
+
0
|
74
82
|
end
|
75
|
-
warn help_command_body(cmd).join("\n")
|
76
|
-
exit 1 if error
|
77
|
-
exit
|
78
|
-
end
|
79
83
|
|
80
|
-
|
84
|
+
private
|
81
85
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
Fronde::Config.save(Fronde::Config.settings.merge(cnf))
|
87
|
-
end
|
86
|
+
def file_name_from_title
|
87
|
+
title = @options[:title] || R18n.t.fronde.bin.options.default_title
|
88
|
+
# No title, nor a reliable file_path? Better abort
|
89
|
+
raise R18n.t.fronde.error.bin.no_file if title == ''
|
88
90
|
|
89
|
-
|
90
|
-
|
91
|
-
return file_path if file_path[-4..] == '.org'
|
92
|
-
# file_path seems to be a dir path. Thus we have to create the new
|
93
|
-
# filename from its title
|
94
|
-
title = @options[:title]
|
95
|
-
# No title, nor a reliable file_path? Better abort
|
96
|
-
return nil if title.nil? || title == ''
|
97
|
-
filename = "#{Fronde::OrgFile.slug(title)}.org"
|
98
|
-
File.join file_path, filename
|
99
|
-
end
|
91
|
+
"#{Fronde::Slug.slug(title)}.org"
|
92
|
+
end
|
100
93
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
94
|
+
def new_file_name(file_path)
|
95
|
+
file_path = File.expand_path(file_path)
|
96
|
+
|
97
|
+
if file_path[-4..] == '.org' && !File.directory?(file_path)
|
98
|
+
return file_path
|
99
|
+
end
|
100
|
+
|
101
|
+
# file_path seems to be a dir path. Thus we have to create the new
|
102
|
+
# filename from its title
|
103
|
+
File.join file_path, file_name_from_title
|
106
104
|
end
|
107
|
-
FileUtils.mkdir_p File.dirname(filename)
|
108
|
-
Fronde::OrgFile.new(filename, @options).write
|
109
|
-
filename
|
110
|
-
end
|
111
105
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
Fronde::
|
116
|
-
|
117
|
-
|
118
|
-
body + [
|
119
|
-
'',
|
120
|
-
R18n.t.fronde.bin.commands.cmd_title,
|
121
|
-
Fronde::Utils.list_commands
|
122
|
-
]
|
106
|
+
def create_new_file(file_path)
|
107
|
+
filename = new_file_name(file_path)
|
108
|
+
FileUtils.mkdir_p File.dirname(filename)
|
109
|
+
Fronde::Org::File.new(filename, @options).write
|
110
|
+
filename
|
111
|
+
end
|
123
112
|
end
|
124
113
|
end
|
125
114
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#compdef fronde
|
2
|
+
#autoload
|
3
|
+
|
4
|
+
{% for command in commands %}
|
5
|
+
{%- for option in command.options %}
|
6
|
+
{%- if forloop.first %}
|
7
|
+
(( $+functions[__fronde_{{ command.name }}] )) ||
|
8
|
+
__fronde_{{ command.name }}(){
|
9
|
+
_arguments \
|
10
|
+
{%- endif %}
|
11
|
+
'({{ option.short }} {{ option.long }})'{{ '{' }}{{ option.short}},{{ option.long }}}
|
12
|
+
{%- if option.keyword %}':{{ option.keyword }}:'{% endif %}
|
13
|
+
{%- if forloop.last %}
|
14
|
+
{%- if command.name == 'open' %} \
|
15
|
+
'1:file:_files -g \*.org'
|
16
|
+
{%- endif %}
|
17
|
+
}
|
18
|
+
{% else %} \{% endif %}
|
19
|
+
{%- endfor %}{% endfor %}
|
20
|
+
|
21
|
+
(( $+functions[__fronde_help] )) ||
|
22
|
+
__fronde_help(){
|
23
|
+
_arguments \
|
24
|
+
"1:command:(({% for command in commands %}{{ command.name }}\:'{{ command.translation }}' {% endfor %}))"
|
25
|
+
}
|
26
|
+
|
27
|
+
local state
|
28
|
+
|
29
|
+
_arguments -C \
|
30
|
+
'(-)-h[help]' \
|
31
|
+
'(-)-V[version]' \
|
32
|
+
"1:command:(({% for command in commands %}{{ command.name }}\:'{{ command.translation }}' {% endfor %}))" \
|
33
|
+
'*::arg:->args'
|
34
|
+
|
35
|
+
if [ "$state" = args ]; then
|
36
|
+
_call_function ret __fronde_${words[1]}
|
37
|
+
fi
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
require 'net/http'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
module Fronde
|
8
|
+
module CLI
|
9
|
+
# Various utilitaries methods
|
10
|
+
module Helpers
|
11
|
+
def self.init_config_file(config)
|
12
|
+
return if File.exist? 'config.yml'
|
13
|
+
|
14
|
+
output = config[:output] || 'html'
|
15
|
+
output = 'gemini' if output == 'gmi'
|
16
|
+
data = { 'author' => config[:author],
|
17
|
+
'lang' => config[:lang],
|
18
|
+
'output' => output }
|
19
|
+
source = File.expand_path './data/config.yml', __dir__
|
20
|
+
template = Liquid::Template.parse(File.read(source))
|
21
|
+
File.write('config.yml', template.render(data))
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.init_rakefile
|
25
|
+
FileUtils.cp(
|
26
|
+
File.expand_path('./data/Rakefile', __dir__),
|
27
|
+
'Rakefile'
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.launch_app_for_uri(uri)
|
32
|
+
case current_os
|
33
|
+
when 'windows'
|
34
|
+
system 'start', uri
|
35
|
+
when 'apple'
|
36
|
+
system 'open', uri
|
37
|
+
else
|
38
|
+
system 'gio', 'open', uri
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Try to discover the current host operating system.
|
43
|
+
#
|
44
|
+
# @return [String] either apple, windows or linux (default)
|
45
|
+
def self.current_os
|
46
|
+
if ENV['OS'] == 'Windows_NT' || RUBY_PLATFORM.include?('cygwin')
|
47
|
+
return 'windows'
|
48
|
+
end
|
49
|
+
return 'apple' if RUBY_PLATFORM.include?('darwin')
|
50
|
+
|
51
|
+
'linux'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fronde
|
4
|
+
module CLI
|
5
|
+
# Helper code to help build the fronde option parser
|
6
|
+
module OptParse
|
7
|
+
# @return [Hash] the possible ~fronde~ options and their
|
8
|
+
# configuration
|
9
|
+
FRONDE_OPTIONS = {
|
10
|
+
'-a' => { long: 'author' },
|
11
|
+
'-f' => { long: 'force', boolean: true },
|
12
|
+
'-h' => { long: 'help', boolean: true, method: :on_tail,
|
13
|
+
help: R18n.t.fronde.bin.options.help },
|
14
|
+
'-l' => { long: 'lang', keyword: 'LOCALE' },
|
15
|
+
'-o' => { long: 'output', keyword: 'FORMAT', choices: %w[gemini html] },
|
16
|
+
'-t' => { long: 'title' },
|
17
|
+
'-v' => { long: 'verbose', boolean: true, method: :on_tail },
|
18
|
+
'-V' => { long: 'version', boolean: true, method: :on_tail,
|
19
|
+
help: R18n.t.fronde.bin.options.version }
|
20
|
+
}.freeze
|
21
|
+
|
22
|
+
# TODO: jekyll new [path] / jekyll build / jekyll clean / jekyll serve
|
23
|
+
# TODO: hugo new site [path] / hugo / hugo new content / hugo server
|
24
|
+
# TODO: zola init [path] / zola build --root path_to_project / zola serve
|
25
|
+
|
26
|
+
# @return [Hash] the possible ~fronde~ subcommands and their
|
27
|
+
# configuration
|
28
|
+
FRONDE_COMMANDS = {
|
29
|
+
'new' => { opts: ['-a', '-l', '-o', '-t', '-v'], label: 'new <path>' },
|
30
|
+
'init' => { alias: 'new' },
|
31
|
+
'update' => {},
|
32
|
+
'config' => { alias: 'update' },
|
33
|
+
'preview' => {},
|
34
|
+
'open' => { opts: ['-a', '-l', '-t', '-v'], label: 'open <path>' },
|
35
|
+
'edit' => { alias: 'open' },
|
36
|
+
'build' => { opts: ['-f'] },
|
37
|
+
'publish' => {},
|
38
|
+
'help' => {},
|
39
|
+
'basic' => { opts: ['-h', '-V'], label: '<command>' }
|
40
|
+
}.freeze
|
41
|
+
|
42
|
+
class << self
|
43
|
+
# Returns the short and long options specification for a given
|
44
|
+
# short option.
|
45
|
+
#
|
46
|
+
# This method use the {Fronde::CLI::OptParse::FRONDE_OPTIONS}
|
47
|
+
# Hash to retrieve corresponding values.
|
48
|
+
#
|
49
|
+
# @example
|
50
|
+
# spec = Fronde::CLI::OptParse.decorate_option('-a')
|
51
|
+
# => ['-a AUTHOR', '--author AUTHOR']
|
52
|
+
#
|
53
|
+
# @param short [String] the short option to decorate
|
54
|
+
# @return [Array] the short and long specification for an option
|
55
|
+
def decorate_option(short)
|
56
|
+
opt = FRONDE_OPTIONS[short]
|
57
|
+
long = "--#{opt[:long]}"
|
58
|
+
if opt[:boolean]
|
59
|
+
config = [short, long]
|
60
|
+
else
|
61
|
+
key = opt[:keyword] || opt[:long].upcase
|
62
|
+
config = [short, format('%<long>s %<key>s', long: long, key: key)]
|
63
|
+
end
|
64
|
+
config << opt[:choices] if opt[:choices]
|
65
|
+
config << opt[:help] if opt[:help]
|
66
|
+
config
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns the ~fronde~ help summary for a given command.
|
70
|
+
#
|
71
|
+
# @param command [String] the command for which a summary
|
72
|
+
# should be given
|
73
|
+
# @return [String]
|
74
|
+
def summarize_command(command)
|
75
|
+
(FRONDE_COMMANDS[command][:opts] || []).map do |k|
|
76
|
+
short, long = decorate_option(k)
|
77
|
+
opt = FRONDE_OPTIONS[k]
|
78
|
+
label = [short, long].join(', ')
|
79
|
+
line = [format(' %<opt>s', opt: label).ljust(30)]
|
80
|
+
help = opt[:help]
|
81
|
+
line << help if help
|
82
|
+
choices = opt[:choices]
|
83
|
+
line << "(#{choices.join(', ')})" if choices
|
84
|
+
line.join(' ')
|
85
|
+
end.join("\n")
|
86
|
+
end
|
87
|
+
|
88
|
+
def help_command_body(command)
|
89
|
+
command_opts_doc = summarize_command(command)
|
90
|
+
return '' if command_opts_doc == ''
|
91
|
+
|
92
|
+
body = [R18n.t.fronde.bin.options.cmd_title, command_opts_doc]
|
93
|
+
if command == 'basic'
|
94
|
+
body += ['', R18n.t.fronde.bin.commands.cmd_title, list_commands]
|
95
|
+
end
|
96
|
+
body.join("\n")
|
97
|
+
end
|
98
|
+
|
99
|
+
# Returns a formatted list of available commands for ~fronde~.
|
100
|
+
#
|
101
|
+
# @return [String]
|
102
|
+
def list_commands
|
103
|
+
FRONDE_COMMANDS.filter_map do |cmd, opt|
|
104
|
+
next if cmd == 'basic'
|
105
|
+
|
106
|
+
line = [' ', cmd.ljust(10)]
|
107
|
+
if opt.has_key? :alias
|
108
|
+
line << R18n.t.fronde.bin.commands.alias(opt[:alias])
|
109
|
+
else
|
110
|
+
line << R18n.t.fronde.bin.commands[cmd]
|
111
|
+
end
|
112
|
+
line.join(' ')
|
113
|
+
end.join("\n")
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns the real command name for a given command, which may be
|
117
|
+
# an alias.
|
118
|
+
#
|
119
|
+
# @param command [String] the command to resolve
|
120
|
+
# @return [String]
|
121
|
+
def resolve_possible_alias(command)
|
122
|
+
return 'basic' unless FRONDE_COMMANDS.include?(command)
|
123
|
+
|
124
|
+
cmd_opt = FRONDE_COMMANDS[command]
|
125
|
+
return cmd_opt[:alias] if cmd_opt.has_key?(:alias)
|
126
|
+
|
127
|
+
command
|
128
|
+
end
|
129
|
+
|
130
|
+
# Returns the given command options.
|
131
|
+
#
|
132
|
+
# This method will first try to resolve command alias, if any.
|
133
|
+
#
|
134
|
+
# @param command [String] the command, which options should be returned
|
135
|
+
# @return [Hash] the command options
|
136
|
+
def command_options(command)
|
137
|
+
cmd = resolve_possible_alias command
|
138
|
+
FRONDE_COMMANDS[cmd].merge(name: cmd)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|