neruda 0.1.0 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f3224292de6de88d025190d293fd0e9043f2cb54832986410975343887be77d
4
- data.tar.gz: aaf3bf95cf510fc67cd0dcab3f6c9a65d2153ed676b4300c068dda01bfca6241
3
+ metadata.gz: 819cab1f549a9991714bac07e34be41187f667b67200996e2ef78a6a8c555ef5
4
+ data.tar.gz: 4cc683d19f3bfdf060ce56c720251f1db58ac88df3a44c55ada1298155e76f77
5
5
  SHA512:
6
- metadata.gz: 662711c6423eea8c5c554c53761f23e56260fe8c022685d62ef8b234e6ef89f9bffd85707ff8e39e96c460096817bd52964111ad4f2f86f4b8945856e64be693
7
- data.tar.gz: 6b95b730be8814ed2d9af07452b34caa6ac07ef58bdfcaef8c653ec901081392e2c2c1e5c85fa392e698a292566b69c25a24297e52beecabe1f8b2211426c141
6
+ metadata.gz: 4d15fb6bcd865e0493b5f08e6209d7ce6a4e1764b88e2eff9cf9d05b20d832f83d1da81e9d7c9d381c4fd128c1f1ff0ff45524ba2e9412c56c3b17247c89a516
7
+ data.tar.gz: 05e47deafd1cf2366748100699dcbb8677802be4423191d16ed3f352ba52038665c524aafcf5b205cacbda2b8dad582ad13c161ed3110c5503d18a958aaa2b24
data/bin/pablo CHANGED
@@ -35,38 +35,55 @@ module PabloCommands
35
35
  end
36
36
 
37
37
  def pablo_preview
38
+ Thread.new do
39
+ sleep 1
40
+ port = Neruda::Config.settings['server_port'] || 5000
41
+ uri = "http://127.0.0.1:#{port}/"
42
+ current_os = Neruda::Utils.current_os
43
+ if current_os == 'windows'
44
+ system 'start', uri
45
+ elsif current_os == 'apple'
46
+ system 'open', uri
47
+ else
48
+ system 'gio', 'open', uri
49
+ end
50
+ end
38
51
  @rake.invoke_task('site:preview')
39
52
  end
40
53
 
41
54
  def pablo_open
42
- filename = ARGV[0] || new_file_name
55
+ filename = new_file_name(ARGV[0])
43
56
  FileUtils.mkdir_p File.dirname(filename)
44
57
  o = Neruda::OrgFile.new(filename, @options)
45
58
  o.write unless File.exist? filename
46
-
47
59
  editor = ENV['EDITOR'] || ENV['VISUAL'] || 'emacs'
48
60
  cmd = [editor, filename]
49
61
  cmd.insert(1, '+6') if editor.match?(/^emacs/)
50
62
  system(*cmd)
51
63
  end
64
+ alias_method :pablo_edit, :pablo_open
65
+
66
+ def pablo_publish
67
+ @rake.invoke_task('sync:push')
68
+ end
52
69
 
53
70
  def pablo_help(command = 'basic', error = false)
54
71
  warn R18n.t.pablo.error.no_command if error
55
- command = 'basic' unless Neruda::Utils::PABLO_COMMANDS.include?(command)
56
- cmd_opt = Neruda::Utils::PABLO_COMMANDS[command]
72
+ cmd = Neruda::Utils.resolve_possible_alias(command)
73
+ cmd_opt = Neruda::Utils::PABLO_COMMANDS[cmd]
57
74
  label = cmd_opt[:label] || command
58
75
  warn "Usage: pablo #{label} [options]\n\n"
59
76
  warn cmd_opt[:desc] + "\n\n" if cmd_opt.has_key?(:desc)
60
- warn "Options\n#{Neruda::Utils.summarize_command(command)}\n"
61
- warn "Commands\n#{Neruda::Utils.list_commands}\n" if command == 'basic'
77
+ warn "Options\n#{Neruda::Utils.summarize_command(cmd)}\n"
78
+ warn "Commands\n#{Neruda::Utils.list_commands}\n" if cmd == 'basic'
62
79
  exit 1 if error
63
80
  exit
64
81
  end
65
82
 
66
83
  private
67
84
 
68
- def new_file_name
69
- title = @options[:title]
85
+ def new_file_name(title)
86
+ title ||= @options[:title]
70
87
  title = 'new' if title.nil? || title == ''
71
88
  filename = Neruda::OrgFile.slug title
72
89
  return "#{filename}.org" unless @options[:directory]
@@ -112,14 +129,14 @@ class Pablo
112
129
  end
113
130
  end
114
131
 
