Я использую 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&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.
Учитывая исходный файл, 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;
}
}
}
}
Других решений пока нет …