utopia-project 0.38.0 → 0.40.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 (94) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/utopia/project/base.rb +4 -14
  4. data/lib/utopia/project/guides.rb +66 -0
  5. data/lib/utopia/project/import_map.rb +2 -0
  6. data/lib/utopia/project/sidebar.rb +6 -16
  7. data/lib/utopia/project/version.rb +1 -1
  8. data/pages/_page.xnode +1 -18
  9. data/pages/_usage.xnode +2 -2
  10. data/pages/guides/index.xnode +17 -8
  11. data/pages/guides/show.xnode +34 -1
  12. data/pages/releases/index.xnode +0 -1
  13. data/public/_static/application.js +24 -0
  14. data/public/_static/links.js +18 -16
  15. data/public/_static/sidebar.js +205 -133
  16. data/public/_static/site.css +34 -0
  17. data/readme.md +6 -4
  18. data/releases.md +6 -0
  19. data.tar.gz.sig +0 -0
  20. metadata +6 -77
  21. metadata.gz.sig +3 -1
  22. data/public/_components/jquery/jquery.js +0 -10716
  23. data/public/_components/jquery/jquery.min.js +0 -2
  24. data/public/_components/jquery/jquery.min.map +0 -1
  25. data/public/_components/jquery/jquery.slim.js +0 -8617
  26. data/public/_components/jquery/jquery.slim.min.js +0 -2
  27. data/public/_components/jquery/jquery.slim.min.map +0 -1
  28. data/public/_components/jquery-litebox/jquery.litebox.css +0 -23
  29. data/public/_components/jquery-litebox/jquery.litebox.gallery.css +0 -48
  30. data/public/_components/jquery-litebox/jquery.litebox.js +0 -30
  31. data/public/_components/jquery-syntax/base/jquery.syntax.brush.apache.css +0 -12
  32. data/public/_components/jquery-syntax/base/jquery.syntax.brush.applescript.css +0 -5
  33. data/public/_components/jquery-syntax/base/jquery.syntax.brush.assembly.css +0 -8
  34. data/public/_components/jquery-syntax/base/jquery.syntax.brush.bash-script.css +0 -4
  35. data/public/_components/jquery-syntax/base/jquery.syntax.brush.bash.css +0 -2
  36. data/public/_components/jquery-syntax/base/jquery.syntax.brush.clang.css +0 -6
  37. data/public/_components/jquery-syntax/base/jquery.syntax.brush.css.css +0 -14
  38. data/public/_components/jquery-syntax/base/jquery.syntax.brush.diff.css +0 -16
  39. data/public/_components/jquery-syntax/base/jquery.syntax.brush.html.css +0 -3
  40. data/public/_components/jquery-syntax/base/jquery.syntax.brush.ocaml.css +0 -3
  41. data/public/_components/jquery-syntax/base/jquery.syntax.brush.protobuf.css +0 -2
  42. data/public/_components/jquery-syntax/base/jquery.syntax.brush.python.css +0 -6
  43. data/public/_components/jquery-syntax/base/jquery.syntax.brush.ruby.css +0 -2
  44. data/public/_components/jquery-syntax/base/jquery.syntax.brush.xml.css +0 -35
  45. data/public/_components/jquery-syntax/base/jquery.syntax.core.css +0 -58
  46. data/public/_components/jquery-syntax/base/jquery.syntax.editor.css +0 -6
  47. data/public/_components/jquery-syntax/base/theme.js +0 -1
  48. data/public/_components/jquery-syntax/bright/jquery.syntax.core.css +0 -27
  49. data/public/_components/jquery-syntax/bright/theme.js +0 -1
  50. data/public/_components/jquery-syntax/jquery.syntax.brush.apache.js +0 -3
  51. data/public/_components/jquery-syntax/jquery.syntax.brush.applescript.js +0 -5
  52. data/public/_components/jquery-syntax/jquery.syntax.brush.assembly.js +0 -3
  53. data/public/_components/jquery-syntax/jquery.syntax.brush.bash-script.js +0 -4
  54. data/public/_components/jquery-syntax/jquery.syntax.brush.bash.js +0 -2
  55. data/public/_components/jquery-syntax/jquery.syntax.brush.basic.js +0 -5
  56. data/public/_components/jquery-syntax/jquery.syntax.brush.clang.js +0 -5
  57. data/public/_components/jquery-syntax/jquery.syntax.brush.csharp.js +0 -4
  58. data/public/_components/jquery-syntax/jquery.syntax.brush.css.js +0 -5
  59. data/public/_components/jquery-syntax/jquery.syntax.brush.diff.js +0 -2
  60. data/public/_components/jquery-syntax/jquery.syntax.brush.go.js +0 -3
  61. data/public/_components/jquery-syntax/jquery.syntax.brush.haskell.js +0 -3
  62. data/public/_components/jquery-syntax/jquery.syntax.brush.html.js +0 -4
  63. data/public/_components/jquery-syntax/jquery.syntax.brush.io.js +0 -3
  64. data/public/_components/jquery-syntax/jquery.syntax.brush.java.js +0 -4
  65. data/public/_components/jquery-syntax/jquery.syntax.brush.javascript.js +0 -3
  66. data/public/_components/jquery-syntax/jquery.syntax.brush.kai.js +0 -2
  67. data/public/_components/jquery-syntax/jquery.syntax.brush.lisp.js +0 -2
  68. data/public/_components/jquery-syntax/jquery.syntax.brush.lua.js +0 -3
  69. data/public/_components/jquery-syntax/jquery.syntax.brush.nginx.js +0 -2
  70. data/public/_components/jquery-syntax/jquery.syntax.brush.ocaml.js +0 -4
  71. data/public/_components/jquery-syntax/jquery.syntax.brush.ooc.js +0 -4
  72. data/public/_components/jquery-syntax/jquery.syntax.brush.pascal.js +0 -4
  73. data/public/_components/jquery-syntax/jquery.syntax.brush.perl5.js +0 -3
  74. data/public/_components/jquery-syntax/jquery.syntax.brush.php-script.js +0 -4
  75. data/public/_components/jquery-syntax/jquery.syntax.brush.php.js +0 -2
  76. data/public/_components/jquery-syntax/jquery.syntax.brush.plain.js +0 -2
  77. data/public/_components/jquery-syntax/jquery.syntax.brush.protobuf.js +0 -3
  78. data/public/_components/jquery-syntax/jquery.syntax.brush.python.js +0 -5
  79. data/public/_components/jquery-syntax/jquery.syntax.brush.ruby.js +0 -5
  80. data/public/_components/jquery-syntax/jquery.syntax.brush.scala.js +0 -4
  81. data/public/_components/jquery-syntax/jquery.syntax.brush.smalltalk.js +0 -2
  82. data/public/_components/jquery-syntax/jquery.syntax.brush.sql.js +0 -4
  83. data/public/_components/jquery-syntax/jquery.syntax.brush.super-collider.js +0 -3
  84. data/public/_components/jquery-syntax/jquery.syntax.brush.swift.js +0 -3
  85. data/public/_components/jquery-syntax/jquery.syntax.brush.xml.js +0 -4
  86. data/public/_components/jquery-syntax/jquery.syntax.brush.xrb.js +0 -2
  87. data/public/_components/jquery-syntax/jquery.syntax.brush.yaml.js +0 -2
  88. data/public/_components/jquery-syntax/jquery.syntax.cache.js +0 -7
  89. data/public/_components/jquery-syntax/jquery.syntax.core.js +0 -34
  90. data/public/_components/jquery-syntax/jquery.syntax.editor.js +0 -11
  91. data/public/_components/jquery-syntax/jquery.syntax.js +0 -8
  92. data/public/_components/jquery-syntax/jquery.syntax.min.js +0 -13
  93. data/public/_components/jquery-syntax/paper/jquery.syntax.core.css +0 -31
  94. data/public/_components/jquery-syntax/paper/theme.js +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 00ba83cfcaea0e83dbd4e927e4ed1483fa7079c94b56c9a480616a421b04fcaa
4
- data.tar.gz: 48b8ceb3698e82e2d3f460f53f5e085540251c4e054abe0ff0560133de2d5d40
3
+ metadata.gz: 9857e236b8690b3e3c8ae113309fdf2af695222643cc998bcac8862c09232465
4
+ data.tar.gz: b8ccb22331616e6f1ff287c067bf22ace7148c7627a6be9209be9c86f928a87d
5
5
  SHA512:
6
- metadata.gz: e59af3ae609bd5d28aafaaf9af6d7d50acb365e625986b8983277fe71d0615afb95552f32b24d27c586c15417c4e1e376db1353968d116b8dedf7c919b0e8286
7
- data.tar.gz: 6e3652aa2c16b3406afb0c8ab4cb47d2f259ad5b2c15e4c368c50d6df6214e60c79e3c11ca4d592f54e4b5332dd30fe3d8f3876f9ff4fee34ecc961a9548f7b5
6
+ metadata.gz: c9e2c1640bb841704474c7bf6e3bf1a077fa9eae05267fb45874ea5b07c2beefcdfd92011d152e55db42fff3a1b037611355ddcd94e9f43b6425049f765e4741
7
+ data.tar.gz: 21796bcb1f5844dce244d0421a92d86ee3e25a0bf8daa05e12e6c41103fbc0e64f6703f8de664e1ce1110509876f0073850e55980c95847a8c492959ec14da3c
checksums.yaml.gz.sig CHANGED
Binary file
@@ -15,7 +15,7 @@ require "thread/local"
15
15
  require_relative "document"
16
16
  require_relative "releases_document"
17
17
 
18
- require_relative "guide"
18
+ require_relative "guides"
19
19
  require_relative "linkify"
20
20
 
21
21
  module Utopia
@@ -193,10 +193,8 @@ module Utopia
193
193
  end
194
194
  end
195
195
 
196
- # Enumerate over all available guides in order.
197
- # @yields {|guide| ...} If a block is given.
198
- # @parameter guide [Guide]
199
- # @returns [Enumerator(Guide)] If no block given.
196
+ # Get the guides collection for this project.
197
+ # @returns [Guides]
200
198
  #
201
199
  # @example List guide titles
202
200
  # base = Utopia::Project::Base.new
@@ -204,15 +202,7 @@ module Utopia
204
202
  # puts guide.title
205
203
  # end
206
204
  def guides
207
- return to_enum(:guides) unless block_given?
208
-
209
- @links.index("/guides").each do |link|
210
- guide_path = File.join(@root, link.path)
211
-
212
- next unless File.directory?(guide_path)
213
-
214
- yield Guide.new(self, guide_path, link.info)
215
- end
205
+ @guides ||= Guides.new(self, @links)
216
206
  end
217
207
 
218
208
  def readme_document
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2025, by Samuel Williams.
5
+
6
+ require_relative "guide"
7
+
8
+ module Utopia
9
+ module Project
10
+ # A collection of guides with navigation and lookup capabilities.
11
+ class Guides
12
+ include Enumerable
13
+
14
+ # Initialize the guides collection.
15
+ # @parameter base [Base] The base instance for the project.
16
+ # @parameter links [Object] The links index for finding guides.
17
+ def initialize(base, links)
18
+ @base = base
19
+ @links = links
20
+ end
21
+
22
+ # Iterate over all guides.
23
+ # @yields {|guide| ...} If a block is given.
24
+ # @parameter guide [Guide]
25
+ # @returns [Enumerator(Guide)] If no block is given.
26
+ def each(&block)
27
+ return to_enum(:each) unless block_given?
28
+
29
+ @links.index("/guides").each do |link|
30
+ guide_path = File.join(@base.root, link.path)
31
+
32
+ next unless File.directory?(guide_path)
33
+
34
+ yield Guide.new(@base, guide_path, link.info)
35
+ end
36
+ end
37
+
38
+ # Get all guides as a sorted array.
39
+ # @returns [Array(Guide)]
40
+ def to_a
41
+ @array ||= super.sort
42
+ end
43
+
44
+ # Find a guide by name.
45
+ # @parameter name [String] The guide name.
46
+ # @returns [Guide | Nil]
47
+ def [](name)
48
+ to_a.find { |guide| guide.name == name }
49
+ end
50
+
51
+ # Get the related guides (previous and next) for the given guide.
52
+ # @parameter guide [Guide] The current guide.
53
+ # @returns [Array(Guide | Nil, Guide | Nil)] A two-element array containing the previous and next guides.
54
+ def related(guide)
55
+ index = to_a.index { |g| g.name == guide.name }
56
+ return [nil, nil] unless index
57
+
58
+ previous_guide = index > 0 ? to_a[index - 1] : nil
59
+ next_guide = index < to_a.size - 1 ? to_a[index + 1] : nil
60
+
61
+ [previous_guide, next_guide]
62
+ end
63
+ end
64
+ end
65
+ end
66
+
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "utopia/import_map"
2
4
 
