prettier/website/playground/markdown.js

80 lines
1.8 KiB
JavaScript

function formatMarkdown(
input,
output,
output2,
version,
url,
options,
cliOptions,
full
) {
const syntax = getMarkdownSyntax(options);
const optionsString = formatCLIOptions(cliOptions);
const isIdempotent = output2 === "" || output === output2;
return [
`**Prettier ${version}**`,
`[Playground link](${url})`,
optionsString === "" ? null : codeBlock(optionsString, "sh"),
"",
"**Input:**",
codeBlock(input, syntax),
"",
"**Output:**",
codeBlock(output, syntax)
]
.concat(
isIdempotent ? [] : ["", "**Second Output:**", codeBlock(output2, syntax)]
)
.concat(full ? ["", "**Expected behavior:**", ""] : [])
.filter(part => {
return part != null;
})
.join("\n");
}
function getMarkdownSyntax(options) {
switch (options.parser) {
case "babel":
case "babylon": // backward compatibility
case "babel-flow":
case "flow":
return "jsx";
case "typescript":
return "tsx";
case "json":
case "json-stringify":
return "jsonc";
case "glimmer":
return "hbs";
case "angular":
case "lwc":
return "html";
default:
return options.parser;
}
}
function formatCLIOptions(cliOptions) {
return cliOptions
.map(option => {
const name = option[0];
const value = option[1];
return value === true ? name : `${name} ${value}`;
})
.join("\n");
}
function codeBlock(content, syntax) {
const backtickSequences = content.match(/`+/g) || [];
const longestBacktickSequenceLength = Math.max.apply(
null,
backtickSequences.map(backticks => backticks.length)
);
const fenceLength = Math.max(3, longestBacktickSequenceLength + 1);
const fence = Array(fenceLength + 1).join("`");
return [fence + (syntax || ""), content, fence].join("\n");
}
module.exports = formatMarkdown;