bhook 0.2.1 → 0.3.1
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/.rubocop.yml +1 -0
- data/Gemfile.lock +1 -1
- data/README.md +17 -4
- data/Rakefile +1 -1
- data/bin/bhook +16 -5
- data/lib/bhook/args_parser.rb +19 -4
- data/lib/bhook/directory.rb +9 -4
- data/lib/bhook/md_file.rb +1 -1
- data/lib/bhook/root_directory.rb +20 -0
- data/lib/bhook/{config.rb → source_config.rb} +2 -2
- data/lib/bhook/theme/page.erb +21 -4
- data/lib/bhook/version.rb +1 -1
- data/lib/bhook/workspace.rb +1 -7
- data/lib/bhook/workspaces.rb +29 -0
- data/lib/bhook.rb +3 -1
- data/sorbet/rbi/hidden-definitions/hidden.rbi +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e5a2ce989dc5f18be7fe40f71b3c2afbec926f43a8abd417a40b9b738af1075
|
4
|
+
data.tar.gz: 6f20fc641d2c96deaf22a6def9547b8da373ceeec507f96ef92542ae110397ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91851c0792324aa103da6c6c157b64924187afe33901566f004d808e12437821598502e0bb487bd449b3e154d030734a3c81641156f02b12200926c77855b5b5
|
7
|
+
data.tar.gz: 78c3ebb19723089cd939ed8de447343240fd9ae5c4389b89185fdb65c6a8a06cbe55759f88ee5d210ec49c6638e8b6a0aaab5429d7a3c9b78d861007a90f9a71
|
data/.rubocop.yml
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -9,11 +9,15 @@
|
|
9
9
|
|
10
10
|
Bhook is a static website generator that works off a git repo containing a markdown file based wiki, like for example, the [India Startup Wiki](https://gitlab.com/india-startups/wiki).
|
11
11
|
|
12
|
+
Since you control the source markdown, Bhook applies no restrictions on what you can put in there. Wanna embed a YouTube video in an `iframe`? Sure thing!
|
13
|
+
|
12
14
|
I use this to create [HTML versions of the wiki](https://sidu.in/wiki/startups) and of [my essays](https://sidu.in/essays/) that I can publish.
|
13
15
|
|
14
16
|
## Installation
|
15
17
|
|
16
|
-
|
18
|
+
`bhook` requires [`ruby`](https://www.ruby-lang.org/en/documentation/installation/). If you are on OSX or Linux, it is likely to already be installed.
|
19
|
+
|
20
|
+
To install `bhook` run:
|
17
21
|
|
18
22
|
$ gem install bhook
|
19
23
|
|
@@ -22,7 +26,7 @@ Install it yourself as:
|
|
22
26
|
Getting help:
|
23
27
|
|
24
28
|
$ bhook --help
|
25
|
-
Bhook version 0.
|
29
|
+
Bhook version 0.3.0
|
26
30
|
Usage: bhook --source /source/path --output /output/path
|
27
31
|
-s, --source=SOURCE Path to version controlled directory containing source md files
|
28
32
|
-o, --output=OUTPUT Path to directory where output files are to be generated
|
@@ -33,11 +37,20 @@ Getting help:
|
|
33
37
|
--benchmark Run a performance benchmark for the specified source
|
34
38
|
-h, --help Prints this help
|
35
39
|
|
36
|
-
|
40
|
+
### 1-to-1 mode
|
37
41
|
|
38
42
|
➜ essays git:(main) ✗ bhook -s . -o /tmp/out -t /tmp/out/theme -w -v
|
39
43
|
|
40
|
-
Here's an example `.bhook.yml` [config file](https://gitlab.com/india-startups/wiki/-/blob/master/.bhook.yml).
|
44
|
+
Here's an example `.bhook.yml` [config file](https://gitlab.com/india-startups/wiki/-/blob/master/.bhook.yml) for a source directory.
|
45
|
+
|
46
|
+
### n-to-1 mode
|
47
|
+
|
48
|
+
This requires the destination directory to have a `.bhook.yml` config file set up that describes all the sources.
|
49
|
+
|
50
|
+
➜ kaiwren.github.com git:(main) ✗ bhook -w -v
|
51
|
+
|
52
|
+
Here's an example `.bhook.yml` [config file](https://github.com/kaiwren/kaiwren.github.com/blob/master/.bhook.yml) for a destination directory
|
53
|
+
with multiple source directories.
|
41
54
|
|
42
55
|
## Development
|
43
56
|
|
data/Rakefile
CHANGED
data/bin/bhook
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'bundler/setup'
|
5
|
-
|
5
|
+
require_relative File.join('..', 'lib', 'bhook')
|
6
6
|
|
7
7
|
puts "Bhook version #{Bhook::VERSION}"
|
8
8
|
parser = Bhook::ArgsParser.new(ARGV)
|
@@ -15,24 +15,35 @@ if args.help
|
|
15
15
|
exit
|
16
16
|
end
|
17
17
|
|
18
|
+
Bhook::L.level = args.verbose ? Logger::DEBUG : Logger::INFO
|
19
|
+
|
18
20
|
if args.generate_theme
|
19
21
|
Bhook::L.level = Logger::DEBUG
|
20
22
|
Bhook::ThemeGenerator.new(args.generate_theme).generate!
|
21
23
|
exit
|
22
24
|
end
|
23
25
|
|
24
|
-
|
26
|
+
workspaces = Bhook::Workspaces.new
|
25
27
|
|
26
|
-
|
28
|
+
if args.mount
|
29
|
+
args.mount.each do |project, from_to|
|
30
|
+
from = File.expand_path(from_to['from'])
|
31
|
+
to = File.expand_path(from_to['to'])
|
32
|
+
Bhook::L.debug "Mounting: #{project} \n\tfrom #{from} \n\tto #{to}"
|
33
|
+
workspaces.mount(Bhook::Workspace.new(from, to, args.theme))
|
34
|
+
end
|
35
|
+
else
|
36
|
+
workspaces.mount(Bhook::Workspace.new(args.source, args.output, args.theme))
|
37
|
+
end
|
27
38
|
|
28
39
|
if args.benchmark
|
29
40
|
require 'benchmark'
|
30
41
|
n = 10
|
31
42
|
Benchmark.bmbm do |bench|
|
32
43
|
Bhook::L.level = Logger::WARN
|
33
|
-
bench.report("Generate HTML #{n} times") { n.times {
|
44
|
+
bench.report("Generate HTML #{n} times") { n.times { workspaces.each(&:process!) } }
|
34
45
|
end
|
35
46
|
exit
|
36
47
|
end
|
37
48
|
|
38
|
-
args.watch ?
|
49
|
+
args.watch ? workspaces.watch! : workspaces.process!
|
data/lib/bhook/args_parser.rb
CHANGED
@@ -5,25 +5,29 @@ module Bhook
|
|
5
5
|
class ArgsParser
|
6
6
|
extend T::Sig
|
7
7
|
|
8
|
-
Options = Struct.new(:source, :output, :watch, :verbose, :theme, :generate_theme, :benchmark, :help)
|
8
|
+
Options = Struct.new(:source, :output, :watch, :verbose, :theme, :generate_theme, :benchmark, :mount, :help)
|
9
9
|
|
10
10
|
def initialize(argv)
|
11
|
-
@args = Options.new(nil, nil, false, false, Bhook::THEME_DIR_PATH, nil, false, false)
|
11
|
+
@args = Options.new(nil, nil, false, false, Bhook::THEME_DIR_PATH, nil, false, nil, false)
|
12
12
|
@argv = argv.clone
|
13
13
|
@opt_parser = build_opt_parser
|
14
14
|
end
|
15
15
|
|
16
16
|
def parse
|
17
|
+
if (mount = detect_and_read_mount_args_from_config_in_pwd)
|
18
|
+
@args.mount = mount
|
19
|
+
end
|
20
|
+
|
17
21
|
begin
|
18
22
|
@opt_parser.parse(@argv)
|
19
|
-
if generate_theme_missing? && help_missing? &&
|
23
|
+
if generate_theme_missing? && help_missing? &&
|
24
|
+
source_or_output_paths_missing? && mount_config_missing?
|
20
25
|
raise OptionParser::MissingArgument, 'See --help.'
|
21
26
|
end
|
22
27
|
rescue OptionParser::ParseError => e
|
23
28
|
puts "\nError! #{e.message}\n"
|
24
29
|
return nil
|
25
30
|
end
|
26
|
-
|
27
31
|
@args
|
28
32
|
end
|
29
33
|
|
@@ -33,6 +37,17 @@ module Bhook
|
|
33
37
|
|
34
38
|
private
|
35
39
|
|
40
|
+
def detect_and_read_mount_args_from_config_in_pwd
|
41
|
+
bhook_config_path = File.join(Dir.pwd, SourceConfig::BHOOK_CONFIG_FILE)
|
42
|
+
return unless File.exist?(bhook_config_path)
|
43
|
+
|
44
|
+
YAML.safe_load(File.read(bhook_config_path))['mount']
|
45
|
+
end
|
46
|
+
|
47
|
+
def mount_config_missing?
|
48
|
+
!@args.mount
|
49
|
+
end
|
50
|
+
|
36
51
|
def help_missing?
|
37
52
|
!@args.help
|
38
53
|
end
|
data/lib/bhook/directory.rb
CHANGED
@@ -8,15 +8,15 @@ module Bhook
|
|
8
8
|
GIT_DIR = '.git'
|
9
9
|
MD_EXT = '.md'
|
10
10
|
|
11
|
-
sig { params(src_path: Pathname, out_path: Pathname).returns(Bhook::
|
11
|
+
sig { params(src_path: Pathname, out_path: Pathname).returns(Bhook::RootDirectory) }
|
12
12
|
def self.new_root_directory(src_path, out_path)
|
13
|
-
new(src_path, out_path
|
13
|
+
RootDirectory.new(src_path, out_path)
|
14
14
|
end
|
15
15
|
|
16
|
-
sig { params(src_path: Pathname, out_path: Pathname, git: Git::Base, config: Bhook::
|
16
|
+
sig { params(src_path: Pathname, out_path: Pathname, git: Git::Base, config: Bhook::SourceConfig).void }
|
17
17
|
def initialize(src_path, out_path, git, config)
|
18
18
|
@src_path = src_path
|
19
|
-
@out_path = T.let(
|
19
|
+
@out_path = T.let(build_out_path(src_path, out_path), Pathname)
|
20
20
|
@git = git
|
21
21
|
@config = config
|
22
22
|
@sub_dirs = T.let([], T::Array[Directory])
|
@@ -46,6 +46,11 @@ module Bhook
|
|
46
46
|
|
47
47
|
private
|
48
48
|
|
49
|
+
sig { params(src_path: Pathname, out_path: Pathname).returns(Pathname) }
|
50
|
+
def build_out_path(src_path, out_path)
|
51
|
+
out_path.join(src_path.basename)
|
52
|
+
end
|
53
|
+
|
49
54
|
sig { void }
|
50
55
|
def build_next_level_nodes
|
51
56
|
children = @src_path.children
|
data/lib/bhook/md_file.rb
CHANGED
@@ -17,7 +17,7 @@ module Bhook
|
|
17
17
|
sig { returns(String) }
|
18
18
|
attr_reader :md
|
19
19
|
|
20
|
-
sig { params(src_file_path: Pathname, out_path: Pathname, git: Git::Base, config: Bhook::
|
20
|
+
sig { params(src_file_path: Pathname, out_path: Pathname, git: Git::Base, config: Bhook::SourceConfig).void }
|
21
21
|
def initialize(src_file_path, out_path, git, config)
|
22
22
|
L.debug "Reading: #{src_file_path}"
|
23
23
|
@md = T.let(File.read(src_file_path), String)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Bhook
|
5
|
+
class RootDirectory < Directory
|
6
|
+
extend T::Sig
|
7
|
+
|
8
|
+
sig { params(src_path: Pathname, out_path: Pathname).void }
|
9
|
+
def initialize(src_path, out_path)
|
10
|
+
super(src_path, out_path, Git.open(src_path), Bhook::SourceConfig.new(src_path))
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
sig { params(_src_path: Pathname, out_path: Pathname).returns(Pathname) }
|
16
|
+
def build_out_path(_src_path, out_path)
|
17
|
+
out_path
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -8,7 +8,7 @@ module Bhook
|
|
8
8
|
# - link to place in the footer
|
9
9
|
# - exclude
|
10
10
|
# - list of .md file paths relative to config files
|
11
|
-
class
|
11
|
+
class SourceConfig
|
12
12
|
extend T::Sig
|
13
13
|
BHOOK_CONFIG_FILE = T.let('.bhook.yml', String)
|
14
14
|
WEBSITE_KEY = T.let('website', String)
|
@@ -40,7 +40,7 @@ module Bhook
|
|
40
40
|
|
41
41
|
sig { params(excluded_files: T::Array[String]).returns(T::Array[Pathname]) }
|
42
42
|
def parse_excluded_files(excluded_files)
|
43
|
-
excluded_files.map { |file_path| @root_dir_path.join(file_path) }
|
43
|
+
excluded_files.map { |file_path| @root_dir_path.join(file_path) if file_path }.compact
|
44
44
|
end
|
45
45
|
|
46
46
|
sig do
|
data/lib/bhook/theme/page.erb
CHANGED
@@ -51,8 +51,25 @@
|
|
51
51
|
margin-bottom: 1.5em;
|
52
52
|
}
|
53
53
|
|
54
|
+
div.youtube-video {
|
55
|
+
margin: 1em 0 1em 0;
|
56
|
+
width: 100%;
|
57
|
+
justify-content: center;
|
58
|
+
display: flex;
|
59
|
+
}
|
60
|
+
|
61
|
+
div.content {
|
62
|
+
}
|
63
|
+
|
54
64
|
div.footer {
|
55
|
-
margin: 0.5em 0
|
65
|
+
margin: 0.5em 0 0.5em 0;
|
66
|
+
}
|
67
|
+
|
68
|
+
div.bhook-cta a {
|
69
|
+
font-size: x-small;
|
70
|
+
text-decoration: none;
|
71
|
+
margin-bottom: 1.5em;
|
72
|
+
color: #bbbbbb;
|
56
73
|
}
|
57
74
|
|
58
75
|
table {
|
@@ -86,9 +103,6 @@
|
|
86
103
|
<title><%= src_title -%></title>
|
87
104
|
</head>
|
88
105
|
<body>
|
89
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
90
|
-
<path fill="#333" fill-rule="evenodd" d="M9.683 6.676l-.047-.048C8.27 5.26 6.07 5.243 4.726 6.588l-2.29 2.29c-1.344 1.344-1.328 3.544.04 4.91 1.366 1.368 3.564 1.385 4.908.04l1.753-1.752c-.695.074-1.457-.078-2.176-.444L5.934 12.66c-.634.634-1.67.625-2.312-.017-.642-.643-.65-1.677-.017-2.312L6.035 7.9c.634-.634 1.67-.625 2.312.017.024.024.048.05.07.075l.003-.002c.36.36.943.366 1.3.01.355-.356.35-.938-.01-1.3l-.027-.024zM6.58 9.586l.048.05c1.367 1.366 3.565 1.384 4.91.04l2.29-2.292c1.344-1.343 1.328-3.542-.04-4.91-1.366-1.366-3.564-1.384-4.908-.04L7.127 4.187c.695-.074 1.457.078 2.176.444l1.028-1.027c.635-.634 1.67-.624 2.313.017.643.644.652 1.678.018 2.312l-2.43 2.432c-.635.634-1.67.624-2.313-.018-.024-.024-.048-.05-.07-.075l-.003.004c-.36-.362-.943-.367-1.3-.01-.355.355-.35.937.01 1.3.01.007.018.015.027.023z"/>
|
91
|
-
</svg>
|
92
106
|
<div class="body container">
|
93
107
|
<div class="content row justify-content-center">
|
94
108
|
<div class="col-10">
|
@@ -106,6 +120,9 @@
|
|
106
120
|
<%= src_file_date -%> © <a href="https://sidu.in">Sidu Ponnappa</a>
|
107
121
|
</div>
|
108
122
|
</div>
|
123
|
+
<div class="bhook-cta d-flex justify-content-center">
|
124
|
+
<a href="https://gitlab.com/kaiwren/bhook" target="_blank">powered by bhook</a>
|
125
|
+
</div>
|
109
126
|
</div>
|
110
127
|
</body>
|
111
128
|
</html>
|
data/lib/bhook/version.rb
CHANGED
data/lib/bhook/workspace.rb
CHANGED
@@ -28,19 +28,13 @@ module Bhook
|
|
28
28
|
process!
|
29
29
|
end
|
30
30
|
listener.start
|
31
|
-
sleep
|
32
|
-
end
|
33
|
-
|
34
|
-
sig { returns(T::Array[MdFile]) }
|
35
|
-
def all_md_files
|
36
|
-
root_dir.all_md_files
|
37
31
|
end
|
38
32
|
|
39
33
|
private
|
40
34
|
|
41
35
|
sig { returns(Bhook::Directory) }
|
42
36
|
def root_dir
|
43
|
-
|
37
|
+
RootDirectory.new(@src_path, @out_path)
|
44
38
|
end
|
45
39
|
end
|
46
40
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Bhook
|
5
|
+
class Workspaces
|
6
|
+
extend T::Sig
|
7
|
+
|
8
|
+
sig { void }
|
9
|
+
def initialize
|
10
|
+
@workspaces = T.let([], T::Array[Bhook::Workspace])
|
11
|
+
end
|
12
|
+
|
13
|
+
sig { params(workspace: Workspace).void }
|
14
|
+
def mount(workspace)
|
15
|
+
@workspaces << workspace
|
16
|
+
end
|
17
|
+
|
18
|
+
sig { void }
|
19
|
+
def process!
|
20
|
+
@workspaces.each(&:process!)
|
21
|
+
end
|
22
|
+
|
23
|
+
sig { void }
|
24
|
+
def watch!
|
25
|
+
@workspaces.each(&:watch!)
|
26
|
+
Kernel.sleep
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/bhook.rb
CHANGED
@@ -27,10 +27,12 @@ end
|
|
27
27
|
require_relative 'bhook/version'
|
28
28
|
require_relative 'bhook/logger'
|
29
29
|
require_relative 'bhook/args_parser'
|
30
|
-
require_relative 'bhook/
|
30
|
+
require_relative 'bhook/source_config'
|
31
31
|
require_relative 'bhook/theme_generator'
|
32
32
|
require_relative 'bhook/theme'
|
33
33
|
require_relative 'bhook/converter/html'
|
34
34
|
require_relative 'bhook/directory'
|
35
|
+
require_relative 'bhook/root_directory'
|
35
36
|
require_relative 'bhook/md_file'
|
36
37
|
require_relative 'bhook/workspace'
|
38
|
+
require_relative 'bhook/workspaces'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bhook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sidu Ponnappa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: git
|
@@ -197,17 +197,19 @@ files:
|
|
197
197
|
- bin/bhook
|
198
198
|
- lib/bhook.rb
|
199
199
|
- lib/bhook/args_parser.rb
|
200
|
-
- lib/bhook/config.rb
|
201
200
|
- lib/bhook/converter/html.rb
|
202
201
|
- lib/bhook/directory.rb
|
203
202
|
- lib/bhook/logger.rb
|
204
203
|
- lib/bhook/md_file.rb
|
204
|
+
- lib/bhook/root_directory.rb
|
205
|
+
- lib/bhook/source_config.rb
|
205
206
|
- lib/bhook/theme.rb
|
206
207
|
- lib/bhook/theme/_after_h1.erb
|
207
208
|
- lib/bhook/theme/page.erb
|
208
209
|
- lib/bhook/theme_generator.rb
|
209
210
|
- lib/bhook/version.rb
|
210
211
|
- lib/bhook/workspace.rb
|
212
|
+
- lib/bhook/workspaces.rb
|
211
213
|
- sorbet/config
|
212
214
|
- sorbet/rbi/gems/ast.rbi
|
213
215
|
- sorbet/rbi/gems/bhook.rbi
|