public static function quoteVerse(array $tag, array $rendererStates, XenForo_BbCode_Formatter_Base $formatter) { $option = explode(',', $tag['option']); $xenOptions = XenForo_Application::get('options'); $verse = ''; $version = null; if (count($option) > 1) { $verse = $option[0]; $version = strtoupper($option[1]); } elseif ($option[0]) { if (preg_match('#^[A-z]+$#', $tag['option'])) { $verse = ''; $version = strtoupper($tag['option']); } else { $verse = $tag['option']; $version = strtoupper($xenOptions->th_bible_defaultBible); } } if (!$verse && count($tag['children']) == 1 && is_string($tag['children'][0])) { $bibleId = $version ? strtolower($version) : null; /* @var $verseModel ThemeHouse_Bible_Model_Verse */ $verseModel = XenForo_Model::create('ThemeHouse_Bible_Model_Verse'); $verseText = $verseModel->getVerseFromText($tag['children'][0], $bibleId, true); if ($verseText) { $verse = $tag['children'][0]; $version = strtoupper($bibleId); $tag['children'] = $verseText; } } $link = ''; $params = array('bible_id' => strtolower($version)); if (in_array(strtolower($version), $xenOptions->th_bible_bbCodeBibles)) { if (preg_match('#^(.*)\\s+([0-9\\-:]+)$#', $verse, $matches)) { $urlPortion = strtolower(XenForo_Link::getTitleForUrl($matches[1], true)); $link = XenForo_Link::buildPublicLink('bible/' . $urlPortion . '/' . $matches[2] . '/', null, $params); /* @var $bibleModel ThemeHouse_Bible_Model_Bible */ $bibleModel = XenForo_Model::create('ThemeHouse_Bible_Model_Bible'); $titlePhraseName = $bibleModel->getBibleTitlePhraseName(strtolower($version)); $bibleTitle = new XenForo_Phrase($titlePhraseName); $bibleTitle->setPhraseNameOnInvalid(false); if ((string) $bibleTitle) { $version = $bibleTitle; } } else { $urlPortion = strtolower(XenForo_Link::getTitleForUrl($verse, true)); $link = XenForo_Link::buildPublicLink('bible/' . $urlPortion . '/', null, $params); } } else { $link = ''; } $content = $formatter->renderSubTree($tag['children'], $rendererStates); $view = $formatter->getView(); if ($view) { $template = $view->createTemplateObject('th_bb_code_verse_bible', array('content' => $content, 'verse' => $verse, 'version' => $version, 'link' => $link)); $content = $template->render(); return trim($content); } return $content; }
public static function getTitleForUrl($location) { $location = trim($location); $aPattern = array("a" => "á|à|ạ|ả|ã|ă|ắ|ằ|ặ|ẳ|ẵ|â|ấ|ầ|ậ|ẩ|ẫ|Á|À|Ạ|Ả|Ã|Ă|Ắ|Ằ|Ặ|Ẳ|Ẵ|Â|Ấ|Ầ|Ậ|Ẩ|Ẫ", "o" => "ó|ò|ọ|ỏ|õ|ô|ố|ồ|ộ|ổ|ỗ|ơ|ớ|ờ|ợ|ở|ỡ|Ó|Ò|Ọ|Ỏ|Õ|Ô|Ố|Ồ|Ộ|Ổ|Ỗ|Ơ|Ớ|Ờ|Ợ|Ở|Ỡ", "e" => "é|è|ẹ|ẻ|ẽ|ê|ế|ề|ệ|ể|ễ|É|È|Ẹ|Ẻ|Ẽ|Ê|Ế|Ề|Ệ|Ể|Ễ", "u" => "ú|ù|ụ|ủ|ũ|ư|ứ|ừ|ự|ử|ữ|Ú|Ù|Ụ|Ủ|Ũ|Ư|Ứ|Ừ|Ự|Ử|Ữ", "i" => "í|ì|ị|ỉ|ĩ|Í|Ì|Ị|Ỉ|Ĩ", "y" => "ý|ỳ|ỵ|ỷ|ỹ|Ý|Ỳ|Ỵ|Ỷ|Ỹ", "d" => "đ|Đ"); while (list($key, $value) = each($aPattern)) { $location = preg_replace('/' . $value . '/i', $key, $location); } $location = XenForo_Link::getTitleForUrl($location); return $location; }
public function stepUserFields($start, array $options) { $sDb = $this->_sourceDb; $prefix = $this->_prefix; /* @var $model XenForo_Model_Import */ $model = $this->_importModel; $profileFields = $sDb->fetchAll(' SELECT pf.*, pl.* FROM ' . $prefix . 'profile_fields AS pf INNER JOIN ' . $prefix . 'profile_lang AS pl ON (pf.field_id = pl.field_id AND pl.lang_id = ' . $sDb->quote($this->_defaultLangId) . ') '); $profileFieldOptions = array(); $pfoResult = $sDb->query(' SELECT * FROM ' . $prefix . 'profile_fields_lang WHERE lang_id = ' . $sDb->quote($this->_defaultLangId)); while ($pfo = $pfoResult->fetch()) { $profileFieldOptions[$pfo['field_id']][$pfo['option_id']] = $this->_convertToUtf8($pfo['lang_value'], true); } $existingFields = XenForo_Model::create('XenForo_Model_UserField')->getUserFields(); $userFieldLookups = array(); $total = 0; XenForo_Db::beginTransaction($this->_db); foreach ($profileFields as $profileField) { $title = $this->_convertToUtf8($profileField['lang_name'], true); $description = $this->_convertToUtf8($profileField['lang_explain'], true); $fieldId = $model->getUniqueFieldId(str_replace('-', '_', XenForo_Link::getTitleForUrl($profileField['field_name'], true)), $existingFields, 25); $import = array('field_id' => $fieldId, 'title' => $title, 'description' => $description, 'display_order' => $profileField['field_order'], 'max_length' => $profileField['field_maxlen'], 'viewable_profile' => !$profileField['field_no_view'], 'user_editable' => $profileField['field_show_profile'] ? 'yes' : 'never', 'viewable_message' => isset($profileField['field_show_on_vt']) ? (bool) $profileField['field_show_on_vt'] : 0, 'show_registration' => (bool) $profileField['field_show_on_reg'], 'required' => (bool) $profileField['field_required']); if ($profileField['field_validation'] && $profileField['field_validation'] != '.*') { $import['match_type'] = 'regex'; $import['match_regex'] = '^' . $this->_convertToUtf8($profileField['field_validation']) . '$'; } switch ($profileField['field_type']) { case 1: // numbers $import['field_type'] = 'textbox'; $import['match_type'] = 'number'; break; case 2: // text box $import['field_type'] = 'textbox'; break; case 3: // text area $import['field_type'] = 'textarea'; break; case 4: // boolean // boolean case 5: // drop down $import['field_type'] = $profileField['field_type'] == 4 ? 'radio' : 'select'; if (empty($profileFieldOptions[$profileField['field_id']])) { continue; } $import['field_choices'] = $profileFieldOptions[$profileField['field_id']]; $userFieldLookups[$profileField['field_name']] = $profileFieldOptions[$profileField['field_id']]; break; case 6: // date $import['field_type'] = 'textbox'; break; default: $import['field_type'] = 'textbox'; break; } if ($imported = $model->importUserField($profileField['field_name'], $import)) { $total++; } } XenForo_Db::commit($this->_db); $this->_session->setExtraData('userFieldLookups', $userFieldLookups); $this->_session->incrementStepImportTotal($total); return true; }
protected function _convertUserFieldChoices(array $profileField, array &$fieldChoiceLookups) { try { $choiceData = @unserialize($profileField['data']); } catch (Exception $e) { // this is either corrupted data or an invalid char set. The latter isn't something we can automatically detect return array(); } if (!is_array($choiceData)) { return array(); } $choices = array(); foreach ($choiceData as $key => $choice) { $choice = $this->_convertToUtf8($choice); $choiceId = XenForo_Helper_String::wholeWordTrim($choice, 23, 0, ''); if ($choiceId != '') { $choiceId = str_replace('-', '_', XenForo_Link::getTitleForUrl($choiceId, true)); $i = 1; $choiceIdBase = $choiceId; while (isset($choices[$choiceId])) { $choiceId = $choiceIdBase . '_' . ++$i; } } else { $choiceId = $key; } $choices[$choiceId] = $choice; } $lookUps = array(); switch ($profileField['type']) { case 'checkbox': case 'select_multiple': $multiple = true; $i = 1; foreach ($choices as $key => $value) { $lookUps[$i] = $key; $i = $i * 2; } break; case 'select': case 'radio': default: $multiple = false; foreach ($choices as $key => $value) { $lookUps[$value] = $key; } break; } $fieldChoiceLookups[$profileField['profilefieldid']] = array('multiple' => $multiple, 'choices' => $lookUps); return $choices; }
public function stepUserFields($start, array $options) { $sDb = $this->_sourceDb; $prefix = $this->_prefix; /* @var $model XenForo_Model_Import */ $model = $this->_importModel; $profileFields = $sDb->fetchAll(' SELECT * FROM ' . $prefix . 'profilefields WHERE fid > 3 '); $existingFields = XenForo_Model::create('XenForo_Model_UserField')->getUserFields(); $userFieldLookups = array(); $total = 0; XenForo_Db::beginTransaction($this->_db); foreach ($profileFields as $profileField) { $title = $this->_convertToUtf8($profileField['name'], true); $description = $this->_convertToUtf8($profileField['description'], true); $fieldId = $model->getUniqueFieldId(str_replace('-', '_', XenForo_Link::getTitleForUrl($profileField['name'], true)), $existingFields, 25); $import = array('field_id' => $fieldId, 'title' => $title, 'description' => $description, 'display_order' => $profileField['disporder'], 'max_length' => $profileField['maxlength'], 'viewable_profile' => !$profileField['hidden'], 'user_editable' => $profileField['editable'] ? 'yes' : 'never', 'viewable_message' => 0, 'show_registration' => 0, 'required' => $profileField['required']); $typeParts = preg_split('/\\r?\\n/', $this->_convertToUtf8($profileField['type']), -1, PREG_SPLIT_NO_EMPTY); $type = array_shift($typeParts); $typeParts = array_unique($typeParts); switch ($type) { case 'text': $import['field_type'] = 'textbox'; break; case 'textarea': $import['field_type'] = 'textarea'; break; case 'select': case 'radio': case 'checkbox': case 'multiselect': $import['field_type'] = $type; $import['field_choices'] = $typeParts; $userFieldLookups[$profileField['fid']] = array_flip($typeParts); break; default: $import['field_type'] = 'textbox'; break; } if ($imported = $model->importUserField($profileField['fid'], $import)) { $total++; } } XenForo_Db::commit($this->_db); $this->_session->setExtraData('userFieldLookups', $userFieldLookups); $this->_session->incrementStepImportTotal($total); return true; }
public function execute(array $deferred, array $data, $targetRunTime, &$status) { $data = array_merge(array('position' => 0, 'count' => 0, 'imported' => XenForo_Application::$time), $data); if (empty($data['bible_id'])) { return false; } $db = XenForo_Application::getDb(); /* @var $bibleModel ThemeHouse_Bible_Model_Bible */ $bibleModel = XenForo_Model::create('ThemeHouse_Bible_Model_Bible'); /* @var $bookModel ThemeHouse_Bible_Model_Book */ $bookModel = XenForo_Model::create('ThemeHouse_Bible_Model_Book'); /* @var $verseModel ThemeHouse_Bible_Model_Verse */ $verseModel = XenForo_Model::create('ThemeHouse_Bible_Model_Verse'); $internalDataPath = XenForo_Helper_File::getInternalDataPath(); $path = $internalDataPath . DIRECTORY_SEPARATOR . 'bibles' . DIRECTORY_SEPARATOR . $data['bible_id']; if (!file_exists($path) || !is_dir($path)) { return false; } $mappedFilename = $path . DIRECTORY_SEPARATOR . $data['bible_id'] . '_utf8_mapped_to_NRSVA.txt'; $utf8Filename = $path . DIRECTORY_SEPARATOR . $data['bible_id'] . '_utf8.txt'; $mappingFilename = $path . DIRECTORY_SEPARATOR . $data['bible_id'] . '_mapping_to_NRSVA.txt'; if (file_exists($mappedFilename)) { $handle = fopen($mappedFilename, 'r'); } elseif (file_exists($utf8Filename)) { $handle = fopen($utf8Filename, 'r'); } $bibleInfo = array(); $columns = array(); $fields = array('name', 'copyright', 'abbreviation', 'language', 'note'); if (isset($handle)) { $position = 0; while ($row = fgets($handle)) { $row = explode("\t", rtrim($row, "\r\n")); if (empty($row[0])) { // do nothing } elseif (substr($row[0], 0, 1) != '#') { fseek($handle, $position); break; } elseif (in_array(substr($row[0], 1), $fields)) { if (!empty($row[1])) { $key = substr(array_shift($row), 1); $bibleInfo[$key] = implode(',', $row); } else { $bibleInfo[substr($row[0], 1)] = ''; } } elseif (substr($row[0], 1) == 'columns') { array_shift($row); $columns = $row; } $position = ftell($handle); } } $bibleId = $data['bible_id']; $bible = $bibleModel->getBibleById($bibleId); $bookNamesFilename = $path . '/book_names.txt'; if (!file_exists($bookNamesFilename)) { return false; } $bookIndexes = array(); $bookNamesHandle = fopen($bookNamesFilename, 'r'); while ($row = fgets($bookNamesHandle)) { $row = explode("\t", rtrim($row, "\r\n")); if (empty($row[0])) { continue; } $bookIndexes[$row[0]] = $row[1]; } fclose($bookNamesHandle); $bookNameIds = array(); if ($data['position'] == 0 || $bibleInfo && !$bible) { $bibleDw = XenForo_DataWriter::create('ThemeHouse_Bible_DataWriter_Bible'); if ($bible) { $bibleDw->setExistingData($bible); } else { $bibleDw->set('bible_id', $bibleId); } if (strpos($bibleInfo['name'], ':') !== false) { $title = trim(substr($bibleInfo['name'], strpos($bibleInfo['name'], ':') + 2)); } else { $title = $bibleInfo['name']; } $bibleDw->setExtraData(ThemeHouse_Bible_DataWriter_Bible::DATA_TITLE, $title); $bibleDw->bulkSet($bibleInfo); $bibleDw->save(); $bible = $bibleDw->getMergedData(); if ($bible) { $htmlFilename = $path . DIRECTORY_SEPARATOR . $bibleId . '.html'; if (file_exists($htmlFilename)) { $html = file_get_contents($htmlFilename); preg_match('#<body>(.*)</body>#s', $html, $matches); if (!empty($matches[1])) { $html = $matches[1]; } } else { $html = ''; } $title = $bibleModel->getTemplateTitle(array('bible_id' => $bibleId)); /* @var $templateModel XenForo_Model_Template */ $templateModel = XenForo_Model::create('XenForo_Model_Template'); $template = $templateModel->getTemplateInStyleByTitle($title); if (!$template || $html) { $templateWriter = XenForo_DataWriter::create('XenForo_DataWriter_Template'); if ($template) { $templateWriter->setExistingData($template); } $templateWriter->set('title', $title); $templateWriter->set('template', $html); $templateWriter->set('style_id', 0); $templateWriter->set('addon_id', ''); $templateWriter->save(); } } $bookNamesFilename = $path . '/book_names.txt'; if (file_exists($bookNamesFilename)) { $phraseModel = XenForo_Model::create('XenForo_Model_Phrase'); $bibleBookNameValues = array(); $priorities = array(); foreach ($bookIndexes as $bookIndex => $bookTitle) { $book = $bookModel->getBookByName(strtolower($bookTitle)); if (!$book) { $urlPortion = strtolower(XenForo_Link::getTitleForUrl($bookTitle, true)); $book = $bookModel->getBookByUrlPortion($urlPortion); } else { $urlPortion = $book['url_portion']; } $title = $verseModel->getBookPhraseTitle($urlPortion); $phraseModel->insertOrUpdateMasterPhrase($title, $bookTitle, '', array(), array(XenForo_DataWriter_Phrase::OPTION_REBUILD_LANGUAGE_CACHE => false, XenForo_DataWriter_Phrase::OPTION_RECOMPILE_TEMPLATE => false)); if ($book) { $bookId = $book['book_id']; $priorities[$book['section']] = $book['priority']; } else { $section = substr($bookIndex, -1, 1); if (isset($priorities[$section])) { $priorities[$section] = $priorities[$section] + 10; } else { $priorities[$section] = 10; } $db->query(' UPDATE xf_bible_book SET priority = priority + 10 WHERE priority >= ? AND section = ? ', array($priorities[$section], $section)); $db->query(' INSERT INTO xf_bible_book (url_portion, priority, section) VALUES (?, ?, ?) ', array($urlPortion, $priorities[$section], $section)); $bookId = $db->lastInsertId(); $bibleBookNameValues[] = '(' . $db->quote(strtolower($bookTitle)) . ',' . $db->quote($bookId) . ')'; } $bookNameIds[strtolower($bookTitle)] = $bookId; } if ($bibleBookNameValues) { $db->query(' INSERT INTO xf_bible_book_name (book_name, book_id) VALUES ' . implode(',', $bibleBookNameValues) . ' ON DUPLICATE KEY UPDATE book_name = book_name '); } } } if (!isset($handle) || empty($columns)) { @fclose($handle); $bibleModel->deleteTemporaryFiles($bibleId); return false; } $requiredColumns = array('orig_book_index', 'orig_chapter', 'orig_verse', 'text'); foreach ($requiredColumns as $requiredColumn) { if (!in_array($requiredColumn, $columns)) { fclose($handle); $bibleModel->deleteTemporaryFiles($bibleId); return false; } } $startTime = microtime(true); if (ftell($handle) < $data['position']) { $seek = fseek($handle, $data['position']); $row = explode("\t", rtrim(fgets($handle), "\r\n")); if (feof($handle)) { fclose($handle); $bibleModel->deleteTemporaryFiles($bibleId); return false; } } while ($row = fgets($handle)) { $row = explode("\t", rtrim($row, "\r\n")); if (empty($row[0])) { continue; } $data['position'] = ftell($handle); $verseData = array_combine($columns, $row); $bookName = strtolower($bookIndexes[$verseData['orig_book_index']]); if (!isset($bookNameIds[$bookName])) { $book = $bookModel->getBookByName($bookName); $bookNameIds[$bookName] = $book['book_id']; } $bookId = $bookNameIds[$bookName]; $origChapter = $verseData['orig_chapter']; $origVerse = $verseData['orig_verse']; $text = $verseData['text']; $verse = $verseModel->getSpecificVerse($bibleId, $bookId, $origChapter, $origVerse); // TODO manage subverses here? $verseDw = XenForo_DataWriter::create('ThemeHouse_Bible_DataWriter_Verse'); if ($verse) { $verseDw->setExistingData($verse); } $verseDw->bulkSet(array('bible_id' => $bibleId, 'book_id' => $bookId, 'chapter' => $origChapter, 'verse' => $origVerse, 'text' => $text)); $verseDw->save(); $data['count']++; if ($targetRunTime && microtime(true) - $startTime > $targetRunTime) { break; } } if (feof($handle)) { fclose($handle); $bibleModel->deleteTemporaryFiles($bibleId); $bookModel->rebuildBookCache(); return false; } $actionPhrase = new XenForo_Phrase('importing'); $typePhrase = new XenForo_Phrase('th_bible_verses_bible'); $status = sprintf('%s... %s (%s)', $actionPhrase, $typePhrase, XenForo_Locale::numberFormat($data['count'])); return $data; }