X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ftext%2FSoneTextParser.java;h=6752c12b45c7a9209386accf9b89a60756774713;hb=2241b13275a0dec86461aba67db92825424b9f1b;hp=ae299e1163ea4072f7f83a4b99c9a91ad93e6b17;hpb=16b7ecd68873178d79b81023fc702d61d7696e13;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/text/SoneTextParser.java b/src/main/java/net/pterodactylus/sone/text/SoneTextParser.java index ae299e1..6752c12 100644 --- a/src/main/java/net/pterodactylus/sone/text/SoneTextParser.java +++ b/src/main/java/net/pterodactylus/sone/text/SoneTextParser.java @@ -1,5 +1,5 @@ /* - * Sone - SoneTextParser.java - Copyright © 2010–2015 David Roden + * Sone - SoneTextParser.java - Copyright © 2010–2016 David Roden * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -122,7 +122,7 @@ public class SoneTextParser implements Parser { */ @Nonnull @Override - public Iterable parse(@Nullable SoneTextParserContext context, @Nonnull String source) { + public Iterable parse(@Nonnull String source, @Nullable SoneTextParserContext context) { PartContainer parts = new PartContainer(); BufferedReader bufferedReader = new BufferedReader(new StringReader(source)); try { @@ -175,9 +175,8 @@ public class SoneTextParser implements Parser { } lineComplete = false; - Matcher matcher = whitespacePattern.matcher(line); - int nextSpace = matcher.find(0) ? matcher.start() : line.length(); - String link = line.substring(0, nextSpace); + int endOfLink = findEndOfLink(line); + String link = line.substring(0, endOfLink); String name = link; logger.log(Level.FINER, String.format("Found link: %s", link)); @@ -271,7 +270,7 @@ public class SoneTextParser implements Parser { } parts.add(new LinkPart(link, name)); } - line = line.substring(nextSpace); + line = line.substring(endOfLink); } lastLineEmpty = false; } @@ -291,6 +290,40 @@ public class SoneTextParser implements Parser { return parts; } + private int findEndOfLink(String line) { + Matcher matcher = whitespacePattern.matcher(line); + if (!matcher.find(0)) { + return line.length(); + } + int nextWhitespace = matcher.start(); + int lastPunctuation = nextWhitespace; + while (isPunctuation(line.charAt(lastPunctuation - 1))) { + lastPunctuation -= 1; + } + if (lastPunctuation < nextWhitespace) { + return lastPunctuation; + } + int openParens = 0; + for (int i = 0; i < nextWhitespace; i++) { + switch (line.charAt(i)) { + case '(': + openParens++; + break; + case ')': + openParens--; + if (openParens < 0) { + return i; + } + default: + } + } + return nextWhitespace; + } + + private boolean isPunctuation(char character) { + return character == '.'; + } + private static class NextLink { private final int position;