NMEErr NMEPluginTOC(NMEConstText name, NMEInt nameLen, NMEConstText data, NMEInt dataLen, NMEContext *context, void *userData) { char *endp; HookTOCData hookData; NMEText title, buf, dest; NMEInt titleLen, bufLen, destLen; NMEOutputFormat outputFormat; NMEInt options, fontSize; NMEErr err; (void)name; (void)nameLen; NMESetTOCOutputFormat(&outputFormat, &hookData); // read levels in data hookData.level1 = strtol(data, &endp, 0); hookData.level2 = strtol(endp, &endp, 0); if (hookData.level1 < 1) return kNMEErrOk; if (hookData.level2 < hookData.level1) hookData.level2 = hookData.level1; // read TOC title for (title = endp; title < data + dataLen && isBlankOrEol(title[0]); title++) ; for (titleLen = dataLen - (title - data); titleLen > 0 && isBlankOrEol(title[titleLen - 1]); titleLen--) ; // make TOC NMEGetTempMemory(context, &buf, &bufLen); NMEGetFormat(context, NULL, &options, &fontSize); err = NMEProcess(((NMEPluginTocData *)userData)->src, ((NMEPluginTocData *)userData)->srcLen, buf, bufLen, options | kNMEProcessOptNoPreAndPost, "\n", &outputFormat, fontSize, &dest, &destLen, NULL); if (err != kNMEErrOk) return err; // write TOC title, if any if (titleLen > 0) if (!NMEAddString("<h2%%{s>0} style=\"font-size:%{2*s}pt\"%%>", -1, '%', context) || !NMEAddString(title, titleLen, '\0', context) || !NMEAddString("</h2>\n", -1, '%', context)) return kNMEErrNotEnoughMemory; // write TOC to output if (!NMEAddString("<p%%{s>0} style=\"font-size:%{s}pt\"%%>\n", -1, '%', context) || !NMEAddString(dest, destLen, '\0', context) || !NMEAddString("</p>\n", -1, '%', context)) return kNMEErrNotEnoughMemory; return kNMEErrOk; }
/// Application entry point int main(int argc, char **argv) { NMEText src = NULL, buf, dest; NMEInt srcLen, destLen; NMEOutputFormat outputFormat = NMEOutputFormatHTML; NMEInt options = kNMEProcessOptDefault; NMEBoolean autoURLLink = FALSE, autoCCLink = FALSE; int i; int fontSize = 0; HookDumpData hookDumpData; HookTOCData hookTOCData; HookEditData hookEditData; NMEErr err; outputFormat.plugins = pluginsHTML; for (i = 1; i < argc; i++) if (!strcmp(argv[i], "--body")) options |= kNMEProcessOptNoPreAndPost; else if (!strcmp(argv[i], "--1eol")) options |= kNMEProcessOptNoMultilinePar; else if (!strcmp(argv[i], "--2eol")) options &= ~kNMEProcessOptNoMultilinePar; else if (!strcmp(argv[i], "--xref")) options |= kNMEProcessOptXRef; else if (!strcmp(argv[i], "--autocclink")) autoCCLink = TRUE; else if (!strcmp(argv[i], "--autourllink")) autoURLLink = TRUE; else if (!strcmp(argv[i], "--nme")) { outputFormat = NMEOutputFormatNME; outputFormat.plugins = plugins; } else if (!strcmp(argv[i], "--html")) { outputFormat = NMEOutputFormatHTML; outputFormat.plugins = pluginsHTML; } else if (!strcmp(argv[i], "--jspwiki")) { outputFormat = NMEOutputFormatJSPWiki; outputFormat.plugins = plugins; } else if (!strcmp(argv[i], "--latex")) { outputFormat = NMEOutputFormatLaTeX; outputFormat.plugins = plugins; } else if (!strcmp(argv[i], "--mediawiki")) { outputFormat = NMEOutputFormatMediawiki; outputFormat.plugins = plugins; } else if (!strcmp(argv[i], "--null")) { outputFormat = NMEOutputFormatNull; outputFormat.plugins = NULL; } else if (!strcmp(argv[i], "--rtf")) { outputFormat = NMEOutputFormatRTF; outputFormat.plugins = plugins; } else if (!strcmp(argv[i], "--editfrag") && i + 4 < argc) { outputFormat.parHookFun = hookEdit; hookEditData.index = strtol(argv[++i], NULL, 0); hookEditData.length = strtol(argv[++i], NULL, 0); hookEditData.begin = argv[++i]; hookEditData.end = argv[++i]; hookEditData.done = FALSE; outputFormat.hookData = (void *)&hookEditData; } else if (!strcmp(argv[i], "--structpar")) { outputFormat = NMEOutputFormatNull; outputFormat.parHookFun = hookDump; outputFormat.divHookFun = NULL; hookDumpData.nesting = 0; outputFormat.hookData = (void *)&hookDumpData; } else if (!strcmp(argv[i], "--structdiv")) { outputFormat = NMEOutputFormatNull; outputFormat.parHookFun = NULL; outputFormat.divHookFun = hookDump; hookDumpData.nesting = 0; outputFormat.hookData = (void *)&hookDumpData; } else if (!strcmp(argv[i], "--text")) { outputFormat = NMEOutputFormatText; outputFormat.plugins = plugins; } else if (!strcmp(argv[i], "--man")) { outputFormat = NMEOutputFormatMan; outputFormat.plugins = plugins; } else if (!strcmp(argv[i], "--fontsize") && i + 1 < argc) fontSize = strtol(argv[++i], NULL, 0); else if (!strcmp(argv[i], "--headernum1")) options |= kNMEProcessOptH1Num; else if (!strcmp(argv[i], "--headernum2")) options |= kNMEProcessOptH2Num; else if (!strcmp(argv[i], "--strictcreole")) options |= kNMEProcessOptNoEscape | kNMEProcessOptNoUnderline | kNMEProcessOptNoMonospace | kNMEProcessOptNoSubSuperscript | kNMEProcessOptNoIndentedPar | kNMEProcessOptNoDL | kNMEProcessOptVerbatimMono; else if (!strcmp(argv[i], "--toc")) NMESetTOCOutputFormat(&outputFormat, &hookTOCData); else { if (strcmp(argv[i], "--help")) fprintf(stderr, "Unknown option %s\n", argv[i]); fprintf(stderr, "Usage: %s [options]\n" "Filter NME stdin and renders it to another format.\n" "--1eol single eol as paragraph breaks\n" "--2eol double eol as paragraph breaks (default)\n" "--autocclink automatic conversion of camelCase words to links\n" "--autourllink automatic conversion of URLs to links\n" "--body naked body without header and footer\n" "--editfrag i l b e edit a fragment of the source code; in output,\n" " replace what corresponds to input fragment starting\n" " at i of length l with this unmodified input fragment\n" " surrounded by b and e\n" "--headernum1 numbering of level-1 headers\n" "--headernum2 numbering of level-2 headers\n" "--fontsize s font size (0=default)\n" "--help this help message\n" "--html HTML output (default)\n" "--jspwiki JSPWiki output\n" "--latex LaTeX output\n" "--man man page output\n" "--mediawiki MediaWiki output\n" "--nme NME output\n" "--null no output (still process input)\n" "--strictcreole disable monospace, underline, subscript,\n" " superscript, definition lists, indented\n" " paragraphs and escape; and enable nowiki\n" " monospace\n" "--structdiv display division structure\n" "--structpar display paragraph structure\n" "--rtf RTF output\n" "--text plain text output\n" "--xref headings have hyperlink target labels\n", argv[0]); exit(0); } outputFormat.interwikis = interwikis; if (autoCCLink || autoURLLink) { int n = 0; if (autoCCLink) autoconverts[n++].cb = NMEAutoconvertCamelCase; if (autoURLLink) autoconverts[n++].cb = NMEAutoconvertURL; outputFormat.autoconverts = autoconverts; } src = malloc(SIZE); if (!src) exit(1); srcLen = fread(src, 1, SIZE, stdin); if (srcLen < 0) { free(src); exit(2); } buf = malloc(SIZE); if (!buf) exit(1); tocData.src = src; tocData.srcLen = srcLen; err = NMEProcess(src, srcLen, buf, SIZE, options, "\n", &outputFormat, fontSize, &dest, &destLen); if (err == kNMEErrOk) printf("%.*s", destLen, dest); else printf("Error %d\n", err); free((void *)buf); free((void *)src); return 0; }