полимер — PHP файл Polybuild

Я использую Polymer 1.0, который мне действительно нравится, но я не могу сделать polybuild инструмент работы с любым сценарием на стороне сервера. Например, с простым примером файла test.php

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="description" content="PHP Test">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>PHP Test</title>

<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&amp;lang=en">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://storage.googleapis.com/code.getmdl.io/1.0.5/material.blue-green.min.css">
<link rel="stylesheet" href="css/my-css.css">


<!-- jQuery -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

<!-- Polymer -->
<script src="components/webcomponentsjs/webcomponents-lite.min.js" async></script>
<link rel="import" href="components/paper-styles/paper-styles.html">
<link rel="import" href="components/neon-animation/neon-animated-pages.html" async>
<link rel="import" href="components/neon-animation/neon-animations.html" async>
</head>
<body class="mdl-demo mdl-color--grey-100 mdl-color-text--grey-700 mdl-base fullbleed">

<?php
echo 'this is PHP';
?>

<!-- JavaScript -->
<script src="https://storage.googleapis.com/code.getmdl.io/1.0.5/material.min.js"></script>
<script src="js/my-javascript.js"></script>
</body>
</html>

Этот файл просто отображает отраженный текст php, как и ожидалось. Я использую команду

polybuild --maximum-crush test.php

и я получаю два файла test.build.html а также test.build.js но это просто удаляет php. Я хотел бы, чтобы php остался, но я не уверен, что это возможно с помощью инструмента polybuild.

3

Решение

Учитывая исходный файл, test.phpи выходной файл из polybuild, test.build.html, вы можете использовать расширение токенизатора анализировать test.php, а затем определить, куда поместить фрагменты php в test.build.html,


Грубый пример

На практике это будет сложно, если не почти невозможно, для сложного импорта в vulcan или сложного вложения php и html в test.php, но для вашего примера сценария этого будет достаточно. Если вы дадите мне образец test.build.htmlЯ позабочусь, чтобы мой код работал идеально для вас. Я должен был проверить надуманную версию.

Вот как это работает. Бежать polybuild --maximum-crush test.php как ты уже есть, тогда беги php polybuild.php test.php test.build.html > test.build.modified.html, Если вы посмотрите на test.build.modified.htmlвы увидите это test.build.html с PHP от test.php волшебно, где это должно быть!

Вот источник для polybuild.php,

<?php
$buildSource = $argv[1];
$buildHtml   = $argv[2];

$polyPhp = new PolyPhp($buildSource, $buildHtml);
echo $polyPhp->run();

class PolyPhp
{
private
$buildSource,
$buildHtml,
$sourceAsLines,
$buildAsLines;

public function __construct($buildSource, $buildHtml)
{
$this->buildSource = $buildSource;
$this->buildHtml   = $buildHtml;

// Load the source file as an array of lines
$this->sourceAsLines = file($buildSource);

// Load the build file as an array of lines
$this->buildAsLines = file($buildHtml);
}

public function run()
{
// Get the tokens from the source php script
$tokens = token_get_all(file_get_contents($this->buildSource));

$matchStart = 0;
$priorHtml  = '';
foreach($tokens as $token) {
if(!is_array($token)) {
continue;
}

// Record HTML snippets
if(token_name($token[0]) == 'T_INLINE_HTML') {
$priorHtml = $token[1];
}

// When we find a php open tag, record the line it occurs on
if(token_name($token[0]) == 'T_OPEN_TAG') {
$matchStart = $token[2];
continue;
}

// When we find a closing php tag, reassemble the php block
// from the buildSource file, then determine where to inject it
// in the buildHtml file and inject it.
if(token_name($token[0]) == 'T_CLOSE_TAG') {
$injectionPoint = $this->findInjectionPoint($priorHtml);
$php            = $this->extractPhp($matchStart - 1, $token[2]);

$this->injectPhp($injectionPoint, $php);
}
}

return implode('', $this->buildAsLines);
}

/**
* Inject PHP from the buildSource file
* into the buildHtml file.
*/
private function injectPhp($injectPoint, $php)
{
$this->buildAsLines = array_merge(
array_slice($this->buildAsLines, 0, $injectPoint),
$php,
array_slice($this->buildAsLines, $injectPoint + 1));
}

/**
* Extract PHP from the buildSource file.
*/
private function extractPhp($startLine, $finishLine)
{
return array_slice($this->sourceAsLines, $startLine, $finishLine - $startLine);
}

/**
* Determine where the injection point in buildHtml is.
*/
private function findInjectionPoint($priorHtml)
{
$lines   = explode("\n", trim($priorHtml));
$lastTag = trim(array_pop($lines));

foreach($this->buildAsLines as $line => $tag) {
$tag = trim($tag);
if($lastTag == $tag) {
return $line + 1;
}
}
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]