- general improvements on importers, especially on auto tagging - added get_tags (needed for tag clouds etc.) - improved flexigrid support - added YMarks.html (not fully working) that will eventually replace Bookmarks.html git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@7691 6c8d7289-2bf4-0310-a012-ef5d649a1542pull/1/head
parent
e3d19d0a90
commit
e7c2ea193b
@ -0,0 +1,205 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>YaCy '#[user]#''s Bookmarks</title>
|
||||||
|
#%env/templates/metas.template%#
|
||||||
|
<link media="screen" type="text/css" href="yacy/ui/css/base.css" rel="stylesheet" />
|
||||||
|
<link media="screen" type="text/css" href="/yacy/ui/css/jquery.flexigrid.css" rel="stylesheet" />
|
||||||
|
</head>
|
||||||
|
<body id="ymarks_body">
|
||||||
|
#%env/templates/header.template%#
|
||||||
|
<script src="/yacy/ui/js/jquery-flexigrid.js" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
//<![CDATA[
|
||||||
|
HTMLenc = function(s) {
|
||||||
|
return $('<div/>').text(s).html();
|
||||||
|
}
|
||||||
|
$(document).ready(function() {
|
||||||
|
var height=document.documentElement.clientHeight - 180;
|
||||||
|
$('#ymarks').flexigrid({
|
||||||
|
url: '/api/ymarks/get_ymark.json',
|
||||||
|
dataType: 'json',
|
||||||
|
method: 'GET',
|
||||||
|
colModel: [
|
||||||
|
{display: 'Hash', name : 'hash', width : 50, sortable : false, align: 'center', hide: true},
|
||||||
|
{display: 'Public', name : 'public', width : 25, sortable : true, align: 'center'},
|
||||||
|
{display: 'Title', name : 'title', width : 400, sortable : true, align: 'left'},
|
||||||
|
{display: 'Tags', name : 'tags', width : 160, sortable : false, align: 'left'},
|
||||||
|
{display: 'Folders', name : 'folders', width : 160, sortable : false, align: 'left', hide: false},
|
||||||
|
{display: 'Date', name : 'date', width : 100, sortable : true, align: 'left'}
|
||||||
|
],
|
||||||
|
buttons: [
|
||||||
|
{name: 'Add', bclass: 'bookmark', onpress: bm_action},
|
||||||
|
{name: 'Crawl', bclass: 'crawl', onpress: bm_action},
|
||||||
|
{name: 'Edit', bclass: 'edit', onpress: bm_action},
|
||||||
|
{name: 'Delete', bclass: 'delete', onpress: bm_action},
|
||||||
|
{separator: true},
|
||||||
|
{name: 'RSS', bclass: 'rss', onpress: bm_action},
|
||||||
|
{name: 'XBEL', bclass: 'xml', onpress: bm_action},
|
||||||
|
{name: 'XML', bclass: 'xml', onpress: bm_action},
|
||||||
|
{separator: true},
|
||||||
|
{name: 'Add', bclass: 'addTag', onpress: tag_action},
|
||||||
|
{name: 'Rename', bclass: 'editTag', onpress: tag_action},
|
||||||
|
{separator: true},
|
||||||
|
{name: 'Help', bclass: 'help', onpress: bm_action},
|
||||||
|
],
|
||||||
|
searchitems : [
|
||||||
|
{display: 'Tags', name : 'tags'},
|
||||||
|
{display: 'Folders', name : 'folders'},
|
||||||
|
{display: 'Title', name : 'title'},
|
||||||
|
],
|
||||||
|
useRp: true,
|
||||||
|
rp: 15,
|
||||||
|
sortname: "title",
|
||||||
|
sortorder: "asc",
|
||||||
|
usepager: true,
|
||||||
|
striped: true,
|
||||||
|
nowrap: false,
|
||||||
|
height: height,
|
||||||
|
query: ".*",
|
||||||
|
qtype: "title"
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Init Sidebar_1 */
|
||||||
|
$("#side1").accordion({
|
||||||
|
autoHeight: false,
|
||||||
|
clearStyle: true,
|
||||||
|
header: "h3"
|
||||||
|
});
|
||||||
|
loadTagCloud();
|
||||||
|
$("#side1").accordion("activate", 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
function loadTagCloud() {
|
||||||
|
$("#tagcloud *").remove();
|
||||||
|
$("#sidebar-2-1").toggleClass("ui.loading");
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: "/api/ymarks/get_tags.xml?top=25&sort=alpha",
|
||||||
|
dataType: "xml",
|
||||||
|
cache: false,
|
||||||
|
success: function(xml) {
|
||||||
|
$(xml).find('tag').each(function(){
|
||||||
|
var count = $(this).attr('count');
|
||||||
|
var tag = $(this).attr('tag');
|
||||||
|
var size = ((count/20)+0.3);
|
||||||
|
if (size < 1) {size = 1;}
|
||||||
|
$('<a style="font-size:'+size+'em"></a>')
|
||||||
|
.html(HTMLenc(tag)+' ')
|
||||||
|
.appendTo('#tagcloud')
|
||||||
|
}); //close each(
|
||||||
|
$("#sidebar-1-1").toggleClass("ui.loading");
|
||||||
|
}
|
||||||
|
}); //close $.ajax(
|
||||||
|
};
|
||||||
|
|
||||||
|
function bm_action(com,grid) {
|
||||||
|
if (com=='XBEL') {
|
||||||
|
var qtype = "tags";
|
||||||
|
if (qtag.startsWith("/")) qtype = "folders";
|
||||||
|
window.document.location.href = '/api/bookmarks/get_bookmarks.xml?display=xbel&qtype='+qtype+'&query='+qtag;
|
||||||
|
}
|
||||||
|
else if (com=='RSS') {
|
||||||
|
window.document.location.href = '/Bookmarks.rss?qtype=tags&query='+qtag;
|
||||||
|
}
|
||||||
|
else if (com=='XML') {
|
||||||
|
window.document.location.href = '/api/bookmarks/get_bookmarks.xml?tag='+qtag;
|
||||||
|
}
|
||||||
|
else if (com=='Delete') {
|
||||||
|
var check = confirm('Delete ' + $('.trSelected',grid).length + ' bookmark(s)?');
|
||||||
|
if(check == true) {
|
||||||
|
$('.trSelected',grid).each(function(){
|
||||||
|
var url = "/api/bookmarks/posts/delete_p.xml?login=&urlhash="+$(this).find('td :first').text();
|
||||||
|
$.ajax({
|
||||||
|
type: 'POST',
|
||||||
|
url: url,
|
||||||
|
dataType: 'xml'
|
||||||
|
}); // close $.ajax(
|
||||||
|
}); //close each(
|
||||||
|
loadTagCloud();
|
||||||
|
reloadBM();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (com=='Add') {
|
||||||
|
$('#bmaddform').resetForm();
|
||||||
|
$("#bm_url").blur(function() {
|
||||||
|
var url = $("input[name='bm_url']").getValue();
|
||||||
|
$.ajax({
|
||||||
|
type: "GET",
|
||||||
|
url: "/api/util/getpageinfo_p.xml?url="+url,
|
||||||
|
dataType: "xml",
|
||||||
|
success: function(xml) {
|
||||||
|
var title = $(xml).find('title').text();
|
||||||
|
$("input[name='bm_title']").setValue(title);
|
||||||
|
var desc = $(xml).find('desc').text();
|
||||||
|
$("textarea[name='bm_desc']").setValue(desc);
|
||||||
|
tags = "";
|
||||||
|
$(xml).find('tag').each(function(){
|
||||||
|
tags = tags + "," + $(this).attr('name');
|
||||||
|
});
|
||||||
|
$("input[name='bm_tags']").setValue(tags);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
$("#bmadd").dialog('open');
|
||||||
|
}
|
||||||
|
else if (com=='Edit') {
|
||||||
|
if ($('.trSelected',grid).length > 1) {
|
||||||
|
alert("Edit of more than one selected bookmark is currently not supportet!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$("input[name='bm_url']").setValue($('.trSelected',grid).find('.url').text());
|
||||||
|
$("input[name='bm_title']").setValue($('.trSelected',grid).find('h3.linktitle').text().trim());
|
||||||
|
$("textarea[name='bm_desc']").setValue($('.trSelected',grid).find('p.desc').text().trim());
|
||||||
|
$("input[name='bm_tags']").setValue($('.trSelected',grid).find('p.tags').text().trim().replace(/,\s/g,","));
|
||||||
|
$("input[name='bm_path']").setValue($('.trSelected',grid).find('p.folders').text().replace(/,\s/g,","));
|
||||||
|
$("select[name='bm_public']").setValue($('.trSelected',grid).find('img').attr('alt'));
|
||||||
|
$("#bmadd").dialog('open');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function tag_action(com,grid) {
|
||||||
|
if (com=='Add') {
|
||||||
|
flex = grid;
|
||||||
|
$('#tagaddform').resetForm();
|
||||||
|
$("#tagadd").dialog('open');
|
||||||
|
} else {
|
||||||
|
$('#tageditform').resetForm();
|
||||||
|
$("#tagedit").dialog('open');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
//]]>
|
||||||
|
</script>
|
||||||
|
<div class="SubMenu">
|
||||||
|
<h3>Bookmarks</h3>
|
||||||
|
<!-- SubMenu -->
|
||||||
|
<ul class="SubMenu">
|
||||||
|
#(login)#<li><a href="YMarks.html" class="MenuItemLink">Login</a></li>::#(/login)#
|
||||||
|
<li><a href="/api/ymarks/test_treeview.html" class="MenuItemLink lock">TreeView</a></li>
|
||||||
|
<li><a href="/api/ymarks/test_import.html" class="MenuItemLink lock">Import Bookmarks</a></li>
|
||||||
|
<li><a href="/api/ymarks/get_xbel.xml" class="MenuItemLink lock">Bookmarks (XBEL)</a></li>
|
||||||
|
</ul>
|
||||||
|
<p/>
|
||||||
|
</div>
|
||||||
|
<div id="sidebar" class="sidebar" style="float: right;">
|
||||||
|
<div id="side1">
|
||||||
|
<h3 id="sidebar-1-1"><a href="#">Bookmark TagCloud</a></h3>
|
||||||
|
<div>
|
||||||
|
<p id="tagcloud"></p>
|
||||||
|
</div>
|
||||||
|
<h3 id="sidebar-1-2"><a href="#">Test</a></h3>
|
||||||
|
<div>
|
||||||
|
<p id="test">texttext</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="side2"></div>
|
||||||
|
</div>
|
||||||
|
<!-- Display Bookmarks Table -->
|
||||||
|
<div style="margin-top: 25px;">
|
||||||
|
<table id="ymarks" summary="YaCy Bookmarks">
|
||||||
|
<tbody>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
#%env/templates/footer.template%#
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,27 @@
|
|||||||
|
import net.yacy.cora.protocol.RequestHeader;
|
||||||
|
import de.anomic.data.UserDB;
|
||||||
|
import de.anomic.data.ymark.YMarkTables;
|
||||||
|
import de.anomic.search.Switchboard;
|
||||||
|
import de.anomic.server.serverObjects;
|
||||||
|
import de.anomic.server.serverSwitch;
|
||||||
|
|
||||||
|
public class YMarks {
|
||||||
|
public static serverObjects respond(final RequestHeader header, final serverObjects post, final serverSwitch env) {
|
||||||
|
final Switchboard sb = (Switchboard) env;
|
||||||
|
final serverObjects prop = new serverObjects();
|
||||||
|
final UserDB.Entry user = sb.userDB.getUser(header);
|
||||||
|
final boolean isAdmin = (sb.verifyAuthentication(header, true));
|
||||||
|
final boolean isAuthUser = user!= null && user.hasRight(UserDB.AccessRight.BOOKMARK_RIGHT);
|
||||||
|
|
||||||
|
if(isAdmin || isAuthUser) {
|
||||||
|
prop.put("login", 1);
|
||||||
|
String bmk_user = (isAuthUser ? user.getUserName() : YMarkTables.USER_ADMIN);
|
||||||
|
prop.putHTML("user", bmk_user.substring(0,1).toUpperCase() + bmk_user.substring(1));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
prop.put("login", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return prop;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,104 @@
|
|||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.text.CollationKey;
|
||||||
|
import java.text.Collator;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.TreeSet;
|
||||||
|
|
||||||
|
import net.yacy.cora.protocol.RequestHeader;
|
||||||
|
import de.anomic.data.UserDB;
|
||||||
|
import de.anomic.data.ymark.YMarkEntry;
|
||||||
|
import de.anomic.data.ymark.YMarkTables;
|
||||||
|
import de.anomic.data.ymark.YMarkTag;
|
||||||
|
import de.anomic.data.ymark.YMarkUtil;
|
||||||
|
import de.anomic.search.Switchboard;
|
||||||
|
import de.anomic.server.serverObjects;
|
||||||
|
import de.anomic.server.serverSwitch;
|
||||||
|
|
||||||
|
public class get_tags {
|
||||||
|
|
||||||
|
final static String TAG = "tag";
|
||||||
|
final static String TOP = "top";
|
||||||
|
final static String SORT = "sort";
|
||||||
|
final static String SIZE = "size";
|
||||||
|
final static String ALPHA = "alpha";
|
||||||
|
|
||||||
|
|
||||||
|
private static Switchboard sb = null;
|
||||||
|
private static serverObjects prop = null;
|
||||||
|
|
||||||
|
public static serverObjects respond(final RequestHeader header, final serverObjects post, final serverSwitch env) {
|
||||||
|
sb = (Switchboard) env;
|
||||||
|
prop = new serverObjects();
|
||||||
|
|
||||||
|
final UserDB.Entry user = sb.userDB.getUser(header);
|
||||||
|
final boolean isAdmin = (sb.verifyAuthentication(header, true));
|
||||||
|
final boolean isAuthUser = user!= null && user.hasRight(UserDB.AccessRight.BOOKMARK_RIGHT);
|
||||||
|
|
||||||
|
if(isAdmin || isAuthUser) {
|
||||||
|
final String bmk_user = (isAuthUser ? user.getUserName() : YMarkTables.USER_ADMIN);
|
||||||
|
Integer top = Integer.MAX_VALUE;
|
||||||
|
Boolean sortAlpha = true;
|
||||||
|
Iterator<YMarkTag> tit = null;
|
||||||
|
TreeSet<YMarkTag> tags = null;
|
||||||
|
int count = 0;
|
||||||
|
YMarkTag t;
|
||||||
|
|
||||||
|
if (post != null && post.containsKey(TAG)) {
|
||||||
|
if (!post.get(TAG).isEmpty()) {
|
||||||
|
final String[] tagArray = YMarkUtil.cleanTagsString(post.get(TAG)).split(YMarkUtil.TAGS_SEPARATOR);
|
||||||
|
try {
|
||||||
|
tags = new TreeSet<YMarkTag>(sb.tables.bookmarks.getTags(sb.tables.bookmarks.getBookmarksByTag(bmk_user, tagArray)).values());
|
||||||
|
} catch (IOException e) {
|
||||||
|
return prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
tags = new TreeSet<YMarkTag>(sb.tables.bookmarks.getTags(bmk_user).values());
|
||||||
|
} catch (IOException e) {
|
||||||
|
return prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (post != null && post.containsKey(TOP)) {
|
||||||
|
top = post.getInt(TOP, Integer.MAX_VALUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (post != null && post.containsKey(SORT)) {
|
||||||
|
if (SIZE.equals(post.get(SORT))) {
|
||||||
|
sortAlpha = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(sortAlpha) {
|
||||||
|
final TreeMap<CollationKey, YMarkTag> sort = new TreeMap<CollationKey, YMarkTag>();
|
||||||
|
final Collator collator = Collator.getInstance();
|
||||||
|
collator.setStrength(Collator.SECONDARY);
|
||||||
|
tit = tags.iterator();
|
||||||
|
while(tit.hasNext() && count < top) {
|
||||||
|
t = tit.next();
|
||||||
|
sort.put(collator.getCollationKey(t.name()), t);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
tit = sort.values().iterator();
|
||||||
|
} else {
|
||||||
|
tit = tags.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
while (tit.hasNext() && count < top) {
|
||||||
|
t = tit.next();
|
||||||
|
if(!t.name().equals(YMarkEntry.BOOKMARK.TAGS.deflt())) {
|
||||||
|
prop.putXML("tags_" + count + "_name", t.name());
|
||||||
|
prop.put("tags_" + count + "_count", t.size());
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
prop.put("tags", count);
|
||||||
|
}
|
||||||
|
return prop;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version='1.0' encoding="UTF-8" standalone='yes'?>
|
||||||
|
<tags>
|
||||||
|
#{tags}#<tag count="#[count]#" tag="#[name]#"/>
|
||||||
|
#{/tags}#
|
||||||
|
</tags>
|
@ -0,0 +1,192 @@
|
|||||||
|
package de.anomic.data.ymark;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.TreeSet;
|
||||||
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
|
|
||||||
|
import net.yacy.cora.document.UTF8;
|
||||||
|
import net.yacy.document.Condenser;
|
||||||
|
import net.yacy.document.Document;
|
||||||
|
import net.yacy.document.LibraryProvider;
|
||||||
|
import net.yacy.document.WordTokenizer;
|
||||||
|
import net.yacy.document.Parser.Failure;
|
||||||
|
import net.yacy.kelondro.data.meta.DigestURI;
|
||||||
|
import net.yacy.kelondro.data.word.Word;
|
||||||
|
import net.yacy.kelondro.index.RowSpaceExceededException;
|
||||||
|
import net.yacy.kelondro.logging.Log;
|
||||||
|
import net.yacy.repository.LoaderDispatcher;
|
||||||
|
import de.anomic.crawler.CrawlProfile;
|
||||||
|
import de.anomic.crawler.retrieval.Response;
|
||||||
|
|
||||||
|
public class YMarkAutoTagger implements Runnable, Thread.UncaughtExceptionHandler {
|
||||||
|
|
||||||
|
public final static String SPACE = " ";
|
||||||
|
public final static String POISON = "";
|
||||||
|
|
||||||
|
private final ArrayBlockingQueue<String> bmkQueue;
|
||||||
|
private final YMarkTables ymarks;
|
||||||
|
private final String bmk_user;
|
||||||
|
private final LoaderDispatcher loader;
|
||||||
|
|
||||||
|
private boolean merge;
|
||||||
|
|
||||||
|
public YMarkAutoTagger(final ArrayBlockingQueue<String> bmkQueue, final LoaderDispatcher loader, final YMarkTables ymarks, final String bmk_user, final boolean merge) {
|
||||||
|
this.bmkQueue = bmkQueue;
|
||||||
|
this.ymarks = ymarks;
|
||||||
|
this.bmk_user = bmk_user;
|
||||||
|
this.loader = loader;
|
||||||
|
this.merge = merge;
|
||||||
|
}
|
||||||
|
|
||||||
|
public YMarkAutoTagger(final LoaderDispatcher loader, final YMarkTables ymarks, final String bmk_user) {
|
||||||
|
this.bmkQueue = new ArrayBlockingQueue<String>(1);
|
||||||
|
this.ymarks = ymarks;
|
||||||
|
this.bmk_user = bmk_user;
|
||||||
|
this.loader = loader;
|
||||||
|
this.merge = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document loadDocument(final String url) {
|
||||||
|
DigestURI uri;
|
||||||
|
Response response;
|
||||||
|
try {
|
||||||
|
uri = new DigestURI(url);
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
Log.logWarning(YMarkTables.BOOKMARKS_LOG, "loadDocument failed due to malformed url: "+url);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
response = loader.load(loader.request(uri, true, false), CrawlProfile.CacheStrategy.IFEXIST, Long.MAX_VALUE, true);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.logWarning(YMarkTables.BOOKMARKS_LOG, "loadDocument failed due to IOException for url: "+url);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return Document.mergeDocuments(response.url(), response.getMimeType(), response.parse());
|
||||||
|
} catch (Failure e) {
|
||||||
|
Log.logWarning(YMarkTables.BOOKMARKS_LOG, "loadDocument failed due to a parser failure for url: "+url);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String autoTag(final String url, final int max, final TreeMap<String, YMarkTag> tags) {
|
||||||
|
final Document document = loadDocument(url);
|
||||||
|
final TreeSet<YMarkTag> topwords = new TreeSet<YMarkTag>();
|
||||||
|
// final TreeMap<String, YMarkTag> pairs = new TreeMap<String, YMarkTag>();
|
||||||
|
|
||||||
|
String token;
|
||||||
|
// StringBuilder pair = new StringBuilder(64);
|
||||||
|
|
||||||
|
if(document != null) {
|
||||||
|
//get words from document
|
||||||
|
final Map<String, Word> words = new Condenser(document, true, true, LibraryProvider.dymLib).words();
|
||||||
|
|
||||||
|
// generate potential tags from document title, description and subject
|
||||||
|
final int bufferSize = document.dc_title().length() + document.dc_description().length() + document.dc_subject(' ').length() + 32;
|
||||||
|
final StringBuilder buffer = new StringBuilder(bufferSize);
|
||||||
|
buffer.append(document.dc_title());
|
||||||
|
buffer.append(document.dc_description());
|
||||||
|
buffer.append(document.dc_subject(' '));
|
||||||
|
final Enumeration<String> tokens = new WordTokenizer(new ByteArrayInputStream(UTF8.getBytes(buffer.toString())), LibraryProvider.dymLib);
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
// loop through potential tag and rank them
|
||||||
|
while(tokens.hasMoreElements()) {
|
||||||
|
count = 0;
|
||||||
|
token = tokens.nextElement();
|
||||||
|
|
||||||
|
/*
|
||||||
|
pair.delete(0, pair.indexOf(SPACE)+1);
|
||||||
|
if(pair.length() > 1)
|
||||||
|
pair.append(SPACE);
|
||||||
|
pair.append(token);
|
||||||
|
|
||||||
|
if(pair.indexOf(SPACE) > 1 && pairs.containsKey(pair.toString())) {
|
||||||
|
pairs.get(pair.toString()).inc();
|
||||||
|
} else {
|
||||||
|
pairs.put(pair.toString(), new YMarkTag(pair.toString()));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// check if the token appears in the text
|
||||||
|
if (words.containsKey(token)) {
|
||||||
|
Word word = words.get(token);
|
||||||
|
// token appears in text and matches an existing bookmark tag
|
||||||
|
if (tags.containsKey(token)) {
|
||||||
|
count = word.occurrences() * tags.get(token).size() * 100;
|
||||||
|
}
|
||||||
|
// token appears in text and has more than 3 characters
|
||||||
|
if (token.length()>3) {
|
||||||
|
count = word.occurrences() * 100;
|
||||||
|
}
|
||||||
|
topwords.add(new YMarkTag(token, count));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
count = 0;
|
||||||
|
buffer.setLength(0);
|
||||||
|
for(YMarkTag tag : topwords) {
|
||||||
|
if(count < max) {
|
||||||
|
if(tag.size() > 100) {
|
||||||
|
buffer.append(tag.name());
|
||||||
|
buffer.append(YMarkUtil.TAGS_SEPARATOR);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String clean = YMarkUtil.cleanTagsString(buffer.toString());
|
||||||
|
return clean;
|
||||||
|
}
|
||||||
|
return new String();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
Log.logInfo(YMarkTables.BOOKMARKS_LOG, "autoTagger run()");
|
||||||
|
Thread.currentThread().setUncaughtExceptionHandler(this);
|
||||||
|
String url = null;
|
||||||
|
String tagString;
|
||||||
|
Iterator<String> tit;
|
||||||
|
try {
|
||||||
|
final TreeMap<String, YMarkTag> tags = this.ymarks.getTags(bmk_user);
|
||||||
|
Log.logInfo(YMarkTables.BOOKMARKS_LOG, "autoTagger queue size: "+bmkQueue.size());
|
||||||
|
while((url = bmkQueue.take()) != POISON) {
|
||||||
|
tagString = this.autoTag(url, 5, tags);
|
||||||
|
|
||||||
|
// update tags
|
||||||
|
this.ymarks.addTags(this.bmk_user, url, tagString, this.merge);
|
||||||
|
|
||||||
|
// update tags
|
||||||
|
tit = YMarkUtil.keysStringToSet(tagString).iterator();
|
||||||
|
while(tit.hasNext()) {
|
||||||
|
final String tag = tit.next();
|
||||||
|
if(tags.containsKey(tag)) {
|
||||||
|
tags.get(tag).inc();
|
||||||
|
} else {
|
||||||
|
tags.put(tag, new YMarkTag(tag));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log.logInfo(YMarkTables.BOOKMARKS_LOG, "autoTagger has been poisoned");
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Log.logException(e);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.logWarning(YMarkTables.BOOKMARKS_LOG.toString(), "autoTagger - IOException for URL: "+url);
|
||||||
|
} catch (RowSpaceExceededException e) {
|
||||||
|
Log.logException(e);
|
||||||
|
} finally {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uncaughtException(Thread t, Throwable e) {
|
||||||
|
Log.logWarning(YMarkTables.BOOKMARKS_LOG, "I caught an uncaughtException in thread "+t.getName());
|
||||||
|
Log.logException(e);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
package de.anomic.data.ymark;
|
||||||
|
|
||||||
|
public class YMarkTag implements Comparable<YMarkTag>{
|
||||||
|
private String name;
|
||||||
|
private int size;
|
||||||
|
|
||||||
|
public YMarkTag(final String tag) {
|
||||||
|
this.name = tag.toLowerCase();
|
||||||
|
this.size = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public YMarkTag(final String tag, final int size) {
|
||||||
|
this.name = tag.toLowerCase();
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int inc() {
|
||||||
|
return this.size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int dec() {
|
||||||
|
if(this.size > 0)
|
||||||
|
this.size--;
|
||||||
|
return this.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String name() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int size() {
|
||||||
|
return this.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int compareTo(YMarkTag tag) {
|
||||||
|
if(this.name.equals(tag.name()))
|
||||||
|
return 0;
|
||||||
|
if(tag.size() < this.size)
|
||||||
|
return -1;
|
||||||
|
else if(tag.size() > this.size)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return this.name.compareTo(tag.name());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in new issue