WordPress – konec problémů s psaním hranaté závorky

Jestli používáte aktuální verze WordPressu a nejste úplní začátečníci, tak jste nejspíš chtěli někdy napsat nějaký shortcode (jestli neznáte, to je něco jako „makro“ připravené nějakým vývojářem tématu či šablony použitelné v rámci textů příspěvků, uvozené nějakým magickým slovem v [hranatých závorkách], více viz Shortcode API).

Jenže WordPress někdy od verze 4.něco používá pro wysiwyg editor aktualizovanou verzi TinyMCE, která obsahuje i fullscreen plugin – vychytávku, která když v editoru zmáčknete Ctrl+Alt+F (nebo pravý alt + F), tak vám jej zvětší na plné okno, aby vás nic nerušilo.

A to je právě ten problém, protože stejná klávesová zkratka je na české, slovenské, polské a bůhvíjakých dalších klávesnicích vyhrazená pro napsání levé hranaté závorky, bez které se ten shortcode nedá moc napsat (vynechám hacky jako přepínání klávesnic či napsání jinde a zkopírování).

Reportoval jsem to jako bug WordPressu, tam mě s tím poslali k … TinyMCE, tak jsem to reportoval i tam, uvidíme, jestli to upraví.

Nicméně neplačte, řešení existuje a je primitivní, stačí jedna pidiaakcička do vašeho functions.php souboru, případně pro ty, pro které je i to příliš složité, jsem z toho připravil i plugin. Tak si vyberte:

Úprava – přidání do functions.php:

// This is all the magic. Simply called on TinyMCE Init and removing CTRL+ALT+F shortcut defined in default TinyMCE package
add_action( 'wp_tiny_mce_init', function () {
?>
<script>
 jQuery( document ).on( 'tinymce-editor-init', function( event, editor ) {
 editor.shortcuts.remove( 'meta+alt+f' );
 }
 );
</script>
<?php
});

Plugin

Plugin je zatím ke stažení zde. Dal jsem jej ke zveřejnění v oficiálním seznamu pluginů, pak to tu aktualizuji.

Licence

Jestli máte neodbytnou potřebu mi poděkovat, ocením, když o této stránce dáte vědět na svém Facebooku, Twitteru, Google plus, blogu či třeba domovní nástěnce. Jo a jestli to tu neznáte – možná se vám bude hodit pár dalších podobně užitečných tipů.

Disclaimer

A samozřejmě – jestli vám můj kód sežere kočku či zapálí dům, tak mi nevolejte.

Jak na uživatelské funkce v Google Sheets (příklad funkce encodeURI)

Už jsem tu psal o vlastních funkcích/vzorcích pro MS Excel, které se od standardních VBA maker (subrutin) liší použitím Function namísto Sub a tím, že návratovou hodnotou je automaticky proměnná uvntiř této funkce, která se jmenuje stejně jako název funkce.

Uživatelské vzorce v Google Sheets se od ostatních funkcí neliší vlastně vůbec v ničem, jsou to prostě normální Google Apps Script (v podstatě Javascript) funkce a návratová hodnota se prostě řeší standardním returnem. Snadno jim lze také vytvořit nápovědu pomocí standardního JSDoc.

Bohužel většina funkcí, které někdo vytvářel a někde zveřejnil není psána správně, typickým problémem je kromě absence nápovědy také to, že nepočítají, že by někdo danou funkci použil na nějaké pole prvků a že by návratovou hodnotou také mohlo být pole prvků.

Vše ukážu na jednoduchém příkladu standardní Javascript funkce encodeURI, když byste ji chtěli použít ve vzroci v Google Sheets. Jděte do Nástroje / Editor skriptů a vložte:

/**
 * Encodes special characters, except: , / ? : @ & = + $ # (Use encodeURIComponent() to encode these characters)
 * http://www.w3schools.com/jsref/jsref_encodeuri.asp
 *
 * @param {string|Array} input The text or range of cells to be encoded.
 * @return Encoded input.
 * @customfunction
 */
function ENCODEURI(input) {
 if (input.map) { // Test whether input is an array.
 return input.map(ENCODEURI); // Recurse over array if so.
 } else {
 return encodeURI(input.toString() );
 }
}
  • Na začátku je JSDoc dokumentace, která se pak objeví v bublině, když budete funkci používat. Prvních 40 znaků je vidět už v přehledu funkcí. Nepovinná, ale velmi doporučuji
  • @param vysvětluje, jaké parametry se očekávají na vstupu. V tomto případě jeden parametr input, který může být buď string a nebo Array. Také je vidět v nápovědě
  • v @return si můžete poznačit, co očekáváte na výstupu, ale nikde to vidět není
  • @customfunction říká Google Sheets, že se jedná o uživatelskou funkci a že ji má nabízet mezi funkcemi.
  • Následuje samotná funkce v Google Apps Script / Javascriptu. Není povinné, aby byla psaná velkými písmeny, jen jsou tak psané všechny build-in funkce, tak je fajn to ctít. Tady ve script editoru jsou funkce case sensitive, v Google Sheets nikoliv, takže tam pak klidně můžete použít =encodeURI(string) jako používáte někde na webu.
  • Pak je zde jednoduchý rekurzivní hack, který využije Javascript funkci map, která zavolá vybranou funkci na každý prvek pole – v tomto případě tedy rekurzivně zavolá sebe sama.
  • A když se o pole nejedná, tak funkce převede hodnotu na string, převede jí přes Javascript funkci encodeURI a vrátí jí zpět do Google Sheets.
  • Pozor, kdybych chtěl pojmenovat funkci malými písmeny, tedy encodeURI, shodně jako je ta Javascript funkce, kterou zde volám, tak místo ní zavolá opět sebe sama a funkce se zacyklí.

