Almirah 0.1.8 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,61 @@
1
+ function openNav() {
2
+ document.getElementById("nav_pane").style.visibility = "visible";
3
+ }
4
+
5
+ function closeNav() {
6
+ document.getElementById("nav_pane").style.visibility = "hidden";
7
+ }
8
+
9
+ window.onload = (event) => {
10
+ for (var i = 0, n = document.images.length; i < n; i++)
11
+ {
12
+ elem = document.images[i];
13
+ if (elem.width > 640)
14
+ {
15
+ elem.style.width = "640px";
16
+ }
17
+ }
18
+ if ((document.title == "Document Index") && (document.URL.includes('http'))){
19
+ document.getElementById("searchInput").style.display = "block";
20
+ }
21
+ // Scroll a bit to make navigated anchor visible
22
+ //setTimeout(function() {
23
+ // window.scrollBy({
24
+ // top: -40,
25
+ // behavior: "smooth"
26
+ // });
27
+ // }, 200);
28
+ };
29
+
30
+ function downlink_OnClick(clicked){
31
+ clicked.style.display = 'none';
32
+ id_parts = clicked.id.split("_");
33
+ required_id = "DLS_" + id_parts[1];
34
+ document.getElementById(required_id).style.display = 'block';
35
+ }
36
+
37
+ function navigate_to_home(){
38
+ if (document.title != "Document Index")
39
+ {
40
+ window.location.href = "./../../index.html";
41
+ }else{
42
+ window.location.href = "./index.html";
43
+ }
44
+ }
45
+
46
+ // Modal window for image zoom
47
+ function image_OnClick(clicked){
48
+
49
+ var modal = document.getElementById('image_modal_div');
50
+ var modalImg = document.getElementById("modal_image_id");
51
+ var captionText = document.getElementById("modal_image_caption");
52
+
53
+ modal.style.display = "block";
54
+ modalImg.src = clicked.src;
55
+ captionText.innerHTML = clicked.alt;
56
+ }
57
+
58
+ function modal_close_OnClick(clicked){
59
+ var modal = document.getElementById('image_modal_div');
60
+ modal.style.display = "none";
61
+ }
@@ -0,0 +1,136 @@
1
+ // Do search only on the Index Page
2
+ import { create, search, insert } from 'https://unpkg.com/@orama/orama@latest/dist/index.js'
3
+
4
+ // Create DB
5
+ const db = await create({
6
+ schema: {
7
+ doc_title: 'string',
8
+ doc_color: 'string',
9
+ text: 'string',
10
+ heading_url: 'string',
11
+ heading_text: 'string'
12
+ }
13
+ })
14
+ // Load JSON DB
15
+ const response = await fetch("/data/specifications_db.json");
16
+ const data_rows = await response.json();
17
+ let i = 0;
18
+ while (i < data_rows.length) {
19
+ await insert(db, {
20
+ document: data_rows[i]["document"],
21
+ doc_color: data_rows[i]["doc_color"],
22
+ text: data_rows[i]["text"],
23
+ heading_url: data_rows[i]["heading_url"],
24
+ heading_text: data_rows[i]["heading_text"]
25
+ })
26
+ i++;
27
+ }
28
+
29
+ // Main db search function
30
+ async function search_onKeyUp(){
31
+
32
+ const search_input_text = document.getElementById("searchInput").value;
33
+ // Close drop down when empty
34
+ if ( search_input_text == ''){
35
+ document.getElementById("search_dropdown").style.display = "none";
36
+ }else{
37
+ document.getElementById("search_dropdown").style.display = "block";
38
+ }
39
+
40
+ const searchResult = await search(db, {
41
+ term: search_input_text,
42
+ properties: ['text', 'heading_text'],
43
+ exact: true,
44
+ });
45
+ if (searchResult == null){
46
+ return;
47
+ }
48
+ //console.log(searchResult.hits.map((hit) => hit.document));
49
+
50
+ // clear previous search
51
+ const myNode = document.getElementById("search_dropdown");
52
+ while (myNode.firstChild) {
53
+ myNode.removeChild(myNode.lastChild);
54
+ }
55
+
56
+ if (searchResult.count == 0){
57
+
58
+ const node = document.createElement("div");
59
+ node.classList.add('search-item');
60
+ const textnode = document.createTextNode("There are no matches found");
61
+ node.appendChild(textnode);
62
+ myNode.appendChild(node);
63
+
64
+ }else{
65
+
66
+ searchResult.hits.forEach ((value, index, array) =>{
67
+ const doc_title = value.document["document"]
68
+ const doc_color = value.document["doc_color"]
69
+ const heading_url = value.document["heading_url"]
70
+ const heading_text = value.document["heading_text"]
71
+ const search_text = value.document["text"]
72
+
73
+ const node_div = document.createElement("div");
74
+ node_div.classList.add('search-item');
75
+
76
+ const table = document.createElement("table");
77
+ table.classList.add('search-result-table');
78
+ node_div.appendChild(table);
79
+
80
+ const tbody = document.createElement("tbody");
81
+ table.appendChild(tbody);
82
+
83
+ // Row 1
84
+ let row = document.createElement("tr");
85
+ let cell = document.createElement("td");
86
+ let i = document.createElement("i");
87
+ i.classList.add("fa","fa-file-text-o");
88
+ i.style.backgroundColor = "#" + doc_color;
89
+ cell.appendChild(i);
90
+ let textnode = document.createTextNode("\xa0" + doc_title);
91
+ cell.appendChild(textnode);
92
+ row.appendChild(cell)
93
+ cell = document.createElement("td");
94
+
95
+ const a = document.createElement('a');
96
+ const link = document.createTextNode(heading_text)
97
+ a.appendChild(link);
98
+ a.title = heading_text;
99
+ a.href = heading_url;
100
+ document.body.appendChild(a);
101
+
102
+ cell.appendChild(a);
103
+ row.appendChild(cell)
104
+ tbody.appendChild(row)
105
+
106
+ // Row 2
107
+ row = document.createElement("tr");
108
+ cell = document.createElement("td");
109
+ cell.colSpan = 2;
110
+ let show_text_parts = search_text.split(" ", 10).join(" ");
111
+ textnode = document.createTextNode(show_text_parts);
112
+ cell.appendChild(textnode)
113
+ row.appendChild(cell)
114
+ tbody.appendChild(row)
115
+
116
+ myNode.appendChild(node_div);
117
+ })
118
+ }
119
+ }
120
+
121
+
122
+ document.getElementById("searchInput").addEventListener("keyup", search_onKeyUp);
123
+
124
+ // Show when focus in
125
+ document.getElementById("searchInput").addEventListener("focusin", (event) => {
126
+ // clear previous search
127
+ const element = document.getElementById("search_dropdown");
128
+ while (element.firstChild) {
129
+ element.removeChild(element.lastChild);
130
+ }
131
+ // show
132
+ const rect = document.getElementById("searchInput").getBoundingClientRect();
133
+ element.style.left = rect.left +'px';
134
+ element.style.top = rect.top + rect.height + 4 +'px';
135
+ element.style.display = "block";
136
+ });
data/lib/almirah.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "thor"
2
2
  require_relative "almirah/project"
