hyde_admin 0.0.1 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +3 -0
  3. data/.idea/hyde_admin.iml +2 -0
  4. data/.idea/vcs.xml +6 -0
  5. data/CHANGELOG.md +35 -0
  6. data/README.md +23 -0
  7. data/TODO.md +3 -0
  8. data/bin/admin_views/admin_layout.html.erb +204 -108
  9. data/bin/admin_views/configuration.erb +13 -0
  10. data/bin/admin_views/dashboard.erb +1 -1
  11. data/bin/admin_views/editor_html.erb +24 -0
  12. data/bin/admin_views/editor_js.erb +120 -0
  13. data/bin/admin_views/files/edit.erb +30 -0
  14. data/bin/admin_views/files/listing.erb +111 -0
  15. data/bin/admin_views/partials/image_element.html.erb +4 -0
  16. data/bin/admin_views/partials/images_page.html.erb +8 -0
  17. data/bin/admin_views/posts/edit.erb +158 -0
  18. data/bin/admin_views/posts/listing.erb +37 -0
  19. data/bin/admin_views/upload_image_form.erb +45 -0
  20. data/bin/fslightbox/fslightbox.js +1 -0
  21. data/bin/hyde_admin +3 -0
  22. data/bin/hyde_admin.ru +306 -56
  23. data/bin/hyde_admin.yml +12 -5
  24. data/bin/hyde_assets/hyde_admin.css +37 -0
  25. data/bin/hyde_assets/hyde_admin.js +24 -0
  26. data/bin/i18n/en.yml +77 -1
  27. data/bin/i18n/fr.yml +77 -1
  28. data/bin/lib/codemirror.css +349 -0
  29. data/bin/lib/codemirror.js +9833 -0
  30. data/bin/mode/css/css.js +864 -0
  31. data/bin/mode/css/gss.html +104 -0
  32. data/bin/mode/css/gss_test.js +17 -0
  33. data/bin/mode/css/index.html +81 -0
  34. data/bin/mode/css/less.html +152 -0
  35. data/bin/mode/css/less_test.js +54 -0
  36. data/bin/mode/css/scss.html +158 -0
  37. data/bin/mode/css/scss_test.js +110 -0
  38. data/bin/mode/css/test.js +217 -0
  39. data/bin/mode/htmlembedded/htmlembedded.js +37 -0
  40. data/bin/mode/htmlembedded/index.html +60 -0
  41. data/bin/mode/htmlmixed/htmlmixed.js +153 -0
  42. data/bin/mode/htmlmixed/index.html +100 -0
  43. data/bin/mode/javascript/index.html +118 -0
  44. data/bin/mode/javascript/javascript.js +959 -0
  45. data/bin/mode/javascript/json-ld.html +72 -0
  46. data/bin/mode/javascript/test.js +521 -0
  47. data/bin/mode/javascript/typescript.html +62 -0
  48. data/bin/mode/markdown/index.html +418 -0
  49. data/bin/mode/markdown/markdown.js +886 -0
  50. data/bin/mode/markdown/test.js +1319 -0
  51. data/bin/mode/ruby/index.html +183 -0
  52. data/bin/mode/ruby/ruby.js +303 -0
  53. data/bin/mode/ruby/test.js +23 -0
  54. data/bin/mode/sass/index.html +68 -0
  55. data/bin/mode/sass/sass.js +459 -0
  56. data/bin/mode/sass/test.js +122 -0
  57. data/bin/mode/spreadsheet/index.html +42 -0
  58. data/bin/mode/spreadsheet/spreadsheet.js +112 -0
  59. data/bin/mode/xml/index.html +61 -0
  60. data/bin/mode/xml/test.js +51 -0
  61. data/bin/mode/xml/xml.js +417 -0
  62. data/bin/mode/yaml/index.html +80 -0
  63. data/bin/mode/yaml/yaml.js +120 -0
  64. data/bin/mode/yaml-frontmatter/index.html +121 -0
  65. data/bin/mode/yaml-frontmatter/yaml-frontmatter.js +72 -0
  66. data/hyde_admin.gemspec +7 -1
  67. data/lib/hyde_admin/version.rb +1 -1
  68. metadata +131 -7
  69. data/bin/admin_views/edit.erb +0 -57
  70. data/bin/admin_views/listing.erb +0 -32
  71. data/bin/hyde_admin.sh +0 -3
