Class LineAppendableImpl

java.lang.Object
com.vladsch.flexmark.util.sequence.LineAppendableImpl
All Implemented Interfaces:
LineAppendable, Appendable, Iterable<LineInfo>

public class LineAppendableImpl extends Object implements LineAppendable
  • Field Details

    • EOL

      private static final char EOL
      See Also:
    • passThrough

      private final boolean passThrough
    • options

      private final BitFieldSet<LineAppendable.Options> options
    • preFormattedNesting

      private int preFormattedNesting
    • preFormattedFirstLine

      private int preFormattedFirstLine
    • preFormattedFirstLineOffset

      private int preFormattedFirstLineOffset
    • preFormattedLastLine

      private int preFormattedLastLine
    • preFormattedLastLineOffset

      private int preFormattedLastLineOffset
    • appendable

      private ISequenceBuilder<?,?> appendable
    • lines

      final ArrayList<LineInfo> lines
    • prefix

      private CharSequence prefix
    • prefixAfterEol

      private CharSequence prefixAfterEol
    • indentPrefix

      private CharSequence indentPrefix
    • prefixStack

      private final Stack<CharSequence> prefixStack
    • indentPrefixStack

      private final Stack<Boolean> indentPrefixStack
    • allWhitespace

      private boolean allWhitespace
    • lastWasWhitespace

      private boolean lastWasWhitespace
    • eolOnFirstText

      private int eolOnFirstText
    • indentsOnFirstEol

      private final ArrayList<Runnable> indentsOnFirstEol
    • optionStack

      private final Stack<Integer> optionStack
    • modificationCount

      int modificationCount
  • Constructor Details

    • LineAppendableImpl

      public LineAppendableImpl(int formatOptions)
    • LineAppendableImpl

      public LineAppendableImpl(@Nullable @Nullable Appendable builder, int formatOptions)
    • LineAppendableImpl

      public LineAppendableImpl(@Nullable @Nullable Appendable appendable, BitFieldSet<LineAppendable.Options> formatOptions)
  • Method Details

    • getEmptyAppendable

      @NotNull public @NotNull LineAppendable getEmptyAppendable()
      Specified by:
      getEmptyAppendable in interface LineAppendable
    • getOptionSet

      @NotNull public @NotNull BitFieldSet<LineAppendable.Options> getOptionSet()
      Description copied from interface: LineAppendable
      Get current options as set which can be used to modify options
      Specified by:
      getOptionSet in interface LineAppendable
      Returns:
      mutable option set
    • setOptions

      @NotNull public @NotNull LineAppendable setOptions(int flags)
      Description copied from interface: LineAppendable
      Set options on processing text
      Specified by:
      setOptions in interface LineAppendable
      Parameters:
      flags - option flags
      Returns:
      this
    • pushOptions

      @NotNull public @NotNull LineAppendable pushOptions()
      Specified by:
      pushOptions in interface LineAppendable
    • popOptions

      @NotNull public @NotNull LineAppendable popOptions()
      Specified by:
      popOptions in interface LineAppendable
    • changeOptions

      @NotNull public @NotNull LineAppendable changeOptions(int addFlags, int removeFlags)
      Specified by:
      changeOptions in interface LineAppendable
    • any

      private boolean any(int flags)
    • isConvertingTabs

      private boolean isConvertingTabs()
    • isTrimTrailingWhitespace

      private boolean isTrimTrailingWhitespace()
    • isTrimLeadingWhitespace

      private boolean isTrimLeadingWhitespace()
    • isCollapseWhitespace

      private boolean isCollapseWhitespace()
    • getIndentPrefix

      @NotNull public @NotNull BasedSequence getIndentPrefix()
      Description copied from interface: LineAppendable
      Get prefix appended after a new line character for every indent level
      Specified by:
      getIndentPrefix in interface LineAppendable
      Returns:
      char sequence of the current indent prefix used for each indent level
    • setIndentPrefix

      @NotNull public @NotNull LineAppendable setIndentPrefix(@Nullable @Nullable CharSequence prefix)
      Description copied from interface: LineAppendable
      Set prefix to append after a new line character for every indent level
      Specified by:
      setIndentPrefix in interface LineAppendable
      Parameters:
      prefix - prefix characters for new lines appended after this is set
      Returns:
      this
    • getPrefix

      @NotNull public @NotNull BasedSequence getPrefix()
      Description copied from interface: LineAppendable
      Get prefix being applied to all lines, even in pre-formatted sections This is the prefix that will be set after EOL
      Specified by:
      getPrefix in interface LineAppendable
      Returns:
      char sequence of the current prefix
    • getBeforeEolPrefix

      @NotNull public @NotNull BasedSequence getBeforeEolPrefix()
      Description copied from interface: LineAppendable
      Get prefix used before EOL
      Specified by:
      getBeforeEolPrefix in interface LineAppendable
      Returns:
      char sequence of the current prefix
    • addPrefix

      @NotNull public @NotNull LineAppendable addPrefix(@NotNull @NotNull CharSequence prefix, boolean afterEol)
      Description copied from interface: LineAppendable
      Add to prefix appended after a new line character for every line and after a new line in pre-formatted sections

      This appends the sequence to current prefix

      Specified by:
      addPrefix in interface LineAppendable
      Parameters:
      prefix - prefix characters to add to current prefix for new lines appended after this is set
      afterEol - if true prefix will take effect after EOL
      Returns:
      this
    • getAfterEolPrefixDelta

      public int getAfterEolPrefixDelta()
      Description copied from interface: LineAppendable
      Get pending prefix after EOL
      Specified by:
      getAfterEolPrefixDelta in interface LineAppendable
      Returns:
      change in prefix length after next eol
    • setPrefix

      @NotNull public @NotNull LineAppendable setPrefix(@Nullable @Nullable CharSequence prefix, boolean afterEol)
      Description copied from interface: LineAppendable
      Set prefix appended after a new line character for every line and after a new line in pre-formatted sections

      This appends the sequence to current prefix

      Specified by:
      setPrefix in interface LineAppendable
      Parameters:
      prefix - prefix characters to add to current prefix for new lines appended after this is set
      afterEol - if true prefix will take effect after EOL
      Returns:
      this
    • indent

      @NotNull public @NotNull LineAppendable indent()
      Description copied from interface: LineAppendable
      Increase the indent level, will terminate the current line if there is unterminated text

      NOTE: this is equivalent to pushPrefix(), addPrefix(getIndentPrefix()) but adds a flag to validate that LineAppendable.unIndent() is called only on prefixes added by this method

      Specified by:
      indent in interface LineAppendable
      Returns:
      this
    • rawIndent

      private void rawIndent()
    • rawUnIndent

      private void rawUnIndent()
    • unIndent

      @NotNull public @NotNull LineAppendable unIndent()
      Description copied from interface: LineAppendable
      Decrease the indent level, min level is 0, will terminate the current line if there is unterminated text

      NOTE: this is equivalent to popPrefix() but with validation that it is called only on prefixes added by LineAppendable.indent()

      Specified by:
      unIndent in interface LineAppendable
      Returns:
      this
    • unIndentNoEol

      @NotNull public @NotNull LineAppendable unIndentNoEol()
      Description copied from interface: LineAppendable
      Decrease the indent level, if there is unterminated text then unindented prefix is to be applied after the next EOL.

      Will NOT terminate the current line if there is unterminated text

      NOTE: should be used with LineAppendable.addIndentOnFirstEOL(Runnable) if callback is invoked

      Specified by:
      unIndentNoEol in interface LineAppendable
      Returns:
      this
    • pushPrefix

      @NotNull public @NotNull LineAppendable pushPrefix()
      Description copied from interface: LineAppendable
      Save the current prefix on the stack
      Specified by:
      pushPrefix in interface LineAppendable
      Returns:
      this
    • popPrefix

      @NotNull public @NotNull LineAppendable popPrefix(boolean afterEol)
      Description copied from interface: LineAppendable
      Pop a prefix from the stack and set the current prefix
      Specified by:
      popPrefix in interface LineAppendable
      Parameters:
      afterEol - if true prefix will take effect after EOL
      Returns:
      this
    • getLastLineInfo

      @NotNull @NotNull LineInfo getLastLineInfo()
    • isTrailingBlankLine

      private boolean isTrailingBlankLine()
    • lastNonBlankLine

      int lastNonBlankLine(int endLine)
    • getTrailingBlankLines

      public int getTrailingBlankLines(int endLine)
      Description copied from interface: LineAppendable
      Get trailing blank line count ending on given line
      Specified by:
      getTrailingBlankLines in interface LineAppendable
      Parameters:
      endLine - end line
      Returns:
      number of trailing blank lines
    • endsWithEOL

      public boolean endsWithEOL()
      Specified by:
      endsWithEOL in interface LineAppendable
      Returns:
      true if not empty and have no unterminated lines
    • getLineRange

      private LineInfo getLineRange(int start, int end, CharSequence prefix)
    • resetBuilder

      private void resetBuilder()
    • addLineRange

      private void addLineRange(int start, int end, CharSequence prefix)
    • appendEol

      private void appendEol(@NotNull @NotNull CharSequence eol)
    • rawIndentsOnFirstEol

      private void rawIndentsOnFirstEol()
    • appendEol

      private void appendEol(int count)
    • isPrefixed

      private boolean isPrefixed(int currentLine)
    • getRangePrefixAfterEol

      private Pair<Range,CharSequence> getRangePrefixAfterEol()
      Returns text range if EOL was appended

      NOTE: if range == Range.NULL then no line would be added

      Returns:
      pair of line text range if EOL was added and prefix
    • offsetAfterEol

      private int offsetAfterEol()
      Returns text offset before EOL if EOL was issued
      Returns:
      would be offset after adding EOL - 1
    • doEolOnFirstTest

      private void doEolOnFirstTest()
    • appendImpl

      private void appendImpl(CharSequence s, int index)
    • appendImpl

      private void appendImpl(CharSequence csq, int start, int end)
    • append

      @NotNull public @NotNull LineAppendable append(@NotNull @NotNull CharSequence csq)
      Specified by:
      append in interface Appendable
      Specified by:
      append in interface LineAppendable
    • getBuilder

      @NotNull public @NotNull ISequenceBuilder<?,?> getBuilder()
      Description copied from interface: LineAppendable
      Get builder used for accumulation
      Specified by:
      getBuilder in interface LineAppendable
      Returns:
      builder used for accumulation
    • append

      @NotNull public @NotNull LineAppendable append(@NotNull @NotNull CharSequence csq, int start, int end)
      Specified by:
      append in interface Appendable
      Specified by:
      append in interface LineAppendable
    • append

      @NotNull public @NotNull LineAppendable append(char c)
      Specified by:
      append in interface Appendable
      Specified by:
      append in interface LineAppendable
    • append

      @NotNull public @NotNull LineAppendable append(char c, int count)
      Specified by:
      append in interface LineAppendable
    • repeat

      @NotNull public @NotNull LineAppendable repeat(@NotNull @NotNull CharSequence csq, int count)
    • repeat

      @NotNull public @NotNull LineAppendable repeat(@NotNull @NotNull CharSequence csq, int start, int end, int count)
    • line

      @NotNull public @NotNull LineAppendable line()
      Description copied from interface: LineAppendable
      Add a new line if there was any unterminated text appended or if this is a preformatted region
      Specified by:
      line in interface LineAppendable
      Returns:
      this
    • lineWithTrailingSpaces

      @NotNull public @NotNull LineAppendable lineWithTrailingSpaces(int count)
      Description copied from interface: LineAppendable
      Add a new line, keep trailing spaces if there was any unterminated text appended

      NOTE: only applies in preformatted region or if the line is not empty

      Specified by:
      lineWithTrailingSpaces in interface LineAppendable
      Parameters:
      count - number of trailing spaces to add
      Returns:
      this
    • lineIf

      @NotNull public @NotNull LineAppendable lineIf(boolean predicate)
      Description copied from interface: LineAppendable
      Add a new line, if predicate is true and line() would add an EOL.
      Specified by:
      lineIf in interface LineAppendable
      Parameters:
      predicate - call LineAppendable.line() if value is true.
      Returns:
      this
    • blankLine

      @NotNull public @NotNull LineAppendable blankLine()
      Description copied from interface: LineAppendable
      Add a blank line, if there is not one already appended.
      Specified by:
      blankLine in interface LineAppendable
      Returns:
      this
    • blankLineIf

      @NotNull public @NotNull LineAppendable blankLineIf(boolean predicate)
      Description copied from interface: LineAppendable
      Add a blank line, if predicate is true and there isn't already blank lines appended.
      Specified by:
      blankLineIf in interface LineAppendable
      Parameters:
      predicate - when true append blank line
      Returns:
      this
    • blankLine

      @NotNull public @NotNull LineAppendable blankLine(int count)
      Description copied from interface: LineAppendable
      Add a blank lines, if there isn't already given number of blank lines appended. Will append only enough blank lines to increase it to given level. If more are already in the wings then nothing is done.
      Specified by:
      blankLine in interface LineAppendable
      Parameters:
      count - number of blank lines to append
      Returns:
      this
    • lineOnFirstText

      @NotNull public @NotNull LineAppendable lineOnFirstText(boolean value)
      Specified by:
      lineOnFirstText in interface LineAppendable
    • removeIndentOnFirstEOL

      @NotNull public @NotNull LineAppendable removeIndentOnFirstEOL(@NotNull @NotNull Runnable listener)
      Description copied from interface: LineAppendable
      Remove runnable, has no effect if EOL was already appended and runnable was run
      Specified by:
      removeIndentOnFirstEOL in interface LineAppendable
      Parameters:
      listener - runnable added with addIndentOnFirstEOL
      Returns:
      this
    • addIndentOnFirstEOL

      @NotNull public @NotNull LineAppendable addIndentOnFirstEOL(@NotNull @NotNull Runnable listener)
      Description copied from interface: LineAppendable
      Add an indent on first EOL appended and run runnable
      Specified by:
      addIndentOnFirstEOL in interface LineAppendable
      Parameters:
      listener - runnable to run if adding indent on first EOL
      Returns:
      this
    • getLineCount

      public int getLineCount()
      Description copied from interface: LineAppendable
      Get the number of lines appended, not including any unterminated ones
      Specified by:
      getLineCount in interface LineAppendable
      Returns:
      number of full lines appended
    • getLineCountWithPending

      public int getLineCountWithPending()
      Description copied from interface: LineAppendable
      Get the number of lines appended, including any unterminated ones

      NOTE: if there is an unterminated line it will be available as the last line, without being terminated explicitly

      Specified by:
      getLineCountWithPending in interface LineAppendable
      Returns:
      number of lines appended
    • column

      public int column()
      Description copied from interface: LineAppendable
      Get column offset after last append
      Specified by:
      column in interface LineAppendable
      Returns:
      column offset after last append
    • getLineInfo

      @NotNull public @NotNull LineInfo getLineInfo(int lineIndex)
      Description copied from interface: LineAppendable
      Get Line information at given line index

      NOTE: if there is an unterminated line it will be available as the last line, without being terminated explicitly

      Specified by:
      getLineInfo in interface LineAppendable
      Parameters:
      lineIndex - line index for the info to get
      Returns:
      line info
    • getLine

      @NotNull public @NotNull BasedSequence getLine(int lineIndex)
      Description copied from interface: LineAppendable
      Get Line at given line index

      NOTE: if there is an unterminated line it will be available as the last line, without being terminated explicitly

      Specified by:
      getLine in interface LineAppendable
      Parameters:
      lineIndex - line index
      Returns:
      line char sequence
    • offset

      public int offset()
      Description copied from interface: LineAppendable
      Get text offset of all output lines, excluding any text for the last line being accumulated
      Specified by:
      offset in interface LineAppendable
      Returns:
      offset of text as would be returned for all
    • offsetWithPending

      public int offsetWithPending()
      Description copied from interface: LineAppendable
      Get offset after last append as if EOL was added but without the EOL itself
      Specified by:
      offsetWithPending in interface LineAppendable
      Returns:
      offset as would be returned by LineAppendable.offset() after line() call less 1 for EOL
    • isPendingSpace

      public boolean isPendingSpace()
      Description copied from interface: LineAppendable
      Test if trailing text ends in space or tab
      Specified by:
      isPendingSpace in interface LineAppendable
      Returns:
      true if ending in space or tab
    • getPendingSpace

      public int getPendingSpace()
      Description copied from interface: LineAppendable
      Get number of spaces at end of pending text
      Specified by:
      getPendingSpace in interface LineAppendable
      Returns:
      number of eols at end of text
    • getPendingEOL

      public int getPendingEOL()
      Description copied from interface: LineAppendable
      Get number of EOLs at end of appendable, this is actually number of tail blank lines
      Specified by:
      getPendingEOL in interface LineAppendable
      Returns:
      number of eols at end of text
    • isPreFormatted

      public boolean isPreFormatted()
      Specified by:
      isPreFormatted in interface LineAppendable
      Returns:
      true if in pre-formatted region
    • openPreFormatted

      @NotNull public @NotNull LineAppendable openPreFormatted(boolean addPrefixToFirstLine)
      Description copied from interface: LineAppendable
      Open preformatted section and suspend content modification
      Specified by:
      openPreFormatted in interface LineAppendable
      Parameters:
      addPrefixToFirstLine - if true will add the current prefix to first line
      Returns:
      this
    • closePreFormatted

      @NotNull public @NotNull LineAppendable closePreFormatted()
      Description copied from interface: LineAppendable
      Close preformatted section and suspend content modification
      Specified by:
      closePreFormatted in interface LineAppendable
      Returns:
      this
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • toString

      @NotNull public @NotNull String toString(int maxBlankLines, int maxTrailingBlankLines, boolean withPrefixes)
      Description copied from interface: LineAppendable
      get the resulting text for all lines
      Specified by:
      toString in interface LineAppendable
      Parameters:
      maxBlankLines - maximum blank lines to allow in the text
      maxTrailingBlankLines - maximum trailing blank lines
      withPrefixes - true if to include prefixes
      Returns:
      resulting text
    • toSequence

      @NotNull public @NotNull CharSequence toSequence(int maxBlankLines, int maxTrailingBlankLines, boolean withPrefixes)
      Description copied from interface: LineAppendable
      get the resulting text for all lines
      Specified by:
      toSequence in interface LineAppendable
      Parameters:
      maxBlankLines - maximum blank lines to allow in the text
      maxTrailingBlankLines - maximum trailing blank lines
      withPrefixes - true if to include prefixes
      Returns:
      resulting text
    • appendTo

      public <T extends Appendable> T appendTo(@NotNull T out, boolean withPrefixes, int maxBlankLines, int maxTrailingBlankLines, int startLine, int endLine) throws IOException
      Description copied from interface: LineAppendable
      append lines to appendable with given maximum trailing blank lines and given prefix to add to all lines

      NOTE:

      Specified by:
      appendTo in interface LineAppendable
      Type Parameters:
      T - type of out
      Parameters:
      out - appendable to output the resulting lines
      withPrefixes - true if to include prefixes
      maxBlankLines - maximum blank lines to allow in the body,
      maxTrailingBlankLines - maximum trailing blank lines at the end, if <maxBlankLines then maxBlankLines will be used, if -1 then no trailing EOL will be added
      startLine - line from which to start output
      endLine - line at which to stop output
      Returns:
      out
      Throws:
      IOException - if thrown by appendable
    • appendToNoLine

      public <T extends Appendable> T appendToNoLine(@NotNull T out, boolean withPrefixes, int maxBlankLines, int maxTrailingBlankLines, int startLine, int endLine) throws IOException
      Throws:
      IOException
    • append

      @NotNull public @NotNull LineAppendable append(@NotNull @NotNull LineAppendable lineAppendable, int startLine, int endLine, boolean withPrefixes)
      Description copied from interface: LineAppendable
      Append lines from another line formatting appendable.

      NOTE: does not apply formatting options. Instead, appends already formatted lines as is

      If there is an accumulating line, it will be terminated by an EOL before appending lines

      Specified by:
      append in interface LineAppendable
      Parameters:
      lineAppendable - lines to append, any unterminated lines will be terminated by a LineAppendable.line() invocation.
      startLine - start line to append
      endLine - end line to append, endLine is excluded.
      withPrefixes - true if to include prefixes from the lineAppendable.
      Returns:
      this
    • removeLinesRaw

      private int removeLinesRaw(int startLine, int endLine)
      Remove lines and return index from which line info must be recomputed
      Parameters:
      startLine - start line index to remove
      endLine - end line index to remove
      Returns:
      index from which line info must be recomputed
    • recomputeLineInfo

      void recomputeLineInfo(int startLine)
    • removeLines

      @NotNull public @NotNull LineAppendable removeLines(int startLine, int endLine)
      Specified by:
      removeLines in interface LineAppendable
    • removeExtraBlankLines

      public LineAppendable removeExtraBlankLines(int maxBlankLines, int maxTrailingBlankLines, int startLine, int endLine)
      Description copied from interface: LineAppendable
      Normalize the appendable by removing extra blank lines in the body or at the end of given line range
      Specified by:
      removeExtraBlankLines in interface LineAppendable
      Parameters:
      maxBlankLines - maximum blank lines to allow in the body
      maxTrailingBlankLines - maximum trailing blank lines ending on endLine, if <maxBlankLines then maxBlankLines will be used
      startLine - line from which to start output
      endLine - line at which to stop output
      Returns:
      this
    • setPrefixLength

      public void setPrefixLength(int lineIndex, int prefixLength)
      Description copied from interface: LineAppendable
      Change prefix length for a given line without changing the line content
      Specified by:
      setPrefixLength in interface LineAppendable
      Parameters:
      lineIndex - index of the line
      prefixLength - new prefix length
    • createLineInfo

      private LineInfo createLineInfo(int lineIndex, @NotNull @NotNull CharSequence prefix, @NotNull @NotNull CharSequence content)
    • setLine

      public void setLine(int lineIndex, @NotNull @NotNull CharSequence prefix, @NotNull @NotNull CharSequence content)
      Description copied from interface: LineAppendable
      Set content and prefix for a line
      Specified by:
      setLine in interface LineAppendable
      Parameters:
      lineIndex - index of the line
      prefix - prefix of the line
      content - content text of the line
    • insertLine

      public void insertLine(int lineIndex, @NotNull @NotNull CharSequence prefix, @NotNull @NotNull CharSequence content)
      Description copied from interface: LineAppendable
      Insert a line at the index with given content and prefix for a line
      Specified by:
      insertLine in interface LineAppendable
      Parameters:
      lineIndex - index of the line
      prefix - prefix of the line
      content - content text of the line
    • tailBlankLinesToRemove

      int tailBlankLinesToRemove(int endLine, int maxTrailingBlankLines)
    • getIndexedLineInfoProxy

      @NotNull @NotNull LineAppendableImpl.IndexedLineInfoProxy getIndexedLineInfoProxy(int maxTrailingBlankLines, int startLine, int endLine)
    • getIndexedLineProxy

      @NotNull @NotNull LineAppendableImpl.IndexedLineProxy getIndexedLineProxy(int maxTrailingBlankLines, int startLine, int endLine, boolean withPrefixes)
    • iterator

      @NotNull public @NotNull Iterator<LineInfo> iterator()
      Description copied from interface: LineAppendable
      Full line iterator NOTE: will not issue line() to terminate any unterminated lines before iteration and will not include unterminated lines in iteration
      Specified by:
      iterator in interface Iterable<LineInfo>
      Specified by:
      iterator in interface LineAppendable
      Returns:
      iterator over lines
    • getLines

      @NotNull public @NotNull Iterable<BasedSequence> getLines(int maxTrailingBlankLines, int startLine, int endLine, boolean withPrefixes)
      Description copied from interface: LineAppendable
      Full line iterator over some lines

      NOTE: will issue line() to terminate any unterminated lines before iteration

      Specified by:
      getLines in interface LineAppendable
      Parameters:
      maxTrailingBlankLines - maximum trailing blank lines, -1 if trailing EOL should be removed
      startLine - start line index
      endLine - end line index, exclusive
      withPrefixes - true if prefixes should be included, else only non-prefix line text
      Returns:
      iterator over lines
    • getLinesInfo

      @NotNull public @NotNull Iterable<LineInfo> getLinesInfo(int maxTrailingBlankLines, int startLine, int endLine)
      Description copied from interface: LineAppendable
      Full line iterator with line info

      NOTE: will issue line() to terminate any unterminated lines before iteration

      Specified by:
      getLinesInfo in interface LineAppendable
      Parameters:
      maxTrailingBlankLines - maximum trailing blank lines, -1 if trailing EOL should be removed
      startLine - start line index
      endLine - end line index, exclusive
      Returns:
      iterator over lines