Autor Zpráva
mimochodec
Profil
Někdy je kód rozpoznán jako kód, zafunguje podbarvení, funkce jsou klikací atd. Někdy ne. Co dělám špatně?


Aha, už to tam funguje! Pochopil jsem správně, že to zafunguje, když první použitý string je obalen uvozovkami, nikoliv apostrofy?
Str4wberry
Profil
Aby formátování správně fungovalo, je nutné určit jazyk kódu.

Existuje k tomu nějaká automatická detekce na základě obvyklých rysů kódu a zohledňuje si i kategorie.

Ne vždy to uhádne správně. V takových případech jde jazyk určit ručně – třeba jako [prephp]. Na výběr je php|js|html|css|mysql|sqlite|pgsql|apache|none.

Je nutné dát pozor na to, že explicitní stanovení jazyku může v jistých případech dopadnout hůř, než by dopadla automatická detekce, takže ho skutečně používat až v případech, kdy autodetekce selže.


Pro automatickou detekci se hledají následující výrazy v první znacích kódu:
  //konfigurace zacatku obvyklych jazyku (vrchni maji vetsi prioritu)
  var zacatky = {
    "jush-js":/^\s*(?:var\s+|\$[\(.]|(document|window)\.|function\s+[^\(\s]+\s*\(\s*[a-z]|\/\/js|\/\*js)/i,
    "jush-css":/^\s*(?:\.|#|[\w\d\s]+\{|\/\*css)/i,
    "jush-pgsql":/^\s*(?:-- ?pgsql|#pgsql)/i,
    "jush-sqlite":/^\s*(?:-- ?sqlite|#sqlite)/i,
    "jush-sql":/^\s*(?:-- mysql|#mysql|select|update|insert|delete|alter|where|create|truncate|drop|join)/i,
    "jush-php":/^\s*(\$|echo|\/\/php|#php|mysql_|function\s+[^\(\s]+\s*\(\s*\$)/i,
    "jush-cnf":/^\s*(rewrite|options|alias|redirect|<Directory|<IfModule|php_flag|#.htaccess|#apache)/i,
    "jush-htm":/^\s*(<)/i,
    "":/^\s*(http|ftp)/i
  };
Bubák
Profil
mimochodec:
Nic není dokonalé. Použij jako po PHP kódy, pokud se "nechytne" automatické rozpoznání jazyka kódu, použij na začátku namísto [pre] BB značku [prephp], koncová BB značka stačí [/pre], systém ji opraví-doplní na odpovídající párovou značku.
Další najdeš na stránce Diskuse JPW: DJPW 1.0 (2) v bodě 16, ale koukám, že přibylo barvení i pro další jazyky.

Obarvená ukázka tvého kódu:
if($sel->ulcp != $ulcp){$co .= ", ulcp = '$ulcp'";}
if($sel->ulcp2 != $ulcp2){$co .= ", ulcp2 = '$ulcp2'";}
if($sel->ulcp3 != $ulcp3){$co .= ", ulcp3 = '$ulcp3'";}
..
 
$co = trim ($co, ',');
 
if ($co) {
  $co = "UPDATE $this->address SET ".$co." WHERE id = '$adresa'";
//  provedudotaz;
}
Alphard
Profil
Do klíčových slov pro odhad PHP by se mohlo přidat class (na začátku kódu následované mezerou a písmenem). Už několikrát jsem tam jazyk zadával ručně a myslím, že by to nemělo způsobit žádné kolize.
mimochodec
Profil
Děkuju všem, nevěděl jsem. Trochu mě zmátlo to, že ten můj kód bez prvního řádku byl celozelený, přidání toho řádku ho obarvilo.
Str4wberry
Profil
Reakce na Alpharda:
Mohlo by se přidat, ale nyní prý nemá smysl provádět úpravy ve starém djpw.js, tak by bylo dobré to nezapomenout.
Chamurappi
Profil
Teď jsem si v kódu [#2] všiml…
(vrchni maji vetsi prioritu)
Na to nelze spoléhat, pořadí průchodu členů struktury je nedefinované. Tuším, že Explorer si je srovnává podle abecedy.


Reaguji na Alpharda:
Takže třeba takhle?
    "jush-php":/^\s*(\$|echo|class\s+\w|\/\/php|#php|mysql_|function\s+[^\(\s]+\s*\(\s*\$)/i,
Alphard
Profil
Chamurappi [#7]:
Je to lepší a pro kódy začínající (nějakým bílým znakem) a class to funguje.

Nicméně, zkouším ještě nějak přejít úvodní komentáře, přidat pár klíčových slov a odchytat i ty if/while/for pro php. Využívám toho, že název php proměnné musí začínat písmenem (resp. podtržítkem), na základě toho se chci odlišit od jQuery.

Nyní mám tohle:
"jush-php":/^\s*(((\/\/|#)[^\n]*\n*)|(\/\*((?!\*\/)(.|\n))+\*\/)|\s)*\s*(\$|echo|class\s+\w|\/\/php|#php|mysql_|namespace|use|include|require|function\s+[^\(\s]+\s*\(\s*\$|((if|while|for|switch|foreach)\s*\(\s*\$\w))/i,

Mělo by to zvládnout jak
// Trida Message reprezentuje posilanou zpravu,
# ale sama ji odeslat nemuze, to muze jen instance \Sender
 
/** Message
 * Copyright
 */
class Message {
  private $text;
}
regex101.com/r/xZ9gJ0/8,

tak i kód začínající podmínkami, kvůli kterému toto vlákno vzniklo
if($sel->ulcp != $ulcp){$co .= ", ulcp = '$ulcp'";}
if($sel->ulcp2 != $ulcp2){$co .= ", ulcp2 = '$ulcp2'";}
if($sel->ulcp3 != $ulcp3){$co .= ", ulcp3 = '$ulcp3'";}
regex101.com/r/uZ1nG7/5.

Vidí v tom někdo nějaký problém? Nějaké kolize s jinými jazyky?
Str4wberry
Profil
Vidí v tom někdo nějaký problém? Nějaké kolize s jinými jazyky?

Snad jen, že jsem zapomněl dodat, že ten test se provádí na první 25 znacích kódu (viz funkce pridejJushClass v djpw.js).

Těžko říct, jestli to tam je kvůli řešení problémů s rychlostí určování tříd nebo jen jako prevence. Myslím, že to psal Kajman, tak by to třeba mohl vědět.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: