00001
00007
00008
00009 #include "NMEPluginTOC.h"
00010
00012 #define isBlankOrEol(c) ((c) == ' ' || (c) == '\t' || (c) == 10 || (c) == 13)
00013
00014 static void switchOutputFormatTOC(HookTOCData *hookData,
00015 NMEBoolean heading);
00016
00028 static NMEErr parHookTOC(NMEInt level,
00029 NMEInt item,
00030 NMEBoolean enter,
00031 NMEConstText markup,
00032 NMEInt srcIndex,
00033 NMEContext *context,
00034 void *data)
00035 {
00036 HookTOCData *d = (HookTOCData *)data;
00037
00038 if (markup[0] == '=' && level >= d->level1 && level <= d->level2)
00039 switchOutputFormatTOC(d, enter);
00040
00041 return kNMEErrOk;
00042 }
00043
00048 static void switchOutputFormatTOC(HookTOCData *hookData,
00049 NMEBoolean heading)
00050 {
00051 if (heading)
00052 {
00053 *hookData->outputFormat = NMEOutputFormatHTML;
00054 hookData->outputFormat->beginHeading
00055 = "%%{l} %%<a href=\"#h%{o}\">%%{i>0}%{i}. %%";
00056 hookData->outputFormat->endHeading = "</a><br />\n";
00057 hookData->outputFormat->lineBreak = " ";
00058 hookData->outputFormat->beginLink = "";
00059 hookData->outputFormat->endLink = "";
00060 hookData->outputFormat->sepLink = NULL;
00061 hookData->outputFormat->beginImage = "";
00062 hookData->outputFormat->endImage = "";
00063 hookData->outputFormat->sepImage = NULL;
00064 }
00065 else
00066 {
00067 *hookData->outputFormat = NMEOutputFormatNull;
00068 hookData->outputFormat->beginDoc
00069 = "<html>\n<body>\n<p%%{s>0} style=\"font-size:%{s}pt\"%%>\n";
00070 hookData->outputFormat->endDoc = "</p>\n</body>\n</html>\n";
00071 }
00072 hookData->outputFormat->parHookFun = parHookTOC;
00073 hookData->outputFormat->hookData = (void *)hookData;
00074 }
00075
00076 void NMESetTOCOutputFormat(NMEOutputFormat *f, HookTOCData *d)
00077 {
00078 d->level1 = 1;
00079 d->level2 = 4;
00080 d->links = TRUE;
00081 d->outputFormat = f;
00082 switchOutputFormatTOC(d, FALSE);
00083 }
00084
00085 NMEErr NMEPluginTOC(NMEConstText name, NMEInt nameLen,
00086 NMEConstText data, NMEInt dataLen,
00087 NMEContext *context,
00088 void *userData)
00089 {
00090 char *endp;
00091 HookTOCData hookData;
00092 NMEText title, buf, dest;
00093 NMEInt titleLen, bufLen, destLen;
00094 NMEOutputFormat outputFormat;
00095 NMEInt options, fontSize;
00096 NMEErr err;
00097 (void)name;
00098 (void)nameLen;
00099
00100 NMESetTOCOutputFormat(&outputFormat, &hookData);
00101
00102
00103 hookData.level1 = strtol(data, &endp, 0);
00104 hookData.level2 = strtol(endp, &endp, 0);
00105 if (hookData.level1 < 1)
00106 return kNMEErrOk;
00107 if (hookData.level2 < hookData.level1)
00108 hookData.level2 = hookData.level1;
00109
00110
00111 for (title = endp; title < data + dataLen && isBlankOrEol(title[0]); title++)
00112 ;
00113 for (titleLen = dataLen - (title - data);
00114 titleLen > 0 && isBlankOrEol(title[titleLen - 1]);
00115 titleLen--)
00116 ;
00117
00118
00119 NMEGetTempMemory(context, &buf, &bufLen);
00120 NMEGetFormat(context, NULL, &options, &fontSize);
00121 err = NMEProcess(((NMEPluginTocData *)userData)->src,
00122 ((NMEPluginTocData *)userData)->srcLen,
00123 buf, bufLen,
00124 options | kNMEProcessOptNoPreAndPost, "\n", &outputFormat, fontSize,
00125 &dest, &destLen, NULL);
00126 if (err != kNMEErrOk)
00127 return err;
00128
00129
00130 if (titleLen > 0)
00131 if (!NMEAddString("<h2%%{s>0} style=\"font-size:%{2*s}pt\"%%>", -1, '%', context)
00132 || !NMEAddString(title, titleLen, '\0', context)
00133 || !NMEAddString("</h2>\n", -1, '%', context))
00134 return kNMEErrNotEnoughMemory;
00135
00136
00137 if (!NMEAddString("<p%%{s>0} style=\"font-size:%{s}pt\"%%>\n", -1, '%', context)
00138 || !NMEAddString(dest, destLen, '\0', context)
00139 || !NMEAddString("</p>\n", -1, '%', context))
00140 return kNMEErrNotEnoughMemory;
00141
00142 return kNMEErrOk;
00143 }