3
5
  module Utopia
@@ -90,24 +90,14 @@ module Utopia
90
90
  private
91
91
 
92
92
  def self.extract_headings_from_document(document)
93
- headings = []
94
- return headings unless document&.root
93
+ return [] unless document&.root
95
94
 
96
- document.root.walk do |node|
97
- if node.type == :header
98
- next if node.header_level < 2 or node.header_level > 3
99
-
100
- fragment = node.dup.extract_children
101
-
102
- title = XRB::Markup.raw(fragment.to_html)
103
- level = node.header_level
104
- anchor = Markly::Renderer::HTML.anchor_for(fragment)
105
-
106
- headings << Entry.new(title, level, anchor)
107
- end
95
+ Markly::Renderer::Headings.extract(document.root, min_level: 2, max_level: 3).map do |heading|
96
+ fragment = heading.node.dup.extract_children
97
+ title = XRB::Markup.raw(fragment.to_html)
98
+
99
+ Entry.new(title, heading.level, heading.anchor)
108
100
  end
109
-
110
- headings
111
101
  end
112
102
  end
113
103
  end
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Utopia
7
7
  module Project
8
- VERSION = "0.38.0"
8
+ VERSION = "0.40.0"
9
9
  end
10
10
  end
data/pages/_page.xnode CHANGED
@@ -16,24 +16,7 @@
16
16
  <link rel="stylesheet" href="/_static/site.css" type="text/css" media="screen" />
17
17
 
18
18
  #{Utopia::Project::IMPORT_MAP.relative_to(request.env["REQUEST_PATH"]).to_html}
19
-
20
- <script src="/_components/jquery/jquery.min.js"></script>
21
-
22
- <script src="/_static/links.js"></script>
23
-
24
- <script type="module">
25
- // <![CDATA[
26
- import {Syntax} from '@socketry/syntax';
27
- document.addEventListener('DOMContentLoaded', async function() {
28
- await Syntax.highlight();
29
- });
30
-
31
- import mermaid from 'mermaid';
32
- const isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
33
- const theme = isDarkMode ? 'dark' : 'default';
34
- mermaid.initialize({startOnLoad: true, theme: theme});
35
- // ]]>
36
- </script>
19
+ <script type="module" src="/_static/application.js"></script>
37
20
  </head>
38
21
  <body>
39
22
  <content:header />
data/pages/_usage.xnode CHANGED
@@ -3,7 +3,7 @@
3
3
  <?r
4
4
  base = self[:base]
5
5
 
6
- base.guides do |guide|
6
+ base.guides.each do |guide|
7
7
  ?>
8
8
  <section>
9
9
  <h3><a href="#{guide.href}">#{guide.title}</a></h3>
@@ -18,4 +18,4 @@
18
18
  </section>
19
19
  <?r
20
20
  end
21
- ?>
21
+ ?>
@@ -1,16 +1,25 @@
1
1
  <content:page>
2
- <?r
3
- base = self[:base]
4
- ?>
5
2
  <content:heading>Guides</content:heading>
6
3
 
7
- <ul>
4
+ <section>
8
5
  <?r
9
- base = controller[:base]
6
+ base = self[:base]
10
7
 
11
- base.guides do |guide|
12
- ?><li><a href="#{guide.name}/">#{guide.title}</a></li><?r
8
+ base.guides.each do |guide|
9
+ ?>
10
+ <section>
11
+ <h3><a href="#{guide.href}">#{guide.title}</a></h3>
12
+
13
+ <?r if description = guide.description ?>
14
+ #{Markup.raw description.to_html}
15
+ <?r elsif documentation = guide.documentation ?>
16
+ #{base.format(documentation.text, language: guide.documentation.language)}
17
+ <?r else ?>
18
+ <p>No description.</p>
19
+ <?r end ?>
20
+ </section>
21
+ <?r
13
22
  end
