00001
00007
00008
00009 #include "NMEStyle.h"
00010
00011 NMEOutputFormat const NMEOutputFormatBasicText =
00012 {
00013 " ",
00014 0,
00015 10,
00016 '%',
00017 "", "",
00018 4,
00019 "%%{i>0}%{i}. %%", "\n",
00020 "", "\n",
00021 "\n",
00022 "", "",
00023 "", "\n",
00024 "", "",
00025 "- ", "\n",
00026 "", "",
00027 "%{i}. ", "\n",
00028 "", "",
00029 "", " ",
00030 NULL,
00031 "", "\n",
00032 "", "",
00033 "", "\n",
00034 "", "",
00035 "", "\n",
00036 "", "\t",
00037 "", "\t",
00038 "\n",
00039 "", "",
00040 "", "",
00041 "", "",
00042 "", "",
00043 "", "",
00044 "", "",
00045 "", "", NULL, FALSE,
00046 "", "", NULL, FALSE, FALSE,
00047 NULL,
00048 NULL, NULL,
00049 NULL, NULL,
00050 NULL, NULL,
00051 -1, NULL, NULL,
00052 NULL, NULL, NULL, NULL,
00053 NULL,
00054 NULL
00055 };
00056
00057 void NMEStyleInit(NMEStyleTable *table, NMEInt size,
00058 NMEBoolean convertOffsetsToUnicode)
00059 {
00060 table->tableSize = (size - (sizeof(NMEStyleTable) - sizeof(NMEStyleSpan)))
00061 / sizeof(NMEStyleSpan);
00062 table->n = 0;
00063 table->convertOffsetsToUnicode = convertOffsetsToUnicode;
00064 table->depth = 0;
00065 }
00066
00072 static NMEStyleEnum decodeStyle(NMEConstText markup, NMEInt level)
00073 {
00074 if (level == kNMEHookLevelSpan)
00075 switch (markup[0])
00076 {
00077 case '*':
00078 return kNMEStyleCharBold;
00079 case '/':
00080 return kNMEStyleCharItalic;
00081 case '_':
00082 return kNMEStyleCharUnderline;
00083 case '^':
00084 return kNMEStyleCharSuperscript;
00085 case ',':
00086 return kNMEStyleCharSubscript;
00087 case '#':
00088 return kNMEStyleCharMonospace;
00089 case '[':
00090 return kNMEStyleCharLink;
00091 case '{':
00092 return kNMEStyleCharImage;
00093 default:
00094 return kNMEStyleCharPlain;
00095 }
00096 else
00097 switch (markup[0])
00098 {
00099 case '{':
00100 return kNMEStyleCharMonospace;
00101 case '=':
00102 return kNMEStyleParHeading;
00103 case '*':
00104 return kNMEStyleParUL;
00105 case '#':
00106 return kNMEStyleParOL;
00107 case ';':
00108 return markup[1] == ':' ? kNMEStyleParDT : kNMEStyleParDL;
00109 case ':':
00110 return kNMEStyleParIndentedPar;
00111 case '|':
00112 return kNMEStyleParTable;
00113 default:
00114 return kNMEStyleParPlain;
00115 }
00116 }
00117
00118 NMEErr NMEStyleSpanHook(NMEInt level,
00119 NMEInt item,
00120 NMEBoolean enter,
00121 NMEConstText markup,
00122 NMEInt srcIndex,
00123 NMEContext *context,
00124 void *data)
00125 {
00126 NMEStyleTable *table = (NMEStyleTable *)data;
00127 NMEStyleEnum style = decodeStyle(markup, level);
00128 NMEStyleEnum substyle = kNMEStyleCharPlain;
00129
00130 if (style == kNMEStyleCharPlain)
00131 return kNMEErrOk;
00132 else if (style == kNMEStyleParDL && markup[1] == '\0')
00133 substyle = kNMEStyleCharDT;
00134 else if (style == kNMEStyleParTable && markup[1] == '=')
00135 substyle = kNMEStyleCharTH;
00136
00137 if (enter)
00138 {
00139 if (table->n >= table->tableSize)
00140 return kNMEErrStyleTableTooSmall;
00141 table->span[table->n].begin
00142 = table->convertOffsetsToUnicode
00143 ? NMECurrentOutputIndexUCS16(context)
00144 : NMECurrentOutputIndex(context);
00145 table->span[table->n].style = style;
00146 table->span[table->n].level = level;
00147 NMECurrentLink(context,
00148 &table->span[table->n].linkOffset, &table->span[table->n].linkLength);
00149 table->spanStack[table->depth++] = table->n;
00150 table->n++;
00151 if (substyle != kNMEStyleCharPlain)
00152 {
00153 if (table->n >= table->tableSize)
00154 return kNMEErrStyleTableTooSmall;
00155 table->span[table->n] = table->span[table->n - 1];
00156 table->span[table->n].style = substyle;
00157 table->spanStack[table->depth++] = table->n;
00158 table->n++;
00159 }
00160 }
00161 else
00162 {
00163 NMEInt end = table->convertOffsetsToUnicode
00164 ? NMECurrentOutputIndexUCS16(context)
00165 : NMECurrentOutputIndex(context);
00166
00167 if (table->depth + (substyle != kNMEStyleCharPlain ? 1 : 0) <= 0)
00168 return kNMEErrInternal;
00169 if (substyle != kNMEStyleCharPlain)
00170 table->span[table->spanStack[--table->depth]].end = end;
00171 table->span[table->spanStack[--table->depth]].end = end;
00172 }
00173
00174 return kNMEErrOk;
00175 }