Výsledek vidíte na obrázku. Všimněte si, že jsem vzorec napsal opět jen do jedné buňky, a to ve formátu B1:B, takže se propíše na všechny řádky.

vlastni-funkce

Excel+VBA – Ověření EAN

Potřebujete zjistit, jestli EAN je validní 13místný kód – tedy že má daný řetězec 13 číslic, z toho ta poslední je správný kontrolní checksum? Tahle funkce vám to vyřeší (vrací TRUE/FALSE).

Function checkEAN(ean)

Dim s As String
Dim cs As Integer
Dim i As Integer
Dim digit As Integer

If (TypeName(ean) = "Range") Then
 s = ean.Value
ElseIf (TypeName(ean) = "String" Or TypeName(ean) = "Integer") Then
 s = ean
End If
 
If (Len(s) <> 13) Then
checkEAN = False
Return
End If
 

cs = 0 'checksum
 
For i = 1 To 12
 digit = Mid(s, i, 1) - "0" 'get the next digit from bar code text
 If i Mod 2 = 0 Then
 cs = cs + digit * 3 'multiply each bar code digit by it's weight, 1 or 3
 Else
 cs = cs + digit * 1
 End If
Next i
 
cs = (10 - (cs Mod 10)) Mod 10 'which digit must be added to cs to make it divisible by 10

checkEAN = False
checkEAN = (Mid(s, 13, 1) = cs)


End Function

Excel+VBA – vlastní vzorec pro regulární výrazy

Tohle je asi můj nejpoužívanější Excelový hack – vlastní vzorec pro regulární výrazy. Bez toho se některé věci dělají strašně složitě přes funkce jako NAJÍT, DOSADIT či NAHRADIT, a nebo dokonce vůbec nejdou a člověk se musí uchýlit k jiným nástrojům.

Excel přitom regulární výrazy umí, ale jen ve svém VBA. Takže stačí si vytvořit vlastní funkci:

#Const LateBind = True
Function PREG_REPLACE(Pattern As String, Replacement As String, Subject As Range)
 #If Not LateBind Then
 Dim RE As RegExp
 Set RE = New RegExp
 #Else
 Dim RE As Object
 Set RE = CreateObject("vbscript.regexp")
 #End If
 RE.Pattern = Pattern
 RE.Global = True
 PREG_REPLACE = RE.Replace(Subject, Replacement)
End Function

Krátká noticka – konstanta LateBind je opravdu před funkcí a zajišťuje, aby se objekt – knihovna s regulárními výrazy, nevolala vícekrát.

Použití podobné jako třeba v PHP, jen Pattern nemusíte uvozovat. Tj. např. když do A1 napíšete „Josef Novák“ a do B1 potom =PREG_REPLACE(„^(.*)\s(.*)“;“$2 $1″;A1), tak výsledkem bude „Novák Josef“ – tedy poslední slovo jste posunuli na začátek.

Excel+VBA – odlišení buněk s vzorcem

Možná to znáte – máte Excelovou tabulku a potřebujete mít sloupec, kde hodnoty počítáte nějakým vzorcem, ale zároveň je někdy potřebujete přepsat fixní hodnotou.

Jenže pak se třeba změní kurz či něco podobného a vy potřebujete nějak snadno identifikovat buňky s fixní hodnotou – můžete je dát najít (CTRL+G / Special / Constants), ale to je někdy nepohodlné, raději byste takové buňky měli rovnou nějak odlišené.

Nebo máte nějakou sdílenou tabulku a potřebujete přehledně najednou identifikovat, které buňky jsou počítány automaticky a která jsou k ručnímu vyplnění …

Vhodným způsobem, jak naformátovat nějaké buňky automaticky na základě splnění nějaké podmínky je podmíněné formátování (Home / Conditional formating) – zde můžete nadefinovat vzorec a formát buňky, který bude použit v případě, že výsledkem vzorce je kladná odpověd.

Takže se nabízí testovat, zda-li daná buňka obsahuje vzorec, jenže Excel nemá žádnou vestavěnou funkci, která by říkala, jestli je buňka konstanta či vzorec. Proto si takovou funkci musíte nejdříve přidat, a to pomocí skriptovacího jazyka VBA (co je to VBA a jak se s ním dělá je mimo záběr tohoto článku, vysvětlím případně jindy).

Public Function HASFORMULA(ByVal cell As Range) As Boolean
 ' Returns whether the cell contains a formula.
 On Error Resume Next
 HASFORMULA = cell.HASFORMULA
End Function

Tahle krátká uživatelská funkce zajistí, že když pak napíšete třeba do buňky B1 vzorec =HASFORMULA (A1), tak vám vrátí TRUE v případě, že v A1 je vzorec a FALSE když nikoliv. Tenhle vzorec pak můžete použít třeba právě v tom podmíněném formátování.