summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorhalex2005 <halex2005@e1.ru>2015-03-30 13:26:58 (GMT)
committerhalex2005 <halex2005@e1.ru>2015-03-30 13:26:58 (GMT)
commit288ea42fc27389160c20912003a7972e21195265 (patch)
tree9cf5d2b3c7a1a40898a7b779da19edd7be5cfb56 /src
parent9d631b571bcf1826d00287bb82d8aac2da0a55c8 (diff)
downloadDoxygen-288ea42fc27389160c20912003a7972e21195265.zip
Doxygen-288ea42fc27389160c20912003a7972e21195265.tar.gz
Doxygen-288ea42fc27389160c20912003a7972e21195265.tar.bz2
add support for github flavored fenced code blocks
Diffstat (limited to 'src')
-rw-r--r--src/markdown.cpp8
-rw-r--r--src/pre.l20
-rw-r--r--src/scanner.l14
3 files changed, 39 insertions, 3 deletions
diff --git a/src/markdown.cpp b/src/markdown.cpp
index 5ecb198..32691d4 100644
--- a/src/markdown.cpp
+++ b/src/markdown.cpp
@@ -1366,7 +1366,9 @@ static bool isFencedCodeBlock(const char *data,int size,int refIndent,
int startTildes=0;
while (i<size && data[i]==' ') indent++,i++;
if (indent>=refIndent+4) return FALSE; // part of code block
- while (i<size && data[i]=='~') startTildes++,i++;
+ char tildaChar='~';
+ if (i<size && data[i]=='`') tildaChar='`';
+ while (i<size && data[i]==tildaChar) startTildes++,i++;
if (startTildes<3) return FALSE; // not enough tildes
if (i<size && data[i]=='{') i++; // skip over optional {
int startLang=i;
@@ -1376,11 +1378,11 @@ static bool isFencedCodeBlock(const char *data,int size,int refIndent,
start=i;
while (i<size)
{
- if (data[i]=='~')
+ if (data[i]==tildaChar)
{
end=i-1;
int endTildes=0;
- while (i<size && data[i]=='~') endTildes++,i++;
+ while (i<size && data[i]==tildaChar) endTildes++,i++;
while (i<size && data[i]==' ') i++;
if (i==size || data[i]=='\n')
{
diff --git a/src/pre.l b/src/pre.l
index 7c2ec2b..7865966 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -2465,6 +2465,19 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
BEGIN(SkipVerbatim);
}
}
+<SkipCComment>"```"[~]* {
+ static bool markdownSupport = Config_getBool("MARKDOWN_SUPPORT");
+ if (!markdownSupport)
+ {
+ REJECT;
+ }
+ else
+ {
+ outputArray(yytext,(int)yyleng);
+ g_fenceSize=yyleng;
+ BEGIN(SkipVerbatim);
+ }
+ }
<SkipCComment>[\\@][\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly"|"dot"|"code"("{"[^}]*"}")?){BN}+ {
outputArray(yytext,(int)yyleng);
g_yyLineNr+=QCString(yytext).contains('\n');
@@ -2606,6 +2619,13 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
BEGIN(SkipCComment);
}
}
+<SkipVerbatim>"```"[~]* {
+ outputArray(yytext,(int)yyleng);
+ if (g_fenceSize==yyleng)
+ {
+ BEGIN(SkipCComment);
+ }
+ }
<SkipVerbatim>"*/"|"/*" {
outputArray(yytext,(int)yyleng);
}
diff --git a/src/scanner.l b/src/scanner.l
index 2e111cb..b9243c9 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -6271,6 +6271,13 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
g_nestedComment=FALSE;
BEGIN(DocCopyBlock);
}
+<DocBlock>"```"[~]* {
+ docBlock+=yytext;
+ docBlockName="```";
+ g_fencedSize=yyleng;
+ g_nestedComment=FALSE;
+ BEGIN(DocCopyBlock);
+ }
<DocBlock>{B}*"<code>" {
if (insideCS)
{
@@ -6389,6 +6396,13 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
BEGIN(DocBlock);
}
}
+<DocCopyBlock>"```"[~]* {
+ docBlock+=yytext;
+ if (g_fencedSize==yyleng)
+ {
+ BEGIN(DocBlock);
+ }
+ }
<DocCopyBlock>[^\<@/*\]~\$\\\n]+ { // any character that is not special
docBlock+=yytext;
}