data/bin/hyde_admin.ru CHANGED
@@ -2,86 +2,306 @@
2
2
  # lancer avec rackup
3
3
  require "roda"
4
4
  require 'yaml'
5
+ require 'fileutils'
6
+ require 'i18n'
7
+ require 'date'
8
+ require 'escape_utils'
9
+ require_relative '../lib/hyde_admin/version'
10
+
11
+ # TODO détecter format nouveau post (pour codemirror)
12
+ # Serve
13
+
14
+ class Mid < Roda
15
+ plugin :middleware
5
16
 
6
- class App < Roda
7
17
  YML_FILE_NAME = "hyde_admin.yml"
8
18
 
9
19
  plugin :render,
10
20
  #escape: true, # Automatically escape output in erb templates using Erubi's escaping support
11
- views: 'admin_views', # Default views directory
21
+ views: File.join(File.expand_path(File.dirname(__FILE__)),'admin_views'), # Default views directory
12
22
  layout_opts: {template: 'admin_layout', engine: 'html.erb'}, # Default layout options
13
23
  template_opts: {default_encoding: 'UTF-8'} # Default template options
14
-
15
- plugin :i18n, translations: './i18n' # gem 'roda-i18n'
16
-
17
- opts[:root] = Dir.pwd
18
-
19
- plugin :public, root: "#{YAML.load(File.read(YML_FILE_NAME))['path_to_jekyll_src']}/_site" # permet de simuler le serveur jekyll
20
-
21
- # TODO load option (default_layout, deploy_dest_address, deploy_dest_path, path_to_jekyll_src, rsync_fullpath)
22
- # expliquer dans la doc le hyde.yml (voir une commande pour le prégénérer)
24
+ plugin :i18n, translations: File.join(File.expand_path(File.dirname(__FILE__)), 'i18n') # gem 'roda-i18n'
25
+ opts[:root] = Dir.pwd
26
+ plugin :public, root: File.join(Dir.pwd, '_site') # simulate jekyll site
27
+ plugin :static, ['/mode', '/lib', '/fslightbox', '/hyde_assets'], :root => File.join(File.expand_path(File.dirname(__FILE__)))
28
+ plugin :http_auth
29
+ plugin :common_logger
23
30
 
24
31
  def initialize(param)
25
- puts "============> #{Dir.pwd}"
26
32
  yml_in_current_dir = File.join(Dir.pwd, YML_FILE_NAME)
27
33
  yml_in_gem = File.expand_path(File.join(File.dirname(__FILE__), YML_FILE_NAME))
28
34
 
29
- puts yml_in_current_dir
30
- puts yml_in_gem
31
-
32
35
  # Generate default YML for hyde_admin
33
36
  if !File.exist?(yml_in_current_dir)
34
- File.cp(yml_in_gem, yml_in_current_dir)
37
+ FileUtils.cp(yml_in_gem, yml_in_current_dir)
35
38
  end
36
39
  @hyde_parameters ||= YAML.load(File.read(yml_in_current_dir))
37
40
  super(param)
38
41
  end
39
42
 
43
+ def self.transliterate_title_for_url(title)
44
+ I18n.config.available_locales = :en
45
+ I18n.transliterate(title).downcase.gsub(/[^a-zA-Z ]/,'').gsub(' ','-')
46
+ end
47
+
48
+ def self.urlize(date_str, title, with_date = true)
49
+ url_str = ""
50
+ if with_date
51
+ url_str += "#{Date.parse(date_str).strftime('%Y-%m-%d')}-"
52
+ end
53
+ url_str += "#{self.transliterate_title_for_url(title)}"
54
+ url_str
55
+ end
56
+
57
+ def self.extract_header_str(str)
58
+ str.scan(/---(.*?)---/m).flatten.first
59
+ end
60
+
61
+ def self.extract_header(str)
62
+ headers = Mid.extract_header_str(str).to_s.split("\n")
63
+ headers = headers.select{ |header| !header.empty? }.map{ |header| header.scan(/([a-zA-Z0-9]*): (.*)/).flatten }.select{ |header| !header.empty? }
64
+ hsh_headers = {}
65
+ if !headers.flatten.empty?
66
+ #$stderr.puts "==============="
67
+ #$stderr.puts headers.inspect
68
+ hsh_headers = Hash[headers]
69
+ end
70
+ hsh_headers
71
+ end
72
+
73
+ def self.remove_header(str)
74
+ str.gsub(/---(.*?)---/m, "")
75
+ end
76
+
77
+ def self.gem_source_path
78
+ File.expand_path(File.dirname(__FILE__))
79
+ end
80
+
81
+ def self.extract_tags(str)
82
+ str.to_s.scan(/^\[?(.*?)\]?$/).flatten.first.split(',')
83
+ end
84
+
85
+ FORMAT_DATE_FILENAME = '%Y-%m-%d'
86
+ FORMAT_DATE_INPUT_FILENAME = '%Y-%m-%d %H:%M:%S %z'
87
+
88
+ REGEXP_EXTRACT_DATE_FROM_FILENAME = /\d{4}-\d{2}-\d{2}-/
89
+ REGEXP_EXTRACT_DATE_TITLE_FROM_FILENAME = /(\d{4}-\d{2}-\d{2}-)(.*)(\.[^.]*)$/
90
+
40
91
  route do |r|
