@rshirohara/repixe-stringify
Version:
repixe plugin to add support for serializing pixiv novel format.
109 lines (108 loc) • 2.69 kB
JavaScript
export function toPixivNovel(tree) {
return [...tree.children]
.map((node) => compileRootChildren(node))
.filter((text) => text !== "")
.join("\n\n");
}
function compileRootChildren(node) {
switch (node.type) {
case "heading":
case "pageBreak":
case "paragraph": {
return compileFlowContent(node);
}
case "break":
case "image":
case "link":
case "pageReference":
case "ruby":
case "text": {
return compilePhrasingContent(node);
}
default: {
return "";
}
}
}
// FlowContent
function compileFlowContent(node) {
switch (node.type) {
case "heading": {
return compileHeading(node);
}
case "pageBreak": {
return compilePageBreak(node);
}
case "paragraph": {
return compileParagraph(node);
}
default: {
return "";
}
}
}
function compileHeading(node) {
return `[chapter: ${[...node.children].map(compileInlinePhrasingContent).join("")}]`;
}
function compilePageBreak(_) {
return "[newpage]";
}
function compileParagraph(node) {
return [...node.children].map(compilePhrasingContent).join("");
}
// PhrasingContent
function compilePhrasingContent(node) {
switch (node.type) {
case "break": {
return compileBreak(node);
}
case "image": {
return compileImage(node);
}
case "link": {
return compileLink(node);
}
case "pageReference": {
return compilePageReference(node);
}
case "ruby":
case "text": {
return compileInlinePhrasingContent(node);
}
default: {
return "";
}
}
}
function compileBreak(_) {
return "\n";
}
function compileImage(node) {
return `[pixivimage:${node.illustId}${node.pageNumber !== undefined ? `-${node.pageNumber}` : ""}]`;
}
function compileLink(node) {
return `[[jumpuri: ${[...node.children].map(compileInlinePhrasingContent).join("")} > ${node.url}]]`;
}
function compilePageReference(node) {
return `[jump:${node.pageNumber}]`;
}
// InlinePhrasingContent
function compileInlinePhrasingContent(node) {
switch (node.type) {
case "ruby": {
return compileRuby(node);
}
case "text": {
return compileText(node);
}
default: {
return "";
}
}
}
function compileRuby(node) {
return `[[rb: ${node.value} > ${node.ruby}]]`;
}
function compileText(node) {
return node.value;
}