/*license*\ XBN-Java: Copyright (C) 2014, Jeff Epstein (aliteralmind __DASH__ github __AT__ yahoo __DOT__ com) This software is dual-licensed under the: - Lesser General Public License (LGPL) version 3.0 or, at your option, any later version; - Apache Software License (ASL) version 2.0. Either license may be applied at your discretion. More information may be found at - http://en.wikipedia.org/wiki/Multi-licensing. The text of both licenses is available in the root directory of this project, under the names "LICENSE_lgpl-3.0.txt" and "LICENSE_asl-2.0.txt". The latest copies may be downloaded at: - LGPL 3.0: https://www.gnu.org/licenses/lgpl-3.0.txt - ASL 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt \*license*/ package com.github.xbn.linefilter.alter; import com.github.xbn.analyze.alter.AlterationRequired; import com.github.xbn.linefilter.NewTextLineValidatorFor; import com.github.xbn.analyze.alter.NeedsToBeDeleted; import com.github.xbn.analyze.alter.Altered; import com.github.xbn.analyze.alter.AbstractValueAlterer; import com.github.xbn.analyze.validate.ValidResultFilter; import com.github.xbn.analyze.validate.ValueValidator; import com.github.xbn.linefilter.AdaptRegexReplacerTo; import com.github.xbn.regexutil.NewPatternFor; import com.github.xbn.regexutil.RegexReplacer; import com.github.xbn.regexutil.ReplacedInEachInput; import com.github.xbn.regexutil.StringReplacer; import com.github.xbn.regexutil.z.RegexReplacer_Cfg; import java.util.regex.Pattern; import org.apache.commons.lang3.StringEscapeUtils; /** <p>Convenience functions for creating text-line alterers from validators and regular expressions.</p> * @since 0.1.0 * @author Copyright (C) 2014, Jeff Epstein ({@code aliteralmind __DASH__ github __AT__ yahoo __DOT__ com}), dual-licensed under the LGPL (version 3.0 or later) or the ASL (version 2.0). See source code for details. <a href="http://xbnjava.aliteralmind.com">{@code http://xbnjava.aliteralmind.com}</a>, <a href="https://github.com/aliteralmind/xbnjava">{@code https://github.com/aliteralmind/xbnjava}</a> **/ public class NewTextLineAltererFor { /** <p>Does nothing. The input is returned without change.</p> * @return <code>(new {@link com.github.xbn.linefilter.alter.AlterTextLineWhen#AlterTextLineWhen() AlterTextLineWhen}()</code> */ public static final AlterTextLineWhen alwaysReturnUnchanged() { return (new AlterTextLineWhen()); } /** <p><i><b>Deprecated</b> for {@code textValidateOnly}</i>--Identifies the line's text based on a regular expression--the line is not altered.</p> * @return <code>{@link #textValidateOnly(Pattern, ValidResultFilter, Appendable) textValidateOnly}(pattern_toFind, filter_ifNonNull, dbgDest_ifNonNull)</code> @deprecated Use {@link #textValidateOnly(ValueValidator) textValidateOnly} */ @Deprecated public static final AlterTextLineWhen text(Pattern pattern_toFind, ValidResultFilter filter_ifNonNull, Appendable dbgDest_ifNonNull) { return textValidateOnly(pattern_toFind, filter_ifNonNull, dbgDest_ifNonNull); } /** <p><i><b>Deprecated</b> for {@code textValidateOnly}</i>--Identifies the line's text based on a regular expression--the line is not altered.</p> * @return <code>{@link #textValidateOnly(ValueValidator) textValidateOnly}(string_validator)</code> @deprecated Use {@link #textValidateOnly(ValueValidator) textValidateOnly} */ @Deprecated public static final AlterTextLineWhen text(ValueValidator<String> string_validator) { return textValidateOnly(string_validator); } /** <p><i><b>Deprecated</b> for {@code textValidateOnly}</i>--Identifies the line's text based on a regular expression--the line is not altered.</p> * @return <code>{@link com.github.xbn.linefilter.alter.AlterTextLineWhen AlterTextLineWhen}.{@link com.github.xbn.linefilter.alter.AlterTextLineWhen#newATLWAlwaysReturnSelf(ValueValidator) newATLWAlwaysReturnSelf}{@link com.github.xbn.linefilter.NewTextLineValidatorFor NewTextLineValidatorFor}.{@link com.github.xbn.linefilter.NewTextLineValidatorFor#text(Pattern, ValidResultFilter, Appendable) text}(pattern_toFind, filter_ifNonNull, dbgDest_ifNonNull))</code> */ public static final AlterTextLineWhen textValidateOnly(Pattern pattern_toFind, ValidResultFilter filter_ifNonNull, Appendable dbgDest_ifNonNull) { return AlterTextLineWhen.newATLWAlwaysReturnSelf(NewTextLineValidatorFor.text(pattern_toFind, filter_ifNonNull, dbgDest_ifNonNull)); } /** <p><i><b>Deprecated</b> for {@code textValidateOnly}</i>--Identifies the line's text based on a regular expression--the line is not altered.</p> * @return <code>{@link com.github.xbn.linefilter.alter.AlterTextLineWhen AlterTextLineWhen}.{@link com.github.xbn.linefilter.alter.AlterTextLineWhen#newATLWAlwaysReturnSelf(ValueValidator) newATLWAlwaysReturnSelf}{@link com.github.xbn.linefilter.NewTextLineValidatorFor NewTextLineValidatorFor}.{@link com.github.xbn.linefilter.NewTextLineValidatorFor#text(String, ValidResultFilter, Appendable) text}(literal_textToMatch, filter_ifNonNull, dbgDest_ifNonNull))</code> */ public static final AlterTextLineWhen textValidateOnly(String literal_textToMatch, ValidResultFilter filter_ifNonNull, Appendable dbgDest_ifNonNull) { return AlterTextLineWhen.newATLWAlwaysReturnSelf(NewTextLineValidatorFor.text(literal_textToMatch, filter_ifNonNull, dbgDest_ifNonNull)); } /** <p>Identifies the line's text based on some condition--the line is not altered.</p> * @return <code>{@link com.github.xbn.linefilter.alter.AlterTextLineWhen AlterTextLineWhen}.{@link com.github.xbn.linefilter.alter.AlterTextLineWhen#newATLWAlwaysReturnSelf(ValueValidator) newATLWAlwaysReturnSelf}{@link com.github.xbn.linefilter.NewTextLineValidatorFor NewTextLineValidatorFor}.{@link com.github.xbn.linefilter.NewTextLineValidatorFor#text(ValueValidator) text}(string_validator))</code> */ public static final AlterTextLineWhen textValidateOnly(ValueValidator<String> string_validator) { return AlterTextLineWhen.newATLWAlwaysReturnSelf(NewTextLineValidatorFor.text(string_validator)); } /** <p>Identifies the line's number based on some condition--the line's text is not altered.</p> * @return <code>{@link com.github.xbn.linefilter.alter.AlterTextLineWhen AlterTextLineWhen}.{@link com.github.xbn.linefilter.alter.AlterTextLineWhen#newATLWAlwaysReturnSelf(ValueValidator) newATLWAlwaysReturnSelf}{@link com.github.xbn.linefilter.NewTextLineValidatorFor NewTextLineValidatorFor}.{@link com.github.xbn.linefilter.NewTextLineValidatorFor#number(ValueValidator) number}(int_validator))</code> */ public static final AlterTextLineWhen number(ValueValidator<Integer> int_validator) { return AlterTextLineWhen.newATLWAlwaysReturnSelf(NewTextLineValidatorFor.number(int_validator)); } /** <p>Inserts the line number before each line's body.</p> * @param start_lineNum The first line number. <i>Should</i> be 1 or greater. * @param btw_numAndText The text to go between the number and body. <i>Should</i> be non-{@code null} and non-empty. */ public static final TextLineAlterer prependLineNumber(int start_lineNum, String btw_numAndText) { return (new PrependLineNumToText(start_lineNum, btw_numAndText)); } /** <p>Escape all characters for html display. Uses <code>org.apache.commons.lang3.{@link org.apache.commons.lang3.StringEscapeUtils}{@link org.apache.commons.lang3.StringEscapeUtils#escapeHtml4 escapeHtml4}</code>.</p> */ public static final TextLineAlterer escapeHtml() { return (new EscapeLineTextForHtmlDisplay()); } /** <p>Make a literal string replacement.</p> * @return <code>{@link #replacement(AlterationRequired, Pattern, String, ReplacedInEachInput, Appendable, ValidResultFilter) replacement}({@link com.github.xbn.regexutil.NewPatternFor#literal(String) literal}(find_what), rplc_with, rplcs_what, dbgDest_ifNonNull, filter_ifNonNull)</code> */ public static final TextLineAlterAdapter<StringReplacer> literalReplacement(AlterationRequired required, String find_what, String rplc_with, ReplacedInEachInput rplcs_what, Appendable dbgDest_ifNonNull, ValidResultFilter filter_ifNonNull) { return replacement(required, NewPatternFor.literal(find_what, "find_what"), rplc_with, rplcs_what, dbgDest_ifNonNull, filter_ifNonNull); } /** <p>Makes a regular expression replacement.</p> * @return <code>{@link com.github.xbn.linefilter.AdaptRegexReplacerTo AdaptRegexReplacerTo}.{@link com.github.xbn.linefilter.AdaptRegexReplacerTo#lineReplacer(AlterationRequired, RegexReplacer, ValidResultFilter) lineReplacer}(required, rr, filter_ifNonNull)</code> <br/>Where {@code rr} is a <br/>     <code>new {@link com.github.xbn.regexutil.z.RegexReplacer_Cfg RegexReplacer_Cfg}.{@link com.github.xbn.regexutil.z.RegexReplacer_Cfg#RegexReplacer_Cfg() RegexReplacer_Cfg}(). {@link com.github.xbn.regexutil.z.RegexReplacer_CfgForNeeder#direct(Pattern, Object) direct}(ptrn_findWhat, rplc_with).{@link com.github.xbn.regexutil.z.RegexReplacer_CfgForNeeder#replaceWhatNotMatchNums(ReplacedInEachInput) replaceWhatNotMatchNums}(rplcs_what). {@link com.github.xbn.regexutil.z.RegexReplacer_CfgForNeeder#debugTo(Appendable) debugTo}(dbgDest_ifNonNull).{@link com.github.xbn.regexutil.z.RegexReplacer_CfgForNeeder#build() build}();</code> * @see #literalReplacement(AlterationRequired, String, String, ReplacedInEachInput, Appendable, ValidResultFilter) */ public static final TextLineAlterAdapter<StringReplacer> replacement(AlterationRequired required, Pattern ptrn_findWhat, String rplc_with, ReplacedInEachInput rplcs_what, Appendable dbgDest_ifNonNull, ValidResultFilter filter_ifNonNull) { RegexReplacer rr = new RegexReplacer_Cfg(). direct(ptrn_findWhat, rplc_with).replaceWhatNotMatchNums(rplcs_what). debugTo(dbgDest_ifNonNull).build(); return AdaptRegexReplacerTo.lineReplacer(required, rr, filter_ifNonNull); } private NewTextLineAltererFor() { throw new IllegalStateException("Do not instantiate"); } } class PrependLineNumToText extends AbstractValueAlterer<String,String> implements TextLineAlterer { private final String btwNumAndTxt; private int lineNum; public PrependLineNumToText(int first_lineNum) { this(first_lineNum, ". "); } public PrependLineNumToText(int first_lineNum, String between_numAndText) { super(); lineNum = first_lineNum; btwNumAndTxt = between_numAndText; } public PrependLineNumToText(PrependLineNumToText to_copy) { super(to_copy); lineNum = to_copy.getLineNum(); btwNumAndTxt = to_copy.getBetweenNumAndText(); } public int getLineNum() { return lineNum; } public String getBetweenNumAndText() { return btwNumAndTxt; } public String getAlteredPostResetCheck(String ignored, String to_alter) { declareAltered(Altered.YES, NeedsToBeDeleted.NO); return (lineNum++) + getBetweenNumAndText() + to_alter; } public PrependLineNumToText getObjectCopy() { return (new PrependLineNumToText(this)); } public StringBuilder appendToString(StringBuilder to_appendTo) { return to_appendTo.append(this.getClass().getName()).append(": getLineNum()=" + getLineNum() + " getBetweenNumAndText()=\"" + getBetweenNumAndText() + "\""); } } class EscapeLineTextForHtmlDisplay extends AbstractValueAlterer<String,String> implements TextLineAlterer { public EscapeLineTextForHtmlDisplay() { } public EscapeLineTextForHtmlDisplay(EscapeLineTextForHtmlDisplay to_copy) { super(to_copy); } public String getAlteredPostResetCheck(String ignored, String to_alter) { declareAltered(Altered.YES, NeedsToBeDeleted.NO); return StringEscapeUtils.escapeHtml4(to_alter); } public EscapeLineTextForHtmlDisplay getObjectCopy() { return (new EscapeLineTextForHtmlDisplay(this)); } public StringBuilder appendToString(StringBuilder to_appendTo) { return to_appendTo.append(this.getClass().getName()); } }