fni-docs-theme 0.4.2 → 0.4.3

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: 73f7f3cdfe0e0a45ceff74d8ce905dbf3bd180954695c6ba242e6934ccc3fd09
4
- data.tar.gz: 132b77f2dea994a3f57619453d6be90ec988c105f6fafe3196732bdb6642ac93
3
+ metadata.gz: 5ba5439ab23c84eab01b03238c30f867e62e58e1c6252790cb1197baf24c10c9
4
+ data.tar.gz: 2aec63e1e343635dfbc12184fc64d72c7fe6128026a7df5cc9c3679b2591df77
5
5
  SHA512:
6
- metadata.gz: 130d9973522f41f23519a097b805dbe4d73e5e9ea99c1beef02423bb8fe0f1d62c5668ded928c6bb0ed57a7c0973d03cd6bd6fff361184c7e9fd9a9f891e2d8e
7
- data.tar.gz: 6879c3c326b204fe8e4737c04a5b6f6982467fcd774407d082d64c4162d4f5529c721f6a252e28598b1e1a13013de4179c4ccb40a6818013d0afdbe08a1c21c0
6
+ metadata.gz: 1ec084330a227096c77e00f8fa9acbc985b0e60402dffa61e7d4d414d73203300fe29919518a3cf038a74456620623e2d3baff8b8b386d89e2c04ee95b3a0aeb
7
+ data.tar.gz: 9d12d80caacf6bb2f981d8f8629807d1187bdf2d01cb720eb68788b39f34a3d977d673de737e3996968b61183275d9ee28cbcc5e10468263af236d407c968e44
data/README.md CHANGED
@@ -2,18 +2,37 @@
2
2
 
