Compare commits

...

6 commits
v1.0.0 ... main

Author SHA1 Message Date
semantic-release-bot 8e1d658344 chore(release): v1.1.0 [CI SKIP]
All checks were successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2023-01-27 04:50:56 +00:00
Dylan R. E. Moonfire d58495d22e ci(woodpecker): different variable since last SHA commit
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-01-26 22:27:08 -06:00
Dylan R. E. Moonfire ebb569b9db build: removed some dead targets, reordered prettier before eslint
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2023-01-26 22:22:17 -06:00
Dylan R. E. Moonfire 4da4f98ce1 build: clean target needs to also remove the incremental build file 2023-01-26 22:21:29 -06:00
Dylan R. E. Moonfire 93c786eb23 feat(list): added some additional formatting for list 2023-01-26 22:19:45 -06:00
Dylan R. E. Moonfire 65c18ad226 ci: added test back in
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2023-01-26 20:33:12 -06:00
7 changed files with 97 additions and 64 deletions

View file

@ -12,12 +12,12 @@ pipeline:
when:
event: [push, manual]
# test:
# image: registry.gitlab.com/dmoonfire/nix-flake-docker:latest
# commands:
# - nix develop --command scripts/test.sh
# when:
# event: [push, manual]
test:
image: registry.gitlab.com/dmoonfire/nix-flake-docker:latest
commands:
- nix develop --command scripts/test.sh
when:
event: [push, manual]
release:
image: registry.gitlab.com/dmoonfire/nix-flake-docker:latest

View file

@ -63,6 +63,21 @@ Options:
* `-y`, `--yaml`: Extract the data as YAML instead of JSON (default).
* `--content PROPERTY`: Extract the content as a property of the given name instead of just removing it. Defaults to not extracting the content.
### list
> Displays each file as a Markdown ordered list.
```sh
markdowny list *.markdown
```
Options:
* `-o`, `--output`: Direct the output to a file or (default) standard out with `-`.
* `-s`, `--trim-whitespace`: If included, then newlines between the fields will be collapsed down to a single space and the resulting string trimmed at both ends.
* `-t`, `--template`: The Handlebars template using the YAML metadata for each file in addition to a `_number` which is the one-based number of the file. The default value is `{{_number}}. {{{title}}}: {{{summary}}}`.
* Some additional conditional operations are allowed such as `ge`, `le`, `gt`, `ge`, `eq`, and `ne`. They can be used like `{{#if (lt _number 10)}}0{{/if}}`.
### sections
> Displays each file as a heading 1 section with the title and contents provided.

26
package-lock.json generated
View file

