/** * This function does the processing of the USFM code, * formatting the document and extracting other useful information. */ private function processUsfm() { // Go through the USFM code. $processedBooksCount = 0; $this->usfmMarkersAndTextPointer = 0; while ($this->unprocessedUsfmCodeAvailable()) { $this->getUsfmNextChapter(); for ($this->chapterUsfmMarkersAndTextPointer = 0; $this->chapterUsfmMarkersAndTextPointer < count($this->chapterUsfmMarkersAndText); $this->chapterUsfmMarkersAndTextPointer++) { $currentItem = $this->chapterUsfmMarkersAndText[$this->chapterUsfmMarkersAndTextPointer]; if (Filter_Usfm::isUsfmMarker($currentItem)) { // Indicator describing the marker. $isOpeningMarker = Filter_Usfm::isOpeningMarker($currentItem); $isEmbeddedMarker = Filter_Usfm::isEmbeddedMarker($currentItem); // Clean up the marker, so we remain with the basic version, e.g. 'id'. $marker = Filter_Usfm::getMarker($currentItem); if (array_key_exists($marker, $this->styles)) { $style = $this->styles[$marker]; switch ($style['type']) { case StyleTypeIdentifier: if ($this->odf_text_standard) { $this->odf_text_standard->closeTextStyle(false, false); } if ($this->odf_text_text_only) { $this->odf_text_text_only->closeTextStyle(false, false); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->closeTextStyle(false, false); } if ($this->odf_text_notes) { $this->odf_text_notes->closeTextStyle(false, false); } if ($this->html_text_standard) { $this->html_text_standard->closeTextStyle(false, false); } if ($this->html_text_linked) { $this->html_text_linked->closeTextStyle(false, false); } switch ($style['subtype']) { case IdentifierSubtypeBook: // Get book number. $s = Filter_Usfm::getBookIdentifier($this->chapterUsfmMarkersAndText, $this->chapterUsfmMarkersAndTextPointer); $s = str_replace(Filter_Character::softHyphen(), "", $s); // Remove possible soft hyphen. $database_books = Database_Books::getInstance(); $this->currentBookIdentifier = $database_books->getIdFromUsfm($s); // Reset chapter and verse numbers. $this->currentChapterNumber = 0; $this->currentVerseNumber = "0"; // Throw away whatever follows the \id, e.g. 'GEN xxx xxx'. Filter_Usfm::getTextFollowingMarker($this->chapterUsfmMarkersAndText, $this->chapterUsfmMarkersAndTextPointer); // Whether to insert a new page before the book. But never before the first book. if ($style['userbool1']) { if ($processedBooksCount) { if ($this->odf_text_standard) { $this->odf_text_standard->newPageBreak(); } if ($this->odf_text_text_only) { $this->odf_text_text_only->newPageBreak(); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->newPageBreak(); } if ($this->html_text_standard) { $this->html_text_standard->newPageBreak(); } if ($this->html_text_linked) { $this->html_text_linked->newPageBreak(); } } } $processedBooksCount++; // Reset notes. $this->resetNoteCitations('book'); // Online Bible. if ($this->onlinebible_text) { $this->onlinebible_text->storeData(); } // eSword. if ($this->esword_text) { $this->esword_text->newBook($this->currentBookIdentifier); } // Done. break; case IdentifierSubtypeEncoding: $this->addToFallout("Text encoding indicator not supported. Encoding is always in UTF8: \\{$marker}", true); break; case IdentifierSubtypeComment: $this->addToInfo("Comment: \\{$marker}", true); break; case IdentifierSubtypeRunningHeader: // This information already went into the Info document during the preprocessing stage. // Remove it from the USFM input stream. Filter_Usfm::getTextFollowingMarker($this->chapterUsfmMarkersAndText, $this->chapterUsfmMarkersAndTextPointer); // Ideally this information should be inserted in the headers of the standard text document. // UserBool2RunningHeaderLeft: // UserBool3RunningHeaderRight: break; case IdentifierSubtypeLongTOC: // This information already went into the Info document. Remove it from the USFM stream. Filter_Usfm::getTextFollowingMarker($this->chapterUsfmMarkersAndText, $this->chapterUsfmMarkersAndTextPointer); break; case IdentifierSubtypeShortTOC: // This information already went into the Info document. Remove it from the USFM stream. Filter_Usfm::getTextFollowingMarker($this->chapterUsfmMarkersAndText, $this->chapterUsfmMarkersAndTextPointer); break; case IdentifierSubtypeBookAbbrev: // This information already went into the Info document. Remove it from the USFM stream. Filter_Usfm::getTextFollowingMarker($this->chapterUsfmMarkersAndText, $this->chapterUsfmMarkersAndTextPointer); break; case IdentifierSubtypeChapterLabel: // This information is already in the object. Remove it from the USFM stream. Filter_Usfm::getTextFollowingMarker($this->chapterUsfmMarkersAndText, $this->chapterUsfmMarkersAndTextPointer); break; case IdentifierSubtypePublishedChapterMarker: // This information is already in the object. Remove it from the USFM stream. Filter_Usfm::getTextFollowingMarker($this->chapterUsfmMarkersAndText, $this->chapterUsfmMarkersAndTextPointer); break; case IdentifierSubtypeCommentWithEndmarker: if ($isOpeningMarker) { $this->addToInfo("Comment: \\{$marker}", true); } break; default: $this->addToFallout("Unknown markup: \\{$marker}", true); break; } break; case StyleTypeNotUsedComment: $this->addToFallout("Unknown markup: \\{$marker}", true); break; case StyleTypeNotUsedRunningHeader: $this->addToFallout("Unknown markup: \\{$marker}", true); break; case StyleTypeStartsParagraph: if ($this->odf_text_standard) { $this->odf_text_standard->closeTextStyle(false, false); } if ($this->odf_text_text_only) { $this->odf_text_text_only->closeTextStyle(false, false); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->closeTextStyle(false, false); } if ($this->odf_text_notes) { $this->odf_text_notes->closeTextStyle(false, false); } if ($this->html_text_standard) { $this->html_text_standard->closeTextStyle(false, false); } if ($this->html_text_linked) { $this->html_text_linked->closeTextStyle(false, false); } switch ($style['subtype']) { case ParagraphSubtypeMainTitle: case ParagraphSubtypeSubTitle: case ParagraphSubtypeSectionHeading: $this->newParagraph($style, true); $this->heading_started = true; $this->text_started = false; break; case ParagraphSubtypeNormalParagraph: default: $this->newParagraph($style, false); $this->heading_started = false; $this->text_started = true; if (is_array($this->verses_text)) { // If a new paragraph starts within an existing verse, // add a space to the text already in that verse. if (isset($this->verses_text[$this->currentVerseNumber])) { $this->verses_text[$this->currentVerseNumber] .= " "; } // Record the position within the text where this new paragraph starts. $contents = implode('', $this->verses_text); $this->paragraph_start_positions[] = mb_strlen($contents); unset($contents); } break; } break; case StyleTypeInlineText: // Support for a normal and an embedded character style. if ($isOpeningMarker) { if ($this->odf_text_standard) { $this->odf_text_standard->openTextStyle($style, false, $isEmbeddedMarker); } if ($this->odf_text_text_only) { $this->odf_text_text_only->openTextStyle($style, false, $isEmbeddedMarker); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->openTextStyle($style, false, $isEmbeddedMarker); } if ($this->html_text_standard) { $this->html_text_standard->openTextStyle($style, false, $isEmbeddedMarker); } if ($this->html_text_linked) { $this->html_text_linked->openTextStyle($style, false, $isEmbeddedMarker); } } else { if ($this->odf_text_standard) { $this->odf_text_standard->closeTextStyle(false, $isEmbeddedMarker); } if ($this->odf_text_text_only) { $this->odf_text_text_only->closeTextStyle(false, $isEmbeddedMarker); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->closeTextStyle(false, $isEmbeddedMarker); } if ($this->html_text_standard) { $this->html_text_standard->closeTextStyle(false, $isEmbeddedMarker); } if ($this->html_text_linked) { $this->html_text_linked->closeTextStyle(false, $isEmbeddedMarker); } } break; case StyleTypeChapterNumber: if ($this->odf_text_standard) { $this->odf_text_standard->closeTextStyle(false, false); } if ($this->odf_text_text_only) { $this->odf_text_text_only->closeTextStyle(false, false); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->closeTextStyle(false, false); } if ($this->odf_text_notes) { $this->odf_text_notes->closeTextStyle(false, false); } if ($this->html_text_standard) { $this->html_text_standard->closeTextStyle(false, false); } if ($this->html_text_linked) { $this->html_text_linked->closeTextStyle(false, false); } if ($this->onlinebible_text) { $this->onlinebible_text->storeData(); } // Get the chapter number. $number = Filter_Usfm::getTextFollowingMarker($this->chapterUsfmMarkersAndText, $this->chapterUsfmMarkersAndTextPointer); $number = Filter_Numeric::integer_in_string($number); // Update this object. $this->currentChapterNumber = $number; $this->currentVerseNumber = "0"; // If there is a published chapter character, the chapter number takes that value. foreach ($this->publishedChapterMarkers as $publishedChapterMarker) { if ($publishedChapterMarker['book'] == $this->currentBookIdentifier) { if ($publishedChapterMarker['chapter'] == $this->currentChapterNumber) { $number = $publishedChapterMarker['value']; } } } // Enter text for the running headers. $database_books = Database_Books::getInstance(); $runningHeader = $database_books->getEnglishFromId($this->currentBookIdentifier); foreach ($this->runningHeaders as $item) { if ($item['book'] == $this->currentBookIdentifier) { $runningHeader = $item['value']; } } $runningHeader = "{$runningHeader} {$number}"; if ($this->odf_text_standard) { $this->odf_text_standard->newHeading1($runningHeader, true); } if ($this->odf_text_text_only) { $this->odf_text_text_only->newHeading1($runningHeader, true); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->newHeading1($runningHeader, true); } if ($this->odf_text_notes) { $this->odf_text_notes->newHeading1($runningHeader, false); } // This is the phase of outputting the chapter number in the text body. // It always outputs the chapter number to the clear text export. if (isset($this->text_text)) { $this->text_text->paragraph($number); } // The chapter number is only output when there is more than one chapter in a book. if ($this->numberOfChaptersPerBook[$this->currentBookIdentifier] > 1) { if ($style['userbool1']) { // Output the chapter number at the first verse, not here. // Store it for later processing. $this->outputChapterTextAtFirstVerse = $number; } else { // Output the chapter in a new paragraph. // If the chapter label \cl is entered once before chapter 1 (\c 1) // it represents the text for "chapter" to be used throughout the current book. // If \cl is used after each individual chapter marker, it represents the particular text // to be used for the display of the current chapter heading // (usually done if numbers are being presented as words, not numerals). $labelEntireBook = ""; $labelCurrentChapter = ""; foreach ($this->chapterLabels as $pchapterLabel) { if ($pchapterLabel['book'] == $this->currentBookIdentifier) { if ($pchapterLabel['chapter'] == 0) { $labelEntireBook = $pchapterLabel['value']; } if ($pchapterLabel['chapter'] == $this->currentChapterNumber) { $labelCurrentChapter = $pchapterLabel['value']; } } } if ($labelEntireBook != "") { $number = "{$labelEntireBook} {$number}"; } if ($labelCurrentChapter != "") { $number = $labelCurrentChapter; } // The chapter number shows in a new paragraph. // Keep it together with the next paragraph. $this->newParagraph($style, true); if ($this->odf_text_standard) { $this->odf_text_standard->addText($number); } if ($this->odf_text_text_only) { $this->odf_text_text_only->addText($number); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->addText($number); } if ($this->html_text_standard) { $this->html_text_standard->addText($number); } if ($this->html_text_linked) { $this->html_text_linked->addText($number); } } } // Output chapter number for other formats. if ($this->esword_text) { $this->esword_text->newChapter($this->currentChapterNumber); } // Open a paragraph for the notes. It takes the style of the footnote content marker, usually 'ft'. // This is done specifically for the version that has the notes only. $this->ensureNoteParagraphStyle($this->standardContentMarkerFootEndNote, $this->styles[$this->standardContentMarkerFootEndNote]); if ($this->odf_text_notes) { $this->odf_text_notes->newParagraph($this->standardContentMarkerFootEndNote); } // UserBool2ChapterInLeftRunningHeader -> no headings implemented yet. // UserBool3ChapterInRightRunningHeader -> no headings implemented yet. // Reset. $this->resetNoteCitations('chapter'); // Done. break; case StyleTypeVerseNumber: if ($this->odf_text_standard) { $this->odf_text_standard->closeTextStyle(false, false); } if ($this->odf_text_text_only) { $this->odf_text_text_only->closeTextStyle(false, false); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->closeTextStyle(false, false); } if ($this->odf_text_notes) { $this->odf_text_notes->closeTextStyle(false, false); } if ($this->html_text_standard) { $this->html_text_standard->closeTextStyle(false, false); } if ($this->html_text_linked) { $this->html_text_linked->closeTextStyle(false, false); } if ($this->onlinebible_text) { $this->onlinebible_text->storeData(); } // Care for the situation that a new verse starts a new paragraph. if ($style['userbool1']) { if ($this->odf_text_standard) { if ($this->odf_text_standard->currentParagraphContent != "") { $this->odf_text_standard->newParagraph($this->odf_text_standard->currentParagraphStyle); } } if ($this->odf_text_text_only) { if ($this->odf_text_text_only->currentParagraphContent != "") { $this->odf_text_text_only->newParagraph($this->odf_text_text_only->currentParagraphStyle); } } if ($this->odf_text_text_and_note_citations) { if ($this->odf_text_text_and_note_citations->currentParagraphContent != "") { $this->odf_text_text_and_note_citations->newParagraph($this->odf_text_text_and_note_citations->currentParagraphStyle); } } if ($this->html_text_standard) { if ($this->html_text_standard->currentParagraphContent != "") { $this->html_text_standard->newParagraph($this->html_text_standard->currentParagraphStyle); } } if ($this->html_text_linked) { if ($this->html_text_linked->currentParagraphContent != "") { $this->html_text_linked->newParagraph($this->html_text_linked->currentParagraphStyle); } } if (isset($this->text_text)) { $this->text_text->paragraph(); } } // Deal with the case of a pending chapter number. if (isset($this->outputChapterTextAtFirstVerse)) { $database_config_bible = Database_Config_Bible::getInstance(); if (!$database_config_bible->getExportChapterDropCapsFrames($this->bible)) { $dropCapsLength = mb_strlen($this->outputChapterTextAtFirstVerse); $this->applyDropCapsToCurrentParagraph($dropCapsLength); if ($this->odf_text_standard) { $this->odf_text_standard->addText($this->outputChapterTextAtFirstVerse); } if ($this->odf_text_text_only) { $this->odf_text_text_only->addText($this->outputChapterTextAtFirstVerse); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->addText($this->outputChapterTextAtFirstVerse); } } else { $this->putChapterNumberInFrame($this->outputChapterTextAtFirstVerse); } if ($this->html_text_standard) { $this->html_text_standard->openTextStyle(array("marker" => "dropcaps"), false, false); } if ($this->html_text_standard) { $this->html_text_standard->addText($this->outputChapterTextAtFirstVerse); } if ($this->html_text_standard) { $this->html_text_standard->closeTextStyle(false, false); } if ($this->html_text_linked) { $this->html_text_linked->openTextStyle(array("marker" => "dropcaps"), false, false); } if ($this->html_text_linked) { $this->html_text_linked->addText($this->outputChapterTextAtFirstVerse); } if ($this->html_text_linked) { $this->html_text_linked->closeTextStyle(false, false); } } // Temporarily retrieve the text that follows the \v verse marker. $textFollowingMarker = Filter_Usfm::getTextFollowingMarker($this->chapterUsfmMarkersAndText, $this->chapterUsfmMarkersAndTextPointer); // Extract the verse number, and store it in the object. $number = Filter_Usfm::peekVerseNumber($textFollowingMarker); $this->currentVerseNumber = $number; // Output the verse number. But only if no chapter number was put here. if (!isset($this->outputChapterTextAtFirstVerse)) { // If the current paragraph has text already, then insert a space. if ($this->odf_text_standard) { if ($this->odf_text_standard->currentParagraphContent != "") { $this->odf_text_standard->addText(" "); } } if ($this->odf_text_text_only) { if ($this->odf_text_text_only->currentParagraphContent != "") { $this->odf_text_text_only->addText(" "); } } if ($this->odf_text_text_and_note_citations) { if ($this->odf_text_text_and_note_citations->currentParagraphContent != "") { $this->odf_text_text_and_note_citations->addText(" "); } } if ($this->html_text_standard) { if ($this->html_text_standard->currentParagraphContent != "") { $this->html_text_standard->addText(" "); } } if ($this->html_text_linked) { if ($this->html_text_linked->currentParagraphContent != "") { $this->html_text_linked->addText(" "); } } if ($this->odf_text_standard) { $this->odf_text_standard->openTextStyle($style, false, false); } if ($this->odf_text_text_only) { $this->odf_text_text_only->openTextStyle($style, false, false); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->openTextStyle($style, false, false); } if ($this->html_text_standard) { $this->html_text_standard->openTextStyle($style, false, false); } if ($this->html_text_linked) { $this->html_text_linked->openTextStyle($style, false, false); } if ($this->odf_text_standard) { $this->odf_text_standard->addText($number); } if ($this->odf_text_text_only) { $this->odf_text_text_only->addText($number); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->addText($number); } if ($this->html_text_standard) { $this->html_text_standard->addText($number); } if ($this->html_text_linked) { $this->html_text_linked->addText($number); } if ($this->odf_text_standard) { $this->odf_text_standard->closeTextStyle(false, false); } if ($this->odf_text_text_only) { $this->odf_text_text_only->closeTextStyle(false, false); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->closeTextStyle(false, false); } if ($this->html_text_standard) { $this->html_text_standard->closeTextStyle(false, false); } if ($this->html_text_linked) { $this->html_text_linked->closeTextStyle(false, false); } } // Clear text output. if (isset($this->text_text)) { if ($this->text_text->line() != "") { $this->text_text->text(" "); } $this->text_text->text($number); // Clear text output always has a space following the verse. // Important for outputting the first verse. $this->text_text->text(" "); } // If there was any text following the \v marker, remove the verse number, // put the remainder back into the object, and update the pointer. if ($textFollowingMarker != "") { @($pos = strpos($textFollowingMarker, $number)); if ($pos !== false) { $textFollowingMarker = substr($textFollowingMarker, $pos + strlen($number)); } // If a chapter number was put, remove any whitespace from the start of the following text. // Remove whitespace from the start of the following text, and replace it with the en-space. // This en-space is a fixed-width space. // This type of space makes the layout of the text following the verse number look tidier. // But if a chapter number was put, than do not put any space at the start of the following verse. $textFollowingMarker = ltrim($textFollowingMarker); if (!isset($this->outputChapterTextAtFirstVerse)) { $textFollowingMarker = Filter_Character::enSpace() . $textFollowingMarker; } $this->chapterUsfmMarkersAndText[$this->chapterUsfmMarkersAndTextPointer] = $textFollowingMarker; $this->chapterUsfmMarkersAndTextPointer--; } // Unset the chapter variable, whether it was used or not. This makes it ready for subsequent use. unset($this->outputChapterTextAtFirstVerse); // Other export formats. if ($this->onlinebible_text) { $this->onlinebible_text->newVerse($this->currentBookIdentifier, $this->currentChapterNumber, $this->currentVerseNumber); } if ($this->esword_text) { $this->esword_text->newVerse($this->currentVerseNumber); } // Done. break; case StyleTypeFootEndNote: $this->processNote(); break; case StyleTypeCrossreference: $this->processNote(); break; case StyleTypePeripheral: if ($this->odf_text_standard) { $this->odf_text_standard->closeTextStyle(false, false); } if ($this->odf_text_text_only) { $this->odf_text_text_only->closeTextStyle(false, false); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->closeTextStyle(false, false); } if ($this->odf_text_notes) { $this->odf_text_notes->closeTextStyle(false, false); } if ($this->html_text_standard) { $this->html_text_standard->closeTextStyle(false, false); } if ($this->html_text_linked) { $this->html_text_linked->closeTextStyle(false, false); } switch ($style['subtype']) { case PeripheralSubtypePublication: case PeripheralSubtypeTableOfContents: case PeripheralSubtypePreface: case PeripheralSubtypeIntroduction: case PeripheralSubtypeGlossary: case PeripheralSubtypeConcordance: case PeripheralSubtypeIndex: case PeripheralSubtypeMapIndex: case PeripheralSubtypeCover: case PeripheralSubtypeSpine: default: $this->addToFallout("Unknown pheripheral marker \\{$marker}", false); break; } break; case StyleTypePicture: if ($this->odf_text_standard) { $this->odf_text_standard->closeTextStyle(false, false); } if ($this->odf_text_text_only) { $this->odf_text_text_only->closeTextStyle(false, false); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->closeTextStyle(false, false); } if ($this->odf_text_notes) { $this->odf_text_notes->closeTextStyle(false, false); } if ($this->html_text_standard) { $this->html_text_standard->closeTextStyle(false, false); } if ($this->html_text_linked) { $this->html_text_linked->closeTextStyle(false, false); } $this->addToFallout("Picture formatting not yet implemented", true); break; case StyleTypePageBreak: if ($this->odf_text_standard) { $this->odf_text_standard->closeTextStyle(false, false); } if ($this->odf_text_text_only) { $this->odf_text_text_only->closeTextStyle(false, false); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->closeTextStyle(false, false); } if ($this->odf_text_notes) { $this->odf_text_notes->closeTextStyle(false, false); } if ($this->html_text_standard) { $this->html_text_standard->closeTextStyle(false, false); } if ($this->html_text_linked) { $this->html_text_linked->closeTextStyle(false, false); } if ($this->odf_text_standard) { $this->odf_text_standard->newPageBreak(); } if ($this->odf_text_text_only) { $this->odf_text_text_only->newPageBreak(); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->newPageBreak(); } if ($this->html_text_standard) { $this->html_text_standard->newPageBreak(); } if ($this->html_text_linked) { $this->html_text_linked->newPageBreak(); } if (isset($this->text_text)) { $this->text_text->paragraph(); } break; case StyleTypeTableElement: if ($this->odf_text_standard) { $this->odf_text_standard->closeTextStyle(false, false); } if ($this->odf_text_text_only) { $this->odf_text_text_only->closeTextStyle(false, false); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->closeTextStyle(false, false); } if ($this->odf_text_notes) { $this->odf_text_notes->closeTextStyle(false, false); } if ($this->html_text_standard) { $this->html_text_standard->closeTextStyle(false, false); } if ($this->html_text_linked) { $this->html_text_linked->closeTextStyle(false, false); } switch ($style['subtype']) { case TableElementSubtypeRow: $this->addToFallout("Table elements not yet implemented", false); break; case TableElementSubtypeHeading: case TableElementSubtypeCell: $this->newParagraph($style, false); break; default: break; } // UserInt1TableColumnNumber: break; case StyleTypeWordlistElement: switch ($style['subtype']) { case WorListElementSubtypeWordlistGlossaryDictionary: if ($isOpeningMarker) { $this->addToWordList($this->wordListGlossaryDictionary); } break; case WorListElementSubtypeHebrewWordlistEntry: if ($isOpeningMarker) { $this->addToWordList($this->hebrewWordList); } break; case WorListElementSubtypeGreekWordlistEntry: if ($isOpeningMarker) { $this->addToWordList($this->greekWordList); } break; case WorListElementSubtypeSubjectIndexEntry: if ($isOpeningMarker) { $this->addToWordList($this->subjectIndex); } break; default: if ($isOpeningMarker) { $this->addToFallout("Unknown word list marker \\{$marker}", false); } break; } // UserString1WordListEntryAddition: break; default: // This marker is not yet implemented. Add to fallout, plus any text that follows. $this->addToFallout("Marker not yet implemented \\{$marker}, possible formatting error:", true); break; } } else { // Here is an unknown marker. Add to fallout, plus any text that follows. $this->addToFallout("Unknown marker \\{$marker}, formatting error:", true); } } else { // Here is no marker. Treat it as text. if ($this->odf_text_standard) { $this->odf_text_standard->addText($currentItem); } if ($this->odf_text_text_only) { $this->odf_text_text_only->addText($currentItem); } if ($this->odf_text_text_and_note_citations) { $this->odf_text_text_and_note_citations->addText($currentItem); } if ($this->html_text_standard) { $this->html_text_standard->addText($currentItem); } if ($this->html_text_linked) { $this->html_text_linked->addText($currentItem); } if ($this->onlinebible_text) { $this->onlinebible_text->addText($currentItem); } if ($this->esword_text) { $this->esword_text->addText($currentItem); } if (isset($this->text_text)) { $this->text_text->text($currentItem); } if (is_array($this->verses_headings) && $this->heading_started) { if (!isset($this->verses_headings[$this->currentVerseNumber])) { $this->verses_headings[$this->currentVerseNumber] = ""; } $this->verses_headings[$this->currentVerseNumber] .= $currentItem; } if (is_array($this->verses_text) && $this->text_started) { if (isset($this->verses_text[$this->currentVerseNumber])) { $this->verses_text[$this->currentVerseNumber] .= $currentItem; } else { // The verse text straight after the \v starts with an enSpace. Remove it. $item = str_replace(Filter_Character::enSpace(), " ", $currentItem); $this->verses_text[$this->currentVerseNumber] = ltrim($item); unset($item); } } } } } }
/** * This filter inserts soft hyphens in $text. * It goes through $text character by character. * At the transition from any character in $firstset * to any character in $secondset, it inserts a soft hyphen. * $firstset: array of characters. * $secondset: array of characters. * $text: A string of text to operate on. * Returns: The hyphenated $text. */ public static function atTransition($firstset, $secondset, $text) { // Verify the input. if (!is_array($firstset)) { return $text; } if (count($firstset) == 0) { return $text; } if (!is_array($secondset)) { return $text; } if (count($secondset) == 0) { return $text; } if (!is_string($text)) { return ""; } // Split the text up into lines and go through each one. $lines = explode("\n", $text); foreach ($lines as &$line) { // Split the line up into an array of UTF8 Unicode characters. $characters = array(); if ($line != "") { preg_match_all('/./u', $line, $characters); $characters = $characters[0]; } // Processor flags. $previousCharacterWasRelevant = false; $thisCharacterIsRelevant = false; $isUsfm = false; // Process each character. foreach ($characters as $key => &$character) { // Skip USFM marker. if ($character == "\\") { $isUsfm = true; } if (!$isUsfm) { // Check whether to insert the soft hyphen here. $thisCharacterIsRelevant = in_array($character, $secondset); if ($thisCharacterIsRelevant && $previousCharacterWasRelevant) { if (!Filter_Hyphenate::nearWhiteSpace($characters, $key)) { $character = Filter_Character::softHyphen() . $character; } } // Flag for next iteration. $previousCharacterWasRelevant = in_array($character, $firstset); } if ($isUsfm) { // Look for the end of the USFM marker. if ($character == " ") { $isUsfm = false; } if ($character == "*") { $isUsfm = false; } } } // Re-assemble the line from the separate (updated) characters. $line = implode("", $characters); } // Assemble the hyphenated text from the separate lines. $text = implode("\n", $lines); return $text; }