115
- params = {}
116
- optparser = OptionParser.new do |opts|
117
- opts.version = Neruda::VERSION
118
- Neruda::Utils::PABLO_OPTIONS.each do |k, opt|
119
- short, long = Neruda::Utils.decorate_option(k)
120
- opts.send(opt[:meth] || :on, short, long, opt[:desc])
121
- end
132
+ optparser = OptionParser.new
133
+ optparser.version = Neruda::VERSION
134
+
135
+ Neruda::Utils::PABLO_OPTIONS.each do |k, opt|
136
+ optparser.send(opt[:meth] || :on, *Neruda::Utils.decorate_option(k))
122
137
  end
138
+
139
+ params = {}
123
140
  optparser.parse!(into: params)
124
141
 
125
142
  if params[:version]
@@ -133,8 +150,11 @@ if ARGV[0] == 'help'
133
150
  end
134
151
  pablo = Pablo.new(params)
135
152
  command = "pablo_#{ARGV[0]}".to_sym
136
- err = command.nil? || !pablo.respond_to?(command)
137
- pablo.pablo_help(ARGV[0], err) if err || params[:help]
153
+ cmd_err = !pablo.respond_to?(command)
154
+ if params[:help] || cmd_err
155
+ cmd_err = false if params[:help] && !ARGV[0]
156
+ pablo.pablo_help(ARGV[0], cmd_err)
157
+ end
138
158
  ARGV.shift
139
159
 
140
160
  init_cmds = ['pablo_init', 'pablo_config']
@@ -91,13 +91,13 @@ module Neruda
91
91
  orgtpl = opts['org_headers']
92
92
  base_directory = File.expand_path(opts['path'])
93
93
  publish_in = [Dir.pwd, settings['public_folder']]
94
- publish_in << project_name unless project_name == 'org'
94
+ publish_in << project_name unless project_name == 'neruda'
95
95
  publish_in = publish_in.join('/')
96
96
  recline = [opts['recursive'] || 't']
97
97
  default_ex_ptrn = settings['exclude_pattern']
98
98
  if opts['exclude']
99
99
  recline << ":exclude \"#{opts['exclude']}\""
100
- elsif project_name == 'org' && default_ex_ptrn
100
+ elsif project_name == 'neruda' && default_ex_ptrn
101
101
  recline << ":exclude \"#{default_ex_ptrn}\""
102
102
  end
103
103
  <<~ORGPROJECT
@@ -147,17 +147,24 @@ module Neruda
147
147
  orgtpl.join("\n ")
148
148
  end
149
149
 
150
+ def org_external_projects_opts(seed, orgtpl)
151
+ opts = { 'org_headers' => orgtpl }
152
+ if seed.is_a? String
153
+ opts['path'] = seed
154
+ elsif seed.is_a? Hash
155
+ opts.merge! seed
156
+ end
157
+ opts
158
+ end
159
+
150
160
  def org_generate_projects
151
161
  orgtpl = org_templates
152
- projects = { 'org' => org_project('org', 'org_headers' => orgtpl,
153
- 'path' => './src') }
162
+ default_project = org_project(
163
+ 'neruda', 'org_headers' => orgtpl, 'path' => './src'
164
+ )
165
+ projects = { 'neruda' => default_project }
154
166
  settings['external_sources']&.each do |s|
155
- opts = { 'org_headers' => orgtpl }
156
- if s.is_a? String
157
- opts['path'] = s
158
- elsif s.is_a? Hash
159
- opts.merge! s
160
- end
167
+ opts = org_external_projects_opts(s, orgtpl)
161
168
  next unless opts.has_key?('path')
162
169
  pname = File.basename(opts['path']).sub(/^\./, '')
163
170
  projects[pname] = org_project(pname, opts)
@@ -49,7 +49,12 @@ module Neruda
49
49
 
50
50
  def sort_by(kind)
51
51
  if [:name, :weight].include?(kind)
52
- return sort_tags_by_name_and_weight["by_#{kind}".to_sym]
52
+ tags_sorted = sort_tags_by_name_and_weight["by_#{kind}".to_sym]
53
+ # Reverse in order to have most important or A near next prompt
54
+ # and avoid to scroll to find the beginning of the list.
55
+ return tags_sorted.map do |k|
56
+ @tags_names[k] + " (#{@index[k].length})"
57
+ end.reverse
53
58
  end
54
59
  raise ArgumentError, "#{kind} not in [:name, :weight]"
55
60
  end
@@ -252,7 +252,7 @@ module Neruda
252
252
  @notime = false
253
253
  @author = @options[:author] || Neruda::Config.settings['author']
254
254
  @keywords = []
255
- @lang = Neruda::Config.settings['lang']
255
+ @lang = @options[:lang] || Neruda::Config.settings['lang']
256
256
  @excerpt = ''
257
257
  @content = @options[:content] || <<~ORG
