geb 0.1.11 → 0.1.12
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/CHANGELOG.md +14 -0
- data/README.md +56 -12
- data/lib/geb/commands/server.rb +3 -2
- data/lib/geb/config.rb +88 -0
- data/lib/geb/defaults.rb +2 -2
- data/lib/geb/page.rb +35 -3
- data/lib/geb/samples/basic/assets/css/site.css +41 -2
- data/lib/geb/samples/basic/geb.config.yml +19 -3
- data/lib/geb/samples/basic/index.html +24 -1
- data/lib/geb/samples/basic/shared/partials/_footer.html +4 -0
- data/lib/geb/samples/basic/shared/partials/_geb.html +26 -0
- data/lib/geb/samples/basic/shared/partials/_header.html +9 -0
- data/lib/geb/samples/bootstrap_jquery/assets/css/site.css +68 -1
- data/lib/geb/samples/bootstrap_jquery/blog/blog_post_1.html +83 -25
- data/lib/geb/samples/bootstrap_jquery/blog/index.html +39 -6
- data/lib/geb/samples/bootstrap_jquery/geb.config.yml +20 -3
- data/lib/geb/samples/bootstrap_jquery/index.html +252 -2
- data/lib/geb/samples/bootstrap_jquery/page.html +24 -2
- data/lib/geb/samples/bootstrap_jquery/shared/partials/_footer.html +2 -0
- data/lib/geb/samples/bootstrap_jquery/shared/partials/_geb.html +26 -0
- data/lib/geb/samples/bootstrap_jquery/shared/partials/_header.html +25 -0
- data/lib/geb/samples/bootstrap_jquery/shared/partials/_meta_tags.html +1 -1
- data/lib/geb/samples/bootstrap_jquery/shared/templates/_blog_post.html +19 -0
- data/lib/geb/samples/bootstrap_jquery/site.webmanifest +1 -1
- data/lib/geb/samples/geb.config.yml +17 -0
- data/lib/geb/server.rb +12 -6
- data/lib/geb/site/build.rb +73 -61
- data/lib/geb/site/release.rb +23 -28
- data/lib/geb/site/remote.rb +1 -1
- data/lib/geb/site/template.rb +6 -0
- data/lib/geb/site.rb +7 -0
- data/lib/geb/template.rb +1 -0
- data/lib/geb/utilities.rb +1 -1
- data/lib/geb.rb +1 -1
- data/test/api tests/test_cli.rb +1 -1
- data/test/api tests/test_config.rb +132 -0
- data/test/api tests/test_page.rb +88 -4
- data/test/api tests/test_server.rb +96 -32
- data/test/api tests/test_site.rb +131 -31
- data/test/command tests/test_geb_build.rb +2 -2
- data/test/command tests/test_geb_release.rb +6 -8
- data/test/command tests/test_geb_server.rb +21 -0
- metadata +4 -4
- data/lib/geb/samples/bootstrap_jquery/blog/blog_post_2.html +0 -35
- data/lib/geb/samples/bootstrap_jquery/blog/blog_post_3.html +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 320443bc78778585ce6a490ec4559028ecf7db472d0ba883bd6ef96c519cf557
|
4
|
+
data.tar.gz: 2c8183e8ec958f84f51209d79362ef521cb82ea4a0fef74a2f4787fe3fdd6277
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cfe67c3d92152487de447791b4105992426d59ab476541e898576ab587130554480e26e85f379aea7de7caf93e370107ff680beb60f2be8f720bab69f5d3f5b7
|
7
|
+
data.tar.gz: ae8ae4c02727e063313516162a880f4e25825bfffc66f74d7412ac896cf4ce0c7d165171141638b66d9bfba7b7f64521316ee95ef328db6cd42dd26f5b861ab8
|
data/CHANGELOG.md
CHANGED
@@ -24,6 +24,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
24
24
|
### Security
|
25
25
|
- N/A
|
26
26
|
|
27
|
+
## [0.1.12] - 2024-07-06
|
28
|
+
### Added
|
29
|
+
- New Site Variables feature
|
30
|
+
- --debug option to the `geb server` command to show full build output when file changes are detected
|
31
|
+
- Updated bootstrap_jquery bundled template
|
32
|
+
- Updated basic bundled template
|
33
|
+
### Changed
|
34
|
+
- Simplified build and release command APIs
|
35
|
+
### Fixed
|
36
|
+
- Configured port not being used by the `geb server` command
|
37
|
+
- Fixed issue with template paths not working with certain wild card paths (.e.g. **/*.html)
|
38
|
+
### Security
|
39
|
+
- Fixed issues with generating a site template with `geb release --with_template`, it now packages a sanitized version of `geb.config.yml` without remote_url and remote_path
|
40
|
+
|
27
41
|
## [0.1.11] - 2024-07-04
|
28
42
|
### Added
|
29
43
|
- Initial release of Geb with core features for managing and building static websites.
|
data/README.md
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
# Geb
|
2
|
+

|
3
|
+
[](CHANGELOG.md)
|
4
|
+
[](LICENSE)
|
5
|
+
[](CODE_OF_CONDUCT.md)
|
2
6
|
|
3
7
|
Geb is a powerful and intuitive static website manager and builder named after the ancient Egyptian god Geb, the deity of the Earth. Just as Geb provides a stable foundation for the world, our software offers a robust and essential foundation for building and managing static websites, which form the very bedrock of the web.
|
4
8
|
|
@@ -24,6 +28,7 @@ With Geb, you can harness the power of site templates to streamline your workflo
|
|
24
28
|
- [Partial Example](#partial-example)
|
25
29
|
- [Result Page](#result-page)
|
26
30
|
- [Discussion and key takeaways](#discussion-and-key-takeaways)
|
31
|
+
- [Site Variables](#site-variables)
|
27
32
|
- [Command Reference](#command-reference)
|
28
33
|
- [Roadmap](#roadmap)
|
29
34
|
- [Development](#development)
|
@@ -197,8 +202,9 @@ that makes sense for your site.
|
|
197
202
|
|
198
203
|
## Pages, Templates and Partials
|
199
204
|
|
200
|
-
|
201
|
-
|
205
|
+
Below are some examples of how to use pages, templates and partials with Geb.
|
206
|
+
Read the examples first, then the discussion located after the examples.
|
207
|
+
|
202
208
|
### Page Example
|
203
209
|
Here is a simple page example, in the above site structure this might be `index.html` file
|
204
210
|
```erb
|
@@ -210,7 +216,7 @@ Here is a simple page example, in the above site structure this might be `index.
|
|
210
216
|
|
211
217
|
<% start: content %>
|
212
218
|
This is page content
|
213
|
-
|
219
|
+
<%= partial: shared/partials/_featured_product.html %>
|
214
220
|
<% end: content %>
|
215
221
|
```
|
216
222
|
### Template Example
|
@@ -219,15 +225,15 @@ Here is a simple page example, in the above site structure this might be `index.
|
|
219
225
|
<!DOCTYPE html>
|
220
226
|
<html>
|
221
227
|
<head>
|
222
|
-
<title
|
223
|
-
|
224
|
-
|
225
|
-
|
228
|
+
<title><%= insert: title %></title>
|
229
|
+
<%= partial: shared/partials/_analytics.html %>
|
230
|
+
<%= partial: shared/partials/_meta_tags.html %>
|
231
|
+
<%= partial: shared/partials/_global_assets.html %>
|
226
232
|
</head>
|
227
233
|
<body>
|
228
|
-
|
229
|
-
|
230
|
-
|
234
|
+
<%= partial: shared/partials/_header.html %>
|
235
|
+
<%= insert: content %>
|
236
|
+
<%= partial: shared/partials/_footer.html %>
|
231
237
|
</body>
|
232
238
|
</html>
|
233
239
|
```
|
@@ -236,7 +242,7 @@ Here is a simple page example, in the above site structure this might be `index.
|
|
236
242
|
```erb
|
237
243
|
<h1>Best Product Ever<h1>
|
238
244
|
<p>This is the best product ever</p>
|
239
|
-
|
245
|
+
<%= partial: shared/partials/_product_analytics.html %>
|
240
246
|
```
|
241
247
|
### Result Page
|
242
248
|
Below is the Page Example above, processed by `geb build` command.
|
@@ -262,7 +268,7 @@ Below is the Page Example above, processed by `geb build` command.
|
|
262
268
|
### Discussion and key takeaways
|
263
269
|
|
264
270
|
- Pages are the actual content of the site. They are the only files that are served directly.
|
265
|
-
- The example page above uses a template found in /shared/templates
|
271
|
+
- The example page above uses a template found in /shared/templates/\_site.html
|
266
272
|
- Templates are used to wrap pages in a common structure. They are not served directly.
|
267
273
|
- The example template above has two content blocks, title and content.
|
268
274
|
- The page above has those content areas filled in with whatever is required
|
@@ -272,8 +278,46 @@ Below is the Page Example above, processed by `geb build` command.
|
|
272
278
|
- Obviously, the "start: what_ever_name" -> "end: what_ever_name" must have matching "names"
|
273
279
|
- Partials are used to include common content in pages and templates. They are not served directly.
|
274
280
|
- Partials can be nested, but be careful not to create circular references.
|
281
|
+
- A note on tags, <%= partial ... %> and <%= insert ... %> have and equal sign, while <% template ... %>, <% start ... %>, <% end ... %> do not. The reason is partial and insert actually change content where they are, while other tags are instructions.
|
275
282
|
- That's about it... happy coding!
|
276
283
|
|
284
|
+
## Site Variables
|
285
|
+
|
286
|
+
Geb supports a concept of site variables. In the geb configuration file you can specify site variables that are merged into the pages once templates and partials have been parsed.
|
287
|
+
|
288
|
+
Here is an example of what `geb.config.yml` may contain:
|
289
|
+
|
290
|
+
```yaml
|
291
|
+
site_variables:
|
292
|
+
local:
|
293
|
+
title: "My Local Site"
|
294
|
+
site_url: "http://localhost:4000"
|
295
|
+
release:
|
296
|
+
title: "My Site"
|
297
|
+
site_url: "https://example.com"
|
298
|
+
```
|
299
|
+
|
300
|
+
Geb will select the appropriate variables depending if you are building the site using `geb build` or releasing the site using `geb release`. Logically, `geb build` uses **local** variables, while `geb release` uses **release** variables.
|
301
|
+
|
302
|
+
To use the variables within templates, partials or pages, simply enclose the site variable name in \_{...}\_
|
303
|
+
|
304
|
+
<div><pre><code class="erb"><html>
|
305
|
+
<head>
|
306
|
+
<title>_{title}_>/title>
|
307
|
+
<meta name="twitter:image" content="_{site_url}_/assets/images/og-thumb.png" />
|
308
|
+
</head>
|
309
|
+
</html>
|
310
|
+
</code></pre>
|
311
|
+
</div>
|
312
|
+
|
313
|
+
Geb also has three special variables that are available during both `geb build` and `geb release`. These are:
|
314
|
+
|
315
|
+
- **page_title** - Extracted from the page <title></title> tag
|
316
|
+
- **page_relative_path** - Page path relative to the site URL
|
317
|
+
- **site_name** - Geb site name (either from configuration or development folder name)
|
318
|
+
- **geb_version** - Geb version number
|
319
|
+
|
320
|
+
|
277
321
|
## Command Reference
|
278
322
|
|
279
323
|
### geb build
|
data/lib/geb/commands/server.rb
CHANGED
@@ -23,9 +23,10 @@ module Geb
|
|
23
23
|
example [" ", "--port 8080", "--skip_auto_build", "--skip_build"]
|
24
24
|
|
25
25
|
# Define command options
|
26
|
-
option :port, type: :int, default:
|
26
|
+
option :port, type: :int, default: nil, desc: "Port to run the server on, otherwise it will use config file setting"
|
27
27
|
option :skip_build, type: :boolean, default: false, desc: "Skip building the site before starting the server"
|
28
28
|
option :skip_auto_build, type: :boolean, default: false, desc: "Don't automatically rebuild the site when a file changes"
|
29
|
+
option :debug, type: :boolean, default: false, desc: "Enable full output during site rebuild"
|
29
30
|
|
30
31
|
# Call method for the server command
|
31
32
|
# @param options [Hash] the options hash for the command
|
@@ -46,7 +47,7 @@ module Geb
|
|
46
47
|
server_port = options[:port] || site.site_config.local_port || 0
|
47
48
|
|
48
49
|
# initialize the server
|
49
|
-
server = Geb::Server.new(site, server_port, !options[:skip_auto_build])
|
50
|
+
server = Geb::Server.new(site, server_port, !options[:skip_auto_build], options[:debug])
|
50
51
|
|
51
52
|
# start the server
|
52
53
|
server.start()
|
data/lib/geb/config.rb
CHANGED
@@ -20,6 +20,16 @@ module Geb
|
|
20
20
|
def initialize(e = ""); super(e, MESSAGE); end
|
21
21
|
end # class ConfigFileNotFound < Geb::Error
|
22
22
|
|
23
|
+
class DestinationDirMissing < Geb::Error
|
24
|
+
MESSAGE = "Failed to generate configuration file, directory doesn't exist".freeze
|
25
|
+
def initialize(e = ""); super(e, MESSAGE); end
|
26
|
+
end # class DestinationDirMissing < Geb::Error
|
27
|
+
|
28
|
+
class ConfigAlreadyExists < Geb::Error
|
29
|
+
MESSAGE = "Failed to generate configuration file, it already exists".freeze
|
30
|
+
def initialize(e = ""); super(e, MESSAGE); end
|
31
|
+
end # class ConfigAlreadyExists < Geb::Error
|
32
|
+
|
23
33
|
# check if the site directory specified has the required geb.config.yml file
|
24
34
|
def self.site_directory_has_config?(site_path)
|
25
35
|
File.exist?(File.join(site_path, Geb::Defaults::SITE_CONFIG_FILENAME))
|
@@ -42,6 +52,71 @@ module Geb
|
|
42
52
|
|
43
53
|
end # def initialize
|
44
54
|
|
55
|
+
# generate the configuration file
|
56
|
+
# @param destination_directory [String] the destination directory where to generate the configuration file
|
57
|
+
# @raise DestinationDirMissing if the destination directory doesn't exist
|
58
|
+
# @raise ConfigAlreadyExists if the configuration file already exists
|
59
|
+
# @note the configuration file is generated without the following options (for security reasons):
|
60
|
+
# - site_name
|
61
|
+
# - remote_uri
|
62
|
+
# - remote_path
|
63
|
+
def generate_config_file(destination_directory)
|
64
|
+
|
65
|
+
# make sure the destination directory exists and there is no configuration file
|
66
|
+
raise DestinationDirMissing.new("Specified directory [#{destination_directory}] missing.") unless File.directory?(destination_directory)
|
67
|
+
raise ConfigAlreadyExists.new("Specified directory [#{destination_directory}] already has geb config.") if File.exist?(File.join(destination_directory, Geb::Defaults::SITE_CONFIG_FILENAME))
|
68
|
+
|
69
|
+
# initialize a new hash to store the configuration
|
70
|
+
new_config = {}
|
71
|
+
|
72
|
+
# add existing configuration to the new configuration
|
73
|
+
new_config['local_port'] = local_port if local_port
|
74
|
+
new_config['output_dir'] = output_dir unless output_dir == Geb::Defaults::OUTPUT_DIR
|
75
|
+
new_config['assets_dir'] = assets_dir unless assets_dir == Geb::Defaults::ASSETS_DIR
|
76
|
+
new_config['page_extensions'] = page_extensions unless page_extensions == Geb::Defaults::PAGE_EXTENSIONS
|
77
|
+
new_config['template_paths'] = template_paths if template_paths
|
78
|
+
new_config['template_and_partial_identifier'] = template_and_partial_identifier unless template_and_partial_identifier == Geb::Defaults::TEMPLATE_AND_PARTIAL_IDENTIFIER
|
79
|
+
|
80
|
+
# check if site variables are used
|
81
|
+
if @config['site_variables']
|
82
|
+
|
83
|
+
# initialize local and release site variables
|
84
|
+
new_config['site_variables'] = {}
|
85
|
+
new_config['site_variables']['local'] = {}
|
86
|
+
new_config['site_variables']['release'] = {}
|
87
|
+
|
88
|
+
# check if any local variables are used
|
89
|
+
new_config['site_variables']['local'] = @config['site_variables']['local'] if @config['site_variables']['local']
|
90
|
+
|
91
|
+
# check if any release variables are used, add only variable names and blank values
|
92
|
+
if @config['site_variables']['release']
|
93
|
+
|
94
|
+
# copy the local variables to the release variables, but set the values to emtpy strings
|
95
|
+
new_config['site_variables']['release'] = @config['site_variables']['release'].keys.each_with_object({}) { |key, hash| hash[key] = '' }
|
96
|
+
|
97
|
+
end # if
|
98
|
+
|
99
|
+
end # if
|
100
|
+
|
101
|
+
# write the new configuration to the destination directory
|
102
|
+
File.open(File.join(destination_directory, Geb::Defaults::SITE_CONFIG_FILENAME), 'w') do |file|
|
103
|
+
|
104
|
+
# generate configuration file header
|
105
|
+
file.write("#\n")
|
106
|
+
file.write("# Geb #{Geb::VERSION} Site Configuration\n")
|
107
|
+
file.write("# Generated by site template for #{site_name}\n")
|
108
|
+
file.write("#\n")
|
109
|
+
file.write("# For more information on the configuration options, see the fully document file at: \n")
|
110
|
+
file.write("# https://github.com/mainfram-work/geb/blob/main/lib/geb/samples/geb.config.yml\n")
|
111
|
+
file.write("#\n")
|
112
|
+
|
113
|
+
# write the new configuration to the file
|
114
|
+
file.write(new_config.to_yaml)
|
115
|
+
|
116
|
+
end # File.open
|
117
|
+
|
118
|
+
end # def generate_config_file
|
119
|
+
|
45
120
|
# get the configured site name, if not set, use the site directory name
|
46
121
|
# @return [String] the site name
|
47
122
|
def site_name
|
@@ -99,5 +174,18 @@ module Geb
|
|
99
174
|
return @config['template_paths'] || []
|
100
175
|
end # def template_paths
|
101
176
|
|
177
|
+
# get the configured partial paths
|
178
|
+
# @return [Array] the partial paths
|
179
|
+
# @note the configured site variables are different depending on the environment (local or release)
|
180
|
+
def get_site_variables
|
181
|
+
|
182
|
+
# check if the site is releasing and return the site variables
|
183
|
+
environment = (@site.releasing ? 'release' : 'local')
|
184
|
+
|
185
|
+
# return the site variables for the environment
|
186
|
+
return( @config['site_variables']&.[](environment) || {}).dup
|
187
|
+
|
188
|
+
end # def get_site_variables
|
189
|
+
|
102
190
|
end # class Config
|
103
191
|
end # module Geb
|
data/lib/geb/defaults.rb
CHANGED
@@ -18,7 +18,7 @@ module Geb
|
|
18
18
|
# default values for site templates
|
19
19
|
TEMPLATE_ARCHIVE_FILENAME = 'geb-template.tar.gz' # default the template archive filename
|
20
20
|
AVAILABLE_TEMPLATES = # list of bundled templates (first one is the default template)
|
21
|
-
['
|
21
|
+
['basic', 'bootstrap_jquery']
|
22
22
|
SITE_CONFIG_FILENAME = 'geb.config.yml' # site config file name
|
23
23
|
HTTP_TEMPLATE_CONTENT_TYPES = # acceptable remote template content types
|
24
24
|
['application/x-gzip', 'application/gzip', 'application/octet-stream']
|
@@ -37,7 +37,7 @@ module Geb
|
|
37
37
|
|
38
38
|
# default values for site pages
|
39
39
|
PAGE_EXTENSIONS = # list of file extention to treat as pages
|
40
|
-
['.md', '.markdown', '.html', '.htm', '.txt', '.js', '.css']
|
40
|
+
['.md', '.markdown', '.html', '.htm', '.txt', '.js', '.css', '.webmanifest']
|
41
41
|
TEMPLATE_AND_PARTIAL_IDENTIFIER = /^_/ # filename pattern for templates or partials
|
42
42
|
|
43
43
|
end # module Defaults
|
data/lib/geb/page.rb
CHANGED
@@ -21,8 +21,9 @@ require 'fileutils'
|
|
21
21
|
module Geb
|
22
22
|
class Page
|
23
23
|
|
24
|
-
#
|
25
|
-
|
24
|
+
# variable pattern match
|
25
|
+
VARIABLE_PATTERN = /_\{(.*?)\}_/
|
26
|
+
PAGE_TITLE_PATTERN = /<title>(.*?)<\/title>/
|
26
27
|
|
27
28
|
class PageFileNotFound < Geb::Error
|
28
29
|
MESSAGE = "Page file not found".freeze
|
@@ -96,9 +97,10 @@ module Geb
|
|
96
97
|
# initalise the new page content
|
97
98
|
@parsed_content = @content.dup
|
98
99
|
|
99
|
-
# parse the content for templates and
|
100
|
+
# parse the content for templates, partials and site variables
|
100
101
|
@parsed_content = parse_for_templates(@parsed_content)
|
101
102
|
@parsed_content = parse_for_partials(@parsed_content)
|
103
|
+
@parsed_content = parse_for_site_variables(@parsed_content)
|
102
104
|
|
103
105
|
end # def parse
|
104
106
|
|
@@ -170,6 +172,36 @@ module Geb
|
|
170
172
|
|
171
173
|
end # def parse_for_partials
|
172
174
|
|
175
|
+
# parse the content for site variables
|
176
|
+
# @param content [String] the content to parse for site variables. Default is the parsed page content.
|
177
|
+
# @return [String] the parsed content, with no site variables to parse.
|
178
|
+
# @note site variables are defined in the site configuration file
|
179
|
+
# @note site variables are matched using the VARIABLE_PATTERN
|
180
|
+
def parse_for_site_variables(content = @parsed_content)
|
181
|
+
|
182
|
+
# initialize the return parsed content
|
183
|
+
return_parsed_content = content.dup
|
184
|
+
|
185
|
+
# get the site variables, this method automatically loads release vs local variables
|
186
|
+
site_variables = @site.site_config.get_site_variables() || {}
|
187
|
+
|
188
|
+
# set the special variables
|
189
|
+
site_variables['page_relative_path'] = @path.gsub(@site.site_path, '')
|
190
|
+
site_variables['page_title'] = content.match(PAGE_TITLE_PATTERN)[1] if content.match(PAGE_TITLE_PATTERN)
|
191
|
+
site_variables['site_name'] = @site.site_config.site_name
|
192
|
+
site_variables['geb_version'] = Geb::VERSION
|
193
|
+
|
194
|
+
# find _{name}_ and replace with the site variable value
|
195
|
+
return_parsed_content.gsub!(VARIABLE_PATTERN) do |match|
|
196
|
+
key = match[2..-3] # remove _{ and }_
|
197
|
+
site_variables[key] || match
|
198
|
+
end # content.gsub!
|
199
|
+
|
200
|
+
# return the parsed content with variables handled
|
201
|
+
return return_parsed_content
|
202
|
+
|
203
|
+
end # def parse_for_site_variables
|
204
|
+
|
173
205
|
# build the page, save it to the output folder
|
174
206
|
# @param output_path [String] the output path
|
175
207
|
# @raise [FailedToOutputPage] if the page could not be saved to the output folder
|
@@ -1,7 +1,46 @@
|
|
1
1
|
BODY {
|
2
|
-
background-color: #
|
2
|
+
background-color: #FFFFFF;
|
3
3
|
font-family: Arial, sans-serif;
|
4
4
|
margin: 0;
|
5
5
|
padding: 0;
|
6
|
-
color: #
|
6
|
+
color: #000000;
|
7
|
+
}
|
8
|
+
|
9
|
+
.header {
|
10
|
+
padding: 20px 10px;
|
11
|
+
border-bottom: 1px solid#9FD88D;
|
12
|
+
.header-right {
|
13
|
+
float: right;
|
14
|
+
a {
|
15
|
+
border: 1px solid #9FD88D;
|
16
|
+
border-radius: 5px;
|
17
|
+
color: #000000;
|
18
|
+
text-decoration: none;
|
19
|
+
padding: 10px;
|
20
|
+
&:hover { background-color: #9FD88D; }
|
21
|
+
}
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
.main {
|
26
|
+
padding: 20px;
|
27
|
+
.main-left {
|
28
|
+
float: left;
|
29
|
+
width: 40%;
|
30
|
+
padding: 10px;
|
31
|
+
}
|
32
|
+
.main-right {
|
33
|
+
float: right;
|
34
|
+
width: 60%;
|
35
|
+
img {
|
36
|
+
width: 100%;
|
37
|
+
border: 1px solid #9FD88D;
|
38
|
+
border-radius: 20px;
|
39
|
+
}
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
.footer {
|
44
|
+
padding-top: 20px;
|
45
|
+
clear: both;
|
7
46
|
}
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
# Geb Configuration File
|
3
2
|
# =======================
|
4
3
|
#
|
@@ -33,7 +32,7 @@
|
|
33
32
|
# Set the local web server port that the site will run on.
|
34
33
|
# Geb server command will use this port to start the local web server
|
35
34
|
# If you don't specify a port, geb server command auto selects a port
|
36
|
-
|
35
|
+
local_port: 4000
|
37
36
|
|
38
37
|
# Specifies the output directory, this directory will be used to store the output of
|
39
38
|
# the build and release commands.
|
@@ -66,5 +65,22 @@
|
|
66
65
|
# The site template files will be archived into geb-template.tar.gz file and put within
|
67
66
|
# the release directory.
|
68
67
|
# e.g. template_paths: ["assets", "shared", "*.html", "site.webmanifest"]
|
69
|
-
|
68
|
+
template_paths: ['assets', '**/*.html', 'site.webmanifest', 'geb.config.yml']
|
69
|
+
|
70
|
+
# If you want to specify site variables, you can do so here. These variables will be available
|
71
|
+
# to the site as site.site_variables. You can specify different variables for different environments
|
72
|
+
# by specifying the environment name and the variables for that environment. Site variables are
|
73
|
+
# processed last, after templates and partials band can be used in pages, templates or partials.
|
74
|
+
# to use a site variable, use the syntax _{variable_name}_. If a variable is missing Geb will
|
75
|
+
# simply replace the _{tag}_ with an empty string.
|
76
|
+
# In the example below, use _{title}_ and _{site_url}_ in your pages, templates or partials.
|
77
|
+
# Geb will use local or release version depending if you are running the build or release command.
|
78
|
+
# Geb has the following site variables by default: page_relative_path, site_name, geb_version, page_title
|
79
|
+
site_variables:
|
80
|
+
local:
|
81
|
+
title: "My Local Site"
|
82
|
+
site_url: "http://localhost:4000"
|
83
|
+
release:
|
84
|
+
title: "My Site"
|
85
|
+
site_url: "https://example.com"
|
70
86
|
|
@@ -6,6 +6,29 @@ This is a website title
|
|
6
6
|
|
7
7
|
<% start: content %>
|
8
8
|
|
9
|
-
|
9
|
+
<!-- Main area, two by one, auto resize, no bootstrap -->
|
10
|
+
<div class="main">
|
11
|
+
<div class="main-left">
|
12
|
+
<h1>gem install <highlight>geb</highlight></h1>
|
13
|
+
<p>Build, manage and share static websites and templates, all hail geb the great.</p>
|
14
|
+
<p>
|
15
|
+
<a href="https://github.com/mainfram-work/geb.git" target="_blank">Github Repo</a><br />
|
16
|
+
<a href="https://rubygems.org/gems/geb" target="_blank">Ruby Gems</a
|
17
|
+
</p>
|
18
|
+
<p>
|
19
|
+
<small>
|
20
|
+
Geb, draws a symbolic connection to the ancient Egyptian god Geb, the deity of the Earth.
|
21
|
+
Just as Geb the god provides a stable foundation for the world, software Geb offers a robust
|
22
|
+
and essential foundation for building and managing static websites, which are the very bedrock
|
23
|
+
of the web.
|
24
|
+
</small>
|
25
|
+
</p>
|
26
|
+
</div>
|
27
|
+
<div class="main-right">
|
28
|
+
<img src="/assets/images/hero.png" alt="...">
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
|
10
33
|
|
11
34
|
<% end: content %>
|
@@ -1,3 +1,7 @@
|
|
1
1
|
|
2
2
|
<!-- Bootstrap Bundle -->
|
3
3
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
|
4
|
+
|
5
|
+
<div class="footer">
|
6
|
+
<%= partial: shared/partials/_geb.html %>
|
7
|
+
</div>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
<style>
|
3
|
+
.geb-footer {
|
4
|
+
display: flex; flex-direction: column; justify-content: center; gap: 1rem; margin-top: 1rem; margin-bottom: 2rem;
|
5
|
+
.geb-badge-container { display: flex; justify-content: center; gap: 1rem; }
|
6
|
+
a { text-decoration: none; color: inherit; border: none; img { cursor: pointer; } }
|
7
|
+
code { width: auto; display: none; margin: 1rem auto 0; background-color: #f8f9fa; padding: 0.3rem; border-radius: 0.25rem; font-size: 0.7rem;}
|
8
|
+
}
|
9
|
+
</style>
|
10
|
+
<script>
|
11
|
+
function toggle_geb_code() {
|
12
|
+
const code = document.querySelector('.geb-footer code');
|
13
|
+
code.innerHTML = code.innerHTML.replace('[site_url]', window.location.origin);
|
14
|
+
code.style.display = code.style.display === 'none' ? 'block' : 'none';
|
15
|
+
window.scrollTo(0, document.body.scrollHeight);
|
16
|
+
}
|
17
|
+
</script>
|
18
|
+
<div class="geb-footer">
|
19
|
+
<div class="geb-badge-container">
|
20
|
+
<a href="https://github.com/mainfram-work/geb" target="_blank"><img src="https://img.shields.io/badge/built_with-geb-9FD88D" alt="Built with Geb" /></a>
|
21
|
+
<a href="javascript:toggle_geb_code()"><img src="https://img.shields.io/badge/geb-site_template_available-9FD88D" alt="Geb Site Template Available" /></a>
|
22
|
+
</div>
|
23
|
+
<code style="display: none;">
|
24
|
+
$ gem install geb<br />$ geb init new_site --template [site_url]
|
25
|
+
</code>
|
26
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
|
2
|
+
<div class="header">
|
3
|
+
<img src="/assets/images/apple-touch-icon.png" alt="" width="32" height="32" class="d-inline-block">
|
4
|
+
<strong>Sample Site</strong> <small>(basic)</small>
|
5
|
+
<div class="header-right">
|
6
|
+
<a href="/index.html">Home</a>
|
7
|
+
<a href="/page.html">Sample Page</a>
|
8
|
+
</div>
|
9
|
+
</div>
|
@@ -1,7 +1,74 @@
|
|
1
1
|
BODY {
|
2
|
-
background-color: #1A2D3D;
|
2
|
+
background-color: #1A2D3D !important;
|
3
3
|
font-family: Arial, sans-serif;
|
4
4
|
margin: 0;
|
5
5
|
padding: 0;
|
6
6
|
color: #fff;
|
7
|
+
}
|
8
|
+
|
9
|
+
nav {
|
10
|
+
background-color: #9FD88D;;
|
11
|
+
color: #1A2D3D;
|
12
|
+
padding: 10px;
|
13
|
+
.nav-link,a { color: #000000; }
|
14
|
+
}
|
15
|
+
|
16
|
+
.hero-image {
|
17
|
+
border: 10px solid #9FD88D;
|
18
|
+
border-radius: 100%;
|
19
|
+
}
|
20
|
+
|
21
|
+
highlight {
|
22
|
+
color: #9FD88D;
|
23
|
+
font-weight: bold;
|
24
|
+
}
|
25
|
+
|
26
|
+
.lead {
|
27
|
+
color: lightgrey;
|
28
|
+
font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
|
29
|
+
font-weight: bold;
|
30
|
+
}
|
31
|
+
|
32
|
+
.navbar-toggler {
|
33
|
+
border-color: transparent;
|
34
|
+
}
|
35
|
+
.navbar-toggler-icon {
|
36
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='rgba(26, 45, 61, 1)' stroke-width='2' linecap='round' linejoin='round' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
|
37
|
+
}
|
38
|
+
|
39
|
+
.nav-tabs {
|
40
|
+
border-bottom: 0px;
|
41
|
+
margin-bottom: 30px;
|
42
|
+
.nav-item { margin: 0px 10px; }
|
43
|
+
.nav-link { color: #9FD88D; }
|
44
|
+
.active {
|
45
|
+
background-color: #9FD88D !important;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
.code-block {
|
50
|
+
background-color: #121F2A; /* Light grey background */
|
51
|
+
border: 1px solid #dee2e6; /* Light border */
|
52
|
+
border-radius: 0.25rem; /* Rounded corners */
|
53
|
+
padding: 1rem; /* Padding */
|
54
|
+
overflow-x: auto; /* Horizontal scrolling for long lines */
|
55
|
+
margin: 10px 5px;
|
56
|
+
a { text-decoration: none; }
|
57
|
+
}
|
58
|
+
.code-block code {
|
59
|
+
color: #d63384; /* Text color */
|
60
|
+
}
|
61
|
+
|
62
|
+
.prompt {
|
63
|
+
color: #6D1A43; /* Prompt color (blue) */
|
64
|
+
font-weight: bold;
|
65
|
+
}
|
66
|
+
|
67
|
+
.output {
|
68
|
+
color: #6c757d; /* Output color (grey) */
|
69
|
+
}
|
70
|
+
|
71
|
+
.comment {
|
72
|
+
color: #6a737d; /* Comment color (grey) */
|
73
|
+
font-style: italic; /* Italicize comments */
|
7
74
|
}
|