5 #include "wikiattrib.h"
7 #include "motoroutput.h"
12 #include "util_splitter.h"
13 #include "util_string.h"
14 #include <boost/ptr_container/ptr_vector.hpp>
15 #include <boost/unordered_map.hpp>
23 class WikiMlEnv: public MlEnv {
25 WikiMlEnv (MlPool* _mlpool, MlFTable* _mlftable): MlEnv (_mlpool, _mlftable) {};
26 virtual ~WikiMlEnv () {};
28 virtual void setVar (const ustring& name, MNode* val);
29 virtual void setAry (const ustring& name, size_t i, MNode* val);
30 virtual void setArySize (const ustring& name, size_t n);
31 virtual void setAry (const ustring& name, MNode* list);
32 virtual MNode* getVar (const ustring& name);
33 virtual MNode* getAry (const ustring& name, size_t i);
34 virtual size_t getArySize (const ustring& name);
35 virtual void setLocalVar (const ustring& name, MNode* val);
36 virtual void defineLocalVar (const ustring& name);
37 virtual ustring wikiVarName (const ustring& name);
40 class WikiMotorOutputString: public MotorOutputString {
44 WikiMotorOutputString (WikiFormat* _wiki): wiki (_wiki) {};
45 virtual ~WikiMotorOutputString () {};
46 virtual void flush (bool fsuper);
47 virtual bool isResponse () {
54 typedef boost::ptr_vector<WikiLine> linevec;
59 void (*fn) (WikiLine* wl, WikiFormat* wiki);
64 WikiLine (uiterator b, uiterator e, bool _fsuper) {
72 WikiLine (uiterator b0, uiterator b, uiterator e, bool _fsuper) {
81 virtual ~WikiLine () {
91 WikiLine::linevec* wl;
94 WikiMacro (MNode* _vars, WikiLine::linevec* _wl) {
102 virtual ~WikiMacro () {
110 class WikiLineScanner {
112 WikiLine::linevec* wlv;
115 WikiLineScanner (WikiLine::linevec* v) {
120 virtual ~WikiLineScanner () {};
122 virtual WikiLine* cur () {
123 if (0 <= idx && idx < wlv->size ()) {
129 virtual WikiLine* next () {
133 virtual void rollback () {
137 virtual bool isEnd () {
138 return idx >= wlv->size ();
174 WikiBlock (blockType t, WikiFormat* w): type (t), wiki (w) {};
175 virtual ~WikiBlock () {};
177 virtual void addLine (uiterator b, uiterator e) {
180 virtual bool nextLine (uiterator b, uiterator e) = 0;
181 virtual closeType closeLine (uiterator b, uiterator e) {
184 virtual void addLines (uiterator b, uiterator e) {
187 virtual void addHtml (const ustring& ht) {
190 virtual void close () {};
191 virtual void output (MotorOutput* out) = 0;
194 class WikiBlockComplex: public WikiBlock {
196 boost::ptr_vector<WikiBlock> block;
198 WikiBlockComplex (blockType t, WikiFormat* w): WikiBlock (t, w) {};
199 virtual ~WikiBlockComplex () {};
200 virtual void outputBlock (MotorOutput* out);
203 class WikiBlockParagraph: public WikiBlock {
208 WikiMotorObjVec objv;
210 WikiBlockParagraph (WikiFormat* w): WikiBlock (BlockParagraph, w) {
215 virtual ~WikiBlockParagraph () {};
217 virtual bool nextLine (uiterator b, uiterator e);
218 virtual void addLine (uiterator b, uiterator e);
219 virtual void addHtml (const ustring& ht);
220 virtual void output (MotorOutput* out);
222 inline WikiBlockParagraph* WikiBlockParagraph_type (WikiBlock* b) {
223 assert (b->type == WikiBlock::BlockParagraph);
224 return (WikiBlockParagraph*)b;
227 class WikiBlockH: public WikiBlockComplex {
234 WikiBlockH (WikiFormat* w): WikiBlockComplex (BlockH, w) {
237 virtual ~WikiBlockH () {};
239 virtual bool nextLine (uiterator b, uiterator e);
240 virtual void addLine (uiterator b, uiterator e);
241 virtual closeType closeLine (uiterator b, uiterator e);
242 virtual void close ();
243 virtual void output (MotorOutput* out);
244 virtual void outputBeginDiv (int lv, MotorOutput* out);
245 virtual void outputEndDiv (int lv, MotorOutput* out);
246 virtual bool checkEmpty ();
249 class WikiBlockPreformatRaw: public WikiBlock {
254 WikiBlockPreformatRaw (WikiFormat* w): WikiBlock (BlockPreformatRaw, w) {
257 virtual ~WikiBlockPreformatRaw () {};
259 virtual bool nextLine (uiterator b, uiterator e);
260 virtual void addLine (uiterator b, uiterator e);
261 virtual void output (MotorOutput* out);
265 class WikiBlockItemText: public WikiBlockComplex {
269 WikiAttribItem attrib;
270 WikiBlockItem* parent;
272 WikiBlockItemText (WikiFormat* w, WikiBlockItem* _p): WikiBlockComplex (BlockItemText, w), attrib (w, this) {
276 virtual ~WikiBlockItemText () {};
277 virtual bool nextLine (uiterator b, uiterator e);
278 virtual void addLine (uiterator b, uiterator e);
279 virtual bool checkAddLine (uiterator b, uiterator e);
280 virtual void output (MotorOutput* out);
283 class WikiBlockItem: public WikiBlock {
286 boost::ptr_vector<WikiBlockItemText> block;
289 WikiBlockItem (blockType t, WikiFormat* w): WikiBlock (t, w), attrib (w, WikiAttrib1::SEL_ID, false, WikiAttrib1::M_NORMAL) {
290 assert (t == BlockItemUL || t == BlockItemOL || t == BlockItemNL);
292 if (t == BlockItemOL)
293 attrib.selector |= WikiAttrib1::SEL_START;
295 virtual ~WikiBlockItem () {};
297 virtual bool nextLine (uiterator b, uiterator e);
298 virtual void setChar (char c);
299 virtual void addLine (uiterator b, uiterator e);
300 virtual void output (MotorOutput* out);
301 virtual void outputBlock (MotorOutput* out);
304 class WikiBlockItemDL: public WikiBlock {
306 boost::ptr_vector<WikiMotorObjVec> objv1;
307 boost::ptr_vector<WikiMotorObjVec> objv2;
309 WikiBlockItemDL (WikiFormat* w): WikiBlock (BlockItemDL, w) {};
310 virtual ~WikiBlockItemDL () {};
312 virtual bool nextLine (uiterator b, uiterator e);
313 virtual void addLine (uiterator b, uiterator e);
314 virtual void output (MotorOutput* out);
317 class WikiBlockTable: public WikiBlock {
322 boost::ptr_vector<WikiBlock> block;
323 WikiAttribTable cellattrib;
330 TableCell (WikiFormat* _wiki, WikiAttrib1::mode_t _mode): cellattrib (_wiki, WikiAttribTable::SEL_TD, _mode) {
337 virtual ~TableCell () {};
338 virtual void cellBody (WikiMotorObjVec* vtext, WikiBlockTable* table, int idx);
339 virtual void outputTD (WikiFormat* wiki, MotorOutput* out, bool fturn);
340 virtual void outputTDe (MotorOutput* out);
343 class CellList_t: public boost::ptr_vector<TableCell> {
345 WikiAttribTable rowattrib;
347 CellList_t (WikiFormat* _wiki): rowattrib (_wiki, WikiAttribTable::SEL_TR, WikiAttrib1::M_ATTRIB) {};
348 virtual ~CellList_t () {};
350 typedef boost::ptr_vector<CellList_t> TableAry_t;
353 WikiAttribTable attrib;
356 CellList_t defaultList;
360 WikiBlockTable (WikiFormat* _wiki): WikiBlock (BlockTable, _wiki), attrib (_wiki, WikiAttribTable::SEL_TABLE, WikiAttrib1::M_ATTRIB_TEXT), defaultList (_wiki) {
365 virtual ~WikiBlockTable () {};
367 virtual bool nextLine (uiterator b, uiterator e);
368 virtual void addLine (uiterator b, uiterator e);
369 virtual closeType closeLine (uiterator b, uiterator e);
370 virtual void output (MotorOutput* out);
371 virtual void addLine_head (uiterator b, uiterator e);
372 virtual void addLine_body (uiterator b, uiterator e);
373 virtual TableCell* newCell (int idx);
374 virtual TableCell* newCell (WikiAttribTable& rowattrib);
375 virtual void normalize ();
376 virtual void outputTableTag (MotorOutput* out);
377 virtual void outputTBody (MotorOutput* out);
378 virtual void outputTBodyCell (WikiFormat* wiki, MotorOutput* out, TableCell* cell);
381 class WikiBlockSelect: public WikiBlock {
390 SelectItem (): fvalue (false), fselect (false) {};
391 virtual ~SelectItem () {};
396 WikiAttribInput attrib;
397 std::vector<SelectItem> item;
399 WikiBlockSelect (WikiFormat* w): WikiBlock (BlockSelect, w), attrib (w, WikiAttribInput::SEL_ELSIZE) {
400 attrib.selector |= WikiAttrib1::SEL_DEFAULT2 | WikiAttrib1::SEL_MULTIPLE2 | WikiAttrib1::SEL_SCRIPT2;
403 virtual ~WikiBlockSelect () {};
405 virtual bool nextLine (uiterator b, uiterator e);
406 virtual void addLine (uiterator b, uiterator e);
407 virtual void addLine_head (uiterator b, uiterator e);
408 virtual void addLine_body (uiterator b, uiterator e);
409 virtual void close ();
410 virtual void output (MotorOutput* out);
413 class WikiBlockQuote: public WikiBlockComplex {
415 WikiBlockQuote (WikiFormat* w): WikiBlockComplex (BlockQuote, w) {};
416 virtual ~WikiBlockQuote () {};
418 virtual bool nextLine (uiterator b, uiterator e);
419 virtual closeType closeLine (uiterator b, uiterator e);
420 virtual void addLine (uiterator b, uiterator e);
421 virtual void output (MotorOutput* out);
424 class WikiBlockDiv: public WikiBlockComplex {
428 WikiBlockDiv (WikiFormat* w): WikiBlockComplex (BlockDiv, w), attrib (w, WikiAttrib1::SEL_CLASS2, false, WikiAttrib1::M_ATTRIB) {};
429 virtual ~WikiBlockDiv () {};
431 virtual bool nextLine (uiterator b, uiterator e);
432 virtual void addLine (uiterator b, uiterator e);
433 virtual closeType closeLine (uiterator b, uiterator e);
434 virtual void output (MotorOutput* out);
437 class WikiBlockForm: public WikiBlockComplex {
449 WikiBlockForm (WikiFormat* w): WikiBlockComplex (BlockForm, w), attrib (w, WikiAttrib1::SEL_TARGET, true, WikiAttrib1::M_ATTRIB) {
454 virtual ~WikiBlockForm () {};
456 virtual bool nextLine (uiterator b, uiterator e);
457 virtual void addLine (uiterator b, uiterator e);
458 virtual closeType closeLine (uiterator b, uiterator e);
459 virtual void output (MotorOutput* out);
462 class WikiBlockElement: public WikiBlockComplex {
466 WikiBlockElement (WikiFormat* w): WikiBlockComplex (BlockElement, w) {};
467 virtual ~WikiBlockElement () {};
469 virtual bool nextLine (uiterator b, uiterator e);
470 virtual void addLine (uiterator b, uiterator e);
471 virtual closeType closeLine (uiterator b, uiterator e);
472 virtual void output (MotorOutput* out);
475 class WikiBlockElementMap: public boost::unordered_map<ustring, WikiBlockElement*> {
477 WikiBlockElementMap () {};
478 virtual ~WikiBlockElementMap () {};
480 WikiBlockElement* get (const ustring& name) {
481 iterator it = find (name);
488 WikiBlockElement* put (const ustring& name, WikiBlockElement* e) {
489 std::pair<iterator, bool> x;
490 x = insert (value_type (name, e));
494 WikiBlockElement* del (const ustring& name) {
499 class WikiBlockHR: public WikiBlock {
501 WikiBlockHR (WikiFormat* w): WikiBlock (BlockHR, w) {};
502 virtual ~WikiBlockHR () {};
504 virtual bool nextLine (uiterator b, uiterator e);
505 virtual void addLine (uiterator b, uiterator e);
506 virtual void output (MotorOutput* out);
509 class WikiBlockRaw: public WikiBlock {
513 WikiBlockRaw(WikiFormat* w): WikiBlock (BlockRaw, w) {};
514 virtual ~WikiBlockRaw () {};
516 virtual bool nextLine (uiterator b, uiterator e);
517 virtual void addLine (uiterator b, uiterator e);
518 virtual void output (MotorOutput* out);
530 DepthCount (WikiFormat* _wiki) {
534 virtual ~DepthCount () {
536 assert (wiki->depth >= 0);
538 virtual bool test () {
539 return wiki->depth >= 32;
544 WikiBlockForm* curform;
551 boost::ptr_vector<WikiBlock> block;
552 boost::ptr_vector<WikiBlock>* blockp;
553 std::vector<WikiBlock*> bstack;
554 std::vector<boost::ptr_vector<WikiBlock>*> pstack;
555 WikiBlockElementMap elementMap;
561 WikiFormat (MotorEnv* e, bool mode) {
567 mlenv = new WikiMlEnv (env->mlenv->mlPool, &mlFTable);
570 mlenv->log = env->log;
572 mlenv->log = &std::cerr;
573 mlenv->setStartTime ();
575 mlFTable.setFTable (&GWikiFTable, NULL);
586 virtual ~WikiFormat () {
590 virtual void compile (const ustring& text, bool fsuper);
591 virtual void output (boost::ptr_vector<WikiBlock>& ary);
592 virtual void output () {
595 virtual void outputElement (const ustring& elementName);
596 virtual void pass1 (const ustring& text, WikiLine::linevec* block, bool fsuper);
597 virtual int pass1_1 (Splitter& sp, ustring* elseword, ustring* endword, WikiLine::linevec* block, uiterator* elsebegin0, uiterator* elsebegin, uiterator* elseend, bool fsuper);
598 virtual bool pass1_2 (Splitter& sp, uiterator& b, uiterator& e, uiterator& t, uiterator& u, uiterator& v, WikiLine::linevec* block, bool fsuper);
599 virtual void errorOutput ();
601 virtual bool checkClose (uiterator b, uiterator e);
602 virtual void compileLine (WikiLineScanner& scanner);
603 virtual void compileLines (WikiLineScanner& scanner, bool (*fn)(WikiLine& spp, WikiLineScanner& scanner, WikiFormat* wiki, void* par) = NULL, void* par = NULL);
604 virtual void pushBlockRaw (uiterator b, uiterator e);
605 virtual void push_block (boost::ptr_vector<WikiBlock>* b) {
606 bstack.push_back (cur);
608 pstack.push_back (blockp);
611 virtual void pop_block () {
614 cur = bstack.back ();
616 blockp = pstack.back ();
619 virtual int countWikiH (uiterator& b, uiterator e);
620 virtual void wikiMotor (uiterator b, uiterator e, WikiMotorObjVec& ans);
621 virtual ustring wikiMotor (uiterator b, uiterator e);
622 virtual void wikiMotorInline (uiterator b, uiterator e, WikiMotorObjVec& ans);
623 virtual void outputName (MotorOutput* out, const char* name, size_t len, const ustring& val, bool cond = true);
624 virtual void outputName (MotorOutput* out, const char* name, size_t len, long val, bool cond = true);
625 virtual void outputFlag (MotorOutput* out, const char* name, size_t len, bool flag);
626 virtual void outputID (MotorOutput* out, const ustring& id);
627 virtual void outputClass (MotorOutput* out, std::vector<ustring>& classes);
628 virtual void outputSubmitScript (MotorOutput* out, const char* name, size_t len, const ustring& onclick, bool scriptcut);
629 virtual void outputNum (MotorOutput* out, const char* name, size_t len, int val);
630 virtual MNode* getVar (const ustring& name) {
631 return mlenv->getVar (name);
633 virtual ustring getVar_string (const ustring& name) {
634 return mlenv->getVar_string (name);
636 virtual ustring getAry_string (const ustring& name, size_t i) {
637 return mlenv->getAry_string (name, i);
639 virtual size_t getArySize (const ustring& name) {
640 return mlenv->getArySize (name);
642 virtual MNode* arrayToTexp (const ustring& name);
643 virtual MNode* evalVar (const ustring& name);
644 virtual MNode* buildArgs (WikiMotorObjVecVec::const_iterator b, WikiMotorObjVecVec::const_iterator e);
645 virtual void logLispFunctionError (const ustring& msg, const ustring& cmd);
648 extern ustring uWiki;
649 extern ustring uAWiki;
651 #endif /* WIKIFORMAT_H */