41
- # GET serve static blog (chercher l'url index.html dans le navigateur
92
+ @page = r.params['page']
93
+
94
+ if @hyde_parameters['hyde_admin_auth'].to_s == 'true'
95
+ http_auth {|u, p| [u, p] == [@hyde_parameters['hyde_admin_user'], @hyde_parameters['hyde_admin_password']] }
96
+ end
97
+
98
+ # GET serve jekyll site
42
99
  r.public
43
100
 
101
+ r.i18n_set_locale(@hyde_parameters['hyde_admin_language']) do
102
+
44
103
  r.root do
45
104
  r.redirect "/dashboard"
46
105
  end
47
106
 
107
+ # Redirect to jekyll index site
48
108
  r.on "overview" do
49
109
  r.redirect @hyde_parameters['site_index']
50
110
  end
51
-
52
- # need to install jekyll (version bundlé avec le site
111
+
112
+ # Rebuild static files
53
113
  r.on "rebuild" do
54
- puts @hyde_parameters['path_to_jekyll_src']
55
- `cd #{@hyde_parameters['path_to_jekyll_src']} && jekyll b && sleep 10`
114
+ puts Dir.pwd
115
+ `cd #{Dir.pwd} && jekyll b`
56
116
  r.redirect "/dashboard"
57
117
  end
58
118
 
59
119
  r.on "deploy" do
60
- `#{@hyde_parameters['rsync_fullpath']} #{@hyde_parameters['path_to_jekyll_src']}/_site/ #{@hyde_parameters['deploy_dest_user']}@#{@hyde_parameters['deploy_dest_address']}:#{@hyde_parameters['deploy_dest_path']}`
120
+ `#{@hyde_parameters['rsync_fullpath']} -avzr #{Dir.pwd}/_site/ #{@hyde_parameters['deploy_dest_user']}@#{@hyde_parameters['deploy_dest_address']}:#{@hyde_parameters['deploy_dest_path']}`
61
121
  r.redirect "/dashboard"
62
122
  end
63
123
 
64
- r.on "configuration" do
65
- File.open("hyde.yml","w+") do |f|
124
+ r.post "configuration" do
125
+ r.params.each_pair do |k,v|
126
+ next if k.to_s == "beforeSend"
127
+ @hyde_parameters[k] = v
128
+ end
129
+ File.open(File.join(Dir.pwd, YML_FILE_NAME),"w+") do |f|
66
130
  f.write(@hyde_parameters.to_yaml)
67
131
  end
68
- r.redirect "/dashboard"
132
+ r.redirect "/configuration"
133
+ end
134
+
135
+ r.get "configuration" do
136
+ view("configuration")
69
137
  end
70
138
 
71
139
  r.on "dashboard" do
72
140
  view("dashboard")
73
141
  end
74
142
 
