WordPress: CodeColorer a PHP 7

Od PHP 7 přestal korektně fungovat plugin CodeColorer, který obarvuje zdrojový kód např. i těchto stránek. Po níže uvedených úpravách by mělo vše opět fungovat.

codecolorer-core.php

Mělo by stačit změnit v souboru codecolorer-core.php tento kód:

  /** Search content for code tags and replace it */
  function BeforeHighlightCodeBlock($content) {
    $content = preg_replace('#(\s*)\[cc([^\s\]_]*(?:_[^\s\]]*)?)([^\]]*)\](.*?)\[/cc\2\](\s*)#sie', '$this->PerformHighlightCodeBlock(\'\\4\', \'\\3\', $content, \'\\2\', \'\\1\', \'\\5\');', $content);
    $content = preg_replace('#(\s*)\<code(.*?)\>(.*?)\</code\>(\s*)#sie', '$this->PerformHighlightCodeBlock(\'\\3\', \'\\2\', $content, \'\', \'\\1\', \'\\4\');', $content);

    return $content;
  }

Na:

  /** Search content for code tags and replace it */
  function BeforeHighlightCodeBlock($content) {
    $content = preg_replace_callback('#(\s*)\[cc([^\s\]_]*(?:_[^\s\]]*)?)([^\]]*)\](.*?)\[/cc\2\](\s*)#si', function($matches){
      return $this->PerformHighlightCodeBlock($matches[4], $matches[3], $matches[2], $matches[1], $matches[5]);
    }, $content);
    $content = preg_replace_callback('#(\s*)\<code(.*?)\>(.*?)\</code\>(\s*)#si', function($matches){
      return $this->PerformHighlightCodeBlock($matches[3], $matches[2], '', $matches[1], $matches[4]);
    }, $content);

    return $content;
  }

Publikováno 17.12.2015 v 01:04 | Kategorie: Wordpress

JavaScript: jak z WWW kopírovat text

Potřebovali jste někdy na svých webových stránkách funkci, kdy přes tlačítko označíte potřebný text a ve stejný moment se i vloží do schránky (clipboardu)? V tomto příspěvku naleznete jednoduchá a funkční řešení.

clipboard.js

Nejelegantnější řešení jsem našel na těchto stránkách. Ukažme si kód pro příklad s kopírováním textu z <textarea></textarea>:

<button class="btn" data-clipboard-action="copy" data-clipboard-target="#text">Označ text a zkopíruj</button>
<textarea id="text">Text pro zkopírování.</textarea>

<script src="js/clipboard.min.js"></script>

<script>
    var clipboard = new Clipboard('.btn');
    clipboard.on('success', function (e) {
        console.log(e);
    });
    clipboard.on('error', function (e) {
        console.log(e);
    });
</script>

Funkční výsledek pak vypadá takto:


Řešení, které používá Flash

Toto jsem viděl na github.com. Je to konkrétně řešení, které používá ZeroClipboard a je pod MIT licencí (co je MIT).

Do stránek vložíme skripty:

<script type="text/javascript" src="http://domena.tld/js/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="http://domena.tld/js/ZeroClipboard.min.js"></script>
<script type="text/javascript" src="http://domena.tld/js/clipboard.js"></script>

Výše dva uvedené skripty lze stáhnout volně z internetu, třetí skript pak z těchto mých stránek, kdy je použit následující kód:

$(document).ready(function() {
    $(".clipboard").each(function() {
        var button = $(this);
        button.attr('data-clipboard-target', button.attr('id')+'_src');
        var clip = new ZeroClipboard(
            button,
            {
                moviePath: "/swf/ZeroClipboard.swf"
            }
        );
    });
});

Pak už jen stačí vložit potřebný kód do stránek:

<button type="button" id="zmena" class="clipboard">Označ text a zkopíruj</button>
<textarea id="zmena_src">
Text pro zkopírování.
</textarea>

A výsledek pak funguje takto:


Označení bez vložení do schránky

Pokud chcete jen označit text bez toho, aby se vložil do schránky, můžeme zvolit jednodušší řešení:

<button onclick="document.getElementById('source_textarea').focus();document.getElementById('source_textarea').select()">
Označ text
</button>
<textarea id="source_textarea">
Text pro označení.
</textarea>

Výsledek pak vypadá takto:


Publikováno 13.12.2015 v 23:05 | Kategorie: JavaScript

Certifikát vystavený autoritou Let’s Encrypt

V případě že chcete využívat zdarma volně dostupný certifikát od certifikační autority Let’s Encrypt na své doméně, kterou hostujete na serveru s operačním systémem Debian, ukáži vám jak na to.

Vygenerování Diffie-Hellman (DH) parametrů

Nejdříve si pomocí openssl vygenerujeme DH parametry (bude to chvíli trvat):

openssl dhparam -out /etc/ssl/private/dhparams_4096.pem 4096

Instalace

Následně provedeme instalaci těmito příkazy:

#aptitude install git
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help

Získání certifikátu

Certifikát pro naší doménu/domény získáme jednoduše přes příkaz:

./letsencrypt-auto --apache --rsa-key-size 4096

Kde si stisknutím mezerníku určíme pro jaké domény budeme chtít certifikát vystavit. V případě že chceme vystavit certifikát pro jednu konkrétní doménu a to jak s www, tak i bez, stačí použít příkaz:

./letsencrypt-auto certonly --standalone --rsa-key-size 4096 -d ambroz.blog

Nastavení virtualhosta

Pak už jen stačí nastavit si virtualhosta tak aby běžel na https a všechny http požadavky přesměrovával. Virtualhost by v tomto směru mohl vypadat např. takto:

<VirtualHost *:80>

ServerName ambroz.blog
ServerAlias *.ambroz.blog
ServerAdmin vaclavambroz@vaclavambroz.cz
DocumentRoot /var/www/html/ambroz.blog
<Directory /var/www/html/ambroz.blog>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
RewriteEngine on
ReWriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]

<IfModule mod_headers.c>
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Xss-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header add Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header set Content-Security-Policy: "script-src 'unsafe-inline' https://vaclavambroz.cz https://ambroz.blog https://cloud.vaclavambroz.cz google.com; report-uri https://vaclavambroz.report-uri.io/r/default/csp/enforce"
</IfModule>

</VirtualHost>

<VirtualHost *:443>

SSLEngine on
SSLCompression off
SSLCipherSuite "HIGH:!aNULL:!MD5:!3DES:!CAMELLIA:!AES128"
SSLHonorCipherOrder on
SSLProtocol TLSv1.2
SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparams_4096.pem"

SSLCertificateFile /etc/letsencrypt/live/ambroz.blog/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ambroz.blog/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/ambroz.blog/fullchain.pem

ServerName ambroz.blog
ServerAlias *.ambroz.blog
ServerAdmin vaclavambroz@vaclavambroz.cz
DocumentRoot /var/www/html/ambroz.blog
<Directory /var/www/html/ambroz.blog>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>

</VirtualHost>

Následně stačí jen restartovat Apache a mělo by vše fungovat.

Možné chyby

Po čase se mi začala zobrazovat chyba:

Updating letsencrypt and virtual environment dependencies…Segmentation fault

Moje řešení jsem popsal zde.

Publikováno 11.12.2015 v 00:01 | Kategorie: Letsencrypt