@ -1,15 +1,16 @@
{
"name": "markdowny",
"version": "1.0.0",
"version": "1.1.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "markdowny",
"version": "1.0.0",
"version": "1.1.0",
"license": "MIT",
"dependencies": {
"add-commas": "0.0.4",
"handlebars": "^4.7.7",
"lodash": "^4.16.5",
"markdown-table": "^1.0.0",
"read-pkg-up": "^4.0.0",
@ -3508,8 +3509,6 @@
"version": "4.7.7",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
"integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
"dev": true,
"license": "MIT",
"dependencies": {
"minimist": "^1.2.5",
"neo-async": "^2.6.0",
@ -4811,7 +4810,6 @@
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@ -4870,7 +4868,6 @@
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true,
"license": "MIT"
},
"node_modules/nerf-dart": {
@ -9002,7 +8999,6 @@
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
@ -9583,7 +9579,6 @@
"version": "3.17.4",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
"integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
"dev": true,
"license": "BSD-2-Clause",
"optional": true,
"bin": {
@ -9770,7 +9765,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
"integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
"dev": true,
"license": "MIT"
},
"node_modules/wrap-ansi": {
@ -12337,7 +12331,6 @@
"version": "4.7.7",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
"integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
"dev": true,
"requires": {
"minimist": "^1.2.5",
"neo-async": "^2.6.0",
@ -13215,8 +13208,7 @@
"minimist": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
"dev": true
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
},
"minimist-options": {
"version": "4.1.0",
@ -13258,8 +13250,7 @@
"neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
},
"nerf-dart": {
"version": "1.0.0",
@ -16111,8 +16102,7 @@
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
},
"spawn-error-forwarder": {
"version": "1.0.0",
@ -16500,7 +16490,6 @@
"version": "3.17.4",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
"integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
"dev": true,
"optional": true
},
"unbox-primitive": {
@ -16639,8 +16628,7 @@
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
"integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
"dev": true
"integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="
},
"wrap-ansi": {
"version": "7.0.0",

View file

@ -1,6 +1,6 @@
{
"name": "markdowny",
"version": "1.0.0",
"version": "1.1.0",
"description": "A set of command-line tools for working with Markdown files with YAML headers.",
"keywords": [
"markdown"
@ -27,10 +27,9 @@
},
"scripts": {
"barrels": "barrelsby --delete --location all --directory src --exclude '(tests|cli|tools)'",
"prebuild": "run-s barrels lint format clean",
"prebuild": "run-s barrels format lint clean",
"build": "tsc",
"clean": "rimraf lib",
"commitmsg": "commitlint -E GIT_PARAMS",
"clean": "rimraf lib *.tsbuildinfo",
"format": "prettier src --write \"**/*.ts\" --loglevel warn",
"lint": "eslint -c .eslintrc.yml src/**/*.ts --fix",
"prepack": "npm run build",
@ -38,6 +37,7 @@
},
"dependencies": {
"add-commas": "0.0.4",
"handlebars": "^4.7.7",
"lodash": "^4.16.5",
"markdown-table": "^1.0.0",
"read-pkg-up": "^4.0.0",

View file

@ -8,4 +8,4 @@ cd $(dirname $(dirname $0))
./scripts/setup.sh || exit 1
log "verifying conventional commits in Git log"
npx commitlint --from=$CI_BUILD_BEFORE_SHA
npx commitlint --from=$CI_PREV_COMMIT_SHA

View file

@ -1,19 +1,21 @@
import * as _ from "lodash";
import * as yargs from "yargs";
import * as scanner from "../scanner";
import * as handlebars from "handlebars";
import * as fs from "fs";
export var command = "list";
export var describe = "Extracts a YAML field into an order list";
export var describe = "Extracts a YAML field into an ordered list";
export function builder(yargs: yargs.Arguments) {
return yargs
.help("help")
.alias("f", "field")
.default("field", "summary")
.alias("t", "template")
.default("template", "{{_number}}. {{{title}}}: {{{summary}}}")
.alias("t", "title")
.default("title", "title")
.alias("s", "trim-whitespace")
.boolean("trim-whitspace")
.alias("o", "output")
.default("output", "-")
@ -27,21 +29,54 @@ export function handler(argv: any) {
render(argv, data);
}
export function render(argv, data) {
for (var key in data) {
var number = 1 + parseInt(key.toString());
var item = data[key];
var title = _.get(item, argv.title);
var value = _.get(item, argv.field);
export function render(argv, files) {
// Compile the handlebars template.
handlebars.registerHelper("eq", function (a, b) {
return a === b;
});
handlebars.registerHelper("gt", function (a, b) {
return a > b;
});
handlebars.registerHelper("gte", function (a, b) {
return a >= b;
});
handlebars.registerHelper("lt", function (a, b) {
return a < b;
});
handlebars.registerHelper("lte", function (a, b) {
return a <= b;
});
handlebars.registerHelper("ne", function (a, b) {
return a !== b;
});
// Build up the parts so we can do this as a single line.
const parts = [`${number}. `, title];
const template = handlebars.compile(argv.template);
if (value) {
parts.push(": " + value.replace(/\n/g, " "));
// Go through each of the files and create a row from each one.
const trim = /\s+/g;
let output: string[] = [];
for (var key in files) {
// Combine everything into a single parameters object including `_number`
// to represent the one-based index from the beginning.
const number = 1 + parseInt(key.toString());
let params = { ...files[key], _number: number };
// Render the results and write it out.
let result = template(params);
if (argv.trimWhitespace) {
result = result.replace(trim, " ").trim();
}
// Write out the line.
console.log(parts.join(""));
output.push(result);
}
// Write out the results as requested.
if (argv.output === "-") {
console.log(output.join("\n"));
} else {
fs.writeFileSync(argv.output, Buffer.from(output.join("\n"), "utf-8"));
}
}

View file

@ -149,20 +149,20 @@ class Column {
for (var s of m[2]) {
switch (s) {
case "c":
case "l":
case "r":
case ".":
this.align = s;
break;
case "c":
case "l":
case "r":
case ".":
this.align = s;
break;
case "s":
this.comma = true;
break;
case "s":
this.comma = true;
break;
case "t":
this.total = true;
break;
case "t":
this.total = true;
break;
}
}
}
@ -190,8 +190,3 @@ function parse(argv, titles, fields): Column[] {
return columns;
}
/* Notes
Comma-separated list of lists. I like spaces.
*/