143
+ r.on "upload_image_form" do
144
+ render("upload_image_form")
145
+ end
146
+
147
+ r.post "upload_image" do
148
+ files = [r.params['files']].flatten # 1 or more files
149
+ @filenames = []
150
+ files.each do |file|
151
+ filename = file[:filename]
152
+ while File.exist?(File.join(@hyde_parameters['images_path'], filename))
153
+ filename = "#{File.basename(filename, File.extname(filename))}_#{File.extname(filename)}"
154
+ end
155
+ @filenames << filename
156
+ File.open(File.join(@hyde_parameters['images_path'], filename), 'wb') do |f|
157
+ f.write(file[:tempfile].read)
158
+ end
159
+ end
160
+ render("upload_image_form")
161
+ end
162
+
163
+ r.on "files" do
164
+ @dir_path = r.params['dir_path'] || Dir.pwd
165
+
166
+ # List files
167
+ r.get "index" do
168
+ @files = Dir[File.join(@dir_path, '*')].sort(&:casecmp).reverse
169
+ @parent_dir = (@dir_path != Dir.pwd)
170
+ view("files/listing")
171
+ end
172
+
173
+ # Upload files
174
+ r.post "create" do
175
+ files = [r.params['files']].flatten # 1 or more files
176
+ files.each do |file|
177
+ # TODO rename file if exist
178
+ File.open(File.join(@dir_path, file[:filename]), 'wb') do |f|
179
+ f.write(file[:tempfile].read)
180
+ end
181
+ end
182
+ r.redirect "/files/index?dir_path=#{@dir_path}"
183
+ end
184
+
185
+ # Create directory
186
+ r.post "create_dir" do
187
+ Dir.mkdir(File.join(@dir_path, r.params['directory_name']))
188
+ r.redirect "/files/index?dir_path=#{@dir_path}"
189
+ end
190
+
191
+ # Create file
192
+ r.post "create_file" do
193
+ fullpath = File.join(@dir_path, r.params['file_name'])
194
+ File.open(fullpath, 'w+') do |f|
195
+ f.write("")
196
+ end
197
+ r.redirect "/files/edit?dir_path=#{@dir_path}&file=#{fullpath}"
198
+ end
199
+
200
+ # Edit text files
201
+ r.get "edit" do
202
+ @file = r.params['file']
203
+ @content = File.read(@file)
204
+ @header = Mid.extract_header_str(@content)
205
+ @content = Mid.remove_header(@content)
206
+ @has_header = (!@header.nil? && !@header.empty?)
207
+ @has_editor = ['.html','.md'].include?(File.extname(@file))
208
+ view("files/edit")
209
+ end
210
+
211
+ # Update file
212
+ r.post "update" do
213
+ @file = r.params['file']
214
+ @content = r.params['content']
215
+ @header = r.params['header']
216
+ File.open(@file,"w+") do |f|
217
+ if !@header.nil? and !@header.empty?
218
+ f.write("---")
219
+ f.write(@header)
220
+ f.write("---")
221
+ f.write("")
222
+ end
223
+ f.write(@content)
224
+ end
225
+ view("files/edit")
226
+ end
227
+
228
+ # Delete
229
+ r.post "delete" do
230
+ file = r.params['file']
231
+ File.unlink(file)
232
+ r.redirect "/files/index?dir_path=#{@dir_path}"
233
+ end
234
+ end
235
+
236
+ r.on "ajax" do
237
+ r.post "update_path_date" do
238
+ path = r.params['path']
239
+ date = Date.parse(r.params['date'])
240
+ new_path = path.gsub(REGEXP_EXTRACT_DATE_FROM_FILENAME, date.strftime("#{FORMAT_DATE_FILENAME}-"))
241
+ response.write(new_path)
242
+ end
243
+ r.post "update_path_title" do
244
+ path = r.params['path']
245
+ title = r.params['title']
246
+ I18n.config.available_locales = :en
247
+ new_path = path.gsub(REGEXP_EXTRACT_DATE_TITLE_FROM_FILENAME, "\\1#{Mid.transliterate_title_for_url(title)}\\3")
248
+ response.write(new_path)
249
+ end
250
+ r.post "update_date_today" do
251
+ date = Time.now.strftime(FORMAT_DATE_INPUT_FILENAME)
252
+ response.write(date)
253
+ end
254
+ r.post "images" do
255
+ nb_elements_per_page = 9
256
+
257
+ sort_date = r.params['sort_date']
258
+ filename = r.params['filename']
259
+ page = r.params['page'].to_i
260
+ start_elts = (page || 0) * nb_elements_per_page
261
+
262
+ search_filename = "*#{filename.strip}*"
263
+
264
+ path_of_images = File.join(Dir.pwd, @hyde_parameters['images_path'], search_filename)
265
+
266
+ all_images = Dir.glob(path_of_images).sort_by {|filename| File.mtime(filename) }
267
+ all_images = all_images.reverse if sort_date == 'asc'
268
+ @images = all_images[start_elts, nb_elements_per_page]
269
+
270
+ path = File.join(Pathname.new(Mid.gem_source_path), 'admin_views', 'partials', 'images_page.html.erb')
271
+ data = ERB.new(File.read(path)).result(binding)
272
+
273
+ response.write(data)
274
+ end
275
+ end
276
+
75
277
  # Posts/pages/drafts
