jekyll-geolexica 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +6 -0
  3. data/README.adoc +102 -0
  4. data/_config.yml +88 -0
  5. data/_data/lang.yaml +96 -0
  6. data/_includes/_title.html +5 -0
  7. data/_includes/head.html +48 -0
  8. data/_includes/localized-concept.html +99 -0
  9. data/_includes/newsroll-entry.html +17 -0
  10. data/_includes/page-header.html +31 -0
  11. data/_includes/resource-tree-item.html +49 -0
  12. data/_includes/script.html +0 -0
  13. data/_layouts/base-page.html +7 -0
  14. data/_layouts/concept.html +154 -0
  15. data/_layouts/concept.jsonld.html +152 -0
  16. data/_layouts/concept.ttl.html +83 -0
  17. data/_layouts/custom-home.html +33 -0
  18. data/_layouts/custom-post.html +7 -0
  19. data/_layouts/default.html +176 -0
  20. data/_layouts/home.html +6 -0
  21. data/_layouts/page.html +6 -0
  22. data/_layouts/post.html +13 -0
  23. data/_layouts/posts.html +10 -0
  24. data/_layouts/resource-index.html +14 -0
  25. data/_layouts/resource-page.html +25 -0
  26. data/_pages/404.adoc +12 -0
  27. data/_pages/api/rdf-profile.ttl +225 -0
  28. data/_pages/concepts-index-list.json +24 -0
  29. data/_pages/concepts-index.json +14 -0
  30. data/_pages/concepts.adoc +38 -0
  31. data/_pages/index.adoc +8 -0
  32. data/_pages/posts.adoc +6 -0
  33. data/_pages/stats.adoc +18 -0
  34. data/_pages/stats.json +5 -0
  35. data/_sass/adoc-markup.scss +197 -0
  36. data/_sass/concept.scss +171 -0
  37. data/_sass/concepts.scss +18 -0
  38. data/_sass/expandable-nav.scss +187 -0
  39. data/_sass/geolexica_home.scss +174 -0
  40. data/_sass/home.scss +87 -0
  41. data/_sass/jekyll-theme-isotc211.scss +146 -0
  42. data/_sass/legacy-crossbrowser.scss +67 -0
  43. data/_sass/main.scss +413 -0
  44. data/_sass/mixins.scss +39 -0
  45. data/_sass/normalize.scss +424 -0
  46. data/_sass/offsets.scss +59 -0
  47. data/_sass/post.scss +16 -0
  48. data/_sass/posts.scss +18 -0
  49. data/assets/algolia-search.js +28 -0
  50. data/assets/js/concept-search-worker.js +103 -0
  51. data/assets/js/concept-search.js +293 -0
  52. data/assets/js/ga.js +15 -0
  53. data/assets/js/nav.js +125 -0
  54. data/assets/js/resource-browser.js +79 -0
  55. data/assets/logo-ribose.svg +1 -0
  56. data/assets/resource-viewer-placeholder.html +11 -0
  57. data/assets/style.scss +11 -0
  58. data/babel.config.js +16 -0
  59. data/browserconfig.xml +12 -0
  60. data/fonts/MetaWebPro-Normal.woff +0 -0
  61. data/fonts/MetaWebPro-Thin.woff +0 -0
  62. data/jekyll-geolexica.gemspec +45 -0
  63. data/lib/jekyll-geolexica.rb +5 -0
  64. data/lib/jekyll/geolexica.rb +19 -0
  65. data/lib/jekyll/geolexica/concept_page.rb +169 -0
  66. data/lib/jekyll/geolexica/concept_serializer.rb +44 -0
  67. data/lib/jekyll/geolexica/concepts_generator.rb +64 -0
  68. data/lib/jekyll/geolexica/configuration.rb +47 -0
  69. data/lib/jekyll/geolexica/glossary.rb +95 -0
  70. data/lib/jekyll/geolexica/hooks.rb +33 -0
  71. data/lib/jekyll/geolexica/meta_pages_generator.rb +58 -0
  72. data/lib/jekyll/geolexica/version.rb +8 -0
  73. data/package-lock.json +2921 -0
  74. data/package.json +10 -0
  75. metadata +209 -0