14
23
  ?>
15
- </ul>
24
+ </section>
16
25
  </content:page>
@@ -9,6 +9,24 @@
9
9
  #{navigation.to_html}
10
10
  </aside>
11
11
  <div class="content">
12
+ <?r
13
+ previous_guide, next_guide = base.guides.related(guide)
14
+
15
+ if previous_guide or next_guide
16
+ ?>
17
+ <nav class="top">
18
+ <?r if previous_guide
19
+ ?><a href="#{previous_guide.href}" class="previous">← #{previous_guide.title}</a><?r
20
+ end
21
+
22
+ if next_guide
23
+ ?><a href="#{next_guide.href}" class="next">#{next_guide.title} →</a><?r
24
+ end ?>
25
+ </nav>
26
+ <?r
27
+ end
28
+ ?>
29
+
12
30
  <content:heading>#{guide.title}</content:heading>
13
31
 
14
32
  <?r
@@ -27,6 +45,21 @@
27
45
  end
28
46
  end
29
47
  ?>
48
+
49
+ <?r
50
+ if previous_guide or next_guide
51
+ ?>
52
+ <nav class="bottom">
53
+ <?r if previous_guide
54
+ ?><a href="#{previous_guide.href}" class="previous">← #{previous_guide.title}</a><?r
55
+ end
56
+
57
+ if next_guide
58
+ ?><a href="#{next_guide.href}" class="next">#{next_guide.title} →</a><?r
59
+ end ?>
60
+ </nav>
61
+ <?r
62
+ end
63
+ ?>
30
64
  </div>
31
- <script src="/_static/sidebar.js"></script>
32
65
  </content:page>
@@ -7,7 +7,6 @@
7
7
  <div class="content">
8
8
  #{Markup.raw document.to_html}
9
9
  </div>
10
- <script src="/_static/sidebar.js"></script>
11
10
  </content:page>
12
11
  <?r else ?>
13
12
  <content:page>
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Application Initialization
3
+ * Main entry point for client-side functionality
4
+ */
5
+
6
+ // Import dependencies:
7
+ import {Syntax} from '@socketry/syntax';
8
+ import mermaid from 'mermaid';
9
+ import {initializeSectionHeadingLinks} from './links.js';
10
+ import {SidebarNavigation} from './sidebar.js';
11
+
12
+ // Initialize Mermaid with theme detection:
13
+ const isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
14
+ const theme = isDarkMode ? 'dark' : 'default';
15
+ mermaid.initialize({startOnLoad: true, theme: theme});
16
+
17
+ // Initialize section self-links:
18
+ initializeSectionHeadingLinks();
19
+
20
+ // Initialize sidebar navigation:
21
+ SidebarNavigation.initialize();
22
+
23
+ // Initialize syntax highlighting:
24
+ await Syntax.highlight();
@@ -1,21 +1,23 @@
1
- jQuery(function() {
2
- $.each($('section[id]'), function(index, element) {
3
- let anchor = document.createElement('a');
4
-
5
- anchor.appendChild(
6
- document.createTextNode("¶")
7
- );
1
+ /**
2
+ * Section Heading Links
3
+ * Adds pilcrow () self-links to section headings for easy linking
4
+ */
5
+
6
+ export function initializeSectionHeadingLinks() {
7
+ const sections = document.querySelectorAll('section[id]');
8
+
9
+ sections.forEach(element => {
10
+ const anchor = document.createElement('a');
8
11
 
12
+ anchor.appendChild(document.createTextNode("¶"));
9
13
  anchor.href = "#" + element.id;
10
14
  anchor.className = "self";
11
15
 
12
- let heading = element.firstChild;
13
- anchor.title = heading.innerText;
14
-
15
- heading.appendChild(
16
- document.createTextNode(' ')
17
- );
18
-
19
- heading.appendChild(anchor);
16
+ const heading = element.firstChild;
17
+ if (heading) {
18
+ anchor.title = heading.innerText;
19
+ heading.appendChild(document.createTextNode(' '));
20
+ heading.appendChild(anchor);
21
+ }
20
22
  });
21
- });
23
+ }