void MainWindow::onMessage(IrcPrivateMessage *message) { auto messages = read.getMessages(message->target()); int messageCount = 150; // Subject to change via settings, currently set as twitch default PattyIrcMessage* pattyMsg = PattyIrcMessage::fromMessage(message); messages->append(pattyMsg); if (message->target() == this->currentChannel) { QString html; QWebFrame* frame = this->ui->baseChatWindow->page()->mainFrame(); this->scrollValue = frame->scrollBarValue(Qt::Vertical); this->autoScroll = (this->scrollValue >= frame->scrollBarMaximum(Qt::Vertical)); if (this->autoScroll) { while (messages->count() > messageCount) { delete messages->takeFirst(); QWebElement message = frame->findFirstElement("div.message"); message.removeFromDocument(); } } addMessage(pattyMsg); } else { if (messages->count() > messageCount) { delete messages->takeFirst(); } } }
void lmcMessageLog::removeMessageLog(QString divClass) { QWebFrame* frame = page()->mainFrame(); QWebElement document = frame->documentElement(); QWebElement body = document.findFirst("body"); QWebElement element = body.findFirst("div." + divClass); element.removeFromDocument(); }
void QtWebKitWebPage::updateBlockedPageElements(const QStringList domainList, const bool isException) { for (int i = 0; i < domainList.count(); ++i) { const QList<QString> exceptionList = isException ? ContentBlockingManager::getHidingRulesExceptions().values(domainList.at(i)) : ContentBlockingManager::getSpecificDomainHidingRules().values(domainList.at(i)); for (int j = 0; j < exceptionList.count(); ++j) { const QWebElementCollection elements = mainFrame()->documentElement().findAll(exceptionList.at(j)); for (int k = 0; k < elements.count(); ++k) { QWebElement element = elements.at(k); if (element.isNull()) { continue; } if (isException) { element.setStyleProperty(QLatin1String("display"), QLatin1String("block")); } else { element.removeFromDocument(); } } } } }
void HtmlExtractor::move(QWebElement &element, const QString &file, bool outer) { if(!element.isNull()) { WriteFile(file, outer?element.toOuterXml():element.toInnerXml()); element.removeFromDocument(); } }
void EnmlFormatter::fixImgNode(QWebElement &e) { QString enType = e.attribute("en-tag", ""); // Check if we have an en-crypt tag. Change it from an img to en-crypt if (enType.toLower() == "en-crypt") { QString encrypted = e.attribute("alt"); QString cipher = e.attribute("cipher", "RC2"); QString hint = e.attribute("hint", ""); QString length = e.attribute("length", "64"); e.removeAttribute("onmouseover"); e.removeAttribute("name"); e.removeAttribute("alt"); e.removeAttribute("en-tag"); e.removeAttribute("contenteditable"); e.removeAttribute("style"); removeInvalidAttributes(e); e.setInnerXml(encrypted); e.setOuterXml("<en-crypt cipher=\"" +cipher +"\" length=\"" + length + "\" hint=\"" +hint +"\">"+encrypted+"</en-crypt>"); // e.setOuterXml(e.toOuterXml().replace("<img", "<en-crypt").replace("</img", "</en-crypt")); return; } // Check if we have a temporary image. If so, remove it if (enType.toLower() == "temporary") {; e.removeFromDocument(); return; } // Latex images are really just img tags, so we now handle them later // Check if we have a LaTeX image. Remove the parent link tag // if (enType.toLower() == "en-latex") { // enType = "en-media"; // parent.parentNode().replaceChild(e, parent); // } // If we've gotten this far, we have an en-media tag e.removeAttribute("en-tag"); int lid = e.attribute("lid").toInt(); resources.append(lid); removeInvalidAttributes(e); e.setOuterXml(e.toOuterXml().replace("<img", "<en-media").replace("</img", "</en-media")); }
void EnmlFormatter::fixObjectNode(QWebElement &e) { QString type = e.attribute("type", ""); if (type == "application/pdf") { qint32 lid = e.attribute("lid", "0").toInt(); e.removeAttribute("width"); e.removeAttribute("height"); e.removeAttribute("lid"); e.removeAttribute("border"); if (lid>0) { resources.append(lid); e.setOuterXml(e.toOuterXml().replace("<object", "<en-media").replace("</object", "</en-media")); } removeInvalidAttributes(e); } else { e.removeFromDocument(); } }
void UserFiltersModel::blockImage () { QAction *blocker = qobject_cast<QAction*> (sender ()); if (!blocker) { qWarning () << Q_FUNC_INFO << "sender is not a QAction*" << sender (); return; } QUrl blockUrl = blocker->property ("CleanWeb/URL").value<QUrl> (); QWebView *view = qobject_cast<QWebView*> (blocker-> property ("CleanWeb/View").value<QObject*> ()); if (InitiateAdd (blockUrl.toString ()) && view) { QWebFrame *frame = view->page ()->mainFrame (); QWebElement elem = frame->findFirstElement ("img[src=\"" + blockUrl.toEncoded () + "\"]"); if (!elem.isNull ()) elem.removeFromDocument (); } }
void QtWebKitChatView::addMessageTop(boost::shared_ptr<ChatSnippet> snippet) { // save scrollbar maximum value if (!topMessageAdded_) { scrollBarMaximum_ = webPage_->mainFrame()->scrollBarMaximum(Qt::Vertical); } topMessageAdded_ = true; QWebElement continuationElement = firstElement_.findFirst("#insert"); bool insert = snippet->getAppendToPrevious(); bool fallback = continuationElement.isNull(); boost::shared_ptr<ChatSnippet> newSnippet = (insert && fallback) ? snippet->getContinuationFallbackSnippet() : snippet; QWebElement newElement = snippetToDOM(newSnippet); if (insert && !fallback) { Q_ASSERT(!continuationElement.isNull()); continuationElement.replace(newElement); } else { continuationElement.removeFromDocument(); topInsertPoint_.prependOutside(newElement); } firstElement_ = newElement; if (lastElement_.isNull()) { lastElement_ = firstElement_; } if (fontSizeSteps_ != 0) { double size = 1.0 + 0.2 * fontSizeSteps_; QString sizeString(QString().setNum(size, 'g', 3) + "em"); const QWebElementCollection spans = firstElement_.findAll("span.swift_resizable"); Q_FOREACH (QWebElement span, spans) { span.setStyleProperty("font-size", sizeString); }
void CellmlAnnotationViewMetadataNormalViewDetailsWidget::linkClicked() { // Retrieve some information about the link mOutputOntologicalTerms->retrieveLinkInformation(mLink, mTextContent); // Check whether we have clicked a resource/id link or a button link if (mTextContent.isEmpty()) { // Update some information CellMLSupport::CellmlFileRdfTriple *rdfTriple = mRdfTriplesMapping.value(mLink); QString qualifier = (rdfTriple->modelQualifier() != CellMLSupport::CellmlFileRdfTriple::ModelUnknown)? rdfTriple->modelQualifierAsString(): rdfTriple->bioQualifierAsString(); QString rdfTripleInformation = qualifier+"|"+rdfTriple->resource()+"|"+rdfTriple->id(); mUrls.remove(rdfTripleInformation); mRdfTripleInformationSha1s.removeOne(mLink); mRdfTriplesMapping.remove(mLink); --mItemsCount; // Determine the 'new' RDF triple information to look up, based on // whether there are RDF triples left and whether the current RDF triple // is the one being highlighted QWebElement rdfTripleElement = mOutputOntologicalTerms->page()->mainFrame()->documentElement().findFirst(QString("tr[id=item_%1]").arg(mLink)); if (!mItemsCount) { mRdfTripleInformation = QString(); mInformationType = None; } else if (!mLink.compare(mRdfTripleInformationSha1)) { QWebElement newRdfTripleEment = rdfTripleElement.nextSibling(); if (newRdfTripleEment.isNull()) newRdfTripleEment = rdfTripleElement.previousSibling(); static const QRegularExpression ItemRegEx = QRegularExpression("^item_"); CellMLSupport::CellmlFileRdfTriple *newRdfTriple = mRdfTriplesMapping.value(newRdfTripleEment.attribute("id").remove(ItemRegEx)); QString newQualifier = (newRdfTriple->modelQualifier() != CellMLSupport::CellmlFileRdfTriple::ModelUnknown)? newRdfTriple->modelQualifierAsString(): newRdfTriple->bioQualifierAsString(); mRdfTripleInformation = newQualifier+"|"+newRdfTriple->resource()+"|"+newRdfTriple->id(); if (!rdfTripleInformation.compare(mFirstRdfTripleInformation)) mFirstRdfTripleInformation = mRdfTripleInformation; if (!rdfTripleInformation.compare(mLastRdfTripleInformation)) mLastRdfTripleInformation = mRdfTripleInformation; } // Remove the RDF triple from our GUI rdfTripleElement.removeFromDocument(); // Do some additional GUI updates mLookUpRdfTripleInformation = Any; if (!mLink.compare(mRdfTripleInformationSha1)) additionalGuiUpdates(mRdfTripleInformation, mInformationType, mLookUpRdfTripleInformation); else // The looked up information is the same, so no need to look it up // again // Note: indeed, to look it up again would result in the web view // flashing (since a 'new' web page would be loaded)... additionalGuiUpdates(mRdfTripleInformation, mInformationType, No); // Remove the RDF triple from the CellML file mCellmlFile->rdfTriples().remove(rdfTriple); // Let people know that an RDF triple has been removed emit rdfTripleRemoved(rdfTriple); } else { // We have clicked on a qualifier/resource/id link, so start by enabling // the looking up of any RDF triple information mLookUpRdfTripleInformation = Any; // Call our generic look up function QStringList rdfTripleInformation = mLink.split("|"); genericLookUp(mLink, (!rdfTripleInformation[0].compare(mTextContent))? Qualifier: !rdfTripleInformation[1].compare(mTextContent)? Resource: Id); } }
/* Take the ENML note and transform it into HTML that WebKit will not complain about */ QByteArray EnmlFormatter::rebuildNoteEnml() { resources.clear(); QByteArray b; qint32 index; content.replace("</input>",""); // Strip off HTML header index = content.indexOf("<body"); index = content.indexOf(">", index)+1; content.remove(0,index); index = content.indexOf("</body"); content.truncate(index); b.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); b.append("<!DOCTYPE en-note SYSTEM 'http://xml.evernote.com/pub/enml2.dtd'>\n"); b.append("<html><head><title></title></head>"); b.append("<body style=\"word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;\" >"); b.append(content); b.append("</body></html>"); content.clear(); content = b; // Run it through "tidy". It is a program which will fix any invalid HTML // and give us the results back through stdout. In a perfect world this // wouldn't be needed, but WebKit doesn't always give back good HTML. QProcess tidyProcess; tidyProcess.start("tidy -raw -asxhtml -q -m -u -utf8 ", QIODevice::ReadWrite|QIODevice::Unbuffered); QLOG_DEBUG() << "Starting tidy " << tidyProcess.waitForStarted(); tidyProcess.waitForStarted(); tidyProcess.write(content); tidyProcess.closeWriteChannel(); tidyProcess.waitForFinished(); QLOG_DEBUG() << "Stopping tidy " << tidyProcess.waitForFinished() << " Return Code: " << tidyProcess.state(); QLOG_DEBUG() << "Tidy Errors:" << tidyProcess.readAllStandardError(); content.clear(); content.append(tidyProcess.readAllStandardOutput()); if (content == "") { formattingError = true; return ""; } // Tidy puts this in place, but we don't really need it. content.replace("<form>", ""); content.replace("</form>", ""); index = content.indexOf("<body"); content.remove(0,index); content.prepend("<style>img { height:auto; width:auto; max-height:auto; max-width:100%; }</style>"); content.prepend("<head><meta http-equiv=\"content-type\" content=\"text-html; charset=utf-8\"></head>"); content.prepend("<html>"); content.append("</html>"); content = fixEncryptionTags(content); QWebPage page; QEventLoop loop; page.mainFrame()->setContent(content); QObject::connect(&page, SIGNAL(loadFinished(bool)), &loop, SLOT(quit())); QWebElement element = page.mainFrame()->documentElement(); QStringList tags = findAllTags(element); for (int i=0; i<tags.size(); i++) { QString tag = tags[i]; QWebElementCollection anchors = page.mainFrame()->findAllElements(tag); foreach (QWebElement element, anchors) { if (element.tagName().toLower() == "input") { processTodo(element); } else if (element.tagName().toLower() == "a") { fixLinkNode(element); } else if (element.tagName().toLower() == "object") { fixObjectNode(element); } else if (element.tagName().toLower() == "img") { fixImgNode(element); } else if (!isElementValid(element.tagName())) element.removeFromDocument(); } } content.clear(); content.append(element.toOuterXml()); // Strip off HTML header index = content.indexOf("<body"); index = content.indexOf(">", index)+1; content.remove(0,index); index = content.indexOf("</body"); content.truncate(index); b.clear(); b.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); b.append("<!DOCTYPE en-note SYSTEM 'http://xml.evernote.com/pub/enml2.dtd'>"); b.append("<en-note style=\"word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;\" >"); b.append(content); b.append("</en-note>"); content.clear(); content = b; postXmlFix(); return content; }