/* * SynArt.java - routines to draw boxes with titles of articles, categories, * interwiki, redirects, found in SynonymSearcher.java * * Copyright (c) 2007 Andrew Krizhanovsky /aka at mail.iias.spb.su/ * Distributed under GNU Public License. */ package com.touchgraph.wikibrowser; import wikipedia.data.ArticleIdAndTitle; import wikipedia.kleinberg.Article; import wikipedia.kleinberg.SessionHolder; import wikipedia.sql.Links; import com.touchgraph.graphlayout.TGException; import java.awt.Color; import java.util.Set; import java.util.Map; import java.util.HashMap; import java.util.Iterator; /** Routines to draw found synonyms and related terms. */ public class SynArt { private SessionHolder session; private TGWikiBrowser wb; private SynonymSearcher ss; /* public void setSession(SessionHolder session) { this.session = session; } */ /** Creates a new instance of SynArt */ public SynArt(SessionHolder session, TGWikiBrowser wb, SynonymSearcher ss) { this.session = session; this.wb = wb; this.ss = ss; } /** Gets Wiki one node, checks: * it exists in the database, then adds 1) visual node and 2) article by url. * The font "Courier" was changed to "Times" in Node.java to draw Russian letters: * * public static final Font SMALL_TAG_FONT = new Font("Times",Font.PLAIN,9); */ public void getWikiOneNode(String article) throws TGException { //Color edgeColors[]={ Color.blue, Color.black, new Color(0,216,0), new Color(64,64,216), new Color(128,0,128), new Color(96,96,96), new Color(0,128,128)}; if (null == article) return; //String article_in_db = Encodings.FromTo(article, "UTF8", "ISO8859_1"); //String article_in_db = Encodings.FromTo(article, "Cp1251", "ISO8859_1"); int p = session.connect.page_table.getIDByTitle(session.connect, article); //String s = Encodings.FromTo(article, "Cp1251", "UTF8"); WikiNode r = (WikiNode) wb.completeEltSet.findNode(article); if(r == null) { r = wb.addWikiNode(article, ss.color_dark_magenta, Color.WHITE); //r = wb.addWikiNode(article); } } /** Gets neighbours Wiki articles from the database, draws it. */ public void drawNeighboursFromDB(String article, int increment ) throws TGException { //Color edgeColors[]={ Color.blue, Color.black, new Color(0,216,0), new Color(64,64,216), new Color(128,0,128), new Color(96,96,96), new Color(0,128,128)}; if (null == article) return; //String article_in_db = Encodings.FromTo(article, "UTF8", "ISO8859_1"); // UTF8 Cp1251 int p = session.connect.page_table.getIDByTitle(session.connect, article); if(-1 == p) return; session.clear(); ss.initSession(); Map<String,Set<String>> m_out = new HashMap<String,Set<String>>(); Map<String,Set<String>> m_in = new HashMap<String,Set<String>>(); Article[] a1 = new Article[1]; a1[0] = new Article(); a1[0].page_id = p; //a1[0].page_title = article; // Get articles which refers to the article p //Article[] a_from = Links.getLFromByLTo(session, p, article, root_set_size, m_out, m_in); int n_limit2 = -1; Article[] a_from = Links.getLFromByLTo(session, a1, increment, n_limit2, m_out, m_in); // Get articles which are refer by p Article[] result_nodes = Links.getLToByLFrom(session, a1, -1, m_out, m_in); m_out.clear(); m_in. clear(); result_nodes = Article.joinUnique(result_nodes, a_from); //WikiNode r = (WikiNode) completeEltSet.findNode(generateNodeLabel()); WikiNode r = (WikiNode) wb.completeEltSet.findNode(article); if(r == null) { r = wb.addWikiNode(article, ss.color_dark_magenta, Color.WHITE); } if(null != result_nodes) { //r.setBackColor(edgeColors[linenum % edgeColors.length]); WikiNode m = null; //while (st.hasMoreTokens()) { for(int i=0; i<result_nodes.length; i++) { Article a = result_nodes[i]; //WikiNode n = (WikiNode) wb.completeEltSet.findNode(generateNodeLabel(a.page_title)); WikiNode n = (WikiNode) wb.completeEltSet.findNode(a.page_title); if(n == null) { n = wb.addWikiNode(a.page_title, ss.color_dark_magenta, Color.WHITE); } /* if(m!=null) { com.touchgraph.graphlayout.Edge e; e = wb.completeEltSet.findEdge(m,n); if(e==null) { e = new WikiEdge(m,n,40); //e.setColor(edgeColors[linenum % edgeColors.length]); wb.completeEltSet.addEdge(e); e.setVisible(false); } } else {*/ com.touchgraph.graphlayout.Edge e; e = wb.completeEltSet.findEdge(r,n); if(e==null) { e = new WikiEdge(r,n,40); //e.setColor(edgeColors[linenum % edgeColors.length]); wb.completeEltSet.addEdge(e); } //} } // end for } // enf if Iterator edgeIterator = wb.completeEltSet.getEdges(); while(edgeIterator!=null && edgeIterator.hasNext()) { WikiEdge e = (WikiEdge) edgeIterator.next(); e.setLength(10+(e.from.edgeCount() + e.to.edgeCount())+(e.from.edgeCount() * e.to.edgeCount())/5); } System.out.println("Nodes: " +wb.completeEltSet.nodeCount()); System.out.println("Edges: " +wb.completeEltSet.edgeCount()); } /** Hides all nodes and edges */ public void hideAll() { // hides nodes Iterator nodeIterator = wb.completeEltSet.getNodes(); while(nodeIterator!=null && nodeIterator.hasNext()) { ((WikiNode) nodeIterator.next()).setVisible(false); } // hides edges Iterator edgeIterator = wb.completeEltSet.getEdges(); while(edgeIterator!=null && edgeIterator.hasNext()) { ((WikiEdge) edgeIterator.next()).setVisible(false); } } /** Makes visible edges which tied visible_article with other nodes. */ public void setVisibleEdges(int visible_article, Map<Integer, Article> nodes) { Article a = nodes.get(visible_article); //WikiNode r = (WikiNode) wb.completeEltSet.findNode(a.page_title + a.iwiki_title); WikiNode r = (WikiNode) wb.completeEltSet.findNode(a.getTitleAndIWiki()); if(r == null) r = wb.addWikiNode(a.page_title + a.iwiki_title, ss.color_dark_magenta, Color.WHITE); if(null == a.links_out) return; for(int i=0; i<a.links_out.length; i++) { Article al = nodes.get(a.links_out[i]); if(null == al) continue; //WikiNode n = (WikiNode) wb.completeEltSet.findNode(al.page_title + a.iwiki_title); WikiNode n = (WikiNode) wb.completeEltSet.findNode(al.getTitleAndIWiki()); if(n == null) continue; com.touchgraph.graphlayout.Edge e; e = wb.completeEltSet.findEdge(r,n); if(e!=null) e.setVisible(true); //e.setColor(edgeColors[linenum % edgeColors.length]); } /* if(null != result_nodes) { //r.setBackColor(edgeColors[linenum % edgeColors.length]); WikiNode m = null; int midCount = 2; //while (st.hasMoreTokens()) { for(int i=0; i<result_nodes.length; i++) { Article a = result_nodes[i]; //WikiNode n = (WikiNode) wb.completeEltSet.findNode(generateNodeLabel(a.page_title)); WikiNode n = (WikiNode) wb.completeEltSet.findNode(a.page_title); if(n == null) { n = wb.addWikiNode(a.page_title); } if(m!=null) { com.touchgraph.graphlayout.Edge e; e = wb.completeEltSet.findEdge(m,n); if(e==null) { e = new WikiEdge(m,n,40); //e.setColor(edgeColors[linenum % edgeColors.length]); wb.completeEltSet.addEdge(e); e.setVisible(false); } } else { com.touchgraph.graphlayout.Edge e; e = wb.completeEltSet.findEdge(r,n); if(e==null) { e = new WikiEdge(r,n,40); //e.setColor(edgeColors[linenum % edgeColors.length]); wb.completeEltSet.addEdge(e); } } } // end for } // enf if */ Iterator edgeIterator = wb.completeEltSet.getEdges(); while(edgeIterator!=null && edgeIterator.hasNext()) { WikiEdge e = (WikiEdge) edgeIterator.next(); e.setLength(10+(e.from.edgeCount() + e.to.edgeCount())+(e.from.edgeCount() * e.to.edgeCount())/5); } System.out.println("Nodes: " +wb.completeEltSet.nodeCount()); System.out.println("Edges: " +wb.completeEltSet.edgeCount()); } /** Draws nodes without redirects. */ private void drawNodes(Map<Integer, Article> nodes) { int i; Iterator<Integer> it = nodes.keySet().iterator(); // 1. add nodes while (it.hasNext()) { int id = it.next(); Article a = nodes.get(id); //file_dot.PrintNL(node.GraphVizNode()); //file_dot.PrintNL(node.GraphVizLinksOut()); // add node //WikiNode r = (WikiNode) wb.completeEltSet.findNode(a.page_title + a.iwiki_title); WikiNode r = (WikiNode) wb.completeEltSet.findNode(a.getTitleAndIWiki()); if(r == null) r = wb.addWikiNode(a.getTitleAndIWiki(), ss.color_dark_magenta, Color.WHITE); //r = wb.addWikiNode(a.page_title + a.iwiki_title); r.setVisible(false); // Set color for different types of nodes. see types descriptions // in wikipedia.kleinberg/Article.java // See wikipedia.kleinberg/LinksBaseSet.java // See wikipedia.kleinberg/Authorities.java switch (a.type.toInt()) { case -4: r.setBackColor(Color.decode("#FF8C00")); break; // selected (rated) synonyms by user, see SetTypeForRatedSynonyms case -2: r.setBackColor(Color.decode("#FF4500")); break; // hubs - orange red #FF4500 (brown #6d5925) case -1: r.setBackColor(Color.decode("#68C309")); break; // source node - green case 0: r.setBackColor(Color.decode("#617297")); break; // best authorities - blue-grey case 1: r.setBackColor(Color.decode("#9B267D")); break; // root_nodes - violet case 2: r.setBackColor(Color.decode("#A9A9A9")); break; // base_(not_root)_nodes - dark-grey #A9A9A9 (dark-slate-grey #2F4F4F) default: r.setBackColor(Color.decode("#000000")); break; // unreachable - black //r.setBackColor(Color.decode("#1D00E2")); //blue - categories }// 802080 14e6ee 617297 6d5925 13388c r.setNodeTextColor(Color.decode("#FFFFFF")); } } /** Draws redirect-nodes. */ private void drawRedirects (Map<Integer, Article> nodes) { int i; Iterator<Integer> it = nodes.keySet().iterator(); WikiNode r_from = null; for (Article redirect_to:nodes.values()) { WikiNode r_redirect_to = (WikiNode) wb.completeEltSet.findNode(redirect_to.getTitleAndIWiki()); if(r_redirect_to == null) continue; // redirect from 'aid_from' to 'redirect_to' for(ArticleIdAndTitle aid_from:redirect_to.redirect) { // 1. add node //WikiNode r = (WikiNode) wb.completeEltSet.findNode(a.getTitleAndIWiki()); r_from = (WikiNode) wb.completeEltSet.findNode(aid_from.title); if(r_from == null) r_from = wb.addWikiNode(aid_from.title, ss.color_dark_magenta, Color.WHITE); r_from.setVisible(false); // Set color for redirect r_from.setBackColor(Color.decode("#A4FF00")); // green-yellow r_from.setNodeTextColor(Color.decode("#432E9F")); // violet // 2. add edge com.touchgraph.graphlayout.Edge e; e = wb.completeEltSet.findEdge(r_from, r_redirect_to); if(e==null) { e = new WikiEdge(r_from, r_redirect_to, 40); //e.setColor(edgeColors[linenum % edgeColors.length]); wb.completeEltSet.addEdge(e); e.setColor(Color.decode("#A4FF00")); e.setVisible(false); } } } if(null != r_from) { // else first category in ExpandCategories.forArticle // will have invisible text r_from.setNodeTextColor(Color.WHITE); } } /** Draws edges. */ private void drawEdges(Map<Integer, Article> nodes) { int i; Iterator<Integer> it = nodes.keySet().iterator(); // 2. add edges it = nodes.keySet().iterator(); while (it.hasNext()) { int id = it.next(); Article a = nodes.get(id); WikiNode r = (WikiNode) wb.completeEltSet.findNode(a.getTitleAndIWiki()); if(r == null) continue; if(null != a.links_out) { //if (Article.HUB_TYPE == a.type) // bold_edge = " [style=bold]"; for(i=0; i<a.links_out.length; i++) { //result += "W" + cur_id + " -> " + "W" + links_out[i] + bold_edge + ";\n"; Article al = nodes.get(a.links_out[i]); if(null == al) continue; WikiNode n = (WikiNode) wb.completeEltSet.findNode(al.getTitleAndIWiki()); if(n == null) continue; com.touchgraph.graphlayout.Edge e; e = wb.completeEltSet.findEdge(r,n); if(e==null) { e = new WikiEdge(r,n,40); //e.setColor(edgeColors[linenum % edgeColors.length]); wb.completeEltSet.addEdge(e); e.setVisible(false); } } } /*if( bdraw_categories && null != id_categories) { for(i=0; i<id_categories.length; i++) { result += "W" + cur_id + " -> " + "C" + id_categories[i] + " [style=dotted]" + ";\n"; } }*/ } } /** Draws nodes (Articles) and edges between them. Draws redirect articles * if 'show_redirects' is true. */ public void drawNodesEdges(Map<Integer, Article> nodes, boolean show_redirects) { drawNodes(nodes); drawEdges(nodes); if(show_redirects) { drawRedirects(nodes); } } }