258
258
  #+title: #{@title}
@@ -70,9 +70,9 @@ module Neruda
70
70
  command = emacs_command arguments
71
71
  if @options[:verbose]
72
72
  warn command
73
- return system(command)
73
+ return system(command, exception: true)
74
74
  end
75
- system command, out: '/dev/null', err: '/dev/null'
75
+ system command, out: '/dev/null', err: '/dev/null', exception: true
76
76
  end
77
77
  end
78
78
  end
@@ -41,11 +41,16 @@ module Neruda
41
41
  'init' => { opts: ['-a', '-l', '-t', '-v', '-h'],
42
42
  desc: 'Initialize your Neruda instance ' \
43
43
  '(you just need to do it once).' },
44
+ 'config' => { alias: 'init' },
44
45
  'preview' => { opts: ['-h'],
45
46
  desc: 'Start a test webserver to preview ' \
46
47
  'your website on http://127.0.0.1:5000' },
47
48
  'open' => { opts: ['-a', '-l', '-t', '-d', '-p', '-v', '-h'],
48
49
  desc: 'Open or create an org file for edition.' },
50
+ 'edit' => { alias: 'open' },
51
+ 'publish' => { opts: ['-h'],
52
+ desc: 'Push local changes to your public ' \
53
+ 'server online.' },
49
54
  'help' => { opts: ['-h'], desc: 'Alias for the -h switch.' },
50
55
  'basic' => { opts: ['-h', '-V'], label: '<command>' }
51
56
  }.freeze
@@ -66,17 +71,19 @@ module Neruda
66
71
  # @param message [String] the message to display before the throbber
67
72
  # @return [void]
68
73
  def throbber(thread, message)
69
- model = Neruda::Config.settings['throbber'] || 'default'
70
- model = 'default' unless Neruda::Utils::THROBBER_FRAMES.has_key?(model)
71
- frames = Neruda::Utils::THROBBER_FRAMES[model]
72
- current = 0
73
- while thread.alive?
74
- sleep 0.1
75
- print "#{message} #{frames[current % frames.length]}\r"
76
- current += 1
74
+ frames = select_throbber_frames
75
+ begin
76
+ run_and_decorate_thread thread, message, frames
77
+ rescue RuntimeError => e
78
+ done = Rainbow('An error occured.').bold.red + "\n"
79
+ done += Rainbow('To see it, run again your command with more ' \
80
+ 'verbosity, i.e. pablo build -v').bold
81
+ warn "#{message} #{done}"
82
+ raise e
83
+ else
84
+ done = Rainbow('done'.ljust(frames[0].length)).green
85
+ puts "#{message} #{done}"
77
86
  end
78
- done = Rainbow('done'.ljust(frames[0].length)).green
79
- puts "#{message} #{done}"
80
87
  end
81
88
 
82
89
  # Returns the short and long options specification for a given
@@ -95,8 +102,8 @@ module Neruda
95
102
  opt = Neruda::Utils::PABLO_OPTIONS[short]
96
103
  long = "--#{opt[:long]}"
97
104
  return [short, long] if opt[:boolean]
98
- key = ' ' + (opt[:keyword] || opt[:long].upcase)
99
- [short + key, long + key]
105
+ key = opt[:keyword] || opt[:long].upcase
106
+ [short + key, long + ' ' + key]
100
107
  end
101
108
 
102
109
  # Returns the ~pablo~ help summary for a given command.
@@ -125,6 +132,47 @@ module Neruda
125
132
  end
126
133
  lines
127
134
  end
135
+
136
+ # Returns the real command name for a given command, which may be
137
+ # an alias.
138
+ #
139
+ # @param command [String] the command to resolve
140
+ # @return [String]
141
+ def resolve_possible_alias(command)
142
+ return 'basic' unless Neruda::Utils::PABLO_COMMANDS.include?(command)
143
+ cmd_opt = Neruda::Utils::PABLO_COMMANDS[command]
144
+ return cmd_opt[:alias] if cmd_opt.has_key?(:alias)
145
+ command
146
+ end
147
+
148
+ # Try to discover the current host operating system.
149
+ #
150
+ # @return [String] either apple, windows or linux (default)
151
+ def current_os
152
+ if ENV['OS'] == 'Windows_NT' || RUBY_PLATFORM =~ /cygwin/
153
+ return 'windows'
154
+ end
155
+ return 'apple' if RUBY_PLATFORM =~ /darwin/
156
+ 'linux'
157
+ end
158
+
159
+ private
160
+
161
+ def select_throbber_frames
162
+ model = Neruda::Config.settings['throbber'] || 'default'
163
+ model = 'default' unless Neruda::Utils::THROBBER_FRAMES.has_key?(model)
164
+ Neruda::Utils::THROBBER_FRAMES[model]
165
+ end
166
+
167
+ def run_and_decorate_thread(thread, message, frames)
168
+ thread.abort_on_exception = true
169
+ current = 0
170
+ while thread.alive?
171
+ sleep 0.1
172
+ print "#{message} #{frames[current % frames.length]}\r"
173
+ current += 1
174
+ end
175
+ end
128
176
  end
