ngx-markdown-pages 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -22,10 +22,26 @@ bootstrapApplication(AppComponent, {
|
|
|
22
22
|
});
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
## Options
|
|
26
|
+
|
|
27
|
+
`provideMarkdownPages()` accepts a `MarkdownPagesOptions` object:
|
|
28
|
+
|
|
29
|
+
| Option | Type | Description |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| `clipboard` | `boolean` | Enable the clipboard copy button on code blocks |
|
|
32
|
+
| `headerComponent` | `Type<unknown>` | A standalone component rendered above the markdown content on every page |
|
|
33
|
+
| `footerComponent` | `Type<unknown>` | A standalone component rendered below the markdown content on every page |
|
|
26
34
|
|
|
27
35
|
```typescript
|
|
28
|
-
|
|
36
|
+
import { provideMarkdownPages } from 'ngx-markdown-pages';
|
|
37
|
+
import { SiteHeaderComponent } from './site-header.component';
|
|
38
|
+
import { SiteFooterComponent } from './site-footer.component';
|
|
39
|
+
|
|
40
|
+
provideMarkdownPages({
|
|
41
|
+
clipboard: true,
|
|
42
|
+
headerComponent: SiteHeaderComponent,
|
|
43
|
+
footerComponent: SiteFooterComponent,
|
|
44
|
+
})
|
|
29
45
|
```
|
|
30
46
|
|
|
31
47
|
## Routing
|
|
@@ -2,6 +2,7 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { InjectionToken, inject, ElementRef, Component } from '@angular/core';
|
|
3
3
|
import { provideMarkdown, MARKED_OPTIONS, MarkdownComponent } from 'ngx-markdown';
|
|
4
4
|
import { Renderer } from 'marked';
|
|
5
|
+
import { NgComponentOutlet } from '@angular/common';
|
|
5
6
|
import { ActivatedRoute, Router } from '@angular/router';
|
|
6
7
|
import { toSignal } from '@angular/core/rxjs-interop';
|
|
7
8
|
import { map } from 'rxjs';
|
|
@@ -48,15 +49,31 @@ class MarkdownPageComponent {
|
|
|
48
49
|
});
|
|
49
50
|
}
|
|
50
51
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: MarkdownPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
51
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
52
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: MarkdownPageComponent, isStandalone: true, selector: "mdp-markdown-page", host: { listeners: { "click": "onClick($event)" } }, ngImport: i0, template: `
|
|
53
|
+
@if (options.headerComponent) {
|
|
54
|
+
<ng-container *ngComponentOutlet="options.headerComponent" />
|
|
55
|
+
}
|
|
56
|
+
<markdown [src]="markdownSrc()" [disableSanitizer]="true" [clipboard]="options.clipboard ?? false" />
|
|
57
|
+
@if (options.footerComponent) {
|
|
58
|
+
<ng-container *ngComponentOutlet="options.footerComponent" />
|
|
59
|
+
}
|
|
60
|
+
`, isInline: true, dependencies: [{ kind: "component", type: MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }] });
|
|
52
61
|
}
|
|
53
62
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: MarkdownPageComponent, decorators: [{
|
|
54
63
|
type: Component,
|
|
55
64
|
args: [{
|
|
56
65
|
selector: 'mdp-markdown-page',
|
|
57
66
|
standalone: true,
|
|
58
|
-
imports: [MarkdownComponent],
|
|
59
|
-
template:
|
|
67
|
+
imports: [MarkdownComponent, NgComponentOutlet],
|
|
68
|
+
template: `
|
|
69
|
+
@if (options.headerComponent) {
|
|
70
|
+
<ng-container *ngComponentOutlet="options.headerComponent" />
|
|
71
|
+
}
|
|
72
|
+
<markdown [src]="markdownSrc()" [disableSanitizer]="true" [clipboard]="options.clipboard ?? false" />
|
|
73
|
+
@if (options.footerComponent) {
|
|
74
|
+
<ng-container *ngComponentOutlet="options.footerComponent" />
|
|
75
|
+
}
|
|
76
|
+
`,
|
|
60
77
|
host: { '(click)': 'onClick($event)' },
|
|
61
78
|
}]
|
|
62
79
|
}] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-markdown-pages.mjs","sources":["../../src/lib/markdown-pages.config.ts","../../src/lib/markdown-page.component.ts","../../src/lib/markdown-pages.routes.ts","../../src/public-api.ts","../../src/ngx-markdown-pages.ts"],"sourcesContent":["import { InjectionToken, Provider } from '@angular/core';\nimport { provideMarkdown, MARKED_OPTIONS } from 'ngx-markdown';\nimport { Renderer } from 'marked';\n\nexport interface MarkdownPageConfig {\n path: string;\n markdownFile: string;\n}\n\nexport interface MarkdownPagesOptions {\n clipboard?: boolean;\n}\n\nexport const MARKDOWN_PAGES_OPTIONS = new InjectionToken<MarkdownPagesOptions>(\n 'MARKDOWN_PAGES_OPTIONS',\n { factory: () => ({}) }\n);\n\nexport function provideMarkdownPages(options?: MarkdownPagesOptions): Provider[] {\n return [\n { provide: MARKDOWN_PAGES_OPTIONS, useValue: options ?? {} },\n ...provideMarkdown({\n markedOptions: {\n provide: MARKED_OPTIONS,\n useFactory: () => {\n const renderer = new Renderer();\n renderer.heading = ({ text, depth }) => {\n const slug = text\n .toLowerCase()\n .replace(/<[^>]*>/g, '')\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-');\n return `<h${depth} id=\"${slug}\">${text}</h${depth}>`;\n };\n return { renderer };\n },\n },\n }),\n ];\n}\n","import { Component, ElementRef, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { map } from 'rxjs';\nimport { MarkdownComponent } from 'ngx-markdown';\nimport { MARKDOWN_PAGES_OPTIONS } from './markdown-pages.config';\n\n@Component({\n selector: 'mdp-markdown-page',\n standalone: true,\n imports: [MarkdownComponent],\n template:
|
|
1
|
+
{"version":3,"file":"ngx-markdown-pages.mjs","sources":["../../src/lib/markdown-pages.config.ts","../../src/lib/markdown-page.component.ts","../../src/lib/markdown-pages.routes.ts","../../src/public-api.ts","../../src/ngx-markdown-pages.ts"],"sourcesContent":["import { InjectionToken, Provider, Type } from '@angular/core';\nimport { provideMarkdown, MARKED_OPTIONS } from 'ngx-markdown';\nimport { Renderer } from 'marked';\n\nexport interface MarkdownPageConfig {\n path: string;\n markdownFile: string;\n}\n\nexport interface MarkdownPagesOptions {\n clipboard?: boolean;\n headerComponent?: Type<unknown>;\n footerComponent?: Type<unknown>;\n}\n\nexport const MARKDOWN_PAGES_OPTIONS = new InjectionToken<MarkdownPagesOptions>(\n 'MARKDOWN_PAGES_OPTIONS',\n { factory: () => ({}) }\n);\n\nexport function provideMarkdownPages(options?: MarkdownPagesOptions): Provider[] {\n return [\n { provide: MARKDOWN_PAGES_OPTIONS, useValue: options ?? {} },\n ...provideMarkdown({\n markedOptions: {\n provide: MARKED_OPTIONS,\n useFactory: () => {\n const renderer = new Renderer();\n renderer.heading = ({ text, depth }) => {\n const slug = text\n .toLowerCase()\n .replace(/<[^>]*>/g, '')\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-');\n return `<h${depth} id=\"${slug}\">${text}</h${depth}>`;\n };\n return { renderer };\n },\n },\n }),\n ];\n}\n","import { Component, ElementRef, inject } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { map } from 'rxjs';\nimport { MarkdownComponent } from 'ngx-markdown';\nimport { MARKDOWN_PAGES_OPTIONS } from './markdown-pages.config';\n\n@Component({\n selector: 'mdp-markdown-page',\n standalone: true,\n imports: [MarkdownComponent, NgComponentOutlet],\n template: `\n @if (options.headerComponent) {\n <ng-container *ngComponentOutlet=\"options.headerComponent\" />\n }\n <markdown [src]=\"markdownSrc()\" [disableSanitizer]=\"true\" [clipboard]=\"options.clipboard ?? false\" />\n @if (options.footerComponent) {\n <ng-container *ngComponentOutlet=\"options.footerComponent\" />\n }\n `,\n host: { '(click)': 'onClick($event)' },\n})\nexport class MarkdownPageComponent {\n private route = inject(ActivatedRoute);\n private router = inject(Router);\n private el = inject(ElementRef<HTMLElement>);\n protected options = inject(MARKDOWN_PAGES_OPTIONS);\n\n markdownSrc = toSignal(\n this.route.data.pipe(map((data) => data['markdownFile'] as string)),\n { initialValue: '' }\n );\n\n onClick(event: MouseEvent) {\n const anchor = (event.target as HTMLElement).closest('a');\n const href = anchor?.getAttribute('href');\n if (!href?.startsWith('#')) return;\n\n event.preventDefault();\n const fragment = href.substring(1);\n this.router.navigate([], { relativeTo: this.route, fragment }).then(() => {\n document.getElementById(fragment)?.scrollIntoView({ behavior: 'smooth' });\n });\n }\n}\n","import { Route } from '@angular/router';\nimport { MarkdownPageComponent } from './markdown-page.component';\nimport { MarkdownPageConfig } from './markdown-pages.config';\n\nexport function markdownPageRoutes(config: MarkdownPageConfig[]): Route[] {\n return config.map(({ path, markdownFile }) => ({\n path,\n component: MarkdownPageComponent,\n data: { markdownFile },\n }));\n}\n","/*\n * Public API Surface of ngx-markdown-pages\n */\n\nexport type { MarkdownPageConfig, MarkdownPagesOptions } from './lib/markdown-pages.config';\nexport { provideMarkdownPages } from './lib/markdown-pages.config';\nexport { MarkdownPageComponent } from './lib/markdown-page.component';\nexport { markdownPageRoutes } from './lib/markdown-pages.routes';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { InjectionToken, Provider } from '@angular/core';
|
|
1
|
+
import { InjectionToken, Provider, Type } from '@angular/core';
|
|
2
2
|
export interface MarkdownPageConfig {
|
|
3
3
|
path: string;
|
|
4
4
|
markdownFile: string;
|
|
5
5
|
}
|
|
6
6
|
export interface MarkdownPagesOptions {
|
|
7
7
|
clipboard?: boolean;
|
|
8
|
+
headerComponent?: Type<unknown>;
|
|
9
|
+
footerComponent?: Type<unknown>;
|
|
8
10
|
}
|
|
9
11
|
export declare const MARKDOWN_PAGES_OPTIONS: InjectionToken<MarkdownPagesOptions>;
|
|
10
12
|
export declare function provideMarkdownPages(options?: MarkdownPagesOptions): Provider[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ngx-markdown-pages",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "An Angular library for rendering markdown files as routable pages.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "James Andrews"
|
|
7
|
+
},
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/jamesmandrews/ngx-markdown-pages.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/jamesmandrews/ngx-markdown-pages/issues"
|
|
14
|
+
},
|
|
4
15
|
"peerDependencies": {
|
|
5
16
|
"@angular/common": "^19.2.0",
|
|
6
17
|
"@angular/core": "^19.2.0",
|