bool HtmlBookReader::characterDataHandler(const char *text, std::size_t len, bool convert) {
	if (!myStyleSheetParser.isNull()) {
		myStyleSheetParser->parse(text, len);
		return true;
	}

	if (myIgnoreDataCounter != 0) {
		return true;
	}

	if (myIsPreformatted) {
		preformattedCharacterDataHandler(text, len, convert);
		return true;
	}

	const char *ptr = text;
	const char *end = text + len;
	if (!myIsStarted) {
		for (; ptr != end; ++ptr) {
			if (!isspace((unsigned char)*ptr)) {
				myIsStarted = true;
				break;
			}
		}
	}
	if (myIsStarted) {
		addConvertedDataToBuffer(ptr, end - ptr, convert);
	}
	return true;
}
bool HtmlBookReader::characterDataHandler(const char *text, int len, bool convert) {
  if (myIgnoreDataCounter == 0) {
    const char *start = text;
    const char *end = text + len;
    if (myIsPreformatted) {
      int breakType = myFormat.breakType();
      if (breakType & PlainTextFormat::BREAK_PARAGRAPH_AT_NEW_LINE) {
        for (const char *ptr = text; ptr != end; ++ptr) {
          if (*ptr == '\n') {
            if (start < ptr) {
              addConvertedDataToBuffer(start, ptr - start, convert);
            } else {
              static const std::string SPACE = " ";
              myBookReader.addData(SPACE);
            }
            myBookReader.endParagraph();
            myBookReader.beginParagraph();
            start = ptr + 1;
          }
        }
        addConvertedDataToBuffer(start, end - start, convert);
      } else if (breakType & PlainTextFormat::BREAK_PARAGRAPH_AT_LINE_WITH_INDENT) {
        for (const char *ptr = text; ptr != end; ++ptr) {
          if (isspace(*ptr)) {
            if (*ptr == '\n') {
              mySpaceCounter = 0;
            } else if (mySpaceCounter >= 0) {
              ++mySpaceCounter;
            }
          } else {
            if (mySpaceCounter > myFormat.ignoredIndent()) {
              if (ptr - start > mySpaceCounter) {
                addConvertedDataToBuffer(start, ptr - start - mySpaceCounter, convert);
                myBookReader.endParagraph();
                myBookReader.beginParagraph();
              }
              start = ptr;
            }
            mySpaceCounter = -1;
          }
        }
        mySpaceCounter = std::max(mySpaceCounter, 0);
        if (end - start > mySpaceCounter) {
          addConvertedDataToBuffer(start, end - start - mySpaceCounter, convert);
        }
      } else if (breakType & PlainTextFormat::BREAK_PARAGRAPH_AT_EMPTY_LINE) {
        for (const char *ptr = start; ptr != end; ++ptr) {
          if (isspace(*ptr)) {
            if (*ptr == '\n') {
              ++myBreakCounter;
            }
          } else {
            if (myBreakCounter > 1) {
              addConvertedDataToBuffer(start, ptr - start, convert);
              myBookReader.endParagraph();
              myBookReader.beginParagraph();
              start = ptr;
            }
            myBreakCounter = 0;
          }
        }
        addConvertedDataToBuffer(start, end - start, convert);
      }
    } else {
      if (!myIsStarted) {
        for (; start != end; ++start) {
          if (!isspace(*start)) {
            myIsStarted = true;
            break;
          }
        }
      }
      addConvertedDataToBuffer(start, end - start, convert);
    }
  }
  return true;
}