Diskuze: Machr na PHP - Parser BB kódu

PHP PHP Machr na PHP - Parser BB kódu American English version English version

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Ahoj programátoři, v tomto týdnu si v soutěži o placku a samolepky procvičíme programování na jednoduchém parseru BB kódu. BB kód všichni jistě znáte, je to soubor několika značek, které se používají k formátování textů v diskuzích založených na PhpBB. Vypadá asi takto:

[b]Tučný text[/b]
[img]http://nejakaadresa/nejakyobrazek.png[/img]
:)

Parser by měl ze vstupu výše vygenerovat asi takovýto kód:

<b>Tučný text</b><br />
<img src="http://nejakaadresa/nejakyobrazek.png" alt="" />
<img src="smajlici/usmevavy.png" alt="Úsměv" />

Docela dobrý popis BBkódu je na Wikipedii - http://en.wikipedia.org/wiki/BBCode Nemusíte ho implementovat celý, ale samozřejmě čím více, tím lépe. Na druhou stranu platí jako u všech soutěží, že hezčí kód, který toho umí méně, je hodnocen lépe, než ošklivý kód, který toho umí hodně. Svůj skript demonstrujte na jednoduché ukázce. Soutěž je omezena na jazyk PHP, je však možné získat i alternativní placky, jako např. Machr na OOP, pokud bude program hezky objektově navržený.

Čas si dejme jako vždy do neděle 22.12. do 18:00. Podrobná pravidla soutěží jsou zde: http://www.itnetwork.cz/…outezi-machr

Odpovědět  +1 16.12.2013 11:43
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Zdeněk Bauer
Redaktor
Avatar
Zdeněk Bauer:

Tak jsem se k tomu dokopal :)
Ještě zkusím použít ty funkce pro BBCody které jsou přímo v PHP.
Výsledek: https://www.dropbox.com/…j/bbcode.zip

 
Nahoru Odpovědět  +1 16.12.2013 13:31
Avatar
Milan Gallas
Redaktor
Avatar
Odpovídá na David Čápka
Milan Gallas:

Můžu si vymyslet vlastní značky?
například místo

[style size="15px"]Large Text[/style]

bych psal pouze

[large]Large Text[/large]
 
Nahoru Odpovědět 16.12.2013 18:30
Avatar
Marek Z.
Redaktor
Avatar
Marek Z.:

Hodnotíš i určení tagů? Tedy když dám například:

<b>tučný</b>

za

[b]tučný[/b]

Který je zastaralý a používá se už místo něj 'strong'.

Či jde čistě pouze o ten script?

Editováno 16.12.2013 20:00
Nahoru Odpovědět 16.12.2013 19:59
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Marek Z.
Michal Žůrek (misaz):

hodnotí se určitě jako obvykle všechno.

Nahoru Odpovědět  +1 16.12.2013 20:05
Nesnáším {}, proto se jim vyhýbám.
Avatar
Marek Z.
Redaktor
Avatar
Nahoru Odpovědět 16.12.2013 20:07
Chybami se člověk učí, běžte se učit jinam!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Milan Gallas
David Čápka:

Ne, musí to být podle specifikace.

Nahoru Odpovědět 16.12.2013 20:11
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Milan Gallas
Redaktor
Avatar
Odpovídá na David Čápka
Milan Gallas:

http://www.moreonfew.com/…e-or-bbcode/
platí i tohle?
Protože tato tabulka obsahuje i značku

[large]text[/large]

7 řádek od spodu.

 
Nahoru Odpovědět 16.12.2013 21:41
Avatar
mamiksik
Člen
Avatar
mamiksik:

Tak 1. verze je hotova :) . Doufám že se bude líbit. ;)
odkaz:
http://skola.zskaminky.cz/project/bbidea/

odkaz na stažení:
https://drive.google.com/…X3lQRVk/edit?…

Nahoru Odpovědět  +1 17.12.2013 17:28
“The programmers of tomorrow are the wizards of the future” - Gabe Newell
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na mamiksik
Zdeněk Pavlátka:

Neukazuje se vygenerovaný text...

Nahoru Odpovědět 17.12.2013 17:33
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
mamiksik
Člen
Avatar
Odpovídá na Zdeněk Pavlátka
mamiksik:

dík za reakci :). nevím v čem to vězí na pc(xampp) to funguje. :(

Editováno 17.12.2013 17:36
Nahoru Odpovědět 17.12.2013 17:36
“The programmers of tomorrow are the wizards of the future” - Gabe Newell
Avatar
mamiksik
Člen
Avatar
Odpovídá na Zdeněk Pavlátka
mamiksik:

Mělo by to být opravené. :)

Nahoru Odpovědět 17.12.2013 17:43
“The programmers of tomorrow are the wizards of the future” - Gabe Newell
Avatar
Zdeněk Bauer
Redaktor
Avatar
Zdeněk Bauer:

Musel jsem si upravit <? na <?php a dopsat ti dva řádky kódu

$akce = $_GET['akce'];
$code = $_GET['code'];

a už to funguje :) Pěkný.

 
Nahoru Odpovědět 17.12.2013 17:53
Avatar
Zdeněk Bauer
Redaktor
Avatar
Odpovídá na mamiksik
Zdeněk Bauer:

Sakra, já si nikdy nevzpomenu na to tlačítko odpověděd :(
Pff, jsem to dělal zbytečně složitě, máš ten kód snažší :D

 
Nahoru Odpovědět 17.12.2013 17:56
Avatar
Marek Z.
Redaktor
Avatar
Marek Z.:

Bere se například kladně i když mi to vezme toto?

Text: [i]Lorem [b]ipsum [/i]dolor [/b] aa

Výpis: <i>Lorem <b>ipsum </i>dolor </b> aa

Jde mi o to, že ty tagy se derou přes sebe. Či se spíže bere to, že nějaký tag v tagu se nevezme?

Například:

Text: [b]Lorem [i]ipsum [/i]dolor [/b] aa

Výpis: <b>Lorem [i]ipsum [/i]dolor </b> aa
Nahoru Odpovědět 17.12.2013 18:52
Chybami se člověk učí, běžte se učit jinam!
Avatar
Zdeněk Bauer
Redaktor
Avatar
Odpovídá na Marek Z.
Zdeněk Bauer:

Určitě kladně, přece když budu chtít nějakou část textu kurzívou a mít ji ještě zvýrazněnou tak tam nebudu mít prasečinky jako

[b]Lorem [/b][i]ipsum [/i][b]dolor [/b] aa

//Edit: To nahoře neber vážně, to jsem napsal hovadinu. Ale prostě musí to jít, protože pak bych nemohl mít určitý text kurzívou a ještě zvýrazněnou.

Editováno 17.12.2013 18:57
 
Nahoru Odpovědět  +1 17.12.2013 18:55
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Zdeněk Bauer
Marek Z.:

To je také vlastně pravda, děkuji..

Nahoru Odpovědět 17.12.2013 18:56
Chybami se člověk učí, běžte se učit jinam!
Avatar
mamiksik
Člen
Avatar
Odpovídá na Zdeněk Bauer
mamiksik:

Jo taky jsem to už předělal.(všude jsem dal GET). :)

Nahoru Odpovědět 17.12.2013 19:28
“The programmers of tomorrow are the wizards of the future” - Gabe Newell
Avatar
Marek Z.
Redaktor
Avatar
Marek Z.:

Ahoj, přikládám výtvor za sebe:

http://sifler.php5.cz/bb_php/ - Živá ukázka (zkoušení)
http://leteckaposta.cz/101654123 - Ke stažení

sifler_bb_php_­page.zip - Zazipovaná 'zkoušecí' stránka
sifler_bb_php_­samostatne.zip - Samostatná funkce s příkladem a smajlíky

Převede kódy: b, i, u, s, img, url, size a color.

Kódy typu:

[b=]Tučný text[/b]

