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

guru.nidi.text.transform.parse.wiki.AbstractWikiParser.scala Maven / Gradle / Ivy

/**
 * Copyright (C) 2013 Stefan Niederhauser ([email protected])
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package guru.nidi.text.transform.parse.wiki


import guru.nidi.text.transform.AttributeValue._
import guru.nidi.text.transform.Segment._
import guru.nidi.text.transform.TransformContext
import guru.nidi.text.transform.parse.{AbstractCharReadingParser, TextAccumulator}


/**
 *
 */
abstract class AbstractWikiParser(context: TransformContext) extends AbstractCharReadingParser(context) {
  val listState = new ListState
  protected val text = new TextAccumulator

  protected def handleSpecialChar()

  override def doParse() {
    while (currentChar != AbstractCharReadingParser.EOI) {
      val resultsBefore = result.size
      handleSpecialChar()
      if (resultsBefore != result.size) {
        addPlainTextAt(resultsBefore)
      }
    }
    addPlainTextAtEnd()
  }

  override protected def reset() {
    super.reset()
    listState.reset()
    text.reset()
  }

  protected def addPlainTextAtEnd() {
    addPlainTextAt(result.size)
  }

  protected def addPlainTextAt(resultPos: Int) {
    if (!text.toString.isEmpty) {
      addToResult(resultPos, plain(text.toString))
      text.reset()
    }
  }

  protected def arrow() {
    currentChar match {
      case '<' => arrowLeft()
      case '=' => arrowRight('=')
      case '-' => arrowRight('-')
      case _ =>
    }
  }

  private def arrowRight(first: Char) {
    if (nextChar() != first) {
      text.append(first)
    } else {
      if (nextChar() != '>') {
        text.append(first)
        text.append(first)
      } else {
        nextChar()
        if (first == '-') {
          addToResult(symbol("-->", ARROW_RIGHT))
        } else {
          addToResult(symbol("==>", DOUBLE_ARROW_RIGHT))
        }
      }
    }
  }

  private def arrowLeft() {
    nextChar() match {
      case '-' =>
        if (nextChar() != '-') {
          text.append("<-")
        } else {
          if (nextChar() == '>') {
            nextChar()
            addToResult(symbol("<-->", ARROW_BOTH))
          } else {
            addToResult(symbol("<--", ARROW_LEFT))
          }
        }
      case '=' =>
        if (nextChar() != '=') {
          text.append("<=")
        } else {
          if (nextChar() == '>') {
            nextChar()
            addToResult(symbol("<==>", DOUBLE_ARROW_BOTH))
          } else {
            addToResult(symbol("<==", DOUBLE_ARROW_LEFT))
          }
        }
      case _ =>
        text.append('<')
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy