pbsimply 3.0.2 → 3.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d2c58cce236dac5c8dc0d62c29d34dd3896b904a39a0fd2f4d6923e34e8a8bc
4
- data.tar.gz: 555eb53df299fa68a5ec20a739660c071639a94a50072a52b8ac07031ba04be3
3
+ metadata.gz: e5daf76d579a8b8d21f8b893977d3790b6e6691556767bdabcdde407dffc59a6
4
+ data.tar.gz: 0c13965208a4a164af7bc42b15dc21a0384e7f237c68ce838b5acdbd7153d2d9
5
5
  SHA512:
6
- metadata.gz: 8330d449dea9be67096f09a024bbdcdb9ece542b308bef14992bee4f58702fb538ffe025b4d6a1828c70f15033c8503be65caeaf12ed34057223f7ac198edbc1
7
- data.tar.gz: f552fe4085b49ed57ff51fd51ec146c7b1b4bcd549c6e27b3e0d0586bb528eaebcc70fd778d4c85415f39f02080c4799b3a8f63d14eac2880b38ef371bce2f14
6
+ metadata.gz: 64fe31554280fb22e7102888d921cf726902b17b35c72cf1aa864bf808ff52be0c28bc2148d1a3d86829cfb889d93f121c38b8cd01e88befb2ae96f69717e45a
7
+ data.tar.gz: 6a3837dd70a72e487d71e5f882ce87ff1644e9025d978301ca99165bb0d9cbbbec070076642ae40ff99867dafd0686f2edd7c9d262cfffc3cd4cc27188668c45
data/bin/pbsimply-init ADDED
@@ -0,0 +1,371 @@
1
+ #!/bin/env ruby
2
+ require 'fileutils'
3
+
4
+ module PBSimplyInit
5
+ end
6
+
7
+ PBSimplyInit::YAML = <<EOF
8
+ ---
9
+ # Built documents output path.
10
+ # ../Build means Build directory on Source document root's parent directory.
11
+ outdir: ../Build
12
+ #outdir: /home/foo/public_html/
13
+ #
14
+ # Template file path.
15
+ # ./template.html by default.
16
+ template: template.erb
17
+ #
18
+ # Loading CSS files (userd by Pandoc's default template.)
19
+ # This values must be *server's URL*.
20
+ # This settings is not avilable on rdoc, rdoc_markdown, kramdown, redcarpet or cmark engine.
21
+ #css:
22
+ # - /css/layout.css
23
+ # - /css/base.css#
24
+ # Enable TOC. true or false. false by default.
25
+ # This settings is not avilable on rdoc, rdoc_markdown, kramdown, redcarpet, cmark or docutils engine.
26
+ # toc: true
27
+ #
28
+ # Enable eRuby template expansion. true or false. false by default.
29
+ # This settings is not avilable on rdoc, rdoc_markdown, kramdown, redcarpet or cmark engine.
30
+ post_eruby: false
31
+ # Default metadata. If same key exists in document's frontmatter, document's frontmatter is given priority to this settings.
32
+ default_meta:
33
+ author: "John Doe"
34
+ site_title: "My first blog"
35
+ #
36
+ # Override every ACCS index page's frontmatter.
37
+ alt_frontmatter:
38
+ title: Serial documents by ACCS
39
+ #
40
+ # Testserver (pbsimply-testserver.rb)'s port. 8000 by default.
41
+ #testserver_port: 8000
42
+ #
43
+ # Generated document's URL absolute prefix. This value replaces reading /.
44
+ #self_url_prefix: /foowebsite/
45
+ #
46
+ # Generated document's URL absolute prefix. This value replaces reading /. Used by page_url_encoded_external.
47
+ self_url_external_prefix: https://example.com/
48
+ # Database format. use JSON if set json or oj.
49
+ #dbstyle: json
50
+ #
51
+ # Blessing way. If cmd given, you external command instead of Ruby function.
52
+ #bless_style: cmd
53
+ #
54
+ # Blessing external command
55
+ #bless_cmd: [echo, BLESS]
56
+ #
57
+ # Blessing external command on ACCS.
58
+ #bless_accscmd: [echo, ACCS]
59
+ #
60
+ # Method control for find ACCS next/prev.
61
+ # numbering, date, timestamp, lexical
62
+ #blessmethod_accs_rel: date
63
+ #
64
+ # Delete output file automatically when lose source document.
65
+ #auto_delete: yes
66
+ #
67
+ #################################################
68
+ # Pandoc engine option
69
+ #################################################
70
+ #pbsimply_processor: pandoc
71
+ #
72
+ # Pandoc's default file settings.
73
+ # It is merge into default file. See https://pandoc.org/MANUAL.html#default-files
74
+ # This option used only by pandoc engine.
75
+ #pandoc_additional_options:
76
+ # metadata:
77
+ # lang: ja
78
+ # title-prefix: "Powered by PureBuilder Simply"
79
+ # include-before-body:
80
+ # - before.html
81
+ # include-after-body:
82
+ # - after.html
83
+ #
84
+ #################################################
85
+ # Kramdown engine option
86
+ #################################################
87
+ pbsimply_processor: kramdown
88
+ # An associative array passed as the second argument to `Kramdown::Document.new`. See the https://kramdown.gettalong.org/rdoc/Kramdown/Options.html for detail.
89
+ #kramdown_features: {}
90
+ #
91
+ #################################################
92
+ # RedCarpet engine option
93
+ #################################################
94
+ #pbsimply_processor: redcarpet
95
+ # An associative array showing the extensions to Redcarpet. See the https://github.com/vmg/redcarpet for details.
96
+ #redcarpet_extensions: {}
97
+ #
98
+ #################################################
99
+ # Docutils engine option
100
+ #################################################
101
+ #pbsimply_processor: docutils
102
+ # rst2html5 command line options.
103
+ #docutils_options: []
104
+ EOF
105
+
106
+ PBSimplyInit::TEMPLATE = <<EOF
107
+ <!DOCTYPE html>
108
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
109
+ <head>
110
+ <meta charset="utf-8" />
111
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
112
+ <meta name="date" content="<%= frontmatter["date"] %>" />
113
+ <link rel="stylesheet" href="/css/style.css" />
114
+ <title><%= frontmatter["title"] %></title>
115
+ </head>
116
+ <body>
117
+ <div id="Overall">
118
+ <div id="BannerHeader">
119
+ <h1><%= frontmatter["site_title"] %></h1>
120
+ <h2><%= frontmatter["title"] %></h2>
121
+ </div>
122
+ <div id="ContentContainer">
123
+ <nav id="NavigationColumn">
124
+ <ul>
125
+ <%
126
+ require 'yaml'
127
+ menu = YAML.load File.read("menu.yaml")
128
+ %><% menu.each {|k, v| %><%= sprintf('<li><a href="%s">%s</a></li>', v, k) %><% } %>
129
+ </ul>
130
+ </nav>
131
+ <article id="MainArticle"><%= article_body %></aritcle>
132
+ </div>
133
+ <footer id="PBSimply">
134
+ Powered by <a href="https://purebuilder.app/">PureBuilder Simply</a>
135
+ </footer>
136
+ </div>
137
+ </body>
138
+ </html>
139
+ EOF
140
+
141
+ PBSimplyInit::CSS = <<EOF
142
+ body, html {
143
+ margin: 0;
144
+ padding: 0;
145
+ }
146
+ #Overall {
147
+ max-width: 800px;
148
+ margin: 0 auto;
149
+ }
150
+ #BannerHeader {
151
+ height: 200px;
152
+ width: 100%;
153
+ }
154
+ #ContentContainer {
155
+ display: flex;
156
+ width: 100%;
157
+ }
158
+ #BannerHeader {
159
+ background-color: #8eafe3;
160
+ border-radius: 2px;
161
+ color: #000;
162
+ }
163
+ #BannerHeader h1 {
164
+ font-size: 2.1rem;
165
+ text-align: center;
166
+ position: relative;
167
+ top: calc(50% - 1em);
168
+ }
169
+ #BannerHeader h2 {
170
+ font-size: 1.2rem;
171
+ text-align: center;
172
+ position: relative;
173
+ top: 1.25em;
174
+ }
175
+
176
+ #NavigationColumn ul {
177
+ list-style-type: none;
178
+ list-style-position: outside;
179
+ margin: 3px;
180
+ padding: 0;
181
+ text-align: center;
182
+ }
183
+ #NavigationColumn li {
184
+ background-color: #b9bced;
185
+ border: 2px solid #6367a1;
186
+ color: #000;
187
+ border-radius: 4px;
188
+ margin: 3px 1px;
189
+ padding: 2px;
190
+ }
191
+ #NavigationColumn a {
192
+ color: rgb(57, 18, 183);
193
+ text-decoration: none;
194
+ }
195
+ #MainArticle {
196
+ color: #666;
197
+ padding: 8px;
198
+ }
199
+ #MainArticle h1, #MainArticle h2, #MainArticle h3, #MainArticle h4, #MainArticle h5, #MainArticle h6 {
200
+ color: #333;
201
+ }
202
+ #PBSimply {
203
+ padding: 8px;
204
+ text-align: right;
205
+ border-top: 2px solid #6b84df;
206
+ }
207
+ @media screen and (min-width: 800px) {
208
+ #ContentContainer { flex-direction: row; }
209
+ #NavigationColumn {
210
+ order: 1;
211
+ width: 250px;
212
+ }
213
+ #MainArticle {
214
+ order: 2;
215
+ width: 550px;
216
+ }
217
+ }
218
+ @media screen and (max-width: 799px) {
219
+ #ContentContainer { flex-direction: column; }
220
+ #NavigationColumn {
221
+ order: 2;
222
+ width: 100%;
223
+ }
224
+ #MainArticle {
225
+ order: 1;
226
+ width: 100%;
227
+ }
228
+ }
229
+
230
+ a {
231
+ color: #4e1efd;
232
+ }
233
+ EOF
234
+
235
+ PBSimplyInit::INDEXMD = <<EOF
236
+ ---
237
+ title: First article
238
+ date: 1970-01-01
239
+ ---
240
+
241
+ # This is first article
242
+
243
+ This file is shown at top page.
244
+
245
+ The first step, edit index.md file on document source root.
246
+ EOF
247
+
248
+ PBSimplyInit::MENUYAML = <<EOF
249
+ ---
250
+ Top page: /
251
+ Article list: /articles
252
+ EOF
253
+
254
+ PBSimplyInit::ACCSYAML = <<EOF
255
+ ---
256
+ title: 1st series
257
+ EOF
258
+
259
+ PBSimplyInit::ACCSINDEX = <<EOF
260
+ ---
261
+ title: <%= @index["title"] %>
262
+ date: <%= @index["date"] %>
263
+ accsindex: yes
264
+ ---
265
+
266
+ <%
267
+ articles = Hash.new {|h,k| h[k] = Array.new }
268
+
269
+ @indexes.each do |filename, index|
270
+ articles[(index["category"] || "default")].push index
271
+ end
272
+
273
+ %>
274
+
275
+ % artkeys = articles.keys.sort
276
+ % artkeys.each do |catname|
277
+ % cat = articles[catname]
278
+
279
+ % if articles.length > 1
280
+ # <%= catname %>
281
+ % end
282
+
283
+ <%
284
+ list = if @config["accs_order"] == "desc" || @index["accs_order"] == "desc" || @index["blogmode"]
285
+ cat.sort_by {|i| [i["date"].to_s, i["title"].to_s, i["_last_update"].to_i] }.reverse
286
+ else
287
+ cat.sort_by {|i| [i["date"].to_s, i["title"].to_s, i["_last_update"].to_i] }
288
+ end
289
+
290
+ list.each do |i|
291
+ %>* [<%= i["title"].gsub('@', '\@') %>](<%= File.basename(i["_filename"].to_s, ".*") + ".html" %>) (<%= i["date"] %>)
292
+ <% end %>
293
+
294
+ % end
295
+ EOF
296
+
297
+ PBSimplyInit::ACCSARTICLE = <<EOF
298
+ ---
299
+ title: Untitled series 1
300
+ date: 2023-10-28
301
+ category: PureBuilder Simply
302
+ ---
303
+
304
+ # Untitled article
305
+
306
+ This is a series article sample.
307
+
308
+ `/articles` folder is set up as ACCS directory.
309
+ ACCS recognize articles as series, and generate index page automatically.
310
+
311
+ # How to add new article?
312
+
313
+ Add source document on `/articles`, and do `pbsimply articles`.
314
+
315
+ `pbsimply` will detect modified or new article and build it.
316
+
317
+ # How to remove this article?
318
+
319
+ Remove `/articles/20231028-untitled.md` and `../Build/articles/20231028-untitled.html`, and do `pbsimply articles`.
320
+ EOF
321
+
322
+ filepath = ARGV.shift
323
+ filepath ||= "."
324
+
325
+ if File.exist? filepath and (!File.directory? filepath)
326
+ abort "File #{filepath} is not directory."
327
+ end
328
+
329
+ if File.exist? filepath and Dir.children(filepath).length > 0
330
+ abort "File #{filepath} is not empty."
331
+ end
332
+
333
+ FileUtils.mkdir_p(File.join(filepath, "Source"))
334
+ FileUtils.mkdir_p(File.join(filepath, "Build"))
335
+
336
+ File.open(File.join(filepath, "Source", ".pbsimply.yaml"), "w") do |f|
337
+ f.puts PBSimplyInit::YAML
338
+ end
339
+
340
+ File.open(File.join(filepath, "Source", ".accsindex.erb"), "w") do |f|
341
+ f.puts PBSimplyInit::ACCSINDEX
342
+ end
343
+
344
+ File.open(File.join(filepath, "Source", "template.erb"), "w") do |f|
345
+ f.puts PBSimplyInit::TEMPLATE
346
+ end
347
+
348
+ File.open(File.join(filepath, "Source", "index.md"), "w") do |f|
349
+ f.puts PBSimplyInit::INDEXMD
350
+ end
351
+
352
+ File.open(File.join(filepath, "Source", "menu.yaml"), "w") do |f|
353
+ f.puts PBSimplyInit::MENUYAML
354
+ end
355
+
356
+ FileUtils.mkdir_p(File.join(filepath, "Source", "css"))
357
+ File.open(File.join(filepath, "Source", "css", "style.css"), "w") do |f|
358
+ f.puts PBSimplyInit::CSS
359
+ end
360
+
361
+ FileUtils.cp_r(File.join(filepath, "Source", "css"), File.join(filepath, "Build", "css"))
362
+
363
+ FileUtils.mkdir_p(File.join(filepath, "Source", "articles"))
364
+ File.open(File.join(filepath, "Source", "articles", ".accs.yaml"), "w") do |f|
365
+ f.puts PBSimplyInit::ACCSYAML
366
+ end
367
+
368
+ FileUtils.mkdir_p(File.join(filepath, "Source", "articles"))
369
+ File.open(File.join(filepath, "Source", "articles", "20231028-untitled.md"), "w") do |f|
370
+ f.puts PBSimplyInit::ACCSARTICLE
371
+ end
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby
1
+ #!/bin/env ruby
2
2
  # -*- mode: ruby; coding: UTF-8 -*-