data/assets/js/ga.js ADDED
@@ -0,0 +1,15 @@
1
+ (function () {
2
+
3
+ var gaid = document.documentElement.getAttribute('data-gaid');
4
+
5
+ if (gaid) {
6
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
7
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
8
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
9
+ })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
10
+
11
+ ga('create', gaid, 'auto');
12
+ ga('send', 'pageview');
13
+ }
14
+
15
+ }());
data/assets/js/nav.js ADDED
@@ -0,0 +1,125 @@
1
+ (function () {
2
+
3
+ // Requires accompanying CSS rules, based on classes on main container
4
+ // (body) that style header, menu and trigger button.
5
+ // Container classes used: .with-expandable-nav, .with-expanded-nav
6
+
7
+ class NavTrigger {
8
+ constructor({ triggerTemplateSelector, onTriggerClick }) {
9
+ this.onTriggerClick = onTriggerClick;
10
+ this.triggerTemplate = document.querySelector(`${triggerTemplateSelector}`);
11
+ this.triggerEl = document.importNode(this.triggerTemplate.content, true);
12
+ }
13
+
14
+ render() {
15
+ const wrapper = this.triggerEl.children[0];
16
+ wrapper.addEventListener('click', this.onTriggerClick);
17
+ return wrapper;
18
+ }
19
+ }
20
+
21
+ class ExpandableContainer {
22
+ constructor({
23
+ containerEl,
24
+ headerEl,
25
+ mainEl,
26
+ footerEl,
27
+ expandableNavEl, priorityNavEl,
28
+ expandableHtmlClass, expandedHtmlClass }) {
29
+
30
+ this.toggle = this.toggle.bind(this);
31
+
32
+ this.expandedHtmlClass = expandedHtmlClass;
33
+
34
+ this.containerEl = containerEl;
35
+ this.headerEl = headerEl;
36
+ this.mainEl = mainEl;
37
+ this.footerEl = footerEl;
38
+ this.expandableNavEl = expandableNavEl;
39
+ this.priorityNavEl = priorityNavEl;
40
+
41
+ this.expandableNavBottomOffset = 20;
42
+ this.containerEl.classList.add(expandableHtmlClass);
43
+
44
+ this.expanded = false;
45
+ this.animationTimeout = undefined;
46
+ }
47
+
48
+ toggle() {
49
+ this.expanded = !this.expanded;
50
+ this.update();
51
+ }
52
+
53
+ update() {
54
+ if (this.expanded) {
55
+ window.clearTimeout(this.animationTimeout);
56
+
57
+ // Hold main position
58
+ const mainTopOffset =
59
+ this.mainEl.getBoundingClientRect().top +
60
+ document.documentElement.scrollTop -
61
+ (document.documentElement.clientTop || document.body.clientTop || 0);
62
+ this.mainEl.style.marginTop = `${mainTopOffset}px`;
63
+
64
+ this.containerEl.classList.add(this.expandedHtmlClass);
65
+
66
+ const expH = this.expandableNavEl ?
67
+ this.expandableNavEl.getBoundingClientRect().height :
68
+ 0;
69
+
70
+ const prioH = this.priorityNavEl ?
71
+ this.priorityNavEl.getBoundingClientRect().height :
72
+ 0;
73
+
74
+ const heightDifference = expH - prioH + this.expandableNavBottomOffset;
75
+
76
+ this.headerEl.style.paddingBottom = `${heightDifference}px`;
77
+ this.headerEl.style.zIndex = '2';
78
+ this.headerEl.style.position = 'absolute';
79
+ this.headerEl.style.top = '0px';
80
+ this.headerEl.style.left = '0px';
81
+ this.headerEl.style.right = '0px';
82
+
83
+ } else {
84
+ this.containerEl.classList.remove(this.expandedHtmlClass);
85
+ this.headerEl.style.removeProperty('padding-bottom');
86
+
87
+ window.clearTimeout(this.animationTimeout);
88
+
89
+ this.animationTimeout = window.setTimeout(() => {
90
+ this.mainEl.style.removeProperty('margin-top');
91
+ this.headerEl.style.removeProperty('z-index');
92
+ this.headerEl.style.removeProperty('position');
93
+ }, 1000);
94
+ }
95
+ }
96
+ }
97
+
98
+ const body = document.querySelector('body');
99
+ const headerEl = document.querySelector('body > header');
100
+ const expandableNavEl = headerEl.querySelector('nav.expandable-nav');
101
+ const committeeMenuEl = headerEl.querySelector('.committee-widget .committee-menu');
102
+
103
+ if (expandableNavEl || committeeMenuEl) {
104
+
105
+ const container = new ExpandableContainer({
106
+ containerEl: body,
107
+ expandableHtmlClass: 'with-expandable-nav',
108
+ expandedHtmlClass: 'with-expanded-nav',
109
+ headerEl: headerEl,
110
+ footerEl: document.querySelector('body > footer'),
111
+ mainEl: document.querySelector('body > main'),
112
+ expandableNavEl: expandableNavEl,
113
+ priorityNavEl: headerEl.querySelector('nav.priority-nav'),
114
+ });
115
+
116
+ const trigger = new NavTrigger({
117
+ triggerTemplateSelector: '#expandableNavTrigger',
118
+ onTriggerClick: container.toggle,
119
+ });
120
+
121
+ headerEl.appendChild(trigger.render());
122
+
123
+ }
124
+
125
+ }());
@@ -0,0 +1,79 @@
1
+ (function () {
2
+ var viewer = document.querySelector('.two-pane-viewer');
3
+
4
+ if (viewer) {
5
+ var browser = viewer.querySelector('.browser.bp3-tree');
6
+ var iframe = viewer.querySelector('.viewer iframe');
7
+ if (browser && iframe) {
8
+
9
+ function selectItem (item) {
10
+ for (var el of browser.querySelectorAll('a')) {
11
+ el.classList.remove('selected');
12
+ }
13
+ item.classList.add('selected');
14
+ }
15
+
16
+ for (var el of browser.querySelectorAll('.bp3-tree-node-label a')) {
17
+ el.addEventListener('click', function (evt) {
18
+ iframe.setAttribute('src', 'about:blank');
19
+
20
+ var itemUrl = evt.target.getAttribute('href');
21
+ // var extension = itemUrl.slice('-1');
22
+ fetchResource(itemUrl, function () {
23
+ if (this.responseXML) {
24
+ try {
25
+ iframe.setAttribute('src', 'about:blank');
26
+ iframe.contentWindow.document.open();
27
+ iframe.contentWindow.document.write(
28
+ '<pre>' +
29
+ new Option(prettyPrintXML(this.responseXML)).innerHTML +
30
+ '</pre>');
31
+ iframe.contentWindow.document.close();
32
+
33
+ } catch (e) {
34
+ iframe.setAttribute('src', itemUrl);
35
+ }
36
+ } else {
37
+ iframe.setAttribute('src', itemUrl);
38
+ }
39
+ });
40
+
41
+ selectItem(evt.target);
42
+
43
+ evt.preventDefault();
44
+ return false;
45
+ });
46
+ }
47
+ }
48
+ }
49
+
50
+ function fetchResource(url, handleResourceResponse) {
51
+ var oReq = new XMLHttpRequest();
52
+ oReq.addEventListener("load", handleResourceResponse);
53
+ oReq.open("GET", url);
54
+ // oReq.overrideMimeType("text/plain; charset=x-user-defined");
55
+ oReq.send();
56
+ }
57
+
58
+ function prettyPrintXML(xmlDoc) {
59
+ var xsltDoc = new DOMParser().parseFromString([
60
+ // describes how we want to modify the XML - indent everything
61
+ '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">',
62
+ ' <xsl:strip-space elements="*"/>',
63
+ ' <xsl:template match="para[content-style][not(text())]">', // change to just text() to strip space in text nodes
64
+ ' <xsl:value-of select="normalize-space(.)"/>',
65
+ ' </xsl:template>',
66
+ ' <xsl:template match="node()|@*">',
67
+ ' <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>',
68
+ ' </xsl:template>',
69
+ ' <xsl:output indent="yes"/>',
70
+ '</xsl:stylesheet>',
71
+ ].join('\n'), 'application/xml');
72
+
73
+ var xsltProcessor = new XSLTProcessor();
74
+ xsltProcessor.importStylesheet(xsltDoc);
75
+ var resultDoc = xsltProcessor.transformToDocument(xmlDoc);
76
+ var resultXml = new XMLSerializer().serializeToString(resultDoc);
77
+ return resultXml;
78
+ };
79
+ }());
@@ -0,0 +1 @@
1
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2000 501"><title>ribose logo normal</title><path d="M180.9,31.3h36.2l18.1,31.3h36.2l18.1,31.3-18.1,31.4,18.1,31.3-18.1,31.3,18.1,31.3-18.1,31.3H235.2l-18.1,31.3,18.1,31.3h36.2l18.1,31.4-18.1,31.3,18.1,31.3-18.1,31.3,18.1,31.3L272.1,501H235.9l-18.8-31.3,18.1-31.3-18.1-31.3,18.1-31.3-18.1-31.3H180.9l-18.1-31.4H126.7l-18.1-31.3H72.4L54.3,313.1l18.1,31.4L54.3,375.8l18.1,31.3L54.3,438.4l18.1,31.3L55,501H18.8L0,469.7l18.1-31.3L0,407.1l18.1-31.3L0,344.5l18.1-31.4L0,281.8l18.1-31.3L0,219.2l18.1-31.3L0,156.6l18.1-31.3L0,93.9,18.1,62.6H54.3L72.4,31.3h36.2L126.7,0h36.1ZM126.7,250.5h36.1l18.1-31.3h36.2l18.1-31.3-18.1-31.3,18.1-31.3L217.1,93.9H180.9L162.8,62.6H126.7L108.6,93.9H72.4L54.3,125.3l18.1,31.3L54.3,187.9l18.1,31.3h36.2Z"/><path d="M470.2,93.9l-18.1,31.4H416L397.9,93.9,416,62.6h36.1Zm0,125.3-18.1,31.3,18.1,31.3-18.1,31.3,18.1,31.4-18.1,31.3,18.1,31.3-18.1,31.3,18.1,31.3L452.8,501H416.7l-18.8-31.3L416,438.4l-18.1-31.3L416,375.8l-18.1-31.3L416,313.1l-18.1-31.3L416,250.5l-18.1-31.3L416,187.9h36.1Z"/><path d="M659.9,31.3,641.8,62.6l18.1,31.3-18.1,31.4,18.1,31.3-18.1,31.3,18.1,31.3h36.2l18.1-31.3h36.2l18.1,31.3h36.2l18.1,31.3h36.1L877,281.8l-18.1,31.3L877,344.5l-18.1,31.3L877,407.1l-18.1,31.3H822.8l-18.1,31.3H768.5L751.1,501H714.9l-18.8-31.3H659.9L642.5,501H606.3l-18.7-31.3,18.1-31.3-18.1-31.3,18.1-31.3-18.1-31.3,18.1-31.4-18.1-31.3,18.1-31.3-18.1-31.3,18.1-31.3-18.1-31.3,18.1-31.3L587.6,93.9l18.1-31.3L587.6,31.3,605.7,0h36.1ZM822.8,375.8l-18.1-31.3,18.1-31.4-18.1-31.3H768.5l-18.1-31.3H714.2l-18.1,31.3H659.9l-18.1,31.3,18.1,31.4-18.1,31.3,18.1,31.3h36.2l18.1,31.3h36.2l18.1-31.3h36.2Z"/><path d="M1034.6,219.2h36.2l18.1-31.3H1125l18.1,31.3h36.2l18.1,31.3h36.2l18.1,31.3-18.1,31.3,18.1,31.4-18.1,31.3,18.1,31.3-18.1,31.3h-36.2l-18.1,31.3h-36.2L1125.7,501h-36.1l-18.8-31.3h-36.2l-18.1-31.3H980.3l-18.1-31.3,18.1-31.3-18.1-31.3,18.1-31.4-18.1-31.3,18.1-31.3h36.2Zm0,125.3-18.1,31.3,18.1,31.3h36.2l18.1,31.3H1125l18.1-31.3h36.2l18.1-31.3-18.1-31.3,18.1-31.4-18.1-31.3h-36.2L1125,250.5h-36.1l-18.1,31.3h-36.2l-18.1,31.3Z"/><path d="M1408,219.2h36.2l18.1-31.3h36.2l18.1,31.3h36.2l18.1,31.3h36.2l18,31.3-18,31.3h-36.2l-18.1-31.3h-36.2l-18.1-31.3h-36.2l-18.1,31.3,18.1,31.3h36.2l18.1,31.4h36.2l18.1,31.3h36.2l18,31.3-18,31.3h-36.2l-18.1,31.3h-36.2L1499.2,501H1463l-18.8-31.3H1408l-18.1-31.3h-36.2l-18-31.3,18-31.3h36.2l18.1,31.3h36.2l18.1,31.3h36.2l18.1-31.3-18.1-31.3h-36.2l-18.1-31.3H1408l-18.1-31.4h-36.2l-18-31.3,18-31.3h36.2Z"/><path d="M1782.9,219.2h36.2l18.1-31.3h36.2l18,31.3h36.2l18.1,31.3h36.2l18.1,31.3-18.1,31.3h-36.2l-18.1,31.4h-36.2l-18,31.3h-36.2l-18.1-31.3,18.1-31.4h36.2l18-31.3-18-31.3h-36.2l-18.1,31.3h-36.2l-18.1,31.3,18.1,31.4-18.1,31.3,18.1,31.3h36.2l18.1,31.3h36.2l18-31.3h36.2l18.1-31.3h36.2l18.1,31.3-18.1,31.3h-36.2l-18.1,31.3h-36.2L1874.1,501h-36.2l-18.8-31.3h-36.2l-18.1-31.3h-36.2l-18.1-31.3,18.1-31.3-18.1-31.3,18.1-31.4-18.1-31.3,18.1-31.3h36.2Z"/></svg>
@@ -0,0 +1,11 @@
1
+ <style>
2
+ p {
3
+ font-family: sans-serif;
4
+ }
5
+ </style>
6
+
7
+ <p>
8
+ Select a document on the left to view or download.
9
+
10
+ <p>
11
+ Note: Certain files may be better formatted when viewed in a separate window.
data/assets/style.scss ADDED
@@ -0,0 +1,11 @@
1
+ ---
2
+ ---
3
+
4
+ @import url('https://fonts.googleapis.com/css?family=Tienne:400,700');
5
+
6
+ @import 'jekyll-theme-isotc211';
7
+
8
+ @import 'mixins';
9
+ @import 'concept';
10
+ @import 'concepts';
11
+ @import 'geolexica_home';
data/babel.config.js ADDED
@@ -0,0 +1,16 @@
1
+ const presets = [
2
+ [
3
+ "@babel/env",
4
+ {
5
+ targets: {
6
+ ie: "10",
7
+ edge: "17",
8
+ firefox: "60",
9
+ chrome: "67",
10
+ safari: "11.1",
11
+ },
12
+ },
13
+ ],
14
+ ];
15
+
16
+ module.exports = { presets };
data/browserconfig.xml ADDED
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <browserconfig>
3
+ <msapplication>
4
+ <tile>
5
+ <square70x70logo src="images/mstile-70x70.png"/>
6
+ <square150x150logo src="images/mstile-150x150.png"/>
7
+ <square310x310logo src="images/mstile-310x310.png"/>
8
+ <wide310x150logo src="images/mstile-310x150.png"/>
9
+ <TileColor>#ffffff</TileColor>
10
+ </tile>
11
+ </msapplication>
12
+ </browserconfig>
Binary file
Binary file
@@ -0,0 +1,45 @@
1
+ # (c) Copyright 2020 Ribose Inc.
2
+ #
3
+
4
+ require_relative "lib/jekyll/geolexica/version"
5
+
6
+ all_files_in_git = Dir.chdir(__dir__) { `git ls-files -z`.split("\x0") }
7
+
8
+ ribose_url = "https://open.ribose.com/"
9
+ github_url = "https://github.com/geolexica/geolexica-server"
10
+
11
+ Gem::Specification.new do |spec|
12
+ spec.name = "jekyll-geolexica"
13
+ spec.version = Jekyll::Geolexica::VERSION
14
+ spec.authors = ["Ribose Inc."]
15
+ spec.email = ["open.source@ribose.com"]
16
+
17
+ spec.summary = "Geolexica plugin for Jekyll"
18
+ spec.homepage = ribose_url
19
+ spec.license = "MIT"
20
+
21
+ spec.metadata = {
22
+ "bug_tracker_uri" => (github_url + "/issues"),
23
+ "homepage_uri" => ribose_url,
24
+ "source_code_uri" => github_url,
25
+ }
26
+
27
+ spec.files = all_files_in_git.reject do |f|
28
+ [
29
+ f.match(%r{^(test|spec|features|.github)/}),
30
+ f.match(%r{^\.}),
31
+ ].any?
32
+ end
33
+
34
+ spec.bindir = "exe"
35
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
36
+ spec.require_paths = ["lib"]
37
+
38
+ spec.add_runtime_dependency "jekyll", ">= 3.8.5", "< 4.1"
39
+ spec.add_runtime_dependency "jekyll-asciidoc"
40
+
41
+ spec.add_development_dependency "bundler", "~> 2.1"
42
+ spec.add_development_dependency "pry"
43
+ spec.add_development_dependency "rake", ">= 10"
44
+ spec.add_development_dependency "rspec", "~> 3.9"
45
+ end
@@ -0,0 +1,5 @@
1
+ # The Jekyll convention is to use kebab-case in gem names only, even though
2
+ # it conflicts with Ruby conventions. This file is meant to bridge those
3
+ # two conventions together, otherwise this plugin won't work if loaded
4
+ # via _config.yml.
5
+ require "jekyll/geolexica"
@@ -0,0 +1,19 @@
1
+ # (c) Copyright 2020 Ribose Inc.
2
+ #
3
+
4
+ require "jekyll"
5
+
6
+ module Jekyll
7
+ module Geolexica
8
+ end
9
+ end
10
+
11
+ require_relative "geolexica/configuration"
12
+ require_relative "geolexica/concept_page"
13
+ require_relative "geolexica/concept_serializer"
14
+ require_relative "geolexica/concepts_generator"
15
+ require_relative "geolexica/glossary"
16
+ require_relative "geolexica/hooks"
17
+ require_relative "geolexica/meta_pages_generator"
18
+
19
+ Jekyll::Geolexica::Hooks.register_all_hooks
@@ -0,0 +1,169 @@
1
+ # (c) Copyright 2020 Ribose Inc.
2
+ #
3
+
4
+ module Jekyll
5
+ module Geolexica
6
+ class ConceptPage < PageWithoutAFile
7
+ attr_reader :concept
8
+
9
+ def initialize(site, concept)
10
+ @concept = concept
11
+ @data = default_data.merge(concept.data)
12
+
13
+ super(site, site.source, "concepts", page_name)
14
+ end
15
+
16
+ def termid
17
+ concept.termid
18
+ end
19
+
20
+ def type
21
+ self.collection_name.to_sym
22
+ end
23
+
24
+ protected
25
+
26
+ def default_data
27
+ {
28
+ "layout" => layout,
29
+ "permalink" => permalink,
30
+ "representations" => concept.pages,
31
+ }
32
+ end
33
+
34
+ # Disables Liquid processing for given content.
35
+ #
36
+ # FIXME Still may break if +content+ contains the "{% endraw %}" sequence,
37
+ # which is very unlikely as we work with trusted input.
38
+ # Preferred solution is to make the whole page a non-Liquid file,
39
+ # or mark as already processed, or something, but it is unclear how
40
+ # to achieve that.
41
+ def escape_liquid(content)
42
+ [
43
+ "{\% raw \%}",
44
+ content,
45
+ "{\% endraw \%}",
46
+ ].join("")
47
+ end
48
+
49
+ class HTML < ConceptPage
50
+ def page_name
51
+ "#{termid}.html"
52
+ end
53
+
54
+ def collection_name
55
+ "concepts"
56
+ end
57
+
58
+ def layout
59
+ "concept"
60
+ end
61
+
62
+ def permalink
63
+ "/concepts/#{termid}/"
64
+ end
65
+ end
66
+
67
+ class JSON < ConceptPage
68
+ def page_name
69
+ "#{termid}.json"
70
+ end
71
+
72
+ def collection_name
73
+ "concepts_json"
74
+ end
75
+
76
+ def layout
77
+ nil
78
+ end
79
+
80
+ def content
81
+ s = ConceptSerializer.new(concept, site)
82
+ escape_liquid(s.to_json)
83
+ end
84
+
85
+ def permalink
86
+ "/api/concepts/#{termid}.json"
87
+ end
88
+ end
89
+
90
+ class JSONLD < ConceptPage
91
+ def page_name
92
+ "#{termid}.jsonld"
93
+ end
94
+
95
+ def collection_name
96
+ "concepts_jsonld"
97
+ end
98
+
99
+ def layout
100
+ "concept.jsonld"
101
+ end
102
+
103
+ def permalink
104
+ "/api/concepts/#{termid}.jsonld"
105
+ end
106
+ end
107
+
108
+ class Turtle < ConceptPage
109
+ def page_name
110
+ "#{termid}.ttl"
111
+ end
112
+
113
+ def collection_name
114
+ "concepts_ttl"
115
+ end
116
+
117
+ def layout
118
+ "concept.ttl"
119
+ end
120
+
121
+ def permalink
122
+ "/api/concepts/#{termid}.ttl"
123
+ end
124
+ end
125
+
126
+ class TBX < ConceptPage
127
+ def page_name
128
+ "#{termid}.tbx.xml"
129
+ end
130
+
131
+ def collection_name
132
+ "concepts_tbx"
133
+ end
134
+
135
+ def layout
136
+ "concept.tbx.xml"
137
+ end
138
+
139
+ def permalink
140
+ "/api/concepts/#{termid}.tbx.xml"
141
+ end
142
+ end
143
+
144
+ class YAML < ConceptPage
145
+ def page_name
146
+ "#{termid}.yaml"
147
+ end
148
+
149
+ def collection_name
150
+ "concepts_yaml"
151
+ end
152
+
153
+ def layout
154
+ nil
155
+ end
156
+
157
+ def content
158
+ s = ConceptSerializer.new(concept, site)
159
+ escape_liquid(s.to_yaml)
160
+ end
161
+
162
+ def permalink
163
+ "/api/concepts/#{termid}.yaml"
164
+ end
165
+ end
166
+
167
+ end
168
+ end
169
+ end