3
3
  Forked from [just-the-docs](https://pmarsceill.github.io/just-the-docs/)
4
4
 
5
+ Pertinent differences:
6
+ * Nav generation has been moved to a plugin, lib/generators/nav-generator. This ensures the nav is only generated once and can be included
7
+
5
8
  ## Installation
6
9
 
7
- Add this line to your Jekyll site's `_config.yml`:
10
+ This theme is distributed as a Jekyll plugin, to install:
11
+
12
+ * Add the plugin to your gemfile (recommend pinning a specific version):
13
+ ```ruby
14
+ group :jekyll_plugins do
15
+ gem "fni-docs-theme", "0.4.2"
16
+ end
17
+ ```
18
+
19
+ Add these lines to your Jekyll site's `_config.yml`:
8
20
 
9
21
  ```yaml
10
- remote_theme: dealertrack/fni-docs-theme
22
+ theme: fni-docs-theme
23
+
24
+ plugins:
25
+ - fni-docs-theme
11
26
  ```
12
27
 
13
28
  ## Usage
14
29
 
15
30
  [View the documentation](https://pmarsceill.github.io/just-the-docs/) for usage information.
16
31
 
32
+ ## Publishing
33
+
34
+ This theme/plugin is published as fni-docs-theme to rubygems.org.
35
+
17
36
  ## License
18
37
 
19
38
  The theme is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/_includes/head.html CHANGED
@@ -29,8 +29,14 @@
29
29
  {% if site.search_enabled != false %}
30
30
  <script type="text/javascript" src="{{ '/assets/js/vendor/lunr.min.js' | relative_url }}"></script>
31
31
  {% endif %}
32
+
33
+ <script src="https://cdn.jsdelivr.net/npm/plantuml-encoder@1.4.0/dist/plantuml-encoder.min.js"></script>
34
+ <script src="https://cdn.jsdelivr.net/npm/svg-pan-zoom@3.6.1/dist/svg-pan-zoom.min.js"></script>
35
+
32
36
  <script type="text/javascript" src="{{ '/assets/js/just-the-docs.js' | relative_url }}"></script>
33
37
  <script type="text/javascript" src="{{ '/assets/js/jtd-nav.js' | relative_url }}"></script>
38
+ <script type="text/javascript" src="{{ '/assets/js/links.js' | relative_url }}"></script>
39
+ <script type="text/javascript" src="{{ '/assets/js/plantuml.js' | relative_url }}"></script>
34
40
 
35
41
  <meta name="viewport" content="width=device-width, initial-scale=1">
36
42
 
@@ -0,0 +1,5 @@
1
+ <div class="plantuml-diagram" data-diagram-src="{{ include.diagram }}"
2
+ data-diagram-width="{{ include.width }}" data-diagram-height="{{ include.height }}">
3
+ <div class="plantuml-diagram-open"></div>
4
+ <div class="plantuml-diagram-inner"></div>
5
+ </div>
data/_sass/modules.scss CHANGED
@@ -18,3 +18,4 @@
18
18
  @import "./code";
19
19
  @import "./utilities/utilities";
20
20
  @import "./print";
21
+ @import "./plantuml";
@@ -0,0 +1,25 @@
1
+
2
+ // Style iuml diagrams
3
+ .plantuml-diagram {
4
+ position: relative;
5
+ color: #333;
6
+
7
+ svg {
8
+ border: 2px solid #444;
9
+ }
10
+
11
+ .error-msg {
12
+ margin: 1em;
13
+ padding: 0.5em;
14
+ background-color: #fdd;
15
+ border: 1px solid #922;
16
+ }
17
+
18
+ .plantuml-diagram-open {
19
+ position: absolute;
20
+ right: 5px;
21
+ bottom: 8px;
22
+ font-size: smaller;
23
+ }
24
+ }
25
+
@@ -0,0 +1,22 @@
1
+
2
+ window.jtd.onReady(() => {
3
+ externalLinks()
4
+ })
5
+
6
+ // Find all anchor links on the page that reference external pages or static files and open them in a new tab
7
+ function externalLinks() {
8
+ const newTabExtensions = ['.pdf', '.png', '.svg']
9
+ const links = document.getElementsByTagName('a')
10
+ for (const link of links) {
11
+ const href = link.getAttribute('href')
12
+ if (href && link.hostname !== location.hostname) {
13
+ link.target = "_blank";
14
+ link.rel = "noopener";
15
+ } else if (href && newTabExtensions.some(ext => href.indexOf(ext) > 0)) {
16
+ link.onclick = function () {
17
+ window.open(this.href)
18
+ return false
19
+ }
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,95 @@
1
+
2
+ window.jtd.onReady(() => {
3
+ initDiags()
4
+ })
5
+
6
+ async function initDiags() {
7
+ const defaultWidth = 736
8
+ const defaultHeight = 400
9
+
10
+ const curPath = window.location.pathname
11
+ const diags = document.getElementsByClassName('plantuml-diagram')
12
+
13
+ for (const diag of diags) {
14
+ const src = diag.dataset.diagramSrc
15
+ const svgSrc = src.replace('.iuml', '.svg')
16
+ const diagCont = diag.getElementsByClassName('plantuml-diagram-inner')[0]
17
+ const viewCont = diag.getElementsByClassName('plantuml-diagram-open')[0]
18
+ const width = diag.dataset.diagramWidth || defaultWidth
19
+ const height = diag.dataset.diagramHeight || defaultHeight
20
+
21
+ // Fetch the svg
22
+ const svgRes = await fetch(curPath + svgSrc)
23
+ if (!svgRes.ok) {
24
+ diagCont.innerHTML = '<div class="error-msg">Failed to retrieve diagram</div>'
25
+ continue
26
+ }
27
+
28
+ // Add an open button
29
+ viewCont.innerHTML = `<a href="${svgSrc}" target="_blank" rel="noopener">open</a>`
30
+
31
+ const svg = await svgRes.text()
32
+
33
+ diagCont.innerHTML = svg
34
+ const svgElement = diag.getElementsByTagName('svg')[0]
35
+
36
+ svgElement.style.width = width
37
+ svgElement.style.height = height
38
+ svgElement.style.backgroundColor = '#333'
39
+
40
+ const spz = svgPanZoom(svgElement, {
41
+ zoomEnabled: true,
42
+ controlIconsEnabled: false,
43
+ fit: true,
44
+ center: true,
45
+ dblClickZoomEnabled: false,
46
+ customEventsHandler: {
47
+ init: options => {
48
+ // Double click to toggle fullscreen
49
+ options.svgElement.addEventListener('dblclick', () => {
50
+ if (options.svgElement.style.position === 'fixed') {
51
+ options.svgElement.style.position = null
52
+ options.svgElement.style.left = null
53
+ options.svgElement.style.top = null
54
+ options.svgElement.style.zIndex = null
55
+ options.svgElement.style.width = width
56
+ options.svgElement.style.height = height
57
+ } else {
58
+ options.svgElement.style.position = 'fixed'
59
+ options.svgElement.style.left = '20px'
60
+ options.svgElement.style.top = '20px'
61
+ options.svgElement.style.zIndex = '9999'
62
+ options.svgElement.style.width = getWidth() - 40
63
+ options.svgElement.style.height = getHeight() - 40
64
+ }
65
+
66
+ options.instance.updateBBox()
67
+ options.instance.resize()
68
+ options.instance.fit()
69
+ options.instance.center()
70
+ })
71
+ }
72
+ }
73
+ })
74
+ }
75
+ }
76
+
77
+ function getWidth() {
78
+ return Math.max(
79
+ document.body.scrollWidth,
80
+ document.documentElement.scrollWidth,
81
+ document.body.offsetWidth,
82
+ document.documentElement.offsetWidth,
83
+ document.documentElement.clientWidth
84
+ );
85
+ }
86
+
87
+ function getHeight() {
88
+ return Math.max(
89
+ document.body.scrollHeight,
90
+ document.documentElement.scrollHeight,
91
+ document.body.offsetHeight,
92
+ document.documentElement.offsetHeight,
93
+ document.documentElement.clientHeight
94
+ );
95
+ }
@@ -0,0 +1,98 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'digest'
4
+
5
+ module PlantUmlConverterPlugin
6
+ # Whitelists *.iuml documents for conversion despite them lacking front matter
7
+ class PlantUmlGenerator < Jekyll::Generator
8
+ attr_accessor :site
9
+ safe true
10
+ priority :low
11
+
12
+ @plantuml_converter
13
+
14
+ def initialize(site)
15
+ @plantuml_converter = PlantUmlConverter.new()
16
+ end
17
+
18
+ def generate(site)
19
+ diagrams = site.static_files.select { |file| @plantuml_converter.matches(static_file_ext(file)) }
20
+ site.pages.concat(diagrams.map { |diag| page_from_static_file(site, diag) })
21
+ site.static_files -= diagrams
22
+ end
23
+
24
+ def static_file_ext(static_file)
25
+ static_file.extname
26
+ end
27
+
28
+ # Given a Jekyll::StaticFile, returns the file as a Jekyll::Page
29
+ def page_from_static_file(site, static_file)
30
+ base = static_file.instance_variable_get("@base")
31
+ dir = static_file.instance_variable_get("@dir")
32
+ name = static_file.instance_variable_get("@name")
33
+ Jekyll::Page.new(site, base, dir, name)
34
+ end
35
+ end
36
+
37
+ class PlantUmlConverter < Jekyll::Converter
38
+ safe true
39
+ priority :low
40
+
41
+ @config = {}
42
+
43
+ def matches(ext)
44
+ ext =~ /^\.iuml$/i
45
+ end
46
+
47
+ def output_ext(ext)
48
+ '.svg'
49
+ end
50
+
51
+ def initialize(config = {})
52
+ @config = config['plantuml']
53
+ end
54
+
55
+ def convert(content)
56
+ dest_uri = URI("#{@config['server_uri']}/svg/")
57
+
58
+ begin
59
+ iuml = filter_iuml(content)
60
+ svg_res = Net::HTTP.post(dest_uri, iuml, 'Content-Type' => 'text/plain')
61
+
62
+ unless (svg_res.kind_of? Net::HTTPSuccess)
63
+ diag_name = content.lines.first.sub('@startuml ','').sub("\n", '')
64
+ error_msg = svg_res['X-PlantUML-Diagram-Error']
65
+ error_line = svg_res['X-PlantUML-Diagram-Error-Line']
66
+ Jekyll.logger.error "Failed to render .iuml [#{diag_name}]: #{error_msg} at line #{error_line}"
67
+ return ''
68
+ end
69
+
70
+ svg_res.body
71
+ rescue => err
72
+ diag_name = content.lines.first.sub('@startuml ','').sub("\n", '')
73
+ Jekyll.logger.error "Failed to convert IUML document: #{diag_name} - #{err.message}"
74
+ return ''
75
+ end
76
+ end
77
+
78
+ # Clean up markup as needed (matches)
79
+ # Add "!theme spacelab" if no theme present and set background color
80
+ # Add an @enduml that only seems to be needed for server rendering
81
+ def filter_iuml(iuml)
82
+ iuml_arr = iuml.split("\n")
83
+ unless (iuml.include? '!theme')
84
+ iuml_arr = iuml_arr.insert(1, '!theme spacelab')
85
+ end
86
+ unless (iuml.include? 'skinparam backgroundColor')
87
+ iuml_arr = iuml_arr.insert(2, 'skinparam backgroundColor #333')
88
+ end
89
+ unless (iuml.include? '@enduml')
90
+ iuml_arr = iuml_arr.push("@enduml")
91
+ end
92
+ iuml_arr.join("\n")
93
+ end
94
+ end
95
+
96
+ # TODO: Could also define a custom plantuml liquid block instead of the include, would still need to inject scripts into <head>
97
+ # ref https://github.com/yegor256/jekyll-plantuml/blob/master/lib/jekyll-plantuml.rb
98
+ end
@@ -1 +1,2 @@
1
1
  require "generators/nav-generator"
2
+ require "converters/plantuml-converter"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fni-docs-theme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Marsceill
@@ -120,6 +120,7 @@ files:
120
120
  - _includes/head.html
121
121
  - _includes/head_custom.html
122
122
  - _includes/header_custom.html
123
+ - _includes/iuml.html
123
124
  - _includes/js/custom.js
124
125
  - _includes/nav.html
125
126
  - _includes/title.html
@@ -142,6 +143,7 @@ files:
142
143
  - _sass/layout.scss
143
144
  - _sass/modules.scss
144
145
  - _sass/navigation.scss
146
+ - _sass/plantuml.scss
145
147
  - _sass/print.scss
146
148
  - _sass/search.scss
147
149
  - _sass/support/_functions.scss
@@ -168,9 +170,12 @@ files:
168
170
  - assets/images/search.svg
169
171
  - assets/js/jtd-nav.js
170
172
  - assets/js/just-the-docs.js
173
+ - assets/js/links.js
174
+ - assets/js/plantuml.js
171
175
  - assets/js/vendor/lunr.min.js
172
176
  - assets/js/zzzz-search-data.json
173
177
  - bin/just-the-docs
178
+ - lib/converters/plantuml-converter.rb
174
179
  - lib/fni-docs-theme.rb
175
180
  - lib/generators/nav-generator.rb
176
181
  - lib/tasks/search.rake