MD-Curcuma Lib | Anleitung
Auf dieser Seite
- 1. Split a Longform-Markdown File
- 2. Obsidian-Links
- 3. Latex Formeln
- 4. Frontmatter: Add, Replace, Map and Transform Values
- 5. Callouts
- 6. Remove TODOs
- 7. Wikilinks / Cross-References
- 8. BookBuddy-App, CSV Support
- auf github.com
- bei npmjs.com
- Über das Projekt …
MD-Curcuma kopiert und transformiert Markdown-Dateien aus Obsidian zur Verwendung in Hugo .
- Gemacht mit Typescript
- Inspiriert von accraze split-md
- Warum nicht golang ? Damit man es außerhalb des golang-Universums einfacher benutzen kann.
Transformers sind derzeit für die folgenden Aufgaben verfügbar:
Verfügbare Transporter:
- MD_Transporter - für Markdown-Dateien
- CSV_Transporter - Für Dateien mit kommagetrennten Werten, bei denen jede Zeile ein Datensatz ist. Dies ist eine BookBuddy App Unterstützung: CSV-Dateikonvertierung & Bild-Download.
Verfügbare Markdown-Transformer:
- Splittet eine Markdown-Longform in separate Dateien bei Headlines.
- Obsidian-Links (Bilder und Dokumente), Kopieren von Dateien im laufenden Betrieb.
- Latex-Formeln, Absatz und Inline.
- Frontmatter: Hinzufügen, Ersetzen, Zuordnen und Transformieren von Werten.
- Beschriftungen.
- Todos entfernen.
- TODO: Berücksichtigt Wikilinks (Querverweise).
- TODO: Fußnoten Endnoten-Unterstützung.
Verfügbare Mappings:
- Adopt Value - ein einfaches Beispiel.
- ArrayJoin, ArraySplit
- Boolesche Umkehrung
- Image Downloader
- Datum einfügen (jetzt)
- UUID einfügen
- Zeichen aus der Zeichenkette abschneiden.
Du kannst eigene Transformer und Mapper erstellen. Geplante Features und Änderungen findest du in der CHANGELOG.md
Beschränkungen
- Es läuft nur im Backend, nicht in Browsern.
Wie es funktioniert
Kurz gesagt:
const my_transporter: MD_Transporter = new MD_Transporter();
my_transporter.perform_job_from("../test-data-obsidian-vault/transport-config.json", "Example-Job No.1");
Alle Aufgaben werden in der Konfigurationsdatei transport-config.json
definiert.
Die Langfassung:
const my_transporter: MD_Transporter = new MD_Transporter();
// Basic config
const transporter_parameter: MD_Transporter_Parameter_Type = {
readPath: "test-obsidian-vault/longform.md",
writePath: "test-hugo/hugo-content-2/",
doSubfolders: false,
limit: 1990,
useCounter: false
};
// Transformer config
const parameter_images: MD_Transformer_Parameter_Type = {
tag_obsidian_prefix: "![[",
tag_obsidian_suffix: "]]",
find_rule: "jpg|png",
replace_template: `{{ < image src="assets/images/{name_full}" > }}`,
copy_task: {
source:"test-obsidian-vault/images/",
target:"test-hugo/hugo-content-2/assets/images/{name}/",
simulate:false
}
};
// Hinzufügen des Transformators zur Pipeline
my_transporter.addTransformer(new MD_ObsidianLink_Transformer(parameter_images));
// execute the job
my_transporter.perform_job(transporter_parameter);
Schaue im Ordner test
nach laufenden Beispielen.
Transformations
Ich habe eine Reihe von Transformationen im Angebot, aber du kannst auch eigene zur Pipeline hinzufügen.
1. Split a Longform-Markdown File
Das Problem:
- Ich habe ein langes Markdown-Dokument, das mit dem Obsidian Longform Plugin erstellt wurde.
- Ich würde es gerne auf meiner Website zur Verfügung stellen.
- Die Website ist mit Hugo erstellt.
- Zu diesem Zweck soll das Longform-Dokument in mehrere Einzeldokumente aufgeteilt werden.
- Die Aufteilung soll auf Überschriften erfolgen: zB.:
#
- Der Text der Überschrift wird als Dateiname verwendet.
- Wenn nötig, mit vorangestellter Zahl, ggf. Sonderzeichen ersetzen url conform
- Die Aufteilung soll auf Überschriften erfolgen: zB.:
- Hugo-kompatibel sein.
- Die einzelnen Dokumente sollten mit Frontmatter ausgestattet sein.
- Autogenerierte uuids
- Bestimmte Inhalte müssen eventuell transformiert werden.
Code-Beispiel
var splitter_frontmatter: MD_Frontmatter = new MD_Frontmatter(`---
title: "{title}"
description: ""
url: /docs/{url_prefix}-{url}/
date: {date}
draft: false
images: []
menu:
docs:
parent: "docs-9602b15bad02600f3883f55e2ade6b81"
identifier: "{url_prefix}-{url}-{uuid}"
weight: {weight}
toc: true
---\n\n`);
const parameter_splitter: MD_Splitter_Parameter_Type = {
pattern: "# ",
cleanName: "# ",
limit: 100,
hasCounter: false,
weightBase: 8000,
url_prefix: "test-prefix",
doRemoveHeadline: true,
frontmatter_filename: "", // ./test/frontmatter-template.md
frontmatter: splitter_frontmatter
};
my_transporter.addTransformer(new MD_Splitter_Transformer(parameter_splitter));
Beispiel JSON für die config Datei
{
"transformer_class_name": "MD_Splitter_Transformer",
"transformer_parameter": {
"pattern": "# ",
"cleanName": "# ",
"limit": 100,
"hasCounter": false,
"weightBase": 8000,
"url_prefix": "test-prefix",
"doRemoveHeadline": true,
"frontmatter_filename": "./test-data-obsidian-vault/frontmatter-template.md",
"frontmatter": {}
}
2. Obsidian-Links
Bilder aus
![[my-image.jpg]]
Hugo-Ersatz:
{{ < image folder="docs/images/my-image.jpg" > }}
oder Dokumente von
![[docu-1.pdf]]
Hugo-Ersatz:
{{ < button href="/getthis.php?id=docu-1" name="download docu-1 (pdf)" > }}
Please think away the blank space in {{ <
and > }}
. I had to add this in the documentation so that Hugo would not render it as code.
Code-Beispiel
const parameter_images: MD_Transformer_Parameter_Type = {
tag_obsidian_prefix: "![[",
tag_obsidian_suffix: "]]",
find_rule: "jpg|png",
replace_template: `{{ < image src="assets/images//{name}/{name_full}" > }}`,
copy_task: {
source:"test-data-obsidian-vault/images/",
target:"test-data-hugo/hugo-content-2/assets/images/{name}/",
simulate:simulate_copy_job
}
};
const parameter_docs: MD_Transformer_Parameter_Type = {
tag_obsidian_prefix: "![[",
tag_obsidian_suffix: "]]",
find_rule: "pdf|ods|odp",
replace_template: `{{ < button href="/getthis.php?id={name}" name="download {name} ({name_suffix})" > }}`,
copy_task: {
source:"test-data-obsidian-vault/attachments/",
target:"test-data-hugo/hugo-content-2/static/downloads/",
simulate:simulate_copy_job
}
};
my_transporter.addTransformer(new MD_ObsidianLink_Transformer(parameter_images));
my_transporter.addTransformer(new MD_ObsidianLink_Transformer(parameter_docs));
Beispiel JSON für die config Datei
{
"transformer_class_name": "MD_ObsidianLink_Transformer",
"transformer_parameter": {
"tag_obsidian_prefix": "![[",
"tag_obsidian_suffix": "]]",
"find_rule": "jpg|png",
"replace_template": "{{ < lightbox-docs id=\"0\" folder=\"images/{name}/*\" showImageNr=0 > }}",
"copy_task":{
"source":"test-data-obsidian-vault/images/",
"target":"test-data-hugo/hugo-content-1/assets/images/{name}/",
"simulate":false
}
}
},
{
"transformer_class_name": "MD_ObsidianLink_Transformer",
"transformer_parameter": {
"tag_obsidian_prefix": "![[",
"tag_obsidian_suffix": "]]",
"find_rule": "pdf|ods|odp",
"replace_template": "{{ < button href=\"/getthis.php?id={name}\" name=\"download {name} ({name_suffix})\" > }}",
"copy_task":{
"source":"test-data-obsidian-vault/attachments/",
"target":"test-data-hugo/hugo-content-1/static/downloads/",
"simulate":false
}
}
},
Bilder und Dokumente nebenbei kopieren
Ein Simulationsmodus gibt Auskunft darüber, welche Bilder und Anhänge wo erwartet werde.
3. Latex Formeln
Umwandlung von Latexformeln vom Obsidian-Stil in den Hugo-Stil.
- https://www.makeuseof.com/write-mathematical-notation-obsidian/
- https://getdoks.org/docs/built-ins/math/
von diesem:
$$
W_{kin} = \frac { m \cdot v^2}{2} = \frac {p^2}{ 2 \cdot m}
$$
This is an inline ${(x+y)}^2$ Formula.
in das:
```math {.text-center}
$$
W_{kin} = \frac { m \cdot v^2}{2} = \frac {p^2}{ 2 \cdot m}
$$
```
Dass ist eine inline {{ < math > }} ${(x+y)}^2$ {{ < /math > }} Formel.
Code-Beispiel
var parameter_math_paragraph: MD_Transformer_Parameter_Type = {
tag_obsidian_prefix: "$$",
tag_obsidian_suffix: "$$",
find_rule: "",
replace_template: "```math {.text-center}\n$$\n {content} \n$$\n```\n",
};
var parameter_math_inline: MD_Transformer_Parameter_Type = {
tag_obsidian_prefix: "$",
tag_obsidian_suffix: "$",
find_rule: "",
replace_template: "{{ < math > }} ${content}$ {{ < /math > }}",
};
my_transporter.addTransformer(new MD_MathParagraph_Transformer(parameter_math_paragraph));
my_transporter.addTransformer(new MD_MathInline_Transformer(parameter_math_inline));
Beispiel JSON für die config Datei
{
"transformer_class_name": "MD_MathParagraph_Transformer",
"transformer_parameter": {
"tag_obsidian_prefix": "$$",
"tag_obsidian_suffix": "$$",
"find_rule": "",
"replace_template": "```math {.text-center}\n$$\n {content} \n$$\n```\n"
}
},
{
"transformer_class_name": "MD_MathInline_Transformer",
"transformer_parameter": {
"tag_obsidian_prefix": "$",
"tag_obsidian_suffix": "$",
"find_rule": "",
"replace_template": "{{ < math > }} ${content}$ {{ < /math > }}"
}
},
4. Frontmatter: Add, Replace, Map and Transform Values
Was geschieht hier?
Fügt Frontmatter zu einer einzelnen Datei (oder einem Stapel von einzelnen Dateien) hinzu.
- Das Frontmatter aus der Quelldatei wird entfernt.
- Stattdessen wird das neue Frontmatter-Template eingefügt.
- Nehmen Sie einige Frontmatter-Felder aus der Quelldatei,
- und schreibe sie in ein anderes Feld in der Zieldatei.
- Der Wert kann auf dem Weg konvertiert werden.
Ist noch nicht ganz fertig.
Code-Beispiel
var document_frontmatter: MD_Frontmatter_Template =
new MD_Frontmatter_Template(`---
title: ""
description: ""
summary: ""
date:
draft:
weight:
categories: []
tags: []
contributors: []
pinned: false
homepage: false
seo:
title: ""
description: ""
canonical: ""
noindex: false
---\n\n`);
// use one of the predefined tasks like so:
// task: new MD_Mapping_BooleanInverse_Task()
// or write a custom task:
const map_1: MD_Mapping = {
mapping_items: [{
source_property_name: "doPublish",
target_poperty_name: "draft",
}],
task: {
perform: function (mapping_properties: MD_MappingTask_Properties): boolean {
let target_value = !mapping_properties.source_value;
return target_value;
},
},
};
// An example task that inserts the current date. Source Property isnt used here.
const map_2: MD_Mapping = {
mapping_items: [{
source_property_name: "",
target_poperty_name: "date",
}],
task: {
perform: function (mapping_properties: MD_MappingTask_Properties): any {
return new Date().toJSON().slice(0, 16);
},
},
};
const parameter_frontmatter: MD_Frontmatter_Parameter_Type = {
frontmatter: document_frontmatter,
frontmatter_filename: "",
mappings: [map_1, map_2],
};
my_transporter.addTransformer(new MD_Frontmatter_Transformer(parameter_frontmatter));
Beispiel JSON für die config Datei
{
"transformer_class_name": "MD_Frontmatter_Transformer",
"transformer_parameter": {
"frontmatter_filename": "./test-data-obsidian-vault/frontmatter-template.md",
"frontmatter": {}
}
},
5. Callouts
Obsidian-Callouts in Hugo-Callout-Shortcodes umwandeln.
- Obsidian-Callouts https://help.obsidian.md/Editing+und+Formatierung/Callouts
- Hugo-Callouts https://getdoks.org/docs/basics/shortcodes/
Auch hier bin ich noch nicht ganz fertig.
von
> [!info] Custom Title
> Here's a callout block.
> It supports **Markdown**, [[Internal link|Wikilinks]], and [[Embed files|embeds]]!
> ![[Engelbart.jpg]]
- note
- abstract(summary, tldr)
- info
- todo
- tip (hint, important)
- success(check, done)
- question (help, faq)
- warning (caution, attention)
- failure (fail, missing)
- danger (error)
- bug
- example
- quote (cite)
in
{{ < callout context="tip" title="Custom Title" icon="outline/rocket" > }}
Here's a callout block.
{{ < /callout > }}
- context=“tip” title=“Tip” icon=“outline/rocket”
- context=“note” title=“Note” icon=“outline/info-circle”
- context=“caution” title=“Caution” icon=“filled/alert-triangle”
- context=“danger” title=“Danger” icon=“filled/alert-octagon”
Code-Beispiel
var parameter_callouts: MD_Transformer_Parameter_Type = {
tag_obsidian_prefix: "> [!",
tag_obsidian_suffix: "]",
find_rule: "",
replace_template: `{{ < callout context="{context}" title="{title}" icon="{icon}" > }} {content} {{ < /callout > }}`,
};
my_transporter.addTransformer(new MD_Callout_Transformer(parameter_callouts));
Beispiel JSON für die config Datei
{
"transformer_class_name": "MD_Callout_Transformer",
"transformer_parameter": {
"tag_obsidian_prefix": "> [!",
"tag_obsidian_suffix": "]",
"find_rule": "",
"replace_template": "{{ < callout context=\"{context}\" title=\"{title}\" icon=\"{icon}\" > }} {content} {{ < /callout > }}"
}
},
6. Remove TODOs
Entferne zum Beispiel die folgenden Absätze:
- [ ] #TODO Some serious stuff to do...
Code-Beispiel
const parameter_remove: MD_Transformer_Parameter_Type = {
tag_obsidian_prefix: "",
tag_obsidian_suffix: "",
find_rule: "- [ ] #TODO ",
replace_template: ``,
};
my_transporter.addTransformer(new MD_RemoveTODOS_Transformer(parameter_remove));
Beispiel JSON für die config Datei
{
"transformer_class_name": "MD_RemoveTODOS_Transformer",
"transformer_parameter": {
"find_rule": "- [ ] #TODO ",
"replace_template": ""
}
},
7. Wikilinks / Cross-References
Das ist noch nicht fertig.
8. BookBuddy-App, CSV Support
- Die BookBuddy App exportiert ihren Inhalt als csv-Datei.
- Ich möchte die Daten in Hugo verwenden.
- Dazu konvertiere ich die csv nach json und lade die ebenfalls exportierten Bilder von der URL herunter.
- Die Eigenschaft
Cover_Image
speichert den lokalen Pfad zum Bild für Hugo.
let image_download_mapping_props: MD_ImageDownloader_MappingType = {
image_target_folder: "test-data-hugo/hugo-content-4/assets/images/",
image_hugo_path: "images/",
filename_property_name: "UUID", // not used by now
simulate: false
};
const image_download_mapping: MD_Mapping = {
source_property_name: "Uploaded_Image_URL",
target_poperty_name: "Cover_Image",
task: new MD_ImageDownloader_Mapping(image_download_mapping_props),
};
const csv_transporter_parameter: CSV_Transporter_Parameter_Type = {
readPath: "test-data-obsidian-vault/attachments/bookbuddy-export.csv",
writePath: "test-data-hugo/hugo-content-4/data/bookbuddy-export.json",
csvSeparator: ',',
mappings: [image_download_mapping],
};
CSV_Transporter.transform_to_json(csv_transporter_parameter);
Installieren und Verwenden
Wo einsetzen?
Die Transport-Skripte können verwendet werden…
- im Hugo-Projekt - und aus dem Obsidian Vault ziehen.
- in Obsidian - und in Ihr Hugo-Projekt pushen. Ich werde in naher Zukunft ein Obsidian-Plugin dafür schreiben.
- als alleinstehendes Projekt zwischen Obsidian und Hugo - so dass es Pulling und Pushing macht.
Ich empfehle im Moment Option 3
.
Install it
Installations-Methode 1: Klonen des Repositorys
Der einfachste Weg ist, das Repository zu klonen. Du bekommst dann auch die Tests und habst damit einen guten Ausgangspunkt für die eigenen Anpassungen.
- Kopieren den Link: https://github.com/cnichte/md-curcuma.git
- Öffnen VS Code
- Klicken auf “Git-Repository klonen”.
- Wähle ein Verzeichnis, in das das Ziel geklont werden soll.
- Das Verzeichnis
md-curcuma
wird erstellt. - Öffnen das Projekt in VS-Code.
- Im Terminal
npm install
npm run build:ts
npm run test
Installations-Methode 2: neues Projekt erstellen
Eine andere Möglichkeit ist, ein leeres Projekt zu erstellen, und die Bibliothek per npm installieren…
- einen
Projekt-Ordner
erstellen - öffne diesen Ordner, und darin…
npm init
# follow the guide
npm install md-curcuma
# check typescript installation
tsc --version
eine tsconfig.json
erstellen
Wenn du die in deinem Hugo-Projekt verwendest, werden einige Ordner standardmäßig ausgeschlossen.
{
"compilerOptions": {
"module": "commonjs",
"target": "ES5",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": false,
"baseUrl": "./",
"rootDir":"transport-scripts",
"outDir": "transport-scripts-compiled"
},
"include": ["transport-scripts/**/*"],
"exclude": [
"assets",
"config",
"content",
"data",
"layouts",
"node_modules",
"resources",
"static",
"transport-scripts-compiled"
]
}
Update per npm
# nach Aktualisierungen suchen
npx npm-check-updates
# upgrade package.json
npx npm-check-updates -u
# or
npx npm-check-updates -u --interactive --format group
# Installiere die neuen Versionen
npm update --save
# or
npm update --save-dev
# and then
npm install
Erstellen dein Skript
Im Ordner test
findest du funktionierende Beispiele.
Erstelle zwei Ordner für dein Skripte:
transport-scripts
- enthält den Typescript-Quellcodetransport-scripts-compiled
Der erste ist für den Typescript-Quellcode, der zweite für das Java-Skript, das später daraus kompiliert wird.
Kompilieren zu Javascript
Um die Handhabung zu vereinfachen, füge die folgenden Build-Befehle in die package.json
ein:
Das ts-Suffix in build:ts
trennt es von den golag-Skripten, die ich build:go
nenne, aber natürlich kann man sie nennen, wie man will.
"build:ts": "rm -rf transport-scripts-compiled && tsc",
"watch:ts": "tsc --watch",
Die Beispiel-Markdown-Dateien erstellen
- Erstellen den Ordner
test
, und im Ordner test- Erstellen den Ordner
test/obsidian-fault/
- und lege deine longform.md hinein. - Ordner
test/hugo-content/
erstellen - das ist das Zielverzeichnis
- Erstellen den Ordner
Ein Transport-Skript erstellen
Erstelle im Ordner transport-scripts
die Datei split-my-longform.ts
und fügen Sie den Code ein:
const my_transporter: MD_Transporter = new MD_Transporter();
my_transporter.perform_job_from("../test-data/transport-config.json", "Example-Job No.1");
Das ist alles, was du brauchst, wenn du eine Konfigurationsdatei und eine Frontmatter-Datei bereitstellst.
Du kannst es auch auf die andere - die lange - Weise machen:
import {
MD_Frontmatter_Template,
MD_ObsidianLink_Transformer,
MD_RemoveTODOS_Transformer,
MD_Math_Transformer,
MD_Splitter_Parameter_Type,
MD_Transformer_Parameter_Type,
} from "md-curcuma";
import {
MD_Transporter,
MD_Transporter_Parameter_Type,
} from "md-curcuma";
const my_transporter: MD_Transporter = new MD_Transporter();
// Basic instructions for MD_Transporter
const transporter_parameter: MD_Transporter_Parameter_Type = {
readPath: "test/obsidian-vault/longform.md",
writePath: "test/hugo-content-2/",
doSubfolders: false,
limit: 1990,
useCounter: false
};
const simulate_copy_job = true;
// The tasks to operate. If you add no tasks you have a simple copy job.
// Placeholders in the Transformer-Template
// as pre defined in MD_Transformer_TemplateValues_Type in the md-transformer module:
// {name_full} {name_suffix} {name}
const parameter_images: MD_Transformer_Parameter_Type = {
tag_obsidian_prefix: "![[",
tag_obsidian_suffix: "]]",
find_rule: "jpg|png",
replace_template: `{{ < image src="assets/images/{name_full}" > }}`,
copy_task: {
source:"test/obsidian-vault/images/",
target:"test/hugo-content-2/assets/images/{name}/",
simulate:simulate_copy_job
}
};
const parameter_docs: MD_Transformer_Parameter_Type = {
tag_obsidian_prefix: "![[",
tag_obsidian_suffix: "]]",
find_rule: "pdf|ods|odp",
replace_template: `{{ < button href="/getthis.php?id={name}" name="download {name} ({name_suffix})" > }}`,
copy_task: {
source:"test/obsidian-vault/attachments/",
target:"test/hugo-content-2/static/downloads/",
simulate:simulate_copy_job
}
};
var parameter_math: MD_Transformer_Parameter_Type = {
tag_obsidian_prefix: "$$",
tag_obsidian_suffix: "$$",
find_rule: "",
replace_template: "```math {.text-center}\n$$\n {content} \n$$\n```\n",
};
const parameter_remove: MD_Transformer_Parameter_Type = {
tag_obsidian_prefix: "", // TODO optional?
tag_obsidian_suffix: "", // TODO optional?
find_rule: "- [ ] #TODO ",
replace_template: ``,
};
// The Markdown-Splitter Task needs a Frontmatter
// The placeholders result from the definition of MD_Frontmatter_Type in md-frontmatter
// A file definition in frontmatter_filename, overwrites frontmatter Property
var splitter_frontmatter: MD_Frontmatter = new MD_Frontmatter(`---
title: "{title}"
description: ""
url: /docs/{url_prefix}-{url}/
date: {date}
draft: false
images: []
menu:
docs:
parent: "docs-9602b15bad02600f3883f55e2ade6b81"
identifier: "{url_prefix}-{url}-{uuid}"
weight: {weight}
toc: true
---\n\n`);
const parameter_splitter: MD_Splitter_Parameter_Type = {
pattern: "# ",
cleanName: "# ",
limit: 100,
hasCounter: false,
weightBase: 8000,
url_prefix: "test-prefix",
doRemoveHeadline: true,
frontmatter_filename: "", // ./test/frontmatter-template.md
frontmatter: splitter_frontmatter
};
my_transporter.addTransformer(new MD_ObsidianLink_Transformer(parameter_images));
my_transporter.addTransformer(new MD_ObsidianLink_Transformer(parameter_docs));
my_transporter.addTransformer(new MD_RemoveTODOS_Transformer(parameter_remove));
my_transporter.addTransformer(new MD_Math_Transformer(parameter_math));
my_transporter.addTransformer(new MD_Splitter_Transformer(parameter_splitter));
my_transporter.perform_job(transporter_parameter);
Kompiliere das Transport-Skript
Die Skripte können dann wie folgt verwendet werden. Im Terminal:
npm run build:ts
- die Bibliothek bauen.npm run watch:ts
- Überwachen und kompilieren.
Die kompilierten Dateien landen im Verzeichnis transport-scripts-compiled
.
Das Skript in VSCode ausführen
In Visual Studio Code
Gehe das Verzeichnis
transport-scripts-compiled
.Auf die kompilierte
.js
DateiRechtsklick mit der Maus -> Menü-Eingabe
Run Code
Schau in den Ordner
test
, um das Ergebnis zu überprüfen.Beobachte die Konsolenausgabe auf der Registerkarte
Ausgabe
.
Einen eigenen Transformator bauen
import { MD_Transporter_Parameter_Type } from "md-curcuma";
import { MD_Transformer_AbstractBase } from "md-curcuma";
interface MD_Custom_Parameter_Type {
custom_property: string;
}
class MD_Custom_Transformer extends MD_Transformer_AbstractBase {
private parameter: MD_Custom_Parameter_Type;
constructor(parameter: MD_Custom_Parameter_Type ){
super();
this.parameter = parameter;
}
public set_job_parameter(job_paramter: MD_Transporter_Parameter_Type): void {
super.set_job_parameter(job_paramter); // this is a hack
}
public transform(file_content: MD_FileContent_Interface, index: number): MD_FileContent_Interface {
const body_array = file_content.body_array;
let item = file_content.body_array[index];
// file_content.frontmatter;
// file_content.frontmatter_attributes;
if (body_array[index].indexOf(this.parameter.find_rule) >= 0) {
console.log(`Transform before: ${body_array[index]}`);
body_array.splice(index, 1);
file_content.index = file_content.index - 1;
console.log(`Transform after: ${body_array[index]}`);
}
return file_content;
}
}
Du kannst derzeit keine benutzerdefinierten Transformer aus einer Konfigurationsdatei heraus aufrufen, du musst sie im Skript instanziieren.
Du kannst die Ausführung aus einer Konfigurationsdatei, und das Hinzufügen von benutzerdefinierten Transformer-Klassen wie folgt kombinieren:
const my_transporter: MD_Transporter = new MD_Transporter();
my_transporter.addTransformer(new MyCustomTransformer(custom_params));
my_transporter.perform_job_from("../test-data/transport-config.json", "Example-Job No.1");