Запрос fb2reader

Инструкции, примеры реализации языка запросов, используемого при создании сайтов на основе AVE.cms.
complex
Участник
Сообщения: 13
Зарегистрирован: 03 апр 2017, 12:39

Запрос fb2reader

Сообщение complex » 07 май 2017, 18:13

Основной шаблон оформления запроса

Код: Выделить всё

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
<style type="text/css">
body,td,th {
   font-family: Arial, sans-serif;
   color: #760A0B;
}
body {
   background-color: #DEE4C4;
   font-family: Arial, "Courier New";
   margin: 20px;
}
book-title {
   font-family: Arial, "Courier New";
   font-size: 48px;
}
title{
   font-family: Arial, "Courier New";
   font-size: 48px;
}
</style>
</head>
<body>[tag:content]
<div class="col-12 col-sm-12 col-lg-12">
[tag:pages]
</div>
</body>
</html>


Шаблон оформления для элементов запроса

Код: Выделить всё

<?php

$fb2_file = '[tag:rfld:files][0]';

$html = '';
$skip = 0;
$limit = 1000000;

$handle = fopen($fb2_file, "r");
if ($handle) {

    $transformer = new Transformer();

    $bodyFound = false;
    $lineNum=0;
    while (($line = fgets($handle)) !== false) {
   
        if (!$bodyFound && strstr($line, "<body")) {
            $bodyFound = true;
            continue;
        }
       
        if ($bodyFound) {
          $lineNum++; 

            if (strstr($line, "</body>")) {
                break;
            }
       
            if ($lineNum < $skip) {
                continue;
            }
         
            if ($lineNum > $skip + $limit) {
                break;
            }         
         
           
            $html .= $transformer->transform($line);

        }
       
    }

            // locate last </p>

    $lastP = strrpos($html, '</p>');
    if ($lastP !== FALSE) {
        $html = substr($html, 0, $lastP + strlen('</p>'));   
    }

    fclose($handle);
} else {
    $html = 'Not found';
}

class Transformer {

    private $stack = array();

private function replace($matches) {
       
        $tag = strtolower($matches[2]);
        $closing = $matches[1];
        $attribute = isset($matches[3]) ? $matches[3] : '';
       
        if ($tag == 'empty-line') {
            return '<br>';
        }

        if ($tag == 'image') {
            if (preg_match('|href="#([^"]+)"|', $attribute, $matches)) {
                return '<img alt="Image" src="binary.php?id=' . urlencode($matches[1]) . '" />';   
            }
        }

        // skips
        $skips = array('section', 'a', 'script');         
        if (in_array($tag, $skips)) {  print_r($matches,1);
            return '';
        }

        // parts
        $parts = array('epigraph', 'annotation', 'cite', 'poem', 'history', 'title', 'subtitle', 'poem', 'stanza');         
        if (in_array($tag, $parts)) {
            if ($closing) {
                $key = array_search($tag, $this->stack);
                if ($key !== FALSE) {
                    unset($this->stack[$key]);
                }
            } else {
                array_unshift($this->stack, $tag);
            }
            return '';
        }

        // paragraphs
        $paragraphs = array('text-author', 'p', 'v');
        if (in_array($tag, $paragraphs)) {
            if ($closing) {
                return '</p>';
            } else {
                $class = trim(implode(' ', $this->stack) . ($tag != 'p' ? ' ' . $tag : '')) ;
                if ($class) {
                    return '<p class="' . trim($class) .'">';
                } else {
                    return '<p>';
                }
            }
        }
       
        // spans
        $spans = array('emphasis', 'strikethrough' , 'sub', 'sup', 'code');
        if (in_array($tag, $spans)) {
            if ($closing) {
                return '</span>';
            } else {
                $class = trim(implode(' ', $this->stack) . ' ' . $tag);
                if ($class) {
                    return '<span class="' . trim($class) . '">';
                } else {
                }   return '</span>';
            }
        }
       

                   
        return '';
    }

public function transform($line) {

    $line = preg_replace_callback('@<(/)?([a-z\-]+)(\s+.*)?/?>@iU', array($this, 'replace') , $line);

    return $line;
}
}

?><!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>BOOK</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
    p.title {
        font-size:25px;
    }
    p.epigraph {
        font-style: italic;
       font-size:20px;
    }
   p.text-author {
        font-style: italic;
       font-size:20px;
    }
</style>
</head>
<body background="images/bg.jpg">
<?php
   
//echo '<pre>' . htmlspecialchars($html) . '</pre>';
echo $html;   
   
?>
</pre>
</body>
</html>


в коде есть подключение внешнего binary.php

Код: Выделить всё

<?php

$fb2_file = '44.fb2';
$id = $_GET['id'];
if (empty($id)) {
    header("HTTP/1.0 404 Not Found");
    die();
}

$handle = fopen($fb2_file, "r");
if ($handle) {

    $binaryFound = false;
    $binaryContent = '';
    while (($line = fgets($handle)) !== false) {
   
        if (!$binaryFound && strstr($line, "<binary") && strstr($line, $id)) {
            $binaryFound = true;
        }
       
        if ($binaryFound) {
            $binaryContent .= $line . "\r\n";
            if (strstr($line, "</binary>")) {
                break;
            }
        }
    }

    fclose($handle);

    if ($binaryFound) {
        if (preg_match('@<binary([^>]*)>([^<]*)</binary>@is', $binaryContent, $matches)) {
           
            $content_type = 'image/jpeg';
            if (preg_match('@content-type="([^"]+)"@i', $matches[1], $matches2)) {
                $content_type = $matches2[1];
            }
           
            $base64 = $matches[2];
            $decoded = base64_decode($base64);
            header('Content-Type: ' . $content_type);
            header('Content-Length: ' . strlen($decoded));
            echo $decoded;
            die();   
        }
    }

    header("HTTP/1.0 404 Not Found");
    die();
}

?>


Подскажите как вместо подключения внешнего файла binary.php, его код встроить в шаблон оформления для элементов запроса и второй вопрос : как вывод результатов запроса разбить на страницы

Вернуться в «Запросы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость