diff options
author | albert-github <albert.tests@gmail.com> | 2018-10-01 16:58:03 (GMT) |
---|---|---|
committer | albert-github <albert.tests@gmail.com> | 2018-10-01 16:58:03 (GMT) |
commit | 47fee387821113956e10fffa79ea22062de8c817 (patch) | |
tree | 7762308ebbeb2f3465b6515450e2314ab048eb6f /src/docparser.cpp | |
parent | d7d4d5c443887cc63211febe40d43f26dfe41bc0 (diff) | |
download | Doxygen-47fee387821113956e10fffa79ea22062de8c817.zip Doxygen-47fee387821113956e10fffa79ea22062de8c817.tar.gz Doxygen-47fee387821113956e10fffa79ea22062de8c817.tar.bz2 |
issue_6517: Emoji support
Added issue support for the different output types.
- Sources of the emoji
- based on the Unicode definition v11.0:
- https://unicode.org/emoji/charts/full-emoji-list.html
- http://www.unicode.org/emoji/charts/full-emoji-modifiers.html
- github definition list:
- https://api.github.com/emojis
- Input of emoji: :<test>: with the restriction that direct after the opening colon and direct before the closing colon no space is allowed
- doctokinizer.l, adding detection of emoji and new command `\:`
- doktokinizer.h, adding "word" type TK_EMOJI
- docparser.* handling of new "word" type TK_EMOJI (analogous to HTML Entities), handling of new command `\:`
- cmdmapper,cpp, cmdmapper.h, adding new command `\:`
- htmlentity.cpp, adding new definition required for new command `\:`
- Emoji
- emoji.cpp, emoji.h, class for handling emoji analogous to HTML Entities, including small directions on how to update the code when a new emoji is defined. Not everything is converted to lowercase for comparison and accents are removed.
- doxygen.cpp possibility to create list of supported emoji
- handling emoji for output types (analogous to HTML Entities), see documentation for different output types
- docparser.h, *docvisitor.*
- rtfdocvisitor.* converting output to UTF-16 (based on http://scruss.com/blog/2017/03/12/in-the-unlikely-event-you-need-to-represent-emoji-in-rtf-using-perl/)
- latexdocvisitor.*, handling arguments for emoji in output (see also latexgen.cpp for meaning of the arguments of doxygenemoji).
- latexgen.cpp, adding new latex command for doxygen (doxygenemoji) and prevent too many open file (code before documentclass)
- config.xml, definition of `LATEX_EMOJI_DIRECTORY` with path to images required for LaTeX output
- Documentation:
- emojisup.doc, user description
- commands.doc, description of new command `\:`
- index.doc, reference to emoji chapter
- xmlcmds.doc, adjust reference to next chapter as a new chapter is added
- Doxyfile*, adding emoji chapter
Build system
- CMakeLists.txt adding new files
Diffstat (limited to 'src/docparser.cpp')
-rw-r--r-- | src/docparser.cpp | 123 |
1 files changed, 121 insertions, 2 deletions
diff --git a/src/docparser.cpp b/src/docparser.cpp index b39b80e..633dc03 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -55,6 +55,7 @@ #include "growbuf.h" #include "markdown.h" #include "htmlentity.h" +#include "emoji.h" // debug off #define DBG(x) do {} while(0) @@ -909,6 +910,10 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children, warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found while handling command %s", qPrint(g_token->name),qPrint(cmdName)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found while handling command %s", + qPrint(g_token->name),qPrint(cmdName)); + break; case TK_HTMLTAG: if (insideLI(parent) && Mappers::htmlTagMapper->map(g_token->name) && g_token->endTag) { // ignore </li> as the end of a style command @@ -1307,6 +1312,10 @@ static void defaultHandleTitleAndSize(const int cmd, DocNode *parent, QList<DocN warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -1369,7 +1378,7 @@ static bool defaultHandleToken(DocNode *parent,int tok, QList<DocNode> &children handleWord) { DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno)); - if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL || + if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_EMOJI|| tok==TK_URL || tok==TK_COMMAND || tok==TK_HTMLTAG ) { @@ -1404,6 +1413,9 @@ reparsetoken: case CMD_HASH: children.append(new DocSymbol(parent,DocSymbol::Sym_Hash)); break; + case CMD_COLON: + children.append(new DocSymbol(parent,DocSymbol::Sym_Colon)); + break; case CMD_DCOLON: children.append(new DocSymbol(parent,DocSymbol::Sym_DoubleColon)); break; @@ -1692,6 +1704,19 @@ reparsetoken: } } break; + case TK_EMOJI: + { + int s = DocEmoji::decodeEmoji(tokenName); + if (s!=0) + { + children.append(new DocEmoji(parent,s)); + } + else + { + return FALSE; + } + } + break; case TK_WHITESPACE: case TK_NEWPARA: handlepara: @@ -1769,6 +1794,12 @@ DocSymbol::SymType DocSymbol::decodeSymbol(const QCString &symName) return HtmlEntityMapper::instance()->name2sym(symName); } +int DocEmoji::decodeEmoji(const QCString &symName) +{ + DBG(("decodeSymbol(%s)\n",qPrint(symName))); + return EmojiEntityMapper::instance()->name2sym(symName); +} + //--------------------------------------------------------------------------- static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children, @@ -2340,6 +2371,10 @@ void DocSecRefItem::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -2482,6 +2517,10 @@ void DocInternalRef::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -2638,6 +2677,10 @@ void DocRef::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: break; default: @@ -2772,6 +2815,10 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink) warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: if (g_token->name!="see" || !isXmlLink) { @@ -2963,6 +3010,10 @@ void DocVhdlFlow::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -3099,6 +3150,10 @@ int DocHtmlHeader::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -3142,6 +3197,10 @@ int DocHRef::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: { @@ -3292,6 +3351,19 @@ int DocIndexEntry::parse() } } break; + case TK_EMOJI: + { + int s = DocEmoji::decodeEmoji(g_token->name); + if (s != 0) + { + m_entry+=g_token->name; + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected emoji found as argument of \\addindex"); + } + } + break; case TK_COMMAND: switch (Mappers::cmdMapper->map(g_token->name)) { @@ -3302,6 +3374,7 @@ int DocIndexEntry::parse() case CMD_AMP: m_entry+='&'; break; case CMD_DOLLAR: m_entry+='$'; break; case CMD_HASH: m_entry+='#'; break; + case CMD_COLON: m_entry+=":"; break; case CMD_DCOLON: m_entry+="::"; break; case CMD_PERCENT: m_entry+='%'; break; case CMD_NDASH: m_entry+="--"; break; @@ -3388,6 +3461,10 @@ int DocHtmlCaption::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: { int tagId=Mappers::htmlTagMapper->map(g_token->name); @@ -3997,6 +4074,10 @@ int DocHtmlDescTitle::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: { int tagId=Mappers::htmlTagMapper->map(g_token->name); @@ -4550,6 +4631,10 @@ void DocTitle::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -5467,6 +5552,9 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_PIPE: m_children.append(new DocSymbol(this,DocSymbol::Sym_Pipe)); break; + case CMD_COLON: + m_children.append(new DocSymbol(this,DocSymbol::Sym_Colon)); + break; case CMD_DCOLON: m_children.append(new DocSymbol(this,DocSymbol::Sym_DoubleColon)); break; @@ -6524,7 +6612,7 @@ int DocPara::parse() { reparsetoken: DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno)); - if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL || + if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_EMOJI || tok==TK_URL || tok==TK_COMMAND || tok==TK_HTMLTAG ) { @@ -6780,6 +6868,20 @@ reparsetoken: } break; } + case TK_EMOJI: + { + int s = DocEmoji::decodeEmoji(g_token->name); + if (s!=0) + { + m_children.append(new DocEmoji(this,s)); + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + } + break; + } case TK_NEWPARA: retval=TK_NEWPARA; goto endparagraph; @@ -6994,6 +7096,20 @@ void DocText::parse() } } break; + case TK_EMOJI: + { + int s = DocSymbol::decodeSymbol(g_token->name); + if (s!=0) + { + m_children.append(new DocEmoji(this,s)); + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + } + } + break; case TK_COMMAND: switch (Mappers::cmdMapper->map(g_token->name)) { @@ -7018,6 +7134,9 @@ void DocText::parse() case CMD_HASH: m_children.append(new DocSymbol(this,DocSymbol::Sym_Hash)); break; + case CMD_COLON: + m_children.append(new DocSymbol(this,DocSymbol::Sym_Colon)); + break; case CMD_DCOLON: m_children.append(new DocSymbol(this,DocSymbol::Sym_DoubleColon)); break; |