updated the makefile, added new org files (2026), and started working on adding a search feature for the website.
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
output/
|
||||
backup/
|
||||
*~
|
||||
1
Makefile
1
Makefile
@@ -4,6 +4,7 @@
|
||||
all:
|
||||
@echo "Building project (full rebuild with search index)..."
|
||||
emacs -Q --script build-site.el
|
||||
python search-index-json.py
|
||||
|
||||
# Clean output directory
|
||||
clean:
|
||||
|
||||
3475
assets/scripts/lunr.js
Normal file
3475
assets/scripts/lunr.js
Normal file
File diff suppressed because it is too large
Load Diff
210
assets/scripts/search.js
Normal file
210
assets/scripts/search.js
Normal file
@@ -0,0 +1,210 @@
|
||||
let lunrIndex;
|
||||
let documents = [];
|
||||
|
||||
/* ------------------------------
|
||||
JSON → documents
|
||||
-------------------------------- */
|
||||
function extractDocuments(node, currentPath = "") {
|
||||
if (node.type === "folder" && node.children) {
|
||||
const nextPath = currentPath
|
||||
? `${currentPath}/${node.name}`
|
||||
: node.name;
|
||||
|
||||
node.children.forEach(child => {
|
||||
extractDocuments(child, nextPath);
|
||||
});
|
||||
}
|
||||
|
||||
if (node.type === "file") {
|
||||
const filePath = currentPath
|
||||
? `${currentPath}/${node.name}`
|
||||
: node.name;
|
||||
|
||||
documents.push({
|
||||
id: documents.length.toString(),
|
||||
title: node.name,
|
||||
content: node.content || "",
|
||||
path: "/" + filePath.replace(/^output\//, "")
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------
|
||||
Lunr index
|
||||
-------------------------------- */
|
||||
function buildIndex() {
|
||||
lunrIndex = lunr(function () {
|
||||
this.ref("id");
|
||||
this.field("title", { boost: 10 });
|
||||
this.field("content");
|
||||
|
||||
documents.forEach(doc => this.add(doc));
|
||||
});
|
||||
|
||||
console.log("Lunr index built with", documents.length, "documents");
|
||||
}
|
||||
|
||||
async function initSearch() {
|
||||
const response = await fetch("test.json");
|
||||
const json = await response.json();
|
||||
|
||||
extractDocuments(json);
|
||||
buildIndex();
|
||||
}
|
||||
|
||||
initSearch();
|
||||
|
||||
/* ------------------------------
|
||||
Fuzzy search
|
||||
-------------------------------- */
|
||||
function buildFuzzyQuery(query) {
|
||||
return query
|
||||
.split(/\s+/)
|
||||
.map(term => `${term}~1`)
|
||||
.join(" ");
|
||||
}
|
||||
|
||||
function search(query) {
|
||||
if (!lunrIndex) return [];
|
||||
|
||||
const results = lunrIndex.search(buildFuzzyQuery(query));
|
||||
|
||||
return results.map(r => {
|
||||
const doc = documents.find(d => d.id === r.ref);
|
||||
return {
|
||||
title: doc.title,
|
||||
path: doc.path,
|
||||
score: r.score,
|
||||
preview: doc.content.slice(0, 200) + "…"
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/* ------------------------------
|
||||
DOM elements
|
||||
-------------------------------- */
|
||||
const searchInput = document.getElementById("search-input");
|
||||
const searchBtn = document.getElementById("search-btn");
|
||||
|
||||
/* ------------------------------
|
||||
Live dropdown results
|
||||
-------------------------------- */
|
||||
const resultsBox = document.createElement("div");
|
||||
resultsBox.id = "search-results";
|
||||
document.body.appendChild(resultsBox);
|
||||
|
||||
function showResults(results) {
|
||||
resultsBox.innerHTML = "";
|
||||
|
||||
if (results.length === 0) {
|
||||
resultsBox.style.display = "none";
|
||||
return;
|
||||
}
|
||||
|
||||
const rect = searchInput.getBoundingClientRect();
|
||||
resultsBox.style.top = `${rect.bottom + window.scrollY}px`;
|
||||
resultsBox.style.left = `${rect.left + window.scrollX}px`;
|
||||
resultsBox.style.width = `${rect.width}px`;
|
||||
|
||||
results.slice(0, 5).forEach(result => {
|
||||
const item = document.createElement("div");
|
||||
item.className = "search-result";
|
||||
item.innerHTML = `
|
||||
<div class="search-result-title">${result.title}</div>
|
||||
<div class="search-result-preview">${result.preview}</div>
|
||||
`;
|
||||
item.onclick = () => window.location.href = result.path;
|
||||
resultsBox.appendChild(item);
|
||||
});
|
||||
|
||||
resultsBox.style.display = "block";
|
||||
}
|
||||
|
||||
searchInput.addEventListener("input", () => {
|
||||
const q = searchInput.value.trim();
|
||||
if (!q) {
|
||||
resultsBox.style.display = "none";
|
||||
return;
|
||||
}
|
||||
showResults(search(q));
|
||||
});
|
||||
|
||||
/* ------------------------------
|
||||
Modal popup
|
||||
-------------------------------- */
|
||||
const modal = document.createElement("div");
|
||||
modal.id = "search-modal";
|
||||
modal.innerHTML = `
|
||||
<div class="search-modal-backdrop"></div>
|
||||
<div class="search-modal-content">
|
||||
<h2>Search results</h2>
|
||||
<div id="search-modal-results"></div>
|
||||
</div>
|
||||
`;
|
||||
document.body.appendChild(modal);
|
||||
|
||||
const modalResults = modal.querySelector("#search-modal-results");
|
||||
|
||||
function openSearchModal(results) {
|
||||
modalResults.innerHTML = "";
|
||||
|
||||
if (results.length === 0) {
|
||||
modalResults.innerHTML = "<p>No results found.</p>";
|
||||
}
|
||||
|
||||
results.forEach(result => {
|
||||
const item = document.createElement("div");
|
||||
item.className = "search-modal-result";
|
||||
item.innerHTML = `
|
||||
<div class="search-modal-title">${result.title}</div>
|
||||
<div class="search-modal-preview">${result.preview}</div>
|
||||
`;
|
||||
item.onclick = () => window.location.href = result.path;
|
||||
modalResults.appendChild(item);
|
||||
});
|
||||
|
||||
modal.style.display = "block";
|
||||
}
|
||||
|
||||
/* ------------------------------
|
||||
Submit search (Enter / 🔍)
|
||||
-------------------------------- */
|
||||
function submitSearch() {
|
||||
const q = searchInput.value.trim();
|
||||
if (!q) return;
|
||||
openSearchModal(search(q));
|
||||
}
|
||||
|
||||
searchInput.addEventListener("keydown", e => {
|
||||
if (e.key === "Enter") {
|
||||
e.preventDefault();
|
||||
submitSearch();
|
||||
}
|
||||
});
|
||||
|
||||
searchBtn.addEventListener("click", submitSearch);
|
||||
|
||||
/* ------------------------------
|
||||
Close behaviours
|
||||
-------------------------------- */
|
||||
document.addEventListener("click", e => {
|
||||
if (
|
||||
!resultsBox.contains(e.target) &&
|
||||
e.target !== searchInput &&
|
||||
e.target !== searchBtn
|
||||
) {
|
||||
resultsBox.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
modal.addEventListener("click", e => {
|
||||
if (e.target.classList.contains("search-modal-backdrop")) {
|
||||
modal.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener("keydown", e => {
|
||||
if (e.key === "Escape") {
|
||||
modal.style.display = "none";
|
||||
}
|
||||
});
|
||||
@@ -225,3 +225,123 @@ time.countdown.expired {
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
/* Make nav a flex container */
|
||||
nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
/* Push search to the far right */
|
||||
#search-input,
|
||||
#search-btn {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
/* Input styling */
|
||||
#search-input {
|
||||
width: 12rem;
|
||||
padding: 0.3rem 0.5rem;
|
||||
font-size: 0.9rem;
|
||||
border: 1px solid var(--border-color, #ccc);
|
||||
border-radius: 4px;
|
||||
background: var(--bg-color, #fff);
|
||||
color: var(--text-color, #000);
|
||||
}
|
||||
|
||||
/* Button styling */
|
||||
#search-btn {
|
||||
margin-left: 0;
|
||||
background: none;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
/* Focus state */
|
||||
#search-input:focus {
|
||||
outline: 2px solid var(--accent-color, #5b8cff);
|
||||
}
|
||||
@media (max-width: 700px) {
|
||||
#search-input {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#search-btn {
|
||||
font-size: 1.4rem;
|
||||
padding: 0.2rem;
|
||||
}
|
||||
}
|
||||
#search-results {
|
||||
position: absolute;
|
||||
max-height: 60vh;
|
||||
overflow-y: auto;
|
||||
background: var(--bg-color, #fff);
|
||||
border: 1px solid var(--border-color, #ccc);
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 8px 20px rgba(0,0,0,0.12);
|
||||
display: none;
|
||||
z-index: 9999;
|
||||
}
|
||||
.search-result {
|
||||
padding: 0.6rem 0.8rem;
|
||||
cursor: pointer;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.search-result:hover {
|
||||
background: var(--accent-bg, #f2f6ff);
|
||||
}
|
||||
|
||||
.search-result-title {
|
||||
font-weight: 600;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.search-result-preview {
|
||||
font-size: 0.75rem;
|
||||
color: #666;
|
||||
}
|
||||
#search-modal {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
display: none;
|
||||
z-index: 10000;
|
||||
}
|
||||
|
||||
.search-modal-backdrop {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: rgba(0,0,0,0.45);
|
||||
}
|
||||
|
||||
.search-modal-content {
|
||||
position: relative;
|
||||
max-width: 700px;
|
||||
margin: 10vh auto;
|
||||
padding: 1.2rem;
|
||||
background: var(--bg-color, #fff);
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 20px 60px rgba(0,0,0,0.25);
|
||||
max-height: 70vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.search-modal-result {
|
||||
padding: 0.8rem;
|
||||
border-bottom: 1px solid #eee;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.search-modal-result:hover {
|
||||
background: var(--accent-bg, #f2f6ff);
|
||||
}
|
||||
|
||||
.search-modal-title {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.search-modal-preview {
|
||||
font-size: 0.85rem;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#+TITLE: [21-12-2025] - Weekly Review
|
||||
#+OPTIONS: num:nil
|
||||
#+DATE: <2025-12-21 Sun 12:12>
|
||||
#+filetags: :review:
|
||||
#+WIP: t
|
||||
#+COMMENTS: t
|
||||
#+SLUG: 21-12-25-week-review
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@ See the categories: @@html:<a href="../../categories.html">Categories</a>@@
|
||||
* 2025
|
||||
|
||||
** December 2025
|
||||
- [[file:12-december/21-12-week-review.org][21-12-week-review]] @@html:<span class="post-date">30-12-2025 10:14</span>@@
|
||||
- [[file:12-december/28-12-week-review.org][[28-12-2025] - Weekly Review]] @@html:<span class="post-date">28-12-2025 12:12</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@
|
||||
- [[file:12-december/21-12-week-review.org][[21-12-2025] - Weekly Review]] @@html:<span class="post-date">21-12-2025 12:12</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@
|
||||
- [[file:12-december/14-12-week-review.org][[14-12-2025] - Weekly Review]] @@html:<span class="post-date">09-12-2025 12:12</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@
|
||||
- [[file:12-december/07-12-week-review.org][[07-12-2025] - Weekly Review]] @@html:<span class="post-date">07-12-2025 20:34</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@
|
||||
|
||||
|
||||
@@ -13,6 +13,6 @@
|
||||
- +Research the xcom thing, and find out what a parquet is and how to use it+
|
||||
- <2025-12-30 Tue>
|
||||
- +Finish off the conversion for the parquets (xcom -> parquet)+
|
||||
- Run a full version with no caps
|
||||
- fix all the tests
|
||||
- +Run a full version with no caps+ -> There are some errors that need to be fixed
|
||||
- +fix all the tests+
|
||||
- +create a PR for the datamart+
|
||||
|
||||
9
blogs/2026/2026-list.org
Normal file
9
blogs/2026/2026-list.org
Normal file
@@ -0,0 +1,9 @@
|
||||
#+TITLE: 2026 List
|
||||
#+OPTIONS: toc:nil num:nil
|
||||
|
||||
See the categories: @@html:<a href="../../categories.html">Categories</a>@@
|
||||
|
||||
* 2026
|
||||
|
||||
** January 2026
|
||||
- [[file:01-january/04-01-week-review.org][[04-01-2026] - Weekly Review]] @@html:<span class="post-date">04-01-2026 12:12</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@
|
||||
@@ -5,9 +5,10 @@ See the categories: @@html:<a href="../categories.html">Categories</a>@@
|
||||
|
||||
* Blogs:
|
||||
- [[file:2026/01-january/04-01-week-review.org][[04-01-2026] - Weekly Review]] @@html:<span class="post-date">04-01-2026 12:12</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@
|
||||
- [[file:2025/2025-list.org][2025 List]] @@html:<span class="post-date">30-12-2025 18:24</span>@@
|
||||
- [[file:2025/12-december/21-12-week-review.org][21-12-week-review]] @@html:<span class="post-date">30-12-2025 10:14</span>@@
|
||||
- [[file:2026/2026-list.org][2026 List]] @@html:<span class="post-date">30-12-2025 22:33</span>@@
|
||||
- [[file:2025/2025-list.org][2025 List]] @@html:<span class="post-date">30-12-2025 22:33</span>@@
|
||||
- [[file:2025/12-december/28-12-week-review.org][[28-12-2025] - Weekly Review]] @@html:<span class="post-date">28-12-2025 12:12</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@
|
||||
- [[file:2025/12-december/21-12-week-review.org][[21-12-2025] - Weekly Review]] @@html:<span class="post-date">21-12-2025 12:12</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@
|
||||
- [[file:2025/12-december/14-12-week-review.org][[14-12-2025] - Weekly Review]] @@html:<span class="post-date">09-12-2025 12:12</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@
|
||||
- [[file:2025/12-december/07-12-week-review.org][[07-12-2025] - Weekly Review]] @@html:<span class="post-date">07-12-2025 20:34</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@
|
||||
- [[file:2025/11-november/30-11-week-review.org][[30-11-2025] - Weekly Review]] @@html:<span class="post-date">30-11-2025 17:09</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@
|
||||
|
||||
@@ -49,10 +49,12 @@
|
||||
<link rel=\"stylesheet\" href=\"/assets/styles/media.css\" />
|
||||
|
||||
<script src=\"/assets/scripts/script.js\" defer></script>
|
||||
<script src=\"/assets/scripts/lunr.js\" defer></script>
|
||||
<script src=\"/assets/scripts/competency-status-board.js\" defer></script>
|
||||
<script src=\"/assets/scripts/notes.js\" defer></script>
|
||||
<script src=\"/assets/scripts/comments.js\" defer></script>
|
||||
<script src=\"/assets/scripts/bigger-picture.min.js\" defer></script>
|
||||
<script src=\"/assets/scripts/search.js\" defer></script>
|
||||
<script src=\"/assets/scripts/svg-pan-zoom.min.js\" defer></script>
|
||||
<script src=\"/assets/scripts/gallery-init.js\" defer></script>
|
||||
"
|
||||
@@ -85,6 +87,10 @@
|
||||
<a href=\"/blogs/blogs-list.html\">Blogs | </a>
|
||||
<a href=\"/posts/career/career-list.html\">Career | </a>
|
||||
<a href=\"/home/services.html\">Services</a>
|
||||
|
||||
|
||||
<input type=\"search\\\" id=\"search-input\" placeholder=\"Search…\" aria-label=\"Search notes\" />
|
||||
<button id=\"search-btn\" aria-label=\"Search\">🔍</button>
|
||||
</nav>
|
||||
<button class=\"theme-toggle\" id=\"theme-toggle\" type=\"button\" aria-label=\"Toggle dark mode\">🌗 Theme</button>
|
||||
|
||||
@@ -319,6 +325,25 @@ A file has comments if:
|
||||
:sitemap-sort-files anti-chronologically
|
||||
:html-head ,z-shared-head
|
||||
)
|
||||
("org-2026"
|
||||
:base-directory "~/master-folder/org_files/org_web/blogs/2026/"
|
||||
:publishing-directory "~/master-folder/org_files/org_web/output/blogs/2026/"
|
||||
:recursive t
|
||||
:base-extension "org"
|
||||
:publishing-function z/z-publish-to-html
|
||||
:with-author nil
|
||||
:with-creator nil
|
||||
:html-validation-link nil
|
||||
:html-preamble ,z-preamble
|
||||
:html-postamble ,z-postamble
|
||||
:auto-sitemap t
|
||||
:sitemap-filename "2026-list.org"
|
||||
:sitemap-title "2026 List"
|
||||
:sitemap-style list
|
||||
:sitemap-function z/2026-sitemap
|
||||
:sitemap-sort-files anti-chronologically
|
||||
:html-head ,z-shared-head
|
||||
)
|
||||
("org-career"
|
||||
:base-directory "~/master-folder/org_files/org_web/posts/career/"
|
||||
:publishing-directory "~/master-folder/org_files/org_web/output/posts/career/"
|
||||
|
||||
@@ -10,5 +10,5 @@
|
||||
- [[file:tags/maths.org][@@html:<span class="post-tag">maths</span>@@]] (1)
|
||||
- [[file:tags/notes.org][@@html:<span class="post-tag">notes</span>@@]] (11)
|
||||
- [[file:tags/reading.org][@@html:<span class="post-tag">reading</span>@@]] (1)
|
||||
- [[file:tags/review.org][@@html:<span class="post-tag">review</span>@@]] (11)
|
||||
- [[file:tags/review.org][@@html:<span class="post-tag">review</span>@@]] (12)
|
||||
- [[file:tags/website.org][@@html:<span class="post-tag">website</span>@@]] (2)
|
||||
@@ -171,6 +171,61 @@
|
||||
|
||||
output))
|
||||
|
||||
(defun z/2026-sitemap (title list)
|
||||
"Sitemap that lists 2026 blogs grouped by month, with dates and FILETAGS."
|
||||
(let ((output (concat
|
||||
"#+TITLE: " title "\n"
|
||||
"#+OPTIONS: toc:nil num:nil \n\n"
|
||||
"See the categories: @@html:<a href=\"../../categories.html\">Categories</a>@@\n\n"
|
||||
"* 2026\n"))
|
||||
(current-month nil))
|
||||
|
||||
(dolist (entry (cdr list))
|
||||
(when (consp entry)
|
||||
(let* ((link (car entry))
|
||||
(filename (if (string-match "\\[\\[file:\\([^]]+\\)\\]" link)
|
||||
(match-string 1 link)
|
||||
link))
|
||||
(full-path (expand-file-name
|
||||
filename
|
||||
"~/master-folder/org_files/org_web/blogs/2026/"))
|
||||
(date (when (file-exists-p full-path)
|
||||
(org-publish-find-date full-path org-publish-project-alist)))
|
||||
(date-str (if date
|
||||
(format-time-string "%d-%m-%Y %H:%M" date)
|
||||
"no date"))
|
||||
(month-str (if date
|
||||
(format-time-string "%B %Y" date)
|
||||
"No date"))
|
||||
(tags-str ""))
|
||||
|
||||
(when (file-exists-p full-path)
|
||||
(with-temp-buffer
|
||||
(insert-file-contents full-path)
|
||||
(org-mode)
|
||||
(let ((tags (cadr (assoc "FILETAGS"
|
||||
(org-collect-keywords '("FILETAGS"))))))
|
||||
(when tags
|
||||
(setq tags-str
|
||||
(mapconcat
|
||||
(lambda (tag)
|
||||
(format "@@html:<a href=\"/tags/%s.html\"> \
|
||||
<span class=\"post-tag\">%s</span> </a>@@" tag tag))
|
||||
(split-string tags ":" t)
|
||||
" "))))))
|
||||
|
||||
(unless (equal month-str current-month)
|
||||
(setq current-month month-str)
|
||||
(setq output (concat output "\n** " month-str "\n")))
|
||||
|
||||
(setq output
|
||||
(concat output
|
||||
(format "- %s @@html:<span class=\"post-date\">%s</span>@@ %s\n"
|
||||
link date-str tags-str))))))
|
||||
|
||||
output))
|
||||
|
||||
|
||||
|
||||
(defun z/career-sitemap (title list)
|
||||
"Sitemap that lists careers posts grouped by month, with dates and FILETAGS."
|
||||
@@ -183,12 +238,9 @@
|
||||
))
|
||||
(current-month nil))
|
||||
|
||||
;; `list` is what org-publish passes in; we skip its car (top-level title node)
|
||||
(dolist (entry (cdr list))
|
||||
;; In this setup each ENTRY is usually (LINK . OTHER-STUFF)
|
||||
(when (consp entry)
|
||||
(let* ((link (car entry))
|
||||
;; Extract relative filename from the [[file:...][...]] link
|
||||
(filename (if (string-match "\\[\\[file:\\([^]]+\\)\\]" link)
|
||||
(match-string 1 link)
|
||||
link))
|
||||
@@ -205,7 +257,6 @@
|
||||
"No date"))
|
||||
(tags-str ""))
|
||||
|
||||
;; Collect FILETAGS from the file
|
||||
(when (file-exists-p full-path)
|
||||
(with-temp-buffer
|
||||
(insert-file-contents full-path)
|
||||
@@ -226,7 +277,6 @@
|
||||
(setq current-month month-str)
|
||||
(setq output (concat output "\n** " month-str "\n")))
|
||||
|
||||
;; Insert the actual entry
|
||||
(setq output
|
||||
(concat output
|
||||
(format "- %s @@html:<span class=\"post-date\">%s</span>@@ %s\n"
|
||||
|
||||
@@ -2,11 +2,16 @@
|
||||
#+date: <2025-11-05 wed 20:46>
|
||||
#+OPTIONS: num:nil tags:t toc:t
|
||||
#+filetags: :learning:notes:
|
||||
#+WIP: t
|
||||
#+WIP:
|
||||
#+COMMENTS: t
|
||||
#+SLUG: lean
|
||||
|
||||
* What Lean aims to do
|
||||
|
||||
Deliver more value with less waste by shortening feedback loops, improving flow, and continually learning.
|
||||
- Lean is a management philosophy focused on **maximising value** for the customer while **minimising waste**.
|
||||
- It originated from the **Toyota Production System** in manufacturing.
|
||||
- The core goal is to **do more with less** (time, effort, resources, cost).
|
||||
- Lean identifies and eliminates **non-value-adding activities** (waste).
|
||||
- Common waste types include overproduction, waiting, defects, and excess motion.
|
||||
- It emphasises **continuous improvement** (*kaizen*).
|
||||
- Decision-making is driven by **customer value** and real-world process data.
|
||||
- Lean promotes **efficient flow**, standardised work, and empowered teams.
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
See the categories: @@html:<a href="../categories.html">Categories</a>@@
|
||||
|
||||
* Posts:
|
||||
- [[file:career/career-list.org][Career List]] @@html:<span class="post-date">30-12-2025 18:24</span>@@
|
||||
- [[file:career/career-list.org][Career List]] @@html:<span class="post-date">30-12-2025 22:33</span>@@
|
||||
- [[file:career/probation-objectives.org][Probation Objectives:]] @@html:<span class="post-date">08-12-2025 17:55</span>@@ @@html:<a href="/tags/review.html"> <span class="post-tag">review</span> </a>@@ @@html:<a href="/tags/notes.html"> <span class="post-tag">notes</span> </a>@@
|
||||
- [[file:career/airflow.org][Datamarts, Airflow and DAG's]] @@html:<span class="post-date">15-11-2025 18:37</span>@@ @@html:<a href="/tags/learning.html"> <span class="post-tag">learning</span> </a>@@ @@html:<a href="/tags/notes.html"> <span class="post-tag">notes</span> </a>@@
|
||||
- [[file:career/normalisation.org][Benefits of Normalisation]] @@html:<span class="post-date">10-11-2025 18:04</span>@@ @@html:<a href="/tags/learning.html"> <span class="post-tag">learning</span> </a>@@ @@html:<a href="/tags/notes.html"> <span class="post-tag">notes</span> </a>@@
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
#+OPTIONS: toc:nil num:nil
|
||||
|
||||
* Recently Updated (top 26 files - per lima's request)
|
||||
- [[file:blogs/2026/01-january/04-01-week-review.org][[04-01-2026] - Weekly Review]] @@html:<span class="post-date">2025-12-30 15:10</span>@@
|
||||
- [[file:posts/career/lean.org][Lean]] @@html:<span class="post-date">2025-12-30 21:04</span>@@
|
||||
- [[file:blogs/2026/01-january/04-01-week-review.org][[04-01-2026] - Weekly Review]] @@html:<span class="post-date">2025-12-30 19:28</span>@@
|
||||
- [[file:blogs/2025/12-december/21-12-week-review.org][[21-12-2025] - Weekly Review]] @@html:<span class="post-date">2025-12-30 18:47</span>@@
|
||||
- [[file:blogs/2025/12-december/28-12-week-review.org][[28-12-2025] - Weekly Review]] @@html:<span class="post-date">2025-12-30 10:15</span>@@
|
||||
- [[file:blogs/2025/12-december/21-12-week-review.org][21-12-week-review]] @@html:<span class="post-date">2025-12-30 10:14</span>@@
|
||||
- [[file:posts/career/probation-objectives.org][Probation Objectives:]] @@html:<span class="post-date">2025-12-29 08:11</span>@@
|
||||
- [[file:home/backlog.org][Backlog]] @@html:<span class="post-date">2025-12-18 22:43</span>@@
|
||||
- [[file:home/notes.org][Notes]] @@html:<span class="post-date">2025-12-18 22:30</span>@@
|
||||
@@ -17,7 +18,6 @@
|
||||
- [[file:posts/career/owasp.org][OWASP Top Ten]] @@html:<span class="post-date">2025-12-16 21:43</span>@@
|
||||
- [[file:posts/career/normalisation.org][Benefits of Normalisation]] @@html:<span class="post-date">2025-12-16 21:43</span>@@
|
||||
- [[file:posts/career/management-of-self.org][Management of self training]] @@html:<span class="post-date">2025-12-16 21:43</span>@@
|
||||
- [[file:posts/career/lean.org][Lean]] @@html:<span class="post-date">2025-12-16 21:43</span>@@
|
||||
- [[file:posts/career/invest-principles.org][Invest Principles]] @@html:<span class="post-date">2025-12-16 21:43</span>@@
|
||||
- [[file:posts/career/career-intro.org][Career Introduction]] @@html:<span class="post-date">2025-12-16 21:42</span>@@
|
||||
- [[file:posts/career/airflow.org][Datamarts, Airflow and DAG's]] @@html:<span class="post-date">2025-12-16 21:42</span>@@
|
||||
|
||||
64
search-index-json.py
Normal file
64
search-index-json.py
Normal file
@@ -0,0 +1,64 @@
|
||||
import os
|
||||
import json
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
def strip_html_tags(html):
|
||||
soup = BeautifulSoup(html, "html.parser")
|
||||
|
||||
# Remove script and style elements completely
|
||||
for tag in soup(["script", "style"]):
|
||||
tag.decompose()
|
||||
|
||||
# Extract plain text
|
||||
text = soup.get_text(separator="\n")
|
||||
|
||||
# Clean up whitespace
|
||||
lines = [line.strip() for line in text.splitlines() if line.strip()]
|
||||
return "\n".join(lines)
|
||||
|
||||
def create_folder_structure_json(path):
|
||||
result = {
|
||||
'name': os.path.basename(path),
|
||||
'type': 'folder',
|
||||
'children': []
|
||||
}
|
||||
|
||||
if not os.path.isdir(path):
|
||||
return result
|
||||
|
||||
for entry in os.listdir(path):
|
||||
entry_path = os.path.join(path, entry)
|
||||
|
||||
if os.path.isdir(entry_path):
|
||||
result['children'].append(
|
||||
create_folder_structure_json(entry_path)
|
||||
)
|
||||
|
||||
elif entry.lower().endswith('.html'):
|
||||
file_entry = {
|
||||
'name': entry,
|
||||
'type': 'file',
|
||||
'content': None
|
||||
}
|
||||
|
||||
try:
|
||||
with open(entry_path, 'r', encoding='utf-8') as f:
|
||||
html = f.read()
|
||||
file_entry['content'] = strip_html_tags(html)
|
||||
|
||||
except Exception as e:
|
||||
file_entry['content'] = f"<unreadable: {e}>"
|
||||
|
||||
result['children'].append(file_entry)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
folder_path = 'output/'
|
||||
folder_json = create_folder_structure_json(folder_path)
|
||||
|
||||
output_file = 'output/test.json'
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(folder_json, f, indent=4, ensure_ascii=False)
|
||||
|
||||
print("JSON saved to", output_file)
|
||||
24
sitemap.org
24
sitemap.org
@@ -41,6 +41,12 @@
|
||||
- [[file:blogs/blogs-list.org][Blogs List]]
|
||||
- 2025
|
||||
- [[file:blogs/2025/2025-list.org][2025 List]]
|
||||
- 11-november
|
||||
- [[file:blogs/2025/11-november/02-11-week-review.org][[02-11-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/11-november/09-11-week-review.org][[09-11-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/11-november/16-11-week-review.org][[16-11-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/11-november/23-11-week-review.org][[23-11-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/11-november/30-11-week-review.org][[30-11-2025] - Weekly Review]]
|
||||
- 08-august
|
||||
- [[file:blogs/2025/08-august/zettelkasten.org][Zettelkasten Method]]
|
||||
- [[file:blogs/2025/08-august/wacom-with-arch.org][Wacom With Arch]]
|
||||
@@ -49,17 +55,15 @@
|
||||
- [[file:blogs/2025/08-august/hilberts.hotel.org][Hilbert's Hotel]]
|
||||
- [[file:blogs/2025/08-august/benefits-of-reading.org][Benefits of Reading]]
|
||||
- [[file:blogs/2025/08-august/third-time.org][Third Time]]
|
||||
- 11-november
|
||||
- [[file:blogs/2025/11-november/02-11-week-review.org][[02-11-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/11-november/09-11-week-review.org][[09-11-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/11-november/16-11-week-review.org][[16-11-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/11-november/23-11-week-review.org][[23-11-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/11-november/30-11-week-review.org][[30-11-2025] - Weekly Review]]
|
||||
- 12-december
|
||||
- [[file:blogs/2025/12-december/07-12-week-review.org][[07-12-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/12-december/14-12-week-review.org][[14-12-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/12-december/21-12-week-review.org][[21-12-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/12-december/28-12-week-review.org][[28-12-2025] - Weekly Review]]
|
||||
- [[file:blogs/2025/12-december/21-12-week-review.org][21-12-week-review]]
|
||||
- 2026
|
||||
- [[file:blogs/2026/2026-list.org][2026 List]]
|
||||
- 01-january
|
||||
- [[file:blogs/2026/01-january/04-01-week-review.org][[04-01-2026] - Weekly Review]]
|
||||
- books
|
||||
- [[file:books/books-list.org][Books List]]
|
||||
- clean-code
|
||||
@@ -67,11 +71,11 @@
|
||||
- tags
|
||||
- [[file:tags/learning.org][Tag: learning]]
|
||||
- [[file:tags/introduction.org][Tag: introduction]]
|
||||
- [[file:tags/education.org][Tag: education]]
|
||||
- [[file:tags/website.org][Tag: website]]
|
||||
- [[file:tags/notes.org][Tag: notes]]
|
||||
- [[file:tags/review.org][Tag: review]]
|
||||
- [[file:tags/emacs.org][Tag: emacs]]
|
||||
- [[file:tags/education.org][Tag: education]]
|
||||
- [[file:tags/website.org][Tag: website]]
|
||||
- [[file:tags/reading.org][Tag: reading]]
|
||||
- [[file:tags/maths.org][Tag: maths]]
|
||||
- [[file:tags/insights.org][Tag: insights]]
|
||||
- [[file:tags/maths.org][Tag: maths]]
|
||||
@@ -4,6 +4,7 @@
|
||||
* Posts tagged review
|
||||
- [[file:../blogs/2026/01-january/04-01-week-review.org][[04-01-2026] - Weekly Review]]
|
||||
- [[file:../blogs/2025/12-december/28-12-week-review.org][[28-12-2025] - Weekly Review]]
|
||||
- [[file:../blogs/2025/12-december/21-12-week-review.org][[21-12-2025] - Weekly Review]]
|
||||
- [[file:../blogs/2025/12-december/14-12-week-review.org][[14-12-2025] - Weekly Review]]
|
||||
- [[file:../posts/career/probation-objectives.org][Probation Objectives:]]
|
||||
- [[file:../blogs/2025/12-december/07-12-week-review.org][[07-12-2025] - Weekly Review]]
|
||||
|
||||
2
wip.org
2
wip.org
@@ -4,6 +4,6 @@
|
||||
* Work in progress
|
||||
- [[file:blogs/2026/01-january/04-01-week-review.org][[04-01-2026] - Weekly Review]] @@html:<span class="post-date">04-01-2026 12:12</span>@@
|
||||
- [[file:blogs/2025/12-december/28-12-week-review.org][[28-12-2025] - Weekly Review]] @@html:<span class="post-date">28-12-2025 12:12</span>@@
|
||||
- [[file:blogs/2025/12-december/21-12-week-review.org][[21-12-2025] - Weekly Review]] @@html:<span class="post-date">21-12-2025 12:12</span>@@
|
||||
- [[file:posts/career/probation-objectives.org][Probation Objectives:]] @@html:<span class="post-date">08-12-2025 17:55</span>@@
|
||||
- [[file:posts/career/invest-principles.org][Invest Principles]] @@html:<span class="post-date">06-11-2025 21:08</span>@@
|
||||
- [[file:posts/career/lean.org][Lean]] @@html:<span class="post-date">05-11-2025 20:46</span>@@
|
||||
Reference in New Issue
Block a user