svelte-markdown-pages
Version:
Build and render markdown-based content with distributed navigation for Svelte projects
1 lines • 19.8 kB
Source Map (JSON)
{"version":3,"sources":["../../src/renderer/navigation.ts","../../src/renderer/content.ts","../../src/renderer/components.ts"],"names":["marked"],"mappings":"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","file":"index.cjs","sourcesContent":["import { NavigationTree as NavigationTreeType, NavigationItem } from '../types.js';\n\nexport class NavigationTree {\n private _items: NavigationItem[];\n private _flatItems: NavigationItem[] = [];\n private _pathMap: Map<string, NavigationItem> = new Map();\n\n constructor(data: NavigationTreeType) {\n this._items = data.items;\n this._buildIndexes();\n }\n\n get items(): NavigationItem[] {\n return this._items;\n }\n\n get flatItems(): NavigationItem[] {\n return this._flatItems;\n }\n\n findItemByPath(path: string): NavigationItem | undefined {\n return this._pathMap.get(path);\n }\n\n findItemByName(name: string): NavigationItem | undefined {\n return this._findItemByNameRecursive(this._items, name);\n }\n\n getBreadcrumbs(path: string): NavigationItem[] {\n const item = this.findItemByPath(path);\n if (!item) {\n return [];\n }\n\n const breadcrumbs: NavigationItem[] = [];\n let current: NavigationItem | undefined = item;\n\n while (current) {\n breadcrumbs.unshift(current);\n current = current.parent;\n }\n\n return breadcrumbs;\n }\n\n getSiblings(path: string): NavigationItem[] {\n const item = this.findItemByPath(path);\n if (!item || !item.parent) {\n // If no parent, return all root items\n return this._items;\n }\n\n return item.parent.items || [];\n }\n\n getNextSibling(path: string): NavigationItem | undefined {\n const siblings = this.getSiblings(path);\n const currentIndex = siblings.findIndex(item => item.path === path);\n \n if (currentIndex === -1 || currentIndex === siblings.length - 1) {\n return undefined;\n }\n\n return siblings[currentIndex + 1];\n }\n\n getPreviousSibling(path: string): NavigationItem | undefined {\n const siblings = this.getSiblings(path);\n const currentIndex = siblings.findIndex(item => item.path === path);\n \n if (currentIndex <= 0) {\n return undefined;\n }\n\n return siblings[currentIndex - 1];\n }\n\n getChildren(path: string): NavigationItem[] {\n // First try to find by name (for sections)\n let item = this.findItemByName(path);\n \n // If not found by name, try to find by path\n if (!item) {\n item = this.findItemByPath(path);\n }\n \n // If still not found, try to find nested items by path\n if (!item && path.includes('/')) {\n const pathParts = path.split('/');\n const sectionName = pathParts[pathParts.length - 1];\n if (sectionName) {\n item = this.findItemByName(sectionName);\n }\n }\n \n return item?.items || [];\n }\n\n isExpanded(path: string): boolean {\n const item = this.findItemByName(path) || this.findItemByPath(path);\n return item ? !item.collapsed : false;\n }\n\n toggleExpanded(path: string): void {\n const item = this.findItemByName(path) || this.findItemByPath(path);\n if (item) {\n item.collapsed = !item.collapsed;\n }\n }\n\n private _buildIndexes(): void {\n this._flatItems = [];\n this._pathMap.clear();\n this._buildIndexesRecursive(this._items, undefined);\n }\n\n private _buildIndexesRecursive(\n items: NavigationItem[],\n parent: NavigationItem | undefined\n ): void {\n for (const item of items) {\n // Set parent reference\n item.parent = parent || undefined;\n\n // Add to flat list\n this._flatItems.push(item);\n\n // Add to path map if it's a page\n if (item.path) {\n this._pathMap.set(item.path, item);\n }\n\n // Process children\n if (item.items) {\n this._buildIndexesRecursive(item.items, item);\n }\n }\n }\n\n private _findItemByNameRecursive(\n items: NavigationItem[],\n name: string\n ): NavigationItem | undefined {\n for (const item of items) {\n if (item.name === name) {\n return item;\n }\n\n if (item.items) {\n const found = this._findItemByNameRecursive(item.items, name);\n if (found) {\n return found;\n }\n }\n }\n\n return undefined;\n }\n}\n\nexport function createNavigationTree(data: NavigationTreeType): NavigationTree {\n return new NavigationTree(data);\n}","import { marked } from 'marked';\nimport { ContentProcessor, ContentProcessorOptional } from '../types.js';\n\nexport class ContentLoader {\n private content: Record<string, string>;\n private processor?: ContentProcessorOptional | undefined;\n\n constructor(content: Record<string, string>, processor?: ContentProcessorOptional) {\n this.content = content;\n this.processor = processor;\n }\n\n loadContent(path: string): string | undefined {\n return this.content[path];\n }\n\n loadAndProcess(path: string): string | undefined {\n const content = this.loadContent(path);\n if (!content) {\n return undefined;\n }\n\n return this.processContent(content);\n }\n\n processContent(content: string): string {\n if (this.processor) {\n content = this.processor.process(content);\n }\n\n return marked(content);\n }\n\n hasContent(path: string): boolean {\n return path in this.content;\n }\n\n getAvailablePaths(): string[] {\n return Object.keys(this.content);\n }\n\n getContentSize(path: string): number {\n const content = this.loadContent(path);\n return content ? content.length : 0;\n }\n\n getTotalContentSize(): number {\n return Object.values(this.content).reduce((total, content) => total + content.length, 0);\n }\n}\n\nexport async function loadContent(\n path: string,\n contentBundle: Record<string, string>,\n processor?: ContentProcessorOptional\n): Promise<string | undefined> {\n const loader = new ContentLoader(contentBundle, processor);\n return loader.loadAndProcess(path);\n}\n\nexport function createContentLoader(\n contentBundle: Record<string, string>,\n processor?: ContentProcessorOptional\n): ContentLoader {\n return new ContentLoader(contentBundle, processor);\n}\n\n// Utility functions for content processing\nexport function extractHeadings(content: string): Array<{\n level: number;\n text: string;\n id: string;\n}> {\n const headings: Array<{\n level: number;\n text: string;\n id: string;\n }> = [];\n\n const lines = content.split('\\n');\n for (const line of lines) {\n const match = line.match(/^(#{1,6})\\s+(.+)$/);\n if (match && match[1] && match[2]) {\n const level = match[1].length;\n const text = match[2].trim();\n const id = text.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');\n \n headings.push({ level, text, id });\n }\n }\n\n return headings;\n}\n\nexport function extractTableOfContents(content: string): string {\n const headings = extractHeadings(content);\n \n if (headings.length === 0) {\n return '';\n }\n\n const toc = ['## Table of Contents', ''];\n \n for (const heading of headings) {\n const indent = ' '.repeat(heading.level - 1);\n toc.push(`${indent}- [${heading.text}](#${heading.id})`);\n }\n\n return toc.join('\\n');\n}\n\nexport function addTableOfContents(content: string): string {\n const toc = extractTableOfContents(content);\n if (!toc) {\n return content;\n }\n\n const lines = content.split('\\n');\n const firstHeadingIndex = lines.findIndex(line => line.match(/^#{1,6}\\s+/));\n \n if (firstHeadingIndex === -1) {\n return content;\n }\n\n lines.splice(firstHeadingIndex + 1, 0, toc, '');\n return lines.join('\\n');\n}","import { NavigationTree, NavigationItem } from '../types.js';\n\n// Legacy class-based components for backward compatibility\nexport interface DocsSidebarProps {\n navigation: NavigationTree;\n currentPage?: string | null;\n onPageSelect?: ((path: string) => void) | undefined;\n collapsed?: boolean | undefined;\n}\n\nexport interface DocsContentProps {\n content?: string | null;\n title?: string;\n loading?: boolean;\n error?: string | null;\n}\n\nexport interface DocsLayoutProps {\n navigation: NavigationTree;\n currentPage?: string | null;\n content?: string | null;\n onPageSelect?: ((path: string) => void) | undefined;\n sidebarCollapsed?: boolean | undefined;\n onSidebarToggle?: (() => void) | undefined;\n}\n\n// Legacy class-based implementations\nexport class DocsSidebarClass {\n constructor(props: DocsSidebarProps) {\n this.props = props;\n }\n\n private props: DocsSidebarProps;\n\n render(): string {\n return `\n <nav class=\"docs-sidebar ${this.props.collapsed ? 'collapsed' : ''}\">\n ${this.renderNavigationItems(this.props.navigation.items)}\n </nav>\n `;\n }\n\n private renderNavigationItems(items: NavigationItem[]): string {\n return items.map(item => {\n if (item.type === 'section') {\n return `\n <div class=\"nav-section\">\n <div class=\"nav-section-header\">${item.label}</div>\n ${item.items ? this.renderNavigationItems(item.items) : ''}\n </div>\n `;\n } else {\n const isActive = this.props.currentPage === item.path;\n return `\n <a href=\"#\" \n class=\"nav-link ${isActive ? 'active' : ''}\"\n data-path=\"${item.path}\"\n onclick=\"this.dispatchEvent(new CustomEvent('pageSelect', {detail: '${item.path}'}))\">\n ${item.label}\n </a>\n `;\n }\n }).join('');\n }\n}\n\nexport class DocsContentClass {\n constructor(props: DocsContentProps) {\n this.props = props;\n }\n\n private props: DocsContentProps;\n\n render(): string {\n if (this.props.loading) {\n return '<div class=\"docs-content loading\">Loading...</div>';\n }\n\n if (this.props.error) {\n return `<div class=\"docs-content error\">Error: ${this.props.error}</div>`;\n }\n\n if (!this.props.content) {\n return '<div class=\"docs-content empty\">No content selected</div>';\n }\n\n return `\n <div class=\"docs-content\">\n ${this.props.title ? `<h1>${this.props.title}</h1>` : ''}\n <div class=\"content-body\">\n ${this.props.content}\n </div>\n </div>\n `;\n }\n}\n\n// Legacy exports for backward compatibility\nexport { DocsSidebarClass as DocsSidebar, DocsContentClass as DocsContent };\n\n// Utility functions\nexport function createDocsSidebar(props: DocsSidebarProps): DocsSidebarClass {\n return new DocsSidebarClass(props);\n}\n\nexport function createDocsContent(props: DocsContentProps): DocsContentClass {\n return new DocsContentClass(props);\n}\n\nexport function createDocsLayout(props: DocsLayoutProps): string {\n const sidebar = new DocsSidebarClass({\n navigation: props.navigation,\n currentPage: props.currentPage,\n onPageSelect: props.onPageSelect,\n collapsed: props.sidebarCollapsed\n });\n\n const content = new DocsContentClass({\n content: props.content,\n loading: false,\n error: null\n });\n\n return `\n <div class=\"docs-layout\">\n ${sidebar.render()}\n ${content.render()}\n </div>\n `;\n}"]}