jekyll-geolexica 1.0.0

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.
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