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;
}
Exemplo n.º 2
0
/// 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;
}