static void codifyLines(CodeOutputInterface &ol,FileDef *fd,const char *text, uint &line,uint &column,const char *fontClass=0) { if (fontClass) ol.startFontClass(fontClass); const char *p=text,*sp=p; char c; bool done=FALSE; while (!done) { sp=p; while ((c=*p++) && c!='\n') { column++; } if (c=='\n') { line++; int l = (int)(p-sp-1); column=l+1; char *tmp = (char*)malloc(l+1); memcpy(tmp,sp,l); tmp[l]='\0'; ol.codify(tmp); free(tmp); if (fontClass) ol.endFontClass(); ol.endCodeLine(); ol.startCodeLine(TRUE); writeLineNumber(ol,fd,line); if (fontClass) ol.startFontClass(fontClass); } else { ol.codify(sp); done=TRUE; } } if (fontClass) ol.endFontClass(); }
static void writeMessage(QTextStream *t, const TranslatorMessage &msg, int indent, const QString &languageCode) { static int msgid = 1; if (msg.isPlural()) { writeIndent(t, indent); (*t) << "<group restype=\"" << restypePlurals << "\">\n"; indent+=2; writeLineNumber(t, msg, indent); writeComment(t, msg, indent); QLocale::Language l; QLocale::Country c; MetaTranslator::languageAndCountry(languageCode, &l, &c); QStringList translns = MetaTranslator::normalizedTranslations(msg, l, c); for (int j = 0; j < qMax(1, translns.count()); ++j) { writeTransUnit(t, msg, msgid, indent, translns.at(j)); } indent-=2; writeIndent(t, indent); (*t) << "</group>\n"; } else { writeTransUnit(t, msg, msgid, indent); } ++msgid; }
static void codifyLines(CodeOutputInterface &ol, QSharedPointer<FileDef> fd, const QString &text, uint &line, uint &column, const QString &fontClass) { if (! fontClass.isEmpty()) { ol.startFontClass(fontClass); } const QChar *p = text.constData(); const QChar *sp = p; const QChar *ptr = p; QChar c; bool done = false; while (! done) { sp = p; while ((c = *p++) != 0 && c != '\n') { column++; } if (c == '\n') { line++; int l = (int)(p - sp - 1); column = l + 1; char *tmp = (char *)malloc(l + 1); memcpy(tmp, sp, l); tmp[l] = '\0'; ol.codify(tmp); free(tmp); if (! fontClass.isEmpty()) { ol.endFontClass(); } ol.endCodeLine(); ol.startCodeLine(true); writeLineNumber(ol, fd, line); if (! fontClass.isEmpty()) { ol.startFontClass(fontClass.toUtf8()); } } else { ol.codify(text.mid(sp - ptr) ); done = true; } } if (! fontClass.isEmpty()) { ol.endFontClass(); } }
static void writeTransUnit(QTextStream *t, const TranslatorMessage &msg, int msgid, int indent, const QString &translation = QString()) { static int plural = 0; static int prevMsgId = -1; writeIndent(t, indent); (*t) << "<trans-unit id=\"msg"; QString strid; QByteArray transl; if (msg.isPlural()) { if (prevMsgId != msgid) plural = 0; strid = QString::fromAscii("%1[%2]").arg(msgid).arg(plural); ++plural; transl = translation.toUtf8(); } else { strid = QString::fromAscii("%1").arg(msgid); plural = 0; transl = msg.translation().toUtf8(); } prevMsgId = msgid; (*t) << strid << "\""; QString state; indent+=2; if (msg.type() == TranslatorMessage::Obsolete) { (*t) << " translate=\"no\""; } else { state = msg.type() == TranslatorMessage::Finished ? QLatin1String("final") : QLatin1String("new"); state = QString::fromAscii(" state=\"%1\"").arg(state); } (*t) << ">\n"; writeIndent(t, indent); (*t) << "<source xml:space=\"preserve\">" << evilBytes(msg.sourceText(), msg.utf8()) << "</source>\n"; writeIndent(t, indent); (*t) << "<target xml:space=\"preserve\"" << state << ">" << evilBytes2(transl, msg.utf8()) << "</target>\n"; // ### In XLIFF 1.1, name is marked as required, and it must be unique // This is questionable behaviour, and was brought up at the xliff-comments mailinglist. if (!msg.isPlural()) { writeLineNumber(t, msg, indent); writeComment(t, msg, indent); } indent-=2; writeIndent(t, indent); (*t) << "</trans-unit>\n"; }
static void writeMultiLineCodeLink(CodeOutputInterface &ol, QSharedPointer<FileDef> fd, uint &line, uint &column, QSharedPointer<Definition> d, const QString &text) { static bool sourceTooltips = Config::getBool("source-tooltips"); TooltipManager::instance()->addTooltip(d); QString ref = d->getReference(); QString file = d->getOutputFileBase(); QString anchor = d->anchor(); QString tooltip; if (! sourceTooltips) { // fall back to simple "title" tooltips tooltip = d->briefDescriptionAsTooltip(); } QString tmp; for (auto c : text) { if (c == '\n') { line++; ol.writeCodeLink(ref, file, anchor, tmp, tooltip); ol.endCodeLine(); ol.startCodeLine(true); writeLineNumber(ol, fd, line); tmp = ""; } else { column++; tmp += c; } } if (! tmp.isEmpty() ) { ol.writeCodeLink(ref, file, anchor, tmp, tooltip); } }
static void writeMultiLineCodeLink(CodeOutputInterface &ol, FileDef *fd,uint &line,uint &column, Definition *d, const char *text) { static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS); TooltipManager::instance()->addTooltip(d); QCString ref = d->getReference(); QCString file = d->getOutputFileBase(); QCString anchor = d->anchor(); QCString tooltip; if (!sourceTooltips) // fall back to simple "title" tooltips { tooltip = d->briefDescriptionAsTooltip(); } bool done=FALSE; char *p=(char *)text; while (!done) { char *sp=p; char c; while ((c=*p++) && c!='\n') { column++; } if (c=='\n') { line++; *(p-1)='\0'; //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp); ol.writeCodeLink(ref,file,anchor,sp,tooltip); ol.endCodeLine(); ol.startCodeLine(TRUE); writeLineNumber(ol,fd,line); } else { //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp); ol.writeCodeLink(ref,file,anchor,sp,tooltip); done=TRUE; } } }
static void writeMessage(QTextStream &ts, const TranslatorMessage &msg, const QRegExp &drops, int indent) { if (msg.isPlural()) { writeIndent(ts, indent); ts << "<group restype=\"" << restypePlurals << "\""; if (!msg.id().isEmpty()) ts << " id=\"" << msg.id() << "\""; if (msg.type() == TranslatorMessage::Obsolete) ts << " translate=\"no\""; ts << ">\n"; ++indent; writeLineNumber(ts, msg, indent); writeComment(ts, msg, drops, indent); writeTransUnits(ts, msg, drops, indent); --indent; writeIndent(ts, indent); ts << "</group>\n"; } else { writeTransUnits(ts, msg, drops, indent); } }
static void writeTransUnits(QTextStream &ts, const TranslatorMessage &msg, const QRegExp &drops, int indent) { static int msgid; QString msgidstr = !msg.id().isEmpty() ? msg.id() : QString::fromAscii("_msg%1").arg(++msgid); QStringList translns = msg.translations(); QHash<QString, QString>::const_iterator it; QString pluralStr; QStringList sources(msg.sourceText()); if ((it = msg.extras().find(QString::fromLatin1("po-msgid_plural"))) != msg.extras().end()) sources.append(*it); QStringList oldsources; if (!msg.oldSourceText().isEmpty()) oldsources.append(msg.oldSourceText()); if ((it = msg.extras().find(QString::fromLatin1("po-old_msgid_plural"))) != msg.extras().end()) { if (oldsources.isEmpty()) { if (sources.count() == 2) oldsources.append(QString()); else pluralStr = QLatin1Char(' ') + QLatin1String(attribPlural) + QLatin1String("=\"yes\""); } oldsources.append(*it); } QStringList::const_iterator srcit = sources.begin(), srcend = sources.end(), oldsrcit = oldsources.begin(), oldsrcend = oldsources.end(), transit = translns.begin(), transend = translns.end(); int plural = 0; QString source; while (srcit != srcend || oldsrcit != oldsrcend || transit != transend) { QByteArray attribs; QByteArray state; if (msg.type() == TranslatorMessage::Obsolete) { if (!msg.isPlural()) attribs = " translate=\"no\""; } else if (msg.type() == TranslatorMessage::Finished) { attribs = " approved=\"yes\""; } else if (transit != transend && !transit->isEmpty()) { state = " state=\"needs-review-translation\""; } writeIndent(ts, indent); ts << "<trans-unit id=\"" << msgidstr; if (msg.isPlural()) ts << "[" << plural++ << "]"; ts << "\"" << attribs << ">\n"; ++indent; writeIndent(ts, indent); if (srcit != srcend) { source = *srcit; ++srcit; } // else just repeat last element ts << "<source xml:space=\"preserve\">" << protect(source) << "</source>\n"; bool puttrans = false; QString translation; if (transit != transend) { translation = *transit; translation.replace(QChar(Translator::BinaryVariantSeparator), QChar(Translator::TextVariantSeparator)); ++transit; puttrans = true; } do { if (oldsrcit != oldsrcend && !oldsrcit->isEmpty()) { writeIndent(ts, indent); ts << "<alt-trans>\n"; ++indent; writeIndent(ts, indent); ts << "<source xml:space=\"preserve\"" << pluralStr << '>' << protect(*oldsrcit) << "</source>\n"; if (!puttrans) { writeIndent(ts, indent); ts << "<target restype=\"" << restypeDummy << "\"/>\n"; } } if (puttrans) { writeIndent(ts, indent); ts << "<target xml:space=\"preserve\"" << state << ">" << protect(translation) << "</target>\n"; } if (oldsrcit != oldsrcend) { if (!oldsrcit->isEmpty()) { --indent; writeIndent(ts, indent); ts << "</alt-trans>\n"; } ++oldsrcit; } puttrans = false; } while (srcit == srcend && oldsrcit != oldsrcend); if (!msg.isPlural()) { writeLineNumber(ts, msg, indent); writeComment(ts, msg, drops, indent); } --indent; writeIndent(ts, indent); ts << "</trans-unit>\n"; } }
void ClangParser::writeSources(CodeOutputInterface &ol,FileDef *fd) { TooltipManager::instance()->clearTooltips(); // (re)set global parser state g_currentDefinition=0; g_currentMemberDef=0; g_currentLine=0; g_searchForBody=FALSE; g_insideBody=FALSE; g_bracketCount=0; unsigned int line=1,column=1; QCString lineNumber,lineAnchor; ol.startCodeLine(TRUE); writeLineNumber(ol,fd,line); for (unsigned int i=0;i<p->numTokens;i++) { CXSourceLocation start = clang_getTokenLocation(p->tu, p->tokens[i]); unsigned int l, c; clang_getSpellingLocation(start, 0, &l, &c, 0); if (l > line) column = 1; while (line<l) { line++; ol.endCodeLine(); ol.startCodeLine(TRUE); writeLineNumber(ol,fd,line); } while (column<c) { ol.codify(" "); column++; } CXString tokenString = clang_getTokenSpelling(p->tu, p->tokens[i]); char const *s = clang_getCString(tokenString); CXCursorKind cursorKind = clang_getCursorKind(p->cursors[i]); CXTokenKind tokenKind = clang_getTokenKind(p->tokens[i]); //printf("%d:%d %s cursorKind=%d tokenKind=%d\n",line,column,s,cursorKind,tokenKind); switch (tokenKind) { case CXToken_Keyword: if (strcmp(s,"operator")==0) { linkIdentifier(ol,fd,line,column,s,i); } else { codifyLines(ol,fd,s,line,column, cursorKind==CXCursor_PreprocessingDirective ? "preprocessor" : keywordToType(s)); } break; case CXToken_Literal: if (cursorKind==CXCursor_InclusionDirective) { linkInclude(ol,fd,line,column,s); } else if (s[0]=='"' || s[0]=='\'') { codifyLines(ol,fd,s,line,column,"stringliteral"); } else { codifyLines(ol,fd,s,line,column); } break; case CXToken_Comment: codifyLines(ol,fd,s,line,column,"comment"); break; default: // CXToken_Punctuation or CXToken_Identifier if (tokenKind==CXToken_Punctuation) { detectFunctionBody(s); //printf("punct %s: %d\n",s,cursorKind); } switch (cursorKind) { case CXCursor_PreprocessingDirective: codifyLines(ol,fd,s,line,column,"preprocessor"); break; case CXCursor_MacroDefinition: codifyLines(ol,fd,s,line,column,"preprocessor"); break; case CXCursor_InclusionDirective: linkInclude(ol,fd,line,column,s); break; case CXCursor_MacroExpansion: linkMacro(ol,fd,line,column,s); break; default: if (tokenKind==CXToken_Identifier || (tokenKind==CXToken_Punctuation && // for operators (cursorKind==CXCursor_DeclRefExpr || cursorKind==CXCursor_MemberRefExpr || cursorKind==CXCursor_CallExpr || cursorKind==CXCursor_ObjCMessageExpr) ) ) { linkIdentifier(ol,fd,line,column,s,i); if (Doxygen::searchIndex) { ol.addWord(s,FALSE); } } else { codifyLines(ol,fd,s,line,column); } break; } } clang_disposeString(tokenString); } ol.endCodeLine(); TooltipManager::instance()->writeTooltips(ol); }
void ClangParser::writeSources(CodeOutputInterface &ol, QSharedPointer<FileDef> fd) { TooltipManager::instance()->clearTooltips(); // set global parser state g_currentDefinition = QSharedPointer<Definition>(); g_currentMemberDef = QSharedPointer<MemberDef>(); g_currentLine = 0; g_searchForBody = false; g_insideBody = false; g_bracketCount = 0; unsigned int line = 1; unsigned int column = 1; QString lineNumber; QString lineAnchor; ol.startCodeLine(true); writeLineNumber(ol, fd, line); for (unsigned int i = 0; i < p->numTokens; i++) { CXSourceLocation start = clang_getTokenLocation(p->tu, p->tokens[i]); unsigned int t_line; unsigned int t_col; clang_getSpellingLocation(start, 0, &t_line, &t_col, 0); if (t_line > line) { column = 1; } while (line < t_line) { line++; ol.endCodeLine(); ol.startCodeLine(true); writeLineNumber(ol, fd, line); } while (column < t_col) { ol.codify(" "); column++; } CXString tokenString = clang_getTokenSpelling(p->tu, p->tokens[i]); char const *s = clang_getCString(tokenString); CXCursorKind cursorKind = clang_getCursorKind(p->cursors[i]); CXTokenKind tokenKind = clang_getTokenKind(p->tokens[i]); switch (tokenKind) { case CXToken_Keyword: if (strcmp(s, "operator") == 0) { linkIdentifier(ol, fd, line, column, s, i); } else { QString temp; if (cursorKind == CXCursor_PreprocessingDirective) { temp = "preprocessor"; } else { temp = keywordToType(s); } codifyLines(ol, fd, s, line, column, temp); } break; case CXToken_Literal: if (cursorKind == CXCursor_InclusionDirective) { linkInclude(ol, fd, line, column, s); } else if (s[0] == '"' || s[0] == '\'') { codifyLines(ol, fd, s, line, column, "stringliteral"); } else { codifyLines(ol, fd, s, line, column, ""); } break; case CXToken_Comment: codifyLines(ol, fd, s, line, column, "comment"); break; default: // CXToken_Punctuation or CXToken_Identifier if (tokenKind == CXToken_Punctuation) { detectFunctionBody(s); } switch (cursorKind) { case CXCursor_PreprocessingDirective: codifyLines(ol, fd, s, line, column, "preprocessor"); break; case CXCursor_MacroDefinition: codifyLines(ol, fd, s, line, column, "preprocessor"); break; case CXCursor_InclusionDirective: linkInclude(ol, fd, line, column, s); break; case CXCursor_MacroExpansion: linkMacro(ol, fd, line, column, s); break; default: if (tokenKind == CXToken_Identifier || (tokenKind == CXToken_Punctuation && (cursorKind == CXCursor_DeclRefExpr || cursorKind == CXCursor_MemberRefExpr || cursorKind == CXCursor_CallExpr || cursorKind == CXCursor_ObjCMessageExpr)) ) { linkIdentifier(ol, fd, line, column, s, i); if (Doxy_Globals::searchIndex) { ol.addWord(s, false); } } else { codifyLines(ol, fd, s, line, column, ""); } break; } } clang_disposeString(tokenString); } ol.endCodeLine(); TooltipManager::instance()->writeTooltips(ol); }