129
177
  end
130
178
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Neruda
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.2'
5
5
  end
@@ -28,7 +28,12 @@ namespace :site do
28
28
  build_html = Thread.new do
29
29
  Neruda::OrgFile.new(nil, verbose: Rake::FileUtilsExt.verbose_flag).publish
30
30
  end
31
- Neruda::Utils.throbber(build_html, 'Publishing:')
31
+ begin
32
+ Neruda::Utils.throbber(build_html, 'Publishing:')
33
+ rescue RuntimeError
34
+ warn 'Aborting'
35
+ next
36
+ end
32
37
  customize_html = Thread.new do
33
38
  pubfolder = Neruda::Config.settings['public_folder']
34
39
  Dir["#{pubfolder}/**/*.html"].each do |f|
@@ -46,8 +51,15 @@ namespace :site do
46
51
  next
47
52
  end
48
53
  verbose = Rake::FileUtilsExt.verbose_flag
49
- o = Neruda::OrgFile.new(args[:source], verbose: verbose)
50
- o.publish
54
+ o = Thread.new do
55
+ Neruda::OrgFile.new(args[:source], verbose: verbose).publish
56
+ end
57
+ begin
58
+ Neruda::Utils.throbber(o, 'Publishing:')
59
+ rescue RuntimeError
60
+ warn 'Aborting'
61
+ next
62
+ end
51
63
  target = Neruda::OrgFile.target_for_source(args[:source])
52
64
  warn "Customizing file #{target}" if verbose
53
65
  Neruda::Templater.customize_output(target, o)
@@ -62,23 +74,3 @@ namespace :site do
62
74
  end
63
75
  # :nocov:
64
76
  end
65
-
66
- namespace :tags do
67
- desc 'List all tags by name'
68
- task :name do
69
- blog_path = Neruda::Config.settings['blog_path']
70
- next if blog_path.nil?
71
- next unless Dir.exist?("src/#{blog_path}")
72
- index = Neruda::Index.new
73
- puts index.sort_by(:name).join("\n")
74
- end
75
-
76
- desc 'List all tags by weight'
77
- task :weight do
78
- blog_path = Neruda::Config.settings['blog_path']
79
- next if blog_path.nil?
80
- next unless Dir.exist?("src/#{blog_path}")
81
- index = Neruda::Index.new
82
- puts index.sort_by(:weight).join("\n")
83
- end
84
- end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'neruda/index'
4
+
5
+ namespace :tags do
6
+ desc 'List all tags by name'
7
+ task :name do
8
+ blog_path = Neruda::Config.settings['blog_path']
9
+ next if blog_path.nil?
10
+ next unless Dir.exist?("src/#{blog_path}")
11
+ index = Neruda::Index.new
12
+ puts index.sort_by(:name).join("\n")
13
+ end
14
+
15
+ desc 'List all tags by weight'
16
+ task :weight do
17
+ blog_path = Neruda::Config.settings['blog_path']
18
+ next if blog_path.nil?
19
+ next unless Dir.exist?("src/#{blog_path}")
20
+ index = Neruda::Index.new
21
+ puts index.sort_by(:weight).join("\n")
22
+ end
23
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neruda
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Étienne Deparis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-23 00:00:00.000000000 Z
11
+ date: 2020-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -208,12 +208,13 @@ files:
208
208
  - lib/tasks/org.rake
209
209
  - lib/tasks/site.rake
210
210
  - lib/tasks/sync.rake
211
+ - lib/tasks/tags.rake
211
212
  - locales/en.yml
212
213
  - locales/fr.yml
213
214
  - themes/default/css/style.css
214
215
  - themes/default/fonts/Yanone_Kaffeesatz_400.woff
215
216
  - themes/default/fonts/Yanone_Kaffeesatz_400.woff2
216
- homepage: https://hg.deparis.io/neruda/
217
+ homepage: https://git.deparis.io/neruda/
217
218
  licenses:
218
219
  - WTFPL
219
220
  metadata: {}
@@ -234,7 +235,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
235
  - !ruby/object:Gem::Version
235
236
  version: '0'
236
237
  requirements: []
237
- rubygems_version: 3.0.6
238
+ rubygems_version: 3.1.2
238
239
  signing_key:
239
240
  specification_version: 4
240
241
  summary: A simplistic way to create an org-mode static website.