3
+ require_relative "almirah/project_configuration"
3
4
 
4
5
  class CLI < Thor
5
6
  option :results
@@ -25,7 +26,8 @@ class Almirah
25
26
  attr_accessor :project
26
27
 
27
28
  def initialize(project_folder)
28
- @project = Project.new project_folder
29
+ config = ProjectConfiguration.new project_folder
30
+ @project = Project.new config
29
31
  end
30
32
 
31
33
  def getGemRoot()
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Almirah
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleksandr Ivanov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-19 00:00:00.000000000 Z
11
+ date: 2024-06-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: The software part of the Almirah framework
14
14
  email: oleksandr.ivanov.development@gmail.com
@@ -44,7 +44,13 @@ files:
44
44
  - lib/almirah/dom/document.rb
45
45
  - lib/almirah/navigation_pane.rb
46
46
  - lib/almirah/project.rb
47
+ - lib/almirah/project_configuration.rb
48
+ - lib/almirah/search/specifications_db.rb
49
+ - lib/almirah/templates/css/main.css
50
+ - lib/almirah/templates/css/search.css
47
51
  - lib/almirah/templates/page.html
52
+ - lib/almirah/templates/scripts/main.js
53
+ - lib/almirah/templates/scripts/orama_search.js
48
54
  homepage: http://almirah.site
49
55
  licenses:
50
56
  - MIT