Merge pull request #27 from gamosoft/features/various-fixes

- dependencies pinned to concrete version numbers to avoid issues
- when dragging a note with a blank/space in the name, link is now created correctly escaping the text
- deleting the only note in a folder will not attempt to delete the parent folder anymore
This commit is contained in:
Gamosoft 2025-11-19 10:23:21 +01:00 committed by GitHub
commit 7253a1988f
4 changed files with 79 additions and 30 deletions

View File

@ -225,11 +225,7 @@ def delete_note(notes_dir: str, note_path: str) -> bool:
full_path.unlink() full_path.unlink()
# Remove empty parent directories # Note: We don't automatically delete empty folders to preserve user's folder structure
try:
full_path.parent.rmdir()
except OSError:
pass # Directory not empty, that's fine
return True return True

View File

@ -7,8 +7,8 @@
<!-- Primary Meta Tags --> <!-- Primary Meta Tags -->
<title>NoteDiscovery - Your Self-Hosted Knowledge Base</title> <title>NoteDiscovery - Your Self-Hosted Knowledge Base</title>
<meta name="title" content="NoteDiscovery - Your Self-Hosted Knowledge Base"> <meta name="title" content="NoteDiscovery - Your Self-Hosted Knowledge Base">
<meta name="description" content="A lightweight, privacy-focused note-taking application. Self-hosted, free, and open source. Write, organize, and discover your notes with markdown support."> <meta name="description" content="A lightweight, privacy-focused Markdown note-taking application with LaTeX math, Mermaid diagrams, and code highlighting. Self-hosted, free, and open source.">
<meta name="keywords" content="note taking, markdown editor, self-hosted, knowledge base, open source, privacy, notes app, docker, second brain, obsidian alternative"> <meta name="keywords" content="note taking, markdown editor, self-hosted, knowledge base, open source, privacy, notes app, docker, second brain, obsidian alternative, notion, evernote, onenote, latex, mermaid, diagrams, math equations">
<meta name="author" content="Gamosoft"> <meta name="author" content="Gamosoft">
<meta name="robots" content="index, follow"> <meta name="robots" content="index, follow">
<link rel="canonical" href="https://www.notediscovery.com"> <link rel="canonical" href="https://www.notediscovery.com">
@ -17,7 +17,7 @@
<meta property="og:type" content="website"> <meta property="og:type" content="website">
<meta property="og:url" content="https://www.notediscovery.com"> <meta property="og:url" content="https://www.notediscovery.com">
<meta property="og:title" content="NoteDiscovery - Your Self-Hosted Knowledge Base"> <meta property="og:title" content="NoteDiscovery - Your Self-Hosted Knowledge Base">
<meta property="og:description" content="A lightweight, privacy-focused note-taking application. Self-hosted, free, and open source."> <meta property="og:description" content="A lightweight, privacy-focused Markdown note-taking application with LaTeX math, Mermaid diagrams, and code highlighting. Self-hosted, free, and open source.">
<meta property="og:image" content="https://www.notediscovery.com/og-image.png"> <meta property="og:image" content="https://www.notediscovery.com/og-image.png">
<meta property="og:image:width" content="1200"> <meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630"> <meta property="og:image:height" content="630">
@ -28,7 +28,7 @@
<meta name="twitter:site" content="@gamosoft"> <meta name="twitter:site" content="@gamosoft">
<meta name="twitter:creator" content="@gamosoft"> <meta name="twitter:creator" content="@gamosoft">
<meta name="twitter:title" content="NoteDiscovery - Your Self-Hosted Knowledge Base"> <meta name="twitter:title" content="NoteDiscovery - Your Self-Hosted Knowledge Base">
<meta name="twitter:description" content="A lightweight, privacy-focused note-taking application. Self-hosted, free, and open source."> <meta name="twitter:description" content="A lightweight, privacy-focused note-taking application with LaTeX math, Mermaid diagrams, and code highlighting. Self-hosted, free, and open source.">
<meta name="twitter:image" content="https://www.notediscovery.com/og-image.png"> <meta name="twitter:image" content="https://www.notediscovery.com/og-image.png">
<meta name="twitter:image:alt" content="NoteDiscovery - Self-hosted note-taking application interface"> <meta name="twitter:image:alt" content="NoteDiscovery - Self-hosted note-taking application interface">
@ -509,7 +509,7 @@
<div class="hero"> <div class="hero">
<div class="hero-content"> <div class="hero-content">
<h2>Take Control of Your Notes</h2> <h2>Take Control of Your Notes</h2>
<p>A lightweight, privacy-focused note-taking application that puts you in complete control of your knowledge base. Write, organize, and discover your notes with a beautiful, modern interface—all running on your own server.</p> <p>A lightweight, privacy-focused note-taking application with powerful features: LaTeX math equations, Mermaid diagrams, code highlighting, and more. Write, organize, and discover your notes with a beautiful, modern interface—all running on your own server.</p>
<a href="https://github.com/gamosoft/NoteDiscovery" class="cta-button">Get Started on GitHub →</a> <a href="https://github.com/gamosoft/NoteDiscovery" class="cta-button">Get Started on GitHub →</a>
</div> </div>
</div> </div>
@ -550,6 +550,24 @@
<p>Instant search and navigation. Works offline, always responsive.</p> <p>Instant search and navigation. Works offline, always responsive.</p>
</div> </div>
<div class="feature">
<div class="feature-icon">🧮</div>
<h3>LaTeX Math</h3>
<p>Beautiful equation rendering with MathJax. Perfect for scientific notes.</p>
</div>
<div class="feature">
<div class="feature-icon">📊</div>
<h3>Diagrams</h3>
<p>Create flowcharts, mind maps, and diagrams with Mermaid syntax.</p>
</div>
<div class="feature">
<div class="feature-icon">💻</div>
<h3>Code Highlighting</h3>
<p>Syntax highlighting for popular coding languages. Developer-friendly notes.</p>
</div>
<div class="feature"> <div class="feature">
<div class="feature-icon">📂</div> <div class="feature-icon">📂</div>
<h3>Simple Storage</h3> <h3>Simple Storage</h3>
@ -559,7 +577,7 @@
<div class="feature"> <div class="feature">
<div class="feature-icon">🎨</div> <div class="feature-icon">🎨</div>
<h3>Beautiful Themes</h3> <h3>Beautiful Themes</h3>
<p>Multiple built-in themes with full customization support.</p> <p>8 built-in themes with dark/light modes and full customization.</p>
</div> </div>
<div class="feature"> <div class="feature">
@ -619,6 +637,38 @@
You own your data You own your data
</div> </div>
</div> </div>
<div class="benefit-item">
<span class="emoji">🔗</span>
<div class="text">
<strong>Wiki Links</strong>
Connect notes with internal links
</div>
</div>
<div class="benefit-item">
<span class="emoji">📄</span>
<div class="text">
<strong>HTML Export</strong>
Share standalone HTML files
</div>
</div>
<div class="benefit-item">
<span class="emoji">⌨️</span>
<div class="text">
<strong>Keyboard Shortcuts</strong>
Navigate and create with speed
</div>
</div>
<div class="benefit-item">
<span class="emoji">🔐</span>
<div class="text">
<strong>Optional Auth</strong>
Password protection when needed
</div>
</div>
</div> </div>
</div> </div>
@ -671,10 +721,11 @@
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "SoftwareApplication", "@type": "SoftwareApplication",
"name": "NoteDiscovery", "name": "NoteDiscovery",
"description": "A lightweight, privacy-focused note-taking application. Self-hosted, free, and open source.", "description": "A lightweight, Obsidian and Evernote alternative, privacy-focused Markdown note-taking application with LaTeX math, Mermaid diagrams, and code highlighting. Self-hosted, free, and open source.",
"url": "https://www.notediscovery.com", "url": "https://www.notediscovery.com",
"applicationCategory": "ProductivityApplication", "applicationCategory": "ProductivityApplication",
"operatingSystem": "Linux, Windows, macOS", "operatingSystem": "Linux, Windows, macOS",
"featureList": "Markdown editor, LaTeX math equations, Mermaid diagrams, Code syntax highlighting, Dark mode, Plugin system, Internal wiki links, HTML export, Full-text search, Self-hosted, Obsidian, Evernote, Notion, Onenote, Second brain",
"offers": { "offers": {
"@type": "Offer", "@type": "Offer",
"price": "0", "price": "0",

View File

@ -734,8 +734,9 @@ function noteApp() {
const notePath = this.draggedNoteForLink; const notePath = this.draggedNoteForLink;
const noteName = notePath.split('/').pop().replace('.md', ''); const noteName = notePath.split('/').pop().replace('.md', '');
// Create markdown link // Create markdown link (URL-encode the path to handle spaces and special characters)
const link = `[${noteName}](${notePath})`; const encodedPath = notePath.split('/').map(segment => encodeURIComponent(segment)).join('/');
const link = `[${noteName}](${encodedPath})`;
// Insert at cursor position // Insert at cursor position
const textarea = event.target; const textarea = event.target;
@ -775,7 +776,8 @@ function noteApp() {
event.preventDefault(); event.preventDefault();
// Remove any anchor from the href (e.g., "note.md#section" -> "note.md") // Remove any anchor from the href (e.g., "note.md#section" -> "note.md")
const notePath = href.split('#')[0]; // Also decode URL encoding (e.g., "note%203.md" -> "note 3.md")
const notePath = decodeURIComponent(href.split('#')[0]);
// Skip if it's just an anchor link // Skip if it's just an anchor link
if (!notePath) return; if (!notePath) return;
@ -2424,11 +2426,11 @@ function noteApp() {
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>${noteName}</title> <title>${noteName}</title>
<!-- Highlight.js for code syntax highlighting --> <!-- Highlight.js for code syntax highlighting (v11.9.0) -->
${highlightTheme ? `<link rel="stylesheet" href="${highlightTheme}">` : '<!-- No highlight.js theme detected -->'} ${highlightTheme ? `<link rel="stylesheet" href="${highlightTheme}">` : '<!-- No highlight.js theme detected -->'}
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<!-- MathJax for LaTeX math rendering (same config as preview) --> <!-- MathJax for LaTeX math rendering (v3.2.2) -->
<script> <script>
MathJax = { MathJax = {
tex: { tex: {
@ -2452,11 +2454,11 @@ function noteApp() {
} }
}; };
</script> </script>
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-mml-chtml.js"></script>
<!-- Mermaid.js for diagrams (if used in note) --> <!-- Mermaid.js for diagrams (v10.9.0) -->
<script type="module"> <script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs'; import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10.9.0/dist/mermaid.esm.min.mjs';
const isDark = ${this.getThemeType() === 'dark'}; const isDark = ${this.getThemeType() === 'dark'};
mermaid.initialize({ mermaid.initialize({
startOnLoad: false, startOnLoad: false,

View File

@ -11,14 +11,14 @@
<link rel="icon" type="image/png" sizes="16x16" href="/static/favicon.svg"> <link rel="icon" type="image/png" sizes="16x16" href="/static/favicon.svg">
<link rel="apple-touch-icon" href="/static/logo.svg"> <link rel="apple-touch-icon" href="/static/logo.svg">
<!-- Tailwind CSS from CDN --> <!-- Tailwind CSS from CDN (v3.4.17) -->
<script src="https://cdn.tailwindcss.com"></script> <script src="https://cdn.tailwindcss.com/3.4.17"></script>
<!-- Alpine.js --> <!-- Alpine.js (v3.14.1) -->
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script> <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.14.1/dist/cdn.min.js"></script>
<!-- Marked.js for Markdown parsing --> <!-- Marked.js for Markdown parsing (v12.0.2) -->
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/marked@12.0.2/marked.min.js"></script>
<!-- MathJax for LaTeX math rendering --> <!-- MathJax for LaTeX math rendering -->
<script> <script>
@ -39,9 +39,9 @@
} }
}; };
</script> </script>
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-mml-chtml.js"></script>
<!-- Highlight.js for code syntax highlighting --> <!-- Highlight.js for code syntax highlighting (v11.9.0) -->
<link rel="stylesheet" id="highlight-theme" href=""> <link rel="stylesheet" id="highlight-theme" href="">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/csharp.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/csharp.min.js"></script>
@ -57,9 +57,9 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/css.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/css.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/http.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/http.min.js"></script>
<!-- Mermaid.js for diagram rendering --> <!-- Mermaid.js for diagram rendering (v10.9.0) -->
<script type="module"> <script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs'; import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10.9.0/dist/mermaid.esm.min.mjs';
// Note: Mermaid is initialized dynamically by app.js renderMermaid() based on current theme // Note: Mermaid is initialized dynamically by app.js renderMermaid() based on current theme
window.mermaid = mermaid; window.mermaid = mermaid;
</script> </script>