Статьи

Кодирование альтернативы Lorem Ipsum

Генераторы Lorem Ipsum хорошо известны и полезны для создания текстовой копии во время разработки сайта. И если вы хотите что-то немного более себе по вкусу, чем псевдо-латынь, SitePoint недавно опубликовал статью Крейга Баклера, в которой представлены десять лучших альтернатив проверенному и проверенному оригиналу.

Хорошо, что у нас есть широкий выбор генераторов текста, но как именно эти генераторы сделаны? Можем ли мы использовать PHP и MySQL для создания своих собственных? Именно об этом мы и поговорим в этой статье. Мы не будем разрабатывать полностью работающий сайт; то, что мы рассмотрим, — это основы для создания сайта, такого как Fillerati .

Поиск и извлечение параграфов

Проект сгруппирован всего в три задачи: поиск текстового содержимого, сохранение его в базе данных и предоставление внешнего доступа к содержимому. Мы рассмотрим каждый из них по очереди, начиная с поиска контента, и с чего лучше начать, чем Project Gutenberg ? Гутенберг предлагает тысячи общедоступных текстов на разных языках, причем абсолютно бесплатно.

К сожалению, форматирование HTML не одинаково во всех публикациях Гутенберга; это не критика проекта, а аспект работы с их HTML, о котором нам нужно знать. Некоторые элементы абзаца вообще не содержат полезного текста — они используются просто как интервал между абзацами. Некоторые абзацы могут быть слишком длинными для предоставления фиктивной копии. Это детали, которые нам нужно кодировать.

Зачем выбирать HTML, а не обычный текст, если форматирование не соответствует? Просто: HTML-версия содержит разметку, которая идентифицирует абзацы, а абзацы — это сердце этого проекта. Это не так просто, как сканирование потока текста для тегов <p></p>

Сбор данных происходит не часто, поэтому мы можем позволить себе роскошь загружать весь файл в память, что облегчает поиск тегов и обработку текста. Я выбрал HTML-копию книги «Происхождение видов » Чарльза Дарвина .

После того, как вы загрузили файл HTML, хорошей идеей будет открыть его в редакторе и просмотреть код, чтобы увидеть, с чем мы столкнулись. Мы можем игнорировать все до того, как заголовок первой главы в строке 426, и пробел, который я упомянул ранее, должен быть удален, чтобы облегчить обработку.

Ниже приведен простой подход для извлечения и очистки текста; это функция, которая вызывается в цикле для сканирования файла и извлечения абзацев. Такой цикл не должен быть сложным.

 <?php
function extractContent($tag, $html) {
    $closeTag = substr($tag, 0, 1) . '/' . substr($tag, 1, 3);
    $startPos = strlen($tag);
    $endPos = strpos($html, $closeTag);
    $text = substr($html, $startPos, $endPos - $startPos);
    return array($closeTag, trim(preg_replace('/(\s){2,}/', ' ', $text)));
}

$html = file_get_contents($htmlFile);
$limits = array('min' => 200, 'max' => 2000);
$tag = '<p>';
$paragraphs = array();

$i = 0;
while (($pos = strpos($html, $tag, $i)) !== false) {
    list($closeTag, $text) = extractContent($tag, substr($html, $pos));
    // keep the content if it's a suitable size
    $len = strlen($text);
    if ($len >= $limits['min'] && $len <= $limits['max']) {
        $paragraphs[] = $text;
    }
    $i = $pos + strlen($tag) + strlen($text) + strlen($closeTag);
}

Можно отсканировать полную книгу на предмет пригодных для использования абзацев с минимальным кодированием. Это включает в себя простую проверку размера абзаца, чтобы исключить все, что является слишком маленьким или слишком большим. Этот тест имеет дополнительное преимущество, заключающееся в удалении тегов, которые используются для пробелов. Чтобы убедиться, что то, что у нас есть, полезно, вы можете отобразить образец в браузере или записать его в файл журнала.

Заполните базу данных

Следующим шагом является сохранение этих абзацев в базе данных. Имейте в виду, что мы создаем базовые элементы системы Lorem Ipsum, поэтому нет необходимости в таком дизайне базы данных:

Lorem Ipsum-альт-01-

Все, что нам действительно нужно, это один стол:

 CREATE TABLE paragraphs (
    id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
    content MEDIUMTEXT NOT NULL,
    PRIMARY KEY (id)
)

В целях эффективности я выбрал тип данных подходящего размера для полей idcontent Для большой полнофункциональной базы данных, в которой хранится много публикаций, вы можете использовать типы данных INTEGERTEXT

Теперь мы можем вставить абзацы, которые мы извлекли из файла HTML, в базу данных.

 <?php
$db = new PDO(DBDSN, DBUSER, DBPASS);

$query = $db->prepare('INSERT INTO paragraphs (content) VALUES (:content)');
$query->bindParam(':content', $content);
foreach ($paragraphs as $content) {
    $query->execute();
}

В зависимости от последовательности сортировки, которую вы выбрали для своей базы данных, вам может потребоваться применить преобразование к строкам абзаца. Это просто использование стороннего источника данных, такого как Гутенберг, — нет гарантии, что текст использует ту же последовательность упорядочения, что и ваша база данных. Проверьте строковые функции и многобайтовые строковые функции , доступные в руководстве по PHP, которые могут понадобиться.

Простой интерфейс

Последний шаг — получить доступ к этим абзацам с помощью внешнего интерфейса в браузере. То, как интерфейс должен предоставлять доступ к данным, ограничено только нашим воображением. Например, мы могли бы получить определенное количество абзацев, или определенное количество текста, или, возможно, количество символов, округленных до ближайшего абзаца. Мы могли бы выбрать последовательные абзацы, или, возможно, мы были бы рады случайным абзацам. Что бы мы ни выбрали, нам нужна функция для чтения таблицы.

 <?php
function selectParagraph($db, $id) {
    $query = sprintf('SELECT content FROM paragraphs WHERE id = %d', $id);
    $result = $pdo->query($sql);
    $row = $result->fetch(PDO::FETCH_ASSOC);
    $result->closeCursor();
    return $row['content'];
}

В демонстрационных целях алгоритм, который я представлю, использует простой генератор случайных чисел для выбора абзацев из базы данных. Ему необходимо знать максимальное значение идентификатора для записей абзаца, следовательно, переменная $maxID

 <form method="post">
 <label for="slider">How many paragraphs do you want?</label>
 <input type="range" min="1" max="4" step="1" name="slider">
 <input type="submit" name="submit" value="Get Excerpt">
</form>
<?php
if (isset($_POST['slider'])) {
    $i = $_POST['slider'];
    while ($i--) {
        $id = rand(1, $maxID);
        $paragraph = selectParagraph($db, $id);
        echo '<p>' . $paragraph . '</p>';
    }
}

И это последний кусок проекта!

Резюме

В этой статье мы рассмотрели основные аспекты создания альтернативы популярному текстовому генератору Lorem Ipsum. Насколько мы сложны, сколько публикаций и авторов мы включаем, как стильно мы делаем интерфейс и ограничиваем ли мы выбор текста конкретным жанром, полностью зависит от личного выбора. Но все основные элементы будут похожи на те, что мы рассмотрели здесь, и все будут построены с использованием небольшого количества PHP и MySQL. Легко!

Код для сопровождения этой статьи можно найти на GitHub. Не стесняйтесь клонировать это расширение на этом.

Изображение через Fotolia