MD-Curcuma Lib | Anleitung

Zuletzt aktualisiert am 12. April 2024 11 Minuten

MD-Curcuma

MD-Curcuma kopiert und transformiert Markdown-Dateien aus Obsidianexternal link zur Verwendung in Hugoexternal link .

Transformers sind derzeit für die folgenden Aufgaben verfügbar:

Verfügbare Transporter:

  1. MD_Transporter - für Markdown-Dateien
  2. CSV_Transporter - Für Dateien mit kommagetrennten Werten, bei denen jede Zeile ein Datensatz ist. Dies ist eine BookBuddy Appexternal link Unterstützung: CSV-Dateikonvertierung & Bild-Download.

Verfügbare Markdown-Transformer:

  1. Splittet eine Markdown-Longform in separate Dateien bei Headlines.
  2. Obsidian-Links (Bilder und Dokumente), Kopieren von Dateien im laufenden Betrieb.
  3. Latex-Formeln, Absatz und Inline.
  4. Frontmatter: Hinzufügen, Ersetzen, Zuordnen und Transformieren von Werten.
  5. Beschriftungen.
  6. Todos entfernen.
  7. TODO: Berücksichtigt Wikilinks (Querverweise).
  8. TODO: Fußnoten Endnoten-Unterstützung.

Verfügbare Mappings:

  1. Adopt Value - ein einfaches Beispiel.
  2. ArrayJoin, ArraySplit
  3. Boolesche Umkehrung
  4. Image Downloader
  5. Datum einfügen (jetzt)
  6. UUID einfügen
  7. Zeichen aus der Zeichenkette abschneiden.

Du kannst eigene Transformer und Mapper erstellen. Geplante Features und Änderungen findest du in der CHANGELOG.mdexternal link

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 Pluginexternal link erstellt wurde.
  • Ich würde es gerne auf meiner Website zur Verfügung stellen.
  • Die Website ist mit Hugoexternal link erstellt.
  • Zu diesem Zweck soll das Longform-Dokument in mehrere Einzeldokumente aufgeteilt werden.
    • Die Aufteilung soll auf Überschriften erfolgen: z.B.: #
    • Der Text der Überschrift wird als Dateiname verwendet.
    • Wenn nötig, mit vorangestellter Zahl, ggf. Sonderzeichen ersetzen url conform
  • 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": {}
}

Bilder aus

![[my-image.jpg]]

Hugo-Ersatz:

 {{ < image folder="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="rocket" > }}
 Here's a callout block.
{{ < /callout > }}
  • context=“tip” title=“Tip” icon=“rocket”
  • context=“note” title=“Note” icon=“info-circle”
  • context=“caution” title=“Caution” icon=“alert-triangle”
  • context=“danger” title=“Danger” icon=“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": ""
  }
},

Das ist noch nicht fertig.

8. BookBuddy-App, CSV Support

  • Die BookBuddy Appexternal link 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…

  1. im Hugo-Projekt - und aus dem Obsidian Vault ziehen.
  2. in Obsidian - und in Ihr Hugo-Projekt pushen. Ich werde in naher Zukunft ein Obsidian-Plugin dafür schreiben.
  3. 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://gitlab.com/glimpse-of-life/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-Quellcode
  • transport-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

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 Datei

  • Rechtsklick 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");