All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.kefirsf.bb.proc.ProcBol Maven / Gradle / Ivy

Go to download

KefirBB is a Java-library for text processing. Initially it was developed for BB2HTML translation. But flexible configuration allows to use it in different cases. For example for parsing Markdown, Textile, and for HTML filtration.

The newest version!
package org.kefirsf.bb.proc;

/**
 * Beginning of line
 *
 * @author kefir
 */
public class ProcBol implements ProcPatternElement {
    public boolean parse(Context context, ProcPatternElement terminator) throws NestingException {
        return isNextIn(context);
    }

    public boolean isNextIn(Context context) {
        Source source = context.getSource();
        return source.hasNext() && onBol(source);
    }

    /**
     * I strongly don't recommend to use tag bol as a terminator.
     */
    public int findIn(Source source) {
        if (source.hasNext()) {
            // maybe we are on the beginning of line already?
            if (onBol(source)) {
                return source.getOffset();
            }

            // If no find next line break
            int index = findLineBreak(source);

            if (index < 0) {
                return -1;
            }

            // Skip line break 1 or 2 characters
            index = skipLineBreak(source, index);

            // If index is not on the end of text return it otherwise it's not a beginning of line.
            if (index < source.length()) {
                return index;
            } else {
                return -1;
            }
        } else {
            return -1;
        }
    }

    /**
     * Check we are on the beginning of line
     *
     * @param source the text source
     * @return true if we are on the beginning of line
     */
    private boolean onBol(Source source) {
        int offset = source.getOffset();
        if (offset == 0) {
            return true;
        } else {
            char c = source.charAt(offset);
            char p = source.charAt(offset - 1);
            return c != '\n' && c != '\r' && (p == '\n' || p == '\r');
        }
    }

    /**
     * Find first input of line break
     *
     * @param source the text source
     */
    private int findLineBreak(Source source) {
        int index;
        int n = source.find(AbstractEol.AN, false);
        int r = source.find(AbstractEol.AR, false);
        if (n >= 0 && r >= 0) {
            index = Math.min(n, r);
        } else if (n >= 0) {
            index = n;
        } else if (r >= 0) {
            index = r;
        } else {
            index = -1;
        }
        return index;
    }

    /**
     * Skip line break characters. '\r\n' for example
     *
     * @param source text source
     * @param offset current index
     * @return new index
     */
    private int skipLineBreak(Source source, final int offset) {
        char p;
        char c;
        int index = offset;
        p = source.charAt(index);
        index++;
        if (index < source.length()) {
            c = source.charAt(index);
            if ((c == '\n' || c == '\r') && c != p) {
                index++;
            }
        }
        return index;
    }

    @Override
    public String toString() {
        return "";
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy