Třída String
- Honza Marek
- Člen | 1664
Ahoj, napadlo mě, jestli by nemohla být v Nette nějaká krásná třída String. Něco jako:
<?php
class String extends Object {
protected $data;
public function __construct($s = "") {
$this->data = $s;
}
public function __toString() {
return $this->data;
}
public function toLowerCase() {
return new self(strtolower($this->data));
}
public function toUpperCase() {
return new self(strtoupper($this->data));
}
public function startsWith($s) {
return strpos($this->data, $s) === 0;
}
public function endsWith($s) {
return strrpos($this->data, $s) === strlen($this->data) - strlen($s);
}
// ...
}
?>
Pořád mám totiž nutkání někde používat startsWith
a
endsWith
. Takovou třídu si pravda můžu vyrobit sám, ale musím
si vymyslet jiný název, aby to nekolidovalo se statickou třídou
Nette\String. A jakýkoliv jiné jméno už nebude tak pěkné.
- David Grudl
- Nette Core | 8218
Kdysi jsem nad tím uvažoval, ale pak jsem si říkal, že dělat z PHP Ruby nebo JavaScript není nejšťastnější. Totiž obvykle dostaneš řetězec jako parametr funkce či metody. Abys mohl zavolat startsWith nebo endsWith, musíš jej nejprve zapouzdřit do objektu. A abys jej předal jiné funkci, musíš jej zase přetypovat na string (pravda, od PHP 5.2.0 je to díky __toString u mnoha nativních funkcí zautomatizované).
Takže mi z toho vychází, že pro PHP zůstává lepší mít méně elegantní třídu statických funkcí. startsWith a endsWith do ní rád přidám.
- Panda
- Člen | 569
David Grudl napsal(a):
Kdysi jsem nad tím uvažoval, ale pak jsem si říkal, že dělat z PHP Ruby nebo JavaScript není nejšťastnější. Totiž obvykle dostaneš řetězec jako parametr funkce či metody. Abys mohl zavolat startsWith nebo endsWith, musíš jej nejprve zapouzdřit do objektu. A abys jej předal jiné funkci, musíš jej zase přetypovat na string (pravda, od PHP 5.2.0 je to díky __toString u mnoha nativních funkcí zautomatizované).
Takže mi z toho vychází, že pro PHP zůstává lepší mít méně elegantní třídu statických funkcí. startsWith a endsWith do ní rád přidám.
Když už se bude přidávat do Stringu, nešlo by tam přihodit i funkce
jako autoUTF
, ekvivalent Texy::webalize
a
podobně?
- Honza Marek
- Člen | 1664
Takové webalize by bylo fajn. Nemůžu se ubránit dojmu, že to spíš patří do někam do Nette než do Texy.
- David Grudl
- Nette Core | 8218
Panda napsal(a):
Když už se bude přidávat do Stringu, nešlo by tam přihodit i funkce jako
autoUTF
, ekvivalentTexy::webalize
a podobně?
Webalize určitě ano, ale autoUTF je určeno jen pro české a slovenské kódování, takže ne.
- Honza Marek
- Člen | 1664
Napadla mě další šikovná metoda.
String::formatFileSize($size)
pro lidské zformátování počtu
bajtů do nějakého ###,## kB.
- ViliamKopecky
- Nette hipster | 230
Mas3r napsal(a):
Mě zase napadlo zkrácení textu na určitý počet znaků + … na konci
…se zaokrouhlováním na celá slova ;)
Asi přijdou na řadu vlastní prototypové knihovny.
- David Grudl
- Nette Core | 8218
obojí přidám. navrhuji tuto implementaci:
/**
* Truncates string to maximal length.
* @param string
* @param int
* @param string
* @return string
*/
public static function truncate($s, $maxLen, $append = "\xE2\x80\xA6")
{
if (iconv_strlen($s) > $maxLen) {
$maxLen = $maxLen - iconv_strlen($append);
if ($maxLen < 1) {
return $append;
} elseif (preg_match('#^.{1,'.$maxLen.'}(?=[\s\x00-@])#u', $s, $matches)) {
return $matches[0] . $append;
} else {
return iconv_substr($s, 0, $maxLen) . $append;
}
}
return $s;
}
/**
* Converts to human readable file size.
* @param int
* @return string
*/
public static function bytes($bytes)
{
$bytes = (int) $bytes;
$units = array('B', 'kB', 'MB', 'GB', 'TB', 'PB');
foreach ($units as $unit) {
if (abs($bytes) < 1024) break;
$bytes = $bytes / 1024;
}
return round($bytes, 2) . ' ' . $unit;
}
Truncate generuje tento výstup
Length -1: '…'
Length 0: '…'
Length 1: '…'
Length 2: 'Ř…'
Length 3: 'Ře…'
Length 4: 'Řek…'
Length 5: 'Řekn…'
Length 6: 'Řekně…'
Length 7: 'Řeknět…'
Length 8: 'Řekněte…'
Length 9: 'Řekněte,…'
Length 10: 'Řekněte,…'
Length 11: 'Řekněte,…'
Length 12: 'Řekněte,…'
Length 13: 'Řekněte, jak…'
Length 14: 'Řekněte, jak…'
Length 15: 'Řekněte, jak…'
Length 16: 'Řekněte, jak se…'
Length 17: 'Řekněte, jak se…'
Length 18: 'Řekněte, jak se…'
Length 19: 'Řekněte, jak se…'
Length 20: 'Řekněte, jak se…'
Length 21: 'Řekněte, jak se máte?'
Length 22: 'Řekněte, jak se máte?'
bytes generuje:
0 B
10 B
1.25 GB
...
- Honza Marek
- Člen | 1664
Funkci bytes bych přidal nepovinný parametr, ve kterém by se nastavila desetinná čárka.
- Honza Marek
- Člen | 1664
Nechceš někam do dokumentace založit stránku Nette\String? Zpracoval bych krátký přehled.
- David Grudl
- Nette Core | 8218
Říkám si, že funkce bytes
by asi ve třídě String být
neměla. Nejspíš vytvořím jinou třídu, třeba Nette\Locale
,
pro funkce jako bytes(), money(), plural(), timeAgoInWords() atd.
- edke
- Člen | 198
Dalsi napad pre triedu String
Je to strip a pouzivali sme to doteraz v Smarty. Velmi uzitocna vec, urcite to poznas, odstrani z bloku whitespaces. Napriklad pri zoznamoch IE nema rad whitespaces.
sablona default.phtml
:
{block |strip}
<ul>
<li>ad 1)</li>
<li>ad 2)</li>
<li>ad 3)</li>
<li>ad 4)</li>
</ul>
{/block}
vysledny html kod:
<ul><li>ad1)</li><li>ad2)</li><li>ad3)</li><li>ad4)</li></ul>
a samotny patch, Template.php
:
/** @var array */
private $helpers = array(
'escape' => 'TemplateHelpers::escape',
'translate' => 'TemplateHelpers::nop',
'lower' => 'TemplateHelpers::lower',
'upper' => 'TemplateHelpers::upper',
'capitalize' => 'TemplateHelpers::capitalize',
'nl2br' => 'nl2br',
'truncate' => 'String::truncate',
'bytes' => 'String::bytes',
'strip' => 'String::strip',
);
String.php
:
/**
* Strips whitespaces.
* @param string
* @return string
*/
public static function strip($text)
{
return preg_replace('!\s+!', '', $text);
}
- hrach
- Člen | 1838
edke napsal(a):
vysledny html kod:<ul><li>ad1)</li><li>ad2)</li><li>ad3)</li><li>ad4)</li></ul>
A není to náhodou NEpožadovaný výsledek??? Přeci nechci odstaňovat mezere (WS) v normálním zobrazitelném textu…
Výsledek by měl asi vypadat spíš
<ul><li>ad 1)</li><li>ad 2)</li><li>ad 3)</li><li>ad 4)</li></ul>
Editoval hrach (11. 10. 2008 9:49)
- David Grudl
- Nette Core | 8218
Jsem velmi opatrný s přidáváním nových funkcí a můj rozhled je také omezený, takže mi zkuste vysvětlit, k čemu by helpery strip a webalize byly užitečné.
(nevím o problému s IE a whitespaces; nebylo by kdyžtak lepší použít něco-jako-strip jako filtr na celou stránku?)
- edke
- Člen | 198
hrach wrote:
edke napsal(a):
vysledny html kod:<ul><li>ad1)</li><li>ad2)</li><li>ad3)</li><li>ad4)</li></ul>
A není to náhodou NEpožadovaný výsledek??? Přeci nechci odstaňovat mezere (WS) v normálním zobrazitelném textu…
Výsledek by měl asi vypadat spíš
<ul><li>ad 1)</li><li>ad 2)</li><li>ad 3)</li><li>ad 4)</li></ul>
Ejha, tak to som si fandil :)) Ospravedlnujem sa, tu je opravena funkcia strip, ktora by mala fungovat uz o dost lepsie, berie do uvahy aj EOL Mac-ov, *nix aj windows.
/**
* Strips whitespaces.
* @param string
* @return string
*/
public static function strip($text)
{
$lines= split("\n\r|\r|\n", $text);
foreach( $lines as $line => $content ){
$lines[$line]= trim( $lines[$line]);
}
$lines= array_diff( $lines, array( '' ) );
return implode( '', $lines );
}
alebo takto:
/**
* Strips whitespaces.
* @param string
* @return string
*/
public static function strip($text)
{
$result= null;
$lines= split("\n\r|\r|\n", $text);
foreach( $lines as $content ){
$content= trim( $content);
if ( !empty($content) ) {
$result .= $content;
}
}
return $result;
}
Trosku som to testoval, druha alternativa je asi o 6% rychlejsia. No ale s textom David pracuje nonstop, ak sa rozhodne to implementovat, asi napise lepsiu funkciu.
- edke
- Člen | 198
David Grudl wrote:
Jsem velmi opatrný s přidáváním nových funkcí a můj rozhled je také omezený, takže mi zkuste vysvětlit, k čemu by helpery strip a webalize byly užitečné.
(nevím o problému s IE a whitespaces; nebylo by kdyžtak lepší použít něco-jako-strip jako filtr na celou stránku?)
ad) strip:
link1, predposledny prispevok od usera
WebJoel.
- David Grudl
- Nette Core | 8218
Možná by to šlo udělat takto:
public static function strip($text)
{
return preg_replace('#\s{2,}#', ' ', $text);
}
- edke
- Člen | 198
David Grudl wrote:
Možná by to šlo udělat takto:
public static function strip($text) { return preg_replace('#\s{2,}#', ' ', $text); }
Len v tomto pripade stale ostavaju medzery medzi tagmi:
<ul> <li>ad 1)</li> <li>ad 2)</li> <li>ad 3)</li> <li>ad 4)</li> </ul>
Tie listy sa kvoli IE zvyknu prepisovat do takejto formy, kde sa uplne whitespaces medzi tagmi eliminuju a zaroven to ostava citatelne:
<ul><!--
--><li>ad 1)</li><!--
--><li>ad 2)</li><!--
--><li>ad 3)</li><!--
--><li>ad 4)</li><!--
--></ul>
Alebo potom sablona je napisana klasicky:
<ul>
<li>ad 1)</li>
<li>ad 2)</li>
<li>ad 3)</li>
<li>ad 4)</li>
</ul>
a len sa necha prebehnut cez filter, ktory potom vygeneruje toto:
<ul><li>ad 1)</li><li>ad 2)</li><li>ad 3)</li><li>ad 4)</li></ul>
- David Grudl
- Nette Core | 8218
Není lepší CSS bug řešit opět v CSS, třeba tím nabídnutým kódem?
a {display: inline-block;}
a {display: block;}
- carnaby
- Člen | 7
Myslim ze by bolo fajn zladit funkciu String::bytes vlastne TemplateHelpers::bytes so standardom
- Jan Tvrdík
- Nette guru | 2595
Osobně jsem pro, ale hlavní problém je v tom, že i spousta lidí v oblasti IT neví nic o existenci něčeho jako KiB, natož takový BFU.
- Tomik
- Nette Evangelist | 485
Osobně jsem proti. Přijde mi docela úsměvné, že po poměrně dlouhé době, kdy se používají určitá pravidla zavede jistá společnost naprosto jiný standard až v roce 1998, tedy po více než několika letech používání jiného zavedeného postupu. Toť můj názor, uplatnění této normy IMHO nemá smysl – co vám vrátí OS, když si necháte zobrazit velikost filmu, že má několik GB nebo několik GiB? :)
- Jan Tvrdík
- Nette guru | 2595
Hlavní důvod, proč považuji zapis GiB lepší než GB je ten, že zápis pomocí GiB je jednoznačný, zatímco pomocí GB není. Pokud si myslíte, všichni chápou pod 1 GB 1024 MB, tak se mýlíte. Např. u DVD neznamená 4,7 GB (4,7 × 1024) MB, ale (4,7 × 1000) MB. Proto spousta lidí nachápe, proč na DVD vejde ve skutečnosti „pouze“ 4,38 GiB. Jako další příklad chápání 1 GB jako 1000 MB je http://rapidshare.com.
- pmg
- Člen | 372
Naprosto souhlasím, školství je v hrozném stavu.
Se jmennými prostory jsem se nikdy dříve nesetkal, ale začnu je používat, abych předešel kolizím názvů. S těmito jednotkami jsem se nikdy dříve nesetkal, ale začnu je používat, abych předešel kolizím názvů.
Argument setkal / nesetkal bych uvažoval, pokud by nebylo snadné se dovtípit, že KiB odpovídá starému KB. Myslím, že toto ale není ten případ. Navíc musím říct, že už jsem se se standardním označením na webu občas setkal.
- _Martin_
- Generous Backer | 679
pmg napsal(a):
Argument setkal / nesetkal bych uvažoval, pokud by nebylo snadné se dovtípit, že KiB odpovídá starému KB. Myslím, že toto ale není ten případ. Navíc musím říct, že už jsem se se standardním označením na webu občas setkal.
Setkal/nesetkal beru jakožto argumentaci z pohledu většiny. Jsem si jist, že typický uživatel internetu, který se není schopen dovtípit rozdílu kB a KB, bude označením KiB leda zmaten. Nicméně by asi nebyl zase takový problém, aby se v třídě String dalo nastavit, jaké jednotky má funkce vracet. Rozhodně lepší, než se snažit najít jediný správný způsob =)
- Jan Tvrdík
- Nette guru | 2595
OT: Neví někdo, proč se velikost udává v bytech a ne v bitech, které jsou jednoznačné a vyjadřují skutečnou podstatu zabraného místa. Nehledě na to, že už dávno neplatí, že jeden byte = jeden znak, protože existují vícebajtová kódování jako např. UTF-8. Pro zajímavost doplním, že byte ve skutečnosti neznamená 8 bitů, jak si většina lidí mylně myslí, ale označuje skupinu bitů. Naštěstí se v praxi setkáme pouze s 8bitovými skupinami, takže tady reálně nedorozumnění nehrozí.
- pmg
- Člen | 372
Jsem si jist, že typický uživatel internetu, který se není schopen dovtípit rozdílu kB a KB, bude označením KiB leda zmaten.
K tomu by se dalo napsat, že pokud je uživatel zdatný natolik, že ho při posuzování velikosti souboru zajímá jednotka a zná rozdíl mezi B a b, písmeno uprostřed by už ho v kontextu nemuselo zmást: Download Crack (256 KiB). Naopak – když už by se zabýval velikostí písmene B, měl by se hned také zajímat, jestli k/K, nebo Ki, neboť obojí má na výslednou hodnotu vliv. Přesnou velikost souboru budou (kromě uživatelů vytáčeného připojení) chtít znát spíše pokročilí uživatelé, a těm použitím KiB hodnotu zdělíme jednoznačně.
Dalo by se oponovat, že kB se v naprosté většině případů používá ve smyslu KiB, proto se o tom nechci hádat. Alternativou by bylo generovat jednotky rovnou s odkazem na Wikipedii.
Jan Tvrdík toho očividně dost ví. Přiměl mě svým příspěvkem argumentovat pro KiB, ale napadá mě: nebylo by lepší, kdyby na DVD začali uvádět velikost v gibibajtech, tedy v klasických GB? S klidem bychom pak mohli zůstat u zavedeného označení.
- Jan Tvrdík
- Nette guru | 2595
Jod napsal(a):
Komu neni jasné prečo neni 4,7 GB, 4700 MB, ale menej.
4,7 GB lze vyložit jako 4812,8 MB nebo 4700 MB, ale nechápu, jak by to šlo vyložit jako ještě menší hodnota.
- Honza Marek
- Člen | 1664
Vzhledem k tomu, že jsem nikdy nikde žádný KiB neviděl, tak to nechci. Nezajímá mě nějaká norma o které nikdo neví.
- syky01
- Člen | 25
Jan Tvrdík napsal(a):
Jod napsal(a):
Komu neni jasné prečo neni 4,7 GB, 4700 MB, ale menej.
4,7 GB lze vyložit jako 4812,8 MB nebo 4700 MB, ale nechápu, jak by to šlo vyložit jako ještě menší hodnota.
4,7GB *1000 *1000 * 1000 = 4700000000 B /1024 / 1024 / 1024 = 4,3772161006927490234375 GiB
Ale osobně jsem v Nette pro zachování GB = 1024MB
Editoval syky01 (18. 2. 2009 10:16)
- carnaby
- Člen | 7
- Skola
nedavno jeden gymnazista chcel odomna pomoct s ulohou z infomatiky. Sokovalo ma ze tam riesi nieco v Turbo Pascale 6. Hmm ak su este nejake skoly schopne ucit nieco tak moralne zastarale tak mi nepride divne ze MB vyucuju ako nabozensku dogmu a nevedia vysvetlit preco to tak je a ze sustava SI dostava riadne nafrak.
- Operacny system
nuz ako ktory… pouzivam GNU/Linux uz nejaky ten piatok ale tu vsetko vsade ukazuje KiB,MiB,GiB alebo cele bajtove cislo. Hadam vsetci dobre vieme ako je to zo zavadzanim standardov v Microsofte. Oni si radsej povedia „sme taky big ze mame vlastne standardy“ i ked casto nezmyselne
- Ludia
Robil som si maly prieskum … Taky „bezny franta uzivatel“ nema ani
sajnu a prevode zakladnych jednotiek, vsetko mera slovamy vojde sa mi to na
kluc? ci DVD ci CD. Aj zauzivane pojmy MB GB su pre neho nezmysel tak MiB GiB
budu podobny nezmysel. Nehovoriac ze aj skusenejsi uzivatel ma problem chapat
rozdiel v datovom toku udavany v bitoch/s a vo velkostiach suborov udavanych
v bajtoch.
Ak niekto pracuje v oblasti IT tak by mal aspon tusit o co kraca a teda MiB by
nemal byt problemom.
zaverom
Uzivatelovi to je jedno ci tam bude MB alebo MiB. A ten kto vie o co ide ma
aspon exaktnu informaciu. MS to mozno zapracuje do winowsu XY a potom sa vsetci
sprepacenim ....... ze „novinka!“ uz sa to oznacuje inak.
- Jod
- Člen | 701
1. Skola
To sa ti nečudujem, naše školy sú celé na trt. Ja som mal na elektrotechnike tiež pascal a nebolo to zas tak dávno.
2. Operačný systém
Na Ubuntu 8.10 v práci, keď kliknem na vlastnosti súboru mám tam veľkosť 7,1 KB (7314 bajtov).
Na Mac OS X 10.5.6 doma, keď kliknem na get info mám tam veľkosť 211,8 MB on disk (209,582,957 bytes).
Windows nemám ani nebudem mať, ale keď som naposledy klikol v XP na vlastnosť súboru, tiež tam boli jednotky v MB.
3. Ludia
Normálnemu človeku asi príde logickejšie MiB, ale keď má na USB disku napísanu velkosť v GB, tak je z toho znova debil =D . Treba tam napísať prepočetný kurz ako u nás pri jevre (€)
Editoval Jod (18. 2. 2009 11:07)
- carnaby
- Člen | 7
Jod. OS no neviem linux kernel je v zozname co to podporuje ale zalezi na samotnych aplikaciach. V Kubuntu 8.10 Intrepid Ibex s KDE 4.2 je to po novom. aspon systemove app. No nie o tom som chcel.
Nema vyznam hlasovat o tom ktore zobrazenie je lepsie ci pouzivanejsie … nech kazdy pouziva to co si mysli ze je spravne. Ja som len chcel zladit tu funkciu aby mohla vratit aj toto. Nette je predsa moderny framework
mozno v configu volitelny parameter bytesFormat a povedzme 3 moznosti
- IEC_SI (default) – 1 500 000 bytes ~ 1,43 MB
- SI – 1 500 000 bytes = 1,5 MB
- IEC – 1 500 000 bytes ~ 1,43 MiB
Editoval carnaby (18. 2. 2009 12:10)
- Patrik Votoček
- Člen | 2221
Ono hlavně spousta BFU ani neví jaký je rozdíl mezi Mb a MB… Proto
když si obědnají internet
(bez předchozí zkušenosti) kde píší 10Mbps tak z toho taky nejsou kdo ví
jak moudrý a čakájí že jim to pojede 10MB/s… Ale to je jedno to jsem
nechtěl řešit spousta lidí totiž nemá ani tušení že u médii (CD, DVD,
BDR, HDD, Flash Disky atd. – prostě jakej koli HW na kterej se dají uložit
data) udávají 1GB = 1000MB = 1000000KB = 1000000000B kdežto u FileSystémů,
souborů atd se používá klasické 1GB = 1024MB = 1048576KB = 1073741824B =
8589934592b … To ale nevysvětluje ten RapidShare kterej někdo nademnou
zmiňoval, je to tím že Rapid Share sebe považuje za virtuální médium.
A teď k tomu jak to řešit v nette prostě a jednoduše dát možnost si to nastavit… Otážkou pak zůstává co nastavit jako default…?
- David Grudl
- Nette Core | 8218
Jen drobnost – metoda existuje jako helper v TemplateHelpers, v metode String je deprecated, tak bych asi mel pridat trigger_error.
Tím, že jde o vizuální helper, by měl být uživatelsky přívětivý a tudíž používat jen zkrakty B, kB, MB, GB. Jestli to bude 1000 nebo 1024 je asi vcelku jedno.
- pheidrich
- Člen | 11
Aneb není kilo jako kilo, zvlášť když někde přebývá… ;-)
Tento problém je tady s námi už pár desetiletí, ale naučili jsme se s ním žít. Třebaže Běžný Franta Uživatel neví, jak přesně na něj, zvykl si. :-)
Osobně se na žádné kibíky, gibíky přeučovat nehodlám. Stačí, že máme dibíka.
- PetrP
- Člen | 587
Mělo by to určitě jít nastavit, a myslím že defaultně by mělo být toto:
carnaby napsal(a):
- IEC – 1 500 000 bytes ~ 1,43 MiB
Osobně nevidím problém s MiB apod. prostě existujou, jsou jednoznačný, možnost že je někdo nepochopí (rozuměj ten kdo ví co je MB) je minimální. A když potřebuju tak tím dokážu jasně říct že myslím 1024*
Problém vidím v MB které jsou naprosto nejednoznačné, a když je někde uvidím, tak můžu jen hádat o jaké jednotky se jedná, většinou to nelze ani poznat z kontextu. Když už se lidi rozhodli je chybně používat tak by mohla existovat alternativa kterou bych řekl že myslím skutečné např 1000 násobek bajtu. Protože psát 1000000000 B když chci napsat 1GB je nečitelné.