3
3
 
4
4
  require 'webrick'
@@ -16,7 +16,17 @@ class PBSimply::Hooks
16
16
  @hooks << proc
17
17
  end
18
18
 
19
- alias :add :<<
19
+ def add(&proc)
20
+ @hooks << proc
21
+ end
22
+
23
+ # Invoke command updating files
24
+ def cmd(*cmdarg)
25
+ proc = ->(arg) do
26
+ system(*cmdarg)
27
+ end
28
+ self << proc
29
+ end
20
30
 
21
31
  def run(arg)
22
32
  STDERR.puts "Hooks processing (#{@name})"
@@ -32,14 +42,32 @@ class PBSimply::Hooks
32
42
  end
33
43
  end
34
44
 
45
+ # Timing Object for pre, process
46
+ class HooksHolderPre < HooksHolder
47
+ # Invoke command as filter.
48
+ def filter(*cmdarg)
49
+ proc = ->(arg) do
50
+ IO.popen(cmdarg, "w+") do |io|
51
+ io.print File.read ENV["pbsimply_currentdoc"]
52
+ io.close_write
53
+ File.open(ENV["pbsimply_currentdoc"], "w") do |f|
54
+ f.write io.read
55
+ end
56
+ end
57
+ end
58
+ self << proc
59
+ end
60
+ end
61
+
35
62
  def initialize(pbsimply)
