void QsCodeParser::setQuickDoc(Node *quickNode, const Doc& doc, const QStringList& qtParams, const QStringList& quickParams) { QRegExp quickifyCommand("\\\\" + COMMAND_QUICKIFY + "([^\n]*)(?:\n|$)"); if (quickNode->type() == Node::Function) { FunctionNode *quickFunc = (FunctionNode *) quickNode; quickFunc->setOverload(false); } if (doc.metaCommandsUsed().contains(COMMAND_QUICKIFY)) { QString source = doc.source(); int pos = source.indexOf(quickifyCommand); if (pos != -1) { QString quickifiedSource = quickNode->doc().source(); if (!qtParams.isEmpty() && qtParams != quickParams) renameParameters(quickifiedSource, doc, qtParams, quickParams); applyReplacementList(quickifiedSource, doc); do { QString extract = quickifiedSource; QString arg = quickifyCommand.cap(1).simplified(); if (!arg.isEmpty()) { if (arg.startsWith("/") && arg.endsWith("/") && arg.length() > 2) { QString pattern = arg.mid(1, arg.length() - 2); extractRegExp(QRegExp(pattern), extract, doc); } else { extractTarget(arg, extract, doc); } } source.replace(pos, quickifyCommand.matchedLength(), extract); pos += extract.length(); } while ((pos = source.indexOf(quickifyCommand, pos)) != -1); QRegExp quickcodeRegExp( "\\\\" + COMMAND_QUICKCODE + "(.*)\\\\" + COMMAND_ENDQUICKCODE); quickcodeRegExp.setMinimal(true); source.replace(quickcodeRegExp, ""); } Doc quickDoc(doc.location(), doc.location(), source, (CppCodeParser::topicCommands() + topicCommands() + CppCodeParser::otherMetaCommands()) << COMMAND_REPLACE); quickNode->setDoc(quickDoc, true); processOtherMetaCommands(quickDoc, quickNode); } else { quickNode->setDoc(doc, true); processOtherMetaCommands(doc, quickNode); } }
void QsCodeParser::setQtDoc(Node *quickNode, const Doc& doc) { if (!doc.isEmpty()) { Doc quickDoc(doc.location(), doc.location(), quickifiedDoc(doc.source()), CppCodeParser::topicCommands() + CppCodeParser::otherMetaCommands()); quickNode->setDoc(quickDoc, true); } }
/*! Sets this Node's Doc to \a doc. If \a replace is false and this Node already has a Doc, a warning is reported that the Doc is being overridden, and it reports where the previous Doc was found. If \a replace is true, the Doc is replaced silently. */ void Node::setDoc(const Doc& doc, bool replace) { if (!d.isEmpty() && !replace) { doc.location().warning(tr("Overrides a previous doc")); d.location().warning(tr("(The previous doc is here)")); } d = doc; }
void QsCodeParser::extractRegExp(const QRegExp& regExp, QString& source, const Doc& doc) { QRegExp blankLineRegExp( "[ \t]*(?:\n(?:[ \t]*\n)+[ \t]*|[ \n\t]*\\\\code|" "\\\\endcode[ \n\t]*)"); QStringList paras = source.trimmed().split(blankLineRegExp); paras = paras.filter(regExp); if (paras.count() == 0) { doc.location().warning(tr("Cannot find regular expression '%1'") .arg(regExp.pattern())); } else if (paras.count() > 1) { doc.location().warning(tr("Regular rexpression '%1' matches multiple" "times").arg(regExp.pattern())); } else { source = paras.first() + "\n\n"; } }
void QsCodeParser::processOtherMetaCommand(const Doc& doc, const QString& command, const QString& arg, Node *node) { if (command == COMMAND_PROTECTED) { doc.location().warning(tr("Cannot use '\\%1' in %2") .arg(COMMAND_PROTECTED).arg(language())); } else { CppCodeParser::processOtherMetaCommand(doc,command,arg,node); } }
void QsCodeParser::extractTarget(const QString& target, QString& source, const Doc& doc) { QRegExp targetRegExp( "(\\\\target\\s+(\\S+)[^\n]*\n" "(?:(?!\\s*\\\\code)[^\n]+\n|\\s*\\\\code.*\\\\endcode\\s*\n)*)" "(?:\\s*\n|[^\n]*$)"); targetRegExp.setMinimal(true); int pos = 0; while ((pos = source.indexOf(targetRegExp, pos)) != -1) { if (targetRegExp.cap(2) == target) { source = targetRegExp.cap(1) + "\n\n"; return; } pos += targetRegExp.matchedLength(); } doc.location().warning(tr("Cannot find target '%1'").arg(target)); }
void QsCodeParser::applyReplacementList(QString& source, const Doc& doc) { QStringList args = doc.metaCommandArgs(COMMAND_REPLACE); QStringList::ConstIterator a = args.begin(); while (a != args.end()) { if (replaceRegExp.exactMatch(*a)) { QRegExp before(replaceRegExp.cap(1)); before.setMinimal(true); QString after = replaceRegExp.cap(2); if (before.isValid()) { int oldLen = source.size(); source.replace(before, after); // this condition is sufficient but not necessary if (oldLen == source.size() && !source.contains(after)) doc.location().warning( tr("Regular expression '%1' did not match anything") .arg(before.pattern())); } else { doc.location().warning( tr("Invalid regular expression '%1'") .arg(before.pattern())); } } else { doc.location().warning(tr("Bad syntax in '\\%1'") .arg(COMMAND_REPLACE)); } ++a; } QRegExp codeRegExp("\\\\" + COMMAND_CODE + "(.*)\\\\" + COMMAND_ENDCODE); codeRegExp.setMinimal(true); QRegExp quickcodeRegExp( "\\\\" + COMMAND_QUICKCODE + "(.*)\\\\" + COMMAND_ENDQUICKCODE); quickcodeRegExp.setMinimal(true); int quickcodePos = doc.source().indexOf(quickcodeRegExp); if (quickcodePos != -1) { int codePos = source.indexOf(codeRegExp); if (codePos == -1) { doc.location().warning( tr("Cannot find any '\\%1' snippet corresponding to '\\%2'") .arg(COMMAND_CODE).arg(COMMAND_QUICKCODE)); } else { source.replace(codeRegExp.pos(1), codeRegExp.cap(1).length(), quickcodeRegExp.cap(1)); codePos = codeRegExp.pos(1) + quickcodeRegExp.cap(1).length(); if (doc.source().indexOf(quickcodeRegExp, quickcodePos + 1) != -1) { doc.location().warning( tr("Cannot use '\\%1' twice in a row") .arg(COMMAND_QUICKCODE)); } else if (source.indexOf(codeRegExp, codePos + 1) != -1) { doc.location().warning(tr("Ambiguous '\\%1'") .arg(COMMAND_QUICKCODE)); } } } }