76
278
  r.on /posts|pages|drafts/ do
77
279
  # Set variable for all routes in /hello branch
78
280
  @type_file = r.matched_path.split('/').compact.select{ |elt| elt != '' }.first
79
281
 
282
+ # Mkdir _pages _drafts _posts if they not exist
283
+ FileUtils.mkdir_p(File.join(Dir.pwd, "_#{@type_file}"))
284
+
80
285
  # GET /posts/index request
81
286
  # list all posts...
82
287
  r.get "index" do
83
- @files = Dir[File.join(@hyde_parameters['path_to_jekyll_src'], "_#{@type_file}", '*')].sort
84
- view("listing")
288
+ @files = Dir[File.join(Dir.pwd, "_#{@type_file}", '*')].sort.reverse
289
+ view("posts/listing")
290
+ end
291
+
292
+ r.get "new" do
293
+ @file = ""
294
+ @headers = {}
295
+ @new_record = @file.empty?
296
+ view("posts/edit")
297
+ end
298
+
299
+ # POST /posts/delete?file=truc request
300
+ # save the truc post
301
+ r.post "delete" do
302
+ @file = r.params['file']
303
+ File.unlink(@file)
304
+ r.redirect "/#{@type_file}/index?dir_path=#{File.dirname(@file)}"
85
305
  end
86
306
 
87
307
  r.is do
@@ -91,53 +311,83 @@ class App < Roda
91
311
  @file = r.params['file']
92
312
 
93
313
  content_file = File.read(@file)
94
- @headers = content_file.scan(/---(.*?)---/m).flatten.first.split("\n")
95
- @headers = @headers.select{ |header| !header.empty? }.map{ |header| header.scan(/([a-zA-Z]*): (.*)/).flatten }
96
- pp @headers
97
- @headers = Hash[@headers]
98
-
99
- view("edit")
314
+ @headers = Mid.extract_header(content_file)
315
+ @content = File.read(@file).gsub(/---(.*?)---/m, "")
316
+
317
+ # for page
318
+ if @headers.empty?
319
+ r.redirect "/files/edit?dir_path=#{r.params['dir_path']}&file=#{@file}"
320
+ else
321
+ @new_record = @file.empty?
322
+ view("posts/edit")
323
+ end
100
324
  end
101
325
 
102
326
  # POST /posts?file=truc request
103
327
  # save the truc post
104
328
  r.post do
105
- @file = r.params['file']
106
- @content = r.params['content']
107
- @filename = r.params['filename']
108
- @tags = r.params['tags']
109
- @content = r.params['content']
110
- @date = r.params['date']
111
- @meta = r.params['meta']
112
- @format = r.params['format']
113
- @publish = r.params['publish']
114
- @layout = r.params['layout']
329
+ @file = r.params.delete('file') # in a route (new record : empty ELSE old filename)
330
+ @content = r.params.delete('content')
331
+ @filename = r.params.delete('filename')
332
+ @tags = r.params.delete('tags')
333
+ @date = r.params.delete('date')
334
+ @meta = r.params.delete('meta')
335
+ @format = r.params.delete('format')
336
+ @publish = r.params.delete('publish')
337
+ @layout = r.params.delete('layout')
338
+ @title = r.params.delete('title')
339
+ @new_file = r.params.delete('new_file') # form (new record : empty ELSE new filename)
340
+
341
+ #$stderr.puts "---->"
342
+
343
+ if @new_file.nil? || @new_file.empty?
344
+ filename = Mid.urlize(@date, @title, (@type_file != 'pages'))
345
+ @new_file = File.join(Dir.pwd,"_#{@type_file}", "#{filename}.#{@format}")
346
+ end
115
347
 
116
348
  @headers = ['---']
117
- @headers << ['tags', @tags.join(',')].join(': ')
349
+ @headers << ['tags', @tags.split(',').map(&:strip).join(',')].join(': ')
118
350
  @headers << ['layout', @layout].join(': ')
119
351
  @headers << ['date', @date.to_s].join(': ')
