void Textual::remove(const Index& index) { DOM::HTMLDocument document = htmlDocument(); if(index.atVariationStart()) { DOM::Element vc = document.getElementById("vc_"+index); if(!vc.isNull()) { /* remove a number? */ DOM::Element comm(vc.previousSibling()); DOM::Element mvnum(vc.nextSibling()); if(!mvnum.isNull() && mvnum.getAttribute("id").string().startsWith("nm_") && !comm.isNull() && comm.getAttribute("id").string().startsWith("cm_")) { DOM::Element move(mvnum.nextSibling()); int mv_num = move.getAttribute("mvnum").string().toInt(); int sub_mv_num = move.getAttribute("submvnum").string().toInt(); if(!(mv_num>0 && (sub_mv_num==0 && (mv_num%2 || m_layout_style)))) mvnum.parentNode().removeChild(mvnum); } vc.parentNode().removeChild(vc); } } else { DOM::Element rm = document.getElementById("nm_"+index); if(rm.isNull()) rm = document.getElementById("mv_"+index); if(!rm.isNull()) clear_from(rm); } if(m_curr_selected >= index) m_curr_selected = Index(-1); }
void Textual::select(const Index& index) { if(index == m_curr_selected) return; DOM::HTMLDocument document = htmlDocument(); DOM::Element currs = document.getElementById("mv_"+m_curr_selected); DOM::Element news = document.getElementById("mv_"+index); if(!currs.isNull()) currs.style().removeProperty("background-color"); if(!news.isNull()) news.style().setProperty("background-color", "#C0E0FF", "important"); m_curr_selected = index; }
void DOMTreeView::slotItemRenamed(QListViewItem *lvi, const QString &str, int col) { AttributeListItem *item = static_cast<AttributeListItem *>(lvi); DOM::Element element = infoNode; if (element.isNull()) return; // Should never happen switch (col) { case 0: { ManipulationCommand *cmd; // kdDebug(90180) << k_funcinfo << "col 0: " << element.nodeName() << " isNew: " << item->isNew() << endl; if (item->isNew()) { cmd = new AddAttributeCommand(element, str, item->text(1)); item->setNew(false); } else cmd = new RenameAttributeCommand(element, item->text(0), str); mainWindow()->executeAndAddCommand(cmd); break; } case 1: { if (item->isNew()) { lvi->setText(1, QString()); break; } ChangeAttributeValueCommand *cmd = new ChangeAttributeValueCommand( element, item->text(0), str); mainWindow()->executeAndAddCommand(cmd); break; } } }
void DOMTreeView::initializeOptionsFromNode(const DOM::Node &node) { infoNode = node; nodeName->clear(); nodeType->clear(); nodeNamespace->clear(); nodeValue->clear(); if (node.isNull()) { nodeInfoStack->raiseWidget(EmptyPanel); return; } nodeName->setText(node.nodeName().string()); nodeType->setText(QString::number(node.nodeType())); nodeNamespace->setText(node.namespaceURI().string()); // nodeValue->setText(node.value().string()); DOM::Element element = node; if (!element.isNull()) { initializeOptionsFromElement(element); return; } DOM::CharacterData cdata = node; if (!cdata.isNull()) { initializeOptionsFromCData(cdata); return; } // Fallback nodeInfoStack->raiseWidget(EmptyPanel); }
void KHTMLReader::parseNode(DOM::Node node) { // check if this is a text node. DOM::Text t = node; if (!t.isNull()) { _writer->addText(state()->paragraph, t.data().string(), 1, state()->in_pre_mode); return; // no children anymore... } // is this really needed ? it can't do harm anyway. state()->format = _writer->currentFormat(state()->paragraph, true); state()->layout = _writer->currentLayout(state()->paragraph); pushNewState(); DOM::Element e = node; bool go_recursive = true; if (!e.isNull()) { // get the CSS information parseStyle(e); // get the tag information go_recursive = parseTag(e); } if (go_recursive) { for (DOM::Node q = node.firstChild(); !q.isNull(); q = q.nextSibling()) { parseNode(q); } } popState(); }
void DOMTreeView::showRecursive(const DOM::Node &pNode, const DOM::Node &node, uint depth) { DOMListViewItem *cur_item; DOMListViewItem *parent_item = m_itemdict.value(pNode.handle(), 0); if (depth > m_maxDepth) { m_maxDepth = depth; } if (depth == 0) { cur_item = new DOMListViewItem(node, m_listView); m_document = pNode.ownerDocument(); } else { cur_item = new DOMListViewItem(node, parent_item); } //kDebug(90180) << node.nodeName().string() << " [" << depth << "]"; cur_item = addElement (node, cur_item, false); m_listView->setItemExpanded(cur_item, depth < m_expansionDepth); if(node.handle()) { m_itemdict.insert(node.handle(), cur_item); } DOM::Node child = node.firstChild(); if (child.isNull()) { DOM::HTMLFrameElement frame = node; if (!frame.isNull()) { child = frame.contentDocument().documentElement(); } else { DOM::HTMLIFrameElement iframe = node; if (!iframe.isNull()) child = iframe.contentDocument().documentElement(); } } while(!child.isNull()) { showRecursive(node, child, depth + 1); child = child.nextSibling(); } const DOM::Element element = node; if (!m_bPure) { if (!element.isNull() && !element.firstChild().isNull()) { if(depth == 0) { cur_item = new DOMListViewItem(node, m_listView, cur_item); m_document = pNode.ownerDocument(); } else { cur_item = new DOMListViewItem(node, parent_item, cur_item); } //kDebug(90180) << "</" << node.nodeName().string() << ">"; cur_item = addElement(element, cur_item, true); // m_listView->setItemExpanded(cur_item, depth < m_expansionDepth); } } }
void KHTMLReader::parse_head(DOM::Element e) { for (DOM::Element items = e.firstChild();!items.isNull();items = items.nextSibling()) { if (items.tagName().string().lower() == "title") { DOM::Text t = items.firstChild(); if (!t.isNull()) { _writer->createDocInfo("HTML import filter", t.data().string()); } } } }
void DOMTreeView::saveRecursive(const DOM::Node &pNode, int indent) { const QString nodeName(pNode.nodeName().string()); QString text; QString strIndent; strIndent.fill(' ', indent); const DOM::Element element = static_cast<const DOM::Element>(pNode); text = strIndent; if ( !element.isNull() ) { if (nodeName.at(0)=='-') { /* Don't save khtml internal tags '-konq..' * Approximating it with <DIV> */ text += "<DIV> <!-- -KONG_BLOCK -->"; } else { text += "<" + nodeName; QString attributes; DOM::Attr attr; const DOM::NamedNodeMap attrs = element.attributes(); unsigned long lmap = attrs.length(); for( uint j=0; j<lmap; j++ ) { attr = static_cast<DOM::Attr>(attrs.item(j)); attributes += " " + attr.name().string() + "=\"" + attr.value().string() + "\""; } if (!(attributes.isEmpty())){ text += " "; } text += attributes.simplifyWhiteSpace(); if(element.firstChild().isNull()) { text += "/>"; } else { text += ">"; } } } else { text = strIndent + pNode.nodeValue().string(); } kdDebug(90180) << text << endl; if (!(text.isEmpty())) { (*m_textStream) << text << endl; } DOM::Node child = pNode.firstChild(); while(!child.isNull()) { saveRecursive(child, indent+2); child = child.nextSibling(); } if (!(element.isNull()) && (!(element.firstChild().isNull()))) { if (nodeName.at(0)=='-') { text = strIndent + "</DIV> <!-- -KONG_BLOCK -->"; } else { text = strIndent + "</" + pNode.nodeName().string() + ">"; } kdDebug(90180) << text << endl; (*m_textStream) << text << endl; } }
void DOMTreeView::addElement ( const DOM::Node &node, DOMListViewItem *cur_item, bool isLast) { cur_item->setClosing(isLast); const QString nodeName(node.nodeName().string()); QString text; const DOM::Element element = node; if (!element.isNull()) { if (!m_bPure) { if (isLast) { text ="</"; } else { text = "<"; } text += nodeName; } else { text = nodeName; } if (m_bShowAttributes && !isLast) { QString attributes; DOM::Attr attr; DOM::NamedNodeMap attrs = element.attributes(); unsigned long lmap = attrs.length(); for( unsigned int j=0; j<lmap; j++ ) { attr = static_cast<DOM::Attr>(attrs.item(j)); attributes += " " + attr.name().string() + "=\"" + attr.value().string() + "\""; } if (!(attributes.isEmpty())) { text += " "; } text += attributes.simplifyWhiteSpace(); } if (!m_bPure) { if(element.firstChild().isNull()) { text += "/>"; } else { text += ">"; } } cur_item->setText(0, text); } else { text = "`" + node.nodeValue().string() + "'"; // Hacks to deal with PRE QTextStream ts( text, IO_ReadOnly ); while (!ts.eof()) { const QString txt(ts.readLine()); const QFont font(KGlobalSettings::fixedFont()); cur_item->setFont( font ); cur_item->setText(0, txt); if(node.handle()) { m_itemdict.insert(node.handle(), cur_item); } DOMListViewItem *parent; if (cur_item->parent()) { parent = static_cast<DOMListViewItem *>(cur_item->parent()); } else { parent = cur_item; } cur_item = new DOMListViewItem(node, parent, cur_item); } // This is one is too much DOMListViewItem *notLastItem = static_cast<DOMListViewItem *>(cur_item->itemAbove()); delete cur_item; cur_item = notLastItem; } if (m_bHighlightHTML && node.ownerDocument().isHTMLDocument()) { highlightHTML(cur_item, nodeName); } }
bool KHTMLReader::parse_table(DOM::Element e) { if (_writer->isInTable()) { // We are already inside of a table. Tables in tables are not supported // yet. So, just add that table-content as text. for (DOM::Node rows = e.firstChild().firstChild();!rows.isNull();rows = rows.nextSibling()) if (!rows.isNull() && rows.nodeName().string().toLower() == "tr") for (DOM::Node cols = rows.firstChild();!cols.isNull();cols = cols.nextSibling()) if (!cols.isNull()) parseNode(cols); return false; } DOM::Element table_body = e.firstChild(); if (table_body.isNull()) { // If the table_body is empty, we don't continue cause else // KHTML will throw a DOM::DOMException if we try to access // the null element. return true; } int tableno = _writer->createTable(); int nrow = 0; int ncol = 0; bool has_borders = false; QColor bgcolor = parsecolor("#FFFFFF"); if (!table_body.getAttribute("bgcolor").string().isEmpty()) bgcolor = parsecolor(table_body.getAttribute("bgcolor").string()); if ((e.getAttribute("border").string().toInt() > 0)) has_borders = true; // fixme rewrite this proper //(maybe using computed sizes from khtml if thats once exported) for (DOM::Node rowsnode = table_body.firstChild();!rowsnode.isNull();rowsnode = rowsnode.nextSibling()) { DOM::Element rows = rowsnode; if (!rows.isNull() && rows.tagName().string().toLower() == "tr") { QColor obgcolor = bgcolor; if (!rows.getAttribute("bgcolor").string().isEmpty()) bgcolor = parsecolor(rows.getAttribute("bgcolor").string()); ncol = 0; for (DOM::Node colsnode = rows.firstChild();!colsnode.isNull();colsnode = colsnode.nextSibling()) { DOM::Element cols = colsnode; const QString nodename = cols.isNull() ? QString() : cols.nodeName().string().toLower(); if (nodename == "td" || nodename == "th") { QColor bbgcolor = bgcolor; if (!cols.getAttribute("bgcolor").string().isEmpty()) bgcolor = parsecolor(cols.getAttribute("bgcolor").string()); pushNewState(); QRect colrect = cols.getRect(); state()->frameset = _writer->createTableCell(tableno, nrow, ncol, 1, colrect); state()->frameset.firstChild().toElement().setAttribute("bkRed", bgcolor.red()); state()->frameset.firstChild().toElement().setAttribute("bkGreen", bgcolor.green()); state()->frameset.firstChild().toElement().setAttribute("bkBlue", bgcolor.blue()); if (has_borders) { state()->frameset.firstChild().toElement().setAttribute("lWidth", 1); state()->frameset.firstChild().toElement().setAttribute("rWidth", 1); state()->frameset.firstChild().toElement().setAttribute("bWidth", 1); state()->frameset.firstChild().toElement().setAttribute("tWidth", 1); } // fixme don't guess. get it right. state()->paragraph = _writer->addParagraph(state()->frameset); parseNode(cols); _writer->cleanUpParagraph(state()->paragraph); popState(); ncol++; bgcolor = bbgcolor; } } nrow++; bgcolor = obgcolor; } } _writer->finishTable(tableno/*,0,0,r.right()-r.left(),r.bottom()-r.top()*/); // FIXME find something better. startNewParagraph(false, false); _writer->createInline(state()->paragraph, _writer->fetchTableCell(tableno, 0, 0)); startNewParagraph(false, false); return false; // we do our own recursion }
/* we just simplify the process. if we use KParts::BrowserExtension, we have to do lots extra work, adding so much classes. so just hack like following. grab useful code from TDEHTMLPopupGUIClient(tdehtml_ext.cpp), and change a little bit to fit our needs */ void EvaChatView::slotPopupMenu( const TQString & _url, const TQPoint & point ) { menu->clear(); bool isImage = false; bool hasSelection = TDEHTMLPart::hasSelection(); KURL url = KURL(_url); if(d) delete d; d = new MenuPrivateData; d->m_url = url; DOM::Element e = nodeUnderMouse(); if ( !e.isNull() && (e.elementId() == ID_IMG) ) { DOM::HTMLImageElement ie = static_cast<DOM::HTMLImageElement>(e); TQString src = ie.src().string(); d->m_imageURL = KURL(src); d->m_suggestedFilename = src.right(src.length() - src.findRev("/") -1); isImage=true; } TDEAction *action = 0L; if(hasSelection) { //action = new TDEAction( i18n( "&Copy Text" ), TDEShortcut("Ctrl+C"), this, SLOT( copy() ), // actionCollection(), "copy" ); //action = KStdAction::copy( browserExtension(), SLOT(copy()), actionCollection(), "copy"); //action->setText(i18n("&Copy Text")); //action->setEnabled(true); copyAction->plug(menu); // search text TQString selectedText = TDEHTMLPart::selectedText(); if ( selectedText.length()>18 ) { selectedText.truncate(15); selectedText+="..."; } #ifdef HAS_KONTQUEROR // Fill search provider entries TDEConfig config("kuriikwsfilterrc"); config.setGroup("General"); const TQString defaultEngine = config.readEntry("DefaultSearchEngine", "google"); const char keywordDelimiter = config.readNumEntry("KeywordDelimiter", ':'); // default search provider KService::Ptr service = KService::serviceByDesktopPath(TQString("searchproviders/%1.desktop").arg(defaultEngine)); // search provider icon TQPixmap icon; KURIFilterData data; TQStringList list; const TQString defaultSearchProviderPrefix = *(service->property("Keys").toStringList().begin()) + keywordDelimiter; data.setData( defaultSearchProviderPrefix + TQString("some keyword") ); list << "kurisearchfilter" << "kuriikwsfilter"; TQString name; if ( KURIFilter::self()->filterURI(data, list) ) { TQString iconPath = locate("cache", KMimeType::favIconForURL(data.uri()) + ".png"); if ( iconPath.isEmpty() ) icon = SmallIcon("edit-find"); else icon = TQPixmap( iconPath ); name = service->name(); } else { icon = SmallIcon("google"); name = "Google"; } action = new TDEAction( i18n( "Search '%1' at %2" ).arg( selectedText ).arg( name ), icon, 0, this, SLOT( searchProvider() ), actionCollection(), "searchProvider" ); action->plug(menu); // favorite search providers TQStringList favoriteEngines; favoriteEngines = config.readListEntry("FavoriteSearchEngines"); // for KDE 3.2 API compatibility if(favoriteEngines.isEmpty()) favoriteEngines << "google" << "google_groups" << "google_news" << "webster" << "dmoz" << "wikipedia"; if ( !favoriteEngines.isEmpty()) { TDEActionMenu* providerList = new TDEActionMenu( i18n( "Search '%1' At" ).arg( selectedText ), actionCollection(), "searchProviderList" ); bool hasSubMenus = false; TQStringList::ConstIterator it = favoriteEngines.begin(); for ( ; it != favoriteEngines.end(); ++it ) { if (*it==defaultEngine) continue; service = KService::serviceByDesktopPath(TQString("searchproviders/%1.desktop").arg(*it)); if (!service) continue; const TQString searchProviderPrefix = *(service->property("Keys").toStringList().begin()) + keywordDelimiter; data.setData( searchProviderPrefix + "some keyword" ); if ( KURIFilter::self()->filterURI(data, list) ) { TQString iconPath = locate("cache", KMimeType::favIconForURL(data.uri()) + ".png"); if ( iconPath.isEmpty() ) icon = SmallIcon("edit-find"); else icon = TQPixmap( iconPath ); name = service->name(); providerList->insert( new TDEAction( name, icon, 0, this, SLOT( searchProvider() ), actionCollection(), TQString( "searchProvider" + searchProviderPrefix ).latin1() ) ); hasSubMenus = true; } } if(hasSubMenus) providerList->plug(menu); } #endif // HAS_KONTQUEROR if ( selectedText.contains("://") && KURL(selectedText).isValid() ) { action = new TDEAction( i18n( "Open '%1'" ).arg( selectedText ), "window_new", 0, this, SLOT( openSelection() ), actionCollection(), "openSelection" ); action->plug(menu); } } if ( !url.isEmpty() ) { if (url.protocol() == "mailto") { action = new TDEAction( i18n( "Copy Email Address" ), 0, this, SLOT( slotCopyLinkLocation() ), actionCollection(), "copylinklocation" ); action->plug(menu); } else { action = new TDEAction( i18n( "Copy &Link Address" ), 0, this, SLOT( slotCopyLinkLocation() ), actionCollection(), "copylinklocation" ); action->plug(menu); } } if (isImage) { #ifndef QT_NO_MIMECLIPBOARD action = (new TDEAction( i18n( "Copy Image" ), 0, this, SLOT( slotCopyImage() ), actionCollection(), "copyimage" )); action->plug(menu); #endif action = new TDEAction( i18n( "Save Image As..." ), 0, this, SLOT( slotSaveImageAs() ), actionCollection(), "saveimageas" ); action->plug(menu); action = new TDEAction( i18n( "Save As Custom Smiley"), 0, this, SLOT( slotSaveAsCustomSmiley() ), actionCollection(), "saveascustomsmiley" ); action->plug(menu); } if(menu->count()) menu->popup(point); }
void Textual::setMove(const Index& index, int turn, const DecoratedMove& move, const QString& comment) { //kDebug() << "i= " << index; DOM::HTMLDocument document = htmlDocument(); QString istr = (QString)index; DOM::Element this_mv = document.getElementById("mv_"+istr); DOM::Element this_cm = document.getElementById("cm_"+istr); if(!this_mv.isNull() && !this_cm.isNull()) { clear_node(this_mv); for(int i=0;i<move.size();i++) { DOM::Text t = document.createTextNode(move[i].m_string); this_mv.appendChild(t); } clear_node(this_cm); if(!comment.isEmpty()) { this_cm.appendChild(document.createTextNode(comment)); this_cm.appendChild(document.createTextNode(QString(" "))); } return; } DOM::Element parent; DOM::Element prev_mv; DOM::Element prev_cm; if(index != Index(0)) { prev_cm = document.getElementById("cm_"+index.prev()); prev_mv = document.getElementById("mv_"+index.prev()); if(prev_cm.isNull() || prev_mv.isNull()) { kDebug() << " --> Error in Textual::setMove, no previous move!"; return; } } int mv_num = 0; int sub_mv_num = 0; if(!prev_mv.isNull()) { int prev_turn = prev_mv.getAttribute("turn").string().toInt(); int prev_mv_num = prev_mv.getAttribute("mvnum").string().toInt(); int prev_sub_mv_num = prev_mv.getAttribute("submvnum").string().toInt(); if(prev_turn != turn) mv_num = prev_mv_num+1; else { mv_num = prev_mv_num; sub_mv_num = prev_sub_mv_num+1; } } if(!index.nested.size()) { parent = document.body(); if(parent.isNull()) { kDebug() << "QUEEEEEEEEE!!!!!!!"; return; } } else if(index.atVariationStart()) { QString var_id = "vc_" + istr; DOM::Element add_before = prev_cm.nextSibling(); while(!add_before.isNull()) { QString id = add_before.getAttribute("id").string(); if(id.startsWith("vc_") && id < var_id) add_before = add_before.nextSibling(); else break; } DOM::Element var_el = document.createElement("span"); var_el.setAttribute("id", var_id); var_el.setAttribute("class", "variation"); var_el.appendChild(document.createTextNode("[ ")); parent = document.createElement("span"); parent.setAttribute("id", "vr_" + istr); DOM::Element vk_el = document.createElement("span"); vk_el.setAttribute("id", "vk_" + istr); vk_el.setAttribute("class", "comment"); //vk_el.setContentEditable(true); parent.appendChild(vk_el); var_el.appendChild(parent); var_el.appendChild(document.createTextNode("] ")); prev_cm.parentNode().insertBefore(var_el, add_before); if(!add_before.isNull() && add_before.getAttribute("id").string().startsWith("mv_")) { int mv_num = add_before.getAttribute("mvnum").string().toInt(); int sub_mv_num = add_before.getAttribute("submvnum").string().toInt(); QString num_str; if(m_layout_style == 0) { if(mv_num%2) num_str = QString("%1. ").arg((mv_num+1)/2); else num_str = QString("%1. ... ").arg((mv_num+2)/2); } else { if(sub_mv_num==0) num_str = QString("%1. ").arg(mv_num); else num_str = QString("%1+%2. ").arg(mv_num).arg(sub_mv_num); } DOM::Element num_el = document.createElement("a"); num_el.setAttribute("class", "mvnum"); num_el.setAttribute("id", "nm_"+istr); num_el.appendChild(document.createTextNode(num_str)); prev_cm.parentNode().insertBefore(num_el, add_before); } } else { Index pi = index.prev(index.nested.back().num_moves); parent = document.getElementById("vr_"+pi); if(parent.isNull()) { kDebug() << " --> Error in Textual::setMove, no variation?!?!?"; return; } } if(mv_num>0 && ((sub_mv_num==0 && (mv_num%2 || m_layout_style)) || parent.lastChild() != prev_cm) ) { QString num_str; if(m_layout_style == 0) { if(mv_num%2) num_str = QString("%1. ").arg((mv_num+1)/2); else num_str = QString("%1. ... ").arg((mv_num+2)/2); } else { if(sub_mv_num==0) num_str = QString("%1. ").arg(mv_num); else num_str = QString("%1+%2. ").arg(mv_num).arg(sub_mv_num); } DOM::Element num_el = document.createElement("a"); num_el.setAttribute("class", "mvnum"); num_el.setAttribute("id", "nm_"+istr); num_el.appendChild(document.createTextNode(num_str)); parent.appendChild(num_el); } DOM::Element mv_el = document.createElement("a"); mv_el.setAttribute("id", "mv_"+istr); mv_el.setAttribute("href", "index://"+istr); mv_el.setAttribute("class", "move"); mv_el.setAttribute("turn", QString::number(turn)); mv_el.setAttribute("mvnum", QString::number(mv_num)); mv_el.setAttribute("submvnum", QString::number(sub_mv_num)); for(int i=0;i<move.size();i++) { if(move[i].m_type == MovePart::Figurine) { ::Loader::Glyph g = m_loader.getValue< ::Loader::Glyph>(move[i].m_string); DOM::Element el = document.createElement("span"); #if 1 kDebug() << "size = " << QString("%1%").arg(g.m_font.pointSize()*100/12); el.style().setProperty("font-size", QString("%1%").arg(g.m_font.pointSize()*100/12), "important"); el.style().setProperty("line-height", QString("%1%").arg(g.m_font.pointSize()*100/12), "important"); #endif kDebug() << "familiy = " << g.m_font.family(); el.style().setProperty("font-weight", "normal", "important"); el.style().setProperty("font-family", g.m_font.family(), "important"); DOM::Text t = document.createTextNode(QString(g.m_char)); el.appendChild(t); mv_el.appendChild(el); } else { DOM::Text t = document.createTextNode(move[i].m_string); mv_el.appendChild(t); } } parent.appendChild(mv_el); parent.appendChild(document.createTextNode(QString(" "))); DOM::Element cm_el = document.createElement("span"); cm_el.setAttribute("id", "cm_"+istr); cm_el.setAttribute("class", "comment"); if(!comment.isEmpty()) { cm_el.appendChild(document.createTextNode(comment)); cm_el.appendChild(document.createTextNode(QString(" "))); } //cm_el.setContentEditable(true); parent.appendChild(cm_el); }