En la anterior entrada vimos cómo usar un ligero resaltador de sintaxis: prism.js. Ahora, vamos a ver cómo resaltar php.
El Javascript
Lo primero que tenemos que hacer será pegar este pedacito de código en el script descargado:
/*
* PHP en prism.js: http://emiliocobos.net/php-en-prism-js/
*/
Prism.languages.php = {
'comment': {
pattern: /(^|[^\\])(\/\*[\w\W]*?\*\/|\/\/.*?(\r?\n|$))/g,
lookbehind: true
},
'string': /("|')(.|\n|\r)*?\1/g,
'regex': {
pattern: /("|')(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))\1/g,
lookbehind: true
},
'keyword': /\b(abstract|and|as|break|callable|case|catch|class|clone|const|continue|declare|default|do|echo|else(if)?|(end)?(declare|for(each)?|if|switch|while)|extends|final|function|global|goto|implements|(include|require)(_once)?|instanceof|insteadof|interface|namespace|new|or|print|private|protected|public|return|static|switch|throw|trait|try|use|var|while|xor)\b/g,
// 'function': /\b(array|isset|defined?|die|eval|exit|list|filter_var|date|mail|print(f|_r)|var_dump|preg_(match(_all)?|replace|filter)|(url|json_)(encode|decode))\b/,
'function': /\b(array|isset|defined?|die|eval|exit|list)\b/,
'constant': /\b__(CLASS|DIR|FILE|FUNCTION|LINE|METHOD|NAMESPACE|TRAIT)__\b/g,
'variable': /\$([a-zA-Z_])+\b/g,
'boolean': /\b(true|false)\b/g,
'number': /\b-?(0x)?\d*\.?\d+\b/g,
'operator': /[-+]{1,2}|!|=?<|=?>|={1,2}|(&){1,2}|\|?\||\?|\*|\//g,
'ignore': /&(lt|gt|amp);/gi,
'punctuation': /[{}[\];(),.:]/g
}
if (Prism.languages.markup) {
Prism.languages.insertBefore('markup', 'prolog', {
'php': {
pattern: /(<|<)\?php\b[\w\W]*?\?(>|>)/ig,
inside: {
'prolog': {
pattern: /(<|<)\?php|\?(>|>)/ig,
inside: Prism.languages.markup.prolog.inside
},
rest: Prism.languages.php
}
}
});
}
El CSS
Éste código añade algunas clases al código. Para resaltarlas correctamente podéis usar este CSS:
.token.function {
color: #b9a01c;
}
.token.constant {
color: #e00
}
.php .token.keyword,
.language-php .token.keyword {
color: #a02;
}
.token.variable {
color: #07a;
}
Forma de uso
Hay una consideración muy importante a tener en cuenta: Cuando estamos escribiendo PHP, estamos escribiendo markup
, con PHP dentro. Es decir, no debemos usar la clase language-php
, a no ser que sea simplemente PHP (que no esté entre <?php
y ?>
).
Ejemplos
Con PHP dentro: language-markup
(de mi tema de wordPress)
<div class="post-body" itemprop="description">
<?php
if (has_post_thumbnail()) : ?>
<a href="<?php the_permalink() ?>"><?php
echo str_replace('<img', '<img itemprop="thumbnailUrl"',get_the_post_thumbnail($post->id, 'post-thumbnail', array(
"alt" => get_the_title(),
'class' => 'thumbnail alignleft'
))); // The Thumbnail Size version
?></a><?php
endif;
?>
<?php the_excerpt() ?>
</div><!-- .post-body -->
Sólo php language-php
: Código sacado de StackOverflow
class Bcrypt {
private $rounds;
public function __construct($rounds = 12) {
if(CRYPT_BLOWFISH != 1) {
throw new Exception("bcrypt not supported in this installation. See http://php.net/crypt");
}
$this->rounds = $rounds;
}
public function hash($input) {
$hash = crypt($input, $this->getSalt());
if(strlen($hash) > 13)
return $hash;
return false;
}
public function verify($input, $existingHash) {
$hash = crypt($input, $existingHash);
return $hash === $existingHash;
}
private function getSalt() {
$salt = sprintf('$2a$%02d$', $this->rounds);
$bytes = $this->getRandomBytes(16);
$salt .= $this->encodeBytes($bytes);
return $salt;
}
private $randomState;
private function getRandomBytes($count) {
$bytes = '';
if(function_exists('openssl_random_pseudo_bytes') &&
(strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) { // OpenSSL slow on Win
$bytes = openssl_random_pseudo_bytes($count);
}
if($bytes === '' && is_readable('/dev/urandom') &&
($hRand = @fopen('/dev/urandom', 'rb')) !== FALSE) {
$bytes = fread($hRand, $count);
fclose($hRand);
}
if(strlen($bytes) < $count) {
$bytes = '';
if($this->randomState === null) {
$this->randomState = microtime();
if(function_exists('getmypid')) {
$this->randomState .= getmypid();
}
}
for($i = 0; $i < $count; $i += 16) {
$this->randomState = md5(microtime() . $this->randomState);
if (PHP_VERSION >= '5') {
$bytes .= md5($this->randomState, true);
} else {
$bytes .= pack('H*', md5($this->randomState));
}
}
$bytes = substr($bytes, 0, $count);
}
return $bytes;
}
private function encodeBytes($input) {
// The following is code from the PHP Password Hashing Framework
$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$output = '';
$i = 0;
do {
$c1 = ord($input[$i++]);
$output .= $itoa64[$c1 >> 2];
$c1 = ($c1 & 0x03) << 4;
if ($i >= 16) {
$output .= $itoa64[$c1];
break;
}
$c2 = ord($input[$i++]);
$c1 |= $c2 >> 4;
$output .= $itoa64[$c1];
$c1 = ($c2 & 0x0f) << 2;
$c2 = ord($input[$i++]);
$c1 |= $c2 >> 6;
$output .= $itoa64[$c1];
$output .= $itoa64[$c2 & 0x3f];
} while (1);
return $output;
}
}