by to nemělo pouštět, jedině jsem to tak zpřístupnil u url, jelikož má 2 typy kódů:

[url]http://example.org[/url]
[url=http://example.com]Example[/url]

Pokud bude chybět: 'http:' nebo 'https:', tak to doplní.
Velikost písma je v rozmezí od 1 - 99.

Myslím, že tyto základní kódy pro ukázku stačí, snad.. :)

Nahoru Odpovědět  +1 18.12.2013 18:01
Chybami se člověk učí, běžte se učit jinam!
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Matúš Petrofčík:

dobré ránko, pridávam sa :)

online: http://sklad.petrofcik.eu/parserbb/
zip na stiahnutie: http://sklad.petrofcik.eu/…parserbb.zip
letecka posta: http://leteckaposta.cz/407200308

mali by fungovať všetky možné tagy ktoré su na stránke http://en.wikipedia.org/wiki/BBCode okrem [hviezdička] pre [li], už sa mi fakt nechcelo premýšľať nad riešením

napísané to je neobjektovo, dosť som precvičoval angličtinu na www.php.net, blbuvzdorné to tiež nie je, keď som bol v koncoch premýšľal som nad štýlom, hlavne že funguje :D

Editováno 22.12.2013 9:04
Nahoru Odpovědět  +1 22.12.2013 9:03
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Daniel Vítek:

Tak jsem to stihl :)
Online: http://projekty.danvitek.cz/soutez-bbcode/
Download: http://projekty.danvitek.cz/…bcode/bb.zip

Pozn.: Dělal jsem to podle té Wikipedie, chybí mi tam akorát ten seznam :(

 
Nahoru Odpovědět  +1 22.12.2013 17:52
Avatar
Odpovídá na Daniel Vítek
Michal Žůrek (misaz):

8 minut před deadline = správný programátor - začíná v zásadě pozdě.

Nahoru Odpovědět  +1 22.12.2013 19:22
Nesnáším {}, proto se jim vyhýbám.
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Dospěl jsem k následujícímu hodnocení:

Dan - Jsem rád, že už se orientuješ v objektech. Samotné nahrazení jde napsat elegantněji, viz. zdenda204.

fuulll - Architektura je zajímavá, ale pro toto konkrétní použití mi to přijde spíše kontraproduktivní. Místo toho hrozného switche by stačilo implementovat autoloader.

mamiksik - Jednoduché řešení, které sice funguje, ale k dokonalosti má ještě daleko :)

matusko - str_ireplace můžeš volat přímo s poly v argumentech, ten foreach a pole polí by šlo zapsat jednodušeji. To parsování těžkých kódů je šílenost, to se dělá reguláry. Styly a podobné věci určitě nepatří do souboru s příponou php.

sifler - Postup vypadá dobře, ale kód je opravdu nepřehledný, je to celé nacpané v jedné funkci. Kdybys k tomu přišel za rok, už bys nevěděl proč tam která část je.

zdenda204 - Dle mého soudu nejhezčí řešení a proto také i vítězné. V jednoduchosti je krása, jen ten, kdo umí psát jednoduchý kód, dokáže vyvíjet a udržovat velké aplikace se spoustou funkčnosti. K dokonalosti bys to ještě mohl hodit do objektu.

Placku tedy získává Zdeněk Bauer, prosím o publikaci výtvoru a napiš x adresu. Všem děkuji za účast a těším se příští týden.

Nahoru Odpovědět  +2 22.12.2013 19:28
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
 
Nahoru Odpovědět 22.12.2013 19:36
Avatar
Marek Z.
Redaktor
Avatar
Marek Z.:

V podstatě vyhrál ten co první poslal řešení, ostatní se museli přizpůsobit.. :D

Mě napadlo to samé avšak když jsem už viděl kód od zdendy tak jsem musel vyrukovat s něčím jiným, co už. 8-)

Gratulace zdendovi.. :)

