Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Copyright (C) 2014 Josh Ventura
- // Code is part of LateralGM <lateralgm.org> and is released under the terms of
- // the GNU General Public License as published by the Free Software Foundation;
- // version 3 of the license, or any later version.
- private static final Pattern newline = Pattern.compile("\r\n|\r|\n");
- public static LineMatch[] getMatchingLines(String code, Pattern content) {
- List<LineMatch> res = new ArrayList<>();
- Matcher m = content.matcher(code), nl = newline.matcher(code);
- int lineNum = 1, lineAt = 0, lastEnd = -1;
- LineMatch lastMatch = null;
- while (m.find()) {
- nl.region(lineAt, m.start());
- int firstSkippedLineAt = lineAt;
- if (nl.find()) {
- firstSkippedLineAt = nl.start();
- lineAt = nl.end();
- ++lineNum;
- while (nl.find()) {
- ++lineNum;
- lineAt = nl.end();
- }
- }
- if (lastMatch != null) {
- // We have to add the rest of the line to the old match, either way.
- // And if we're matching on the same line, we add that match, too.
- if (lineNum == lastMatch.lineNum) {
- lastMatch.matchedText.add(new MatchBlock(code.substring(lastEnd, m.start()), false));
- lastMatch.matchedText.add(new MatchBlock(code.substring(m.start(), m.end()), true));
- } else {
- lastMatch.matchedText.add(
- new MatchBlock(code.substring(lastEnd, firstSkippedLineAt), false));
- }
- }
- if (lastMatch == null || lineNum != lastMatch.lineNum) {
- lastMatch = new LineMatch();
- lastMatch.lineNum = lineNum;
- if (m.start() > lineAt) {
- lastMatch.matchedText.add(new MatchBlock(code.substring(lineAt, m.start()), false));
- }
- lastMatch.matchedText.add(new MatchBlock(code.substring(m.start(), m.end()), false));
- res.add(lastMatch);
- }
- lastEnd = m.end();
- }
- if (lastMatch != null) {
- nl.region(lastEnd, code.length());
- int indTo = (nl.find())? nl.start() : code.length();
- lastMatch.matchedText.add(new MatchBlock(code.substring(lastEnd, indTo), false));
- }
- return res.toArray(new LineMatch[] {});
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement