From 9487b904edb1619c7379c9f75d49fb5ee3743488 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Tue, 1 Dec 2015 03:14:41 +0300 Subject: moving to Gradle --- src/conf/MANIFEST.MF | 2 - src/java/com/juick/rss/Main.java | 339 --------------------------------- src/java/com/juick/rss/Utils.java | 74 ------- src/main/java/com/juick/rss/Main.java | 339 +++++++++++++++++++++++++++++++++ src/main/java/com/juick/rss/Utils.java | 74 +++++++ 5 files changed, 413 insertions(+), 415 deletions(-) delete mode 100644 src/conf/MANIFEST.MF delete mode 100644 src/java/com/juick/rss/Main.java delete mode 100644 src/java/com/juick/rss/Utils.java create mode 100644 src/main/java/com/juick/rss/Main.java create mode 100644 src/main/java/com/juick/rss/Utils.java (limited to 'src') diff --git a/src/conf/MANIFEST.MF b/src/conf/MANIFEST.MF deleted file mode 100644 index 59499bce..00000000 --- a/src/conf/MANIFEST.MF +++ /dev/null @@ -1,2 +0,0 @@ -Manifest-Version: 1.0 - diff --git a/src/java/com/juick/rss/Main.java b/src/java/com/juick/rss/Main.java deleted file mode 100644 index 9c0d803c..00000000 --- a/src/java/com/juick/rss/Main.java +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Juick - * Copyright (C) 2008-2013, ugnich - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package com.juick.rss; - -import com.juick.Message; -import com.juick.server.MessagesQueries; -import com.juick.server.UserQueries; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.Iterator; -import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * - * @author ugnich - */ -@WebServlet(name = "Main", urlPatterns = {"/"}) -public class Main extends HttpServlet { - - private static final SimpleDateFormat sdfSQL = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - private static final SimpleDateFormat sdfRSS = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z"); - Connection sql; - - @Override - public void init() throws ServletException { - super.init(); - try { - Properties conf = new Properties(); - conf.load(new FileInputStream("/etc/juick/rss.conf")); - - Class.forName("com.mysql.jdbc.Driver"); - sql = DriverManager.getConnection("jdbc:mysql://localhost/juick?autoReconnect=true&user=" + conf.getProperty("mysql_username", "") + "&password=" + conf.getProperty("mysql_password", "")); - - } catch (Exception e) { - log(null, e); - } - } - - @Override - public void destroy() { - super.destroy(); - if (sql != null) { - try { - sql.close(); - sql = null; - } catch (SQLException e) { - log(null, e); - } - } - } - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - if (request.getCharacterEncoding() == null) { - request.setCharacterEncoding("UTF-8"); - } - - String uri = request.getRequestURI(); - if (uri.equals("/")) { - int hours = Utils.parseInt(request.getParameter("hours"), 0); - if (hours > 0 && hours < 13) { - ArrayList mids = getLastMessages(hours); - ArrayList msgs = MessagesQueries.getMessages(sql, mids); - responseMessages(response, 0, null, msgs); - } else { - response.sendError(404); - } - } else if (uri.equals("/comments")) { - int hours = Utils.parseInt(request.getParameter("hours"), 0); - if (hours > 0 && hours < 13) { - responseReplies(response, hours); - } else { - response.sendError(404); - } - } else if (uri.matches("^/[a-zA-Z0-9\\-]{2,16}/blog$")) { - String uname = uri.substring(1, uri.length() - 5); - int uid = UserQueries.getUIDbyName(sql, uname); - if (uid > 0) { - ArrayList mids = MessagesQueries.getUserBlog(sql, uid, 0, 0); - if (!mids.isEmpty()) { - ArrayList msgs = MessagesQueries.getMessages(sql, mids); - responseMessages(response, uid, uname, msgs); - } else { - response.sendError(404); - } - } else { - response.sendError(404); - } - } else { - response.sendError(404); - } - } - - private void responseMessages(HttpServletResponse response, int uid, String uname, ArrayList msgs) throws IOException { - response.setContentType("application/rss+xml; charset=UTF-8"); - - PrintWriter out = response.getWriter(); - try { - out.println(""); - out.println(""); - out.println(""); - if (uid > 0) { - out.println(""); - out.println("" + uname + " - Juick"); - out.println("http://juick.com/" + uname + "/"); - out.println("The latest messages by @" + uname + " at Juick"); - out.println("http://i.juick.com/a/" + uid + ".png" + uname + " - Juickhttp://juick.com/" + uname + "/"); - } else { - out.println("Juick"); - out.println("http://juick.com/"); - out.println("The latest messages at Juick"); - } - - Iterator i = msgs.iterator(); - while (i.hasNext()) { - Message msg = i.next(); - - out.println(""); - out.println("http://juick.com/" + msg.User.UName + "/" + msg.MID + ""); - out.println("http://juick.com/" + msg.User.UName + "/" + msg.MID + ""); - - out.print("<![CDATA[@" + msg.User.UName + ":"); - if (!msg.Tags.isEmpty()) { - for (int n = 0; n < msg.Tags.size(); n++) { - out.print(" *" + msg.Tags.get(n)); - } - } - out.println("]]>"); - out.println(""); - - synchronized (sdfSQL) { - try { - Date date = sdfSQL.parse(msg.TimestampString); - out.println("" + sdfRSS.format(date) + ""); - } catch (Exception e) { - System.err.println("PARSE EXCEPTION: " + msg.TimestampString); - } - } - - out.println("http://juick.com/" + msg.User.UName + "/" + msg.MID + ""); - if (!msg.Tags.isEmpty()) { - for (int n = 0; n < msg.Tags.size(); n++) { - out.println("" + msg.Tags.get(n) + ""); - } - } - if (msg.AttachmentType != null) { - if (msg.AttachmentType.equals("jpg")) { - out.println(""); - out.println(""); - } else if (msg.AttachmentType.equals("png")) { - out.println(""); - out.println(""); - } - } - out.println(""); - out.println(""); - } - - out.println(""); - } finally { - out.close(); - } - } - - private void responseReplies(HttpServletResponse response, int hours) throws IOException { - response.setContentType("application/rss+xml; charset=UTF-8"); - - PrintWriter out = response.getWriter(); - try { - - out.println(""); - out.println(""); - out.println(""); - out.println("Juick"); - out.println("http://juick.com/"); - out.println("The latest comments at Juick"); - - PreparedStatement stmt = null; - ResultSet rs = null; - try { - stmt = sql.prepareStatement("SELECT users2.nick,replies.message_id,replies.reply_id,users.nick,replies.txt,DATE_FORMAT(replies.ts,'%a, %d %b %Y %T UT'),replies.attach,replies.ts+0 FROM ((replies INNER JOIN users ON replies.user_id=users.id) INNER JOIN messages ON replies.message_id=messages.message_id) INNER JOIN users AS users2 ON messages.user_id=users2.id WHERE replies.ts>TIMESTAMPADD(HOUR,?,NOW()) AND messages.privacy>0"); - stmt.setInt(1, -hours); - rs = stmt.executeQuery(); - rs.beforeFirst(); - while (rs.next()) { - String muname = rs.getString(1); - int mid = rs.getInt(2); - int rid = rs.getInt(3); - String uname = rs.getString(4); - - out.println(""); - out.println("http://juick.com/" + muname + "/" + mid + ""); - out.println("http://juick.com/" + muname + "/" + mid + "#" + rid + ""); - out.println("http://juick.com/" + muname + "/" + mid + "#" + rid + ""); - out.println("http://juick.com/" + uname + "/"); - out.println("@" + uname + ":"); - out.println(""); - out.println("" + rs.getString(6) + ""); - String attachment = rs.getString(7); - if (attachment != null && !attachment.isEmpty()) { - if (attachment.equals("jpg")) { - out.println(""); - out.println(""); - } else if (attachment.equals("png")) { - out.println(""); - out.println(""); - } - } - out.println(""); - } - } catch (SQLException e) { - System.err.println(e); - } finally { - Utils.finishSQL(rs, stmt); - } - - out.println(""); - } finally { - out.close(); - } - } - - private ArrayList getLastMessages(int hours) { - ArrayList mids = new ArrayList(20); - - PreparedStatement stmt = null; - ResultSet rs = null; - try { - stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE messages.ts>TIMESTAMPADD(HOUR,?,NOW())"); - stmt.setInt(1, -hours); - rs = stmt.executeQuery(); - rs.beforeFirst(); - while (rs.next()) { - mids.add(rs.getInt(1)); - } - } catch (SQLException e) { - System.err.println(e); - } finally { - Utils.finishSQL(rs, stmt); - } - return mids; - } - private static Pattern regexLinks2 = Pattern.compile("((?<=\\s)|(?<=\\A))([\\[\\{]|<)((?:ht|f)tps?://(?:www\\.)?([^\\/\\s\\\"\\)\\!]+)/?(?:[^\\]\\}](?", ">"); - - // -- - // — - msg = msg.replaceAll("((?<=\\s)|(?<=\\A))\\-\\-?((?=\\s)|(?=\\Z))", "$1—$2"); - - // http://juick.com/last?page=2 - // juick.com - msg = msg.replaceAll("((?<=\\s)|(?<=\\A))((?:ht|f)tps?://(?:www\\.)?([^\\/\\s\\n\\\"]+)/?[^\\s\\n\\\"]*)", "$1$3"); - - // #12345 - // #12345 - msg = msg.replaceAll("((?<=\\s)|(?<=\\A)|(?<=\\p{Punct}))#(\\d+)((?=\\s)|(?=\\Z)|(?=\\))|(?=\\.)|(?=\\,))", "$1#$2$3"); - - // #12345/65 - // #12345/65 - msg = msg.replaceAll("((?<=\\s)|(?<=\\A)|(?<=\\p{Punct}))#(\\d+)/(\\d+)((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1#$2/$3$4"); - - // *bold* - // bold - msg = msg.replaceAll("((?<=\\s)|(?<=\\A)|(?<=\\p{Punct}))\\*([^\\*\\n<>]+)\\*((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1$2$3"); - - // /italic/ - // italic - msg = msg.replaceAll("((?<=\\s)|(?<=\\A))/([^\\/\\n<>]+)/((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1$2$3"); - - // _underline_ - // underline - msg = msg.replaceAll("((?<=\\s)|(?<=\\A))_([^\\_\\n<>]+)_((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1$2$3"); - - // /12 - // /12 - msg = msg.replaceAll("((?<=\\s)|(?<=\\A))\\/(\\d+)((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1/$2$3"); - - // @username@jabber.org - // @username@jabber.org - msg = msg.replaceAll("((?<=\\s)|(?<=\\A))@([\\w\\-\\.]+@[\\w\\-\\.]+)((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1@$2$3"); - - // @username - // @username - msg = msg.replaceAll("((?<=\\s)|(?<=\\A))@([\\w\\-]{2,16})((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1@$2$3"); - - // (http://juick.com/last?page=2) - // (juick.com) - Matcher m = regexLinks2.matcher(msg); - StringBuffer sb = new StringBuffer(); - while (m.find()) { - String url = m.group(3).replace(" ", "%20").replaceAll("\\s+", ""); - m.appendReplacement(sb, "$1$2$4$5"); - } - m.appendTail(sb); - msg = sb.toString(); - - // > citate - msg = msg.replaceAll("(?:(?<=\\n)|(?<=\\A))> *(.*)?(\\n|(?=\\Z))", "
$1
"); - msg = msg.replaceAll("
", "\n"); - - msg = msg.replaceAll("\n", "
\n"); - return msg; - } -} diff --git a/src/java/com/juick/rss/Utils.java b/src/java/com/juick/rss/Utils.java deleted file mode 100644 index a6842fe1..00000000 --- a/src/java/com/juick/rss/Utils.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Juick - * Copyright (C) 2008-2011, ugnich - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package com.juick.rss; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; - -/** - * - * @author ugnich - */ -public class Utils { - - public static void finishSQL(ResultSet rs, Statement stmt) { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - } - } - if (stmt != null) { - try { - stmt.close(); - } catch (SQLException e) { - } - } - } - - public static String convertArray2String(ArrayList mids) { - String q = ""; - for (int i = 0; i < mids.size(); i++) { - if (i > 0) { - q += ","; - } - q += mids.get(i); - } - return q; - } - - public static String encodeHTML(String str) { - String ret = str; - ret = ret.replaceAll("<", "<"); - ret = ret.replaceAll(">", ">"); - return str; - } - - public static int parseInt(String str, int def) { - int ret = def; - if (str != null) { - try { - ret = Integer.parseInt(str); - } catch (Exception e) { - } - } - return ret; - } -} diff --git a/src/main/java/com/juick/rss/Main.java b/src/main/java/com/juick/rss/Main.java new file mode 100644 index 00000000..9c0d803c --- /dev/null +++ b/src/main/java/com/juick/rss/Main.java @@ -0,0 +1,339 @@ +/* + * Juick + * Copyright (C) 2008-2013, ugnich + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.juick.rss; + +import com.juick.Message; +import com.juick.server.MessagesQueries; +import com.juick.server.UserQueries; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * @author ugnich + */ +@WebServlet(name = "Main", urlPatterns = {"/"}) +public class Main extends HttpServlet { + + private static final SimpleDateFormat sdfSQL = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private static final SimpleDateFormat sdfRSS = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z"); + Connection sql; + + @Override + public void init() throws ServletException { + super.init(); + try { + Properties conf = new Properties(); + conf.load(new FileInputStream("/etc/juick/rss.conf")); + + Class.forName("com.mysql.jdbc.Driver"); + sql = DriverManager.getConnection("jdbc:mysql://localhost/juick?autoReconnect=true&user=" + conf.getProperty("mysql_username", "") + "&password=" + conf.getProperty("mysql_password", "")); + + } catch (Exception e) { + log(null, e); + } + } + + @Override + public void destroy() { + super.destroy(); + if (sql != null) { + try { + sql.close(); + sql = null; + } catch (SQLException e) { + log(null, e); + } + } + } + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getCharacterEncoding() == null) { + request.setCharacterEncoding("UTF-8"); + } + + String uri = request.getRequestURI(); + if (uri.equals("/")) { + int hours = Utils.parseInt(request.getParameter("hours"), 0); + if (hours > 0 && hours < 13) { + ArrayList mids = getLastMessages(hours); + ArrayList msgs = MessagesQueries.getMessages(sql, mids); + responseMessages(response, 0, null, msgs); + } else { + response.sendError(404); + } + } else if (uri.equals("/comments")) { + int hours = Utils.parseInt(request.getParameter("hours"), 0); + if (hours > 0 && hours < 13) { + responseReplies(response, hours); + } else { + response.sendError(404); + } + } else if (uri.matches("^/[a-zA-Z0-9\\-]{2,16}/blog$")) { + String uname = uri.substring(1, uri.length() - 5); + int uid = UserQueries.getUIDbyName(sql, uname); + if (uid > 0) { + ArrayList mids = MessagesQueries.getUserBlog(sql, uid, 0, 0); + if (!mids.isEmpty()) { + ArrayList msgs = MessagesQueries.getMessages(sql, mids); + responseMessages(response, uid, uname, msgs); + } else { + response.sendError(404); + } + } else { + response.sendError(404); + } + } else { + response.sendError(404); + } + } + + private void responseMessages(HttpServletResponse response, int uid, String uname, ArrayList msgs) throws IOException { + response.setContentType("application/rss+xml; charset=UTF-8"); + + PrintWriter out = response.getWriter(); + try { + out.println(""); + out.println(""); + out.println(""); + if (uid > 0) { + out.println(""); + out.println("" + uname + " - Juick"); + out.println("http://juick.com/" + uname + "/"); + out.println("The latest messages by @" + uname + " at Juick"); + out.println("http://i.juick.com/a/" + uid + ".png" + uname + " - Juickhttp://juick.com/" + uname + "/"); + } else { + out.println("Juick"); + out.println("http://juick.com/"); + out.println("The latest messages at Juick"); + } + + Iterator i = msgs.iterator(); + while (i.hasNext()) { + Message msg = i.next(); + + out.println(""); + out.println("http://juick.com/" + msg.User.UName + "/" + msg.MID + ""); + out.println("http://juick.com/" + msg.User.UName + "/" + msg.MID + ""); + + out.print("<![CDATA[@" + msg.User.UName + ":"); + if (!msg.Tags.isEmpty()) { + for (int n = 0; n < msg.Tags.size(); n++) { + out.print(" *" + msg.Tags.get(n)); + } + } + out.println("]]>"); + out.println(""); + + synchronized (sdfSQL) { + try { + Date date = sdfSQL.parse(msg.TimestampString); + out.println("" + sdfRSS.format(date) + ""); + } catch (Exception e) { + System.err.println("PARSE EXCEPTION: " + msg.TimestampString); + } + } + + out.println("http://juick.com/" + msg.User.UName + "/" + msg.MID + ""); + if (!msg.Tags.isEmpty()) { + for (int n = 0; n < msg.Tags.size(); n++) { + out.println("" + msg.Tags.get(n) + ""); + } + } + if (msg.AttachmentType != null) { + if (msg.AttachmentType.equals("jpg")) { + out.println(""); + out.println(""); + } else if (msg.AttachmentType.equals("png")) { + out.println(""); + out.println(""); + } + } + out.println(""); + out.println(""); + } + + out.println(""); + } finally { + out.close(); + } + } + + private void responseReplies(HttpServletResponse response, int hours) throws IOException { + response.setContentType("application/rss+xml; charset=UTF-8"); + + PrintWriter out = response.getWriter(); + try { + + out.println(""); + out.println(""); + out.println(""); + out.println("Juick"); + out.println("http://juick.com/"); + out.println("The latest comments at Juick"); + + PreparedStatement stmt = null; + ResultSet rs = null; + try { + stmt = sql.prepareStatement("SELECT users2.nick,replies.message_id,replies.reply_id,users.nick,replies.txt,DATE_FORMAT(replies.ts,'%a, %d %b %Y %T UT'),replies.attach,replies.ts+0 FROM ((replies INNER JOIN users ON replies.user_id=users.id) INNER JOIN messages ON replies.message_id=messages.message_id) INNER JOIN users AS users2 ON messages.user_id=users2.id WHERE replies.ts>TIMESTAMPADD(HOUR,?,NOW()) AND messages.privacy>0"); + stmt.setInt(1, -hours); + rs = stmt.executeQuery(); + rs.beforeFirst(); + while (rs.next()) { + String muname = rs.getString(1); + int mid = rs.getInt(2); + int rid = rs.getInt(3); + String uname = rs.getString(4); + + out.println(""); + out.println("http://juick.com/" + muname + "/" + mid + ""); + out.println("http://juick.com/" + muname + "/" + mid + "#" + rid + ""); + out.println("http://juick.com/" + muname + "/" + mid + "#" + rid + ""); + out.println("http://juick.com/" + uname + "/"); + out.println("@" + uname + ":"); + out.println(""); + out.println("" + rs.getString(6) + ""); + String attachment = rs.getString(7); + if (attachment != null && !attachment.isEmpty()) { + if (attachment.equals("jpg")) { + out.println(""); + out.println(""); + } else if (attachment.equals("png")) { + out.println(""); + out.println(""); + } + } + out.println(""); + } + } catch (SQLException e) { + System.err.println(e); + } finally { + Utils.finishSQL(rs, stmt); + } + + out.println(""); + } finally { + out.close(); + } + } + + private ArrayList getLastMessages(int hours) { + ArrayList mids = new ArrayList(20); + + PreparedStatement stmt = null; + ResultSet rs = null; + try { + stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE messages.ts>TIMESTAMPADD(HOUR,?,NOW())"); + stmt.setInt(1, -hours); + rs = stmt.executeQuery(); + rs.beforeFirst(); + while (rs.next()) { + mids.add(rs.getInt(1)); + } + } catch (SQLException e) { + System.err.println(e); + } finally { + Utils.finishSQL(rs, stmt); + } + return mids; + } + private static Pattern regexLinks2 = Pattern.compile("((?<=\\s)|(?<=\\A))([\\[\\{]|<)((?:ht|f)tps?://(?:www\\.)?([^\\/\\s\\\"\\)\\!]+)/?(?:[^\\]\\}](?", ">"); + + // -- + // — + msg = msg.replaceAll("((?<=\\s)|(?<=\\A))\\-\\-?((?=\\s)|(?=\\Z))", "$1—$2"); + + // http://juick.com/last?page=2 + // juick.com + msg = msg.replaceAll("((?<=\\s)|(?<=\\A))((?:ht|f)tps?://(?:www\\.)?([^\\/\\s\\n\\\"]+)/?[^\\s\\n\\\"]*)", "$1$3"); + + // #12345 + // #12345 + msg = msg.replaceAll("((?<=\\s)|(?<=\\A)|(?<=\\p{Punct}))#(\\d+)((?=\\s)|(?=\\Z)|(?=\\))|(?=\\.)|(?=\\,))", "$1#$2$3"); + + // #12345/65 + // #12345/65 + msg = msg.replaceAll("((?<=\\s)|(?<=\\A)|(?<=\\p{Punct}))#(\\d+)/(\\d+)((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1#$2/$3$4"); + + // *bold* + // bold + msg = msg.replaceAll("((?<=\\s)|(?<=\\A)|(?<=\\p{Punct}))\\*([^\\*\\n<>]+)\\*((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1$2$3"); + + // /italic/ + // italic + msg = msg.replaceAll("((?<=\\s)|(?<=\\A))/([^\\/\\n<>]+)/((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1$2$3"); + + // _underline_ + // underline + msg = msg.replaceAll("((?<=\\s)|(?<=\\A))_([^\\_\\n<>]+)_((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1$2$3"); + + // /12 + // /12 + msg = msg.replaceAll("((?<=\\s)|(?<=\\A))\\/(\\d+)((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1/$2$3"); + + // @username@jabber.org + // @username@jabber.org + msg = msg.replaceAll("((?<=\\s)|(?<=\\A))@([\\w\\-\\.]+@[\\w\\-\\.]+)((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1@$2$3"); + + // @username + // @username + msg = msg.replaceAll("((?<=\\s)|(?<=\\A))@([\\w\\-]{2,16})((?=\\s)|(?=\\Z)|(?=\\p{Punct}))", "$1@$2$3"); + + // (http://juick.com/last?page=2) + // (juick.com) + Matcher m = regexLinks2.matcher(msg); + StringBuffer sb = new StringBuffer(); + while (m.find()) { + String url = m.group(3).replace(" ", "%20").replaceAll("\\s+", ""); + m.appendReplacement(sb, "$1$2$4$5"); + } + m.appendTail(sb); + msg = sb.toString(); + + // > citate + msg = msg.replaceAll("(?:(?<=\\n)|(?<=\\A))> *(.*)?(\\n|(?=\\Z))", "
$1
"); + msg = msg.replaceAll("
", "\n"); + + msg = msg.replaceAll("\n", "
\n"); + return msg; + } +} diff --git a/src/main/java/com/juick/rss/Utils.java b/src/main/java/com/juick/rss/Utils.java new file mode 100644 index 00000000..a6842fe1 --- /dev/null +++ b/src/main/java/com/juick/rss/Utils.java @@ -0,0 +1,74 @@ +/* + * Juick + * Copyright (C) 2008-2011, ugnich + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.juick.rss; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; + +/** + * + * @author ugnich + */ +public class Utils { + + public static void finishSQL(ResultSet rs, Statement stmt) { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + } + } + if (stmt != null) { + try { + stmt.close(); + } catch (SQLException e) { + } + } + } + + public static String convertArray2String(ArrayList mids) { + String q = ""; + for (int i = 0; i < mids.size(); i++) { + if (i > 0) { + q += ","; + } + q += mids.get(i); + } + return q; + } + + public static String encodeHTML(String str) { + String ret = str; + ret = ret.replaceAll("<", "<"); + ret = ret.replaceAll(">", ">"); + return str; + } + + public static int parseInt(String str, int def) { + int ret = def; + if (str != null) { + try { + ret = Integer.parseInt(str); + } catch (Exception e) { + } + } + return ret; + } +} -- cgit v1.2.3