first commit
This commit is contained in:
88
main.ts
Normal file
88
main.ts
Normal file
@@ -0,0 +1,88 @@
|
||||
import { Plugin } from 'obsidian';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const { shell } = require('electron');
|
||||
|
||||
export default class MenuPlugin extends Plugin {
|
||||
async onload() {
|
||||
this.registerMarkdownCodeBlockProcessor('menu', (source, el, ctx) => {
|
||||
// Parse the source
|
||||
const lines = source.trim().split('\n');
|
||||
let cssClass = '';
|
||||
const links: string[] = [];
|
||||
|
||||
for (const line of lines) {
|
||||
const trimmed = line.trim();
|
||||
if (trimmed.startsWith('class:')) {
|
||||
cssClass = trimmed.substring(6).trim().replace(/[{}]/g, '');
|
||||
} else if (trimmed) {
|
||||
links.push(trimmed);
|
||||
}
|
||||
}
|
||||
|
||||
// Create the container - if no class specified, use 'default'
|
||||
const finalClass = cssClass || 'default';
|
||||
const container = el.createEl('div', { cls: `menu-container ${finalClass}` });
|
||||
|
||||
// Process each link
|
||||
for (const link of links) {
|
||||
if (link.startsWith('[[') && link.endsWith(']]')) {
|
||||
// Internal link
|
||||
const linkContent = link.slice(2, -2);
|
||||
let href = linkContent;
|
||||
let text = linkContent;
|
||||
if (linkContent.includes('|')) {
|
||||
[href, text] = linkContent.split('|');
|
||||
}
|
||||
const a = container.createEl('a', {
|
||||
text: text,
|
||||
attr: { 'data-href': href }
|
||||
});
|
||||
a.addClass('menu-internal-link');
|
||||
} else if (link.match(/^\[.*\]\(.*\)$/)) {
|
||||
// External link
|
||||
const match = link.match(/^\[(.*)\]\((.*)\)$/);
|
||||
if (match) {
|
||||
const text = match[1];
|
||||
const url = match[2];
|
||||
const a = container.createEl('a', {
|
||||
text: text,
|
||||
attr: url.startsWith('file://') ? {} : { href: url, target: '_blank', rel: 'noopener noreferrer' }
|
||||
});
|
||||
a.style.cursor = 'pointer';
|
||||
|
||||
// Add appropriate class based on link type
|
||||
if (url.startsWith('file://')) {
|
||||
a.addClass('menu-file-link');
|
||||
} else {
|
||||
a.addClass('menu-external-link');
|
||||
}
|
||||
a.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
if (url.startsWith('file://')) {
|
||||
try {
|
||||
// Convert file URL to path and handle Windows paths
|
||||
let filePath = decodeURIComponent(url.substring(7)); // Remove 'file://'
|
||||
// Handle Windows paths that start with /C:
|
||||
if (filePath.startsWith('/') && filePath.charAt(2) === ':') {
|
||||
filePath = filePath.substring(1);
|
||||
}
|
||||
console.log('Opening file path:', filePath);
|
||||
shell.openPath(filePath);
|
||||
} catch (error) {
|
||||
console.error('Failed to open file:', error);
|
||||
}
|
||||
} else {
|
||||
window.open(url, '_blank', 'noopener,noreferrer');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
onunload() {
|
||||
// Cleanup if needed
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user