Markdowny

Up a Level

Markdowny[1] is a NPM package I wrote many years ago that gives me a lot of basic queries while working with Markdown[2] files. I haven't updated it much, but it covers a lot of my use cases.

1: https://www.npmjs.com/package/markdowny
2: ../markdown/

Installation

Since I use MfGames Writing[3] in my writing, I already have the required `package.json` file there so installing is pretty simple.

3: ../mfgames-writing/
$ npm install -D markdown

Word Counts

The drawback of most word counts is that they include the top matter[4] which is metadata about the chapter. I don't want to include those, so I use `markdowny-wc` to count words while excluding the top matter.

4: ../top-matter/
$ markdowny-wc src/chapters/*.md
chapter-001.md:   1021
chapter-002.md:   2475
...
chapter-061.md:   1321

I can also get a grand total:

$ markdowny-wc src/chapters/*.md --total
chapter-001.md:   1021
chapter-002.md:   2475
...
chapter-061.md:   1321
Totals        : 119619

Summaries

One of the other conventions is that I put the chapter summary into the YAML as I write. That prevents me from doing a chapter synopsis at the end but it also allows me to easily dump the results.

$ markdowny list chapters/chapter-*.md
1. Always Moving: While Linsan Sterlig waits for her mother to come home, she bounces around on the furniture and talks to her father. She announces that she has named a violin her father is making Palisis and learns that the violin is for her father's first wife who got married to her mother's best friend.

...

60. Proof: Linsan has the opportunity to prove that she has played Palisis before, but there are some disagreements.

61. Decisions: Linsan, Brook, and Miska have to decide what comes next.

The default is to write something that plays well with Markdown or pasting directly into an email since my writing group requires a “story up to this point” with every submission.

Content

If I just want to strip off the top matter (which I didn't find an easy option to do so), I can use the `markdowny content` command.

$ markdowny content src/chapters/chapter-001.md | head -n 3
> For eight generations, the Sterlig Family crafted some of the most treasured string instruments throughout Gepaul. --- _History of Traditional Music_

Linsan bounced on her family's new couch. With a flip of her green skirt, she did a somersault along the cushions before flopping against the opposite arm. The couch creaked from the impact but she didn't care. With a grin, she pushed herself over the edge until her head dangled over the blue-and-white patterned rug below.

Table

All those are simple usages, but one of the most useful one is creating a table of data from the top matter. This is the `markdowny table` command but it does have a lot more options, including a few that are undocumented (bad Dylan):

$ markdowny table src/chapters/*.md
markdowny table chapters/*.md
| _basename      | title                 |
| :------------- | :-------------------- |
| chapter-001.md | Always Moving         |
| chapter-002.md | Early Lessons         |
| chapter-003.md | Home Early            |

If you don't know, the output is suitable as a Markdown table and can be used here.

| _basename      | title         |
|----------------|---------------|
| chapter-001.md | Always Moving |
| chapter-002.md | Early Lessons |
| chapter-003.md | Home Early    |

The `--fields` can take a space-separated, dotted notation of any field in the YAML header. If the result is a list, it will make a comma-separated list. For example, to list all the secondary characters in the first three chapters of Sand and Blood[5], I use the following command:

5: //fedran.com/sand-and-blood/
$ markdowny table src/chapters/*.md --fields title characters.secondary
| title      | characters.secondary                               |
|------------|----------------------------------------------------|
| Rutejìmo   | Hyonèku                                            |
| Confession | Somiryòki, Tejíko, Gemènyo                         |
| Morning    | Desòchu, Gemènyo, Hyonèku, Mapábyo, Opōgyo, Panédo |

If I want to get the time and duration of each chapter.

$ markdowny table src/chapters/*.md --fields title when.start when.duration
| title      | when.start           | when.duration |
|------------|----------------------|---------------|
| Rutejìmo   | 1471/3/28 MTR 4::22  | 0::30         |
| Confession | 1471/3/28 MTR 4::75  | 0::25         |
| Morning    | 1471/3/28 MTR 11::71 |               |

There are a couple hidden fields also.

$ markdowny table src/chapters/*.md --fields title, _basename, _filename, _words
| title      | _basename     | _filename              | _words |
|------------|---------------|------------------------|--------|
| Rutejìmo   | chapter-01.md | chapters/chapter-01.md | 1520   |
| Confession | chapter-02.md | chapters/chapter-02.md | 2144   |
| Morning    | chapter-03.md | chapters/chapter-03.md | 2905   |

Future Plans

While I haven't done much work recently with `markdowny`, I'm hoping to write a C# or Rust version that does more. But this is still pretty powerful for giving an overview of the entire chapter using arbitrary YAML top matter you can decide on.

Footer

Below are various useful links within this site and to related sites (not all have been converted over to Gemini).

Now
Contact
Biography
Bibliography
Support
Fiction
Fedran
Coding
The Moonfires
Categories
Tags
Privacy
Colophon
License
Mailing List