void CodeGenerator::generateMap() { QFile codeFile(":code.json"); if (!codeFile.open(QIODevice::ReadOnly)) { qWarning("Could not open code file"); return; } QByteArray codeData = codeFile.readAll(); QJsonDocument JDoc(QJsonDocument::fromJson(codeData)); if (!JDoc.isObject()) { qWarning("Code file: invalid file format"); return; } QJsonObject Main = JDoc.object(); QJsonArray Snippets = Main["snippets"].toArray(); QJsonArray Events = Main["events"].toArray(); QJsonArray Commands = Main["commands"].toArray(); QJsonArray Controls = Main["controls"].toArray(); QJsonArray Expressions = Main["expressions"].toArray(); for (QJsonArray::const_iterator it = Snippets.constBegin(); it != Snippets.constEnd(); it++) { QJsonObject Snippet = it->toObject(); _snippets[Snippet["name"].toString()] = processCodeField(Snippet["code"].toArray()); } for (QJsonArray::const_iterator it = Events.constBegin(); it != Events.constEnd(); it++) { QJsonObject Event = it->toObject(); CodeGenerator::Event tmp = {processCodeField(Event["code"].toArray()), Event["register"].toString()}; _events[Event["name"].toString()] = tmp; } for (QJsonArray::const_iterator it = Commands.constBegin(); it != Commands.constEnd(); it++) { QJsonObject Command = it->toObject(); _commands[Command["name"].toString()] = processCodeField(Command["code"].toArray()); } for (QJsonArray::const_iterator it = Controls.constBegin(); it != Controls.constEnd(); it++) { QJsonObject Control = it->toObject(); _controls[Control["name"].toString()] = processCodeField(Control["code"].toArray()); } for (QJsonArray::const_iterator it = Expressions.constBegin(); it != Expressions.constEnd(); it++) { QJsonObject Expression = it->toObject(); _expressions[Expression["name"].toString()] = Expression["code"].toString(); } }
QString ApplicationHelper::parseCode(const QString &code, const bool getLangOnly, const bool parseQuotes) { QFile f("./languages.txt"); if(!f.open(QIODevice::ReadOnly)) return code; QString languages = ""; QTextStream in(&f); while(!in.atEnd()) { QString line = in.readLine(); line.resize(line.indexOf(':')); line = line.trimmed(); languages += line + '|'; } f.close(); if(languages.size()) languages.resize(languages.length() - 1); languages = languages.toUpper(); QString result = code; QRegExp rx("\\[(" + languages + ")\\](.*)\\[/\\1\\]", Qt::CaseInsensitive); rx.setMinimal(true); int s = -1; QString ret = ""; while((s = rx.indexIn(result, s+1)) >= 0) { QString name = codeFile(rx.cap(1).trimmed().toUpper()); if(getLangOnly) return rx.cap(1); ret += rx.cap(1); result.replace(rx.cap(0), QString("<h6><b>%1 %2</b></h6><pre class='editor' lang='%3'>%4</pre>").arg( H::tr("Code"), codeTitle(name).toHtmlEscaped(), name.toHtmlEscaped(), rx.cap(2).toHtmlEscaped() )); s+= rx.cap(0).length(); } rx.setPattern("\\[img\\](https?://[^<>]+)\\[/img\\]"); result.replace(rx, "<a href='\\1' rel='prettyPhoto[gallery]'><img src=\\1' class='attach'></a>"); rx.setPattern("\\[url\\s*=\\s*([\"'])(.*)\\1\\](.+)\\[/url\\]"); result.replace(rx, "<a href='\\2' class='link' target='_blank'>\\3</a>"); rx.setPattern("\\[url\\](.+)\\[/url\\]"); result.replace(rx, "<a href='\\1' class='link' target='_blank'>\\1</a>"); const int BB_CODES_COUNT = 4; const QString classes[BB_CODES_COUNT] = {"bold", "cursive", "underline", "del"}; const QString bb_codes[BB_CODES_COUNT] = {"b", "i", "u", "s"}; for(int i = 0; i < BB_CODES_COUNT; ++i) { rx.setPattern("\\[" + bb_codes[i] + "\\](.*)\\[/" + bb_codes[i] + "\\]"); result.replace(rx, "<span class='" + classes[i] + "'>\\1</span>"); } if(parseQuotes) { rx.setPattern("\\[quote\\s*(?:=\\s*\"([^\"]*)\"\\s*)?\\](.+)\\[/quote\\]"); s = -1; while((s = rx.indexIn(result, s+1)) >= 0) { result.replace(rx.cap(0), QString("<div class='quote_container'>" "<div class='bbcode_postedby'>" "<img title='Цитата' src='/images/quote_icon.png' alt='Цитата' > Сообщение от <b>%1</b>" "</div>" "<div style='padding-left:20px;padding-top:10px'>" "<div class='message'>%2</div>" "</div>" "</div>").arg(rx.cap(1)).arg(rx.cap(2))); //s+= rx.cap(0).length(); } } result.replace("\n", "<br>"); return result; }