36
63
  @pbsimply = pbsimply
64
+ @hooks_loaded = false
37
65
 
38
66
  # Called first phase before generate. This hooks called before blessing.
39
67
  #
40
68
  # Argument: frontmatter, procdoc.
41
69
  # procdoc is processing source document path.
42
- @pre = HooksHolder.new "pre"
70
+ @pre = HooksHolderPre.new "pre"
43
71
 
44
72
  # Called after document was generated.
45
73
  #
@@ -73,7 +101,8 @@ class PBSimply::Hooks
73
101
  def load
74
102
  if File.file?("./.pbsimply-hooks.rb")
75
103
  require './.pbsimply-hooks.rb'
76
- PBSimply::Hooks.load_hooks(self)
104
+ PBSimply::Hooks.load_hooks(self) unless @hooks_loaded
105
+ @hooks_loaded = true
77
106
  end
78
107
  end
79
108
 
data/lib/pbsimply.rb CHANGED
@@ -201,6 +201,8 @@ class PBSimply
201
201
  # Push to target documents without checking modification.
202
202
  target_docs.push([filename, frontmatter, pos])
203
203
  end
204
+ ENV.delete("pbsimply_currentdoc")
205
+ ENV.delete("pbsimply_filename")
204
206
 
205
207
  delete_turn_draft draft_articles
206
208
 
@@ -236,6 +238,8 @@ class PBSimply
236
238
  # Proccess documents
237
239
  target_docs.each do |filename, frontmatter, pos|
238
240
  ext = File.extname filename
241
+ ENV["pbsimply_currentdoc"] = File.join(@workdir, "current_document#{ext}")
242
+ ENV["pbsimply_filename"] = filename
239
243
  @index = frontmatter
240
244
  File.open(File.join(@dir, filename)) do |f|
241
245
  f.seek(pos)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pbsimply
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.2
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaki Haruka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-15 00:00:00.000000000 Z
11
+ date: 2023-10-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Pre compile, static serving website builder.
14
14
  email:
@@ -16,10 +16,12 @@ email:
16
16
  executables:
17
17
  - pbsimply
18
18
  - pbsimply-testserver
19
+ - pbsimply-init
19
20
  extensions: []
20
21
  extra_rdoc_files: []
21
22
  files:
22
23
  - bin/pbsimply
24
+ - bin/pbsimply-init
23
25
  - bin/pbsimply-testserver
24
26
  - lib/pbsimply.rb
25
27
  - lib/pbsimply/accs.rb