nyctergatis.com

Contact

Projects
Sysquake Remote Live
NME
PDF
Hike
Sudoku
GifBuilder
jpeglib for Palm OS
MySQL Client
Cross-GCC for Mac OS
NMEStyle.c
Go to the documentation of this file.
00001 
00008 /* License: new BSD license (see header file) */
00009 
00010 #include "NMEStyle.h"
00011 
00012 NMEOutputFormat const NMEOutputFormatBasicText =
00013 {
00014     " ",    // space
00015     0,  // indentSpaces
00016     10, // defFontSize
00017     '%',    // ctrlChar
00018     "", "", // doc
00019     4,  // highest heading level
00020     "%%{i>0}%{i}. %%", "\n",    // heading
00021     "", "\n",   // par
00022     "\n",   // line break
00023     "", "", // pre
00024     "", "\n",   // pre line
00025     FALSE,  // sublistInListItem
00026     "", "", // UL
00027     "- ", "\n", // UL line
00028     "", "", // OL
00029     "%{i}. ", "\n", // OL line
00030     "", "", // DL
00031     "", " ",    // DT
00032     NULL,   // emptyDT
00033     "", "\n",   // DD
00034     "", "", // indented section
00035     "", "\n",   // indented par
00036     "", "", // table
00037     "", "\n",   // table row
00038     "", "\t",   // table header cell
00039     "", "\t",   // table normal cell
00040     "\n",   // hr
00041     "", "", // bold
00042     "", "", // italic
00043     "", "", // underline
00044     "", "", // superscript
00045     "", "", // subscript
00046     "", "", // monospace
00047     "", "", NULL, FALSE,    // link
00048     "", "", NULL, FALSE, FALSE, // image
00049     NULL,   // interwikis
00050     NULL, NULL, // encodeURLFun
00051     NULL, NULL, // char encoder
00052     NULL, NULL, // char pre encoder
00053     -1, NULL, NULL, // no wordwrap
00054     NULL, NULL, NULL, NULL, // process hooks
00055     NULL,   // plugins
00056     NULL    // autoconverts
00057 };
00058 
00059 void NMEStyleInit(NMEStyleTable *table, NMEInt size,
00060         NMEBoolean convertOffsetsToUnicode)
00061 {
00062     table->tableSize = (size - (sizeof(NMEStyleTable) - sizeof(NMEStyleSpan)))
00063             / sizeof(NMEStyleSpan);
00064     table->n = 0;
00065     table->convertOffsetsToUnicode = convertOffsetsToUnicode;
00066     table->depth = 0;
00067 }
00068 
00074 static NMEStyleEnum decodeStyle(NMEConstText markup, NMEInt level)
00075 {
00076     if (level == kNMEHookLevelSpan) // span
00077         switch (markup[0])
00078         {
00079             case '*':
00080                 return kNMEStyleCharBold;
00081             case '/':
00082                 return kNMEStyleCharItalic;
00083             case '_':
00084                 return kNMEStyleCharUnderline;
00085             case '^':
00086                 return kNMEStyleCharSuperscript;
00087             case ',':
00088                 return kNMEStyleCharSubscript;
00089             case '#':
00090                 return kNMEStyleCharMonospace;
00091             case '[':
00092                 return kNMEStyleCharLink;
00093             case '{':
00094                 return kNMEStyleCharImage;
00095             default:
00096                 return kNMEStyleCharPlain;
00097         }
00098     else    // par
00099         switch (markup[0])
00100         {
00101             case '{':
00102                 return kNMEStyleCharMonospace;
00103             case '=':
00104                 return kNMEStyleParHeading;
00105             case '*':
00106                 return kNMEStyleParUL;
00107             case '#':
00108                 return kNMEStyleParOL;
00109             case ';':
00110                 return markup[1] == ':' ? kNMEStyleParDT : kNMEStyleParDL;
00111             case ':':
00112                 return kNMEStyleParIndentedPar;
00113             case '|':
00114                 return kNMEStyleParTable;
00115             default:
00116                 return kNMEStyleParPlain;
00117         }
00118 }
00119 
00120 NMEErr NMEStyleSpanHook(NMEInt level,
00121         NMEInt item,
00122         NMEBoolean enter,
00123         NMEConstText markup,
00124         NMEInt srcIndex,
00125         NMEInt srcLineNumber,
00126         NMEContext *context,
00127         void *data)
00128 {
00129     NMEStyleTable *table = (NMEStyleTable *)data;
00130     NMEStyleEnum style = decodeStyle(markup, level);
00131     NMEStyleEnum substyle = kNMEStyleCharPlain;
00132     
00133     if (style == kNMEStyleCharPlain)
00134         return kNMEErrOk;
00135     else if (style == kNMEStyleParDL && markup[1] == '\0')
00136         substyle = kNMEStyleCharDT;
00137     else if (style == kNMEStyleParTable && markup[1] == '=')
00138         substyle = kNMEStyleCharTH;
00139     
00140     if (enter)
00141     {
00142         if (table->n >= table->tableSize)
00143             return kNMEErrStyleTableTooSmall;
00144         table->span[table->n].begin
00145                 = table->convertOffsetsToUnicode
00146                         ? NMECurrentOutputIndexUCS16(context)
00147                         : NMECurrentOutputIndex(context);
00148         table->span[table->n].style = style;
00149         table->span[table->n].level = level;
00150         NMECurrentLink(context,
00151                 &table->span[table->n].linkOffset, &table->span[table->n].linkLength);
00152         table->spanStack[table->depth++] = table->n;
00153         table->n++;
00154         if (substyle != kNMEStyleCharPlain)
00155         {
00156             if (table->n >= table->tableSize)
00157                 return kNMEErrStyleTableTooSmall;
00158             table->span[table->n] = table->span[table->n - 1];
00159             table->span[table->n].style = substyle;
00160             table->spanStack[table->depth++] = table->n;
00161             table->n++;
00162         }
00163     }
00164     else
00165     {
00166         NMEInt end = table->convertOffsetsToUnicode
00167                 ? NMECurrentOutputIndexUCS16(context)
00168                 : NMECurrentOutputIndex(context);
00169         
00170         if (table->depth + (substyle != kNMEStyleCharPlain ? 1 : 0) <= 0)
00171             return kNMEErrInternal;
00172         if (substyle != kNMEStyleCharPlain)
00173             table->span[table->spanStack[--table->depth]].end = end;
00174         table->span[table->spanStack[--table->depth]].end = end;
00175     }
00176     
00177     return kNMEErrOk;
00178 }
Generated by Doxygen.
Copyright 2007-2013, Yves Piguet.
All rights reserved.