jekyll-graph 0.0.2 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '038de01bbe85bc24af50ccb57201b05a10652580dd8143bfe5a0e465b8a7a291'
4
- data.tar.gz: 2af7e4481d0bab8691a34675fb48b51bab6f5a4a422f4c0f460581f3e1cc70a9
3
+ metadata.gz: 1573d14b40e41fa648645091c1b204877affa7f83bb89fc5c201f2cfa424eaec
4
+ data.tar.gz: 670c6b66d66a56c3c63030637450336fa2d9e357b0499615d8799552b047329a
5
5
  SHA512:
6
- metadata.gz: 5b25396bcf649bcb017f9d713c4393be1e86ea3728e970146115ee1524c9f6e38c68a78ff996329eac93c12716ddb213ca9583c1962e2ba396301ae785c7f3ef
7
- data.tar.gz: d4f7cccfb7204a986e7d5f8aa49a049d773680b6a69e5a6c6bd10476fcee8fb7a08bbd4f7e3ba134722fba5af11bcad548a8ea4e5b8ea85f3371b5817eddc7bd
6
+ metadata.gz: 7b0ceda8dcd2b4955fa291bc2b2f17846952eabf03beb301c333627ae9347695972324f9e19b0c32fd4485dcaf4e70a56c4b8103957b1825dc3c9e95d4fd97e4
7
+ data.tar.gz: fc17d253fed0a6bcb738d21ca2469c7025bdccd0abe476a223649ec0fb3c672a2417f38cbc4381ab92b60a6c69f2480f4daf73bad4c2536e9c8f477924ffec2a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## [0.0.6] - 2022-01-24
2
+ ### Change
3
+ - Move jekyll patch files to patch/ dir.
4
+ - Bump jekyll-wikilinks version number (0.0.10).
5
+ ## [0.0.5] - 2021-11-23
6
+ ### Change
7
+ - 'relatives' -> 'lineage' for tree nodes.
8
+
9
+ ## [0.0.4] - 2021-11-22
10
+ ### Fix
11
+ - Custom path config related fix in scripts.
12
+
13
+ ## [0.0.3] - 2021-11-22
14
+ ### Change
15
+ - Fix javascript inheritance.
16
+ - Decrement missing node log messages from 'warn' to 'debug'.
17
+ - Update license.
18
+ ### Fix
19
+ - Display log messages related to dependencies (see [#2](https://github.com/manunamz/jekyll-graph/issues/2)).
20
+ - Custom path configs.
21
+
1
22
  ## [0.0.2] - 2021-09-17
2
23
  ### Change
3
24
  - Liquid tag `force-graph` -> `jekyll_graph`.
data/Gemfile CHANGED
@@ -6,8 +6,8 @@ source "https://rubygems.org"
6
6
  gemspec
7
7
 
8
8
  gem "jekyll", "~> 4.2.0"
9
- gem "jekyll-namespaces", "~> 0.0.2"
10
- gem "jekyll-wikilinks", "~> 0.0.6"
9
+ gem "jekyll-namespaces", "~> 0.0.3"
10
+ gem "jekyll-wikilinks", "~> 0.0.10"
11
11
 
12
12
  gem "rake", "~> 13.0.3"
13
13
  gem "rspec", "~> 3.10"
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  Jekyll-Graph generates data and renders a graph that allows visitors to navigate a jekyll site by clicking nodes in the graph. Nodes are generated from the site's markdown files. Links for the tree graph are generated from [`jekyll-namespaces`](https://github.com/manunamz/jekyll-namespaces) and links for the net-web graph from [`jekyll-wikilinks`](https://github.com/manunamz/jekyll-wikilinks).
8
8
 
9
- This gem is part of the [jekyll-bonsai](https://manunamz.github.io/jekyll-bonsai/) project. 🎋
9
+ This gem is part of the [jekyll-bonsai](https://jekyll-bonsai.netlify.app/) project. 🎋
10
10
 
11
11
  ## Installation
12
12
 
@@ -37,41 +37,45 @@ Follow the instructions for installing a [jekyll plugin](https://jekyllrb.com/do
37
37
  ```javascript
38
38
  import JekyllGraph from './jekyll-graph.js';
39
39
 
40
- export default class JekyllGraphSubClass {
41
- ...
42
- }
43
-
44
- // subclass
45
- // Hook up the instance properties
46
- Object.setPrototypeOf(JekyllGraphSubClass.prototype, JekyllGraph.prototype);
47
-
48
- // Hook up the static properties
49
- Object.setPrototypeOf(JekyllGraphSubClass, JekyllGraph);
40
+ export default class JekyllGraphSubClass extends JekyllGraph {
50
41
 
42
+ constructor() {
43
+ super();
44
+ // access graph with 'this.graph'
45
+ // access graph div with 'this.graphDiv'
46
+ }
47
+
48
+ // ...
49
+ }
51
50
  ```
51
+
52
52
  Call `this.drawNetWeb()` and `this.drawTree()` to actually draw the graph. You could do this simply on initialization or on a button click, etc.
53
53
 
54
- Unless otherwise defined, the `jekyll-graph.js` file will be generated into `_site/assets/scripts/`.
54
+ Unless otherwise configured (see `path` vars below), the `jekyll-graph.js` file will be generated into `_site/assets/js/`.
55
55
 
56
56
  ## Configuration
57
57
 
58
58
  Default configs look like this:
59
59
 
60
- ```yml
60
+ ```yaml
61
61
  graph:
62
62
  enabled: true
63
63
  exclude: []
64
- assets_path: "/assets"
65
- scripts_path: "/assets/js"
66
- tree:
64
+ path:
65
+ assets: "/assets"
66
+ scripts: "/assets/js"
67
+ net_web:
67
68
  enabled: true
69
+ exclude:
70
+ attrs: false
71
+ links: false
68
72
  force:
69
73
  charge:
70
74
  strength_x:
71
75
  x_val:
72
76
  strength_y:
73
77
  y_val:
74
- net_web:
78
+ tree:
75
79
  enabled: true
76
80
  force:
77
81
  charge:
@@ -85,11 +89,13 @@ graph:
85
89
 
86
90
  `exclude`: Exclude specific jekyll document types (`posts`, `pages`, `collection_items`).
87
91
 
88
- `assets_path`: Custom graph file location from the root of the generated `_site/` directory.
92
+ `path.assets`: An optional custom assets location for graph assets to generate into. Location is relative to the root of the generated `_site/` directory.
93
+
94
+ `path.scripts`: An optional custom scripts location for the graph scripts to generate into. Location is relative to the assets location in the `_site/` directory (If `assets_path` is set, but `scripts_path` is not, the location will default to `_site/<assets_path>/js/`).
89
95
 
90
- `scripts_path`: Custom graph scripts location from the assets location of the generated `_site/` directory (If `assets_path` is set, but `scripts_path` is not, the location will default to `_site/<assets_path>/js/`).
96
+ `net_web.exclude.attrs` and `net_web.exclude.links`: Determines whether wikilink attributes and/or links are added to the net-web graph from the link index.
91
97
 
92
- `tree.enabled` and `net_web.enabled`: Toggles on/off the `tree` and `net_web` graphs, respectively.
98
+ `tree.enabled` and `net_web.enabled`: Toggles on/off the `tree` and `net_web` graphs, respectively. Be sure to disable graphs that are not in use.
93
99
 
94
100
  `tree.force` and `net_web.force`: These are force variables from d3's simulation forces. You can check out the [docs for details](https://github.com/d3/d3-force#simulation_force).
95
101
 
@@ -98,7 +104,6 @@ Force values will likely need to be played with depending on the div size and nu
98
104
  ```yaml
99
105
  graph:
100
106
  tree:
101
- # enabled: true
102
107
  dag_lvl_dist: 100
103
108
  force:
104
109
  charge: -100
@@ -107,7 +112,6 @@ graph:
107
112
  strength_y: 0.1
108
113
  y_val: 0.9
109
114
  net_web:
110
- # enabled: true
111
115
  force:
112
116
  charge: -300
113
117
  strength_x: 0.3
@@ -138,13 +142,13 @@ Graph colors are determined by css variables which may be defined like so -- any
138
142
  --graph-particles-color: grey;
139
143
  /* label text */
140
144
  --graph-text-color: black;
141
- /* */
142
145
  ```
143
146
 
144
147
  ## Data
145
148
  Graph data is generated in the following format:
146
149
 
147
150
  For the net-web graph, `graph-net-web.json`,`links` are built from `backlinks` and `attributed` metadata generated in `jekyll-wikilinks`:
151
+
148
152
  ```json
149
153
  // graph-net-web.json
150
154
  {
@@ -154,8 +158,8 @@ For the net-web graph, `graph-net-web.json`,`links` are built from `backlinks` a
154
158
  "url": "<relative-url>", // site.baseurl is handled for you here
155
159
  "label": "<note's-title>",
156
160
  "neighbors": {
157
- "nodes": [<neighbor-node>, ...],
158
- "links": [<neighbor-link>, ...],
161
+ "nodes": [<neighbor-node-id>, ...],
162
+ "links": [<neighbor-link-id>, ...],
159
163
  }
160
164
  },
161
165
  ...
@@ -169,18 +173,20 @@ For the net-web graph, `graph-net-web.json`,`links` are built from `backlinks` a
169
173
  ]
170
174
  }
171
175
  ```
176
+
172
177
  For the tree graph, `graph-tree.json`, `links` are built from a tree data structure constructed in `jekyll-namespaces`:
178
+
173
179
  ```json
174
180
  // graph-tree.json
175
181
  {
176
182
  "nodes": [
177
183
  {
178
184
  "id": "<some-id>",
179
- "url": "<relative-url>", // site.baseurl wil be handled for you here
185
+ "url": "<lineage-url>", // site.baseurl wil be handled for you here
180
186
  "label": "<note's-title>",
181
- "relatives": {
182
- "nodes": [<relative-node>, ...],
183
- "links": [<relative-link>, ...],
187
+ "lineage": {
188
+ "nodes": [<lineage-node-id>, ...],
189
+ "links": [<lineage-link-id>, ...],
184
190
  }
185
191
  },
186
192
  ...
@@ -194,4 +200,5 @@ For the tree graph, `graph-tree.json`, `links` are built from a tree data struct
194
200
  ]
195
201
  }
196
202
  ```
203
+
197
204
  Unless otherwise defined, both json files are generated into `_site/assets/`.
data/bin/console CHANGED
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "bundler/setup"
5
- require "jekyll/graph"
5
+ require "jekyll-graph"
6
6
 
7
7
  # You can add fixtures and/or initialization code here to make experimenting
8
8
  # with your gem easier. You can also use a different console, if you like.
data/jekyll-graph.gemspec CHANGED
@@ -12,7 +12,8 @@ Gem::Specification.new do |spec|
12
12
  # spec.description = "TODO: Write a longer description or delete this line."
13
13
  spec.homepage = "https://github.com/manunamz/jekyll-graph"
14
14
  spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
15
-
15
+ spec.licenses = ["GPL3"]
16
+
16
17
  # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
17
18
 
18
19
  spec.metadata["homepage_uri"] = spec.homepage
@@ -29,11 +30,11 @@ Gem::Specification.new do |spec|
29
30
  spec.require_paths = ["lib"]
30
31
 
31
32
  # Uncomment to register a new dependency of your gem
32
- # spec.add_dependency "example-gem", "~> 1.0"
33
+ spec.add_dependency "jekyll", "~> 4.2.0"
33
34
 
34
35
  # For more information and examples about making a new gem, checkout our
35
36
  # guide at: https://bundler.io/guides/creating_gem.html
36
37
 
37
- spec.add_runtime_dependency "jekyll-namespaces", "~> 0.0.2"
38
- spec.add_runtime_dependency "jekyll-wikilinks", "~> 0.0.6"
38
+ spec.add_runtime_dependency "jekyll-namespaces", "~> 0.0.3"
39
+ spec.add_runtime_dependency "jekyll-wikilinks", "~> 0.0.10"
39
40
  end
@@ -5,12 +5,16 @@ module Jekyll
5
5
  module Graph
6
6
 
7
7
  class PluginConfig
8
+
9
+ ASSETS_KEY = "assets"
10
+ ATTRS_KEY = "attrs"
8
11
  CONFIG_KEY = "graph"
9
12
  ENABLED_KEY = "enabled"
10
13
  EXCLUDE_KEY = "exclude"
14
+ LINKS_KEY = "links"
11
15
  NET_WEB_KEY = "net_web"
12
- PATH_ASSETS_KEY = "assets_path"
13
- PATH_SCRIPTS_KEY = "scripts_path"
16
+ PATH_KEY = "path"
17
+ SCRIPTS_KEY = "scripts"
14
18
  TREE_KEY = "tree"
15
19
  TYPE_KEY = "type"
16
20
 
@@ -20,7 +24,7 @@ module Jekyll
20
24
  Jekyll.logger.debug("Excluded jekyll types in graph: ", option(EXCLUDE_KEY)) unless disabled?
21
25
  end
22
26
 
23
- # options
27
+ # descriptors
24
28
 
25
29
  def disabled?
26
30
  return option(ENABLED_KEY) == false
@@ -39,22 +43,42 @@ module Jekyll
39
43
  return option(EXCLUDE_KEY).include?(type.to_s)
40
44
  end
41
45
 
42
- def has_custom_write_path?
43
- return !!option(PATH_ASSETS_KEY)
46
+ def has_custom_assets_path?
47
+ return option_path(ASSETS_KEY)
44
48
  end
45
49
 
46
50
  def has_custom_scripts_path?
47
- return !!option(PATH_SCRIPTS_KEY)
51
+ return option_path(SCRIPTS_KEY)
52
+ end
53
+
54
+ def use_attrs?
55
+ return true if option_net_web_exclude(ATTRS_KEY).nil?
56
+ return !option_net_web_exclude(ATTRS_KEY)
57
+ end
58
+
59
+ def use_links?
60
+ return true if option_net_web_exclude(LINKS_KEY).nil?
61
+ return !option_net_web_exclude(LINKS_KEY)
48
62
  end
49
63
 
64
+ # options
65
+
50
66
  def option(key)
51
67
  @config[CONFIG_KEY] && @config[CONFIG_KEY][key]
52
68
  end
53
69
 
70
+ def option_path(key)
71
+ @config[CONFIG_KEY] && @config[CONFIG_KEY][PATH_KEY] && @config[CONFIG_KEY][PATH_KEY][key]
72
+ end
73
+
54
74
  def option_net_web(key)
55
75
  @config[CONFIG_KEY] && @config[CONFIG_KEY][NET_WEB_KEY] && @config[CONFIG_KEY][NET_WEB_KEY][key]
56
76
  end
57
77
 
78
+ def option_net_web_exclude(key)
79
+ @config[CONFIG_KEY] && @config[CONFIG_KEY][NET_WEB_KEY] && @config[CONFIG_KEY][NET_WEB_KEY][EXCLUDE_KEY] && @config[CONFIG_KEY][NET_WEB_KEY][EXCLUDE_KEY][key]
80
+ end
81
+
58
82
  def option_tree(key)
59
83
  @config[CONFIG_KEY] && @config[CONFIG_KEY][TREE_KEY] && @config[CONFIG_KEY][TREE_KEY][key]
60
84
  end
@@ -66,11 +90,11 @@ module Jekyll
66
90
  end
67
91
 
68
92
  def path_assets
69
- return has_custom_write_path? ? option(PATH_ASSETS_KEY) : "/assets"
93
+ return has_custom_assets_path? ? option_path(ASSETS_KEY) : "/assets"
70
94
  end
71
95
 
72
96
  def path_scripts
73
- return has_custom_scripts_path? ? option(PATH_SCRIPTS_KEY) : File.join(path_assets, "js")
97
+ return has_custom_scripts_path? ? File.join(path_assets, option_path(SCRIPTS_KEY)) : File.join(path_assets, "js")
74
98
  end
75
99
 
76
100
  def testing
@@ -1,4 +1,5 @@
1
1
  // don't need frontmatter because liquid is handled internally...somehow...
2
+
2
3
  export default class JekyllGraph {
3
4
 
4
5
  constructor() {
@@ -7,7 +8,7 @@ export default class JekyllGraph {
7
8
 
8
9
  // d3
9
10
  drawNetWeb () {
10
- let assetsPath = '{{ site.graph.assets_path }}' !== '' ? '{{ site.graph.assets_path }}' : '/assets';
11
+ let assetsPath = '{{ site.graph.path.assets }}' !== '' ? '{{ site.graph.path.assets }}' : '/assets';
11
12
  fetch(`{{ site.baseurl }}${assetsPath}/graph-net-web.json`).then(res => res.json()).then(data => {
12
13
 
13
14
  // neighbors: replace ids with full object
@@ -29,9 +30,11 @@ export default class JekyllGraph {
29
30
  let hoverNode = null;
30
31
  let hoverLink = null;
31
32
 
32
- const Graph = ForceGraph()
33
+ if (this.graph) {
34
+ this.graph._destructor();
35
+ }
33
36
 
34
- (this.graphDiv)
37
+ const Graph = ForceGraph()(this.graphDiv)
35
38
  // container
36
39
  .height(this.graphDiv.parentElement.clientHeight)
37
40
  .width(this.graphDiv.parentElement.clientWidth)
@@ -101,35 +104,47 @@ export default class JekyllGraph {
101
104
  Graph.height(el.offsetHeight);
102
105
  }
103
106
  );
107
+
108
+ this.graph = Graph;
104
109
  });
105
110
  }
106
111
 
107
112
  drawTree () {
108
- let assetsPath = '{{ site.graph.assets_path }}' !== '' ? '{{ site.graph.assets_path }}' : '/assets';
113
+ let assetsPath = '{{ site.graph.path.assets }}' !== '' ? '{{ site.graph.path.assets }}' : '/assets';
109
114
  fetch(`{{ site.baseurl }}${assetsPath}/graph-tree.json`).then(res => res.json()).then(data => {
115
+
116
+ if (this.graph) {
117
+ this.graph._destructor();
118
+ }
110
119
 
111
- // relatives: replace ids with full object
112
- data.nodes.forEach(node => {
113
- let relativeNodes = [];
114
- node.relatives.nodes.forEach(nNodeId => {
115
- relativeNodes.push(data.nodes.find(node => node.id === nNodeId));
116
- });
117
- let relativeLinks = [];
118
- node.relatives.links.forEach(nLink => {
119
- relativeLinks.push(data.links.find(link => link.source === nLink.source && link.target === nLink.target));
120
- });
121
- node.relatives.nodes = relativeNodes;
122
- node.relatives.links = relativeLinks;
123
- });
120
+ // node height vars
121
+ this.shifted = [];
122
+ this.numSiblingsLeft = [];
124
123
 
124
+ // hover vars
125
125
  const highlightNodes = new Set();
126
126
  const highlightLinks = new Set();
127
127
  let hoverNode = null;
128
128
  let hoverLink = null;
129
129
 
130
- const Graph = ForceGraph()
130
+ // lineage: replace ids with full objects
131
+ data.nodes.forEach(node => {
132
+ // lineage
133
+ let lineageNodes = [];
134
+ node.lineage.nodes.forEach(nNodeId => {
135
+ lineageNodes.push(data.nodes.find(node => node.id === nNodeId));
136
+ });
137
+ let relativeLinks = [];
138
+ node.lineage.links.forEach(nLink => {
139
+ relativeLinks.push(data.links.find(link => link.source === nLink.source && link.target === nLink.target));
140
+ });
141
+ node.lineage.nodes = lineageNodes;
142
+ node.lineage.links = relativeLinks;
143
+ // siblings
144
+ this.numSiblingsLeft[node.parent] = node.siblings.length;
145
+ });
131
146
 
132
- (this.graphDiv)
147
+ const Graph = ForceGraph()(this.graphDiv)
133
148
  // dag-mode (tree)
134
149
  .dagMode('td')
135
150
  .dagLevelDistance(Number('{{ site.graph.tree.dag_lvl_dist }}'))
@@ -141,6 +156,8 @@ export default class JekyllGraph {
141
156
  // .nodePointerAreaPaint((node, color, ctx, scale) => nodePaint(node, nodeTypeInNetWeb(node), ctx))
142
157
  .nodeId('id')
143
158
  .nodeLabel('label')
159
+ // todo-shift: this shiftNodeHeight() always renders, but animatation is choppy
160
+ // .nodeVal(node => this.shiftNodeHeight(node))
144
161
  .onNodeClick((node, event) => this.goToPage(node, event))
145
162
  // link
146
163
  .linkSource('source')
@@ -171,8 +188,8 @@ export default class JekyllGraph {
171
188
  highlightLinks.clear();
172
189
  if (node) {
173
190
  highlightNodes.add(node);
174
- node.relatives.nodes.forEach(node => highlightNodes.add(node));
175
- node.relatives.links.forEach(link => highlightLinks.add(link));
191
+ node.lineage.nodes.forEach(node => highlightNodes.add(node));
192
+ node.lineage.links.forEach(link => highlightLinks.add(link));
176
193
  }
177
194
  hoverNode = node || null;
178
195
  })
@@ -202,12 +219,29 @@ export default class JekyllGraph {
202
219
  Graph.height(el.offsetHeight);
203
220
  }
204
221
  );
222
+
223
+ this.graph = Graph;
205
224
  });
206
225
  }
207
226
 
208
227
  // draw helpers
209
228
 
229
+ shiftNodeHeight(node) {
230
+ if (node.namespace !== 'root' && !this.shifted.includes(node)) {
231
+ const padding = 5;
232
+ let areSiblingsLeftEven = (this.numSiblingsLeft[node.parent] % 2) === 1;
233
+ let altrntr = areSiblingsLeftEven ? 1 : -1;
234
+ node.fy = node.fy + (altrntr * (this.numSiblingsLeft[node.parent] * padding));
235
+ this.numSiblingsLeft[node.parent] -= 1;
236
+ this.shifted.push(node);
237
+ }
238
+ }
239
+
210
240
  nodePaint(node, ctx, hoverNode, hoverLink, gType) {
241
+ // todo-shift: this shiftNodeHeight() animates more smoothly, but suffers from a race condition
242
+ // if (gType === "tree") {
243
+ // this.shiftNodeHeight(node);
244
+ // }
211
245
  let fillText = true;
212
246
  let radius = 6;
213
247
  //
@@ -216,7 +250,7 @@ export default class JekyllGraph {
216
250
  if (this.isVisitedPage(node)) {
217
251
  ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue('--graph-node-visited-color');
218
252
  } else if (this.isMissingPage(node)) {
219
- ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue('--graph-node-missing-color')
253
+ ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue('--graph-node-missing-color');
220
254
  } else if (!this.isVisitedPage(node) && !this.isMissingPage(node)) {
221
255
  ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue('--graph-node-unvisited-color');
222
256
  } else {
@@ -235,9 +269,9 @@ export default class JekyllGraph {
235
269
  } else if (hoverNode !== null && gType === "net-web" && !hoverNode.neighbors.nodes.includes(node)) {
236
270
  // non-neighbor to hoverNode
237
271
  fillText = false;
238
- } else if (hoverNode !== null && gType === "tree" && hoverNode.relatives.nodes.includes(node)) {
272
+ } else if (hoverNode !== null && gType === "tree" && hoverNode.lineage.nodes.includes(node)) {
239
273
  // neighbor to hoverNode
240
- } else if (hoverNode !== null && gType === "tree" && !hoverNode.relatives.nodes.includes(node)) {
274
+ } else if (hoverNode !== null && gType === "tree" && !hoverNode.lineage.nodes.includes(node)) {
241
275
  // non-neighbor to hoverNode
242
276
  fillText = false;
243
277
  } else if ((hoverNode === null && hoverLink !== null) && (hoverLink.source === node || hoverLink.target === node)) {
@@ -255,11 +289,11 @@ export default class JekyllGraph {
255
289
  //
256
290
  if (this.isCurrentPage(node)) {
257
291
  // turn glow on
258
- ctx.shadowBlur = 30;
292
+ ctx.shadowBlur = 40;
259
293
  ctx.shadowColor = getComputedStyle(document.documentElement).getPropertyValue('--graph-node-current-glow');
260
294
  } else if (this.isTag(node)) {
261
295
  // turn glow on
262
- ctx.shadowBlur = 30;
296
+ ctx.shadowBlur = 40;
263
297
  ctx.shadowColor = getComputedStyle(document.documentElement).getPropertyValue('--graph-node-tagged-glow');
264
298
  } else if (this.isVisitedPage(node)) {
265
299
  // turn glow on
File without changes
File without changes
@@ -3,7 +3,7 @@
3
3
  module Jekyll
4
4
  module Graph
5
5
 
6
- VERSION = "0.0.2"
6
+ VERSION = "0.0.6"
7
7
 
8
8
  end
9
9
  end
data/lib/jekyll-graph.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
  require "jekyll"
3
3
 
4
- require_relative "jekyll-graph/context"
5
- require_relative "jekyll-graph/page"
4
+ require_relative "jekyll-graph/patch/context"
5
+ require_relative "jekyll-graph/patch/page"
6
6
  require_relative "jekyll-graph/version"
7
7
 
8
8
  # setup config
@@ -30,13 +30,14 @@ module Jekyll
30
30
  CONVERTER_CLASS = Jekyll::Converters::Markdown
31
31
 
32
32
  def generate(site)
33
+ # check what's enabled
33
34
  return if $graph_conf.disabled?
34
- if !$graph_conf.disabled_net_web? && site.link_index.nil?
35
- Jekyll.logger.error("To generate the net-web graph, please add and enable the 'jekyll-wikilinks' plugin")
35
+ if !$graph_conf.disabled_net_web? && !site.respond_to?(:link_index)
36
+ Jekyll.logger.error("Jekyll-Graph: To generate the net-web graph, please either add and enable the 'jekyll-wikilinks' plugin or disable the net-web in the jekyll-graph config")
36
37
  return
37
38
  end
38
- if !$graph_conf.disabled_tree? && site.tree.nil?
39
- Jekyll.logger.error("To generate the tree graph, please add and enable the 'jekyll-namespaces' plugin")
39
+ if !$graph_conf.disabled_tree? && !site.respond_to?(:tree)
40
+ Jekyll.logger.error("Jekyll-Graph: To generate the tree graph, please either add and enable the 'jekyll-namespaces' plugin or disable the tree in the jekyll-graph config")
40
41
  return
41
42
  end
42
43
 
@@ -50,7 +51,7 @@ module Jekyll
50
51
  docs += @site.docs_to_write.filter { |d| !$graph_conf.excluded?(d.type) }
51
52
  @md_docs = docs.filter { |doc| markdown_extension?(doc.extname) }
52
53
  if @md_docs.empty?
53
- Jekyll.logger.debug("No documents to process.")
54
+ Jekyll.logger.warn("Jekyll-Graph: No documents to process.")
54
55
  end
55
56
 
56
57
  # write graph
@@ -64,25 +65,23 @@ module Jekyll
64
65
  )
65
66
  # create json file
66
67
  json_net_web_graph_file = self.new_page($graph_conf.path_assets, "graph-net-web.json", net_web_graph_content)
67
- self.register_static_file(json_net_web_graph_file)
68
68
  end
69
69
  if !$graph_conf.disabled_tree?
70
70
  # generate json data
71
71
  json_tree_nodes, json_tree_links = self.generate_json_tree(@site.tree.root)
72
- self.set_relatives(json_tree_nodes, json_tree_links)
72
+ self.set_lineage(json_tree_nodes, json_tree_links)
73
73
  tree_graph_content = JSON.dump(
74
74
  nodes: json_tree_nodes,
75
75
  links: json_tree_links,
76
76
  )
77
77
  # create json file
78
78
  json_tree_graph_file = self.new_page($graph_conf.path_assets, "graph-tree.json", tree_graph_content)
79
- self.register_static_file(json_tree_graph_file)
80
79
  end
81
80
  # add graph drawing scripts
82
81
  script_filename = "jekyll-graph.js"
83
82
  graph_script_content = File.read(source_path(script_filename))
83
+ # create js file
84
84
  static_file = self.new_page($graph_conf.path_scripts, script_filename, graph_script_content)
85
- self.register_static_file(static_file)
86
85
  end
87
86
 
88
87
  # helpers
@@ -116,13 +115,12 @@ module Jekyll
116
115
  return new_file
117
116
  end
118
117
 
119
- def register_static_file(static_file)
120
- # tests fail without manually adding the static file, but actual site builds seem to do ok
121
- # ...although there does seem to be a race condition which causes a rebuild to be necessary in order to detect the graph data file
122
- if $graph_conf.testing
123
- @site.static_files << static_file if !@site.static_files.include?(static_file)
124
- end
125
- end
118
+ # keeping this around in case it's needed again
119
+ # # tests fail without manually adding the static file, but actual site builds seem to do ok
120
+ # # ...although there does seem to be a race condition which causes a rebuild to be necessary in order to detect the graph data file
121
+ # def register_static_file(static_file)
122
+ # @site.static_files << static_file if !@site.static_files.include?(static_file)
123
+ # end
126
124
 
127
125
  # json population helpers
128
126
  # set ids here, full javascript objects are populated in client-side javascript.
@@ -140,18 +138,24 @@ module Jekyll
140
138
  end
141
139
  end
142
140
 
143
- def set_relatives(json_nodes, json_links)
141
+ def set_lineage(json_nodes, json_links)
144
142
  # TODO: json nodes have relative_url, but node.id's/urls are doc urls.
145
143
  json_nodes.each do |json_node|
146
- ancestor_node_ids, descendent_node_ids = @site.tree.get_all_relative_ids(json_node[:id])
147
- relative_node_ids = ancestor_node_ids.concat(descendent_node_ids)
148
- json_node[:relatives][:nodes] = relative_node_ids if !relative_node_ids.nil?
144
+ # set lineage
145
+
146
+ ancestor_node_ids, descendent_node_ids = @site.tree.get_all_lineage_ids(json_node[:id])
147
+ lineage_node_ids = ancestor_node_ids.concat(descendent_node_ids)
148
+ json_node[:lineage][:nodes] = lineage_node_ids if !lineage_node_ids.nil?
149
149
 
150
150
  # include current node when filtering for links along entire relative lineage
151
- lineage_ids = relative_node_ids.concat([json_node[:id]])
151
+ lineage_ids = lineage_node_ids.concat([json_node[:id]])
152
+
153
+ json_lineage_links = json_links.select { |l| lineage_ids.include?(l[:source]) && lineage_ids.include?(l[:target]) }
154
+ json_node[:lineage][:links] = json_lineage_links if !json_lineage_links.nil?
155
+
156
+ # set siblings
152
157
 
153
- json_relative_links = json_links.select { |l| lineage_ids.include?(l[:source]) && lineage_ids.include?(l[:target]) }
154
- json_node[:relatives][:links] = json_relative_links if !json_relative_links.nil?
158
+ json_node[:siblings] = @site.tree.get_sibling_ids(json_node[:id])
155
159
  end
156
160
  end
157
161
 
@@ -163,14 +167,13 @@ module Jekyll
163
167
  @md_docs.each do |doc|
164
168
  if !$graph_conf.excluded?(doc.type)
165
169
 
166
- Jekyll.logger.debug "Processing graph nodes for doc: ", doc.data['title']
170
+ Jekyll.logger.debug("Jekyll-Graph: Processing graph nodes for doc: ", doc.data['title'])
167
171
  #
168
172
  # missing nodes
169
173
  #
170
174
  @site.link_index.index[doc.url].missing.each do |missing_link_name|
171
175
  if net_web_nodes.none? { |node| node[:id] == missing_link_name }
172
- Jekyll.logger.warn "Net-Web node missing: ", missing_link_name
173
- Jekyll.logger.warn " in: ", doc.data['title']
176
+ Jekyll.logger.warn("Jekyll-Graph: Net-Web node missing: #{missing_link_name}, in: #{doc.data['title']}")
174
177
  net_web_nodes << {
175
178
  id: missing_link_name, # an id is necessary for link targets
176
179
  url: '',
@@ -200,10 +203,27 @@ module Jekyll
200
203
  },
201
204
  }
202
205
  # TODO: this link calculation ends up with duplicates -- re-visit this later.
203
- @site.link_index.index[doc.url].attributes.each do |link| # link = { 'type' => str, 'urls' => [str, str, ...] }
204
- # TODO: Header + Block-level wikilinks
205
- link['urls'].each do |lu|
206
- link_no_anchor = lu.match(/([^#]+)/i)[0]
206
+ if $graph_conf.use_attrs?
207
+ @site.link_index.index[doc.url].attributes.each do |link| # link = { 'type' => str, 'urls' => [str, str, ...] }
208
+ # TODO: Header + Block-level wikilinks
209
+ link['urls'].each do |lu|
210
+ link_no_anchor = lu.match(/([^#]+)/i)[0]
211
+ link_no_baseurl = @site.baseurl.nil? ? link_no_anchor : link_no_anchor.gsub(@site.baseurl, "")
212
+ linked_doc = @md_docs.select{ |d| d.url == link_no_baseurl }
213
+ if !linked_doc.nil? && linked_doc.size == 1 && !$graph_conf.excluded?(linked_doc.first.type)
214
+ # TODO: add link['type'] to d3 graph
215
+ net_web_links << {
216
+ source: doc.url,
217
+ target: linked_doc.first.url,
218
+ }
219
+ end
220
+ end
221
+ end
222
+ end
223
+ if $graph_conf.use_links?
224
+ @site.link_index.index[doc.url].forelinks.each do |link| # link = { 'type' => str, 'url' => str }
225
+ # TODO: Header + Block-level wikilinks
226
+ link_no_anchor = link['url'].match(/([^#]+)/i)[0]
207
227
  link_no_baseurl = @site.baseurl.nil? ? link_no_anchor : link_no_anchor.gsub(@site.baseurl, "")
208
228
  linked_doc = @md_docs.select{ |d| d.url == link_no_baseurl }
209
229
  if !linked_doc.nil? && linked_doc.size == 1 && !$graph_conf.excluded?(linked_doc.first.type)
@@ -215,19 +235,6 @@ module Jekyll
215
235
  end
216
236
  end
217
237
  end
218
- @site.link_index.index[doc.url].forelinks.each do |link| # link = { 'type' => str, 'url' => str }
219
- # TODO: Header + Block-level wikilinks
220
- link_no_anchor = link['url'].match(/([^#]+)/i)[0]
221
- link_no_baseurl = @site.baseurl.nil? ? link_no_anchor : link_no_anchor.gsub(@site.baseurl, "")
222
- linked_doc = @md_docs.select{ |d| d.url == link_no_baseurl }
223
- if !linked_doc.nil? && linked_doc.size == 1 && !$graph_conf.excluded?(linked_doc.first.type)
224
- # TODO: add link['type'] to d3 graph
225
- net_web_links << {
226
- source: doc.url,
227
- target: linked_doc.first.url,
228
- }
229
- end
230
- end
231
238
 
232
239
  end
233
240
  end
@@ -235,12 +242,12 @@ module Jekyll
235
242
  return net_web_nodes, net_web_links
236
243
  end
237
244
 
238
- def generate_json_tree(node, json_parent="", tree_nodes=[], tree_links=[])
245
+ def generate_json_tree(node, json_parent="", tree_nodes=[], tree_links=[], level=0)
239
246
  #
240
247
  # missing nodes
241
248
  #
242
249
  if node.missing
243
- Jekyll.logger.warn("Document for tree node missing: ", node.namespace)
250
+ Jekyll.logger.warn("Jekyll-Graph: Document for tree node missing: ", node.namespace)
244
251
 
245
252
  leaf = node.namespace.split('.').pop()
246
253
  missing_node = {
@@ -248,18 +255,22 @@ module Jekyll
248
255
  label: leaf.gsub('-', ' '),
249
256
  namespace: node.namespace,
250
257
  url: "",
251
- relatives: {
258
+ level: level,
259
+ lineage: {
252
260
  nodes: [],
253
261
  links: [],
254
262
  },
263
+ siblings: [],
255
264
  }
256
- tree_nodes << missing_node
265
+ # non-root handling
257
266
  if !json_parent.empty?
267
+ missing_node[:parent] = json_parent[:id]
258
268
  tree_links << {
259
269
  source: json_parent[:id],
260
270
  target: node.namespace,
261
271
  }
262
272
  end
273
+ tree_nodes << missing_node
263
274
  json_parent = missing_node
264
275
  #
265
276
  # existing nodes
@@ -270,22 +281,26 @@ module Jekyll
270
281
  label: node.title,
271
282
  namespace: node.namespace,
272
283
  url: relative_url(node.url),
273
- relatives: {
284
+ level: level,
285
+ lineage: {
274
286
  nodes: [],
275
287
  links: [],
276
288
  },
289
+ siblings: [],
277
290
  }
278
- tree_nodes << existing_node
291
+ # non-root handling
279
292
  if !json_parent.empty?
293
+ existing_node[:parent] = json_parent[:id]
280
294
  tree_links << {
281
295
  source: json_parent[:id],
282
296
  target: node.url,
283
297
  }
284
298
  end
299
+ tree_nodes << existing_node
285
300
  json_parent = existing_node
286
301
  end
287
302
  node.children.each do |child|
288
- self.generate_json_tree(child, json_parent, tree_nodes, tree_links)
303
+ self.generate_json_tree(child, json_parent, tree_nodes, tree_links, (level + 1))
289
304
  end
290
305
  return tree_nodes, tree_links
291
306
  end
metadata CHANGED
@@ -1,43 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-graph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - manunamz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-17 00:00:00.000000000 Z
11
+ date: 2022-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jekyll
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: jekyll-namespaces
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: 0.0.2
33
+ version: 0.0.3
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: 0.0.2
40
+ version: 0.0.3
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: jekyll-wikilinks
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: 0.0.6
47
+ version: 0.0.10
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: 0.0.6
54
+ version: 0.0.10
41
55
  description:
42
56
  email:
43
57
  - manunamz@pm.me
@@ -59,13 +73,14 @@ files:
59
73
  - jekyll-graph.gemspec
60
74
  - lib/jekyll-graph.rb
61
75
  - lib/jekyll-graph/config.rb
62
- - lib/jekyll-graph/context.rb
63
76
  - lib/jekyll-graph/jekyll-graph.js
64
- - lib/jekyll-graph/page.rb
77
+ - lib/jekyll-graph/patch/context.rb
78
+ - lib/jekyll-graph/patch/page.rb
65
79
  - lib/jekyll-graph/tags.rb
66
80
  - lib/jekyll-graph/version.rb
67
81
  homepage: https://github.com/manunamz/jekyll-graph
68
- licenses: []
82
+ licenses:
83
+ - GPL3
69
84
  metadata:
70
85
  homepage_uri: https://github.com/manunamz/jekyll-graph
71
86
  source_code_uri: https://github.com/manunamz/jekyll-graph
@@ -85,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
100
  - !ruby/object:Gem::Version
86
101
  version: '0'
87
102
  requirements: []
88
- rubygems_version: 3.2.17
103
+ rubygems_version: 3.2.27
89
104
  signing_key:
90
105
  specification_version: 4
91
106
  summary: Add d3 graph generation to jekyll.