120
- #@headers << ['meta', @tags.join(',')].join(': ')
352
+ @headers << ['title', @title.to_s].join(': ')
353
+ r.params.each do |k,v|
354
+ if k.start_with?('header')
355
+ @headers << [v.first, v.last.to_s].join(': ')
356
+ else
357
+ @headers << [k, v.to_s].join(': ')
358
+ end
359
+ end
121
360
  @headers << ['---']
361
+ @headers << ['']
122
362
 
123
- File.open(File.join(@hyde_parameters['path_to_jekyll_src'], "#{@file}.#{@format}"), "w+") do |f|
363
+ File.open(@new_file, "w+") do |f|
124
364
  f.write(@headers.join("\n"))
125
- f.write("")
126
- f.write(content)
365
+ f.write(@content)
127
366
  end
128
- end
129
367
 
130
- # POST /posts/delete?file=truc request
131
- # save the truc post
132
- r.post "delete" do
133
- @file = r.params['file']
134
- File.unlink(File.join(@hyde_parameters['path_to_jekyll_src'],@file))
368
+ # Change path of file
369
+ if !@file.to_s.empty? && @new_file.to_s != @file.to_s
370
+ File.unlink(@file)
371
+ end
372
+
373
+ # publish : move draft to post
374
+ if @publish == 'publish' && @new_file.to_s.include?('_drafts')
375
+ FileUtils.mv(@new_file, @new_file.gsub('_drafts','_posts'))
376
+ end
377
+
378
+ r.redirect "/#{@type_file}/index?dir_path=#{File.dirname(@new_file)}"
135
379
  end
136
380
  end
137
381
  end
138
-
139
- # TODO faire un jekyll serve
382
+ end
140
383
  end
141
384
  end
142
385
 
386
+ # https://roda.jeremyevans.net/rdoc/classes/Roda/RodaPlugins/Middleware.html
387
+ class App < Roda
388
+ use Mid
389
+ use Rack::Static, :urls => [''], root: Dir.pwd # allow to match all files in Dir.pwd
390
+ end
391
+
143
392
  run App.freeze.app
393
+
data/bin/hyde_admin.yml CHANGED
@@ -1,8 +1,15 @@
1
1
  ---
2
- default_layout:
3
- deploy_dest_user: pi
4
- deploy_dest_address: guerin.rivsc.ovh
5
- deploy_dest_path: "/home/pi/testblog"
6
- path_to_jekyll_src: "/Users/scl/blog/rivscblog-zolan"
2
+ default_layout: default
3
+ deploy_dest_user: root
4
+ deploy_dest_address: example.com
5
+ deploy_dest_path: "/absolute/remote/path/mysite"
7
6
  rsync_fullpath: rsync
8
7
  site_index: index.html
8
+ hyde_admin_language: en
9
+ hyde_admin_auth: false
10
+ hyde_admin_user: admin
11
+ hyde_admin_password: admin
12
+ default_format: html
13
+ display_layout: true
14
+ display_format: true
15
+ images_path: assets/images/
@@ -0,0 +1,37 @@
1
+ /* modal pictures */
2
+ .image-selector-content{
3
+ display: grid;
4
+ grid-template-columns: 1fr 1fr 1fr;
5
+ }
6
+ .image-selector-content .image-element{
7
+ width: 150px;
8
+ height: 150px;
9
+ }
10
+ .image-selector-content .image-element img{
11
+ width: 100%;
12
+ height: 100%;
13
+ object-fit: contain;
14
+ overflow: hidden;
15
+ border:2px solid white;
16
+ }
17
+ .image-selector-content .image-element img:hover{
18
+ border:2px solid gray;
19
+ }
20
+
21
+ .image-element{
22
+ position: relative;
23
+ }
24
+
25
+ .image-element span{
26
+ position: absolute;
27
+ bottom:0px;
28
+ left:5px;
29
+ z-index: 10;
30
+ font-weight: bold;
31
+ margin-bottom: -20px;
32
+ }
33
+
34
+ .CodeMirror{
35
+ border: 1px solid #ced4da;
36
+ border-radius: 4px;
37
+ }
@@ -0,0 +1,24 @@
1
+ $(function(){
2
+ $(document).on('click','#btn-deploy,#btn-rebuild',function(elt){
3
+ let path = '';
4
+
5
+ if(elt.id === 'btn-deploy'){
6
+ path = '/deploy';
7
+ }else if(elt.id === 'btn-rebuild'){
8
+ path = '/rebuild';
9
+ }
10
+
11
+ $.post( path, {
12
+ beforeSend: function( xhr ) {
13
+ $('#waiting').show();
14
+ }
15
+ })
16
+ .done(function( data ) {
17
+ $('#waiting').hide();
18
+ return false;
19
+ });
20
+ });
21
+ $(document).on('click','.form-confirm',function(){
22
+ return window.confirm($(this).attr('data-confirm'));
23
+ });
24
+ });
data/bin/i18n/en.yml CHANGED
@@ -5,11 +5,17 @@ pages: pages
5
5
  post: post