Editováno 22.12.2013 20:09
Nahoru Odpovědět  -1 22.12.2013 20:08
Chybami se člověk učí, běžte se učit jinam!
Avatar
Milan Gallas
Redaktor
Avatar
Odpovídá na David Čápka
Milan Gallas:

autoload jsem použil, ale stejně tam ten switch je:

public function create($param){

  switch ($param) {
  case 'b':
    $this->text = new BoldedText();
      break;
  case 'it':
    $this->text = new ItalicizedText();
      break;
  case 'im':
    $this->text = new ImageText();
      break;
  case 'u':
    $this->text = new UnderlinedText();
      break;
  case 's':
    $this->text = new StrikethroughText();
      break;
  case 'q':
    $this->text = new QuotedText();
      break;
  case 'c':
    $this->text = new ColorText();
      break;
  case 'l':
    $this->text = new LargeText();
      break;
  default:
      throw new InvalidArgumentException("Třída ".$param." neexistuje!");
      break;
  }

  return $this->text;
}
Editováno 22.12.2013 20:15
 
Nahoru Odpovědět 22.12.2013 20:14
Avatar
Milan Gallas
Redaktor
Avatar
Odpovídá na Marek Z.
Milan Gallas:

Právě proto jsem vsadil na OOP a návrhové vzory, ale asi mi to moc nepomohlo :(

 
Nahoru Odpovědět 22.12.2013 20:19
Avatar
Kit
Redaktor
Avatar
Odpovídá na Milan Gallas
Kit:

Ten tvůj switch se přece dá napsat mnohem jednodušeji:

public function create($param){
   switch ($param) {
      case 'b':  return new BoldedText();
      case 'it': return new ItalicizedText();
      case 'im': return new ImageText();
      case 'u':  return new UnderlinedText();
      case 's':  return new StrikethroughText();
      case 'q':  return new QuotedText();
      case 'c':  return new ColorText();
      case 'l':  return new LargeText();
   }
   throw new InvalidArgumentException("Třída ".$param." neexistuje!");
}

a to není poslední slovo. Také můžeš udělat

public function create($param){
   $class = "Text_$param";
   return new $class();
}
Nahoru Odpovědět  +2 22.12.2013 20:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na David Čápka
Matúš Petrofčík:

Gratulujem víťazovi! Zdeněk Bauer :)

David Čápka: Táto súťaž mi dala pomerne dosť. Musel som vymýšľať zdanlivo ťažký algoritmus len pomocou mojich momentálnych znalostí (+trochu php.net), o regulároch sa dozvedám až teraz, taktiež o tom že nepotrebujem foreach pre str_ireplace.
Prečo styly nepatria do php? Chcel som si precvičiť css bez zvýrazňovania syntaxe, a nakonieco som to tak nechal všetko v jednom súbore. Ďakujem za odpoveď. :)

Každopádne sa teším na ďaľšie súťaže a prajem Veselé Vianoce :)

Editováno 22.12.2013 20:47
Nahoru Odpovědět 22.12.2013 20:46
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Milan Gallas
Redaktor
Avatar
Odpovídá na Kit
Milan Gallas:

tvůj druhý příklad nebude fungovat správně a to ze 2 důvodů:

  1. nemáš ošetřenou vyjimku
  2. třída Text_b, nebo Text_u neexistuje

ten první příklad je o něco kratší než ten můj, ale pořád tam ten switch je.

 
Nahoru Odpovědět 22.12.2013 20:47
Avatar
Milan Gallas
Redaktor
Avatar
Odpovídá na Kit
Milan Gallas:

Ale i tak je můj kód o dost kratší. Díky

 
Nahoru Odpovědět 22.12.2013 20:54
Avatar
Kit
Redaktor
Avatar
Odpovídá na Milan Gallas
Kit:

To je mi jasné, že to nebude fungovat, pokud se neudělají návaznosti:

- Ošetření výjimky se dá o vrstvu výš
- Třída BoldedText by se musela přejmenovat na Text_b apod.

Nahoru Odpovědět  +1 22.12.2013 20:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 32 zpráv z 32.