Match.java |
1 /** 2 * Distribution License: 3 * JSword is free software; you can redistribute it and/or modify it under 4 * the terms of the GNU Lesser General Public License, version 2.1 or later 5 * as published by the Free Software Foundation. This program is distributed 6 * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 7 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 8 * See the GNU Lesser General Public License for more details. 9 * 10 * The License is available on the internet at: 11 * http://www.gnu.org/copyleft/lgpl.html 12 * or by writing to: 13 * Free Software Foundation, Inc. 14 * 59 Temple Place - Suite 330 15 * Boston, MA 02111-1307, USA 16 * 17 * © CrossWire Bible Society, 2007 - 2016 18 * 19 */ 20 package org.crosswire.common.diff; 21 22 /** 23 * Computes the difference between two texts to create a patch. Applies the 24 * patch onto another text, allowing for errors. 25 * 26 * Based on the LGPL Diff_Match_Patch v1.5 javascript of Neil Fraser, Copyright (C) 2006<br> 27 * <a href="http://neil.fraser.name/software/diff_match_patch/">http://neil.fraser.name/software/diff_match_patch/</a> 28 * 29 * @see gnu.lgpl.License The GNU Lesser General Public License for details. 30 * @author DM Smith 31 */ 32 public class Match implements Locator { 33 public Match() { 34 this("", "", 0); 35 } 36 37 /** 38 * Locate the best instance of 'pattern' in 'text' near 'loc'. 39 * 40 * @param text 41 * The text to search 42 * @param pattern 43 * The pattern to search for 44 * @param loc 45 * The location to search around 46 */ 47 public Match(String text, String pattern, int loc) { 48 this.text = text; 49 this.pattern = pattern; 50 this.loc = loc; 51 this.locator = new Bitap(text, pattern, loc); 52 } 53 54 /* 55 * (non-Javadoc) 56 * 57 * @see org.crosswire.common.diff.Locator#maxPatternLength() 58 */ 59 public int maxPatternLength() { 60 return locator.maxPatternLength(); 61 } 62 63 /** 64 * Locate the best instance of 'pattern' in 'text' near 'loc'. 65 * 66 * @return Best match index or -1, if no match found 67 */ 68 public int locate() { 69 if (text.equals(pattern)) { 70 // Shortcut (potentially not guaranteed by the algorithm) 71 return 0; 72 } 73 74 if (text.length() == 0) { 75 // Nothing to match. 76 return -1; 77 } 78 79 loc = Math.max(0, Math.min(loc, text.length() - pattern.length())); 80 if (text.substring(loc, loc + pattern.length()).equals(pattern)) { 81 // Perfect match at the perfect spot! (Includes case of null 82 // pattern) 83 return loc; 84 } 85 86 return locator.locate(); 87 } 88 89 /** 90 * The text to search. 91 */ 92 private String text; 93 94 /** 95 * The pattern to find in the text. 96 */ 97 private String pattern; 98 99 /** 100 * The location in text to focus the search. 101 */ 102 private int loc; 103 104 /** 105 * The strategy for locating a best match. 106 */ 107 private Locator locator; 108 } 109