6
6
  posts: posts
7
7
  save: save
8
+ new: new
8
9
  edit: edit
9
10
  delete: delete
10
- are_you_sure: are you sure
11
+ create: create
12
+ upload: upload
13
+ header: header
14
+ add_header: add header
15
+ are_you_sure: are you sure ?
11
16
  tag: tag
12
17
  tags: tags
18
+ help_tags: set tags separate by comma
13
19
  layout: layout
14
20
  configuration: configuration
15
21
  files: files
@@ -25,3 +31,73 @@ date: date
25
31
  content: content
26
32
  publish: publish
27
33
  path: path
34
+ help_path: You can move the file by changing the path. Change the path can affect SEO or causing 404 errors. For a new file, this is automatically filled at submit.
35
+ overview: overview
36
+ submit: submit
37
+ default_layout: default layout
38
+ help_default_layout: default layout for jekyll posts/pages
39
+ deploy_dest_user: deploy remote user
40
+ help_deploy_dest_user: Ssh user for rsync
41
+ deploy_dest_address: deploy remote domain
42
+ help_deploy_dest_address: remote domain for ssh deployment (example.com)
43
+ deploy_dest_path: deploy remote path
44
+ help_deploy_dest_path: remote path on disk for ssh deployment
45
+ rsync_fullpath: rsync path
46
+ help_rsync_fullpath: if rsync is not in PATH, othervise just let 'rsync'
47
+ site_index: index file name of site
48
+ help_site_index: link to open when we click on overview
49
+ hyde_admin_language: hyde admin language
50
+ help_hyde_admin_language: To change hyde admin language interface (fr = french, en = english)
51
+ set_date_today: set date at today
52
+ change_date_path: update date in path
53
+ change_title_path: update title in path
54
+ directory_input_placeholder: directory name to create
55
+ file_input_placeholder: file name to create
56
+ hyde_admin_auth: enable BasicAuth
57
+ help_hyde_admin_auth: enable BasicAuth (true/false)
58
+ hyde_admin_user: BasicAuth user
59
+ help_hyde_admin_user: BasicAuth user
60
+ hyde_admin_password: BasicAuth password
61
+ help_hyde_admin_password: BasicAuth password
62
+ default_format: default format
63
+ help_default_format: default format (html = html, md = markdown)
64
+ display_layout: display the layout input on edit form
65
+ help_display_layout: display the layout input on edit form (true/false)
66
+ display_format: display the format input on edit form
67
+ help_display_format: display the format input on edit form (true/false)
68
+ images_path: pictures path
69
+ help_images_path: relative local picture path
70
+ editor_undo: Undo
71
+ editor_redo: Redo
72
+ editor_file: Add picture
73
+ editor_list: List
74
+ editor_list_ol: Numbered List
75
+ editor_link: Add link
76
+ editor_quote: Quote
77
+ editor_title_h1: Title H1
78
+ editor_title_h2: Title H2
79
+ editor_title_h3: Title H3
80
+ editor_title_h4: Title H4
81
+ editor_title_h5: Title H5
82
+ editor_underline: Underline
83
+ editor_bold: Bold
84
+ editor_italic: Italic
85
+ editor_strikethrough: Strikethrough
86
+ default_alt_img: Alt text
87
+ default_title_img: Title text
88
+ parent_dir: parent directory
89
+ sort_by_date: sort_by_date
90
+ older: older first
91
+ newer: newer first
92
+ previous_images: previous images
93
+ next_images: next images
94
+ search: search
95
+ filename: filename
96
+ filename_placeholder: filename...
97
+ upload_image_form: upload image form
98
+ pictures_has_been_uploaded: pictures has been uploaded
99
+ quit: quit
100
+ header_name: header name
101
+ header_value: header value
102
+ images: images
103
+ load_images: load images