Autor | Zpráva | ||
---|---|---|---|
Davex Profil |
#1 · Zasláno: 20. 2. 2010, 16:04:35
Při vložení příspěvku je rozpoznávačem adres, který domýšlí odkazy, chybně nalezen konec URL ve výpisu kódu [>pre]. V určitých situacích zahrne jako součást URL i uvozovky, znaky < >, a entity před středníkem. Případně i samotnou uzavírací značku [>/pre]. Vznikají pak chyby ve vypsaném kódu, jako středníky za koncem tagu, entity při opakovaném uložení a chybné odkazy.
<html> <meta name="generator" content="PSPad editor, www.pspad.com"> <title> </title> <a href="http://www.jakpsatweb.cz"> www.JakPsatWeb.cz</a> <a href="http://www.jakpsatweb.cz"> w>ww.JakPsatWeb.cz</a> <a href="http://www.jakpsatweb.cz">www.JakPsatWeb.cz</a> <ul> <li><a href="http://www.jakpsatweb.cz"> www.JakPsatWeb.cz</a></li> <li><a href="http://www.jakpsatweb.cz"> www.JakPsatWeb.cz </a></li> </ul> Po druhé úpravě příspěvku: <html> <meta name="generator" content="PSPad editor, www.pspad.com"> <title> </title> text http://www.example.com/ na konci výpisu kódu: http://www.example.com/[/pre] |
||
Chamurappi Profil |
#2 · Zasláno: 22. 2. 2010, 18:59:27
Reaguji na Davexe:
„Vznikají pak chyby ve vypsaném kódu, jako středníky za koncem tagu“ V Exploreru je takový odkaz navíc pocuchán JUSHem, ukazuje třeba toto: <meta name="generator" content="PSPad editor, ' target=_blank rel=nofollow>w>ww.pspad.com">; Ve zdejším JavaScriptu používám na výlov odkazů při Ctrl+K přibližně takovýto regulární výraz: řetězec.match(/(ht>tps?\:\/\/|w>ww\.)(?:["‚„“‘\)\.…,:;]*[^\s"‚„“‘\)\.…,:;]+)+/gi) bb_codes.php , už bych ho tam býval zkusil dát.
Asi bychom také měli zamezit tomu, aby se odkazy utvářely uvnitř [>pre] — tam stejně většinou nejsou míněné jako odkazy. |
||
Davex Profil |
#3 · Zasláno: 22. 2. 2010, 20:39:58
„V Exploreru je takový odkaz navíc pocuchán JUSHem“
Aha, toho jsem si v Chrome nemohl všimnout, ale nová beta Opery 10.50 se v tomto chová podobně jako Explorer. „Asi bychom také měli zamezit tomu, aby se odkazy utvářely uvnitř [>pre]“ O tom jsem už přemýšlel - po zvýraznění JUSHem jsou totiž nepoužitelné. |
||
Časová prodleva: 8 dní
|
|||
Chamurappi Profil |
#4 · Zasláno: 2. 3. 2010, 19:03:57 · Upravil/a: Chamurappi
Reaguji na Davexe:
Tak v sandboxu by měla být závada opravena, popravil jsem funkci urlMaker($text, $wrap) a na její místo povolal tu regulární příšeru. Ještě trochu víc zpříšerněnou. Teď by to mělo chodit dokonale.
„po zvýraznění JUSHem jsou totiž nepoužitelné“ Dodatečně vyhazovat odkazy z <pre> by asi bylo složitější. Možná to není vždy žádoucí, když nad tím tak (líně) přemýšlím. |
||
Chamurappi Profil |
#5 · Zasláno: 4. 3. 2010, 00:59:52 · Upravil/a: Chamurappi
Teď jsem ještě upravil, aby odkazy do diskuse byly relativní, měly speciální třídu a neměly
rel="nofollow" . A také, aby šlo odkázat i na adresy obsahující (obě) hranaté závorky.
K dokonalosti chybí už jen automatické dosazování nadpisů. Potěšilo by mě, kdyby mi v tom někdo našel chybu :-) |
||
Davex Profil |
#6 · Zasláno: 6. 3. 2010, 11:54:37
V ostré verzi (do sandboxu neznám heslo) jsem narazil na problém s domýšlením odkazu uvnitř značky [>url], kde se pohltí ukončovací značka [>/url].
Příklad: Subdoména na locale (localhost/www jako www.localhost)[/url] |
||
Časová prodleva: 4 měsíce
|
|||
Davex Profil |
#7 · Zasláno: 13. 7. 2010, 19:31:06
Zdá se, že řešení [#4] ještě trochu zlobí. V sandboxu se doplnil odkaz po obalení výpisu v tomto příspěvku: Podstrceni souboru pro vsechny URL.
|
||
Str4wberry Profil |
#8 · Zasláno: 13. 7. 2010, 20:08:07
Co navrhuješ? Vyhazovat odkazy z [pre]?
|
||
Chamurappi Profil |
#9 · Zasláno: 13. 7. 2010, 21:21:08
S BB kódy odkazů zřejmě souvisí problém, který se v sandboxu bez jasné příčiny zjevil 27. května a o kterém je zmínka jen na hřišti (a vlastně ještě tady): Pokud příspěvek obsahoval ten nejobvyklejší zápis odkazu, funkce
enCodeBB v mžiku všechno sežrala. Mnou v březnu spatlaná tvorba odkazu vypadala takhle:
// Výchozí text "Odkaz" nahradíme adresou. $bburlkus = "(?:[^<>\[\]\n]+(?:\[[^<>\[\]\n]*\])*)+"; $pattern[] = "/\[>url=(http[s]?:\/\/" . $bburlkus . ")\]Odkaz\[\/url\]/i"; $pattern[] = "/\[>url=(" . $bburlkus . ")\]Odkaz\[\/url\]/i"; $replacement[] = '<a href="\\1" target="_blank" rel="nofollow">\\1</a>'; $replacement[] = '<a href="ht>tp://\\1" target="_blank" rel="nofollow">\\1</a>'; // Standardní odkaz. $pattern[] = "/\[>url=(http[s]?:\/\/" . $bburlkus . ")\](.+?)\[\/url\]/i"; $pattern[] = "/\[>url=(" . $bburlkus . ")\](.+?)\[\/url\]/i"; $replacement[] = '<a href="\\1" target="_blank" rel="nofollow">\\2</a>'; $replacement[] = '<a href="ht>tp://\\1" target="_blank" rel="nofollow">\\2</a>'; // Odkaz vzniklý pouhým obalením. $pattern[] = "/\[>url](http[s]?:\/\/" . $bburlkus . ")\[\/url\]/i"; $pattern[] = "/\[>url](" . $bburlkus . ")\[\/url\]/i"; $replacement[] = '<a href="\\1" target="_blank" rel="nofollow">\\1</a>'; $replacement[] = '<a href="ht>tp://\\1" target="_blank" rel="nofollow">\\1</a>'; // Převod odkazů nezapsaných pomocí BB značky $interpunkce = "[\(\)\.,:;\[\]]"; $urlkus = "(?:(" . $interpunkce . "|<|>|"|&>#039;|&>#92;)*(?:(?!" . $interpunkce . "|<|>|"|&>#039;|&>#92;|&>#8218;|&>#8222;|&>#8220;|&>#8216;|&>#8230;|<)[^\s])+)+"; $pattern[] = "/(^|\s|" . $interpunkce . ")(https?\:\/\/" . $urlkus . ")/i"; $pattern[] = "/(^|\s|" . $interpunkce . ")(www\." . $urlkus . ")/i"; $replacement[] = '\\1<a href="\\2" target="_blank" rel="nofollow">\\2</a>'; $replacement[] = '\\1<a href="ht>tp://\\2" target="_blank" rel="nofollow">\\2</a>'; Dodnes mi není jasné, proč to začlo zlobit. Chápal bych, kdyby to nějak viditelně timeoutovalo (to to umí), chápal bych, kdyby se závada projevila po nějaké úpravě, ale ono se to úplně samo rozhodlo vracet prázdný řetězec. Tuší někdo, čím to mohlo být? Kupodivu pomohlo, když jsem za druhý řádek přidal: $bburlkus = "[^\]]+"; $bburlkus mi nepřipadá nijak zvlášť složitý.
Proč tu o tom ale píšu: 1) Fakt mi to vrtá hlavou. Je to roztomilá záhada. 2) Chtěl bych, aby šlo odkazovat i na adresy, v nichž je [] — tedy vrátit původní $bburlkus .
3) Další případné zásahy to můžou třeba vyvolat znovu… když nevíme, čím to bylo. 4) Nejde mi uložit upravený první příspěvek ve vláknu 1000 (tzn. nová pravidla). Vynadá mi to, že jsem nevyplnil povinná pole. Reaguji na Davexe: „jsem narazil na problém s domýšlením odkazu uvnitř značky [>url]“ Asi by pomohlo sloučit nahrazování z řádků 9 až 12 s nahrazováním na řádcích 23 až 26. Náhrady jsou u nich v podstatě kompatibilní, takže by mělo jít propojit regulární výrazy do jednoho svislítkem, aby si vzájemně nelezli do zelí. Je to dobrý nápad? „V sandboxu se doplnil odkaz po obalení výpisu“ Sice to není řešení, ale v klávesové mapě je „/funkce/Zamezit BB formátování“ — tím lze v označeném textu neviditelně rozbít jakoukoliv sekvenci znaků. |
||
Davex Profil |
#10 · Zasláno: 13. 7. 2010, 22:49:23 · Upravil/a: Davex
[#8] Str4wberry:
Doplňování odkazů všude, nejenom v [pre], by mělo pobrat jen platnou adresu, což http://www.%{HTTP_HOST}... nesplňuje. Asi by se regulární výraz $bburlkus mohl rozdělit na část pro hostname a cestu, s určením zakázaných znaků v jednotlivých částech (aby vyhověla i diakritika). Konkrétní řešení na to teď nemám. [#9] Chamurappi Zdá se, že v sandboxu je už doplňování odkazu uvnitř popisu [url] http://djpw.cz/ opraveno, nebo ne? V náhledu jsou odkazy vložené, ale koncové [/url] se nezobrazí. Aha, takže při editaci dojde k překřížení [url]...<a>...[/url]</a> . Možná by stačilo, nedoplňovat odkazy uvnitř [url].
„S BB kódy odkazů zřejmě souvisí problém, který se v sandboxu bez jasné příčiny zjevil 27. května“ Nedošlo v této době na hostingu k upgrade PHP a PCRE knihovny. Nevím nic konkrétního, ale mohlo by to leccos vysvětlovat. |
||
Str4wberry Profil |
#11 · Zasláno: 14. 7. 2010, 07:47:46
Chamurappi:
„K dokonalosti chybí už jen automatické dosazování nadpisů.“ Žádám o otestování. Témata bez reakcí Pravidla O uživateli Chamurappi Domýšlení odkazu ve výpisu kódu negativně ovlivňuje kód O této diskusi |
||
Str4wberry Profil |
#12 · Zasláno: 14. 7. 2010, 13:43:43
Davex:
„Doplňování odkazů všude, nejenom v [>pre], by mělo pobrat jen platnou adresu“ Ale třeba zrovna to „ http://www.%{HTTP_HOST} “ stejně patří do [>pre] a jsem toho názoru, že interpretace odkazu v [>pre] není dvakrát žádoucí. Tudíž se teď všechny značky kromě <b> a <i> (stejně jaku u JUSHe) odstraní.
„Možná by stačilo, nedoplňovat odkazy uvnitř [>url].“ Ale jak to udělat? Snad jednině tu adresu mezi [u>rl=…] a [/url] (tedy vlastně text odkazu) znehodnotit komentářem.
|
||
Chamurappi Profil |
#13 · Zasláno: 15. 7. 2010, 19:33:11 · Upravil/a: Chamurappi
Reaguji na Davexe:
„Nedošlo v této době na hostingu k upgrade PHP a PCRE knihovny?“ Mrknul jsme na phpinfo() a tam se jako PCRE Library Version ukazuje „7.8 2008-09-05“. Funkce phpversion() vrací „5.2.9“. Náhlý upgrade na víc jak rok staré verze nezní moc pravděpodobně.
Reaguji na Str4wberryho: „Žádám o otestování.“ Dobrá práce. Testoval jsem: 1) Odkazy vedoucí do sandboxu to neumí. 2) Text odkazu na úvodní stránku diskuse se promění v prázdný řetězec. 3) Text odkazu na neexistující stránku se také promění v prázdný řetězec. 4) V textu odkazu je číslo stránky, to je asi zbytečné. Pokud někde ukazuji titulek JavaScriptem, ořezávám číslo stránky a případnou hvězdičku z konce, tzn. beru jen první uzávorkovanou skupinu z /^Diskuse:\s+(.*?)\s*\*?(\s+\(\d+\))?$/ .
5) Výsledný odkaz je absolutní, má rel="nofollow" a nemá class="do-diskuse" .
> „Možná by stačilo, nedoplňovat odkazy uvnitř [>url].“ > Ale jak to udělat? Hledej zelí. Myslel jsem to tak, že když máš jeden regulární výraz /A(B)CD(EFG)H/ nahrazovaný za "x\1y\2z" a druhý regulární výraz /(FG)/ nahrazovaný za "x\1y\1z" , můžeš je smíchat do jednoho regulárního výrazu /A(B)CD(EFG)H|(FG)/ nahrazovaného za x\1\3y\2\3z — pak se obě akce provedou při jednom průchodu a vzájemně si neovlivní své výstupy.
Reaguji na sebe: „Nejde mi uložit upravený první příspěvek ve vláknu 1000 (tzn. nová pravidla). Vynadá mi to, že jsem nevyplnil povinná pole.“ Je to tím, že jsem v něm zmínil zkracovač „jd>em.cz“, který je na černé listině. Nesouvisí to s BB kódy, omlouvám se za planý poplach. |
||
Str4wberry Profil |
#14 · Zasláno: 15. 7. 2010, 20:21:19
Ad 1) Sandbox se úmyslně vynechává, protože se tam stejně skript nedostane přes autorizaci. Takže by se asi měl odkaz odsandboxovat (+ doplnit textem odkazu z ostré verze), jak už někdo dříve navrhoval, co?
|
||
Chamurappi Profil |
#15 · Zasláno: 15. 7. 2010, 20:27:46
Reaguji na Str4wberryho:
Ano, tak to už v podstatě fungovalo, po všech náhradách BB→HTML se provedlo nahrazení: $pattern[] = "/<a href=\"http\:\/\/diskuse\.jakpsatweb\.cz\/(?:\.sandbox\/)?(?:index\.php)?([^\"]+)\" target=\"_blank\" rel=\"nofollow\">/"; $replacement[] = '<a href="./\\1" target="_blank" class="do-diskuse">'; |
||
Str4wberry Profil |
#16 · Zasláno: 15. 7. 2010, 20:58:20
Tak jsem se pokusil o opravu tvých připomínek 1–5. Můžeš hledat další chyby. :–)
|
||
Jan Tvrdík Profil |
#17 · Zasláno: 15. 7. 2010, 23:46:08
Str4wberry:
Nepodporuje to djpw.cz (např. http://djpw.cz/106981). |
||
Str4wberry Profil |
#18 · Zasláno: 16. 7. 2010, 08:12:28
Nevidím důvod proč by mělo.
|
||
Davex Profil |
#19 · Zasláno: 17. 7. 2010, 20:14:38
Odkaz na http://diskuse.jakpsatweb.cz/templates/djpw.js to podporuje až moc: 301 Moved Permanently
|
||
Str4wberry Profil |
#20 · Zasláno: 18. 7. 2010, 12:57:03
To je pravda. Týkalo se to i všech ostatních skriptů, stylů a obrázků. Opraveno.
|
||
Davex Profil |
#21 · Zasláno: 19. 7. 2010, 22:53:55
Doplňování odkazů v sandboxu je aktuálně rozbité, protože se nepřidá úvodní http://.
www.djpw.cz www.pécéspad.cz |
||
Str4wberry Profil |
#22 · Zasláno: 19. 7. 2010, 23:13:30
Zvláštní. Tady to ještě fungovalo a nejsem si vědom, že by od té doby proběhla s tím související úprava. Opraveno.
|
||
Časová prodleva: 8 měsíců
|
|||
Chamurappi Profil |
#23 · Zasláno: 22. 3. 2011, 19:29:37 · Upravil/a: Chamurappi
Upravil jsem automatické dosazování nadpisů, aby při odkazu na podnadpis dosadilo do textu i ten podnadpis. Stačí tedy napsat:
http://diskuse.jakpsatweb.cz/?action=vthread&forum=8&topic=106539#var Časté potíže, zajímavosti a poučné debaty » Používejte var
Pomocí náhledů příspěvků nebo na hřišti mi v tom prosím zkuste najít chybu, připadalo mi to podezřele jednoduché. (Funguje to jen v sandboxu, pochopitelně.) |
||
Časová prodleva: 10 měsíců
|
|||
Chamurappi Profil |
#24 · Zasláno: 5. 1. 2012, 23:16:07
Reaguji na Str4wberryho a Davexe:
> „Možná by stačilo, nedoplňovat odkazy uvnitř [>url].“ > Ale jak to udělat? Udělal jsem to teď takhle: $urlPattern[] = "\[url=(" . $bburlkus . ")\](.+?)\[\/url\]"; $urlPattern[] = "\[url\](" . $bburlkus . ")\[\/url\]"; $urlPattern[] = "(^|\s|" . $interpunkce . ")((?:https?\:\/\/|www\.)" . $urlkus . ")"; $pattern[] = "/" . implode("|", $urlPattern) . "/i"; $replacement[] = '\\4[url=\\1\\3\\5]\\2\\3\\5[/url]'; \1\3\5 bude vždy jen jedna adresa, ve \2\3\5 vždy jen jeden text odkazu. Když se bude zpracovávat [>url=adresa]text[>/url] , bude část chytající se prefixu www spát. Všechny odkazy se tímhle jedním nahrazením srovnají do základního tvaru a na ten se pak pouští callback (který doplňuje protokol apod.).
|
||
Časová prodleva: 12 let
|
0