aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjaseg <s@jaseg.de>2013-03-31 21:01:13 +0200
committerjaseg <s@jaseg.de>2013-03-31 21:01:13 +0200
commit7ea7c59e7181533ebd79d948d168b31ccfd85401 (patch)
treeba96837ada19bc785bf91515c688ce7cfa6f8ea5
parenta72c728ab47d440b292ae9ed17a2b1524114d07f (diff)
downloadponysay-7ea7c59e7181533ebd79d948d168b31ccfd85401.tar.gz
ponysay-7ea7c59e7181533ebd79d948d168b31ccfd85401.tar.bz2
ponysay-7ea7c59e7181533ebd79d948d168b31ccfd85401.zip
Rewrite completed. <100lines.
-rw-r--r--CHANGELOG417
-rw-r--r--CREDITS1
-rw-r--r--README.md15
-rwxr-xr-xdev/dist.sh81
-rwxr-xr-xdev/spell.sh42
-rw-r--r--extraponies/doctor.quotes (renamed from ponyquotes/doctor.0)0
-rw-r--r--ponies/ace.ttypony (renamed from ttyponies/ace.pony)0
-rw-r--r--ponies/airheart.ttypony (renamed from ttyponies/airheart.pony)0
-rw-r--r--ponies/allie.ttypony (renamed from ttyponies/allie.pony)0
-rw-r--r--ponies/aloe.ttypony (renamed from ttyponies/aloe.pony)0
l---------ponies/amethyststar.ttypony (renamed from ttyponies/amethyststar.pony)0
-rw-r--r--ponies/angel.ttypony (renamed from ttyponies/angel.pony)0
-rw-r--r--ponies/applebloom.quotes17
-rw-r--r--ponies/applebloom.ttypony (renamed from ttyponies/applebloom.pony)0
-rw-r--r--ponies/applebloomdance.ttypony (renamed from ttyponies/applebloomdance.pony)0
-rw-r--r--ponies/applebumpkin.ttypony (renamed from ttyponies/applebumpkin.pony)0
-rw-r--r--ponies/applecore.ttypony (renamed from ttyponies/applecore.pony)0
-rw-r--r--ponies/applefritter.ttypony (renamed from ttyponies/applefritter.pony)0
-rw-r--r--ponies/applejack.quotes19
-rw-r--r--ponies/applejack.ttypony (renamed from ttyponies/applejack.pony)0
-rw-r--r--ponies/applejackscarecrow.ttypony (renamed from ttyponies/applejackscarecrow.pony)0
-rw-r--r--ponies/archer.ttypony (renamed from ttyponies/archer.pony)0
-rw-r--r--ponies/basil.ttypony (renamed from ttyponies/basil.pony)0
-rw-r--r--ponies/bastionyorsets.ttypony (renamed from ttyponies/bastionyorsets.pony)0
l---------ponies/berrypinch.ttypony (renamed from ttyponies/berrypinch.pony)0
-rw-r--r--ponies/berrypunch.ttypony (renamed from ttyponies/berrypunch.pony)0
-rw-r--r--ponies/bigmac.quotes9
-rw-r--r--ponies/bigmac.ttypony (renamed from ttyponies/bigmac.pony)0
-rw-r--r--ponies/blaze.ttypony (renamed from ttyponies/blaze.pony)0
-rw-r--r--ponies/blinkie.ttypony (renamed from ttyponies/blinkie.pony)0
-rw-r--r--ponies/blossomforth.ttypony (renamed from ttyponies/blossomforth.pony)0
-rw-r--r--ponies/blueberry.ttypony (renamed from ttyponies/blueberry.pony)0
-rw-r--r--ponies/blueberrycake.ttypony (renamed from ttyponies/blueberrycake.pony)0
-rw-r--r--ponies/blueblood.ttypony (renamed from ttyponies/blueblood.pony)0
-rw-r--r--ponies/blueharvest.ttypony (renamed from ttyponies/blueharvest.pony)0
-rw-r--r--ponies/blues.ttypony (renamed from ttyponies/blues.pony)0
-rw-r--r--ponies/bonbon.quotes (renamed from ponyquotes/bonbon.0)2
-rw-r--r--ponies/bonbon.ttypony (renamed from ttyponies/bonbon.pony)0
l---------ponies/bonbonlyra.ttypony (renamed from ttyponies/bonbonlyra.pony)0
-rw-r--r--ponies/bonbonstand.ttypony (renamed from ttyponies/bonbonstand.pony)0
-rw-r--r--ponies/bonvoyage.ttypony (renamed from ttyponies/bonvoyage.pony)0
-rw-r--r--ponies/boxxy.ttypony (renamed from ttyponies/boxxy.pony)0
-rw-r--r--ponies/braeburn.quotes5
-rw-r--r--ponies/braeburn.ttypony (renamed from ttyponies/braeburn.pony)0
-rw-r--r--ponies/cadance.ttypony (renamed from ttyponies/cadance.pony)0
-rw-r--r--ponies/caesar.ttypony (renamed from ttyponies/caesar.pony)0
-rw-r--r--ponies/candylicious.ttypony (renamed from ttyponies/candylicious.pony)0
-rw-r--r--ponies/candymane.ttypony (renamed from ttyponies/candymane.pony)0
-rw-r--r--ponies/caramel.ttypony (renamed from ttyponies/caramel.pony)0
-rw-r--r--ponies/carecake.ttypony (renamed from ttyponies/carecake.pony)0
-rw-r--r--ponies/carrot.quotes (renamed from ponyquotes/carrot.1)2
-rw-r--r--ponies/carrot.ttypony (renamed from ttyponies/carrot.pony)0
l---------ponies/carrottop.ttypony (renamed from ttyponies/carrottop.pony)0
-rw-r--r--ponies/celestia.quotes (renamed from ponyquotes/celestia.0)8
-rw-r--r--ponies/celestia.ttypony (renamed from ttyponies/celestia.pony)0
-rw-r--r--ponies/celestiasmall.ttypony (renamed from ttyponies/celestiasmall.pony)0
-rw-r--r--ponies/cerberus.ttypony (renamed from ttyponies/cerberus.pony)0
-rw-r--r--ponies/changeling.ttypony (renamed from ttyponies/changeling.pony)0
-rw-r--r--ponies/changelingqueen.ttypony (renamed from ttyponies/changelingqueen.pony)0
-rw-r--r--ponies/cheerilee.quotes (renamed from ponyquotes/cheerilee.0)2
-rw-r--r--ponies/cheerilee.ttypony (renamed from ttyponies/cheerilee.pony)0
-rw-r--r--ponies/cheerilee80.ttypony (renamed from ttyponies/cheerilee80.pony)0
-rw-r--r--ponies/cherryberry.ttypony (renamed from ttyponies/cherryberry.pony)0
-rw-r--r--ponies/cherrycola.ttypony (renamed from ttyponies/cherrycola.pony)0
-rw-r--r--ponies/chrysalis.quotes (renamed from ponyquotes/chrysalis.0)1
-rw-r--r--ponies/chrysalis.ttypony (renamed from ttyponies/chrysalis.pony)0
l---------ponies/clockwork.ttypony (renamed from ttyponies/clockwork.pony)0
-rw-r--r--ponies/cloudkicker.ttypony (renamed from ttyponies/cloudkicker.pony)0
-rw-r--r--ponies/clyde.ttypony (renamed from ttyponies/clyde.pony)0
-rw-r--r--ponies/colgate.ttypony (renamed from ttyponies/colgate.pony)0
-rw-r--r--ponies/colton.ttypony (renamed from ttyponies/colton.pony)0
-rw-r--r--ponies/cottoncloudy.ttypony (renamed from ttyponies/cottoncloudy.pony)0
-rw-r--r--ponies/cow.ttypony (renamed from ttyponies/cow.pony)0
-rw-r--r--ponies/crackle.ttypony (renamed from ttyponies/crackle.pony)0
l---------ponies/craftycrate.ttypony (renamed from ttyponies/craftycrate.pony)0
-rw-r--r--ponies/cupcake.ttypony (renamed from ttyponies/cupcake.pony)0
-rw-r--r--ponies/cutiemarkcrusaders.ttypony (renamed from ttyponies/cutiemarkcrusaders.pony)0
-rw-r--r--ponies/daisy.ttypony (renamed from ttyponies/daisy.pony)0
-rw-r--r--ponies/daringdo.ttypony (renamed from ttyponies/daringdo.pony)0
-rw-r--r--ponies/davenport.ttypony (renamed from ttyponies/davenport.pony)0
-rw-r--r--ponies/derpy.quotes9
-rw-r--r--ponies/derpy.ttypony (renamed from ttyponies/derpy.pony)0
-rw-r--r--ponies/derpybags.ttypony (renamed from ttyponies/derpybags.pony)0
-rw-r--r--ponies/derpycloud.ttypony (renamed from ttyponies/derpycloud.pony)0
-rw-r--r--ponies/derpysad.ttypony (renamed from ttyponies/derpysad.pony)0
-rw-r--r--ponies/derpysit.ttypony (renamed from ttyponies/derpysit.pony)0
-rw-r--r--ponies/derpystand.ttypony (renamed from ttyponies/derpystand.pony)0
-rw-r--r--ponies/derpystandwing.ttypony (renamed from ttyponies/derpystandwing.pony)0
-rw-r--r--ponies/diamondmint.ttypony (renamed from ttyponies/diamondmint.pony)0
-rw-r--r--ponies/diamondtiara.quotes (renamed from ponyquotes/diamondtiara.0)0
-rw-r--r--ponies/diamondtiara.ttypony (renamed from ttyponies/diamondtiara.pony)0
-rw-r--r--ponies/dinky.ttypony (renamed from ttyponies/dinky.pony)0
-rw-r--r--ponies/discord.quotes (renamed from ponyquotes/discord.0)0
-rw-r--r--ponies/discord.ttypony (renamed from ttyponies/discord.pony)0
-rw-r--r--ponies/discordamused.ttypony (renamed from ttyponies/discordamused.pony)0
-rw-r--r--ponies/discordpuppetmaster.ttypony (renamed from ttyponies/discordpuppetmaster.pony)0
l---------ponies/djpon-3.ttypony (renamed from ttyponies/djpon-3.pony)0
l---------ponies/drhooves.ttypony (renamed from ttyponies/drhooves.pony)0
l---------ponies/elsie.ttypony (renamed from ttyponies/elsie.pony)0
l---------ponies/epona.ttypony (renamed from ttyponies/epona.pony)0
-rw-r--r--ponies/fancypants.quotes (renamed from ponyquotes/fancypants.0)0
-rw-r--r--ponies/fancypants.ttypony (renamed from ttyponies/fancypants.pony)0
-rw-r--r--ponies/fido.ttypony (renamed from ttyponies/fido.pony)0
-rw-r--r--ponies/fillistia.ttypony (renamed from ttyponies/fillistia.pony)0
-rw-r--r--ponies/fillycadance.ttypony (renamed from ttyponies/fillycadance.pony)0
-rw-r--r--ponies/fillycelestia.ttypony (renamed from ttyponies/fillycelestia.pony)0
-rw-r--r--ponies/fillydash.ttypony (renamed from ttyponies/fillydash.pony)0
-rw-r--r--ponies/fillydashfly.ttypony (renamed from ttyponies/fillydashfly.pony)0
-rw-r--r--ponies/fillyjack.ttypony (renamed from ttyponies/fillyjack.pony)0
-rw-r--r--ponies/fillyjacktravel.ttypony (renamed from ttyponies/fillyjacktravel.pony)0
-rw-r--r--ponies/fillypinkie.ttypony (renamed from ttyponies/fillypinkie.pony)0
-rw-r--r--ponies/fillypinkiecurly.ttypony (renamed from ttyponies/fillypinkiecurly.pony)0
-rw-r--r--ponies/fillyrarity.ttypony (renamed from ttyponies/fillyrarity.pony)0
-rw-r--r--ponies/fillyshy.ttypony (renamed from ttyponies/fillyshy.pony)0
-rw-r--r--ponies/fillytwilight.ttypony (renamed from ttyponies/fillytwilight.pony)0
-rw-r--r--ponies/filthyrich.ttypony (renamed from ttyponies/filthyrich.pony)0
-rw-r--r--ponies/firestreak.ttypony (renamed from ttyponies/firestreak.pony)0
-rw-r--r--ponies/flam.ttypony (renamed from ttyponies/flam.pony)0
-rw-r--r--ponies/fleurdelis.ttypony (renamed from ttyponies/fleurdelis.pony)0
-rw-r--r--ponies/fleurdelishair.ttypony (renamed from ttyponies/fleurdelishair.pony)0
-rw-r--r--ponies/fleurdelislay.ttypony (renamed from ttyponies/fleurdelislay.pony)0
-rw-r--r--ponies/flim.ttypony (renamed from ttyponies/flim.pony)0
-rw-r--r--ponies/flowertrio.ttypony (renamed from ttyponies/flowertrio.pony)0
-rw-r--r--ponies/fluttershy.quotes87
-rw-r--r--ponies/fluttershy.ttypony (renamed from ttyponies/fluttershy.pony)0
-rw-r--r--ponies/fluttershygala.ttypony (renamed from ttyponies/fluttershygala.pony)0
-rw-r--r--ponies/fluttershyshy.ttypony (renamed from ttyponies/fluttershyshy.pony)0
-rw-r--r--ponies/fluttershystare.ttypony (renamed from ttyponies/fluttershystare.pony)0
-rw-r--r--ponies/forestspirit.ttypony (renamed from ttyponies/forestspirit.pony)0
-rw-r--r--ponies/frederickhorseshoepin.ttypony (renamed from ttyponies/frederickhorseshoepin.pony)0
l---------ponies/georgewashingtony.ttypony (renamed from ttyponies/georgewashingtony.pony)0
-rw-r--r--ponies/gilda.quotes15
-rw-r--r--ponies/gilda.ttypony (renamed from ttyponies/gilda.pony)0
-rw-r--r--ponies/gildastand.ttypony (renamed from ttyponies/gildastand.pony)0
-rw-r--r--ponies/gingergold.ttypony (renamed from ttyponies/gingergold.pony)0
l---------ponies/goldenharvest.ttypony (renamed from ttyponies/goldenharvest.pony)0
-rw-r--r--ponies/granny.quotes (renamed from ponyquotes/granny.0)0
-rw-r--r--ponies/granny.ttypony (renamed from ttyponies/granny.pony)0
-rw-r--r--ponies/grannychair.ttypony (renamed from ttyponies/grannychair.pony)0
-rw-r--r--ponies/grannysleep.ttypony (renamed from ttyponies/grannysleep.pony)0
-rw-r--r--ponies/gummy.ttypony (renamed from ttyponies/gummy.pony)0
-rw-r--r--ponies/gustavelegrand.ttypony (renamed from ttyponies/gustavelegrand.pony)0
l---------ponies/harpass.ttypony (renamed from ttyponies/harpass.pony)0
-rw-r--r--ponies/hayfever.ttypony (renamed from ttyponies/hayfever.pony)0
l---------ponies/heartstrings.ttypony (renamed from ttyponies/heartstrings.pony)0
-rw-r--r--ponies/highscore.ttypony (renamed from ttyponies/highscore.pony)0
-rw-r--r--ponies/hoity.ttypony (renamed from ttyponies/hoity.pony)0
-rw-r--r--ponies/hollydash.ttypony (renamed from ttyponies/hollydash.pony)0
-rw-r--r--ponies/horsemd.ttypony (renamed from ttyponies/horsemd.pony)0
l---------ponies/horsepower.ttypony (renamed from ttyponies/horsepower.pony)0
-rw-r--r--ponies/horte.ttypony (renamed from ttyponies/horte.pony)0
-rw-r--r--ponies/hughjelly.ttypony (renamed from ttyponies/hughjelly.pony)0
-rw-r--r--ponies/inky.ttypony (renamed from ttyponies/inky.pony)0
-rw-r--r--ponies/ironwill.quotes15
-rw-r--r--ponies/ironwillwalk.ttypony (renamed from ttyponies/ironwillwalk.pony)0
-rw-r--r--ponies/jeffletrotski.ttypony (renamed from ttyponies/jeffletrotski.pony)0
-rw-r--r--ponies/jesuspezuna.ttypony (renamed from ttyponies/jesuspezuna.pony)0
-rw-r--r--ponies/joe.ttypony (renamed from ttyponies/joe.pony)0
-rw-r--r--ponies/joetuxedo.ttypony (renamed from ttyponies/joetuxedo.pony)0
-rw-r--r--ponies/junebug.ttypony (renamed from ttyponies/junebug.pony)0
-rw-r--r--ponies/laflour.ttypony (renamed from ttyponies/laflour.pony)0
-rw-r--r--ponies/lemonhearts.ttypony (renamed from ttyponies/lemonhearts.pony)0
-rw-r--r--ponies/lightning.ttypony (renamed from ttyponies/lightning.pony)0
-rw-r--r--ponies/lily.quotes (renamed from ponyquotes/lily.1)2
-rw-r--r--ponies/lily.ttypony (renamed from ttyponies/lily.pony)0
-rw-r--r--ponies/lintsalot.ttypony (renamed from ttyponies/lintsalot.pony)0
-rw-r--r--ponies/lotus.ttypony (renamed from ttyponies/lotus.pony)0
l---------ponies/lotusbloosom.ttypony (renamed from ttyponies/lotusbloosom.pony)0
l---------ponies/lulamoon.ttypony (renamed from ttyponies/lulamoon.pony)0
-rw-r--r--ponies/luna.quotes13
-rw-r--r--ponies/luna.ttypony (renamed from ttyponies/luna.pony)0
-rw-r--r--ponies/lunafly.ttypony (renamed from ttyponies/lunafly.pony)0
-rw-r--r--ponies/lyra.quotes (renamed from ponyquotes/lyra.0)0
-rw-r--r--ponies/lyra.ttypony (renamed from ttyponies/lyra.pony)0
-rw-r--r--ponies/lyrabonbon.ttypony (renamed from ttyponies/lyrabonbon.pony)0
-rw-r--r--ponies/lyrasit.ttypony (renamed from ttyponies/lyrasit.pony)0
l---------ponies/magnum.ttypony (renamed from ttyponies/magnum.pony)0
-rw-r--r--ponies/manticore.ttypony (renamed from ttyponies/manticore.pony)0
-rw-r--r--ponies/maredowellfly.ttypony (renamed from ttyponies/maredowellfly.pony)0
-rw-r--r--ponies/maredowellgallop.ttypony (renamed from ttyponies/maredowellgallop.pony)0
-rw-r--r--ponies/master.ttypony (renamed from ttyponies/master.pony)0
-rw-r--r--ponies/mayor.ttypony (renamed from ttyponies/mayor.pony)0
-rw-r--r--ponies/meadowsong.ttypony (renamed from ttyponies/meadowsong.pony)0
-rw-r--r--ponies/meliot.ttypony (renamed from ttyponies/meliot.pony)0
-rw-r--r--ponies/milkyway.ttypony (renamed from ttyponies/milkyway.pony)0
l---------ponies/minuette.ttypony (renamed from ttyponies/minuette.pony)0
-rw-r--r--ponies/mjolna.ttypony (renamed from ttyponies/mjolna.pony)0
-rw-r--r--ponies/mrsparkle.ttypony (renamed from ttyponies/mrsparkle.pony)0
-rw-r--r--ponies/mrssparkle.ttypony (renamed from ttyponies/mrssparkle.pony)0
l---------ponies/nightlight.ttypony (renamed from ttyponies/nightlight.pony)0
-rw-r--r--ponies/nightmare.quotes11
-rw-r--r--ponies/nightmare.ttypony (renamed from ttyponies/nightmare.pony)0
-rw-r--r--ponies/noi.ttypony (renamed from ttyponies/noi.pony)0
l---------ponies/noteworthy.ttypony (renamed from ttyponies/noteworthy.pony)0
-rw-r--r--ponies/octavia.ttypony (renamed from ttyponies/octavia.pony)0
-rw-r--r--ponies/oinkoinkoink.ttypony (renamed from ttyponies/oinkoinkoink.pony)0
-rw-r--r--ponies/opal.ttypony (renamed from ttyponies/opal.pony)0
-rw-r--r--ponies/orange.ttypony (renamed from ttyponies/orange.pony)0
-rw-r--r--ponies/owl.ttypony (renamed from ttyponies/owl.pony)0
-rw-r--r--ponies/owlowiscious.ttypony (renamed from ttyponies/owlowiscious.pony)0
-rw-r--r--ponies/parasprite.ttypony (renamed from ttyponies/parasprite.pony)0
l---------ponies/pearl.ttypony (renamed from ttyponies/pearl.pony)0
-rw-r--r--ponies/peppermoon.ttypony (renamed from ttyponies/peppermoon.pony)0
l---------ponies/perry.ttypony (renamed from ttyponies/perry.pony)0
-rw-r--r--ponies/perrypierce.ttypony (renamed from ttyponies/perrypierce.pony)0
-rw-r--r--ponies/persnickety.ttypony (renamed from ttyponies/persnickety.pony)0
-rw-r--r--ponies/petunia.ttypony (renamed from ttyponies/petunia.pony)0
-rw-r--r--ponies/philomena.ttypony (renamed from ttyponies/philomena.pony)0
-rw-r--r--ponies/philomenaphoenix.ttypony (renamed from ttyponies/philomenaphoenix.pony)0
-rw-r--r--ponies/photofinish.quotes9
-rw-r--r--ponies/photofinish.ttypony (renamed from ttyponies/photofinish.pony)0
-rw-r--r--ponies/pictureperfect.ttypony (renamed from ttyponies/pictureperfect.pony)0
-rw-r--r--ponies/pigpen.ttypony (renamed from ttyponies/pigpen.pony)0
-rw-r--r--ponies/pinacolada.ttypony (renamed from ttyponies/pinacolada.pony)0
-rw-r--r--ponies/pinkacopter.ttypony (renamed from ttyponies/pinkacopter.pony)0
-rw-r--r--ponies/pinkamina.ttypony (renamed from ttyponies/pinkamina.pony)0
-rw-r--r--ponies/pinkie.quotes76
-rw-r--r--ponies/pinkie.ttypony (renamed from ttyponies/pinkie.pony)0
-rw-r--r--ponies/pinkiebounce.ttypony (renamed from ttyponies/pinkiebounce.pony)0
-rw-r--r--ponies/pinkiecannon.ttypony (renamed from ttyponies/pinkiecannon.pony)0
-rw-r--r--ponies/pinkiecannonfront.ttypony (renamed from ttyponies/pinkiecannonfront.pony)0
-rw-r--r--ponies/pinkiecannonhappy.ttypony (renamed from ttyponies/pinkiecannonhappy.pony)0
-rw-r--r--ponies/pinkiechicken.ttypony (renamed from ttyponies/pinkiechicken.pony)0
-rw-r--r--ponies/pinkiefly.ttypony (renamed from ttyponies/pinkiefly.pony)0
-rw-r--r--ponies/pinkiegala.ttypony (renamed from ttyponies/pinkiegala.pony)0
-rw-r--r--ponies/pinkiegummy.ttypony (renamed from ttyponies/pinkiegummy.pony)0
-rw-r--r--ponies/pinkiegummydisguise.ttypony (renamed from ttyponies/pinkiegummydisguise.pony)0
-rw-r--r--ponies/pinkiehugfluttershy.ttypony (renamed from ttyponies/pinkiehugfluttershy.pony)0
-rw-r--r--ponies/pinkiehugsfluttershy.ttypony (renamed from ttyponies/pinkiehugsfluttershy.pony)0
l---------ponies/pinkieoink.ttypony (renamed from ttyponies/pinkieoink.pony)0
-rw-r--r--ponies/pinkieparade.ttypony (renamed from ttyponies/pinkieparade.pony)0
-rw-r--r--ponies/pinkiepartycannon.ttypony (renamed from ttyponies/pinkiepartycannon.pony)0
-rw-r--r--ponies/pinkieprincess.ttypony (renamed from ttyponies/pinkieprincess.pony)0
-rw-r--r--ponies/pinkiesilly.ttypony (renamed from ttyponies/pinkiesilly.pony)0
-rw-r--r--ponies/pinkietongue.ttypony (renamed from ttyponies/pinkietongue.pony)0
-rw-r--r--ponies/pinkieumbrellahat.ttypony (renamed from ttyponies/pinkieumbrellahat.pony)0
-rw-r--r--ponies/pinkieumbrellahatfear.ttypony (renamed from ttyponies/pinkieumbrellahatfear.pony)0
-rw-r--r--ponies/pinkiewhoops.ttypony (renamed from ttyponies/pinkiewhoops.pony)0
-rw-r--r--ponies/pinkiewhoopseat.ttypony (renamed from ttyponies/pinkiewhoopseat.pony)0
-rw-r--r--ponies/pinkiewhoopsout.ttypony (renamed from ttyponies/pinkiewhoopsout.pony)0
-rw-r--r--ponies/pipsqueak.quotes (renamed from ponyquotes/pipsqueak.1)4
-rw-r--r--ponies/pipsqueak.ttypony (renamed from ttyponies/pipsqueak.pony)0
-rw-r--r--ponies/pokey.ttypony (renamed from ttyponies/pokey.pony)0
l---------ponies/pokeypierce.ttypony (renamed from ttyponies/pokeypierce.pony)0
-rw-r--r--ponies/ponet.ttypony (renamed from ttyponies/ponet.pony)0
-rw-r--r--ponies/poppycock.ttypony (renamed from ttyponies/poppycock.pony)0
-rw-r--r--ponies/powderrouge.ttypony (renamed from ttyponies/powderrouge.pony)0
-rw-r--r--ponies/prettyvision.ttypony (renamed from ttyponies/prettyvision.pony)0
-rw-r--r--ponies/purplehaze.ttypony (renamed from ttyponies/purplehaze.pony)0
-rw-r--r--ponies/quickfix.ttypony (renamed from ttyponies/quickfix.pony)0
-rw-r--r--ponies/raggedy.ttypony (renamed from ttyponies/raggedy.pony)0
-rw-r--r--ponies/rainbow.quotes44
-rw-r--r--ponies/rainbow.ttypony (renamed from ttyponies/rainbow.pony)0
-rw-r--r--ponies/rainbowdrag.ttypony (renamed from ttyponies/rainbowdrag.pony)0
-rw-r--r--ponies/rainbowfly.ttypony (renamed from ttyponies/rainbowfly.pony)0
-rw-r--r--ponies/rainbowgala.ttypony (renamed from ttyponies/rainbowgala.pony)0
-rw-r--r--ponies/rainbowhurricane.ttypony (renamed from ttyponies/rainbowhurricane.pony)0
-rw-r--r--ponies/rainbowsalute.ttypony (renamed from ttyponies/rainbowsalute.pony)0
-rw-r--r--ponies/rainbowshadowbolt.ttypony (renamed from ttyponies/rainbowshadowbolt.pony)0
-rw-r--r--ponies/rainbowshine.ttypony (renamed from ttyponies/rainbowshine.pony)0
-rw-r--r--ponies/rainbowsleep.ttypony (renamed from ttyponies/rainbowsleep.pony)0
-rw-r--r--ponies/raindrops.ttypony (renamed from ttyponies/raindrops.pony)0
-rw-r--r--ponies/rarity.quotes55
-rw-r--r--ponies/rarity.ttypony (renamed from ttyponies/rarity.pony)0
-rw-r--r--ponies/raritycomplaining.ttypony (renamed from ttyponies/raritycomplaining.pony)0
-rw-r--r--ponies/raritydrama.ttypony (renamed from ttyponies/raritydrama.pony)0
-rw-r--r--ponies/rarityfly.ttypony (renamed from ttyponies/rarityfly.pony)0
-rw-r--r--ponies/raritygala.ttypony (renamed from ttyponies/raritygala.pony)0
-rw-r--r--ponies/rarityponder.ttypony (renamed from ttyponies/rarityponder.pony)0
-rw-r--r--ponies/raritysdad.ttypony (renamed from ttyponies/raritysdad.pony)0
-rw-r--r--ponies/raritysmom.ttypony (renamed from ttyponies/raritysmom.pony)0
-rw-r--r--ponies/redheart.ttypony (renamed from ttyponies/redheart.pony)0
-rw-r--r--ponies/rhyme.ttypony (renamed from ttyponies/rhyme.pony)0
-rw-r--r--ponies/rocky.ttypony (renamed from ttyponies/rocky.pony)0
-rw-r--r--ponies/rose.quotes (renamed from ponyquotes/rose.1)2
-rw-r--r--ponies/rose.ttypony (renamed from ttyponies/rose.pony)0
l---------ponies/roseluck.ttypony (renamed from ttyponies/roseluck.pony)0
-rw-r--r--ponies/rover.ttypony (renamed from ttyponies/rover.pony)0
-rw-r--r--ponies/royalguard.ttypony (renamed from ttyponies/royalguard.pony)0
-rw-r--r--ponies/royalnightguard.ttypony (renamed from ttyponies/royalnightguard.pony)0
l---------ponies/royalribbon.ttypony (renamed from ttyponies/royalribbon.pony)0
-rw-r--r--ponies/ruby.ttypony (renamed from ttyponies/ruby.pony)0
-rw-r--r--ponies/sapphire.quotes (renamed from ponyquotes/sapphire.0)0
-rw-r--r--ponies/sapphire.ttypony (renamed from ttyponies/sapphire.pony)0
-rw-r--r--ponies/scootaloo.quotes15
-rw-r--r--ponies/scootaloo.ttypony (renamed from ttyponies/scootaloo.pony)0
-rw-r--r--ponies/screwball.ttypony (renamed from ttyponies/screwball.pony)0
-rw-r--r--ponies/screwloose.ttypony (renamed from ttyponies/screwloose.pony)0
-rw-r--r--ponies/seaswirl.ttypony (renamed from ttyponies/seaswirl.pony)0
-rw-r--r--ponies/shadowbolts.ttypony (renamed from ttyponies/shadowbolts.pony)0
-rw-r--r--ponies/shiningarmor.ttypony (renamed from ttyponies/shiningarmor.pony)0
-rw-r--r--ponies/shiningarmorguard.ttypony (renamed from ttyponies/shiningarmorguard.pony)0
-rw-r--r--ponies/shiningarmorwedding.ttypony (renamed from ttyponies/shiningarmorwedding.pony)0
-rw-r--r--ponies/silverspeed.ttypony (renamed from ttyponies/silverspeed.pony)0
-rw-r--r--ponies/silverspoon.quotes (renamed from ponyquotes/silverspoon.0)0
-rw-r--r--ponies/silverspoon.ttypony (renamed from ttyponies/silverspoon.pony)0
-rw-r--r--ponies/silverstar.ttypony (renamed from ttyponies/silverstar.pony)0
l---------ponies/sindy.ttypony (renamed from ttyponies/sindy.pony)0
-rw-r--r--ponies/skyra.ttypony (renamed from ttyponies/skyra.pony)0
-rw-r--r--ponies/snails.ttypony (renamed from ttyponies/snails.pony)0
-rw-r--r--ponies/snips.ttypony (renamed from ttyponies/snips.pony)0
-rw-r--r--ponies/snowflake.ttypony (renamed from ttyponies/snowflake.pony)0
-rw-r--r--ponies/soarin.quotes5
-rw-r--r--ponies/soarin.ttypony (renamed from ttyponies/soarin.pony)0
-rw-r--r--ponies/soarinofficer.ttypony (renamed from ttyponies/soarinofficer.pony)0
-rw-r--r--ponies/soigne.ttypony (renamed from ttyponies/soigne.pony)0
-rw-r--r--ponies/sparkler.ttypony (renamed from ttyponies/sparkler.pony)0
-rw-r--r--ponies/spike.quotes15
-rw-r--r--ponies/spike.ttypony (renamed from ttyponies/spike.pony)0
-rw-r--r--ponies/spikefloat.ttypony (renamed from ttyponies/spikefloat.pony)0
-rw-r--r--ponies/spikelove.ttypony (renamed from ttyponies/spikelove.pony)0
-rw-r--r--ponies/spikemustache.ttypony (renamed from ttyponies/spikemustache.pony)0
-rw-r--r--ponies/spitfire.quotes (renamed from ponyquotes/spitfire.0)0
-rw-r--r--ponies/spitfire.ttypony (renamed from ttyponies/spitfire.pony)0
-rw-r--r--ponies/spot.ttypony (renamed from ttyponies/spot.pony)0
-rw-r--r--ponies/starlight.ttypony (renamed from ttyponies/starlight.pony)0
-rw-r--r--ponies/stella.ttypony (renamed from ttyponies/stella.pony)0
-rw-r--r--ponies/stevenmagnet.ttypony (renamed from ttyponies/stevenmagnet.pony)0
-rw-r--r--ponies/stevenmagnettrue.ttypony (renamed from ttyponies/stevenmagnettrue.pony)0
-rw-r--r--ponies/strongheart.ttypony (renamed from ttyponies/strongheart.pony)0
-rw-r--r--ponies/sue.ttypony (renamed from ttyponies/sue.pony)0
-rw-r--r--ponies/suedance.ttypony (renamed from ttyponies/suedance.pony)0
-rw-r--r--ponies/sunnyrays.ttypony (renamed from ttyponies/sunnyrays.pony)0
-rw-r--r--ponies/surprise.ttypony (renamed from ttyponies/surprise.pony)0
-rw-r--r--ponies/sweatiesing.ttypony (renamed from ttyponies/sweatiesing.pony)0
-rw-r--r--ponies/sweetie.quotes13
-rw-r--r--ponies/sweetie.ttypony (renamed from ttyponies/sweetie.pony)0
-rw-r--r--ponies/tank.ttypony (renamed from ttyponies/tank.pony)0
-rw-r--r--ponies/tenderheart.ttypony (renamed from ttyponies/tenderheart.pony)0
-rw-r--r--ponies/theodoredonaldkerabatsos.ttypony (renamed from ttyponies/theodoredonaldkerabatsos.pony)0
-rw-r--r--ponies/thunderlane.ttypony (renamed from ttyponies/thunderlane.pony)0
-rw-r--r--ponies/timeturner.ttypony (renamed from ttyponies/timeturner.pony)0
-rw-r--r--ponies/tom.ttypony (renamed from ttyponies/tom.pony)0
-rw-r--r--ponies/tornadobolt.ttypony (renamed from ttyponies/tornadobolt.pony)0
-rw-r--r--ponies/trixie.quotes13
-rw-r--r--ponies/trixie.ttypony (renamed from ttyponies/trixie.pony)0
l---------ponies/trixielulamoon.ttypony (renamed from ttyponies/trixielulamoon.pony)0
-rw-r--r--ponies/trixiestage.ttypony (renamed from ttyponies/trixiestage.pony)0
-rw-r--r--ponies/trixiestand.ttypony (renamed from ttyponies/trixiestand.pony)0
-rw-r--r--ponies/truffleshuffle.ttypony (renamed from ttyponies/truffleshuffle.pony)0
-rw-r--r--ponies/turf.ttypony (renamed from ttyponies/turf.pony)0
-rw-r--r--ponies/turnip.ttypony (renamed from ttyponies/turnip.pony)0
-rw-r--r--ponies/twilight.quotes51
-rw-r--r--ponies/twilight.ttypony (renamed from ttyponies/twilight.pony)0
-rw-r--r--ponies/twilightcrazyfromball.ttypony (renamed from ttyponies/twilightcrazyfromball.pony)0
-rw-r--r--ponies/twilightrage.ttypony (renamed from ttyponies/twilightrage.pony)0
-rw-r--r--ponies/twilightspike.ttypony (renamed from ttyponies/twilightspike.pony)0
-rw-r--r--ponies/twilightthebearded.ttypony (renamed from ttyponies/twilightthebearded.pony)0
-rw-r--r--ponies/twilighttime.ttypony (renamed from ttyponies/twilighttime.pony)0
l---------ponies/twilightvelvet.ttypony (renamed from ttyponies/twilightvelvet.pony)0
-rw-r--r--ponies/twilightzero.ttypony (renamed from ttyponies/twilightzero.pony)0
-rw-r--r--ponies/twist.quotes (renamed from ponyquotes/twist.0)0
-rw-r--r--ponies/twist.ttypony (renamed from ttyponies/twist.pony)0
-rw-r--r--ponies/vinyl.ttypony (renamed from ttyponies/vinyl.pony)0
-rw-r--r--ponies/violet.ttypony (renamed from ttyponies/violet.pony)0
-rw-r--r--ponies/waltercoltchak.ttypony (renamed from ttyponies/waltercoltchak.pony)0
-rw-r--r--ponies/wildfire.ttypony (renamed from ttyponies/wildfire.pony)0
-rw-r--r--ponies/winona.ttypony (renamed from ttyponies/winona.pony)0
-rw-r--r--ponies/woona.ttypony (renamed from ttyponies/woona.pony)0
-rw-r--r--ponies/zecora.quotes17
-rw-r--r--ponies/zecora.ttypony (renamed from ttyponies/zecora.pony)0
-rw-r--r--ponies/zecorabalance.ttypony (renamed from ttyponies/zecorabalance.pony)0
-rw-r--r--pony-checklist (renamed from dev/pony-checklist)0
-rwxr-xr-xponycenter.py39
-rw-r--r--ponyquotes/applebloom.01
-rw-r--r--ponyquotes/applebloom.11
-rw-r--r--ponyquotes/applebloom.21
-rw-r--r--ponyquotes/applebloom.31
-rw-r--r--ponyquotes/applebloom.41
-rw-r--r--ponyquotes/applebloom.51
-rw-r--r--ponyquotes/applebloom.61
-rw-r--r--ponyquotes/applebloom.71
-rw-r--r--ponyquotes/applebloom.81
-rw-r--r--ponyquotes/applejack.01
-rw-r--r--ponyquotes/applejack.11
-rw-r--r--ponyquotes/applejack.21
-rw-r--r--ponyquotes/applejack.31
-rw-r--r--ponyquotes/applejack.41
-rw-r--r--ponyquotes/applejack.51
-rw-r--r--ponyquotes/applejack.61
-rw-r--r--ponyquotes/applejack.71
-rw-r--r--ponyquotes/applejack.81
-rw-r--r--ponyquotes/applejack.91
-rw-r--r--ponyquotes/bigmac.01
-rw-r--r--ponyquotes/bigmac.11
-rw-r--r--ponyquotes/bigmac.21
-rw-r--r--ponyquotes/bigmac.31
-rw-r--r--ponyquotes/bigmac.41
-rw-r--r--ponyquotes/bonbon.11
-rw-r--r--ponyquotes/braeburn.01
-rw-r--r--ponyquotes/braeburn.11
-rw-r--r--ponyquotes/braeburn.21
-rw-r--r--ponyquotes/carrot.01
-rw-r--r--ponyquotes/celestia.11
-rw-r--r--ponyquotes/celestia.21
-rw-r--r--ponyquotes/celestia.31
-rw-r--r--ponyquotes/celestia.41
-rw-r--r--ponyquotes/cheerilee.11
-rw-r--r--ponyquotes/chrysalis.11
-rw-r--r--ponyquotes/derpy.01
-rw-r--r--ponyquotes/derpy.11
-rw-r--r--ponyquotes/derpy.21
-rw-r--r--ponyquotes/derpy.31
-rw-r--r--ponyquotes/derpy.41
-rw-r--r--ponyquotes/fluttershy.02
-rw-r--r--ponyquotes/fluttershy.11
-rw-r--r--ponyquotes/fluttershy.101
-rw-r--r--ponyquotes/fluttershy.118
-rw-r--r--ponyquotes/fluttershy.124
-rw-r--r--ponyquotes/fluttershy.132
-rw-r--r--ponyquotes/fluttershy.141
-rw-r--r--ponyquotes/fluttershy.153
-rw-r--r--ponyquotes/fluttershy.161
-rw-r--r--ponyquotes/fluttershy.173
-rw-r--r--ponyquotes/fluttershy.181
-rw-r--r--ponyquotes/fluttershy.192
-rw-r--r--ponyquotes/fluttershy.21
-rw-r--r--ponyquotes/fluttershy.203
-rw-r--r--ponyquotes/fluttershy.213
-rw-r--r--ponyquotes/fluttershy.221
-rw-r--r--ponyquotes/fluttershy.231
-rw-r--r--ponyquotes/fluttershy.241
-rw-r--r--ponyquotes/fluttershy.251
-rw-r--r--ponyquotes/fluttershy.261
-rw-r--r--ponyquotes/fluttershy.271
-rw-r--r--ponyquotes/fluttershy.281
-rw-r--r--ponyquotes/fluttershy.291
-rw-r--r--ponyquotes/fluttershy.31
-rw-r--r--ponyquotes/fluttershy.301
-rw-r--r--ponyquotes/fluttershy.311
-rw-r--r--ponyquotes/fluttershy.41
-rw-r--r--ponyquotes/fluttershy.51
-rw-r--r--ponyquotes/fluttershy.61
-rw-r--r--ponyquotes/fluttershy.71
-rw-r--r--ponyquotes/fluttershy.81
-rw-r--r--ponyquotes/fluttershy.94
-rw-r--r--ponyquotes/gilda.01
-rw-r--r--ponyquotes/gilda.11
-rw-r--r--ponyquotes/gilda.21
-rw-r--r--ponyquotes/gilda.31
-rw-r--r--ponyquotes/gilda.41
-rw-r--r--ponyquotes/gilda.55
-rw-r--r--ponyquotes/ironwill.01
-rw-r--r--ponyquotes/ironwill.11
-rw-r--r--ponyquotes/ironwill.21
-rw-r--r--ponyquotes/ironwill.31
-rw-r--r--ponyquotes/ironwill.41
-rw-r--r--ponyquotes/ironwill.51
-rw-r--r--ponyquotes/ironwill.61
-rw-r--r--ponyquotes/ironwill.71
-rw-r--r--ponyquotes/lily.01
-rw-r--r--ponyquotes/luna.01
-rw-r--r--ponyquotes/luna.11
-rw-r--r--ponyquotes/luna.21
-rw-r--r--ponyquotes/luna.31
-rw-r--r--ponyquotes/luna.41
-rw-r--r--ponyquotes/luna.51
-rw-r--r--ponyquotes/luna.61
-rw-r--r--ponyquotes/nightmare.01
-rw-r--r--ponyquotes/nightmare.11
-rw-r--r--ponyquotes/nightmare.21
-rw-r--r--ponyquotes/nightmare.31
-rw-r--r--ponyquotes/nightmare.41
-rw-r--r--ponyquotes/nightmare.51
-rw-r--r--ponyquotes/photofinish.01
-rw-r--r--ponyquotes/photofinish.11
-rw-r--r--ponyquotes/photofinish.21
-rw-r--r--ponyquotes/photofinish.31
-rw-r--r--ponyquotes/photofinish.41
-rw-r--r--ponyquotes/pinkie.02
-rw-r--r--ponyquotes/pinkie.12
-rw-r--r--ponyquotes/pinkie.101
-rw-r--r--ponyquotes/pinkie.111
-rw-r--r--ponyquotes/pinkie.121
-rw-r--r--ponyquotes/pinkie.131
-rw-r--r--ponyquotes/pinkie.141
-rw-r--r--ponyquotes/pinkie.151
-rw-r--r--ponyquotes/pinkie.161
-rw-r--r--ponyquotes/pinkie.171
-rw-r--r--ponyquotes/pinkie.181
-rw-r--r--ponyquotes/pinkie.191
-rw-r--r--ponyquotes/pinkie.21
-rw-r--r--ponyquotes/pinkie.201
-rw-r--r--ponyquotes/pinkie.211
-rw-r--r--ponyquotes/pinkie.221
-rw-r--r--ponyquotes/pinkie.231
-rw-r--r--ponyquotes/pinkie.241
-rw-r--r--ponyquotes/pinkie.251
-rw-r--r--ponyquotes/pinkie.261
-rw-r--r--ponyquotes/pinkie.271
-rw-r--r--ponyquotes/pinkie.281
-rw-r--r--ponyquotes/pinkie.291
-rw-r--r--ponyquotes/pinkie.31
-rw-r--r--ponyquotes/pinkie.301
-rw-r--r--ponyquotes/pinkie.311
-rw-r--r--ponyquotes/pinkie.321
-rw-r--r--ponyquotes/pinkie.331
-rw-r--r--ponyquotes/pinkie.341
-rw-r--r--ponyquotes/pinkie.351
-rw-r--r--ponyquotes/pinkie.362
-rw-r--r--ponyquotes/pinkie.41
-rw-r--r--ponyquotes/pinkie.51
-rw-r--r--ponyquotes/pinkie.61
-rw-r--r--ponyquotes/pinkie.71
-rw-r--r--ponyquotes/pinkie.81
-rw-r--r--ponyquotes/pinkie.91
-rw-r--r--ponyquotes/pipsqueak.01
-rw-r--r--ponyquotes/pipsqueak.21
-rw-r--r--ponyquotes/ponies196
-rw-r--r--ponyquotes/rainbow.01
-rw-r--r--ponyquotes/rainbow.11
-rw-r--r--ponyquotes/rainbow.101
-rw-r--r--ponyquotes/rainbow.111
-rw-r--r--ponyquotes/rainbow.121
-rw-r--r--ponyquotes/rainbow.131
-rw-r--r--ponyquotes/rainbow.141
-rw-r--r--ponyquotes/rainbow.151
-rw-r--r--ponyquotes/rainbow.161
-rw-r--r--ponyquotes/rainbow.171
-rw-r--r--ponyquotes/rainbow.181
-rw-r--r--ponyquotes/rainbow.191
-rw-r--r--ponyquotes/rainbow.21
-rw-r--r--ponyquotes/rainbow.201
-rw-r--r--ponyquotes/rainbow.211
-rw-r--r--ponyquotes/rainbow.31
-rw-r--r--ponyquotes/rainbow.41
-rw-r--r--ponyquotes/rainbow.52
-rw-r--r--ponyquotes/rainbow.61
-rw-r--r--ponyquotes/rainbow.71
-rw-r--r--ponyquotes/rainbow.81
-rw-r--r--ponyquotes/rainbow.91
-rw-r--r--ponyquotes/rarity.01
-rw-r--r--ponyquotes/rarity.11
-rw-r--r--ponyquotes/rarity.101
-rw-r--r--ponyquotes/rarity.111
-rw-r--r--ponyquotes/rarity.121
-rw-r--r--ponyquotes/rarity.131
-rw-r--r--ponyquotes/rarity.141
-rw-r--r--ponyquotes/rarity.151
-rw-r--r--ponyquotes/rarity.161
-rw-r--r--ponyquotes/rarity.171
-rw-r--r--ponyquotes/rarity.181
-rw-r--r--ponyquotes/rarity.191
-rw-r--r--ponyquotes/rarity.21
-rw-r--r--ponyquotes/rarity.201
-rw-r--r--ponyquotes/rarity.211
-rw-r--r--ponyquotes/rarity.221
-rw-r--r--ponyquotes/rarity.231
-rw-r--r--ponyquotes/rarity.241
-rw-r--r--ponyquotes/rarity.251
-rw-r--r--ponyquotes/rarity.31
-rw-r--r--ponyquotes/rarity.45
-rw-r--r--ponyquotes/rarity.51
-rw-r--r--ponyquotes/rarity.61
-rw-r--r--ponyquotes/rarity.71
-rw-r--r--ponyquotes/rarity.81
-rw-r--r--ponyquotes/rarity.91
-rw-r--r--ponyquotes/rose.01
-rw-r--r--ponyquotes/scootaloo.01
-rw-r--r--ponyquotes/scootaloo.11
-rw-r--r--ponyquotes/scootaloo.21
-rw-r--r--ponyquotes/scootaloo.31
-rw-r--r--ponyquotes/scootaloo.41
-rw-r--r--ponyquotes/scootaloo.51
-rw-r--r--ponyquotes/scootaloo.61
-rw-r--r--ponyquotes/scootaloo.71
-rw-r--r--ponyquotes/soarin.01
-rw-r--r--ponyquotes/soarin.11
-rw-r--r--ponyquotes/soarin.21
-rw-r--r--ponyquotes/spike.01
-rw-r--r--ponyquotes/spike.11
-rw-r--r--ponyquotes/spike.21
-rw-r--r--ponyquotes/spike.31
-rw-r--r--ponyquotes/spike.41
-rw-r--r--ponyquotes/spike.51
-rw-r--r--ponyquotes/spike.61
-rw-r--r--ponyquotes/spike.71
-rw-r--r--ponyquotes/sweetie.01
-rw-r--r--ponyquotes/sweetie.11
-rw-r--r--ponyquotes/sweetie.21
-rw-r--r--ponyquotes/sweetie.31
-rw-r--r--ponyquotes/sweetie.41
-rw-r--r--ponyquotes/sweetie.51
-rw-r--r--ponyquotes/sweetie.61
-rw-r--r--ponyquotes/trixie.01
-rw-r--r--ponyquotes/trixie.11
-rw-r--r--ponyquotes/trixie.21
-rw-r--r--ponyquotes/trixie.31
-rw-r--r--ponyquotes/trixie.41
-rw-r--r--ponyquotes/trixie.51
-rw-r--r--ponyquotes/trixie.61
-rw-r--r--ponyquotes/twilight.01
-rw-r--r--ponyquotes/twilight.11
-rw-r--r--ponyquotes/twilight.103
-rw-r--r--ponyquotes/twilight.111
-rw-r--r--ponyquotes/twilight.121
-rw-r--r--ponyquotes/twilight.131
-rw-r--r--ponyquotes/twilight.141
-rw-r--r--ponyquotes/twilight.151
-rw-r--r--ponyquotes/twilight.161
-rw-r--r--ponyquotes/twilight.171
-rw-r--r--ponyquotes/twilight.181
-rw-r--r--ponyquotes/twilight.191
-rw-r--r--ponyquotes/twilight.25
-rw-r--r--ponyquotes/twilight.201
-rw-r--r--ponyquotes/twilight.211
-rw-r--r--ponyquotes/twilight.221
-rw-r--r--ponyquotes/twilight.31
-rw-r--r--ponyquotes/twilight.41
-rw-r--r--ponyquotes/twilight.51
-rw-r--r--ponyquotes/twilight.61
-rw-r--r--ponyquotes/twilight.71
-rw-r--r--ponyquotes/twilight.81
-rw-r--r--ponyquotes/twilight.91
-rw-r--r--ponyquotes/zecora.01
-rw-r--r--ponyquotes/zecora.11
-rw-r--r--ponyquotes/zecora.21
-rw-r--r--ponyquotes/zecora.31
-rw-r--r--ponyquotes/zecora.41
-rw-r--r--ponyquotes/zecora.53
-rw-r--r--ponyquotes/zecora.63
-rwxr-xr-xponysay-old.py2458
-rw-r--r--ponysay.pdfbin420178 -> 0 bytes
-rwxr-xr-xponysay.py2552
624 files changed, 3092 insertions, 3547 deletions
diff --git a/CHANGELOG b/CHANGELOG
deleted file mode 100644
index 96e3fbd..0000000
--- a/CHANGELOG
+++ /dev/null
@@ -1,417 +0,0 @@
-Version 2.9.1
-
- Bug fix: correction in the -W option broke the -o option.
-
-
-Version 2.9
-
- New ponies: pinkieumbrelahatfear, twilighttime
-
- New extraponies: molestia (Tumblr)
-
- The option -q works like -f and -F, it takes one argument, and may be used multiple
- times for more arguments.
-
- The old option -q is renamed to --q.
-
- The options --f and --F has been added.
-
- Weighted distance for autocorrection on pony names and boolean style name is set to 5, rather
- than unlimited. Currently this cannot be modified (without editing the source code.)
-
- If file descriptor 3 is definied when ponysay is executed, extra information is printed to it.
-
- Arguments starting with n or i is allowed for -W.
-
-
-Version 2.8
-
- New ponies: airheart, bastionyorsets, gustavelegrand, milkyway, peppermoon, pinkacopter, pinkiefly,
- pinkieparade, pinkieumbrellahat, raritycomplaining, shiningarmorwedding, soarinofficer,
- starlight, sunnyrays, sweatiesing, tenderheart, tom, twilightspike, zecorabalance
-
- New extraponies: applejack (Tumblr), applejack-63, artemis, blueberry, butterscotch,
- drhoovesdiscorded (Tumblr), duskshine, elusive, rainbowblitz
-
- Pony symlink added: georgewachingtony → bastionyorsets
-
- Support for explicit hypthenation using soft hyphens had been added to the word wrapper.
-
- Support for explicit non-word wrapping using non-breaking space had been added to the word wrapper.
-
- The word wrapper colours the inserted hyphens in red.
-
- Support for terminal capabilities emulation with the flags -X, -V and -K.
-
- Support for printing just the pony, using the flag -o.
-
- Colouring option flags are added.
-
- Automatic correction of incorrectly spelled pony names and balloon style names added.
-
-
-Version 2.7
-
- New ponies: basil, cloudkicker, cerberus, cow, derpysad, flowertrio, frederickhorseshoepin,
- horsemd, jeffletroski, jesuspezuna, joe, joetuxedo, manticore, meadowsong,
- meliot, pinkiegummydisguise, seaswirl, theodoredonaldkerabatsos, turf,
- waltercoltchak
-
- New extraponies: blueballblitz (Various fanfics, Shadowbolt), drhooves1, drhooves2, drhooves3,
- drhooves4, drhooves5, drhooves6, drhooves7, drhooves8, drhooves9, drhooves10,
- drhooves11, nyx (Fanfic: Past Sins), nyxdisguised (Fanfic: Past Sins),
- pinkaminacupcake (Fanfic)
-
- Pony renamed: cracky to crackle
-
-
-Version 2.6
-
- New ponies: applebloomdance, blueberry, blueberrycake, blueharvest, candylicious,
- cherrycola, cracky, cutiemarkcrusaders, derpybags, derpycloud, firestreak,
- hughjelly, lemonhearts, lyrabonbon, noi, pictureperfect, pigpen,
- poppycock, quickfix, rainbowhurricane, rainboshadowbolt, silverspeed,
- surprise (wonderbolt), thunderlane, timeturner, twilightthebearded
-
- New extraponies: faust (alicorn), maria (Moonstuck, seapony), posey (Tumblr),
- slanderpony (Various tumblr), sparkler (Tumblr), twilight (Tumblr)
-
- Pony symlink added: bonbonlyra → lyrabonbon
- clockwork → quickfix
- drhooves → timeturner
- epona → quickfix
- lotusbloosom → lotus
-
- doctor and doctornohat has become extraponies, because their mane style is
- different from in the TV show. And timeturner no longer links to any of them.
-
- ./configure and make is no longer support.
-
-
-Version 2.5.1
-
- New extra ponies: sealyra
-
- Build system as compatibility with standard GNU Make build system.
-
-
-Version 2.5
-
- Brand new highly configurable build system.
-
- UTF-8 as I/O encoding is enforced. (Critical bug fix for ASCII locale users.)
-
-
-Version 2.4
-
- Nothing worth mentioning.
-
- Note: Identifies itself as version 2.3
-
-
-Version 2.3
-
- Support for 'best.pony' file.
-
- `-q` accepts file names.
-
- Improved Unicode support: treats combining characters as invisible.
-
- Optional support for UCS pony names.
-
- Pony files and balloon style files can be pipes (as
- well as sockets, doors and as always regular files.)
-
- Support cowsay style message compression.
-
- New ponies: blaze
-
- New extraponies: fyrefly (Tumblr), surprise (Tumblr), woona (Moonstuck),
- woonanohat (Moonstuck)
-
- Pony symlink added: pinkieoink → oinkoinkoink
-
- Support for non-MLP:FiM ponies (known as extraponies).
-
-
-Version 2.2
-
- Full support for arbitrary positioning of balloon in pony files.
-
- ANSI colour sequences in pony files are applied only to the pony image,
- not the balloon link or the balloon itself.
-
- Support for colours in the message.
-
- Support custom balloon styles using the option '-b', '-B' will list all
- available. This list depends on whether you are invoking `ponysay` or `ponythink`.
-
-
-Version 2.1.1
-
- Nothing worth mentioning.
-
-
-Version 2.1
-
- Pony renamed: applebumkin to applebumpkin
-
- New ponies: purplehaze, owlowiscious
-
- Cowsay has be reimplemented, and have full Unicode support
- and support for @code{figlet} style messages.
-
- Deleted environment variables: PONYSAY_COWSAY, PONYSAY_COWTHINK
-
- You will need Python 3, but not GNU Bash, Perl or Cowsay.
-
- New .pony file format is used.
-
-
-Version 2.0
-
- Makefile is generated by running `./configure`.
-
- All Perl scripts and almost all Bash are reimplemented in one Python 3 script.
-
- kmsponies4ponysay is included.
-
-
-Version 1.4.1
-
- Code is repaired and more portable.
-
-
-Version 1.4
-
- Make file is improved.
-
- Note: Identifies itself as version 1.3
-
-
-Version 1.3
-
- New ponies: forestspirit, hollydash, raggedy, rhyme
-
- Pony renamed: sindy to powderrouge
-
- Pony symlink added: sindy → powderrouge
-
- PREFIX=/some-dir can be used when invoking make, the default value is /usr
-
-
-Version 1.2
-
- ponyquotes4ponysay is included.
-
- Support for extension: kmsponies4ponysay.
-
- New ponies: ace, filthyrich, blueblood, gingergold, hayfever,
- highscore, junebug, mrsparkle, persnickety, ponet,
- screwloose, tornadobolt.
-
- Pony renamed: elsie to prettyvision
-
- Pony symlinks added: mrsparkle → nightlight
- elsie → prettyvision
-
- Arbitrary spaces in '-f' argument is not longer accepted (it causes
- problems with file names including spaces).
-
- Note: Identifies itself as version 1.1
-
-
-Version 1.1
-
- Manpages are compressed before installation.
-
- 'info manual' added.
-
- Shell completion for 'ponythink' added, in addition to 'ponysay'.
-
- 'fish' completion added.
-
- '/usr/lib/ponysay' is used instead of '/usr/bin'
- for code used by the main script.
-
- '~/.local/share/ponysay is used for private pony directories.
-
- 'ncurses' is no longer needed for determining the screen's size,
- 'coreutils' is used instead.
-
- Pony symlinks added: amethyststar → sparkler
- berrypinch → ruby
- craftycrate → boxxy
- magnum → raritysdad
- pearl → raritysmom
- powderrouge → sindy
- royalribbo → violet
-
- New ponies: blossomforth, bonvoyage, cadance, celestiasmall,
- changelingqueen, cherryberry, discordamused,
- discordpuppetmaster, fleurdelishair, fleurdelislay,
- owl, perrypierce, petunia, pinacolada, skyra,
- truffleshuffle.
-
- Pony spelling removed: fillycadence.
-
- Pony symlink change: perry → (pokey → perrypierce).
-
- Option '-L' added, lists ponies with symlink mapping.
-
- Support for extension: ponyquotes4ponysay.
-
- Accepts arbitrary spaces in '-f' argument.
-
-
-Version 1.0
-
- Spanish translation of the manpage is added.
-
- New ponies: applecore, applejackscarecrow, bonbonstand, changeling,
- chrysalis, cottoncloudy, diamondmint, discord,
- fillycadence, flam, fleurdelis, flim, fluttershyshy,
- fluttershystare, lyrasit, oinkoinkoink (is pinkie),
- philomenaphoenix, pinkiecannon, pinkiecannonfront,
- pinkiecannonhappy, pinkiegummy, pinkiehugfluttershy,
- pinkiehugsfluttershy, pinkiepartycannon, pinkieprincess,
- pinkiesilly, pinkietongue, pinkiewhoops, pinkiewhoopseat,
- pinkiewhoopsout, rainbowdrag, rainbowsalute, rainbowshine,
- raritydrama, shiningarmor, shiningarmorguard, snowflak,
- spikemustache, stevenmagnet, stevenmagnettrue,
- twilightcrazyfromball, twilightrage, twilightzero,
- wildfire.
-
- Pony symlinks added: djpon-3 → vinyl
- fillycadance → fillycadence
- horsepower → snowflake
-
- Improved TTY support: ponies have low colours resolution, instead
- of monochrome, when the high colour resolution is not available.
-
-
-Version 0.10
-
- Manpage manual added.
-
- The directories for pony directories are changed
- from '/usr/share' to '/usr/share/ponysay' and '~' to '~/.ponysay'.
-
- Pony symlinks added: carrottop → carrot
- goldenharvest → carrot
- harpass → lyra
- heartstrings → lyra
- lulamoon → trixie
- minuette → colgate
- noteworthy → blues
- perry → pokey
- pokeypierce → pokey
- timeturner → doctornohat
- trixielulamoon → trixie
- twilightvelvet → mrssparkle
-
- Support for truncating output on height, enabled by default under TTY.
-
- Environment variables added: 'PONYSAY_FULL_WIDTH',
- 'PONYSAY_SHELL_LINES', 'PONYSAY_TRUNCATE_HEIGHT', 'PONYSAY_BOTTOM'.
-
-
-Version 0.9
-
- Output truncated on width to fit screen.
-
- Support for TTY (Linux VT).
-
- 'bash' completion added.
-
- 'zsh' completion added.
-
- New ponies: allie, archer, boxxy, carecake, cupcake, daringdo,
- davenport, fancypants, ironwillwalk, lily, lunafly,
- maredowellfly, maredowellgallop, master, mjolna,
- orange, raritysdad, raritysmom, royalnightguard,
- ruby, sparkler, violet.
-
-
-Version 0.8
-
- New ponies: aloe, angle, applebloom, applebumkin, applefritter,
- berrypunch, bigmac, blinkie, blues, braeburn, caesar,
- candymane, caramel, cheerilee, cheerilee80, clyde,
- colgate, colton, daisy, derpystand, derpystandwing,
- diamondtiara, dinky, doctornohat, elsie, fido,
- fillycelestia, fillydash, fillydashfly, fillyjack,
- fillyjacktravel, fillypinkie, fillypinkiecurly,
- fillyrarity, fillyshy, fluttershygala, gilda, gildastand,
- granny, grannychair, grannysleep, gummy, hoity, horte,
- inky, laflour, lightning, lintsalot, lotus, mayor,
- mrssparkle, nightmare, opal, parasprite, philomena,
- photofinish, pinkamina, pinkiebounce, pinkiechicken,
- pinkiegala, pipsqueak, pokey, rainbowfly, rainbowgala,
- rainbowsleep, raindrops, rarityfly, raritygala,
- rarityponder, redheart, rocky, rose, rover, royalguard,
- sapphire, scootaloo, screwball, shadowbolts, silverspoon,
- silverstar, sindy, snails, snips, soarin, soigne, spike,
- spikefloat, spikelove, spot, stella, strongheart, sue,
- suedance, tank, trixiestage, trixiestand, turnip, twist,
- winona.
-
- Note: Identifies itself as version 0.7
-
-
-Version 0.7
-
- New ponies: carrot, octavia, trixie, vinyl, zecora.
-
- Support for listing ponies with '-l' option.
-
-
-Version 0.6
-
- New ponies: bonbon, celestia, doctor, fillistia,
- spitfire, woona (not moonstuck).
-
- Dropping usage of utility 'which', using 'hash' instead.
-
- Note: Identifies itself as version 0.5
-
-
-Version 0.5
-
- Using utility 'which' to determine existance of 'cowsay'.
-
-
-Version 0.4
-
- '.cow' files are removed.
-
- Support for '-W' option.
-
- Select random pony if not specified.
-
- Added command '-f' for supports file names, and not only pony names.
-
-
-Version 0.3
-
- Fixed use of '.pony' files.
-
-
-Version 0.2
-
- Pony files end with '.pony' instead of '.cow'.
-
- lyrasleep is renamed to lyra.
-
- '.cow' files are kept but not used.
-
- Added option '-h' prints proper help.
-
-
-Version 0.1
-
- First release.
-
- Includes the ponies: applejack, derpy, derpysit, fluttershy,
- luna, lyrasleep, pinkie, rainbow, rarity,
- sweetie, twilight.
diff --git a/CREDITS b/CREDITS
index a76e27d..a32edbf 100644
--- a/CREDITS
+++ b/CREDITS
@@ -1,6 +1,7 @@
# Pretty much all the contributors in alphabetic order.
# Active developers
+Sebastian Götte
Erkin Batu Altunbaş
Mattias Andrée
Elis Axelsson
diff --git a/README.md b/README.md
index e7ef729..25c4609 100644
--- a/README.md
+++ b/README.md
@@ -20,22 +20,9 @@ In order to use ponysay, run:
Or if you have a specific pony in your mind:
- ponysay -f pinkie "Partay!~"
+ ponysay -p pinkie "Partay!~"
Run `info ponysay`, `man 6 ponysay` or `ponysay -h` for more information.
-A Spanish manual is available: `man -L es 6 ponysay`.
-
-#### Arch Linux
-The package is in the official repositories as `community/ponysay`, there is also a git version named `ponysay-git` in AUR.
-
-#### Chakra
-A git version of the package is available as `ponysay-git` in CCR, alongside a stable package as `ponysay`.
-
-#### Gentoo Linux
-There is a package for Gentoo, to make installation and keeping it up to date easy. You can find it in [this overlay](/etu/aidstu-overlay). The package is named `games-misc/ponysay`.
-
-#### Debian GNU/Linux and Ubuntu
-The DEB file can be found [here](http://roryholland.co.uk/misc.html#ponysay) and PPA:s can be found [here](https://launchpad.net/~vincent-c/+archive/ppa) and [here](https://launchpad.net/~blazemore/+archive/ponysay).
### Pony fortune on terminal startup
diff --git a/dev/dist.sh b/dev/dist.sh
deleted file mode 100755
index 3beceda..0000000
--- a/dev/dist.sh
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/env bash
-
-# USAGE: dev/dist.sh ttyponies
-# or dev/dist.sh pdfmanual
-# or dev/dist.sh tag VERSION [OTHER OPTIONS FOR `git tag`]
-# or dev/dist.sh beigepdf
-
-
-ttyponies()
-{
- mkdir -p "ttyponies"
- for pony in $(ls --color=no "ponies/"); do
- if [ ! "$pony" = '.info' ]; then
- echo "building ttypony: $pony"
- if [ "`readlink "ponies/$pony"`" = '' ]; then
- ponysay2ttyponysay < "ponies/$pony" | tty2colourfultty -c 1 > "ttyponies/$pony"
- git add "ttyponies/$pony"
- else
- ln -sf `readlink "ponies/$pony"` "ttyponies/$pony"
- git add "ttyponies/$pony"
- fi
- fi
- done
- mkdir -p "extrattyponies"
- for pony in $(ls --color=no "extraponies/"); do
- if [ ! "$pony" = '.info' ]; then
- echo "building extrattypony: $pony"
- if [ "`readlink "extraponies/$pony"`" = '' ]; then
- ponysay2ttyponysay < "extraponies/$pony" | tty2colourfultty -c 1 > "extrattyponies/$pony"
- git add "extrattyponies/$pony"
- else
- ln -sf `readlink "extraponies/$pony"` "extrattyponies/$pony"
- git add "extrattyponies/$pony"
- fi
- fi
- done
-}
-
-
-pdfmanual()
-{
- texi2pdf "manuals/ponysay.texinfo"
- for ext in `echo aux cp cps fn ky log pg toc tp vr op ops pgs vrs bak`; do
- if [ -f "ponysay.$ext" ]; then
- unlink "ponysay.$ext"
- fi
- done
- if [ -d "ponysay.t2d" ]; then
- rm -r "ponysay.t2d";
- fi
- git add "manuals/ponysay.texinfo" "ponysay.pdf"
-}
-
-
-beigepdf()
-{
- pdfjam --pagecolor 249,246,240 -o "ponysay+beige.pdf" "ponysay.pdf"
-}
-
-
-pdf()
-{
- pdfmanual "$@"
-}
-
-
-tag()
-{
- version=`./setup.py version`
- if [ "$version" = 'Ponysay '"$1"' installer' ]; then
- git tag -a "$@" && git checkout "$1" && git push -u origin "$1"
- else
- echo 'Setup script reports. '"$version"
- echo 'This is not consistent with desired tag version: '"$1"
- echo 'Make sure the version is correct in setup.py and that all change logs are up to date'
- fi
-}
-
-
-[ "$1" = './dist.sh' ] && cd ..
-"$@"
diff --git a/dev/spell.sh b/dev/spell.sh
deleted file mode 100755
index 9fe617e..0000000
--- a/dev/spell.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-en="en_GB-ise-w_accents"
-
-
-info()
-{
- if [ -f "./manuals/ponysay.texinfo" ]; then
- aspell --lang="$en" check "./manuals/ponysay.texinfo"
- git add "./manuals/ponysay.texinfo"
- elif [ -f "../manuals/ponysay.texinfo" ]; then
- aspell --lang="$en" check "../manuals/ponysay.texinfo"
- git add "../manuals/ponysay.texinfo"
- else
- echo "spell.sh: unable to find document: ponysay.texinfo" >&2
- exit -1
- fi
-}
-
-
-man()
-{
- lang="$1"
- langarg="$1"
- if [ ! "$lang" = "" ]; then
- lang=".$lang"
- else
- langarg="$en"
- fi
-
- if [ -f "./manuals/manpage${lang}.6" ]; then
- aspell --lang="${langarg}" check "./manuals/manpage${lang}.6"
- git add "./manuals/manpage${lang}.6"
- elif [ -f "../manuals/manpage${lang}.6" ]; then
- aspell --lang="${langarg}" check "../manuals/manpage${lang}.6"
- git add "../manuals/manpage${lang}.6"
- else
- echo "spell.sh: unable to find document: manpage${lang}.6" >&2
- exit -1
- fi
-}
-
-
-"$@"
diff --git a/ponyquotes/doctor.0 b/extraponies/doctor.quotes
index 347d379..347d379 100644
--- a/ponyquotes/doctor.0
+++ b/extraponies/doctor.quotes
diff --git a/ttyponies/ace.pony b/ponies/ace.ttypony
index b57f6ba..b57f6ba 100644
--- a/ttyponies/ace.pony
+++ b/ponies/ace.ttypony
diff --git a/ttyponies/airheart.pony b/ponies/airheart.ttypony
index 40487ba..40487ba 100644
--- a/ttyponies/airheart.pony
+++ b/ponies/airheart.ttypony
diff --git a/ttyponies/allie.pony b/ponies/allie.ttypony
index a5567e6..a5567e6 100644
--- a/ttyponies/allie.pony
+++ b/ponies/allie.ttypony
diff --git a/ttyponies/aloe.pony b/ponies/aloe.ttypony
index 38a7e3c..38a7e3c 100644
--- a/ttyponies/aloe.pony
+++ b/ponies/aloe.ttypony
diff --git a/ttyponies/amethyststar.pony b/ponies/amethyststar.ttypony
index 196d416..196d416 120000
--- a/ttyponies/amethyststar.pony
+++ b/ponies/amethyststar.ttypony
diff --git a/ttyponies/angel.pony b/ponies/angel.ttypony
index 38a1823..38a1823 100644
--- a/ttyponies/angel.pony
+++ b/ponies/angel.ttypony
diff --git a/ponies/applebloom.quotes b/ponies/applebloom.quotes
new file mode 100644
index 0000000..f356526
--- /dev/null
+++ b/ponies/applebloom.quotes
@@ -0,0 +1,17 @@
+Aren't you gonna stay for brunch?
+
+But I want it now!
+
+I am a big pony!
+
+I'm not a baby, I can take care of myself!
+
+Likely story.
+
+Not the cupcakes! Trust me.
+
+Somepony needs to put this thing out of its misery.
+
+You're not using power tools, are you?
+
+Scootaloo! Scoot-Scootaloo!
diff --git a/ttyponies/applebloom.pony b/ponies/applebloom.ttypony
index 3ec5808..3ec5808 100644
--- a/ttyponies/applebloom.pony
+++ b/ponies/applebloom.ttypony
diff --git a/ttyponies/applebloomdance.pony b/ponies/applebloomdance.ttypony
index d2675d0..d2675d0 100644
--- a/ttyponies/applebloomdance.pony
+++ b/ponies/applebloomdance.ttypony
diff --git a/ttyponies/applebumpkin.pony b/ponies/applebumpkin.ttypony
index b43d8c4..b43d8c4 100644
--- a/ttyponies/applebumpkin.pony
+++ b/ponies/applebumpkin.ttypony
diff --git a/ttyponies/applecore.pony b/ponies/applecore.ttypony
index 7c6ee55..7c6ee55 100644
--- a/ttyponies/applecore.pony
+++ b/ponies/applecore.ttypony
diff --git a/ttyponies/applefritter.pony b/ponies/applefritter.ttypony
index d89b4b9..d89b4b9 100644
--- a/ttyponies/applefritter.pony
+++ b/ponies/applefritter.ttypony
diff --git a/ponies/applejack.quotes b/ponies/applejack.quotes
new file mode 100644
index 0000000..90082f5
--- /dev/null
+++ b/ponies/applejack.quotes
@@ -0,0 +1,19 @@
+Don't you use your fancy mathematics to muddy the issue!
+
+‘Dressed’? Um, beg your pardon, Rarity, but we don't normally wear clothes.
+
+The same way [Discord] got you to think that cheap rock was a bona fide diamond.
+
+If you can take this bull by the horns you better be ready for a ride!
+
+Can't hear you! I'm asleep! *SNORE*
+
+Don't you use your fancy mathematics to muddle the issue!
+
+I hate to say I told you so. But I told you so.
+
+We don't normally wear clothes
+
+I knew you could do it.
+
+Who are you calling a baby?
diff --git a/ttyponies/applejack.pony b/ponies/applejack.ttypony
index 083b32a..083b32a 100644
--- a/ttyponies/applejack.pony
+++ b/ponies/applejack.ttypony
diff --git a/ttyponies/applejackscarecrow.pony b/ponies/applejackscarecrow.ttypony
index 2744fdc..2744fdc 100644
--- a/ttyponies/applejackscarecrow.pony
+++ b/ponies/applejackscarecrow.ttypony
diff --git a/ttyponies/archer.pony b/ponies/archer.ttypony
index 7d79af0..7d79af0 100644
--- a/ttyponies/archer.pony
+++ b/ponies/archer.ttypony
diff --git a/ttyponies/basil.pony b/ponies/basil.ttypony
index a78f7b4..a78f7b4 100644
--- a/ttyponies/basil.pony
+++ b/ponies/basil.ttypony
diff --git a/ttyponies/bastionyorsets.pony b/ponies/bastionyorsets.ttypony
index 2e4bfcf..2e4bfcf 100644
--- a/ttyponies/bastionyorsets.pony
+++ b/ponies/bastionyorsets.ttypony
diff --git a/ttyponies/berrypinch.pony b/ponies/berrypinch.ttypony
index 0e63199..0e63199 120000
--- a/ttyponies/berrypinch.pony
+++ b/ponies/berrypinch.ttypony
diff --git a/ttyponies/berrypunch.pony b/ponies/berrypunch.ttypony
index 5fbdd27..5fbdd27 100644
--- a/ttyponies/berrypunch.pony
+++ b/ponies/berrypunch.ttypony
diff --git a/ponies/bigmac.quotes b/ponies/bigmac.quotes
new file mode 100644
index 0000000..118e677
--- /dev/null
+++ b/ponies/bigmac.quotes
@@ -0,0 +1,9 @@
+Ayup.
+
+Nope.
+
+Biting off more than you can chew is just what I'm afraid of.
+
+One pony plus hundreds of appletrees just doesn't add up.
+
+Too big for you to handle on your own.
diff --git a/ttyponies/bigmac.pony b/ponies/bigmac.ttypony
index 1cab7cd..1cab7cd 100644
--- a/ttyponies/bigmac.pony
+++ b/ponies/bigmac.ttypony
diff --git a/ttyponies/blaze.pony b/ponies/blaze.ttypony
index 64c6ef6..64c6ef6 100644
--- a/ttyponies/blaze.pony
+++ b/ponies/blaze.ttypony
diff --git a/ttyponies/blinkie.pony b/ponies/blinkie.ttypony
index 648921b..648921b 100644
--- a/ttyponies/blinkie.pony
+++ b/ponies/blinkie.ttypony
diff --git a/ttyponies/blossomforth.pony b/ponies/blossomforth.ttypony
index f1e6de5..f1e6de5 100644
--- a/ttyponies/blossomforth.pony
+++ b/ponies/blossomforth.ttypony
diff --git a/ttyponies/blueberry.pony b/ponies/blueberry.ttypony
index a66437c..a66437c 100644
--- a/ttyponies/blueberry.pony
+++ b/ponies/blueberry.ttypony
diff --git a/ttyponies/blueberrycake.pony b/ponies/blueberrycake.ttypony
index a2a47a4..a2a47a4 100644
--- a/ttyponies/blueberrycake.pony
+++ b/ponies/blueberrycake.ttypony
diff --git a/ttyponies/blueblood.pony b/ponies/blueblood.ttypony
index 1aae269..1aae269 100644
--- a/ttyponies/blueblood.pony
+++ b/ponies/blueblood.ttypony
diff --git a/ttyponies/blueharvest.pony b/ponies/blueharvest.ttypony
index 53d465e..53d465e 100644
--- a/ttyponies/blueharvest.pony
+++ b/ponies/blueharvest.ttypony
diff --git a/ttyponies/blues.pony b/ponies/blues.ttypony
index e3d1c85..e3d1c85 100644
--- a/ttyponies/blues.pony
+++ b/ponies/blues.ttypony
diff --git a/ponyquotes/bonbon.0 b/ponies/bonbon.quotes
index 839902e..a5581c8 100644
--- a/ponyquotes/bonbon.0
+++ b/ponies/bonbon.quotes
@@ -1 +1,3 @@
Is Fluttershy still here? We heard Fluttershy was here!
+
+I didn't put those in my bag.
diff --git a/ttyponies/bonbon.pony b/ponies/bonbon.ttypony
index 336696e..336696e 100644
--- a/ttyponies/bonbon.pony
+++ b/ponies/bonbon.ttypony
diff --git a/ttyponies/bonbonlyra.pony b/ponies/bonbonlyra.ttypony
index 8a478f8..8a478f8 120000
--- a/ttyponies/bonbonlyra.pony
+++ b/ponies/bonbonlyra.ttypony
diff --git a/ttyponies/bonbonstand.pony b/ponies/bonbonstand.ttypony
index 66bb0e3..66bb0e3 100644
--- a/ttyponies/bonbonstand.pony
+++ b/ponies/bonbonstand.ttypony
diff --git a/ttyponies/bonvoyage.pony b/ponies/bonvoyage.ttypony
index 83b3561..83b3561 100644
--- a/ttyponies/bonvoyage.pony
+++ b/ponies/bonvoyage.ttypony
diff --git a/ttyponies/boxxy.pony b/ponies/boxxy.ttypony
index ac5e286..ac5e286 100644
--- a/ttyponies/boxxy.pony
+++ b/ponies/boxxy.ttypony
diff --git a/ponies/braeburn.quotes b/ponies/braeburn.quotes
new file mode 100644
index 0000000..7cd50b8
--- /dev/null
+++ b/ponies/braeburn.quotes
@@ -0,0 +1,5 @@
+Shame on you!
+
+'Taint fair!
+
+Welcome to Appleoosa!
diff --git a/ttyponies/braeburn.pony b/ponies/braeburn.ttypony
index 71797ec..71797ec 100644
--- a/ttyponies/braeburn.pony
+++ b/ponies/braeburn.ttypony
diff --git a/ttyponies/cadance.pony b/ponies/cadance.ttypony
index ebd4633..ebd4633 100644
--- a/ttyponies/cadance.pony
+++ b/ponies/cadance.ttypony
diff --git a/ttyponies/caesar.pony b/ponies/caesar.ttypony
index 8d3f5e3..8d3f5e3 100644
--- a/ttyponies/caesar.pony
+++ b/ponies/caesar.ttypony
diff --git a/ttyponies/candylicious.pony b/ponies/candylicious.ttypony
index a3c9302..a3c9302 100644
--- a/ttyponies/candylicious.pony
+++ b/ponies/candylicious.ttypony
diff --git a/ttyponies/candymane.pony b/ponies/candymane.ttypony
index bba4e76..bba4e76 100644
--- a/ttyponies/candymane.pony
+++ b/ponies/candymane.ttypony
diff --git a/ttyponies/caramel.pony b/ponies/caramel.ttypony
index 3ac9092..3ac9092 100644
--- a/ttyponies/caramel.pony
+++ b/ponies/caramel.ttypony
diff --git a/ttyponies/carecake.pony b/ponies/carecake.ttypony
index 2b8bafa..2b8bafa 100644
--- a/ttyponies/carecake.pony
+++ b/ponies/carecake.ttypony
diff --git a/ponyquotes/carrot.1 b/ponies/carrot.quotes
index 5b907f0..df13f8e 100644
--- a/ponyquotes/carrot.1
+++ b/ponies/carrot.quotes
@@ -1 +1,3 @@
+Welcome, Princess Celest!
+
We couldn't fit it all in.
diff --git a/ttyponies/carrot.pony b/ponies/carrot.ttypony
index 0df07ec..0df07ec 100644
--- a/ttyponies/carrot.pony
+++ b/ponies/carrot.ttypony
diff --git a/ttyponies/carrottop.pony b/ponies/carrottop.ttypony
index 222bb68..222bb68 120000
--- a/ttyponies/carrottop.pony
+++ b/ponies/carrottop.ttypony
diff --git a/ponyquotes/celestia.0 b/ponies/celestia.quotes
index 20ae8ff..f4c2d2c 100644
--- a/ponyquotes/celestia.0
+++ b/ponies/celestia.quotes
@@ -3,3 +3,11 @@ up to him, he ruled Equestria in an eternal state of unrest, and unhappiness.
Luna and I saw how miserable life was for Earth ponies, pegasi, and unicorns
alike. So after discovering the Elements of Harmony, we combined our power and
rose up against him, turning him to stone!
+
+Gotcha!
+
+These creatures are adorable!
+
+I want you right by my side the entire evening.
+
+Will you accept my friendship?
diff --git a/ttyponies/celestia.pony b/ponies/celestia.ttypony
index bc549d2..bc549d2 100644
--- a/ttyponies/celestia.pony
+++ b/ponies/celestia.ttypony
diff --git a/ttyponies/celestiasmall.pony b/ponies/celestiasmall.ttypony
index 4b107ca..4b107ca 100644
--- a/ttyponies/celestiasmall.pony
+++ b/ponies/celestiasmall.ttypony
diff --git a/ttyponies/cerberus.pony b/ponies/cerberus.ttypony
index 956c109..956c109 100644
--- a/ttyponies/cerberus.pony
+++ b/ponies/cerberus.ttypony
diff --git a/ttyponies/changeling.pony b/ponies/changeling.ttypony
index 5592513..5592513 100644
--- a/ttyponies/changeling.pony
+++ b/ponies/changeling.ttypony
diff --git a/ttyponies/changelingqueen.pony b/ponies/changelingqueen.ttypony
index 0f84061..0f84061 100644
--- a/ttyponies/changelingqueen.pony
+++ b/ponies/changelingqueen.ttypony
diff --git a/ponyquotes/cheerilee.0 b/ponies/cheerilee.quotes
index 48be0dc..ed6d146 100644
--- a/ponyquotes/cheerilee.0
+++ b/ponies/cheerilee.quotes
@@ -1 +1,3 @@
Honestly, that's how everypony was wearing their mane back then.
+
+Everypony should get fun gifts on their birthday.
diff --git a/ttyponies/cheerilee.pony b/ponies/cheerilee.ttypony
index 55ca4a2..55ca4a2 100644
--- a/ttyponies/cheerilee.pony
+++ b/ponies/cheerilee.ttypony
diff --git a/ttyponies/cheerilee80.pony b/ponies/cheerilee80.ttypony
index 401893a..401893a 100644
--- a/ttyponies/cheerilee80.pony
+++ b/ponies/cheerilee80.ttypony
diff --git a/ttyponies/cherryberry.pony b/ponies/cherryberry.ttypony
index 01c1cd3..01c1cd3 100644
--- a/ttyponies/cherryberry.pony
+++ b/ponies/cherryberry.ttypony
diff --git a/ttyponies/cherrycola.pony b/ponies/cherrycola.ttypony
index 7b4bcd8..7b4bcd8 100644
--- a/ttyponies/cherrycola.pony
+++ b/ponies/cherrycola.ttypony
diff --git a/ponyquotes/chrysalis.0 b/ponies/chrysalis.quotes
index fb09aa6..1b24bb5 100644
--- a/ponyquotes/chrysalis.0
+++ b/ponies/chrysalis.quotes
@@ -3,3 +3,4 @@ The kind of day I've dreamed since I was small
Everypony I'll soon control
Every Stallion, mare and foal
Who says a girl can't really have it all?
+
diff --git a/ttyponies/chrysalis.pony b/ponies/chrysalis.ttypony
index 75d815f..75d815f 100644
--- a/ttyponies/chrysalis.pony
+++ b/ponies/chrysalis.ttypony
diff --git a/ttyponies/clockwork.pony b/ponies/clockwork.ttypony
index 1b02864..1b02864 120000
--- a/ttyponies/clockwork.pony
+++ b/ponies/clockwork.ttypony
diff --git a/ttyponies/cloudkicker.pony b/ponies/cloudkicker.ttypony
index fcd9650..fcd9650 100644
--- a/ttyponies/cloudkicker.pony
+++ b/ponies/cloudkicker.ttypony
diff --git a/ttyponies/clyde.pony b/ponies/clyde.ttypony
index 464fdd4..464fdd4 100644
--- a/ttyponies/clyde.pony
+++ b/ponies/clyde.ttypony
diff --git a/ttyponies/colgate.pony b/ponies/colgate.ttypony
index b019d08..b019d08 100644
--- a/ttyponies/colgate.pony
+++ b/ponies/colgate.ttypony
diff --git a/ttyponies/colton.pony b/ponies/colton.ttypony
index 3942830..3942830 100644
--- a/ttyponies/colton.pony
+++ b/ponies/colton.ttypony
diff --git a/ttyponies/cottoncloudy.pony b/ponies/cottoncloudy.ttypony
index 0b6b2f2..0b6b2f2 100644
--- a/ttyponies/cottoncloudy.pony
+++ b/ponies/cottoncloudy.ttypony
diff --git a/ttyponies/cow.pony b/ponies/cow.ttypony
index 7c77ed0..7c77ed0 100644
--- a/ttyponies/cow.pony
+++ b/ponies/cow.ttypony
diff --git a/ttyponies/crackle.pony b/ponies/crackle.ttypony
index 18a3d47..18a3d47 100644
--- a/ttyponies/crackle.pony
+++ b/ponies/crackle.ttypony
diff --git a/ttyponies/craftycrate.pony b/ponies/craftycrate.ttypony
index 00fc48b..00fc48b 120000
--- a/ttyponies/craftycrate.pony
+++ b/ponies/craftycrate.ttypony
diff --git a/ttyponies/cupcake.pony b/ponies/cupcake.ttypony
index 7f49a2f..7f49a2f 100644
--- a/ttyponies/cupcake.pony
+++ b/ponies/cupcake.ttypony
diff --git a/ttyponies/cutiemarkcrusaders.pony b/ponies/cutiemarkcrusaders.ttypony
index f779c21..f779c21 100644
--- a/ttyponies/cutiemarkcrusaders.pony
+++ b/ponies/cutiemarkcrusaders.ttypony
diff --git a/ttyponies/daisy.pony b/ponies/daisy.ttypony
index 122f4c8..122f4c8 100644
--- a/ttyponies/daisy.pony
+++ b/ponies/daisy.ttypony
diff --git a/ttyponies/daringdo.pony b/ponies/daringdo.ttypony
index b738b08..b738b08 100644
--- a/ttyponies/daringdo.pony
+++ b/ponies/daringdo.ttypony
diff --git a/ttyponies/davenport.pony b/ponies/davenport.ttypony
index 1922cf6..1922cf6 100644
--- a/ttyponies/davenport.pony
+++ b/ponies/davenport.ttypony
diff --git a/ponies/derpy.quotes b/ponies/derpy.quotes
new file mode 100644
index 0000000..6db4969
--- /dev/null
+++ b/ponies/derpy.quotes
@@ -0,0 +1,9 @@
+Muffin...
+
+I don't know what went wrong!
+
+You okay Rainbow Dash? Anything I can do to help?
+
+I just don't know what went wrong!
+
+Are you okey Applejack, anything I can do to help?
diff --git a/ttyponies/derpy.pony b/ponies/derpy.ttypony
index 4908575..4908575 100644
--- a/ttyponies/derpy.pony
+++ b/ponies/derpy.ttypony
diff --git a/ttyponies/derpybags.pony b/ponies/derpybags.ttypony
index c2d1b53..c2d1b53 100644
--- a/ttyponies/derpybags.pony
+++ b/ponies/derpybags.ttypony
diff --git a/ttyponies/derpycloud.pony b/ponies/derpycloud.ttypony
index 55fd97b..55fd97b 100644
--- a/ttyponies/derpycloud.pony
+++ b/ponies/derpycloud.ttypony
diff --git a/ttyponies/derpysad.pony b/ponies/derpysad.ttypony
index 9dd634f..9dd634f 100644
--- a/ttyponies/derpysad.pony
+++ b/ponies/derpysad.ttypony
diff --git a/ttyponies/derpysit.pony b/ponies/derpysit.ttypony
index 819ba1d..819ba1d 100644
--- a/ttyponies/derpysit.pony
+++ b/ponies/derpysit.ttypony
diff --git a/ttyponies/derpystand.pony b/ponies/derpystand.ttypony
index 92581ec..92581ec 100644
--- a/ttyponies/derpystand.pony
+++ b/ponies/derpystand.ttypony
diff --git a/ttyponies/derpystandwing.pony b/ponies/derpystandwing.ttypony
index 93cc58c..93cc58c 100644
--- a/ttyponies/derpystandwing.pony
+++ b/ponies/derpystandwing.ttypony
diff --git a/ttyponies/diamondmint.pony b/ponies/diamondmint.ttypony
index 977a461..977a461 100644
--- a/ttyponies/diamondmint.pony
+++ b/ponies/diamondmint.ttypony
diff --git a/ponyquotes/diamondtiara.0 b/ponies/diamondtiara.quotes
index be1726b..be1726b 100644
--- a/ponyquotes/diamondtiara.0
+++ b/ponies/diamondtiara.quotes
diff --git a/ttyponies/diamondtiara.pony b/ponies/diamondtiara.ttypony
index 3b8eb20..3b8eb20 100644
--- a/ttyponies/diamondtiara.pony
+++ b/ponies/diamondtiara.ttypony
diff --git a/ttyponies/dinky.pony b/ponies/dinky.ttypony
index 1c30479..1c30479 100644
--- a/ttyponies/dinky.pony
+++ b/ponies/dinky.ttypony
diff --git a/ponyquotes/discord.0 b/ponies/discord.quotes
index 5b9d768..5b9d768 100644
--- a/ponyquotes/discord.0
+++ b/ponies/discord.quotes
diff --git a/ttyponies/discord.pony b/ponies/discord.ttypony
index 1474054..1474054 100644
--- a/ttyponies/discord.pony
+++ b/ponies/discord.ttypony
diff --git a/ttyponies/discordamused.pony b/ponies/discordamused.ttypony
index a89ad61..a89ad61 100644
--- a/ttyponies/discordamused.pony
+++ b/ponies/discordamused.ttypony
diff --git a/ttyponies/discordpuppetmaster.pony b/ponies/discordpuppetmaster.ttypony
index 5126ee9..5126ee9 100644
--- a/ttyponies/discordpuppetmaster.pony
+++ b/ponies/discordpuppetmaster.ttypony
diff --git a/ttyponies/djpon-3.pony b/ponies/djpon-3.ttypony
index 3845885..3845885 120000
--- a/ttyponies/djpon-3.pony
+++ b/ponies/djpon-3.ttypony
diff --git a/ttyponies/drhooves.pony b/ponies/drhooves.ttypony
index 59006d5..59006d5 120000
--- a/ttyponies/drhooves.pony
+++ b/ponies/drhooves.ttypony
diff --git a/ttyponies/elsie.pony b/ponies/elsie.ttypony
index acc1800..acc1800 120000
--- a/ttyponies/elsie.pony
+++ b/ponies/elsie.ttypony
diff --git a/ttyponies/epona.pony b/ponies/epona.ttypony
index 1b02864..1b02864 120000
--- a/ttyponies/epona.pony
+++ b/ponies/epona.ttypony
diff --git a/ponyquotes/fancypants.0 b/ponies/fancypants.quotes
index 0ed95a4..0ed95a4 100644
--- a/ponyquotes/fancypants.0
+++ b/ponies/fancypants.quotes
diff --git a/ttyponies/fancypants.pony b/ponies/fancypants.ttypony
index a83ecbb..a83ecbb 100644
--- a/ttyponies/fancypants.pony
+++ b/ponies/fancypants.ttypony
diff --git a/ttyponies/fido.pony b/ponies/fido.ttypony
index d90d7ce..d90d7ce 100644
--- a/ttyponies/fido.pony
+++ b/ponies/fido.ttypony
diff --git a/ttyponies/fillistia.pony b/ponies/fillistia.ttypony
index 789c4b5..789c4b5 100644
--- a/ttyponies/fillistia.pony
+++ b/ponies/fillistia.ttypony
diff --git a/ttyponies/fillycadance.pony b/ponies/fillycadance.ttypony
index d5af622..d5af622 100644
--- a/ttyponies/fillycadance.pony
+++ b/ponies/fillycadance.ttypony
diff --git a/ttyponies/fillycelestia.pony b/ponies/fillycelestia.ttypony
index 25bddc8..25bddc8 100644
--- a/ttyponies/fillycelestia.pony
+++ b/ponies/fillycelestia.ttypony
diff --git a/ttyponies/fillydash.pony b/ponies/fillydash.ttypony
index e77d15d..e77d15d 100644
--- a/ttyponies/fillydash.pony
+++ b/ponies/fillydash.ttypony
diff --git a/ttyponies/fillydashfly.pony b/ponies/fillydashfly.ttypony
index e677369..e677369 100644
--- a/ttyponies/fillydashfly.pony
+++ b/ponies/fillydashfly.ttypony
diff --git a/ttyponies/fillyjack.pony b/ponies/fillyjack.ttypony
index c5baf2b..c5baf2b 100644
--- a/ttyponies/fillyjack.pony
+++ b/ponies/fillyjack.ttypony
diff --git a/ttyponies/fillyjacktravel.pony b/ponies/fillyjacktravel.ttypony
index 374085c..374085c 100644
--- a/ttyponies/fillyjacktravel.pony
+++ b/ponies/fillyjacktravel.ttypony
diff --git a/ttyponies/fillypinkie.pony b/ponies/fillypinkie.ttypony
index b88c40c..b88c40c 100644
--- a/ttyponies/fillypinkie.pony
+++ b/ponies/fillypinkie.ttypony
diff --git a/ttyponies/fillypinkiecurly.pony b/ponies/fillypinkiecurly.ttypony
index be3a24d..be3a24d 100644
--- a/ttyponies/fillypinkiecurly.pony
+++ b/ponies/fillypinkiecurly.ttypony
diff --git a/ttyponies/fillyrarity.pony b/ponies/fillyrarity.ttypony
index 3adf619..3adf619 100644
--- a/ttyponies/fillyrarity.pony
+++ b/ponies/fillyrarity.ttypony
diff --git a/ttyponies/fillyshy.pony b/ponies/fillyshy.ttypony
index 9e351b8..9e351b8 100644
--- a/ttyponies/fillyshy.pony
+++ b/ponies/fillyshy.ttypony
diff --git a/ttyponies/fillytwilight.pony b/ponies/fillytwilight.ttypony
index d6d5afd..d6d5afd 100644
--- a/ttyponies/fillytwilight.pony
+++ b/ponies/fillytwilight.ttypony
diff --git a/ttyponies/filthyrich.pony b/ponies/filthyrich.ttypony
index 3d48fb1..3d48fb1 100644
--- a/ttyponies/filthyrich.pony
+++ b/ponies/filthyrich.ttypony
diff --git a/ttyponies/firestreak.pony b/ponies/firestreak.ttypony
index 8e8934c..8e8934c 100644
--- a/ttyponies/firestreak.pony
+++ b/ponies/firestreak.ttypony
diff --git a/ttyponies/flam.pony b/ponies/flam.ttypony
index 08aa4d0..08aa4d0 100644
--- a/ttyponies/flam.pony
+++ b/ponies/flam.ttypony
diff --git a/ttyponies/fleurdelis.pony b/ponies/fleurdelis.ttypony
index 50c4dbf..50c4dbf 100644
--- a/ttyponies/fleurdelis.pony
+++ b/ponies/fleurdelis.ttypony
diff --git a/ttyponies/fleurdelishair.pony b/ponies/fleurdelishair.ttypony
index 7f20686..7f20686 100644
--- a/ttyponies/fleurdelishair.pony
+++ b/ponies/fleurdelishair.ttypony
diff --git a/ttyponies/fleurdelislay.pony b/ponies/fleurdelislay.ttypony
index 4f6a26e..4f6a26e 100644
--- a/ttyponies/fleurdelislay.pony
+++ b/ponies/fleurdelislay.ttypony
diff --git a/ttyponies/flim.pony b/ponies/flim.ttypony
index 9cbbc1d..9cbbc1d 100644
--- a/ttyponies/flim.pony
+++ b/ponies/flim.ttypony
diff --git a/ttyponies/flowertrio.pony b/ponies/flowertrio.ttypony
index e4de965..e4de965 100644
--- a/ttyponies/flowertrio.pony
+++ b/ponies/flowertrio.ttypony
diff --git a/ponies/fluttershy.quotes b/ponies/fluttershy.quotes
new file mode 100644
index 0000000..ba02bb3
--- /dev/null
+++ b/ponies/fluttershy.quotes
@@ -0,0 +1,87 @@
+Um, Pinkie Pie ... about this party for Gilda;
+do you really think it's a good idea? I mean...
+
+I'm a year older than you.
+
+Uh, panic?
+
+The armscye's tight, the middy collar doesn't go with the shawl lapel,
+the hems are clearly machine-stitched, the pleats are uneven, the
+fabric looks like toile, you used a backstitch here when it clearly
+called for a topstitch, or maybe a traditional blanket stitch, and the
+overall design is reminiscent of prêt-à-porter and not true French
+haute couture...
+
+But ... uh ... you know ... um ... whatever you want to do is fine...
+
+Well ... It's a game about who can be quiet the longest. Sound fun?
+I'm the world champ, you know. I betcha can't beat me!
+
+~Squee~
+
+I'll catch you yet, my pretties. Oh yes. As soon as one of you little
+birds or monkeys or bears touches this net ... you'll be MINE! MINE!
+
+A sonic rainboom! She did it! She did it! WOOO!
+
+Now wait just a minute! Oh, I'm sorry.
+I'm trying to be more assertive. Anyhow...
+She *is* going to do a sonic rainboom!
+
+Then show up at the Cloudseum and see for yourself! ... If you're free.
+
+Hey Twilight, what's soaking wet and clueless?
+[⋅⋅⋅]
+YOUR FACE!
+
+Good boy, Angel! Mama's so proud!
+
+Um ... I'm just wondering if it's okay if I hold
+you down against your will for a little bit?
+
+Yay.
+
+I can't believe this ... I am so frustrated, I could just scream!
+
+(Eee!)
+
+Yes. Because he wasn't a huge, gigantic, terrible, enormous,
+teeth-gnashing, sharp scale-having, horn-wearing, smoke-snoring,
+could-eat-a-pony-in-one-bite, totally-all-grown-up dragon.
+
+What is this place, filled with so many wonders?
+
+Oooh, what a magical place!
+
+*crazy laugh*
+
+How dare you!
+
+I'd like to be a tree.
+
+I don't wanna talk about it.
+
+I am so sorry to have scared you, my friends.
+
+I am the world champ, you know. A bet you can't beat me.
+
+Yay!
+
+You're the cutest thing ever!
+
+You rock, woohoo!
+
+Yaaay ... too loud?
+
+(squeak)
+
+You're ... GOING TO LOVE ME!!!
+
+I can't!
+
+That big ... dumb ... MEANIE!!!!
+
+Now, Rainbow my dear, I cannot express my delight
+It's abundantly clear
+That somewhere out here
+Is a pet that will suit you just right.
diff --git a/ttyponies/fluttershy.pony b/ponies/fluttershy.ttypony
index f3be1f7..f3be1f7 100644
--- a/ttyponies/fluttershy.pony
+++ b/ponies/fluttershy.ttypony
diff --git a/ttyponies/fluttershygala.pony b/ponies/fluttershygala.ttypony
index 6c0c86a..6c0c86a 100644
--- a/ttyponies/fluttershygala.pony
+++ b/ponies/fluttershygala.ttypony
diff --git a/ttyponies/fluttershyshy.pony b/ponies/fluttershyshy.ttypony
index 6adecd5..6adecd5 100644
--- a/ttyponies/fluttershyshy.pony
+++ b/ponies/fluttershyshy.ttypony
diff --git a/ttyponies/fluttershystare.pony b/ponies/fluttershystare.ttypony
index cdcd0bb..cdcd0bb 100644
--- a/ttyponies/fluttershystare.pony
+++ b/ponies/fluttershystare.ttypony
diff --git a/ttyponies/forestspirit.pony b/ponies/forestspirit.ttypony
index aabb75a..aabb75a 100644
--- a/ttyponies/forestspirit.pony
+++ b/ponies/forestspirit.ttypony
diff --git a/ttyponies/frederickhorseshoepin.pony b/ponies/frederickhorseshoepin.ttypony
index 9437e64..9437e64 100644
--- a/ttyponies/frederickhorseshoepin.pony
+++ b/ponies/frederickhorseshoepin.ttypony
diff --git a/ttyponies/georgewashingtony.pony b/ponies/georgewashingtony.ttypony
index 4622fea..4622fea 120000
--- a/ttyponies/georgewashingtony.pony
+++ b/ponies/georgewashingtony.ttypony
diff --git a/ponies/gilda.quotes b/ponies/gilda.quotes
new file mode 100644
index 0000000..4dad621
--- /dev/null
+++ b/ponies/gilda.quotes
@@ -0,0 +1,15 @@
+That's me! Half eagle, half lion, and all awesome!
+
+Don't you know how to take GET LOST for an answer?
+
+I know what you're up to!
+
+When you decide not be lame anymore, give me a call!
+
+You're such a flip-flop! Cool one minute and lame the next.
+
+*sigh* Only for you, Dash.
+Junior Speedsters are our lives
+Sky-bound soars and daring dives
+Junior Speedsters; it's our quest
+To someday be the very best
diff --git a/ttyponies/gilda.pony b/ponies/gilda.ttypony
index 473f4e7..473f4e7 100644
--- a/ttyponies/gilda.pony
+++ b/ponies/gilda.ttypony
diff --git a/ttyponies/gildastand.pony b/ponies/gildastand.ttypony
index 82096db..82096db 100644
--- a/ttyponies/gildastand.pony
+++ b/ponies/gildastand.ttypony
diff --git a/ttyponies/gingergold.pony b/ponies/gingergold.ttypony
index 5726e67..5726e67 100644
--- a/ttyponies/gingergold.pony
+++ b/ponies/gingergold.ttypony
diff --git a/ttyponies/goldenharvest.pony b/ponies/goldenharvest.ttypony
index 222bb68..222bb68 120000
--- a/ttyponies/goldenharvest.pony
+++ b/ponies/goldenharvest.ttypony
diff --git a/ponyquotes/granny.0 b/ponies/granny.quotes
index 7948107..7948107 100644
--- a/ponyquotes/granny.0
+++ b/ponies/granny.quotes
diff --git a/ttyponies/granny.pony b/ponies/granny.ttypony
index 4eeb382..4eeb382 100644
--- a/ttyponies/granny.pony
+++ b/ponies/granny.ttypony
diff --git a/ttyponies/grannychair.pony b/ponies/grannychair.ttypony
index 73c112c..73c112c 100644
--- a/ttyponies/grannychair.pony
+++ b/ponies/grannychair.ttypony
diff --git a/ttyponies/grannysleep.pony b/ponies/grannysleep.ttypony
index 3169c63..3169c63 100644
--- a/ttyponies/grannysleep.pony
+++ b/ponies/grannysleep.ttypony
diff --git a/ttyponies/gummy.pony b/ponies/gummy.ttypony
index e0954f3..e0954f3 100644
--- a/ttyponies/gummy.pony
+++ b/ponies/gummy.ttypony
diff --git a/ttyponies/gustavelegrand.pony b/ponies/gustavelegrand.ttypony
index 45e4d69..45e4d69 100644
--- a/ttyponies/gustavelegrand.pony
+++ b/ponies/gustavelegrand.ttypony
diff --git a/ttyponies/harpass.pony b/ponies/harpass.ttypony
index a05bf5d..a05bf5d 120000
--- a/ttyponies/harpass.pony
+++ b/ponies/harpass.ttypony
diff --git a/ttyponies/hayfever.pony b/ponies/hayfever.ttypony
index 777628e..777628e 100644
--- a/ttyponies/hayfever.pony
+++ b/ponies/hayfever.ttypony
diff --git a/ttyponies/heartstrings.pony b/ponies/heartstrings.ttypony
index a05bf5d..a05bf5d 120000
--- a/ttyponies/heartstrings.pony
+++ b/ponies/heartstrings.ttypony
diff --git a/ttyponies/highscore.pony b/ponies/highscore.ttypony
index f0a7e21..f0a7e21 100644
--- a/ttyponies/highscore.pony
+++ b/ponies/highscore.ttypony
diff --git a/ttyponies/hoity.pony b/ponies/hoity.ttypony
index b3da7b0..b3da7b0 100644
--- a/ttyponies/hoity.pony
+++ b/ponies/hoity.ttypony
diff --git a/ttyponies/hollydash.pony b/ponies/hollydash.ttypony
index 3d56527..3d56527 100644
--- a/ttyponies/hollydash.pony
+++ b/ponies/hollydash.ttypony
diff --git a/ttyponies/horsemd.pony b/ponies/horsemd.ttypony
index ba7796e..ba7796e 100644
--- a/ttyponies/horsemd.pony
+++ b/ponies/horsemd.ttypony
diff --git a/ttyponies/horsepower.pony b/ponies/horsepower.ttypony
index 6b44998..6b44998 120000
--- a/ttyponies/horsepower.pony
+++ b/ponies/horsepower.ttypony
diff --git a/ttyponies/horte.pony b/ponies/horte.ttypony
index bd19346..bd19346 100644
--- a/ttyponies/horte.pony
+++ b/ponies/horte.ttypony
diff --git a/ttyponies/hughjelly.pony b/ponies/hughjelly.ttypony
index 56af4c3..56af4c3 100644
--- a/ttyponies/hughjelly.pony
+++ b/ponies/hughjelly.ttypony
diff --git a/ttyponies/inky.pony b/ponies/inky.ttypony
index 5f1c705..5f1c705 100644
--- a/ttyponies/inky.pony
+++ b/ponies/inky.ttypony
diff --git a/ponies/ironwill.quotes b/ponies/ironwill.quotes
new file mode 100644
index 0000000..bb0e381
--- /dev/null
+++ b/ponies/ironwill.quotes
@@ -0,0 +1,15 @@
+Never apologise, when you can criticise.
+
+Treat me like a push-over, and you will get the once-over.
+
+When somepony tries to block, show them that you rock.
+
+Maybes are for babies.
+
+You laugh at me? I wrath at you!
+
+Cut in line? I will take what is mine.
+
+You apologise, I penalise.
+
+You make me lose, I blow my fuse.
diff --git a/ttyponies/ironwillwalk.pony b/ponies/ironwillwalk.ttypony
index f281b8d..f281b8d 100644
--- a/ttyponies/ironwillwalk.pony
+++ b/ponies/ironwillwalk.ttypony
diff --git a/ttyponies/jeffletrotski.pony b/ponies/jeffletrotski.ttypony
index 77ee314..77ee314 100644
--- a/ttyponies/jeffletrotski.pony
+++ b/ponies/jeffletrotski.ttypony
diff --git a/ttyponies/jesuspezuna.pony b/ponies/jesuspezuna.ttypony
index f0e2b05..f0e2b05 100644
--- a/ttyponies/jesuspezuna.pony
+++ b/ponies/jesuspezuna.ttypony
diff --git a/ttyponies/joe.pony b/ponies/joe.ttypony
index 4a00edf..4a00edf 100644
--- a/ttyponies/joe.pony
+++ b/ponies/joe.ttypony
diff --git a/ttyponies/joetuxedo.pony b/ponies/joetuxedo.ttypony
index d6aec8e..d6aec8e 100644
--- a/ttyponies/joetuxedo.pony
+++ b/ponies/joetuxedo.ttypony
diff --git a/ttyponies/junebug.pony b/ponies/junebug.ttypony
index fae31ab..fae31ab 100644
--- a/ttyponies/junebug.pony
+++ b/ponies/junebug.ttypony
diff --git a/ttyponies/laflour.pony b/ponies/laflour.ttypony
index f283ac4..f283ac4 100644
--- a/ttyponies/laflour.pony
+++ b/ponies/laflour.ttypony
diff --git a/ttyponies/lemonhearts.pony b/ponies/lemonhearts.ttypony
index 2dce577..2dce577 100644
--- a/ttyponies/lemonhearts.pony
+++ b/ponies/lemonhearts.ttypony
diff --git a/ttyponies/lightning.pony b/ponies/lightning.ttypony
index bf31b7c..bf31b7c 100644
--- a/ttyponies/lightning.pony
+++ b/ponies/lightning.ttypony
diff --git a/ponyquotes/lily.1 b/ponies/lily.quotes
index eec6d6b..d0a381f 100644
--- a/ponyquotes/lily.1
+++ b/ponies/lily.quotes
@@ -1 +1,3 @@
+The horror, the horror!
+
This is awful! Horribly, terribly awful!
diff --git a/ttyponies/lily.pony b/ponies/lily.ttypony
index 17c9f98..17c9f98 100644
--- a/ttyponies/lily.pony
+++ b/ponies/lily.ttypony
diff --git a/ttyponies/lintsalot.pony b/ponies/lintsalot.ttypony
index 17ebf93..17ebf93 100644
--- a/ttyponies/lintsalot.pony
+++ b/ponies/lintsalot.ttypony
diff --git a/ttyponies/lotus.pony b/ponies/lotus.ttypony
index 992edf1..992edf1 100644
--- a/ttyponies/lotus.pony
+++ b/ponies/lotus.ttypony
diff --git a/ttyponies/lotusbloosom.pony b/ponies/lotusbloosom.ttypony
index 4646120..4646120 120000
--- a/ttyponies/lotusbloosom.pony
+++ b/ponies/lotusbloosom.ttypony
diff --git a/ttyponies/lulamoon.pony b/ponies/lulamoon.ttypony
index 76684f9..76684f9 120000
--- a/ttyponies/lulamoon.pony
+++ b/ponies/lulamoon.ttypony
diff --git a/ponies/luna.quotes b/ponies/luna.quotes
new file mode 100644
index 0000000..ea95dc6
--- /dev/null
+++ b/ponies/luna.quotes
@@ -0,0 +1,13 @@
+Ha, ha! The fun has been doubled!
+
+I missed you so much!
+
+I'm so sorry!
+
+TOGETHER, WE SHALL TURN THIS DREADFUL NIGHT INTO A GLORIOUS FEEEEAAAAST!
+
+OH MOST WON... I mean, oh most wonderful of nights!
+
+WE COULD NOT BE HAPPIER! IS THAT NOT CLEAR?
+
+THIS IS THE TRADITIONAL ROYAL CANTERLOT VOICE!
diff --git a/ttyponies/luna.pony b/ponies/luna.ttypony
index e0f5706..e0f5706 100644
--- a/ttyponies/luna.pony
+++ b/ponies/luna.ttypony
diff --git a/ttyponies/lunafly.pony b/ponies/lunafly.ttypony
index 6ff5eb3..6ff5eb3 100644
--- a/ttyponies/lunafly.pony
+++ b/ponies/lunafly.ttypony
diff --git a/ponyquotes/lyra.0 b/ponies/lyra.quotes
index ffa25ae..ffa25ae 100644
--- a/ponyquotes/lyra.0
+++ b/ponies/lyra.quotes
diff --git a/ttyponies/lyra.pony b/ponies/lyra.ttypony
index d8189ae..d8189ae 100644
--- a/ttyponies/lyra.pony
+++ b/ponies/lyra.ttypony
diff --git a/ttyponies/lyrabonbon.pony b/ponies/lyrabonbon.ttypony
index 0797207..0797207 100644
--- a/ttyponies/lyrabonbon.pony
+++ b/ponies/lyrabonbon.ttypony
diff --git a/ttyponies/lyrasit.pony b/ponies/lyrasit.ttypony
index 1964e16..1964e16 100644
--- a/ttyponies/lyrasit.pony
+++ b/ponies/lyrasit.ttypony
diff --git a/ttyponies/magnum.pony b/ponies/magnum.ttypony
index 47da427..47da427 120000
--- a/ttyponies/magnum.pony
+++ b/ponies/magnum.ttypony
diff --git a/ttyponies/manticore.pony b/ponies/manticore.ttypony
index e99d80c..e99d80c 100644
--- a/ttyponies/manticore.pony
+++ b/ponies/manticore.ttypony
diff --git a/ttyponies/maredowellfly.pony b/ponies/maredowellfly.ttypony
index 3fe83bd..3fe83bd 100644
--- a/ttyponies/maredowellfly.pony
+++ b/ponies/maredowellfly.ttypony
diff --git a/ttyponies/maredowellgallop.pony b/ponies/maredowellgallop.ttypony
index 450f07f..450f07f 100644
--- a/ttyponies/maredowellgallop.pony
+++ b/ponies/maredowellgallop.ttypony
diff --git a/ttyponies/master.pony b/ponies/master.ttypony
index 7e1b65e..7e1b65e 100644
--- a/ttyponies/master.pony
+++ b/ponies/master.ttypony
diff --git a/ttyponies/mayor.pony b/ponies/mayor.ttypony
index f7df2a8..f7df2a8 100644
--- a/ttyponies/mayor.pony
+++ b/ponies/mayor.ttypony
diff --git a/ttyponies/meadowsong.pony b/ponies/meadowsong.ttypony
index 21d8ea4..21d8ea4 100644
--- a/ttyponies/meadowsong.pony
+++ b/ponies/meadowsong.ttypony
diff --git a/ttyponies/meliot.pony b/ponies/meliot.ttypony
index d0ad0ea..d0ad0ea 100644
--- a/ttyponies/meliot.pony
+++ b/ponies/meliot.ttypony
diff --git a/ttyponies/milkyway.pony b/ponies/milkyway.ttypony
index d0f6849..d0f6849 100644
--- a/ttyponies/milkyway.pony
+++ b/ponies/milkyway.ttypony
diff --git a/ttyponies/minuette.pony b/ponies/minuette.ttypony
index 9278c09..9278c09 120000
--- a/ttyponies/minuette.pony
+++ b/ponies/minuette.ttypony
diff --git a/ttyponies/mjolna.pony b/ponies/mjolna.ttypony
index 7a27534..7a27534 100644
--- a/ttyponies/mjolna.pony
+++ b/ponies/mjolna.ttypony
diff --git a/ttyponies/mrsparkle.pony b/ponies/mrsparkle.ttypony
index fce26fb..fce26fb 100644
--- a/ttyponies/mrsparkle.pony
+++ b/ponies/mrsparkle.ttypony
diff --git a/ttyponies/mrssparkle.pony b/ponies/mrssparkle.ttypony
index 480211e..480211e 100644
--- a/ttyponies/mrssparkle.pony
+++ b/ponies/mrssparkle.ttypony
diff --git a/ttyponies/nightlight.pony b/ponies/nightlight.ttypony
index f27e47a..f27e47a 120000
--- a/ttyponies/nightlight.pony
+++ b/ponies/nightlight.ttypony
diff --git a/ponies/nightmare.quotes b/ponies/nightmare.quotes
new file mode 100644
index 0000000..dc712a0
--- /dev/null
+++ b/ponies/nightmare.quotes
@@ -0,0 +1,11 @@
+Don't you know who I am?
+
+Oh, my beloved subjects!
+
+The night will last FOREVER! Muhahaha!
+
+You little foal!
+
+You're kidding. You're kidding, right?
+
+Why, am I not royal enough for you? Don't you know who I am?
diff --git a/ttyponies/nightmare.pony b/ponies/nightmare.ttypony
index 2e72b63..2e72b63 100644
--- a/ttyponies/nightmare.pony
+++ b/ponies/nightmare.ttypony
diff --git a/ttyponies/noi.pony b/ponies/noi.ttypony
index aaa27c5..aaa27c5 100644
--- a/ttyponies/noi.pony
+++ b/ponies/noi.ttypony
diff --git a/ttyponies/noteworthy.pony b/ponies/noteworthy.ttypony
index d32b6d7..d32b6d7 120000
--- a/ttyponies/noteworthy.pony
+++ b/ponies/noteworthy.ttypony
diff --git a/ttyponies/octavia.pony b/ponies/octavia.ttypony
index 9cf4326..9cf4326 100644
--- a/ttyponies/octavia.pony
+++ b/ponies/octavia.ttypony
diff --git a/ttyponies/oinkoinkoink.pony b/ponies/oinkoinkoink.ttypony
index 2408943..2408943 100644
--- a/ttyponies/oinkoinkoink.pony
+++ b/ponies/oinkoinkoink.ttypony
diff --git a/ttyponies/opal.pony b/ponies/opal.ttypony
index a6aabb1..a6aabb1 100644
--- a/ttyponies/opal.pony
+++ b/ponies/opal.ttypony
diff --git a/ttyponies/orange.pony b/ponies/orange.ttypony
index ecd8be0..ecd8be0 100644
--- a/ttyponies/orange.pony
+++ b/ponies/orange.ttypony
diff --git a/ttyponies/owl.pony b/ponies/owl.ttypony
index d333517..d333517 100644
--- a/ttyponies/owl.pony
+++ b/ponies/owl.ttypony
diff --git a/ttyponies/owlowiscious.pony b/ponies/owlowiscious.ttypony
index 946df57..946df57 100644
--- a/ttyponies/owlowiscious.pony
+++ b/ponies/owlowiscious.ttypony
diff --git a/ttyponies/parasprite.pony b/ponies/parasprite.ttypony
index 582ec92..582ec92 100644
--- a/ttyponies/parasprite.pony
+++ b/ponies/parasprite.ttypony
diff --git a/ttyponies/pearl.pony b/ponies/pearl.ttypony
index 7d26721..7d26721 120000
--- a/ttyponies/pearl.pony
+++ b/ponies/pearl.ttypony
diff --git a/ttyponies/peppermoon.pony b/ponies/peppermoon.ttypony
index 32ba31d..32ba31d 100644
--- a/ttyponies/peppermoon.pony
+++ b/ponies/peppermoon.ttypony
diff --git a/ttyponies/perry.pony b/ponies/perry.ttypony
index 82925e2..82925e2 120000
--- a/ttyponies/perry.pony
+++ b/ponies/perry.ttypony
diff --git a/ttyponies/perrypierce.pony b/ponies/perrypierce.ttypony
index 7def272..7def272 100644
--- a/ttyponies/perrypierce.pony
+++ b/ponies/perrypierce.ttypony
diff --git a/ttyponies/persnickety.pony b/ponies/persnickety.ttypony
index d1acc36..d1acc36 100644
--- a/ttyponies/persnickety.pony
+++ b/ponies/persnickety.ttypony
diff --git a/ttyponies/petunia.pony b/ponies/petunia.ttypony
index f87aa2c..f87aa2c 100644
--- a/ttyponies/petunia.pony
+++ b/ponies/petunia.ttypony
diff --git a/ttyponies/philomena.pony b/ponies/philomena.ttypony
index f1f6ba8..f1f6ba8 100644
--- a/ttyponies/philomena.pony
+++ b/ponies/philomena.ttypony
diff --git a/ttyponies/philomenaphoenix.pony b/ponies/philomenaphoenix.ttypony
index 3e1ec5b..3e1ec5b 100644
--- a/ttyponies/philomenaphoenix.pony
+++ b/ponies/philomenaphoenix.ttypony
diff --git a/ponies/photofinish.quotes b/ponies/photofinish.quotes
new file mode 100644
index 0000000..7669800
--- /dev/null
+++ b/ponies/photofinish.quotes
@@ -0,0 +1,9 @@
+...It is time to make DE MAGICKS!!
+
+I, Photo Finish... have arrived!
+
+I only need to point and shoot, and I capture... DE MAGICKS!
+
+Flootershay!
+
+Oh, wunderbar!
diff --git a/ttyponies/photofinish.pony b/ponies/photofinish.ttypony
index c1c95cc..c1c95cc 100644
--- a/ttyponies/photofinish.pony
+++ b/ponies/photofinish.ttypony
diff --git a/ttyponies/pictureperfect.pony b/ponies/pictureperfect.ttypony
index c540392..c540392 100644
--- a/ttyponies/pictureperfect.pony
+++ b/ponies/pictureperfect.ttypony
diff --git a/ttyponies/pigpen.pony b/ponies/pigpen.ttypony
index 09747ef..09747ef 100644
--- a/ttyponies/pigpen.pony
+++ b/ponies/pigpen.ttypony
diff --git a/ttyponies/pinacolada.pony b/ponies/pinacolada.ttypony
index e2b64ee..e2b64ee 100644
--- a/ttyponies/pinacolada.pony
+++ b/ponies/pinacolada.ttypony
diff --git a/ttyponies/pinkacopter.pony b/ponies/pinkacopter.ttypony
index 2c5522a..2c5522a 100644
--- a/ttyponies/pinkacopter.pony
+++ b/ponies/pinkacopter.ttypony
diff --git a/ttyponies/pinkamina.pony b/ponies/pinkamina.ttypony
index 7528ff2..7528ff2 100644
--- a/ttyponies/pinkamina.pony
+++ b/ponies/pinkamina.ttypony
diff --git a/ponies/pinkie.quotes b/ponies/pinkie.quotes
new file mode 100644
index 0000000..f6a366f
--- /dev/null
+++ b/ponies/pinkie.quotes
@@ -0,0 +1,76 @@
+Ooh! Ooh! More guessing games! Um... Pokey Smokes!
+How about Queen Meanie? No! Black Snooty, Black Snooty!
+
+Don't you worry your pretty little head about mean old Gilda!
+Your Aunty Pinkie Pie's got it all taken care of!
+
+Too old for free candy?! NEVER!
+
+I never leave home without my party cannon!
+
+I'm not giving him cake! I'm ASSAULTING him with cake!
+
+Hold on to your hooves, I'm about to be BRILLIANT!
+
+APPLEJACK!!! YOU PINKIE PROMISED!!!!
+
+Twitchy tail! Twitchy tail!!
+
+When I was a little filly and the sun was going down~
+
+All you have to do is take a cup of flour and add it to the mix~
+
+Oh the Grand Galloping Gala is the best place for me~
+
+Ugh, a parasprite!
+
+You've got a real problem all right, and a banjo is the only answer!
+
+Cross my heart and hope to fly, stick a cupcake in my eye!
+
+Are you loco in the coco?
+
+Hay, that's what I said!
+
+And that's how Equestria was made.
+
+I never felt joy like that before!
+
+Oatmeal, are you crazy?
+
+This calls for extreme measures! Pinkie Pie style!
+
+This may look like fun, but it's not!
+
+You really need to get out more.
+
+I don't need my friends... *Twitch*
+
+You look like you'd be good at eating cupcakes!
+
+Thank you for being here today... *Twitch*
+
+Aha! I knew it!
+
+My friends don't like my parties and they don't wanna be my friends anymore...
+
+I know how it goes, all right!
+
+I'm just glad none of them ponies showed up!
+
+Oui! Zhat is correct, madame.
+
+You know what this calls for?
+A party!
+
+She'll become a crazy cat lady!
+
+Give her time...
+
+FOREVER!!!
+
+Secrets and lies! It's all secrets and lies with those ponies!
+
+Hold on a second! Eternal chaos comes with chocolate rain, guys! Chocolate rain!
+
+No I'm not, I'm a chicken! BAGAWK!
diff --git a/ttyponies/pinkie.pony b/ponies/pinkie.ttypony
index 98fa1e6..98fa1e6 100644
--- a/ttyponies/pinkie.pony
+++ b/ponies/pinkie.ttypony
diff --git a/ttyponies/pinkiebounce.pony b/ponies/pinkiebounce.ttypony
index 824a780..824a780 100644
--- a/ttyponies/pinkiebounce.pony
+++ b/ponies/pinkiebounce.ttypony
diff --git a/ttyponies/pinkiecannon.pony b/ponies/pinkiecannon.ttypony
index 9285e37..9285e37 100644
--- a/ttyponies/pinkiecannon.pony
+++ b/ponies/pinkiecannon.ttypony
diff --git a/ttyponies/pinkiecannonfront.pony b/ponies/pinkiecannonfront.ttypony
index e20b34b..e20b34b 100644
--- a/ttyponies/pinkiecannonfront.pony
+++ b/ponies/pinkiecannonfront.ttypony
diff --git a/ttyponies/pinkiecannonhappy.pony b/ponies/pinkiecannonhappy.ttypony
index b020ccc..b020ccc 100644
--- a/ttyponies/pinkiecannonhappy.pony
+++ b/ponies/pinkiecannonhappy.ttypony
diff --git a/ttyponies/pinkiechicken.pony b/ponies/pinkiechicken.ttypony
index f44a393..f44a393 100644
--- a/ttyponies/pinkiechicken.pony
+++ b/ponies/pinkiechicken.ttypony
diff --git a/ttyponies/pinkiefly.pony b/ponies/pinkiefly.ttypony
index 3544ad8..3544ad8 100644
--- a/ttyponies/pinkiefly.pony
+++ b/ponies/pinkiefly.ttypony
diff --git a/ttyponies/pinkiegala.pony b/ponies/pinkiegala.ttypony
index 70e8d54..70e8d54 100644
--- a/ttyponies/pinkiegala.pony
+++ b/ponies/pinkiegala.ttypony
diff --git a/ttyponies/pinkiegummy.pony b/ponies/pinkiegummy.ttypony
index 8b74815..8b74815 100644
--- a/ttyponies/pinkiegummy.pony
+++ b/ponies/pinkiegummy.ttypony
diff --git a/ttyponies/pinkiegummydisguise.pony b/ponies/pinkiegummydisguise.ttypony
index 181b38b..181b38b 100644
--- a/ttyponies/pinkiegummydisguise.pony
+++ b/ponies/pinkiegummydisguise.ttypony
diff --git a/ttyponies/pinkiehugfluttershy.pony b/ponies/pinkiehugfluttershy.ttypony
index f3ee16e..f3ee16e 100644
--- a/ttyponies/pinkiehugfluttershy.pony
+++ b/ponies/pinkiehugfluttershy.ttypony
diff --git a/ttyponies/pinkiehugsfluttershy.pony b/ponies/pinkiehugsfluttershy.ttypony
index 82631a5..82631a5 100644
--- a/ttyponies/pinkiehugsfluttershy.pony
+++ b/ponies/pinkiehugsfluttershy.ttypony
diff --git a/ttyponies/pinkieoink.pony b/ponies/pinkieoink.ttypony
index 7f9fd2b..7f9fd2b 120000
--- a/ttyponies/pinkieoink.pony
+++ b/ponies/pinkieoink.ttypony
diff --git a/ttyponies/pinkieparade.pony b/ponies/pinkieparade.ttypony
index 2b9b5b6..2b9b5b6 100644
--- a/ttyponies/pinkieparade.pony
+++ b/ponies/pinkieparade.ttypony
diff --git a/ttyponies/pinkiepartycannon.pony b/ponies/pinkiepartycannon.ttypony
index 42d32e7..42d32e7 100644
--- a/ttyponies/pinkiepartycannon.pony
+++ b/ponies/pinkiepartycannon.ttypony
diff --git a/ttyponies/pinkieprincess.pony b/ponies/pinkieprincess.ttypony
index e8659ff..e8659ff 100644
--- a/ttyponies/pinkieprincess.pony
+++ b/ponies/pinkieprincess.ttypony
diff --git a/ttyponies/pinkiesilly.pony b/ponies/pinkiesilly.ttypony
index 9e43a2b..9e43a2b 100644
--- a/ttyponies/pinkiesilly.pony
+++ b/ponies/pinkiesilly.ttypony
diff --git a/ttyponies/pinkietongue.pony b/ponies/pinkietongue.ttypony
index b352bc9..b352bc9 100644
--- a/ttyponies/pinkietongue.pony
+++ b/ponies/pinkietongue.ttypony
diff --git a/ttyponies/pinkieumbrellahat.pony b/ponies/pinkieumbrellahat.ttypony
index 1f0ce42..1f0ce42 100644
--- a/ttyponies/pinkieumbrellahat.pony
+++ b/ponies/pinkieumbrellahat.ttypony
diff --git a/ttyponies/pinkieumbrellahatfear.pony b/ponies/pinkieumbrellahatfear.ttypony
index 9c7386b..9c7386b 100644
--- a/ttyponies/pinkieumbrellahatfear.pony
+++ b/ponies/pinkieumbrellahatfear.ttypony
diff --git a/ttyponies/pinkiewhoops.pony b/ponies/pinkiewhoops.ttypony
index 278f61e..278f61e 100644
--- a/ttyponies/pinkiewhoops.pony
+++ b/ponies/pinkiewhoops.ttypony
diff --git a/ttyponies/pinkiewhoopseat.pony b/ponies/pinkiewhoopseat.ttypony
index c7f5498..c7f5498 100644
--- a/ttyponies/pinkiewhoopseat.pony
+++ b/ponies/pinkiewhoopseat.ttypony
diff --git a/ttyponies/pinkiewhoopsout.pony b/ponies/pinkiewhoopsout.ttypony
index 0832f27..0832f27 100644
--- a/ttyponies/pinkiewhoopsout.pony
+++ b/ponies/pinkiewhoopsout.ttypony
diff --git a/ponyquotes/pipsqueak.1 b/ponies/pipsqueak.quotes
index 3d2990b..4980c31 100644
--- a/ponyquotes/pipsqueak.1
+++ b/ponies/pipsqueak.quotes
@@ -1 +1,5 @@
+Pipsqueak the pirate, at your service
+
Um... Princess Luna. do you suppose maybe you could come back next year and scare us again?
+
+It's really fun! Scary, but fun.
diff --git a/ttyponies/pipsqueak.pony b/ponies/pipsqueak.ttypony
index 718e507..718e507 100644
--- a/ttyponies/pipsqueak.pony
+++ b/ponies/pipsqueak.ttypony
diff --git a/ttyponies/pokey.pony b/ponies/pokey.ttypony
index 1dd46b4..1dd46b4 100644
--- a/ttyponies/pokey.pony
+++ b/ponies/pokey.ttypony
diff --git a/ttyponies/pokeypierce.pony b/ponies/pokeypierce.ttypony
index c66432d..c66432d 120000
--- a/ttyponies/pokeypierce.pony
+++ b/ponies/pokeypierce.ttypony
diff --git a/ttyponies/ponet.pony b/ponies/ponet.ttypony
index e0fe64a..e0fe64a 100644
--- a/ttyponies/ponet.pony
+++ b/ponies/ponet.ttypony
diff --git a/ttyponies/poppycock.pony b/ponies/poppycock.ttypony
index 2fdea78..2fdea78 100644
--- a/ttyponies/poppycock.pony
+++ b/ponies/poppycock.ttypony
diff --git a/ttyponies/powderrouge.pony b/ponies/powderrouge.ttypony
index 1206cc1..1206cc1 100644
--- a/ttyponies/powderrouge.pony
+++ b/ponies/powderrouge.ttypony
diff --git a/ttyponies/prettyvision.pony b/ponies/prettyvision.ttypony
index cc993b4..cc993b4 100644
--- a/ttyponies/prettyvision.pony
+++ b/ponies/prettyvision.ttypony
diff --git a/ttyponies/purplehaze.pony b/ponies/purplehaze.ttypony
index ed71a4d..ed71a4d 100644
--- a/ttyponies/purplehaze.pony
+++ b/ponies/purplehaze.ttypony
diff --git a/ttyponies/quickfix.pony b/ponies/quickfix.ttypony
index cfae21b..cfae21b 100644
--- a/ttyponies/quickfix.pony
+++ b/ponies/quickfix.ttypony
diff --git a/ttyponies/raggedy.pony b/ponies/raggedy.ttypony
index 4454873..4454873 100644
--- a/ttyponies/raggedy.pony
+++ b/ponies/raggedy.ttypony
diff --git a/ponies/rainbow.quotes b/ponies/rainbow.quotes
new file mode 100644
index 0000000..dc24f96
--- /dev/null
+++ b/ponies/rainbow.quotes
@@ -0,0 +1,44 @@
+I could clear the sky in 10 seconds flat!
+
+Are you a SPY?
+
+I'm just glad I haven't been replaced by a bucket of turnips.
+
+You don't wanna know.
+
+Sure thing, Spike!
+
+Aww right, Princess!
+
+NO! NOTHING! In the name of Celestia, just sit there and do nothing!
+
+Pinkie Pie, you are so random!
+
+This really is the BEST DAY EVER!
+
+I am the iron pony!
+
+I know, it is gonna be so awesome!
+
+Time to take out the adorable trash!
+
+I love fun things!
+
+Who are you calling a chump, chump?
+
+Oh, you wanna do this the hard way? We'll do this the hard way!
+
+No, I just want my dress to be cool.
+
+The color's fine, just make it look cooler.
+
+The shape's fine, just make the whole thing ... you know, cooler.
+It needs to be about 20% cooler.
+
+Now that you know the elements of a good cheer, let's hear one!
+
+Ugh. You're going to cheer for me like that? Louder!
+
+Louder!!
+
+LOUDER!!!
diff --git a/ttyponies/rainbow.pony b/ponies/rainbow.ttypony
index 588c10c..588c10c 100644
--- a/ttyponies/rainbow.pony
+++ b/ponies/rainbow.ttypony
diff --git a/ttyponies/rainbowdrag.pony b/ponies/rainbowdrag.ttypony
index 84288e2..84288e2 100644
--- a/ttyponies/rainbowdrag.pony
+++ b/ponies/rainbowdrag.ttypony
diff --git a/ttyponies/rainbowfly.pony b/ponies/rainbowfly.ttypony
index 28ff911..28ff911 100644
--- a/ttyponies/rainbowfly.pony
+++ b/ponies/rainbowfly.ttypony
diff --git a/ttyponies/rainbowgala.pony b/ponies/rainbowgala.ttypony
index 6cb9d44..6cb9d44 100644
--- a/ttyponies/rainbowgala.pony
+++ b/ponies/rainbowgala.ttypony
diff --git a/ttyponies/rainbowhurricane.pony b/ponies/rainbowhurricane.ttypony
index 17222e4..17222e4 100644
--- a/ttyponies/rainbowhurricane.pony
+++ b/ponies/rainbowhurricane.ttypony
diff --git a/ttyponies/rainbowsalute.pony b/ponies/rainbowsalute.ttypony
index f7e8cc4..f7e8cc4 100644
--- a/ttyponies/rainbowsalute.pony
+++ b/ponies/rainbowsalute.ttypony
diff --git a/ttyponies/rainbowshadowbolt.pony b/ponies/rainbowshadowbolt.ttypony
index 60d8bee..60d8bee 100644
--- a/ttyponies/rainbowshadowbolt.pony
+++ b/ponies/rainbowshadowbolt.ttypony
diff --git a/ttyponies/rainbowshine.pony b/ponies/rainbowshine.ttypony
index 857de8c..857de8c 100644
--- a/ttyponies/rainbowshine.pony
+++ b/ponies/rainbowshine.ttypony
diff --git a/ttyponies/rainbowsleep.pony b/ponies/rainbowsleep.ttypony
index d396010..d396010 100644
--- a/ttyponies/rainbowsleep.pony
+++ b/ponies/rainbowsleep.ttypony
diff --git a/ttyponies/raindrops.pony b/ponies/raindrops.ttypony
index 72d95bd..72d95bd 100644
--- a/ttyponies/raindrops.pony
+++ b/ponies/raindrops.ttypony
diff --git a/ponies/rarity.quotes b/ponies/rarity.quotes
new file mode 100644
index 0000000..0f66c58
--- /dev/null
+++ b/ponies/rarity.quotes
@@ -0,0 +1,55 @@
+I don't have time for some silly scavenger hunt! I've got a real problem...
+
+Aren't you going to tell me to change something too?
+
+Out of all things that could happen, this is THE WORST POSSIBLE THING!
+
+Let me guess. Applesauce?
+
+Watch the mane, please.
+
+Thread by thread, stitching it together~
+
+Stay back, and my dress doesn't get hurt!
+
+Afraid to get dirty?
+
+I simply cannot let such a crime against fabulosity go uncorrected!
+
+Gently, please!
+
+How can you be so insensitive?
+
+I'm so pathetic!
+
+Do you not like the colour?
+
+Ideaaaaa!
+
+MINE!!!
+
+Oh, it is ON!
+
+Try it, punk!
+
+Take that you ruffian!
+
+Some of us DO have standards!
+
+Do you not like the shape?
+
+Whining? I am not ‘whining’. I am complaining. Do you want to hear ‘whining’?
+(whines obnoxiously) This is whining! Ooohhhh! This harness is too tight!
+It's going to chafe! Can't you loosen it?! OH! It hurts and it's so rusty!
+Why didn't you clean it first?! It's gonna leave a stain, and the wagon's
+getting heavy! Why do I have to pull it?!
+
+BUT I THOUGHT YOU WAAANTED WHINING!!!
+
+Heavens, no! We're getting dressed!
+
+Oh, Fluttershy. Would you be a dear and FLY FASTER, PLEASE?
+
+How in Equestria can she think that tiny patch of cloud is Cloudsdale?
+
+...I thought we agreed never to speak of that again.
diff --git a/ttyponies/rarity.pony b/ponies/rarity.ttypony
index bba8a37..bba8a37 100644
--- a/ttyponies/rarity.pony
+++ b/ponies/rarity.ttypony
diff --git a/ttyponies/raritycomplaining.pony b/ponies/raritycomplaining.ttypony
index 0987815..0987815 100644
--- a/ttyponies/raritycomplaining.pony
+++ b/ponies/raritycomplaining.ttypony
diff --git a/ttyponies/raritydrama.pony b/ponies/raritydrama.ttypony
index 110492c..110492c 100644
--- a/ttyponies/raritydrama.pony
+++ b/ponies/raritydrama.ttypony
diff --git a/ttyponies/rarityfly.pony b/ponies/rarityfly.ttypony
index e880256..e880256 100644
--- a/ttyponies/rarityfly.pony
+++ b/ponies/rarityfly.ttypony
diff --git a/ttyponies/raritygala.pony b/ponies/raritygala.ttypony
index 4c01b75..4c01b75 100644
--- a/ttyponies/raritygala.pony
+++ b/ponies/raritygala.ttypony
diff --git a/ttyponies/rarityponder.pony b/ponies/rarityponder.ttypony
index 9cbc15f..9cbc15f 100644
--- a/ttyponies/rarityponder.pony
+++ b/ponies/rarityponder.ttypony
diff --git a/ttyponies/raritysdad.pony b/ponies/raritysdad.ttypony
index c255a4a..c255a4a 100644
--- a/ttyponies/raritysdad.pony
+++ b/ponies/raritysdad.ttypony
diff --git a/ttyponies/raritysmom.pony b/ponies/raritysmom.ttypony
index ee681b9..ee681b9 100644
--- a/ttyponies/raritysmom.pony
+++ b/ponies/raritysmom.ttypony
diff --git a/ttyponies/redheart.pony b/ponies/redheart.ttypony
index c21a3a5..c21a3a5 100644
--- a/ttyponies/redheart.pony
+++ b/ponies/redheart.ttypony
diff --git a/ttyponies/rhyme.pony b/ponies/rhyme.ttypony
index e1deecc..e1deecc 100644
--- a/ttyponies/rhyme.pony
+++ b/ponies/rhyme.ttypony
diff --git a/ttyponies/rocky.pony b/ponies/rocky.ttypony
index ca18dbc..ca18dbc 100644
--- a/ttyponies/rocky.pony
+++ b/ponies/rocky.ttypony
diff --git a/ponyquotes/rose.1 b/ponies/rose.quotes
index 1578fdb..1451749 100644
--- a/ponyquotes/rose.1
+++ b/ponies/rose.quotes
@@ -1 +1,3 @@
+The horror, the horror!
+
The wicked enchantress has cursed them all!
diff --git a/ttyponies/rose.pony b/ponies/rose.ttypony
index 84bc27e..84bc27e 100644
--- a/ttyponies/rose.pony
+++ b/ponies/rose.ttypony
diff --git a/ttyponies/roseluck.pony b/ponies/roseluck.ttypony
index f590db6..f590db6 120000
--- a/ttyponies/roseluck.pony
+++ b/ponies/roseluck.ttypony
diff --git a/ttyponies/rover.pony b/ponies/rover.ttypony
index d0aff32..d0aff32 100644
--- a/ttyponies/rover.pony
+++ b/ponies/rover.ttypony
diff --git a/ttyponies/royalguard.pony b/ponies/royalguard.ttypony
index e00cbe6..e00cbe6 100644
--- a/ttyponies/royalguard.pony
+++ b/ponies/royalguard.ttypony
diff --git a/ttyponies/royalnightguard.pony b/ponies/royalnightguard.ttypony
index e8b870d..e8b870d 100644
--- a/ttyponies/royalnightguard.pony
+++ b/ponies/royalnightguard.ttypony
diff --git a/ttyponies/royalribbon.pony b/ponies/royalribbon.ttypony
index b057da8..b057da8 120000
--- a/ttyponies/royalribbon.pony
+++ b/ponies/royalribbon.ttypony
diff --git a/ttyponies/ruby.pony b/ponies/ruby.ttypony
index c75fc63..c75fc63 100644
--- a/ttyponies/ruby.pony
+++ b/ponies/ruby.ttypony
diff --git a/ponyquotes/sapphire.0 b/ponies/sapphire.quotes
index 7b0f7b6..7b0f7b6 100644
--- a/ponyquotes/sapphire.0
+++ b/ponies/sapphire.quotes
diff --git a/ttyponies/sapphire.pony b/ponies/sapphire.ttypony
index a75ada5..a75ada5 100644
--- a/ttyponies/sapphire.pony
+++ b/ponies/sapphire.ttypony
diff --git a/ponies/scootaloo.quotes b/ponies/scootaloo.quotes
new file mode 100644
index 0000000..091c2c6
--- /dev/null
+++ b/ponies/scootaloo.quotes
@@ -0,0 +1,15 @@
+The possibilities are, like, endless!
+
+I'll do whatever you want, Rainbow Dash!
+
+I'am liking this idea.
+
+You've got a problem with blank flanks?
+
+That is not how you call a chicken.
+
+TLC as in Tender Loving Care or Totally Lost Cause?
+
+We were making a table?
+
+It's no use. No matter what we try we always end up without our cutie marks; and surprisingly often covered in tree sap.
diff --git a/ttyponies/scootaloo.pony b/ponies/scootaloo.ttypony
index d9d3648..d9d3648 100644
--- a/ttyponies/scootaloo.pony
+++ b/ponies/scootaloo.ttypony
diff --git a/ttyponies/screwball.pony b/ponies/screwball.ttypony
index 8c379bd..8c379bd 100644
--- a/ttyponies/screwball.pony
+++ b/ponies/screwball.ttypony
diff --git a/ttyponies/screwloose.pony b/ponies/screwloose.ttypony
index 06e289b..06e289b 100644
--- a/ttyponies/screwloose.pony
+++ b/ponies/screwloose.ttypony
diff --git a/ttyponies/seaswirl.pony b/ponies/seaswirl.ttypony
index 4d483e4..4d483e4 100644
--- a/ttyponies/seaswirl.pony
+++ b/ponies/seaswirl.ttypony
diff --git a/ttyponies/shadowbolts.pony b/ponies/shadowbolts.ttypony
index 0c55d87..0c55d87 100644
--- a/ttyponies/shadowbolts.pony
+++ b/ponies/shadowbolts.ttypony
diff --git a/ttyponies/shiningarmor.pony b/ponies/shiningarmor.ttypony
index 8acdc1c..8acdc1c 100644
--- a/ttyponies/shiningarmor.pony
+++ b/ponies/shiningarmor.ttypony
diff --git a/ttyponies/shiningarmorguard.pony b/ponies/shiningarmorguard.ttypony
index a9ef6cf..a9ef6cf 100644
--- a/ttyponies/shiningarmorguard.pony
+++ b/ponies/shiningarmorguard.ttypony
diff --git a/ttyponies/shiningarmorwedding.pony b/ponies/shiningarmorwedding.ttypony
index c739130..c739130 100644
--- a/ttyponies/shiningarmorwedding.pony
+++ b/ponies/shiningarmorwedding.ttypony
diff --git a/ttyponies/silverspeed.pony b/ponies/silverspeed.ttypony
index 1a12a7e..1a12a7e 100644
--- a/ttyponies/silverspeed.pony
+++ b/ponies/silverspeed.ttypony
diff --git a/ponyquotes/silverspoon.0 b/ponies/silverspoon.quotes
index be1726b..be1726b 100644
--- a/ponyquotes/silverspoon.0
+++ b/ponies/silverspoon.quotes
diff --git a/ttyponies/silverspoon.pony b/ponies/silverspoon.ttypony
index f44b55e..f44b55e 100644
--- a/ttyponies/silverspoon.pony
+++ b/ponies/silverspoon.ttypony
diff --git a/ttyponies/silverstar.pony b/ponies/silverstar.ttypony
index 80986e3..80986e3 100644
--- a/ttyponies/silverstar.pony
+++ b/ponies/silverstar.ttypony
diff --git a/ttyponies/sindy.pony b/ponies/sindy.ttypony
index d45faa2..d45faa2 120000
--- a/ttyponies/sindy.pony
+++ b/ponies/sindy.ttypony
diff --git a/ttyponies/skyra.pony b/ponies/skyra.ttypony
index 22d6325..22d6325 100644
--- a/ttyponies/skyra.pony
+++ b/ponies/skyra.ttypony
diff --git a/ttyponies/snails.pony b/ponies/snails.ttypony
index bdc1fae..bdc1fae 100644
--- a/ttyponies/snails.pony
+++ b/ponies/snails.ttypony
diff --git a/ttyponies/snips.pony b/ponies/snips.ttypony
index 0af7d68..0af7d68 100644
--- a/ttyponies/snips.pony
+++ b/ponies/snips.ttypony
diff --git a/ttyponies/snowflake.pony b/ponies/snowflake.ttypony
index b23158f..b23158f 100644
--- a/ttyponies/snowflake.pony
+++ b/ponies/snowflake.ttypony
diff --git a/ponies/soarin.quotes b/ponies/soarin.quotes
new file mode 100644
index 0000000..da0eb64
--- /dev/null
+++ b/ponies/soarin.quotes
@@ -0,0 +1,5 @@
+As a horse.
+
+My pie!
+
+You saved it!
diff --git a/ttyponies/soarin.pony b/ponies/soarin.ttypony
index ee4da73..ee4da73 100644
--- a/ttyponies/soarin.pony
+++ b/ponies/soarin.ttypony
diff --git a/ttyponies/soarinofficer.pony b/ponies/soarinofficer.ttypony
index 55e2ff9..55e2ff9 100644
--- a/ttyponies/soarinofficer.pony
+++ b/ponies/soarinofficer.ttypony
diff --git a/ttyponies/soigne.pony b/ponies/soigne.ttypony
index d5a8dd5..d5a8dd5 100644
--- a/ttyponies/soigne.pony
+++ b/ponies/soigne.ttypony
diff --git a/ttyponies/sparkler.pony b/ponies/sparkler.ttypony
index 8fc3e06..8fc3e06 100644
--- a/ttyponies/sparkler.pony
+++ b/ponies/sparkler.ttypony
diff --git a/ponies/spike.quotes b/ponies/spike.quotes
new file mode 100644
index 0000000..d3cce2f
--- /dev/null
+++ b/ponies/spike.quotes
@@ -0,0 +1,15 @@
+Is it... ZOMBIES?!
+
+Ugh ... come on, you guys! Let me in!
+
+Do I have to?
+
+Don't tell anypony, but I have a crush on... Rarity!
+
+Another donut! Extra sprinkles!
+
+Can you do that? Can you explode twice?
+
+Whoa! Dude, that's creepy.
+
+Hey! Say it, don't spray it.
diff --git a/ttyponies/spike.pony b/ponies/spike.ttypony
index 19bfb17..19bfb17 100644
--- a/ttyponies/spike.pony
+++ b/ponies/spike.ttypony
diff --git a/ttyponies/spikefloat.pony b/ponies/spikefloat.ttypony
index 982713d..982713d 100644
--- a/ttyponies/spikefloat.pony
+++ b/ponies/spikefloat.ttypony
diff --git a/ttyponies/spikelove.pony b/ponies/spikelove.ttypony
index b3026d7..b3026d7 100644
--- a/ttyponies/spikelove.pony
+++ b/ponies/spikelove.ttypony
diff --git a/ttyponies/spikemustache.pony b/ponies/spikemustache.ttypony
index 94c2948..94c2948 100644
--- a/ttyponies/spikemustache.pony
+++ b/ponies/spikemustache.ttypony
diff --git a/ponyquotes/spitfire.0 b/ponies/spitfire.quotes
index 0addcc1..0addcc1 100644
--- a/ponyquotes/spitfire.0
+++ b/ponies/spitfire.quotes
diff --git a/ttyponies/spitfire.pony b/ponies/spitfire.ttypony
index 4fedc02..4fedc02 100644
--- a/ttyponies/spitfire.pony
+++ b/ponies/spitfire.ttypony
diff --git a/ttyponies/spot.pony b/ponies/spot.ttypony
index 0b4fafb..0b4fafb 100644
--- a/ttyponies/spot.pony
+++ b/ponies/spot.ttypony
diff --git a/ttyponies/starlight.pony b/ponies/starlight.ttypony
index 4a16244..4a16244 100644
--- a/ttyponies/starlight.pony
+++ b/ponies/starlight.ttypony
diff --git a/ttyponies/stella.pony b/ponies/stella.ttypony
index a02e73e..a02e73e 100644
--- a/ttyponies/stella.pony
+++ b/ponies/stella.ttypony
diff --git a/ttyponies/stevenmagnet.pony b/ponies/stevenmagnet.ttypony
index 49ff34e..49ff34e 100644
--- a/ttyponies/stevenmagnet.pony
+++ b/ponies/stevenmagnet.ttypony
diff --git a/ttyponies/stevenmagnettrue.pony b/ponies/stevenmagnettrue.ttypony
index e3b6d90..e3b6d90 100644
--- a/ttyponies/stevenmagnettrue.pony
+++ b/ponies/stevenmagnettrue.ttypony
diff --git a/ttyponies/strongheart.pony b/ponies/strongheart.ttypony
index 9c3a2e8..9c3a2e8 100644
--- a/ttyponies/strongheart.pony
+++ b/ponies/strongheart.ttypony
diff --git a/ttyponies/sue.pony b/ponies/sue.ttypony
index 63a1168..63a1168 100644
--- a/ttyponies/sue.pony
+++ b/ponies/sue.ttypony
diff --git a/ttyponies/suedance.pony b/ponies/suedance.ttypony
index 1f9e307..1f9e307 100644
--- a/ttyponies/suedance.pony
+++ b/ponies/suedance.ttypony
diff --git a/ttyponies/sunnyrays.pony b/ponies/sunnyrays.ttypony
index 80753aa..80753aa 100644
--- a/ttyponies/sunnyrays.pony
+++ b/ponies/sunnyrays.ttypony
diff --git a/ttyponies/surprise.pony b/ponies/surprise.ttypony
index 68b912d..68b912d 100644
--- a/ttyponies/surprise.pony
+++ b/ponies/surprise.ttypony
diff --git a/ttyponies/sweatiesing.pony b/ponies/sweatiesing.ttypony
index aebb1ee..aebb1ee 100644
--- a/ttyponies/sweatiesing.pony
+++ b/ponies/sweatiesing.ttypony
diff --git a/ponies/sweetie.quotes b/ponies/sweetie.quotes
new file mode 100644
index 0000000..e311c38
--- /dev/null
+++ b/ponies/sweetie.quotes
@@ -0,0 +1,13 @@
+That doesn't look like a table...
+
+I really like her... mane?
+
+Nope. Toast!
+
+I know this one!
+
+Oh my, sounds serious.
+
+We are the Cutie Mark Crusaders!
+
+We could form our own secret society!
diff --git a/ttyponies/sweetie.pony b/ponies/sweetie.ttypony
index e72e14d..e72e14d 100644
--- a/ttyponies/sweetie.pony
+++ b/ponies/sweetie.ttypony
diff --git a/ttyponies/tank.pony b/ponies/tank.ttypony
index 0b04f6b..0b04f6b 100644
--- a/ttyponies/tank.pony
+++ b/ponies/tank.ttypony
diff --git a/ttyponies/tenderheart.pony b/ponies/tenderheart.ttypony
index 1680fd4..1680fd4 100644
--- a/ttyponies/tenderheart.pony
+++ b/ponies/tenderheart.ttypony
diff --git a/ttyponies/theodoredonaldkerabatsos.pony b/ponies/theodoredonaldkerabatsos.ttypony
index 315594d..315594d 100644
--- a/ttyponies/theodoredonaldkerabatsos.pony
+++ b/ponies/theodoredonaldkerabatsos.ttypony
diff --git a/ttyponies/thunderlane.pony b/ponies/thunderlane.ttypony
index 087be38..087be38 100644
--- a/ttyponies/thunderlane.pony
+++ b/ponies/thunderlane.ttypony
diff --git a/ttyponies/timeturner.pony b/ponies/timeturner.ttypony
index 1a04f78..1a04f78 100644
--- a/ttyponies/timeturner.pony
+++ b/ponies/timeturner.ttypony
diff --git a/ttyponies/tom.pony b/ponies/tom.ttypony
index 0dd258b..0dd258b 100644
--- a/ttyponies/tom.pony
+++ b/ponies/tom.ttypony
diff --git a/ttyponies/tornadobolt.pony b/ponies/tornadobolt.ttypony
index cb7a77f..cb7a77f 100644
--- a/ttyponies/tornadobolt.pony
+++ b/ponies/tornadobolt.ttypony
diff --git a/ponies/trixie.quotes b/ponies/trixie.quotes
new file mode 100644
index 0000000..59b9e6e
--- /dev/null
+++ b/ponies/trixie.quotes
@@ -0,0 +1,13 @@
+Anything you can do, I can do better.
+
+It's true my enthusiastic little admirers.
+
+Well, come on. Show Trixie what you've got!
+
+The Great and Powerful Trixie!
+
+Was there ever any doubt?
+
+Watch in awe as Trixies performs the most amazing feat for magic every witnessed by pony eyes!
+
+Well, well, well. It seems we have some “neigh-sayers” in the audience.
diff --git a/ttyponies/trixie.pony b/ponies/trixie.ttypony
index e0f21f7..e0f21f7 100644
--- a/ttyponies/trixie.pony
+++ b/ponies/trixie.ttypony
diff --git a/ttyponies/trixielulamoon.pony b/ponies/trixielulamoon.ttypony
index 76684f9..76684f9 120000
--- a/ttyponies/trixielulamoon.pony
+++ b/ponies/trixielulamoon.ttypony
diff --git a/ttyponies/trixiestage.pony b/ponies/trixiestage.ttypony
index c7ff747..c7ff747 100644
--- a/ttyponies/trixiestage.pony
+++ b/ponies/trixiestage.ttypony
diff --git a/ttyponies/trixiestand.pony b/ponies/trixiestand.ttypony
index f85db38..f85db38 100644
--- a/ttyponies/trixiestand.pony
+++ b/ponies/trixiestand.ttypony
diff --git a/ttyponies/truffleshuffle.pony b/ponies/truffleshuffle.ttypony
index ed48cc2..ed48cc2 100644
--- a/ttyponies/truffleshuffle.pony
+++ b/ponies/truffleshuffle.ttypony
diff --git a/ttyponies/turf.pony b/ponies/turf.ttypony
index 892dccf..892dccf 100644
--- a/ttyponies/turf.pony
+++ b/ponies/turf.ttypony
diff --git a/ttyponies/turnip.pony b/ponies/turnip.ttypony
index 5e7d071..5e7d071 100644
--- a/ttyponies/turnip.pony
+++ b/ponies/turnip.ttypony
diff --git a/ponies/twilight.quotes b/ponies/twilight.quotes
new file mode 100644
index 0000000..9e35434
--- /dev/null
+++ b/ponies/twilight.quotes
@@ -0,0 +1,51 @@
+All the ponies in this town are CRAZY!
+
+Um, not very likely.
+
+Rainbow must be angry with Applejack.
+She must hate her guts.
+Ohh ... how wonderful!
+
+Cross my heart and hope to fly, stick a cupcake in my ... OW!
+
+Yesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyes!
+
+Your faithful student, Twilight Sparkle.
+
+Please don't hate me.
+
+Pardon me, Princess.
+
+You told me it was all an old pony tale.
+
+Look out, here comes Tom!
+
+It's the perfect plan.
+
+We will do everything by the book!
+
+Scarf? Check.
+Saddle? Check.
+Boots? Check.
+‘Spike refusing to get up and go back to sleep’? Check.
+It's a good thing I'm so organised. I'm ready!
+
+Ooh! Doesn't that hurt?
+
+Are you crazy?
+
+I uh, I think I hear my laundry calling! Sorry, gotta go.
+
+She only has one cat.
+
+I never thought it would happen. My friends ... have turned into complete JERKS!
+
+If you can't catch her, Discord wins!
+
+Get back! All of you! This is my book. And I'm going to READ IT!
+
+Pinkie Pie, you're a genius!
+
+I'm going to do what I do best: lecture her!
+
+Pinkie Pie, aren't you a little old for this?
diff --git a/ttyponies/twilight.pony b/ponies/twilight.ttypony
index 5d19c58..5d19c58 100644
--- a/ttyponies/twilight.pony
+++ b/ponies/twilight.ttypony
diff --git a/ttyponies/twilightcrazyfromball.pony b/ponies/twilightcrazyfromball.ttypony
index 591c165..591c165 100644
--- a/ttyponies/twilightcrazyfromball.pony
+++ b/ponies/twilightcrazyfromball.ttypony
diff --git a/ttyponies/twilightrage.pony b/ponies/twilightrage.ttypony
index 193ffa2..193ffa2 100644
--- a/ttyponies/twilightrage.pony
+++ b/ponies/twilightrage.ttypony
diff --git a/ttyponies/twilightspike.pony b/ponies/twilightspike.ttypony
index 159922d..159922d 100644
--- a/ttyponies/twilightspike.pony
+++ b/ponies/twilightspike.ttypony
diff --git a/ttyponies/twilightthebearded.pony b/ponies/twilightthebearded.ttypony
index d9c4c9f..d9c4c9f 100644
--- a/ttyponies/twilightthebearded.pony
+++ b/ponies/twilightthebearded.ttypony
diff --git a/ttyponies/twilighttime.pony b/ponies/twilighttime.ttypony
index 624a3f3..624a3f3 100644
--- a/ttyponies/twilighttime.pony
+++ b/ponies/twilighttime.ttypony
diff --git a/ttyponies/twilightvelvet.pony b/ponies/twilightvelvet.ttypony
index 6361d03..6361d03 120000
--- a/ttyponies/twilightvelvet.pony
+++ b/ponies/twilightvelvet.ttypony
diff --git a/ttyponies/twilightzero.pony b/ponies/twilightzero.ttypony
index f53d009..f53d009 100644
--- a/ttyponies/twilightzero.pony
+++ b/ponies/twilightzero.ttypony
diff --git a/ponyquotes/twist.0 b/ponies/twist.quotes
index 798e4b2..798e4b2 100644
--- a/ponyquotes/twist.0
+++ b/ponies/twist.quotes
diff --git a/ttyponies/twist.pony b/ponies/twist.ttypony
index 73eec5f..73eec5f 100644
--- a/ttyponies/twist.pony
+++ b/ponies/twist.ttypony
diff --git a/ttyponies/vinyl.pony b/ponies/vinyl.ttypony
index c8970da..c8970da 100644
--- a/ttyponies/vinyl.pony
+++ b/ponies/vinyl.ttypony
diff --git a/ttyponies/violet.pony b/ponies/violet.ttypony
index 7c8c7af..7c8c7af 100644
--- a/ttyponies/violet.pony
+++ b/ponies/violet.ttypony
diff --git a/ttyponies/waltercoltchak.pony b/ponies/waltercoltchak.ttypony
index 57c7551..57c7551 100644
--- a/ttyponies/waltercoltchak.pony
+++ b/ponies/waltercoltchak.ttypony
diff --git a/ttyponies/wildfire.pony b/ponies/wildfire.ttypony
index 8137857..8137857 100644
--- a/ttyponies/wildfire.pony
+++ b/ponies/wildfire.ttypony
diff --git a/ttyponies/winona.pony b/ponies/winona.ttypony
index 9b03cb3..9b03cb3 100644
--- a/ttyponies/winona.pony
+++ b/ponies/winona.ttypony
diff --git a/ttyponies/woona.pony b/ponies/woona.ttypony
index 785018a..785018a 100644
--- a/ttyponies/woona.pony
+++ b/ponies/woona.ttypony
diff --git a/ponies/zecora.quotes b/ponies/zecora.quotes
new file mode 100644
index 0000000..131d8c5
--- /dev/null
+++ b/ponies/zecora.quotes
@@ -0,0 +1,17 @@
+Beware! Beware you pony folk! Those leaves of blue are not a joke!
+
+Have you gone mad?
+
+Is that a parasprite before my eyes?
+
+Your actions will make my anger explode!
+
+My Lair! My Lair!
+
+Ponies, what is this...
+No, you know not what you do.
+You've gone and spilled my precious brew.
+
+How dare you!
+You destroy my home, destroy my works,
+an then accuse me, of being a jerk?
diff --git a/ttyponies/zecora.pony b/ponies/zecora.ttypony
index cd37c56..cd37c56 100644
--- a/ttyponies/zecora.pony
+++ b/ponies/zecora.ttypony
diff --git a/ttyponies/zecorabalance.pony b/ponies/zecorabalance.ttypony
index f9eecae..f9eecae 100644
--- a/ttyponies/zecorabalance.pony
+++ b/ponies/zecorabalance.ttypony
diff --git a/dev/pony-checklist b/pony-checklist
index 214b2f0..214b2f0 100644
--- a/dev/pony-checklist
+++ b/pony-checklist
diff --git a/ponycenter.py b/ponycenter.py
deleted file mode 100755
index 66e64fe..0000000
--- a/ponycenter.py
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env python3
-
-import os,sys,time, itertools
-import argparse
-from subprocess import *
-try:
- import re2 as re
-except:
- import re
-
-'''
-Gets the size of the terminal in (rows, columns)
-
-@return (rows, columns):(int, int) The number or lines and the number of columns in the terminal's display area, [24, 80] if the size cannot be found
-'''
-def gettermsize():
- return [int(x) for x in
- next(itertools.chain(
- (x for x in
- (Popen(['stty', 'size'], stdout=PIPE, stdin=fd, stderr=PIPE).communicate()[0].split()
- for fd in [sys.stdin, sys.stdout, sys.stderr])
- if x),
- [[24, 80]]
- )
- )
- ]
-
-parser = argparse.ArgumentParser(description='Center stuff on terminals')
-parser.add_argument('string', nargs='*', type=str)
-args = parser.parse_args()
-
-for e in [sys.stdin] + args.string:
- lines = [e] if isinstance(e, str) else e.readlines()
- if lines:
- width = max(map(len, map(lambda s: re.sub(r'\x1B\[[0-9;]+m|\$.*\$', '', s), lines)))
- pad = int((gettermsize()[1]- width)/2)
- for line in lines:
- print(' '*pad + re.sub(r'\$.*\$|\n', '', line))
-
diff --git a/ponyquotes/applebloom.0 b/ponyquotes/applebloom.0
deleted file mode 100644
index 03d8212..0000000
--- a/ponyquotes/applebloom.0
+++ /dev/null
@@ -1 +0,0 @@
-Aren't you gonna stay for brunch?
diff --git a/ponyquotes/applebloom.1 b/ponyquotes/applebloom.1
deleted file mode 100644
index 38d6e6a..0000000
--- a/ponyquotes/applebloom.1
+++ /dev/null
@@ -1 +0,0 @@
-But I want it now!
diff --git a/ponyquotes/applebloom.2 b/ponyquotes/applebloom.2
deleted file mode 100644
index 5daed92..0000000
--- a/ponyquotes/applebloom.2
+++ /dev/null
@@ -1 +0,0 @@
-I am a big pony!
diff --git a/ponyquotes/applebloom.3 b/ponyquotes/applebloom.3
deleted file mode 100644
index cb7db46..0000000
--- a/ponyquotes/applebloom.3
+++ /dev/null
@@ -1 +0,0 @@
-I'm not a baby, I can take care of myself!
diff --git a/ponyquotes/applebloom.4 b/ponyquotes/applebloom.4
deleted file mode 100644
index bdd34ed..0000000
--- a/ponyquotes/applebloom.4
+++ /dev/null
@@ -1 +0,0 @@
-Likely story.
diff --git a/ponyquotes/applebloom.5 b/ponyquotes/applebloom.5
deleted file mode 100644
index 1f944f6..0000000
--- a/ponyquotes/applebloom.5
+++ /dev/null
@@ -1 +0,0 @@
-Not the cupcakes! Trust me.
diff --git a/ponyquotes/applebloom.6 b/ponyquotes/applebloom.6
deleted file mode 100644
index 430eee6..0000000
--- a/ponyquotes/applebloom.6
+++ /dev/null
@@ -1 +0,0 @@
-Somepony needs to put this thing out of its misery.
diff --git a/ponyquotes/applebloom.7 b/ponyquotes/applebloom.7
deleted file mode 100644
index a905bce..0000000
--- a/ponyquotes/applebloom.7
+++ /dev/null
@@ -1 +0,0 @@
-You're not using power tools, are you?
diff --git a/ponyquotes/applebloom.8 b/ponyquotes/applebloom.8
deleted file mode 100644
index 825dd18..0000000
--- a/ponyquotes/applebloom.8
+++ /dev/null
@@ -1 +0,0 @@
-Scootaloo! Scoot-Scootaloo!
diff --git a/ponyquotes/applejack.0 b/ponyquotes/applejack.0
deleted file mode 100644
index dd8add8..0000000
--- a/ponyquotes/applejack.0
+++ /dev/null
@@ -1 +0,0 @@
-Don't you use your fancy mathematics to muddy the issue!
diff --git a/ponyquotes/applejack.1 b/ponyquotes/applejack.1
deleted file mode 100644
index ced7b5f..0000000
--- a/ponyquotes/applejack.1
+++ /dev/null
@@ -1 +0,0 @@
-‘Dressed’? Um, beg your pardon, Rarity, but we don't normally wear clothes.
diff --git a/ponyquotes/applejack.2 b/ponyquotes/applejack.2
deleted file mode 100644
index 375b1ef..0000000
--- a/ponyquotes/applejack.2
+++ /dev/null
@@ -1 +0,0 @@
-The same way [Discord] got you to think that cheap rock was a bona fide diamond.
diff --git a/ponyquotes/applejack.3 b/ponyquotes/applejack.3
deleted file mode 100644
index c4afd03..0000000
--- a/ponyquotes/applejack.3
+++ /dev/null
@@ -1 +0,0 @@
-If you can take this bull by the horns you better be ready for a ride!
diff --git a/ponyquotes/applejack.4 b/ponyquotes/applejack.4
deleted file mode 100644
index d2e10cd..0000000
--- a/ponyquotes/applejack.4
+++ /dev/null
@@ -1 +0,0 @@
-Can't hear you! I'm asleep! *SNORE*
diff --git a/ponyquotes/applejack.5 b/ponyquotes/applejack.5
deleted file mode 100644
index 0b61e0f..0000000
--- a/ponyquotes/applejack.5
+++ /dev/null
@@ -1 +0,0 @@
-Don't you use your fancy mathematics to muddle the issue!
diff --git a/ponyquotes/applejack.6 b/ponyquotes/applejack.6
deleted file mode 100644
index 357df3b..0000000
--- a/ponyquotes/applejack.6
+++ /dev/null
@@ -1 +0,0 @@
-I hate to say I told you so. But I told you so.
diff --git a/ponyquotes/applejack.7 b/ponyquotes/applejack.7
deleted file mode 100644
index 005f0db..0000000
--- a/ponyquotes/applejack.7
+++ /dev/null
@@ -1 +0,0 @@
-We don't normally wear clothes
diff --git a/ponyquotes/applejack.8 b/ponyquotes/applejack.8
deleted file mode 100644
index 5110763..0000000
--- a/ponyquotes/applejack.8
+++ /dev/null
@@ -1 +0,0 @@
-I knew you could do it.
diff --git a/ponyquotes/applejack.9 b/ponyquotes/applejack.9
deleted file mode 100644
index f10e5fd..0000000
--- a/ponyquotes/applejack.9
+++ /dev/null
@@ -1 +0,0 @@
-Who are you calling a baby?
diff --git a/ponyquotes/bigmac.0 b/ponyquotes/bigmac.0
deleted file mode 100644
index 7445a30..0000000
--- a/ponyquotes/bigmac.0
+++ /dev/null
@@ -1 +0,0 @@
-Ayup.
diff --git a/ponyquotes/bigmac.1 b/ponyquotes/bigmac.1
deleted file mode 100644
index 06053c4..0000000
--- a/ponyquotes/bigmac.1
+++ /dev/null
@@ -1 +0,0 @@
-Nope.
diff --git a/ponyquotes/bigmac.2 b/ponyquotes/bigmac.2
deleted file mode 100644
index 0aa01b2..0000000
--- a/ponyquotes/bigmac.2
+++ /dev/null
@@ -1 +0,0 @@
-Biting off more than you can chew is just what I'm afraid of.
diff --git a/ponyquotes/bigmac.3 b/ponyquotes/bigmac.3
deleted file mode 100644
index 9948362..0000000
--- a/ponyquotes/bigmac.3
+++ /dev/null
@@ -1 +0,0 @@
-One pony plus hundreds of appletrees just doesn't add up.
diff --git a/ponyquotes/bigmac.4 b/ponyquotes/bigmac.4
deleted file mode 100644
index 8ec8add..0000000
--- a/ponyquotes/bigmac.4
+++ /dev/null
@@ -1 +0,0 @@
-Too big for you to handle on your own.
diff --git a/ponyquotes/bonbon.1 b/ponyquotes/bonbon.1
deleted file mode 100644
index 32815d5..0000000
--- a/ponyquotes/bonbon.1
+++ /dev/null
@@ -1 +0,0 @@
-I didn't put those in my bag.
diff --git a/ponyquotes/braeburn.0 b/ponyquotes/braeburn.0
deleted file mode 100644
index fcc35f9..0000000
--- a/ponyquotes/braeburn.0
+++ /dev/null
@@ -1 +0,0 @@
-Shame on you!
diff --git a/ponyquotes/braeburn.1 b/ponyquotes/braeburn.1
deleted file mode 100644
index ec1f49b..0000000
--- a/ponyquotes/braeburn.1
+++ /dev/null
@@ -1 +0,0 @@
-'Taint fair!
diff --git a/ponyquotes/braeburn.2 b/ponyquotes/braeburn.2
deleted file mode 100644
index 0b774c2..0000000
--- a/ponyquotes/braeburn.2
+++ /dev/null
@@ -1 +0,0 @@
-Welcome to Appleoosa!
diff --git a/ponyquotes/carrot.0 b/ponyquotes/carrot.0
deleted file mode 100644
index 5a98017..0000000
--- a/ponyquotes/carrot.0
+++ /dev/null
@@ -1 +0,0 @@
-Welcome, Princess Celest!
diff --git a/ponyquotes/celestia.1 b/ponyquotes/celestia.1
deleted file mode 100644
index 626fab8..0000000
--- a/ponyquotes/celestia.1
+++ /dev/null
@@ -1 +0,0 @@
-Gotcha!
diff --git a/ponyquotes/celestia.2 b/ponyquotes/celestia.2
deleted file mode 100644
index 14197a9..0000000
--- a/ponyquotes/celestia.2
+++ /dev/null
@@ -1 +0,0 @@
-These creatures are adorable!
diff --git a/ponyquotes/celestia.3 b/ponyquotes/celestia.3
deleted file mode 100644
index 2b94ed5..0000000
--- a/ponyquotes/celestia.3
+++ /dev/null
@@ -1 +0,0 @@
-I want you right by my side the entire evening.
diff --git a/ponyquotes/celestia.4 b/ponyquotes/celestia.4
deleted file mode 100644
index 5b50c4f..0000000
--- a/ponyquotes/celestia.4
+++ /dev/null
@@ -1 +0,0 @@
-Will you accept my friendship?
diff --git a/ponyquotes/cheerilee.1 b/ponyquotes/cheerilee.1
deleted file mode 100644
index 57f711f..0000000
--- a/ponyquotes/cheerilee.1
+++ /dev/null
@@ -1 +0,0 @@
-Everypony should get fun gifts on their birthday.
diff --git a/ponyquotes/chrysalis.1 b/ponyquotes/chrysalis.1
deleted file mode 100644
index 5ea7168..0000000
--- a/ponyquotes/chrysalis.1
+++ /dev/null
@@ -1 +0,0 @@
-You do realize the reception has been canceled, don't you? \ No newline at end of file
diff --git a/ponyquotes/derpy.0 b/ponyquotes/derpy.0
deleted file mode 100644
index b7a3483..0000000
--- a/ponyquotes/derpy.0
+++ /dev/null
@@ -1 +0,0 @@
-Muffin...
diff --git a/ponyquotes/derpy.1 b/ponyquotes/derpy.1
deleted file mode 100644
index e7118ad..0000000
--- a/ponyquotes/derpy.1
+++ /dev/null
@@ -1 +0,0 @@
-I don't know what went wrong!
diff --git a/ponyquotes/derpy.2 b/ponyquotes/derpy.2
deleted file mode 100644
index 6c9a555..0000000
--- a/ponyquotes/derpy.2
+++ /dev/null
@@ -1 +0,0 @@
-You okay Rainbow Dash? Anything I can do to help?
diff --git a/ponyquotes/derpy.3 b/ponyquotes/derpy.3
deleted file mode 100644
index d7a7444..0000000
--- a/ponyquotes/derpy.3
+++ /dev/null
@@ -1 +0,0 @@
-I just don't know what went wrong!
diff --git a/ponyquotes/derpy.4 b/ponyquotes/derpy.4
deleted file mode 100644
index 4f4b2b7..0000000
--- a/ponyquotes/derpy.4
+++ /dev/null
@@ -1 +0,0 @@
-Are you okey Applejack, anything I can do to help?
diff --git a/ponyquotes/fluttershy.0 b/ponyquotes/fluttershy.0
deleted file mode 100644
index 485061e..0000000
--- a/ponyquotes/fluttershy.0
+++ /dev/null
@@ -1,2 +0,0 @@
-Um, Pinkie Pie ... about this party for Gilda;
-do you really think it's a good idea? I mean...
diff --git a/ponyquotes/fluttershy.1 b/ponyquotes/fluttershy.1
deleted file mode 100644
index 7e11619..0000000
--- a/ponyquotes/fluttershy.1
+++ /dev/null
@@ -1 +0,0 @@
-I'm a year older than you.
diff --git a/ponyquotes/fluttershy.10 b/ponyquotes/fluttershy.10
deleted file mode 100644
index 419fff3..0000000
--- a/ponyquotes/fluttershy.10
+++ /dev/null
@@ -1 +0,0 @@
-Uh, panic?
diff --git a/ponyquotes/fluttershy.11 b/ponyquotes/fluttershy.11
deleted file mode 100644
index 503f864..0000000
--- a/ponyquotes/fluttershy.11
+++ /dev/null
@@ -1,8 +0,0 @@
-The armscye's tight, the middy collar doesn't go with the shawl lapel,
-the hems are clearly machine-stitched, the pleats are uneven, the
-fabric looks like toile, you used a backstitch here when it clearly
-called for a topstitch, or maybe a traditional blanket stitch, and the
-overall design is reminiscent of prêt-à-porter and not true French
-haute couture...
-
-But ... uh ... you know ... um ... whatever you want to do is fine...
diff --git a/ponyquotes/fluttershy.12 b/ponyquotes/fluttershy.12
deleted file mode 100644
index 1e48e6f..0000000
--- a/ponyquotes/fluttershy.12
+++ /dev/null
@@ -1,4 +0,0 @@
-Well ... It's a game about who can be quiet the longest. Sound fun?
-I'm the world champ, you know. I betcha can't beat me!
-
-~Squee~
diff --git a/ponyquotes/fluttershy.13 b/ponyquotes/fluttershy.13
deleted file mode 100644
index 45c7b3d..0000000
--- a/ponyquotes/fluttershy.13
+++ /dev/null
@@ -1,2 +0,0 @@
-I'll catch you yet, my pretties. Oh yes. As soon as one of you little
-birds or monkeys or bears touches this net ... you'll be MINE! MINE!
diff --git a/ponyquotes/fluttershy.14 b/ponyquotes/fluttershy.14
deleted file mode 100644
index 7b3b6b4..0000000
--- a/ponyquotes/fluttershy.14
+++ /dev/null
@@ -1 +0,0 @@
-A sonic rainboom! She did it! She did it! WOOO!
diff --git a/ponyquotes/fluttershy.15 b/ponyquotes/fluttershy.15
deleted file mode 100644
index a4793c6..0000000
--- a/ponyquotes/fluttershy.15
+++ /dev/null
@@ -1,3 +0,0 @@
-Now wait just a minute! Oh, I'm sorry.
-I'm trying to be more assertive. Anyhow...
-She *is* going to do a sonic rainboom!
diff --git a/ponyquotes/fluttershy.16 b/ponyquotes/fluttershy.16
deleted file mode 100644
index 8f9f529..0000000
--- a/ponyquotes/fluttershy.16
+++ /dev/null
@@ -1 +0,0 @@
-Then show up at the Cloudseum and see for yourself! ... If you're free.
diff --git a/ponyquotes/fluttershy.17 b/ponyquotes/fluttershy.17
deleted file mode 100644
index 3c8135e..0000000
--- a/ponyquotes/fluttershy.17
+++ /dev/null
@@ -1,3 +0,0 @@
-Hey Twilight, what's soaking wet and clueless?
-[⋅⋅⋅]
-YOUR FACE!
diff --git a/ponyquotes/fluttershy.18 b/ponyquotes/fluttershy.18
deleted file mode 100644
index 24c1e07..0000000
--- a/ponyquotes/fluttershy.18
+++ /dev/null
@@ -1 +0,0 @@
-Good boy, Angel! Mama's so proud!
diff --git a/ponyquotes/fluttershy.19 b/ponyquotes/fluttershy.19
deleted file mode 100644
index 58cae0b..0000000
--- a/ponyquotes/fluttershy.19
+++ /dev/null
@@ -1,2 +0,0 @@
-Um ... I'm just wondering if it's okay if I hold
-you down against your will for a little bit?
diff --git a/ponyquotes/fluttershy.2 b/ponyquotes/fluttershy.2
deleted file mode 100644
index 17ebff9..0000000
--- a/ponyquotes/fluttershy.2
+++ /dev/null
@@ -1 +0,0 @@
-Yay.
diff --git a/ponyquotes/fluttershy.20 b/ponyquotes/fluttershy.20
deleted file mode 100644
index e9de4bb..0000000
--- a/ponyquotes/fluttershy.20
+++ /dev/null
@@ -1,3 +0,0 @@
-I can't believe this ... I am so frustrated, I could just scream!
-
-(Eee!)
diff --git a/ponyquotes/fluttershy.21 b/ponyquotes/fluttershy.21
deleted file mode 100644
index 59b8082..0000000
--- a/ponyquotes/fluttershy.21
+++ /dev/null
@@ -1,3 +0,0 @@
-Yes. Because he wasn't a huge, gigantic, terrible, enormous,
-teeth-gnashing, sharp scale-having, horn-wearing, smoke-snoring,
-could-eat-a-pony-in-one-bite, totally-all-grown-up dragon.
diff --git a/ponyquotes/fluttershy.22 b/ponyquotes/fluttershy.22
deleted file mode 100644
index 4aaf93c..0000000
--- a/ponyquotes/fluttershy.22
+++ /dev/null
@@ -1 +0,0 @@
-What is this place, filled with so many wonders?
diff --git a/ponyquotes/fluttershy.23 b/ponyquotes/fluttershy.23
deleted file mode 100644
index cd260f3..0000000
--- a/ponyquotes/fluttershy.23
+++ /dev/null
@@ -1 +0,0 @@
-Oooh, what a magical place!
diff --git a/ponyquotes/fluttershy.24 b/ponyquotes/fluttershy.24
deleted file mode 100644
index e326d8c..0000000
--- a/ponyquotes/fluttershy.24
+++ /dev/null
@@ -1 +0,0 @@
-*crazy laugh*
diff --git a/ponyquotes/fluttershy.25 b/ponyquotes/fluttershy.25
deleted file mode 100644
index 733433d..0000000
--- a/ponyquotes/fluttershy.25
+++ /dev/null
@@ -1 +0,0 @@
-How dare you!
diff --git a/ponyquotes/fluttershy.26 b/ponyquotes/fluttershy.26
deleted file mode 100644
index 582195f..0000000
--- a/ponyquotes/fluttershy.26
+++ /dev/null
@@ -1 +0,0 @@
-I'd like to be a tree.
diff --git a/ponyquotes/fluttershy.27 b/ponyquotes/fluttershy.27
deleted file mode 100644
index 4dd0e9a..0000000
--- a/ponyquotes/fluttershy.27
+++ /dev/null
@@ -1 +0,0 @@
-I don't wanna talk about it.
diff --git a/ponyquotes/fluttershy.28 b/ponyquotes/fluttershy.28
deleted file mode 100644
index c273715..0000000
--- a/ponyquotes/fluttershy.28
+++ /dev/null
@@ -1 +0,0 @@
-I am so sorry to have scared you, my friends.
diff --git a/ponyquotes/fluttershy.29 b/ponyquotes/fluttershy.29
deleted file mode 100644
index b85254b..0000000
--- a/ponyquotes/fluttershy.29
+++ /dev/null
@@ -1 +0,0 @@
-I am the world champ, you know. A bet you can't beat me.
diff --git a/ponyquotes/fluttershy.3 b/ponyquotes/fluttershy.3
deleted file mode 100644
index 5418338..0000000
--- a/ponyquotes/fluttershy.3
+++ /dev/null
@@ -1 +0,0 @@
-Yay!
diff --git a/ponyquotes/fluttershy.30 b/ponyquotes/fluttershy.30
deleted file mode 100644
index afd7b96..0000000
--- a/ponyquotes/fluttershy.30
+++ /dev/null
@@ -1 +0,0 @@
-You're the cutest thing ever!
diff --git a/ponyquotes/fluttershy.31 b/ponyquotes/fluttershy.31
deleted file mode 100644
index 91117d4..0000000
--- a/ponyquotes/fluttershy.31
+++ /dev/null
@@ -1 +0,0 @@
-You rock, woohoo!
diff --git a/ponyquotes/fluttershy.4 b/ponyquotes/fluttershy.4
deleted file mode 100644
index 7145ac6..0000000
--- a/ponyquotes/fluttershy.4
+++ /dev/null
@@ -1 +0,0 @@
-Yaaay ... too loud?
diff --git a/ponyquotes/fluttershy.5 b/ponyquotes/fluttershy.5
deleted file mode 100644
index 23a7c99..0000000
--- a/ponyquotes/fluttershy.5
+++ /dev/null
@@ -1 +0,0 @@
-(squeak)
diff --git a/ponyquotes/fluttershy.6 b/ponyquotes/fluttershy.6
deleted file mode 100644
index 5822dec..0000000
--- a/ponyquotes/fluttershy.6
+++ /dev/null
@@ -1 +0,0 @@
-You're ... GOING TO LOVE ME!!!
diff --git a/ponyquotes/fluttershy.7 b/ponyquotes/fluttershy.7
deleted file mode 100644
index 7056f69..0000000
--- a/ponyquotes/fluttershy.7
+++ /dev/null
@@ -1 +0,0 @@
-I can't!
diff --git a/ponyquotes/fluttershy.8 b/ponyquotes/fluttershy.8
deleted file mode 100644
index 3904535..0000000
--- a/ponyquotes/fluttershy.8
+++ /dev/null
@@ -1 +0,0 @@
-That big ... dumb ... MEANIE!!!!
diff --git a/ponyquotes/fluttershy.9 b/ponyquotes/fluttershy.9
deleted file mode 100644
index 2a092b8..0000000
--- a/ponyquotes/fluttershy.9
+++ /dev/null
@@ -1,4 +0,0 @@
-Now, Rainbow my dear, I cannot express my delight
-It's abundantly clear
-That somewhere out here
-Is a pet that will suit you just right.
diff --git a/ponyquotes/gilda.0 b/ponyquotes/gilda.0
deleted file mode 100644
index 0d41909..0000000
--- a/ponyquotes/gilda.0
+++ /dev/null
@@ -1 +0,0 @@
-That's me! Half eagle, half lion, and all awesome!
diff --git a/ponyquotes/gilda.1 b/ponyquotes/gilda.1
deleted file mode 100644
index d58e2bf..0000000
--- a/ponyquotes/gilda.1
+++ /dev/null
@@ -1 +0,0 @@
-Don't you know how to take GET LOST for an answer?
diff --git a/ponyquotes/gilda.2 b/ponyquotes/gilda.2
deleted file mode 100644
index ace9c5f..0000000
--- a/ponyquotes/gilda.2
+++ /dev/null
@@ -1 +0,0 @@
-I know what you're up to!
diff --git a/ponyquotes/gilda.3 b/ponyquotes/gilda.3
deleted file mode 100644
index 925a677..0000000
--- a/ponyquotes/gilda.3
+++ /dev/null
@@ -1 +0,0 @@
-When you decide not be lame anymore, give me a call!
diff --git a/ponyquotes/gilda.4 b/ponyquotes/gilda.4
deleted file mode 100644
index b261d18..0000000
--- a/ponyquotes/gilda.4
+++ /dev/null
@@ -1 +0,0 @@
-You're such a flip-flop! Cool one minute and lame the next.
diff --git a/ponyquotes/gilda.5 b/ponyquotes/gilda.5
deleted file mode 100644
index e3621f4..0000000
--- a/ponyquotes/gilda.5
+++ /dev/null
@@ -1,5 +0,0 @@
-*sigh* Only for you, Dash.
-Junior Speedsters are our lives
-Sky-bound soars and daring dives
-Junior Speedsters; it's our quest
-To someday be the very best
diff --git a/ponyquotes/ironwill.0 b/ponyquotes/ironwill.0
deleted file mode 100644
index 7cf295f..0000000
--- a/ponyquotes/ironwill.0
+++ /dev/null
@@ -1 +0,0 @@
-Never apologise, when you can criticise.
diff --git a/ponyquotes/ironwill.1 b/ponyquotes/ironwill.1
deleted file mode 100644
index 99e0a3d..0000000
--- a/ponyquotes/ironwill.1
+++ /dev/null
@@ -1 +0,0 @@
-Treat me like a push-over, and you will get the once-over.
diff --git a/ponyquotes/ironwill.2 b/ponyquotes/ironwill.2
deleted file mode 100644
index fb1cdaa..0000000
--- a/ponyquotes/ironwill.2
+++ /dev/null
@@ -1 +0,0 @@
-When somepony tries to block, show them that you rock.
diff --git a/ponyquotes/ironwill.3 b/ponyquotes/ironwill.3
deleted file mode 100644
index cfa9be6..0000000
--- a/ponyquotes/ironwill.3
+++ /dev/null
@@ -1 +0,0 @@
-Maybes are for babies.
diff --git a/ponyquotes/ironwill.4 b/ponyquotes/ironwill.4
deleted file mode 100644
index c384f04..0000000
--- a/ponyquotes/ironwill.4
+++ /dev/null
@@ -1 +0,0 @@
-You laugh at me? I wrath at you!
diff --git a/ponyquotes/ironwill.5 b/ponyquotes/ironwill.5
deleted file mode 100644
index 69afa39..0000000
--- a/ponyquotes/ironwill.5
+++ /dev/null
@@ -1 +0,0 @@
-Cut in line? I will take what is mine.
diff --git a/ponyquotes/ironwill.6 b/ponyquotes/ironwill.6
deleted file mode 100644
index bf925a2..0000000
--- a/ponyquotes/ironwill.6
+++ /dev/null
@@ -1 +0,0 @@
-You apologise, I penalise.
diff --git a/ponyquotes/ironwill.7 b/ponyquotes/ironwill.7
deleted file mode 100644
index 9ec8a05..0000000
--- a/ponyquotes/ironwill.7
+++ /dev/null
@@ -1 +0,0 @@
-You make me lose, I blow my fuse.
diff --git a/ponyquotes/lily.0 b/ponyquotes/lily.0
deleted file mode 100644
index cb35efc..0000000
--- a/ponyquotes/lily.0
+++ /dev/null
@@ -1 +0,0 @@
-The horror, the horror!
diff --git a/ponyquotes/luna.0 b/ponyquotes/luna.0
deleted file mode 100644
index 2675aa3..0000000
--- a/ponyquotes/luna.0
+++ /dev/null
@@ -1 +0,0 @@
-Ha, ha! The fun has been doubled!
diff --git a/ponyquotes/luna.1 b/ponyquotes/luna.1
deleted file mode 100644
index 57c7e73..0000000
--- a/ponyquotes/luna.1
+++ /dev/null
@@ -1 +0,0 @@
-I missed you so much!
diff --git a/ponyquotes/luna.2 b/ponyquotes/luna.2
deleted file mode 100644
index 871c3a4..0000000
--- a/ponyquotes/luna.2
+++ /dev/null
@@ -1 +0,0 @@
-I'm so sorry!
diff --git a/ponyquotes/luna.3 b/ponyquotes/luna.3
deleted file mode 100644
index 5667400..0000000
--- a/ponyquotes/luna.3
+++ /dev/null
@@ -1 +0,0 @@
-TOGETHER, WE SHALL TURN THIS DREADFUL NIGHT INTO A GLORIOUS FEEEEAAAAST!
diff --git a/ponyquotes/luna.4 b/ponyquotes/luna.4
deleted file mode 100644
index bf93e70..0000000
--- a/ponyquotes/luna.4
+++ /dev/null
@@ -1 +0,0 @@
-OH MOST WON... I mean, oh most wonderful of nights!
diff --git a/ponyquotes/luna.5 b/ponyquotes/luna.5
deleted file mode 100644
index ef8599d..0000000
--- a/ponyquotes/luna.5
+++ /dev/null
@@ -1 +0,0 @@
-WE COULD NOT BE HAPPIER! IS THAT NOT CLEAR?
diff --git a/ponyquotes/luna.6 b/ponyquotes/luna.6
deleted file mode 100644
index 602cd76..0000000
--- a/ponyquotes/luna.6
+++ /dev/null
@@ -1 +0,0 @@
-THIS IS THE TRADITIONAL ROYAL CANTERLOT VOICE!
diff --git a/ponyquotes/nightmare.0 b/ponyquotes/nightmare.0
deleted file mode 100644
index 1588fe2..0000000
--- a/ponyquotes/nightmare.0
+++ /dev/null
@@ -1 +0,0 @@
-Don't you know who I am?
diff --git a/ponyquotes/nightmare.1 b/ponyquotes/nightmare.1
deleted file mode 100644
index b4319ec..0000000
--- a/ponyquotes/nightmare.1
+++ /dev/null
@@ -1 +0,0 @@
-Oh, my beloved subjects!
diff --git a/ponyquotes/nightmare.2 b/ponyquotes/nightmare.2
deleted file mode 100644
index e022af3..0000000
--- a/ponyquotes/nightmare.2
+++ /dev/null
@@ -1 +0,0 @@
-The night will last FOREVER! Muhahaha!
diff --git a/ponyquotes/nightmare.3 b/ponyquotes/nightmare.3
deleted file mode 100644
index ef4e471..0000000
--- a/ponyquotes/nightmare.3
+++ /dev/null
@@ -1 +0,0 @@
-You little foal!
diff --git a/ponyquotes/nightmare.4 b/ponyquotes/nightmare.4
deleted file mode 100644
index aed400a..0000000
--- a/ponyquotes/nightmare.4
+++ /dev/null
@@ -1 +0,0 @@
-You're kidding. You're kidding, right?
diff --git a/ponyquotes/nightmare.5 b/ponyquotes/nightmare.5
deleted file mode 100644
index 1d24f09..0000000
--- a/ponyquotes/nightmare.5
+++ /dev/null
@@ -1 +0,0 @@
-Why, am I not royal enough for you? Don't you know who I am?
diff --git a/ponyquotes/photofinish.0 b/ponyquotes/photofinish.0
deleted file mode 100644
index bf9bf62..0000000
--- a/ponyquotes/photofinish.0
+++ /dev/null
@@ -1 +0,0 @@
-...It is time to make DE MAGICKS!!
diff --git a/ponyquotes/photofinish.1 b/ponyquotes/photofinish.1
deleted file mode 100644
index a3cbcc4..0000000
--- a/ponyquotes/photofinish.1
+++ /dev/null
@@ -1 +0,0 @@
-I, Photo Finish... have arrived!
diff --git a/ponyquotes/photofinish.2 b/ponyquotes/photofinish.2
deleted file mode 100644
index 814d6f1..0000000
--- a/ponyquotes/photofinish.2
+++ /dev/null
@@ -1 +0,0 @@
-I only need to point and shoot, and I capture... DE MAGICKS!
diff --git a/ponyquotes/photofinish.3 b/ponyquotes/photofinish.3
deleted file mode 100644
index b0e5b5d..0000000
--- a/ponyquotes/photofinish.3
+++ /dev/null
@@ -1 +0,0 @@
-Flootershay!
diff --git a/ponyquotes/photofinish.4 b/ponyquotes/photofinish.4
deleted file mode 100644
index 572ea13..0000000
--- a/ponyquotes/photofinish.4
+++ /dev/null
@@ -1 +0,0 @@
-Oh, wunderbar!
diff --git a/ponyquotes/pinkie.0 b/ponyquotes/pinkie.0
deleted file mode 100644
index a7b29c2..0000000
--- a/ponyquotes/pinkie.0
+++ /dev/null
@@ -1,2 +0,0 @@
-Ooh! Ooh! More guessing games! Um... Pokey Smokes!
-How about Queen Meanie? No! Black Snooty, Black Snooty!
diff --git a/ponyquotes/pinkie.1 b/ponyquotes/pinkie.1
deleted file mode 100644
index 33f8399..0000000
--- a/ponyquotes/pinkie.1
+++ /dev/null
@@ -1,2 +0,0 @@
-Don't you worry your pretty little head about mean old Gilda!
-Your Aunty Pinkie Pie's got it all taken care of!
diff --git a/ponyquotes/pinkie.10 b/ponyquotes/pinkie.10
deleted file mode 100644
index 9654c0c..0000000
--- a/ponyquotes/pinkie.10
+++ /dev/null
@@ -1 +0,0 @@
-Too old for free candy?! NEVER!
diff --git a/ponyquotes/pinkie.11 b/ponyquotes/pinkie.11
deleted file mode 100644
index aadb94d..0000000
--- a/ponyquotes/pinkie.11
+++ /dev/null
@@ -1 +0,0 @@
-I never leave home without my party cannon!
diff --git a/ponyquotes/pinkie.12 b/ponyquotes/pinkie.12
deleted file mode 100644
index 1050549..0000000
--- a/ponyquotes/pinkie.12
+++ /dev/null
@@ -1 +0,0 @@
-I'm not giving him cake! I'm ASSAULTING him with cake!
diff --git a/ponyquotes/pinkie.13 b/ponyquotes/pinkie.13
deleted file mode 100644
index 9570839..0000000
--- a/ponyquotes/pinkie.13
+++ /dev/null
@@ -1 +0,0 @@
-Hold on to your hooves, I'm about to be BRILLIANT!
diff --git a/ponyquotes/pinkie.14 b/ponyquotes/pinkie.14
deleted file mode 100644
index 4f22a20..0000000
--- a/ponyquotes/pinkie.14
+++ /dev/null
@@ -1 +0,0 @@
-APPLEJACK!!! YOU PINKIE PROMISED!!!!
diff --git a/ponyquotes/pinkie.15 b/ponyquotes/pinkie.15
deleted file mode 100644
index bb18e3d..0000000
--- a/ponyquotes/pinkie.15
+++ /dev/null
@@ -1 +0,0 @@
-Twitchy tail! Twitchy tail!!
diff --git a/ponyquotes/pinkie.16 b/ponyquotes/pinkie.16
deleted file mode 100644
index d39c011..0000000
--- a/ponyquotes/pinkie.16
+++ /dev/null
@@ -1 +0,0 @@
-When I was a little filly and the sun was going down~
diff --git a/ponyquotes/pinkie.17 b/ponyquotes/pinkie.17
deleted file mode 100644
index f3dbbe5..0000000
--- a/ponyquotes/pinkie.17
+++ /dev/null
@@ -1 +0,0 @@
-All you have to do is take a cup of flour and add it to the mix~
diff --git a/ponyquotes/pinkie.18 b/ponyquotes/pinkie.18
deleted file mode 100644
index 2ca9cd1..0000000
--- a/ponyquotes/pinkie.18
+++ /dev/null
@@ -1 +0,0 @@
-Oh the Grand Galloping Gala is the best place for me~
diff --git a/ponyquotes/pinkie.19 b/ponyquotes/pinkie.19
deleted file mode 100644
index 466fc20..0000000
--- a/ponyquotes/pinkie.19
+++ /dev/null
@@ -1 +0,0 @@
-Ugh, a parasprite!
diff --git a/ponyquotes/pinkie.2 b/ponyquotes/pinkie.2
deleted file mode 100644
index ec015bd..0000000
--- a/ponyquotes/pinkie.2
+++ /dev/null
@@ -1 +0,0 @@
-You've got a real problem all right, and a banjo is the only answer!
diff --git a/ponyquotes/pinkie.20 b/ponyquotes/pinkie.20
deleted file mode 100644
index 717de8a..0000000
--- a/ponyquotes/pinkie.20
+++ /dev/null
@@ -1 +0,0 @@
-Cross my heart and hope to fly, stick a cupcake in my eye!
diff --git a/ponyquotes/pinkie.21 b/ponyquotes/pinkie.21
deleted file mode 100644
index 1e6e640..0000000
--- a/ponyquotes/pinkie.21
+++ /dev/null
@@ -1 +0,0 @@
-Are you loco in the coco?
diff --git a/ponyquotes/pinkie.22 b/ponyquotes/pinkie.22
deleted file mode 100644
index 3924bad..0000000
--- a/ponyquotes/pinkie.22
+++ /dev/null
@@ -1 +0,0 @@
-Hay, that's what I said!
diff --git a/ponyquotes/pinkie.23 b/ponyquotes/pinkie.23
deleted file mode 100644
index c33b5a7..0000000
--- a/ponyquotes/pinkie.23
+++ /dev/null
@@ -1 +0,0 @@
-And that's how Equestria was made.
diff --git a/ponyquotes/pinkie.24 b/ponyquotes/pinkie.24
deleted file mode 100644
index f7e25aa..0000000
--- a/ponyquotes/pinkie.24
+++ /dev/null
@@ -1 +0,0 @@
-I never felt joy like that before!
diff --git a/ponyquotes/pinkie.25 b/ponyquotes/pinkie.25
deleted file mode 100644
index dc7901b..0000000
--- a/ponyquotes/pinkie.25
+++ /dev/null
@@ -1 +0,0 @@
-Oatmeal, are you crazy?
diff --git a/ponyquotes/pinkie.26 b/ponyquotes/pinkie.26
deleted file mode 100644
index 0d337f8..0000000
--- a/ponyquotes/pinkie.26
+++ /dev/null
@@ -1 +0,0 @@
-This calls for extreme measures! Pinkie Pie style!
diff --git a/ponyquotes/pinkie.27 b/ponyquotes/pinkie.27
deleted file mode 100644
index 171d490..0000000
--- a/ponyquotes/pinkie.27
+++ /dev/null
@@ -1 +0,0 @@
-This may look like fun, but it's not!
diff --git a/ponyquotes/pinkie.28 b/ponyquotes/pinkie.28
deleted file mode 100644
index ea4873b..0000000
--- a/ponyquotes/pinkie.28
+++ /dev/null
@@ -1 +0,0 @@
-You really need to get out more.
diff --git a/ponyquotes/pinkie.29 b/ponyquotes/pinkie.29
deleted file mode 100644
index bd89fa4..0000000
--- a/ponyquotes/pinkie.29
+++ /dev/null
@@ -1 +0,0 @@
-I don't need my friends... *Twitch*
diff --git a/ponyquotes/pinkie.3 b/ponyquotes/pinkie.3
deleted file mode 100644
index 0121eb5..0000000
--- a/ponyquotes/pinkie.3
+++ /dev/null
@@ -1 +0,0 @@
-You look like you'd be good at eating cupcakes!
diff --git a/ponyquotes/pinkie.30 b/ponyquotes/pinkie.30
deleted file mode 100644
index 78a0976..0000000
--- a/ponyquotes/pinkie.30
+++ /dev/null
@@ -1 +0,0 @@
-Thank you for being here today... *Twitch*
diff --git a/ponyquotes/pinkie.31 b/ponyquotes/pinkie.31
deleted file mode 100644
index be356a2..0000000
--- a/ponyquotes/pinkie.31
+++ /dev/null
@@ -1 +0,0 @@
-Aha! I knew it!
diff --git a/ponyquotes/pinkie.32 b/ponyquotes/pinkie.32
deleted file mode 100644
index a04b606..0000000
--- a/ponyquotes/pinkie.32
+++ /dev/null
@@ -1 +0,0 @@
-My friends don't like my parties and they don't wanna be my friends anymore...
diff --git a/ponyquotes/pinkie.33 b/ponyquotes/pinkie.33
deleted file mode 100644
index abb6b8a..0000000
--- a/ponyquotes/pinkie.33
+++ /dev/null
@@ -1 +0,0 @@
-I know how it goes, all right!
diff --git a/ponyquotes/pinkie.34 b/ponyquotes/pinkie.34
deleted file mode 100644
index c349f48..0000000
--- a/ponyquotes/pinkie.34
+++ /dev/null
@@ -1 +0,0 @@
-I'm just glad none of them ponies showed up!
diff --git a/ponyquotes/pinkie.35 b/ponyquotes/pinkie.35
deleted file mode 100644
index ae4da82..0000000
--- a/ponyquotes/pinkie.35
+++ /dev/null
@@ -1 +0,0 @@
-Oui! Zhat is correct, madame.
diff --git a/ponyquotes/pinkie.36 b/ponyquotes/pinkie.36
deleted file mode 100644
index bcc5542..0000000
--- a/ponyquotes/pinkie.36
+++ /dev/null
@@ -1,2 +0,0 @@
-You know what this calls for?
-A party!
diff --git a/ponyquotes/pinkie.4 b/ponyquotes/pinkie.4
deleted file mode 100644
index 3e7abb7..0000000
--- a/ponyquotes/pinkie.4
+++ /dev/null
@@ -1 +0,0 @@
-She'll become a crazy cat lady!
diff --git a/ponyquotes/pinkie.5 b/ponyquotes/pinkie.5
deleted file mode 100644
index fef7225..0000000
--- a/ponyquotes/pinkie.5
+++ /dev/null
@@ -1 +0,0 @@
-Give her time...
diff --git a/ponyquotes/pinkie.6 b/ponyquotes/pinkie.6
deleted file mode 100644
index 59001e5..0000000
--- a/ponyquotes/pinkie.6
+++ /dev/null
@@ -1 +0,0 @@
-FOREVER!!!
diff --git a/ponyquotes/pinkie.7 b/ponyquotes/pinkie.7
deleted file mode 100644
index 0314d14..0000000
--- a/ponyquotes/pinkie.7
+++ /dev/null
@@ -1 +0,0 @@
-Secrets and lies! It's all secrets and lies with those ponies!
diff --git a/ponyquotes/pinkie.8 b/ponyquotes/pinkie.8
deleted file mode 100644
index 0c5b97e..0000000
--- a/ponyquotes/pinkie.8
+++ /dev/null
@@ -1 +0,0 @@
-Hold on a second! Eternal chaos comes with chocolate rain, guys! Chocolate rain!
diff --git a/ponyquotes/pinkie.9 b/ponyquotes/pinkie.9
deleted file mode 100644
index 2cae39a..0000000
--- a/ponyquotes/pinkie.9
+++ /dev/null
@@ -1 +0,0 @@
-No I'm not, I'm a chicken! BAGAWK!
diff --git a/ponyquotes/pipsqueak.0 b/ponyquotes/pipsqueak.0
deleted file mode 100644
index 22daed4..0000000
--- a/ponyquotes/pipsqueak.0
+++ /dev/null
@@ -1 +0,0 @@
-Pipsqueak the pirate, at your service
diff --git a/ponyquotes/pipsqueak.2 b/ponyquotes/pipsqueak.2
deleted file mode 100644
index bd76e6a..0000000
--- a/ponyquotes/pipsqueak.2
+++ /dev/null
@@ -1 +0,0 @@
-It's really fun! Scary, but fun.
diff --git a/ponyquotes/ponies b/ponyquotes/ponies
deleted file mode 100644
index c689c1b..0000000
--- a/ponyquotes/ponies
+++ /dev/null
@@ -1,196 +0,0 @@
-ace
-airheart
-allie
-aloe
-angel
-applebloom+applebloomdance
-applebumpkin
-applecore
-applefritter
-applejack+applejackscarecrow+fillyjack+fillyjacktravel
-archer
-basil
-bastionyorsets+georgewashingtony
-berrypunch
-bigmac
-blaze
-blinkie
-blossomforth
-blueberry
-blueberrycake
-blueharvest
-bonbon+bonbonstand+bonbonlyra+lyrabonbon
-boxxy+craftycrate
-braeburn
-cadance+fillycadance
-caesar
-candymane
-candylicious
-caramel
-carecake
-carrot+carrottop+goldenharvest
-celestia+fillistia+fillycelestia+celestiasmall
-changeling
-cheerilee+cheerilee80
-cerberus
-cherryberry
-cherrycola
-chrysalis+changelingqueen
-clockwork+quickfix+epona
-cloudkicker
-cow
-clyde
-colton
-cottoncloudy
-cracky
-cupcake
-cutiemarkcrusaders
-daisy
-daringdo
-davenport
-derpy+derpysit+derpystand+derpystandwing+derpybags+derpycloud+derpysad
-diamondmint
-diamondtiara
-dinky
-discord+discordpuppetmaster+discordamused
-doctor+doctornohat+timeturner+drhooves
-elsie+prettyvision
-fancypants
-fido
-fillydash+fillydashfly
-filthyrich
-firestreak
-flam
-fleurdelis+fleurdelishair+fleurdelislay
-flim
-flowertrio
-fluttershy+fluttershygala+fluttershyshy+fluttershystare+fillyshy
-forestspirit
-frederickhorseshoepin
-gilda+gildastand
-gingergold
-granny+grannychair+grannysleep
-gummy
-gustavelegrand
-hayfever
-highscore
-hoity
-hollydash
-horsemd
-horte
-hughjelly
-inky
-ironwillwalk
-jeffletroski
-jesuspezuna
-joe+joetuxedo
-junebug
-laflour
-lemonhearts
-lightning
-lily
-lintsalot
-lotus+lotusbloosom
-luna+lunafly
-lyra+lyrasit+harpass+heartstrings
-manticore
-maredowellfly+maredowellgallop
-master
-mayor
-meadowsong
-meliot
-minuette+colgate
-milkyway
-mjolna
-mrsparkle+nightlight
-mrssparkle+twilightvelvet
-nightmare
-noi
-noteworthy+blues
-octavia
-opal
-orange
-owl+owlowiscious
-parasprite
-peppermoon
-perry+perrypierce
-persnickety
-petunia
-philomena
-philomenaphoenix
-photofinish
-pictureperfect
-pigpen
-pinacolada
-pinkamina
-pinkie+pinkiecannonfront+pinkiecannon+pinkiebounce+pinkiecannonhappy+pinkiegala+pinkiechicken+pinkiehugfluttershy+pinkiegummy+pinkietongue+pinkiesilly
-pinkie+pinkiepartycannon+pinkieprincess+pinkiehugsfluttershy+pinkiewhoops+oinkoinkoink+pinkiewhoopsout+pinkiewhoopseat+fillypinkie+fillypinkiecurly+pinkieoink
-pinkie+pinkiegummydisguise+pinkacopter+pinkiefly+pinkieparade+pinkieumbrellahat+pinkieumbrelahatfear
-pipsqueak
-pokey+pokeypierce
-ponet
-poppycock
-purplehaze
-raggedy
-rainbow+rainbowdrag+rainbowfly+rainbowgala+rainbowsalute+rainbowsleep+fillydashfly+fillydash+rainbowhurricane+rainbowshadowbolt
-rainbowshine
-raindrops
-rarity+raritydrama+rarityfly+rarityponder+fillyrarity+raritygala+raritycomplaining
-raritysdad+magnum
-raritysmom+pearl
-redheart
-rhyme
-rocky
-rose+roseluck
-rover
-royalguard
-royalnightguard
-ruby+berrypinch
-sapphire
-scootaloo
-screwball
-screwloose
-seaswirl
-shadowbolts
-shiningarmor+shiningarmorguard+shiningarmorwedding
-silverspeed
-silverspoon
-silverstar
-sindy+powderrouge
-skyra
-snails
-snips
-snowflake+horsepower
-soarin+soarinofficer
-soigne
-sparkler+amethyststar
-spike+spikefloat+spikelove+spikemustache
-spitfire
-spot
-starlight
-stella
-stevenmagnet+stevenmagnettrue
-strongheart
-sue+suedance
-sunirays
-surprise
-sweetie+sweatiesing
-tank
-tenderheart
-theodoredonaldkerabatsos
-thunderlane
-tom
-tornadobolt
-trixie+trixiestage+trixiestand+lulamoon+trixielulamoon
-truffleshuffle
-turf
-turnip
-twilight+twilightcrazyfromball+twilightrage+twilightzero+fillytwilight+twilightthebearded+twilighttime+twilightspike
-twist
-vinyl+djpon-3
-violet+royalribbon
-waltercoltchak
-wildfire
-winona
-woona
-zecora+zecorabalance
diff --git a/ponyquotes/rainbow.0 b/ponyquotes/rainbow.0
deleted file mode 100644
index 94d47fa..0000000
--- a/ponyquotes/rainbow.0
+++ /dev/null
@@ -1 +0,0 @@
-I could clear the sky in 10 seconds flat!
diff --git a/ponyquotes/rainbow.1 b/ponyquotes/rainbow.1
deleted file mode 100644
index 4f8cdbb..0000000
--- a/ponyquotes/rainbow.1
+++ /dev/null
@@ -1 +0,0 @@
-Are you a SPY?
diff --git a/ponyquotes/rainbow.10 b/ponyquotes/rainbow.10
deleted file mode 100644
index eac4d85..0000000
--- a/ponyquotes/rainbow.10
+++ /dev/null
@@ -1 +0,0 @@
-I'm just glad I haven't been replaced by a bucket of turnips.
diff --git a/ponyquotes/rainbow.11 b/ponyquotes/rainbow.11
deleted file mode 100644
index f84298d..0000000
--- a/ponyquotes/rainbow.11
+++ /dev/null
@@ -1 +0,0 @@
-You don't wanna know.
diff --git a/ponyquotes/rainbow.12 b/ponyquotes/rainbow.12
deleted file mode 100644
index d4d0052..0000000
--- a/ponyquotes/rainbow.12
+++ /dev/null
@@ -1 +0,0 @@
-Sure thing, Spike!
diff --git a/ponyquotes/rainbow.13 b/ponyquotes/rainbow.13
deleted file mode 100644
index 0671125..0000000
--- a/ponyquotes/rainbow.13
+++ /dev/null
@@ -1 +0,0 @@
-Aww right, Princess!
diff --git a/ponyquotes/rainbow.14 b/ponyquotes/rainbow.14
deleted file mode 100644
index b83950e..0000000
--- a/ponyquotes/rainbow.14
+++ /dev/null
@@ -1 +0,0 @@
-NO! NOTHING! In the name of Celestia, just sit there and do nothing!
diff --git a/ponyquotes/rainbow.15 b/ponyquotes/rainbow.15
deleted file mode 100644
index 87854f4..0000000
--- a/ponyquotes/rainbow.15
+++ /dev/null
@@ -1 +0,0 @@
-Pinkie Pie, you are so random!
diff --git a/ponyquotes/rainbow.16 b/ponyquotes/rainbow.16
deleted file mode 100644
index 6132737..0000000
--- a/ponyquotes/rainbow.16
+++ /dev/null
@@ -1 +0,0 @@
-This really is the BEST DAY EVER!
diff --git a/ponyquotes/rainbow.17 b/ponyquotes/rainbow.17
deleted file mode 100644
index 2be4135..0000000
--- a/ponyquotes/rainbow.17
+++ /dev/null
@@ -1 +0,0 @@
-I am the iron pony!
diff --git a/ponyquotes/rainbow.18 b/ponyquotes/rainbow.18
deleted file mode 100644
index 54beefd..0000000
--- a/ponyquotes/rainbow.18
+++ /dev/null
@@ -1 +0,0 @@
-I know, it is gonna be so awesome!
diff --git a/ponyquotes/rainbow.19 b/ponyquotes/rainbow.19
deleted file mode 100644
index e389272..0000000
--- a/ponyquotes/rainbow.19
+++ /dev/null
@@ -1 +0,0 @@
-Time to take out the adorable trash!
diff --git a/ponyquotes/rainbow.2 b/ponyquotes/rainbow.2
deleted file mode 100644
index 66b1850..0000000
--- a/ponyquotes/rainbow.2
+++ /dev/null
@@ -1 +0,0 @@
-I love fun things!
diff --git a/ponyquotes/rainbow.20 b/ponyquotes/rainbow.20
deleted file mode 100644
index 17d42ea..0000000
--- a/ponyquotes/rainbow.20
+++ /dev/null
@@ -1 +0,0 @@
-Who are you calling a chump, chump?
diff --git a/ponyquotes/rainbow.21 b/ponyquotes/rainbow.21
deleted file mode 100644
index b3fbc1c..0000000
--- a/ponyquotes/rainbow.21
+++ /dev/null
@@ -1 +0,0 @@
-Oh, you wanna do this the hard way? We'll do this the hard way!
diff --git a/ponyquotes/rainbow.3 b/ponyquotes/rainbow.3
deleted file mode 100644
index 0892cfa..0000000
--- a/ponyquotes/rainbow.3
+++ /dev/null
@@ -1 +0,0 @@
-No, I just want my dress to be cool.
diff --git a/ponyquotes/rainbow.4 b/ponyquotes/rainbow.4
deleted file mode 100644
index b7b354c..0000000
--- a/ponyquotes/rainbow.4
+++ /dev/null
@@ -1 +0,0 @@
-The color's fine, just make it look cooler.
diff --git a/ponyquotes/rainbow.5 b/ponyquotes/rainbow.5
deleted file mode 100644
index c016aad..0000000
--- a/ponyquotes/rainbow.5
+++ /dev/null
@@ -1,2 +0,0 @@
-The shape's fine, just make the whole thing ... you know, cooler.
-It needs to be about 20% cooler.
diff --git a/ponyquotes/rainbow.6 b/ponyquotes/rainbow.6
deleted file mode 100644
index 36449a7..0000000
--- a/ponyquotes/rainbow.6
+++ /dev/null
@@ -1 +0,0 @@
-Now that you know the elements of a good cheer, let's hear one!
diff --git a/ponyquotes/rainbow.7 b/ponyquotes/rainbow.7
deleted file mode 100644
index 841b110..0000000
--- a/ponyquotes/rainbow.7
+++ /dev/null
@@ -1 +0,0 @@
-Ugh. You're going to cheer for me like that? Louder!
diff --git a/ponyquotes/rainbow.8 b/ponyquotes/rainbow.8
deleted file mode 100644
index f7d2603..0000000
--- a/ponyquotes/rainbow.8
+++ /dev/null
@@ -1 +0,0 @@
-Louder!!
diff --git a/ponyquotes/rainbow.9 b/ponyquotes/rainbow.9
deleted file mode 100644
index 6b8a6c0..0000000
--- a/ponyquotes/rainbow.9
+++ /dev/null
@@ -1 +0,0 @@
-LOUDER!!!
diff --git a/ponyquotes/rarity.0 b/ponyquotes/rarity.0
deleted file mode 100644
index f8d4e83..0000000
--- a/ponyquotes/rarity.0
+++ /dev/null
@@ -1 +0,0 @@
-I don't have time for some silly scavenger hunt! I've got a real problem...
diff --git a/ponyquotes/rarity.1 b/ponyquotes/rarity.1
deleted file mode 100644
index 9fc4a32..0000000
--- a/ponyquotes/rarity.1
+++ /dev/null
@@ -1 +0,0 @@
-Aren't you going to tell me to change something too?
diff --git a/ponyquotes/rarity.10 b/ponyquotes/rarity.10
deleted file mode 100644
index 74bc560..0000000
--- a/ponyquotes/rarity.10
+++ /dev/null
@@ -1 +0,0 @@
-Out of all things that could happen, this is THE WORST POSSIBLE THING!
diff --git a/ponyquotes/rarity.11 b/ponyquotes/rarity.11
deleted file mode 100644
index 950fe9d..0000000
--- a/ponyquotes/rarity.11
+++ /dev/null
@@ -1 +0,0 @@
-Let me guess. Applesauce?
diff --git a/ponyquotes/rarity.12 b/ponyquotes/rarity.12
deleted file mode 100644
index 17501c4..0000000
--- a/ponyquotes/rarity.12
+++ /dev/null
@@ -1 +0,0 @@
-Watch the mane, please.
diff --git a/ponyquotes/rarity.13 b/ponyquotes/rarity.13
deleted file mode 100644
index 35acf4e..0000000
--- a/ponyquotes/rarity.13
+++ /dev/null
@@ -1 +0,0 @@
-Thread by thread, stitching it together~
diff --git a/ponyquotes/rarity.14 b/ponyquotes/rarity.14
deleted file mode 100644
index 140612f..0000000
--- a/ponyquotes/rarity.14
+++ /dev/null
@@ -1 +0,0 @@
-Stay back, and my dress doesn't get hurt!
diff --git a/ponyquotes/rarity.15 b/ponyquotes/rarity.15
deleted file mode 100644
index 0103cca..0000000
--- a/ponyquotes/rarity.15
+++ /dev/null
@@ -1 +0,0 @@
-Afraid to get dirty?
diff --git a/ponyquotes/rarity.16 b/ponyquotes/rarity.16
deleted file mode 100644
index 09cf3a4..0000000
--- a/ponyquotes/rarity.16
+++ /dev/null
@@ -1 +0,0 @@
-I simply cannot let such a crime against fabulosity go uncorrected!
diff --git a/ponyquotes/rarity.17 b/ponyquotes/rarity.17
deleted file mode 100644
index 1e08d9f..0000000
--- a/ponyquotes/rarity.17
+++ /dev/null
@@ -1 +0,0 @@
-Gently, please!
diff --git a/ponyquotes/rarity.18 b/ponyquotes/rarity.18
deleted file mode 100644
index 62132d0..0000000
--- a/ponyquotes/rarity.18
+++ /dev/null
@@ -1 +0,0 @@
-How can you be so insensitive?
diff --git a/ponyquotes/rarity.19 b/ponyquotes/rarity.19
deleted file mode 100644
index 9fdab33..0000000
--- a/ponyquotes/rarity.19
+++ /dev/null
@@ -1 +0,0 @@
-I'm so pathetic!
diff --git a/ponyquotes/rarity.2 b/ponyquotes/rarity.2
deleted file mode 100644
index a283383..0000000
--- a/ponyquotes/rarity.2
+++ /dev/null
@@ -1 +0,0 @@
-Do you not like the colour?
diff --git a/ponyquotes/rarity.20 b/ponyquotes/rarity.20
deleted file mode 100644
index 85f5ac1..0000000
--- a/ponyquotes/rarity.20
+++ /dev/null
@@ -1 +0,0 @@
-Ideaaaaa!
diff --git a/ponyquotes/rarity.21 b/ponyquotes/rarity.21
deleted file mode 100644
index 9a71b46..0000000
--- a/ponyquotes/rarity.21
+++ /dev/null
@@ -1 +0,0 @@
-MINE!!!
diff --git a/ponyquotes/rarity.22 b/ponyquotes/rarity.22
deleted file mode 100644
index b154083..0000000
--- a/ponyquotes/rarity.22
+++ /dev/null
@@ -1 +0,0 @@
-Oh, it is ON!
diff --git a/ponyquotes/rarity.23 b/ponyquotes/rarity.23
deleted file mode 100644
index f821785..0000000
--- a/ponyquotes/rarity.23
+++ /dev/null
@@ -1 +0,0 @@
-Try it, punk!
diff --git a/ponyquotes/rarity.24 b/ponyquotes/rarity.24
deleted file mode 100644
index 5ae215b..0000000
--- a/ponyquotes/rarity.24
+++ /dev/null
@@ -1 +0,0 @@
-Take that you ruffian!
diff --git a/ponyquotes/rarity.25 b/ponyquotes/rarity.25
deleted file mode 100644
index cf58fe7..0000000
--- a/ponyquotes/rarity.25
+++ /dev/null
@@ -1 +0,0 @@
-Some of us DO have standards!
diff --git a/ponyquotes/rarity.3 b/ponyquotes/rarity.3
deleted file mode 100644
index 35b7560..0000000
--- a/ponyquotes/rarity.3
+++ /dev/null
@@ -1 +0,0 @@
-Do you not like the shape?
diff --git a/ponyquotes/rarity.4 b/ponyquotes/rarity.4
deleted file mode 100644
index 627ac2c..0000000
--- a/ponyquotes/rarity.4
+++ /dev/null
@@ -1,5 +0,0 @@
-Whining? I am not ‘whining’. I am complaining. Do you want to hear ‘whining’?
-(whines obnoxiously) This is whining! Ooohhhh! This harness is too tight!
-It's going to chafe! Can't you loosen it?! OH! It hurts and it's so rusty!
-Why didn't you clean it first?! It's gonna leave a stain, and the wagon's
-getting heavy! Why do I have to pull it?!
diff --git a/ponyquotes/rarity.5 b/ponyquotes/rarity.5
deleted file mode 100644
index 26ce196..0000000
--- a/ponyquotes/rarity.5
+++ /dev/null
@@ -1 +0,0 @@
-BUT I THOUGHT YOU WAAANTED WHINING!!!
diff --git a/ponyquotes/rarity.6 b/ponyquotes/rarity.6
deleted file mode 100644
index 8e43799..0000000
--- a/ponyquotes/rarity.6
+++ /dev/null
@@ -1 +0,0 @@
-Heavens, no! We're getting dressed!
diff --git a/ponyquotes/rarity.7 b/ponyquotes/rarity.7
deleted file mode 100644
index 6a0b629..0000000
--- a/ponyquotes/rarity.7
+++ /dev/null
@@ -1 +0,0 @@
-Oh, Fluttershy. Would you be a dear and FLY FASTER, PLEASE?
diff --git a/ponyquotes/rarity.8 b/ponyquotes/rarity.8
deleted file mode 100644
index 41bd1e8..0000000
--- a/ponyquotes/rarity.8
+++ /dev/null
@@ -1 +0,0 @@
-How in Equestria can she think that tiny patch of cloud is Cloudsdale?
diff --git a/ponyquotes/rarity.9 b/ponyquotes/rarity.9
deleted file mode 100644
index 29fcd22..0000000
--- a/ponyquotes/rarity.9
+++ /dev/null
@@ -1 +0,0 @@
-...I thought we agreed never to speak of that again.
diff --git a/ponyquotes/rose.0 b/ponyquotes/rose.0
deleted file mode 100644
index cb35efc..0000000
--- a/ponyquotes/rose.0
+++ /dev/null
@@ -1 +0,0 @@
-The horror, the horror!
diff --git a/ponyquotes/scootaloo.0 b/ponyquotes/scootaloo.0
deleted file mode 100644
index 04eda0a..0000000
--- a/ponyquotes/scootaloo.0
+++ /dev/null
@@ -1 +0,0 @@
-The possibilities are, like, endless!
diff --git a/ponyquotes/scootaloo.1 b/ponyquotes/scootaloo.1
deleted file mode 100644
index 1127c86..0000000
--- a/ponyquotes/scootaloo.1
+++ /dev/null
@@ -1 +0,0 @@
-I'll do whatever you want, Rainbow Dash!
diff --git a/ponyquotes/scootaloo.2 b/ponyquotes/scootaloo.2
deleted file mode 100644
index f9e9f99..0000000
--- a/ponyquotes/scootaloo.2
+++ /dev/null
@@ -1 +0,0 @@
-I'am liking this idea.
diff --git a/ponyquotes/scootaloo.3 b/ponyquotes/scootaloo.3
deleted file mode 100644
index 77083c7..0000000
--- a/ponyquotes/scootaloo.3
+++ /dev/null
@@ -1 +0,0 @@
-You've got a problem with blank flanks?
diff --git a/ponyquotes/scootaloo.4 b/ponyquotes/scootaloo.4
deleted file mode 100644
index 1dc554c..0000000
--- a/ponyquotes/scootaloo.4
+++ /dev/null
@@ -1 +0,0 @@
-That is not how you call a chicken.
diff --git a/ponyquotes/scootaloo.5 b/ponyquotes/scootaloo.5
deleted file mode 100644
index a446381..0000000
--- a/ponyquotes/scootaloo.5
+++ /dev/null
@@ -1 +0,0 @@
-TLC as in Tender Loving Care or Totally Lost Cause?
diff --git a/ponyquotes/scootaloo.6 b/ponyquotes/scootaloo.6
deleted file mode 100644
index a02f417..0000000
--- a/ponyquotes/scootaloo.6
+++ /dev/null
@@ -1 +0,0 @@
-We were making a table?
diff --git a/ponyquotes/scootaloo.7 b/ponyquotes/scootaloo.7
deleted file mode 100644
index 43e020d..0000000
--- a/ponyquotes/scootaloo.7
+++ /dev/null
@@ -1 +0,0 @@
-It's no use. No matter what we try we always end up without our cutie marks; and surprisingly often covered in tree sap.
diff --git a/ponyquotes/soarin.0 b/ponyquotes/soarin.0
deleted file mode 100644
index 65caeab..0000000
--- a/ponyquotes/soarin.0
+++ /dev/null
@@ -1 +0,0 @@
-As a horse.
diff --git a/ponyquotes/soarin.1 b/ponyquotes/soarin.1
deleted file mode 100644
index c0de8df..0000000
--- a/ponyquotes/soarin.1
+++ /dev/null
@@ -1 +0,0 @@
-My pie!
diff --git a/ponyquotes/soarin.2 b/ponyquotes/soarin.2
deleted file mode 100644
index a088318..0000000
--- a/ponyquotes/soarin.2
+++ /dev/null
@@ -1 +0,0 @@
-You saved it!
diff --git a/ponyquotes/spike.0 b/ponyquotes/spike.0
deleted file mode 100644
index af9cd04..0000000
--- a/ponyquotes/spike.0
+++ /dev/null
@@ -1 +0,0 @@
-Is it... ZOMBIES?!
diff --git a/ponyquotes/spike.1 b/ponyquotes/spike.1
deleted file mode 100644
index c5a95da..0000000
--- a/ponyquotes/spike.1
+++ /dev/null
@@ -1 +0,0 @@
-Ugh ... come on, you guys! Let me in!
diff --git a/ponyquotes/spike.2 b/ponyquotes/spike.2
deleted file mode 100644
index dcd9646..0000000
--- a/ponyquotes/spike.2
+++ /dev/null
@@ -1 +0,0 @@
-Do I have to?
diff --git a/ponyquotes/spike.3 b/ponyquotes/spike.3
deleted file mode 100644
index 5a18e6a..0000000
--- a/ponyquotes/spike.3
+++ /dev/null
@@ -1 +0,0 @@
-Don't tell anypony, but I have a crush on... Rarity!
diff --git a/ponyquotes/spike.4 b/ponyquotes/spike.4
deleted file mode 100644
index eb687b8..0000000
--- a/ponyquotes/spike.4
+++ /dev/null
@@ -1 +0,0 @@
-Another donut! Extra sprinkles!
diff --git a/ponyquotes/spike.5 b/ponyquotes/spike.5
deleted file mode 100644
index ebddb32..0000000
--- a/ponyquotes/spike.5
+++ /dev/null
@@ -1 +0,0 @@
-Can you do that? Can you explode twice?
diff --git a/ponyquotes/spike.6 b/ponyquotes/spike.6
deleted file mode 100644
index c98b9af..0000000
--- a/ponyquotes/spike.6
+++ /dev/null
@@ -1 +0,0 @@
-Whoa! Dude, that's creepy.
diff --git a/ponyquotes/spike.7 b/ponyquotes/spike.7
deleted file mode 100644
index d768642..0000000
--- a/ponyquotes/spike.7
+++ /dev/null
@@ -1 +0,0 @@
-Hey! Say it, don't spray it.
diff --git a/ponyquotes/sweetie.0 b/ponyquotes/sweetie.0
deleted file mode 100644
index b09aac3..0000000
--- a/ponyquotes/sweetie.0
+++ /dev/null
@@ -1 +0,0 @@
-That doesn't look like a table...
diff --git a/ponyquotes/sweetie.1 b/ponyquotes/sweetie.1
deleted file mode 100644
index 46623c9..0000000
--- a/ponyquotes/sweetie.1
+++ /dev/null
@@ -1 +0,0 @@
-I really like her... mane?
diff --git a/ponyquotes/sweetie.2 b/ponyquotes/sweetie.2
deleted file mode 100644
index 7dc4c66..0000000
--- a/ponyquotes/sweetie.2
+++ /dev/null
@@ -1 +0,0 @@
-Nope. Toast!
diff --git a/ponyquotes/sweetie.3 b/ponyquotes/sweetie.3
deleted file mode 100644
index 27a4932..0000000
--- a/ponyquotes/sweetie.3
+++ /dev/null
@@ -1 +0,0 @@
-I know this one!
diff --git a/ponyquotes/sweetie.4 b/ponyquotes/sweetie.4
deleted file mode 100644
index a7bc3e7..0000000
--- a/ponyquotes/sweetie.4
+++ /dev/null
@@ -1 +0,0 @@
-Oh my, sounds serious.
diff --git a/ponyquotes/sweetie.5 b/ponyquotes/sweetie.5
deleted file mode 100644
index 5e96c74..0000000
--- a/ponyquotes/sweetie.5
+++ /dev/null
@@ -1 +0,0 @@
-We are the Cutie Mark Crusaders!
diff --git a/ponyquotes/sweetie.6 b/ponyquotes/sweetie.6
deleted file mode 100644
index 5409ee2..0000000
--- a/ponyquotes/sweetie.6
+++ /dev/null
@@ -1 +0,0 @@
-We could form our own secret society!
diff --git a/ponyquotes/trixie.0 b/ponyquotes/trixie.0
deleted file mode 100644
index 5d5769d..0000000
--- a/ponyquotes/trixie.0
+++ /dev/null
@@ -1 +0,0 @@
-Anything you can do, I can do better.
diff --git a/ponyquotes/trixie.1 b/ponyquotes/trixie.1
deleted file mode 100644
index 49d29b5..0000000
--- a/ponyquotes/trixie.1
+++ /dev/null
@@ -1 +0,0 @@
-It's true my enthusiastic little admirers.
diff --git a/ponyquotes/trixie.2 b/ponyquotes/trixie.2
deleted file mode 100644
index 8489cdf..0000000
--- a/ponyquotes/trixie.2
+++ /dev/null
@@ -1 +0,0 @@
-Well, come on. Show Trixie what you've got!
diff --git a/ponyquotes/trixie.3 b/ponyquotes/trixie.3
deleted file mode 100644
index af6b609..0000000
--- a/ponyquotes/trixie.3
+++ /dev/null
@@ -1 +0,0 @@
-The Great and Powerful Trixie!
diff --git a/ponyquotes/trixie.4 b/ponyquotes/trixie.4
deleted file mode 100644
index ebd5c55..0000000
--- a/ponyquotes/trixie.4
+++ /dev/null
@@ -1 +0,0 @@
-Was there ever any doubt?
diff --git a/ponyquotes/trixie.5 b/ponyquotes/trixie.5
deleted file mode 100644
index 34d0103..0000000
--- a/ponyquotes/trixie.5
+++ /dev/null
@@ -1 +0,0 @@
-Watch in awe as Trixies performs the most amazing feat for magic every witnessed by pony eyes!
diff --git a/ponyquotes/trixie.6 b/ponyquotes/trixie.6
deleted file mode 100644
index 01f81bf..0000000
--- a/ponyquotes/trixie.6
+++ /dev/null
@@ -1 +0,0 @@
-Well, well, well. It seems we have some “neigh-sayers” in the audience.
diff --git a/ponyquotes/twilight.0 b/ponyquotes/twilight.0
deleted file mode 100644
index 5d95e70..0000000
--- a/ponyquotes/twilight.0
+++ /dev/null
@@ -1 +0,0 @@
-All the ponies in this town are CRAZY!
diff --git a/ponyquotes/twilight.1 b/ponyquotes/twilight.1
deleted file mode 100644
index d8438f7..0000000
--- a/ponyquotes/twilight.1
+++ /dev/null
@@ -1 +0,0 @@
-Um, not very likely.
diff --git a/ponyquotes/twilight.10 b/ponyquotes/twilight.10
deleted file mode 100644
index 364903a..0000000
--- a/ponyquotes/twilight.10
+++ /dev/null
@@ -1,3 +0,0 @@
-Rainbow must be angry with Applejack.
-She must hate her guts.
-Ohh ... how wonderful!
diff --git a/ponyquotes/twilight.11 b/ponyquotes/twilight.11
deleted file mode 100644
index ed02231..0000000
--- a/ponyquotes/twilight.11
+++ /dev/null
@@ -1 +0,0 @@
-Cross my heart and hope to fly, stick a cupcake in my ... OW!
diff --git a/ponyquotes/twilight.12 b/ponyquotes/twilight.12
deleted file mode 100644
index 438af60..0000000
--- a/ponyquotes/twilight.12
+++ /dev/null
@@ -1 +0,0 @@
-Yesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyes!
diff --git a/ponyquotes/twilight.13 b/ponyquotes/twilight.13
deleted file mode 100644
index 92c88db..0000000
--- a/ponyquotes/twilight.13
+++ /dev/null
@@ -1 +0,0 @@
-Your faithful student, Twilight Sparkle.
diff --git a/ponyquotes/twilight.14 b/ponyquotes/twilight.14
deleted file mode 100644
index 18c2310..0000000
--- a/ponyquotes/twilight.14
+++ /dev/null
@@ -1 +0,0 @@
-Please don't hate me.
diff --git a/ponyquotes/twilight.15 b/ponyquotes/twilight.15
deleted file mode 100644
index 9ae10f3..0000000
--- a/ponyquotes/twilight.15
+++ /dev/null
@@ -1 +0,0 @@
-Pardon me, Princess.
diff --git a/ponyquotes/twilight.16 b/ponyquotes/twilight.16
deleted file mode 100644
index 90629a2..0000000
--- a/ponyquotes/twilight.16
+++ /dev/null
@@ -1 +0,0 @@
-You told me it was all an old pony tale.
diff --git a/ponyquotes/twilight.17 b/ponyquotes/twilight.17
deleted file mode 100644
index 0a273e9..0000000
--- a/ponyquotes/twilight.17
+++ /dev/null
@@ -1 +0,0 @@
-Look out, here comes Tom!
diff --git a/ponyquotes/twilight.18 b/ponyquotes/twilight.18
deleted file mode 100644
index 2fab25e..0000000
--- a/ponyquotes/twilight.18
+++ /dev/null
@@ -1 +0,0 @@
-It's the perfect plan.
diff --git a/ponyquotes/twilight.19 b/ponyquotes/twilight.19
deleted file mode 100644
index b969d79..0000000
--- a/ponyquotes/twilight.19
+++ /dev/null
@@ -1 +0,0 @@
-We will do everything by the book!
diff --git a/ponyquotes/twilight.2 b/ponyquotes/twilight.2
deleted file mode 100644
index d6bb2d4..0000000
--- a/ponyquotes/twilight.2
+++ /dev/null
@@ -1,5 +0,0 @@
-Scarf? Check.
-Saddle? Check.
-Boots? Check.
-‘Spike refusing to get up and go back to sleep’? Check.
-It's a good thing I'm so organised. I'm ready!
diff --git a/ponyquotes/twilight.20 b/ponyquotes/twilight.20
deleted file mode 100644
index 7ec946a..0000000
--- a/ponyquotes/twilight.20
+++ /dev/null
@@ -1 +0,0 @@
-Ooh! Doesn't that hurt?
diff --git a/ponyquotes/twilight.21 b/ponyquotes/twilight.21
deleted file mode 100644
index 69dcd1d..0000000
--- a/ponyquotes/twilight.21
+++ /dev/null
@@ -1 +0,0 @@
-Are you crazy?
diff --git a/ponyquotes/twilight.22 b/ponyquotes/twilight.22
deleted file mode 100644
index ec3b22f..0000000
--- a/ponyquotes/twilight.22
+++ /dev/null
@@ -1 +0,0 @@
-I uh, I think I hear my laundry calling! Sorry, gotta go.
diff --git a/ponyquotes/twilight.3 b/ponyquotes/twilight.3
deleted file mode 100644
index 8750017..0000000
--- a/ponyquotes/twilight.3
+++ /dev/null
@@ -1 +0,0 @@
-She only has one cat.
diff --git a/ponyquotes/twilight.4 b/ponyquotes/twilight.4
deleted file mode 100644
index 880ec3e..0000000
--- a/ponyquotes/twilight.4
+++ /dev/null
@@ -1 +0,0 @@
-I never thought it would happen. My friends ... have turned into complete JERKS!
diff --git a/ponyquotes/twilight.5 b/ponyquotes/twilight.5
deleted file mode 100644
index d83a6e4..0000000
--- a/ponyquotes/twilight.5
+++ /dev/null
@@ -1 +0,0 @@
-If you can't catch her, Discord wins!
diff --git a/ponyquotes/twilight.6 b/ponyquotes/twilight.6
deleted file mode 100644
index 6e5463c..0000000
--- a/ponyquotes/twilight.6
+++ /dev/null
@@ -1 +0,0 @@
-Get back! All of you! This is my book. And I'm going to READ IT!
diff --git a/ponyquotes/twilight.7 b/ponyquotes/twilight.7
deleted file mode 100644
index a5526ce..0000000
--- a/ponyquotes/twilight.7
+++ /dev/null
@@ -1 +0,0 @@
-Pinkie Pie, you're a genius!
diff --git a/ponyquotes/twilight.8 b/ponyquotes/twilight.8
deleted file mode 100644
index ae82b9f..0000000
--- a/ponyquotes/twilight.8
+++ /dev/null
@@ -1 +0,0 @@
-I'm going to do what I do best: lecture her!
diff --git a/ponyquotes/twilight.9 b/ponyquotes/twilight.9
deleted file mode 100644
index 364f9d3..0000000
--- a/ponyquotes/twilight.9
+++ /dev/null
@@ -1 +0,0 @@
-Pinkie Pie, aren't you a little old for this?
diff --git a/ponyquotes/zecora.0 b/ponyquotes/zecora.0
deleted file mode 100644
index 24c23bb..0000000
--- a/ponyquotes/zecora.0
+++ /dev/null
@@ -1 +0,0 @@
-Beware! Beware you pony folk! Those leaves of blue are not a joke!
diff --git a/ponyquotes/zecora.1 b/ponyquotes/zecora.1
deleted file mode 100644
index 82ea422..0000000
--- a/ponyquotes/zecora.1
+++ /dev/null
@@ -1 +0,0 @@
-Have you gone mad?
diff --git a/ponyquotes/zecora.2 b/ponyquotes/zecora.2
deleted file mode 100644
index 894d6c8..0000000
--- a/ponyquotes/zecora.2
+++ /dev/null
@@ -1 +0,0 @@
-Is that a parasprite before my eyes?
diff --git a/ponyquotes/zecora.3 b/ponyquotes/zecora.3
deleted file mode 100644
index 0465f7a..0000000
--- a/ponyquotes/zecora.3
+++ /dev/null
@@ -1 +0,0 @@
-Your actions will make my anger explode!
diff --git a/ponyquotes/zecora.4 b/ponyquotes/zecora.4
deleted file mode 100644
index 059e881..0000000
--- a/ponyquotes/zecora.4
+++ /dev/null
@@ -1 +0,0 @@
-My Lair! My Lair!
diff --git a/ponyquotes/zecora.5 b/ponyquotes/zecora.5
deleted file mode 100644
index f0723ed..0000000
--- a/ponyquotes/zecora.5
+++ /dev/null
@@ -1,3 +0,0 @@
-Ponies, what is this...
-No, you know not what you do.
-You've gone and spilled my precious brew.
diff --git a/ponyquotes/zecora.6 b/ponyquotes/zecora.6
deleted file mode 100644
index 2da018c..0000000
--- a/ponyquotes/zecora.6
+++ /dev/null
@@ -1,3 +0,0 @@
-How dare you!
-You destroy my home, destroy my works,
-an then accuse me, of being a jerk?
diff --git a/ponysay-old.py b/ponysay-old.py
new file mode 100755
index 0000000..5f77ed0
--- /dev/null
+++ b/ponysay-old.py
@@ -0,0 +1,2458 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+'''
+ponysay.py - Ponysay, cowsay reimplementation for ponies
+Copyright (C) 2012 Erkin Batu Altunbaş et al.
+
+This program is free software. It comes without any warranty, to
+the extent permitted by applicable law. You can redistribute it
+and/or modify it under the terms of the Do What The Fuck You Want
+To Public License, Version 2, as published by Sam Hocevar. See
+http://sam.zoy.org/wtfpl/COPYING for more details.
+
+
+Authors of ponysay.py:
+
+ Erkin Batu Altunbaş: Project leader, helped write the first implementation
+ Mattias "maandree" Andrée: Major contributor of both implementions
+ Elis "etu" Axelsson: Major contributor of current implemention and patcher of the first implementation
+ Sven-Hendrik "svenstaro" Haase: Major contributor of the first implementation
+ Jan Alexander "heftig" Steffens: Major contributor of the first implementation
+ Kyah "L-four" Rindlisbacher: Patched the first implementation
+'''
+
+import os
+import shutil
+import sys
+import random
+from subprocess import Popen, PIPE
+
+
+
+'''
+The version of ponysay
+'''
+VERSION = 'dev' # this line should not be edited, it is fixed by the build system
+
+
+
+'''
+Hack to enforce UTF-8 in output (in the future, if you see anypony not using utf-8 in
+programs by default, report them to Princess Celestia so she can banish them to the moon)
+
+@param text:str The text to print (empty string is default)
+@param end:str The appendix to the text to print (line breaking is default)
+'''
+def print(text = '', end = '\n'):
+ sys.stdout.buffer.write((str(text) + end).encode('utf-8'))
+
+'''
+stderr equivalent to print()
+
+@param text:str The text to print (empty string is default)
+@param end:str The appendix to the text to print (line breaking is default)
+'''
+def printerr(text = '', end = '\n'):
+ sys.stderr.buffer.write((str(text) + end).encode('utf-8'))
+
+fd3 = None
+'''
+/proc/self/fd/3 equivalent to print()
+
+@param text:str The text to print (empty string is default)
+@param end:str The appendix to the text to print (line breaking is default)
+'''
+def printinfo(text = '', end = '\n'):
+ global fd3
+ if os.path.exists('/proc/self/fd/3'):
+ if fd3 is None:
+ fd3 = os.fdopen(3, 'w')
+ fd3.write(str(text) + end)
+
+
+'''
+Checks whether a text ends with a specific text, but has more
+
+@param text The text to test
+@param ending The desired end of the text
+@return :bool The result of the test
+'''
+def endswith(text, ending):
+ return text.endswith(ending) and not (text == ending)
+
+
+
+'''
+This is the mane class of ponysay
+'''
+class Ponysay():
+ '''
+ Starts the part of the program the arguments indicate
+
+ @param args:ArgParser Parsed command line arguments
+ '''
+ def __init__(self, args):
+ if (args.argcount == 0) and not pipelinein:
+ args.help()
+ exit(254)
+ return
+
+ ## Modifyable global variables
+ global linuxvt
+ global usekms
+ global mode
+ global ponydirs
+ global extraponydirs
+
+ ## Emulate termial capabilities
+ if args.opts['-X'] is not None: (linuxvt, usekms) = (False, False)
+ elif args.opts['-V'] is not None: (linuxvt, usekms) = (True, False)
+ elif args.opts['-K'] is not None: (linuxvt, usekms) = (True, True)
+ ponydirs = vtponydirs if linuxvt and not usekms else xponydirs
+ extraponydirs = extravtponydirs if linuxvt and not usekms else extraxponydirs
+
+ ## Variadic variants of -f, -F and -q
+ if args.opts['--f'] is not None:
+ if args.opts['-f'] is not None: args.opts['-f'] += args.opts['--f']
+ else: args.opts['-f'] = args.opts['--f']
+ if args.opts['--F'] is not None:
+ if args.opts['-F'] is not None: args.opts['-F'] += args.opts['--F']
+ else: args.opts['-F'] = args.opts['--F']
+ if args.opts['--q'] is not None:
+ if args.opts['-q'] is not None: args.opts['-q'] += args.opts['--q']
+ else: args.opts['-q'] = args.opts['--q']
+
+ ## Run modes
+ if args.opts['-h'] is not None: args.help()
+ elif args.opts['--quoters'] is not None: self.quoters()
+ elif args.opts['--onelist'] is not None: self.onelist()
+ elif args.opts['-v'] is not None: self.version()
+ elif args.opts['-l'] is not None: self.list()
+ elif args.opts['-L'] is not None: self.linklist()
+ elif args.opts['-B'] is not None: self.balloonlist()
+ elif args.opts['++onelist'] is not None: self.__extraponies(); self.onelist()
+ elif args.opts['+l'] is not None: self.__extraponies(); self.list()
+ elif args.opts['+L'] is not None: self.__extraponies(); self.linklist()
+ elif args.opts['-A'] is not None: self.list(); self.__extraponies(); self.list()
+ elif args.opts['+A'] is not None: self.linklist(); self.__extraponies(); self.linklist()
+ else:
+ ## Colouring features
+ if args.opts['--colour-pony'] is not None:
+ mode += '\033[' + ';'.join(args.opts['--colour-pony']) + 'm'
+ else:
+ mode += '\033[0m'
+ if args.opts['+c'] is not None:
+ if args.opts['--colour-msg'] is None: args.opts['--colour-msg'] = args.opts['+c']
+ if args.opts['--colour-link'] is None: args.opts['--colour-link'] = args.opts['+c']
+ if args.opts['--colour-bubble'] is None: args.opts['--colour-bubble'] = args.opts['+c']
+
+ ## Other extra features
+ self.__extraponies(args)
+ self.__bestpony(args)
+ self.__ucsremap(args)
+ if args.opts['-o'] is not None:
+ mode += '$/= $$\\= $'
+ args.message = ''
+
+ ## The stuff
+ if args.opts['-q'] is not None:
+ warn = (args.opts['-f'] is not None) or (args.opts['-F'] is not None)
+ if (len(args.opts['-q']) == 1) and ((args.opts['-q'][0] == '-f') or (args.opts['-q'][0] == '-F')):
+ warn = True
+ if args.opts['-q'][0] == '-f':
+ args.opts['-q'] = args.files
+ if args.opts['-f'] is not None:
+ args.opts['-q'] += args.opts['-f']
+ self.quote(args)
+ if warn:
+ printerr('-q cannot be used at the same time as -f or -F.')
+ elif not unrecognised:
+ self.print_pony(args)
+ else:
+ args.help()
+ exit(255)
+ return
+
+
+ ##############################################
+ ## Methods that run before the mane methods ##
+ ##############################################
+
+ '''
+ Use extra ponies
+
+ @param args:ArgParser Parsed command line arguments, may be `None`
+ '''
+ def __extraponies(self, args = None):
+ ## If extraponies are used, change ponydir to extraponydir
+ if args is None:
+ ponydirs[:] = extraponydirs
+ elif args.opts['-F'] is not None:
+ args.opts['-f'] = args.opts['-F']
+ ponydirs[:] = extraponydirs
+
+
+ '''
+ Use best.pony if nothing else is set
+
+ @param args:ArgParser Parsed command line arguments
+ '''
+ def __bestpony(self, args):
+ ## Set best.pony as the pony to display if none is selected
+ if (args.opts['-f'] is None) or (args.opts['-q'] is None) or (len(args.opts['-q']) == 0):
+ for ponydir in ponydirs:
+ if os.path.isfile(ponydir + 'best.pony') or os.path.islink(ponydir + 'best.pony'):
+ pony = os.path.realpath(ponydir + 'best.pony') # Canonical path
+ args.opts['-f' if args.opts['-q'] is None else '-q'] = [pony]
+ break
+
+
+ '''
+ Apply pony name remapping to args according to UCS settings
+
+ @param args:ArgParser Parsed command line arguments
+ '''
+ def __ucsremap(self, args):
+ ## Read UCS configurations
+ env_ucs = os.environ['PONYSAY_UCS_ME'] if 'PONYSAY_UCS_ME' in os.environ else ''
+ ucs_conf = 0
+ if env_ucs in ('yes', 'y', '1'): ucs_conf = 1
+ elif env_ucs in ('harder', 'h', '2'): ucs_conf = 2
+
+ ## Stop UCS is not used
+ if ucs_conf == 0:
+ return
+
+ ## Read all lines in all UCS → ASCII map files
+ maplines = []
+ for ucsmap in ucsmaps:
+ if os.path.isfile(ucsmap):
+ with open(ucsmap, 'rb') as mapfile:
+ maplines += [line.replace('\n', '') for line in mapfile.read().decode('utf8', 'replace').split('\n')]
+
+ ## Create UCS → ASCII mapping from read lines
+ map = {}
+ stripset = ' \t' # must be string, wtf! and way doesn't python's doc say so
+ for line in maplines:
+ if (len(line) > 0) and not (line[0] == '#'):
+ s = line.index('→')
+ ucs = line[:s] .strip(stripset)
+ ascii = line[s + 1:].strip(stripset)
+ map[ucs] = ascii
+
+ ## Apply UCS → ASCII mapping to -f and -q arguments
+ for flag in ('-f', '-q'):
+ if args.opts[flag] is not None:
+ for i in range(0, len(args.opts[flag])):
+ if args.opts[flag][i] in map:
+ args.opts[flag][i] = map[args.opts[flag][i]]
+
+
+ #######################
+ ## Auxiliary methods ##
+ #######################
+
+ '''
+ Apply UCS:ise pony names according to UCS settings
+
+ @param ponies:list<str> List of all ponies (of interrest)
+ @param links:map<str> Map to fill with simulated symlink ponies, may be `None`
+ '''
+ def __ucsise(self, ponies, links = None):
+ ## Read UCS configurations
+ env_ucs = os.environ['PONYSAY_UCS_ME'] if 'PONYSAY_UCS_ME' in os.environ else ''
+ ucs_conf = 0
+ if env_ucs in ('yes', 'y', '1'): ucs_conf = 1
+ elif env_ucs in ('harder', 'h', '2'): ucs_conf = 2
+
+ ## Stop UCS is not used
+ if ucs_conf == 0:
+ return
+
+ ## Read all lines in all UCS → ASCII map files
+ maplines = []
+ for ucsmap in ucsmaps:
+ if os.path.isfile(ucsmap):
+ with open(ucsmap, 'rb') as mapfile:
+ maplines += [line.replace('\n', '') for line in mapfile.read().decode('utf8', 'replace').split('\n')]
+
+ ## Create UCS → ASCII mapping from read lines
+ map = {}
+ stripset = ' \t' # must be string, wtf! and way doesn't python's doc say so
+ for line in maplines:
+ if not line.startswith('#'):
+ s = line.index('→')
+ ucs = line[:s] .strip(stripset)
+ ascii = line[s + 1:].strip(stripset)
+ map[ascii] = ucs
+
+ ## Apply UCS → ACII mapping to ponies, by alias if weak settings
+ if ucs_conf == 1:
+ for pony in ponies:
+ if pony in map:
+ ponies.append(map[pony])
+ if links is not None:
+ links[map[pony]] = pony
+ else:
+ for j in range(0, len(ponies)):
+ if ponies[j] in map:
+ ponies[j] = map[ponies[j]]
+
+
+ '''
+ Returns one file with full path, names is filter for names, also accepts filepaths
+
+ @param names:list<str> Ponies to choose from, may be `None`
+ @param alt:bool For method internal use...
+ @return :str The file name of a pony
+ '''
+ def __getponypath(self, names = None, alt = False):
+ ponies = {}
+
+ ## List all pony files, without the .pony ending
+ for ponydir in ponydirs:
+ for ponyfile in os.listdir(ponydir):
+ if endswith(ponyfile, ".pony"):
+ pony = ponyfile[:-5]
+ if pony not in ponies:
+ ponies[pony] = ponydir + ponyfile
+
+ ## Support for explicit pony file names
+ if names is not None:
+ for name in names:
+ if os.path.exists(name):
+ ponies[name] = name
+
+ ## If there is not select ponies, choose all of them
+ if (names is None) or (len(names) == 0):
+ names = list(ponies.keys())
+
+ ## Select a random pony of the choosen onles
+ pony = names[random.randrange(0, len(names))]
+ if pony not in ponies:
+ if not alt:
+ autocorrect = SpelloCorrecter(ponydirs, '.pony')
+ (alternatives, dist) = autocorrect.correct(pony)
+ if (len(alternatives) > 0) and (dist <= 5): # TODO the limit `dist` should be configureable
+ return self.__getponypath(alternatives, True)
+ sys.stderr.write('I have never heard of anypony named %s\n' % (pony));
+ exit(1)
+ else:
+ return ponies[pony]
+
+
+ '''
+ Returns a set with all ponies that have quotes and are displayable
+
+ @return :set<str> All ponies that have quotes and are displayable
+ '''
+ def __quoters(self):
+ ## List all unique quote files
+ quotes = []
+ quoteshash = set()
+ _quotes = []
+ for quotedir in quotedirs:
+ _quotes += [item[:item.index('.')] for item in os.listdir(quotedir)]
+ for quote in _quotes:
+ if not quote == '':
+ if not quote in quoteshash:
+ quoteshash.add(quote)
+ quotes.append(quote)
+
+ ## Create a set of all ponyes that have quotes
+ ponies = set()
+ for ponydir in ponydirs:
+ for pony in os.listdir(ponydir):
+ if not pony[0] == '.':
+ p = pony[:-5] # remove .pony
+ for quote in quotes:
+ if ('+' + p + '+') in ('+' + quote + '+'):
+ if not p in ponies:
+ ponies.add(p)
+
+ return ponies
+
+
+ '''
+ Returns a list with all (pony, quote file) pairs
+
+ @return (pony, quote):(str, str) All ponies–quote file-pairs
+ '''
+ def __quotes(self):
+ ## Get all ponyquote files
+ quotes = []
+ for quotedir in quotedirs:
+ quotes += [quotedir + item for item in os.listdir(quotedir)]
+
+ ## Create list of all pony–quote file-pairs
+ rc = []
+ for ponydir in ponydirs:
+ for pony in os.listdir(ponydir):
+ if not pony[0] == '.':
+ p = pony[:-5] # remove .pony
+ for quote in quotes:
+ q = quote[quote.rindex('/') + 1:]
+ q = q[:q.rindex('.')]
+ if ('+' + p + '+') in ('+' + q + '+'):
+ rc.append((p, quote))
+
+ return rc
+
+
+ '''
+ Gets the size of the terminal in (rows, columns)
+
+ @return (rows, columns):(int, int) The number or lines and the number of columns in the terminal's display area
+ '''
+ def __gettermsize(self):
+ ## Call `stty` to determine the size of the terminal, this way is better then using python's ncurses
+ for channel in (sys.stderr, sys.stdout, sys.stdin):
+ termsize = Popen(['stty', 'size'], stdout=PIPE, stdin=channel, stderr=PIPE).communicate()[0]
+ if len(termsize) > 0:
+ termsize = termsize.decode('utf8', 'replace')[:-1].split(' ') # [:-1] removes a \n
+ termsize = [int(item) for item in termsize]
+ return termsize
+ return (24, 80) # fall back to minimal sane size
+
+
+
+ #####################
+ ## Listing methods ##
+ #####################
+
+ '''
+ Columnise a list and prints it
+
+ @param ponies:list<(str, str)> All items to list, each item should have to elements: unformated name, formated name
+ '''
+ def __columnise(self, ponies):
+ ## Get terminal width, and a 2 which is the space between columns
+ termwidth = self.__gettermsize()[1] + 2
+ ## Sort the ponies, and get the cells' widths, and the largest width + 2
+ ponies.sort(key = lambda pony : pony[0])
+ widths = [UCS.dispLen(pony[0]) for pony in ponies]
+ width = max(widths) + 2 # longest pony file name + space between columns
+
+ ## Calculate the number of rows and columns, can create a list of empty columns
+ cols = termwidth // width # do not believe electricians, this means ⌊termwidth / width⌋
+ rows = (len(ponies) + cols - 1) // cols
+ columns = []
+ for c in range(0, cols): columns.append([])
+
+ ## Fill the columns with cells of ponies
+ (y, x) = (0, 0)
+ for j in range(0, len(ponies)):
+ cell = ponies[j][1] + ' ' * (width - widths[j]);
+ columns[x].append(cell)
+ y += 1
+ if y == rows:
+ x += 1
+ y = 0
+
+ ## Make the columnisation nicer by letting the last row be partially empty rather than the last column
+ diff = rows * cols - len(ponies)
+ if diff > 2:
+ c = cols - 1
+ diff -= 1
+ while diff > 0:
+ columns[c] = columns[c - 1][-diff:] + columns[c]
+ c -= 1
+ columns[c] = columns[c][:-diff]
+ diff -= 1
+
+ ## Create rows from columns
+ lines = []
+ for r in range(0, rows):
+ lines.append([])
+ for c in range(0, cols):
+ if r < len(columns[c]):
+ line = lines[r].append(columns[c][r])
+
+ ## Print the matrix, with one extra blank row
+ print('\n'.join([''.join(line)[:-2] for line in lines]))
+ print()
+
+
+ '''
+ Lists the available ponies
+ '''
+ def list(self):
+ ## Get all quoters
+ quoters = self.__quoters()
+
+ for ponydir in ponydirs: # Loop ponydirs
+ ## Get all ponies in the directory
+ _ponies = os.listdir(ponydir)
+
+ ## Remove .pony from all files and skip those that does not have .pony
+ ponies = []
+ for pony in _ponies:
+ if endswith(pony, '.pony'):
+ ponies.append(pony[:-5])
+
+ ## UCS:ise pony names, they are already sorted
+ self.__ucsise(ponies)
+
+ ## If ther directory is not empty print its name and all ponies, columnised
+ if len(ponies) == 0:
+ continue
+ print('\033[1mponies located in ' + ponydir + '\033[21m')
+ self.__columnise([(pony, '\033[1m' + pony + '\033[21m' if pony in quoters else pony) for pony in ponies])
+
+
+ '''
+ Lists the available ponies with alternatives inside brackets
+ '''
+ def linklist(self):
+ ## Get the size of the terminal and all ponies with quotes
+ termsize = self.__gettermsize()
+ quoters = self.__quoters()
+
+ for ponydir in ponydirs: # Loop ponydirs
+ ## Get all pony files in the directory
+ _ponies = os.listdir(ponydir)
+
+ ## Remove .pony from all files and skip those that does not have .pony
+ ponies = []
+ for pony in _ponies:
+ if endswith(pony, '.pony'):
+ ponies.append(pony[:-5])
+
+ ## If there are no ponies in the directory skip to next directory, otherwise, print the directories name
+ if len(ponies) == 0:
+ continue
+ print('\033[1mponies located in ' + ponydir + '\033[21m')
+
+ ## UCS:ise pony names
+ pseudolinkmap = {}
+ self.__ucsise(ponies, pseudolinkmap)
+
+ ## Create target–link-pair, with `None` as link if the file is not a symlink or in `pseudolinkmap`
+ pairs = []
+ for pony in ponies:
+ if pony in pseudolinkmap:
+ pairs.append((pony, pseudolinkmap[pony] + '.pony'));
+ else:
+ pairs.append((pony, os.path.realpath(ponydir + pony + '.pony') if os.path.islink(ponydir + pony + '.pony') else None))
+
+ ## Create map from source pony to alias ponies for each pony
+ ponymap = {}
+ for pair in pairs:
+ if (pair[1] is None) or (pair[1] == ''):
+ if pair[0] not in ponymap:
+ ponymap[pair[0]] = []
+ else:
+ target = pair[1][:-5]
+ if '/' in target:
+ target = target[target.rindex('/') + 1:]
+ if target in ponymap:
+ ponymap[target].append(pair[0])
+ else:
+ ponymap[target] = [pair[0]]
+
+ ## Create list of source ponies concatenated with alias ponies in brackets
+ ponies = {}
+ for pony in ponymap:
+ w = UCS.dispLen(pony)
+ item = '\033[1m' + pony + '\033[21m' if (pony in quoters) else pony
+ syms = ponymap[pony]
+ syms.sort()
+ if len(syms) > 0:
+ w += 2 + len(syms)
+ item += ' ('
+ first = True
+ for sym in syms:
+ w += UCS.dispLen(sym)
+ if first: first = False
+ else: item += ' '
+ item += '\033[1m' + sym + '\033[21m' if (sym in quoters) else sym
+ item += ')'
+ ponies[(item.replace('\033[1m', '').replace('\033[21m', ''), item)] = w
+
+ ## Print the ponies, columnised
+ self.__columnise(list(ponies))
+
+
+ '''
+ Lists with all ponies that have quotes and are displayable, on one column without anything bold or otherwise formated
+ '''
+ def quoters(self):
+ ## Get all quoters
+ ponies = self.__quoters()
+
+ ## UCS:ise and sort
+ self.__ucsise(ponies)
+ ponies.sort()
+
+ ## Print each one on a seperate line, but skip duplicates
+ last = ''
+ for pony in ponies:
+ if not pony == last:
+ last = pony
+ print(pony)
+
+
+ '''
+ Lists the available ponies on one column without anything bold or otherwise formated
+ '''
+ def onelist(self):
+ ## Get all pony files
+ _ponies = []
+ for ponydir in ponydirs: # Loop ponydirs
+ _ponies += os.listdir(ponydir)
+
+ ## Remove .pony from all files and skip those that does not have .pony
+ ponies = []
+ for pony in _ponies:
+ if endswith(pony, '.pony'):
+ ponies.append(pony[:-5])
+
+ ## UCS:ise and sort
+ self.__ucsise(ponies)
+ ponies.sort()
+
+ ## Print each one on a seperate line, but skip duplicates
+ last = ''
+ for pony in ponies:
+ if not pony == last:
+ last = pony
+ print(pony)
+
+
+ #####################
+ ## Balloon methods ##
+ #####################
+
+ '''
+ Prints a list of all balloons
+ '''
+ def balloonlist(self):
+ ## Get the size of the terminal
+ termsize = self.__gettermsize()
+
+ ## Get all balloons
+ balloonset = set()
+ for balloondir in balloondirs:
+ for balloon in os.listdir(balloondir):
+ ## Use .think if running ponythink, otherwise .say
+ if isthink and endswith(balloon, '.think'):
+ balloon = balloon[:-6]
+ elif (not isthink) and endswith(balloon, '.say'):
+ balloon = balloon[:-4]
+ else:
+ continue
+
+ ## Add the balloon if there is none with the same name
+ if balloon not in balloonset:
+ balloonset.add(balloon)
+
+ ## Print all balloos, columnised
+ self.__columnise([(balloon, balloon) for balloon in list(balloonset)])
+
+
+ '''
+ Returns one file with full path, names is filter for style names, also accepts filepaths
+
+ @param names:list<str> Balloons to choose from, may be `None`
+ @param alt:bool For method internal use
+ @param :str The file name of the balloon, will be `None` iff `names` is `None`
+ '''
+ def __getballoonpath(self, names, alt = False):
+ ## Stop if their is no choosen balloon
+ if names is None:
+ return None
+
+ ## Get all balloons
+ balloons = {}
+ for balloondir in balloondirs:
+ for balloon in os.listdir(balloondir):
+ balloonfile = balloon
+ ## Use .think if running ponythink, otherwise .say
+ if isthink and endswith(balloon, '.think'):
+ balloon = balloon[:-6]
+ elif (not isthink) and endswith(balloon, '.say'):
+ balloon = balloon[:-4]
+ else:
+ continue
+
+ ## Add the balloon if there is none with the same name
+ if balloon not in balloons:
+ balloons[balloon] = balloondir + balloonfile
+
+ ## Support for explicit balloon file names
+ for name in names:
+ if os.path.exists(name):
+ balloons[name] = name
+
+ ## Select a random balloon of the choosen ones
+ balloon = names[random.randrange(0, len(names))]
+ if balloon not in balloons:
+ if not alt:
+ autocorrect = SpelloCorrecter(balloondirs, '.think' if isthink else '.say')
+ (alternatives, dist) = autocorrect.correct(balloon)
+ if (len(alternatives) > 0) and (dist <= 5): # TODO the limit `dist` should be configureable
+ return self.__getballoonpath(alternatives, True)
+ sys.stderr.write('That balloon style %s does not exist\n' % (balloon));
+ exit(1)
+ else:
+ return balloons[balloon]
+
+
+ '''
+ Creates the balloon style object
+
+ @param balloonfile:str The file with the balloon style, may be `None`
+ @return :Balloon Instance describing the balloon's style
+ '''
+ def __getballoon(self, balloonfile):
+ ## Use default balloon if none is specified
+ if balloonfile is None:
+ if isthink:
+ return Balloon('o', 'o', '( ', ' )', [' _'], ['_'], ['_'], ['_'], ['_ '], ' )', ' )', ' )', ['- '], ['-'], ['-'], ['-'], [' -'], '( ', '( ', '( ')
+ return Balloon('\\', '/', '< ', ' >', [' _'], ['_'], ['_'], ['_'], ['_ '], ' \\', ' |', ' /', ['- '], ['-'], ['-'], ['-'], [' -'], '\\ ', '| ', '/ ')
+
+ ## Initialise map for balloon parts
+ map = {}
+ for elem in ('\\', '/', 'ww', 'ee', 'nw', 'nnw', 'n', 'nne', 'ne', 'nee', 'e', 'see', 'se', 'sse', 's', 'ssw', 'sw', 'sww', 'w', 'nww'):
+ map[elem] = []
+
+ ## Read all lines in the balloon file
+ with open(balloonfile, 'rb') as balloonstream:
+ data = balloonstream.read().decode('utf8', 'replace')
+ data = [line.replace('\n', '') for line in data.split('\n')]
+
+ ## Parse the balloon file, and fill the map
+ last = None
+ for line in data:
+ if len(line) > 0:
+ if line[0] == ':':
+ map[last].append(line[1:])
+ else:
+ last = line[:line.index(':')]
+ value = line[len(last) + 1:]
+ map[last].append(value)
+
+ ## Return the balloon
+ return Balloon(map['\\'][0], map['/'][0], map['ww'][0], map['ee'][0], map['nw'], map['nnw'], map['n'],
+ map['nne'], map['ne'], map['nee'][0], map['e'][0], map['see'][0], map['se'], map['sse'],
+ map['s'], map['ssw'], map['sw'], map['sww'][0], map['w'][0], map['nww'][0])
+
+
+
+ ########################
+ ## Displaying methods ##
+ ########################
+
+ '''
+ Prints the name of the program and the version of the program
+ '''
+ def version(self):
+ ## Prints the "ponysay $VERSION", if this is modified, ./dev/dist.sh must be modified accordingly
+ print('%s %s' % ('ponysay', VERSION))
+
+
+ '''
+ Print the pony with a speech or though bubble. message, pony and wrap from args are used.
+
+ @param args:ArgParser Parsed command line arguments
+ '''
+ def print_pony(self, args):
+ ## Get message and remove tailing whitespace from stdin (but not for each line)
+ if args.message == None:
+ msg = ''.join(sys.stdin.readlines()).rstrip()
+ else:
+ msg = args.message
+ if args.opts['--colour-msg'] is not None:
+ msg = '\033[' + ';'.join(args.opts['--colour-msg']) + 'm' + msg
+
+ ## This algorithm should give some result as cowsay's (according to tests)
+ if args.opts['-c'] is not None:
+ buf = ''
+ last = ' '
+ CHARS = '\t \n'
+ for c in msg:
+ if (c in CHARS) and (last in CHARS):
+ if last == '\n':
+ buf += last
+ last = c
+ else:
+ buf += c
+ last = c
+ msg = buf.strip(CHARS)
+ buf = ''
+ for c in msg:
+ if (c != '\n') or (last != '\n'):
+ buf += c
+ last = c
+ msg = buf.replace('\n', '\n\n')
+
+ ## Get the pony
+ pony = self.__getponypath(args.opts['-f'])
+ printinfo('pony file: ' + pony)
+
+ ## Use PNG file as pony file
+ if endswith(pony.lower(), '.png'):
+ pony = '\'' + pony.replace('\'', '\'\\\'\'') + '\''
+ pngcmd = ('img2ponysay -p -- ' if linuxvt else 'img2ponysay -- ') + pony
+ pngpipe = os.pipe()
+ Popen(pngcmd, stdout=os.fdopen(pngpipe[1], 'w'), shell=True).wait()
+ pony = '/proc/' + str(os.getpid()) + '/fd/' + str(pngpipe[0])
+
+ ## If KMS is utilies, select a KMS pony file and create it if necessary
+ pony = self.__kms(pony)
+
+ ## If in Linux VT clean the terminal (See info/pdf-manual [Printing in TTY with KMS])
+ if linuxvt:
+ print('\033[H\033[2J', end='')
+
+ ## Get width truncation and wrapping
+ env_width = os.environ['PONYSAY_FULL_WIDTH'] if 'PONYSAY_FULL_WIDTH' in os.environ else None
+ if env_width is None: env_width = ''
+ widthtruncation = self.__gettermsize()[1] if env_width not in ('yes', 'y', '1') else None
+ messagewrap = 40
+ if (args.opts['-W'] is not None) and (len(args.opts['-W'][0]) > 0):
+ messagewrap = args.opts['-W'][0]
+ if messagewrap[0] in 'nmsNMS': # m is left to n on QWERTY and s is left to n on Dvorak
+ messagewrap = None
+ elif messagewrap[0] in 'iouIOU': # o is left to i on QWERTY and u is right to i on Dvorak
+ messagewrap = self.__gettermsize()[1]
+ else:
+ messagewrap = int(args.opts['-W'][0])
+
+ ## Get balloon object
+ balloonfile = self.__getballoonpath(args.opts['-b'])
+ printinfo('balloon style file: ' + str(balloonfile))
+ balloon = self.__getballoon(balloonfile) if args.opts['-o'] is None else None
+
+ ## Get hyphen style
+ hyphencolour = ''
+ if args.opts['--colour-wrap'] is not None:
+ hyphencolour = '\033[' + ';'.join(args.opts['--colour-wrap']) + 'm'
+ hyphen = '\033[31m' + hyphencolour + '-' # TODO make configurable
+
+ ## Link and balloon colouring
+ linkcolour = ''
+ if args.opts['--colour-link'] is not None:
+ linkcolour = '\033[' + ';'.join(args.opts['--colour-link']) + 'm'
+ ballooncolour = ''
+ if args.opts['--colour-bubble'] is not None:
+ ballooncolour = '\033[' + ';'.join(args.opts['--colour-bubble']) + 'm'
+
+
+ ## Run cowsay replacement
+ backend = Backend(message = msg, ponyfile = pony, wrapcolumn = messagewrap, width = widthtruncation,
+ balloon = balloon, hyphen = hyphen, linkcolour = linkcolour, ballooncolour = ballooncolour)
+ backend.parse()
+ output = backend.output
+ if output.endswith('\n'):
+ output = output[:-1]
+
+
+ ## Load height trunction settings
+ env_bottom = os.environ['PONYSAY_BOTTOM'] if 'PONYSAY_BOTTOM' in os.environ else None
+ if env_bottom is None: env_bottom = ''
+
+ env_height = os.environ['PONYSAY_TRUNCATE_HEIGHT'] if 'PONYSAY_TRUNCATE_HEIGHT' in os.environ else None
+ if env_height is None: env_height = ''
+
+ env_lines = os.environ['PONYSAY_SHELL_LINES'] if 'PONYSAY_SHELL_LINES' in os.environ else None
+ if (env_lines is None) or (env_lines == ''): env_lines = '2'
+
+ ## Print the output, truncated on height is so set
+ lines = self.__gettermsize()[0] - int(env_lines)
+ if linuxvt or (env_height is ('yes', 'y', '1')):
+ if env_bottom is ('yes', 'y', '1'):
+ for line in output.split('\n')[: -lines]:
+ print(line)
+ else:
+ for line in output.split('\n')[: lines]:
+ print(line)
+ else:
+ print(output)
+
+
+ '''
+ Print the pony with a speech or though bubble and a self quote
+
+ @param args:ArgParser Parsed command line arguments
+ '''
+ def quote(self, args):
+ ## Get all quotes, and if any pony is choosen just keep them
+ pairs = self.__quotes()
+ if len(args.opts['-q']) > 0:
+ ponyset = {}
+ for pony in args.opts['-q']:
+ if endswith(pony, '.pony'):
+ ponyname = pony[:-5]
+ if '/' in ponyname:
+ ponyname = ponyname[ponyname.rindex('/') + 1:]
+ ponyset[ponyname] = pony
+ else:
+ ponyset[pony] = pony
+ alts = []
+ for pair in pairs:
+ if pair[0] in ponyset:
+ alts.append((ponyset[pair[0]], pair[1]))
+ pairs = alts
+
+ ## Select a random pony–quote-pair, load it and print it
+ if not len(pairs) == 0:
+ pair = pairs[random.randrange(0, len(pairs))]
+ printinfo('quote file: ' + pair[1])
+ with open(pair[1], 'rb') as qfile:
+ args.message = qfile.read().decode('utf8', 'replace').strip()
+ args.opts['-f'] = [pair[0]]
+ elif len(args.opts['-q']) == 0:
+ sys.stderr.write('Princess Celestia! All the ponies are mute!\n')
+ exit(1)
+ else:
+ args.opts['-f'] = [args.opts['-q'][random.randrange(0, len(args.opts['-q']))]]
+ args.message = 'Zecora! Help me, I am mute!'
+
+ self.print_pony(args)
+
+
+ '''
+ Identifies whether KMS support is utilised
+ '''
+ @staticmethod
+ def isUsingKMS():
+ ## KMS is not utilised if Linux VT is not used
+ if not linuxvt:
+ return False
+
+ ## Read the PONYSAY_KMS_PALETTE environment variable
+ env_kms = os.environ['PONYSAY_KMS_PALETTE'] if 'PONYSAY_KMS_PALETTE' in os.environ else None
+ if env_kms is None: env_kms = ''
+
+ ## Read the PONYSAY_KMS_PALETTE_CMD environment variable, and run it
+ env_kms_cmd = os.environ['PONYSAY_KMS_PALETTE_CMD'] if 'PONYSAY_KMS_PALETTE_CMD' in os.environ else None
+ if (env_kms_cmd is not None) and (not env_kms_cmd == ''):
+ env_kms = Popen(shlex.split(env_kms_cmd), stdout=PIPE, stdin=sys.stderr).communicate()[0].decode('utf8', 'replace')
+ if env_kms[-1] == '\n':
+ env_kms = env_kms[:-1]
+
+ ## If the palette string is empty KMS is not utilised
+ return env_kms != ''
+
+
+ '''
+ Returns the file name of the input pony converted to a KMS pony, or if KMS is not used, the input pony itself
+
+ @param pony:str Choosen pony file
+ @return :str Pony file to display
+ '''
+ def __kms(self, pony):
+ ## If not in Linux VT, return the pony as is
+ if not linuxvt:
+ return pony
+
+ ## KMS support version constant
+ KMS_VERSION = '1'
+
+ ## Read the PONYSAY_KMS_PALETTE environment variable
+ env_kms = os.environ['PONYSAY_KMS_PALETTE'] if 'PONYSAY_KMS_PALETTE' in os.environ else None
+ if env_kms is None: env_kms = ''
+
+ ## Read the PONYSAY_KMS_PALETTE_CMD environment variable, and run it
+ env_kms_cmd = os.environ['PONYSAY_KMS_PALETTE_CMD'] if 'PONYSAY_KMS_PALETTE_CMD' in os.environ else None
+ if (env_kms_cmd is not None) and (not env_kms_cmd == ''):
+ env_kms = Popen(shlex.split(env_kms_cmd), stdout=PIPE, stdin=sys.stderr).communicate()[0].decode('utf8', 'replace')
+ if env_kms[-1] == '\n':
+ env_kms = env_kms[:-1]
+
+ ## If not using KMS, return the pony as is
+ if env_kms == '':
+ return pony
+
+ ## Store palette string and a clong with just the essentials
+ palette = env_kms
+ palettefile = env_kms.replace('\033]P', '')
+
+ ## Get and in necessary make cache directory
+ cachedir = '/var/cache/ponysay'
+ shared = True
+ if not os.path.isdir(cachedir):
+ cachedir = HOME + '/.cache/ponysay'
+ shared = False
+ if not os.path.isdir(cachedir):
+ os.makedirs(cachedir)
+ _cachedir = '\'' + cachedir.replace('\'', '\'\\\'\'') + '\''
+
+ ## KMS support version control, clean everything if not matching
+ newversion = False
+ if not os.path.isfile(cachedir + '/.version'):
+ newversion = True
+ else:
+ with open(cachedir + '/.version', 'rb') as cachev:
+ if cachev.read().decode('utf8', 'replace').replace('\n', '') != KMS_VERSION:
+ newversion = True
+ if newversion:
+ for cached in os.listdir(cachedir):
+ cached = cachedir + '/' + cached
+ if os.path.isdir(cached) and not os.path.islink(cached):
+ shutil.rmtree(cached, False)
+ else:
+ os.remove(cached)
+ with open(cachedir + '/.version', 'w+') as cachev:
+ cachev.write(KMS_VERSION)
+ if shared:
+ Popen('chmod 666 -- ' + _cachedir + '/.version', shell=True).wait()
+
+ ## Get kmspony directory and kmspony file
+ kmsponies = cachedir + '/kmsponies/' + palettefile
+ kmspony = (kmsponies + pony).replace('//', '/')
+
+ ## If the kmspony is missing, create it
+ if not os.path.isfile(kmspony):
+ ## Protokmsponies are uncolourful ttyponies
+ protokmsponies = cachedir + '/protokmsponies/'
+ protokmspony = (protokmsponies + pony).replace('//', '/')
+ protokmsponydir = protokmspony[:protokmspony.rindex('/')]
+ kmsponydir = kmspony[: kmspony.rindex('/')]
+
+ ## Change file names to be shell friendly
+ _protokmspony = '\'' + protokmspony.replace('\'', '\'\\\'\'') + '\''
+ _kmspony = '\'' + kmspony.replace('\'', '\'\\\'\'') + '\''
+ _pony = '\'' + pony.replace('\'', '\'\\\'\'') + '\''
+
+ ## Create protokmspony is missing
+ if not os.path.isfile(protokmspony):
+ if not os.path.isdir(protokmsponydir):
+ os.makedirs(protokmsponydir)
+ if shared:
+ Popen('chmod -R 6777 -- ' + _cachedir, shell=True).wait()
+ if not os.system('ponysay2ttyponysay < ' + _pony + ' > ' + _protokmspony) == 0:
+ sys.stderr.write('Unable to run ponysay2ttyponysay successfully, you need util-say for KMS support\n')
+ exit(1)
+ if shared:
+ Popen('chmod 666 -- ' + _protokmspony, shell=True).wait()
+
+ ## Create kmspony
+ if not os.path.isdir(kmsponydir):
+ os.makedirs(kmsponydir)
+ if shared:
+ Popen('chmod -R 6777 -- ' + _cachedir, shell=True).wait()
+ if not os.system('tty2colourfultty -p ' + palette + ' < ' + _protokmspony + ' > ' + _kmspony) == 0:
+ sys.stderr.write('Unable to run tty2colourfultty successfully, you need util-say for KMS support\n')
+ exit(1)
+ if shared:
+ Popen('chmod 666 -- ' + _kmspony, shell=True).wait()
+
+ return kmspony
+
+
+
+'''
+Option takes no arguments
+'''
+ARGUMENTLESS = 0
+
+'''
+Option takes one argument per instance
+'''
+ARGUMENTED = 1
+
+'''
+Option consumes all following arguments
+'''
+VARIADIC = 2
+
+'''
+Simple argument parser
+'''
+class ArgParser():
+ '''
+ Constructor.
+ The short description is printed on same line as the program name
+
+ @param program:str The name of the program
+ @param description:str Short, single-line, description of the program
+ @param usage:str Formated, multi-line, usage text
+ @param longdescription:str Long, multi-line, description of the program, may be `None`
+ '''
+ def __init__(self, program, description, usage, longdescription = None):
+ self.__program = program
+ self.__description = description
+ self.__usage = usage
+ self.__longdescription = longdescription
+ self.__arguments = []
+ self.opts = {}
+ self.optmap = {}
+
+
+ '''
+ Add option that takes no arguments
+
+ @param alternatives:list<str> Option names
+ @param help:str Short description, use `None` to hide the option
+ '''
+ def add_argumentless(self, alternatives, help = None):
+ ARGUMENTLESS
+ self.__arguments.append((ARGUMENTLESS, alternatives, None, help))
+ stdalt = alternatives[0]
+ self.opts[stdalt] = None
+ for alt in alternatives:
+ self.optmap[alt] = (stdalt, ARGUMENTLESS)
+
+ '''
+ Add option that takes one argument
+
+ @param alternatives:list<str> Option names
+ @param arg:str The name of the takes argument, one word
+ @param help:str Short description, use `None` to hide the option
+ '''
+ def add_argumented(self, alternatives, arg, help = None):
+ self.__arguments.append((ARGUMENTED, alternatives, arg, help))
+ stdalt = alternatives[0]
+ self.opts[stdalt] = None
+ for alt in alternatives:
+ self.optmap[alt] = (stdalt, ARGUMENTED)
+
+ '''
+ Add option that takes all following argument
+
+ @param alternatives:list<str> Option names
+ @param arg:str The name of the takes arguments, one word
+ @param help:str Short description, use `None` to hide the option
+ '''
+ def add_variadic(self, alternatives, arg, help = None):
+ self.__arguments.append((VARIADIC, alternatives, arg, help))
+ stdalt = alternatives[0]
+ self.opts[stdalt] = None
+ for alt in alternatives:
+ self.optmap[alt] = (stdalt, VARIADIC)
+
+
+ '''
+ Parse arguments
+
+ @param args:list<str> The command line arguments, should include the execute file at index 0, `sys.argv` is default
+ @return :bool Whether no unrecognised option is used
+ '''
+ def parse(self, argv = sys.argv):
+ self.argcount = len(argv) - 1
+ self.files = []
+
+ argqueue = []
+ optqueue = []
+ deque = []
+ for arg in argv[1:]:
+ deque.append(arg)
+
+ dashed = False
+ tmpdashed = False
+ get = 0
+ dontget = 0
+ self.rc = True
+
+ def unrecognised(arg):
+ sys.stderr.write('%s: warning: unrecognised option %s\n' % (self.__program, arg))
+ self.rc = False
+
+ while len(deque) != 0:
+ arg = deque[0]
+ deque = deque[1:]
+ if (get > 0) and (dontget == 0):
+ get -= 1
+ argqueue.append(arg)
+ elif tmpdashed:
+ self.files.append(arg)
+ tmpdashed = False
+ elif dashed: self.files.append(arg)
+ elif arg == '++': tmpdashed = True
+ elif arg == '--': dashed = True
+ elif (len(arg) > 1) and (arg[0] in ('-', '+')):
+ if (len(arg) > 2) and (arg[:2] in ('--', '++')):
+ if dontget > 0:
+ dontget -= 1
+ elif (arg in self.optmap) and (self.optmap[arg][1] == ARGUMENTLESS):
+ optqueue.append(arg)
+ argqueue.append(None)
+ elif '=' in arg:
+ arg_opt = arg[:arg.index('=')]
+ if (arg_opt in self.optmap) and (self.optmap[arg_opt][1] >= ARGUMENTED):
+ optqueue.append(arg_opt)
+ argqueue.append(arg[arg.index('=') + 1:])
+ if self.optmap[arg_opt][1] == VARIADIC:
+ dashed = True
+ else:
+ unrecognised(arg)
+ elif (arg in self.optmap) and (self.optmap[arg][1] == ARGUMENTED):
+ optqueue.append(arg)
+ get += 1
+ elif (arg in self.optmap) and (self.optmap[arg][1] == VARIADIC):
+ optqueue.append(arg)
+ argqueue.append(None)
+ dashed = True
+ else:
+ unrecognised(arg)
+ else:
+ sign = arg[0]
+ i = 1
+ n = len(arg)
+ while i < n:
+ narg = sign + arg[i]
+ i += 1
+ if (narg in self.optmap):
+ if self.optmap[narg][1] == ARGUMENTLESS:
+ optqueue.append(narg)
+ argqueue.append(None)
+ elif self.optmap[narg][1] == ARGUMENTED:
+ optqueue.append(narg)
+ nargarg = arg[i:]
+ if len(nargarg) == 0:
+ get += 1
+ else:
+ argqueue.append(nargarg)
+ break
+ elif self.optmap[narg][1] == VARIADIC:
+ optqueue.append(narg)
+ nargarg = arg[i:]
+ argqueue.append(nargarg if len(nargarg) > 0 else None)
+ dashed = True
+ break
+ else:
+ unrecognised(arg)
+ else:
+ self.files.append(arg)
+
+ i = 0
+ n = len(optqueue)
+ while i < n:
+ opt = optqueue[i]
+ arg = argqueue[i]
+ i += 1
+ opt = self.optmap[opt][0]
+ if (opt not in self.opts) or (self.opts[opt] is None):
+ self.opts[opt] = []
+ self.opts[opt].append(arg)
+
+ for arg in self.__arguments:
+ if (arg[0] == VARIADIC):
+ varopt = self.opts[arg[1][0]]
+ if varopt is not None:
+ additional = ','.join(self.files).split(',') if len(self.files) > 0 else []
+ if varopt[0] is None:
+ self.opts[arg[1][0]] = additional
+ else:
+ self.opts[arg[1][0]] = varopt[0].split(',') + additional
+ self.files = []
+ break
+
+ self.message = ' '.join(self.files) if len(self.files) > 0 else None
+
+ return self.rc
+
+
+ '''
+ Prints a colourful help message
+ '''
+ def help(self):
+ print('\033[1m%s\033[21m %s %s' % (self.__program, '-' if linuxvt else '—', self.__description))
+ print()
+ if self.__longdescription is not None:
+ print(self.__longdescription)
+ print()
+
+ print('\033[1mUSAGE:\033[21m', end='')
+ first = True
+ for line in self.__usage.split('\n'):
+ if first:
+ first = False
+ else:
+ print(' or', end='')
+ print('\t%s' % (line))
+ print()
+
+ print('\033[1mSYNOPSIS:\033[21m')
+ (lines, lens) = ([], [])
+ for opt in self.__arguments:
+ opt_type = opt[0]
+ opt_alts = opt[1]
+ opt_arg = opt[2]
+ opt_help = opt[3]
+ if opt_help is None:
+ continue
+ (line, l) = ('', 0)
+ first = opt_alts[0]
+ last = opt_alts[-1]
+ alts = ('', last) if first is last else (first, last)
+ for opt_alt in alts:
+ if opt_alt is alts[-1]:
+ line += '%colour%' + opt_alt
+ l += len(opt_alt)
+ if opt_type == ARGUMENTED: line += ' \033[4m%s\033[24m' % (opt_arg); l += len(opt_arg) + 1
+ elif opt_type == VARIADIC: line += ' [\033[4m%s\033[24m...]' % (opt_arg); l += len(opt_arg) + 6
+ else:
+ line += ' \033[2m%s\033[22m ' % (opt_alt)
+ l += len(opt_alt) + 6
+ lines.append(line)
+ lens.append(l)
+
+ col = max(lens)
+ col += 8 - ((col - 4) & 7)
+ index = 0
+ for opt in self.__arguments:
+ opt_help = opt[3]
+ if opt_help is None:
+ continue
+ first = True
+ colour = '36' if (index & 1) == 0 else '34'
+ print(lines[index].replace('%colour%', '\033[%s;1m' % (colour)), end=' ' * (col - lens[index]))
+ for line in opt_help.split('\n'):
+ if first:
+ first = False
+ print('%s' % (line), end='\033[21;39m\n')
+ else:
+ print('%s\033[%sm%s\033[39m' % (' ' * col, colour, line))
+ index += 1
+
+ print()
+
+
+
+'''
+Balloon format class
+'''
+class Balloon():
+ '''
+ Constructor
+
+ @param link:str The \-directional balloon line character
+ @param linkmirror:str The /-directional balloon line character
+ @param ww:str See the info manual
+ @param ee:str See the info manual
+ @param nw:list<str> See the info manual
+ @param nnw:list<str> See the info manual
+ @param n:list<str> See the info manual
+ @param nne:list<str> See the info manual
+ @param ne:list<str> See the info manual
+ @param nee:str See the info manual
+ @param e:str See the info manual
+ @param see:str See the info manual
+ @param se:list<str> See the info manual
+ @param sse:list<str> See the info manual
+ @param s:list<str> See the info manual
+ @param ssw:list<str> See the info manual
+ @param sw:list<str> See the info manual
+ @param sww:str See the info manual
+ @param w:str See the info manual
+ @param nww:str See the info manual
+ '''
+ def __init__(self, link, linkmirror, ww, ee, nw, nnw, n, nne, ne, nee, e, see, se, sse, s, ssw, sw, sww, w, nww):
+ (self.link, self.linkmirror) = (link, linkmirror)
+ (self.ww, self.ee) = (ww, ee)
+ (self.nw, self.ne, self.se, self.sw) = (nw, ne, se, sw)
+ (self.nnw, self.n, self.nne) = (nnw, n, nne)
+ (self.nee, self.e, self.see) = (nee, e, see)
+ (self.sse, self.s, self.ssw) = (sse, s, ssw)
+ (self.sww, self.w, self.nww) = (sww, w, nww)
+
+ _ne = max(ne, key = UCS.dispLen)
+ _nw = max(nw, key = UCS.dispLen)
+ _se = max(se, key = UCS.dispLen)
+ _sw = max(sw, key = UCS.dispLen)
+
+ minE = UCS.dispLen(max([_ne, nee, e, see, _se, ee], key = UCS.dispLen))
+ minW = UCS.dispLen(max([_nw, nww, e, sww, _sw, ww], key = UCS.dispLen))
+ minN = len(max([ne, nne, n, nnw, nw], key = len))
+ minS = len(max([se, sse, s, ssw, sw], key = len))
+
+ self.minwidth = minE + minE
+ self.minheight = minN + minS
+
+
+ '''
+ Generates a balloon with a message
+
+ @param minw:int The minimum number of columns of the balloon
+ @param minh:int The minimum number of lines of the balloon
+ @param lines:list<str> The text lines to display
+ @param lencalc:int(str) Function used to compute the length of a text line
+ @return :str The balloon as a formated string
+ '''
+ def get(self, minw, minh, lines, lencalc):
+ h = self.minheight + len(lines)
+ w = self.minwidth + lencalc(max(lines, key = lencalc))
+ if w < minw: w = minw
+ if h < minh: h = minh
+
+ if len(lines) > 1:
+ (ws, es) = ({0 : self.nww, len(lines) - 1 : self.sww}, {0 : self.nee, len(lines) - 1 : self.see})
+ for j in range(1, len(lines) - 1):
+ ws[j] = self.w
+ es[j] = self.e
+ else:
+ (ws, es) = ({0 : self.ww}, {0 : self.ee})
+
+ rc = []
+
+ for j in range(0, len(self.n)):
+ outer = UCS.dispLen(self.nw[j]) + UCS.dispLen(self.ne[j])
+ inner = UCS.dispLen(self.nnw[j]) + UCS.dispLen(self.nne[j])
+ if outer + inner <= w:
+ rc.append(self.nw[j] + self.nnw[j] + self.n[j] * (w - outer - inner) + self.nne[j] + self.ne[j])
+ else:
+ rc.append(self.nw[j] + self.n[j] * (w - outer) + self.ne[j])
+
+ for j in range(0, len(lines)):
+ rc.append(ws[j] + lines[j] + ' ' * (w - lencalc(lines[j]) - UCS.dispLen(self.w) - UCS.dispLen(self.e)) + es[j])
+
+ for j in range(0, len(self.s)):
+ outer = UCS.dispLen(self.sw[j]) + UCS.dispLen(self.se[j])
+ inner = UCS.dispLen(self.ssw[j]) + UCS.dispLen(self.sse[j])
+ if outer + inner <= w:
+ rc.append(self.sw[j] + self.ssw[j] + self.s[j] * (w - outer - inner) + self.sse[j] + self.se[j])
+ else:
+ rc.append(self.sw[j] + self.s[j] * (w - outer) + self.se[j])
+
+ return '\n'.join(rc)
+
+
+
+'''
+Super-ultra-extreme-awesomazing replacement for cowsay
+'''
+class Backend():
+ '''
+ Constructor
+
+ @param message:str The message spoken by the pony
+ @param ponyfile:str The pony file
+ @param wrapcolumn:int The column at where to wrap the message, `None` for no wrapping
+ @param width:int The width of the screen, `None` if truncation should not be applied
+ @param balloon:Balloon The balloon style object, `None` if only the pony should be printed
+ @param hyphen:str How hyphens added by the wordwrapper should be printed
+ @param linkcolour:str How to colour the link character, empty string if none
+ @param ballooncolour:str How to colour the balloon, empty string if none
+ '''
+ def __init__(self, message, ponyfile, wrapcolumn, width, balloon, hyphen, linkcolour, ballooncolour):
+ self.message = message
+ self.ponyfile = ponyfile
+ self.wrapcolumn = None if wrapcolumn is None else wrapcolumn - (0 if balloon is None else balloon.minwidth)
+ self.width = width
+ self.balloon = balloon
+ self.hyphen = hyphen
+ self.ballooncolour = ballooncolour
+
+ if self.balloon is not None:
+ self.link = {'\\' : linkcolour + self.balloon.link,
+ '/' : linkcolour + self.balloon.linkmirror}
+ else:
+ self.link = {}
+
+ self.output = ''
+ self.pony = None
+
+
+ '''
+ Process all data
+ '''
+ def parse(self):
+ self.__expandMessage()
+ self.__unpadMessage()
+ self.__loadFile()
+
+ if self.pony.startswith('$$$\n'):
+ self.pony = self.pony[4:]
+ infoend = self.pony.index('\n$$$\n')
+ printinfo(self.pony[:infoend])
+ self.pony = self.pony[infoend + 5:]
+ self.pony = mode + self.pony
+
+ self.__processPony()
+ self.__truncate()
+
+
+ '''
+ Remove padding spaces fortune cookies are padded with whitespace (damn featherbrains)
+ '''
+ def __unpadMessage(self):
+ lines = self.message.split('\n')
+ for spaces in (8, 4, 2, 1):
+ padded = True
+ for line in lines:
+ if not line.startswith(' ' * spaces):
+ padded = False
+ break
+ if padded:
+ for i in range(0, len(lines)):
+ line = lines[i]
+ while line.startswith(' ' * spaces):
+ line = line[spaces:]
+ lines[i] = line
+ lines = [line.rstrip(' ') for line in lines]
+ self.message = '\n'.join(lines)
+
+
+ '''
+ Converts all tabs in the message to spaces by expanding
+ '''
+ def __expandMessage(self):
+ lines = self.message.split('\n')
+ buf = ''
+ for line in lines:
+ (i, n, x) = (0, len(line), 0)
+ while i < n:
+ c = line[i]
+ i += 1
+ if c == '\033':
+ colour = self.__getcolour(line, i - 1)
+ i += len(colour) - 1
+ buf += colour
+ elif c == '\t':
+ nx = 8 - (x & 7)
+ buf += ' ' * nx
+ x += nx
+ else:
+ buf += c
+ if not UCS.isCombining(c):
+ x += 1
+ buf += '\n'
+ self.message = buf[:-1]
+
+
+ '''
+ Loads the pony file
+ '''
+ def __loadFile(self):
+ with open(self.ponyfile, 'rb') as ponystream:
+ self.pony = ponystream.read().decode('utf8', 'replace')
+
+
+ '''
+ Truncate output to the width of the screen
+ '''
+ def __truncate(self):
+ if self.width is None:
+ return
+ lines = self.output.split('\n')
+ self.output = ''
+ for line in lines:
+ (i, n, x) = (0, len(line), 0)
+ while i < n:
+ c = line[i]
+ i += 1
+ if c == '\033':
+ colour = self.__getcolour(line, i - 1)
+ i += len(colour) - 1
+ self.output += colour
+ else:
+ if x < self.width:
+ self.output += c
+ if not UCS.isCombining(c):
+ x += 1
+ self.output += '\n'
+ self.output = self.output[:-1]
+
+
+ '''
+ Process the pony file and generate output to self.output
+ '''
+ def __processPony(self):
+ self.output = ''
+
+ AUTO_PUSH = '\033[01010~'
+ AUTO_POP = '\033[10101~'
+
+ variables = {'' : '$'}
+ for key in self.link:
+ variables[key] = AUTO_PUSH + self.link[key] + AUTO_POP
+
+ indent = 0
+ dollar = None
+ balloonLines = None
+ colourstack = ColourStack(AUTO_PUSH, AUTO_POP)
+
+ (i, n, lineindex, skip, nonskip) = (0, len(self.pony), 0, 0, 0)
+ while i < n:
+ c = self.pony[i]
+ if c == '\t':
+ n += 7 - (indent & 7)
+ ed = ' ' * (8 - (indent & 7))
+ c = ' '
+ self.pony = self.pony[:i] + ed + self.pony[i + 1:]
+ i += 1
+ if c == '$':
+ if dollar is not None:
+ if '=' in dollar:
+ name = dollar[:dollar.find('=')]
+ value = dollar[dollar.find('=') + 1:]
+ variables[name] = value
+ elif not dollar.startswith('balloon'):
+ data = variables[dollar].replace('$', '$$')
+ if data == '$$': # if not handled specially we will get an infinity loop
+ if (skip == 0) or (nonskip > 0):
+ if nonskip > 0:
+ nonskip -= 1
+ self.output += '$'
+ indent += 1
+ else:
+ skip -= 1
+ else:
+ n += len(data)
+ self.pony = self.pony[:i] + data + self.pony[i:]
+ elif self.balloon is not None:
+ (w, h) = (0, 0)
+ props = dollar[7:]
+ if len(props) > 0:
+ if ',' in props:
+ if props[0] is not ',':
+ w = int(props[:props.index(',')])
+ h = int(props[props.index(',') + 1:])
+ else:
+ w = int(props)
+ balloon = self.__getballoon(w, h, indent)
+ balloon = balloon.split('\n')
+ balloon = [AUTO_PUSH + self.ballooncolour + item + AUTO_POP for item in balloon]
+ for b in balloon[0]:
+ self.output += b + colourstack.feed(b)
+ if lineindex == 0:
+ balloonpre = '\n' + (' ' * indent)
+ for line in balloon[1:]:
+ self.output += balloonpre;
+ for b in line:
+ self.output += b + colourstack.feed(b);
+ indent = 0
+ elif len(balloon) > 1:
+ balloonLines = balloon
+ balloonLine = 0
+ balloonIndent = indent
+ indent += self.__len(balloonLines[0])
+ balloonLines[0] = None
+ dollar = None
+ else:
+ dollar = ''
+ elif dollar is not None:
+ if c == '\033':
+ c = self.pony[i]
+ i += 1
+ dollar += c
+ elif c == '\033':
+ colour = self.__getcolour(self.pony, i - 1)
+ for b in colour:
+ self.output += b + colourstack.feed(b);
+ i += len(colour) - 1
+ elif c == '\n':
+ self.output += c
+ indent = 0
+ (skip, nonskip) = (0, 0)
+ lineindex += 1
+ if balloonLines is not None:
+ balloonLine += 1
+ if balloonLine == len(balloonLines):
+ balloonLines = None
+ else:
+ if (balloonLines is not None) and (balloonLines[balloonLine] is not None) and (balloonIndent == indent):
+ data = balloonLines[balloonLine]
+ datalen = self.__len(data)
+ skip += datalen
+ nonskip += datalen
+ data = data.replace('$', '$$')
+ n += len(data)
+ self.pony = self.pony[:i] + data + self.pony[i:]
+ balloonLines[balloonLine] = None
+ else:
+ if (skip == 0) or (nonskip > 0):
+ if nonskip > 0:
+ nonskip -= 1
+ self.output += c + colourstack.feed(c);
+ if not UCS.isCombining(c):
+ indent += 1
+ else:
+ skip -= 1
+
+ if balloonLines is not None:
+ for line in balloonLines[balloonLine:]:
+ data = ' ' * (balloonIndent - indent) + line + '\n'
+ for b in data:
+ self.output += b + colourstack.feed(b);
+ indent = 0
+
+ self.output = self.output.replace(AUTO_PUSH, '').replace(AUTO_POP, '')
+
+
+ '''
+ Gets colour code att the currect offset in a buffer
+
+ @param input:str The input buffer
+ @param offset:int The offset at where to start reading, a escape must begin here
+ @return :str The escape sequence
+ '''
+ def __getcolour(self, input, offset):
+ (i, n) = (offset, len(input))
+ rc = input[i]
+ i += 1
+ if i == n: return rc
+ c = input[i]
+ i += 1
+ rc += c
+
+ if c == ']':
+ if i == n: return rc
+ c = input[i]
+ i += 1
+ rc += c
+ if c == 'P':
+ di = 0
+ while (di < 7) and (i < n):
+ c = input[i]
+ i += 1
+ di += 1
+ rc += c
+ elif c == '[':
+ while i < n:
+ c = input[i]
+ i += 1
+ rc += c
+ if (c == '~') or (('a' <= c) and (c <= 'z')) or (('A' <= c) and (c <= 'Z')):
+ break
+
+ return rc
+
+
+ '''
+ Calculates the number of visible characters in a text
+
+ @param input:str The input buffer
+ @return :int The number of visible characters
+ '''
+ def __len(self, input):
+ (rc, i, n) = (0, 0, len(input))
+ while i < n:
+ c = input[i]
+ if c == '\033':
+ i += len(self.__getcolour(input, i))
+ else:
+ i += 1
+ if not UCS.isCombining(c):
+ rc += 1
+ return rc
+
+
+ '''
+ Generates a balloon with the message
+
+ @param width:int The minimum width of the balloon
+ @param height:int The minimum height of the balloon
+ @param left:int The column where the balloon starts
+ @return :str The balloon the the message as a string
+ '''
+ def __getballoon(self, width, height, left):
+ wrap = None
+ if self.wrapcolumn is not None:
+ wrap = self.wrapcolumn - left
+ if wrap < 8:
+ wrap = 8
+
+ msg = self.message
+ if wrap is not None:
+ msg = self.__wrapMessage(msg, wrap)
+
+ msg = msg.replace('\n', '\033[0m%s\n' % (self.ballooncolour)) + '\033[0m' + self.ballooncolour
+
+ return self.balloon.get(width, height, msg.split('\n'), self.__len);
+
+
+ '''
+ Wraps the message
+
+ @param message:str The message to wrap
+ @param wrap:int The width at where to force wrapping
+ @return :str The message wrapped
+ '''
+ def __wrapMessage(self, message, wrap):
+ buf = ''
+ try:
+ AUTO_PUSH = '\033[01010~'
+ AUTO_POP = '\033[10101~'
+ msg = message.replace('\n', AUTO_PUSH + '\n' + AUTO_POP);
+ cstack = ColourStack(AUTO_PUSH, AUTO_POP)
+ for c in msg:
+ buf += c + cstack.feed(c)
+ lines = buf.replace(AUTO_PUSH, '').replace(AUTO_POP, '').split('\n')
+ buf = ''
+
+ for line in lines:
+ b = [None] * len(line)
+ map = {0 : 0}
+ (bi, cols, w) = (0, 0, wrap)
+ (indent, indentc) = (-1, 0)
+
+ (i, n) = (0, len(line))
+ while i <= n:
+ d = None
+ if i < n:
+ d = line[i]
+ i += 1
+ if d == '\033': # TODO this should use self.__getcolour()
+ ## Invisible stuff
+ b[bi] = d
+ bi += 1
+ b[bi] = line[i]
+ d = line[i]
+ bi += 1
+ i += 1
+ if d == '[':
+ while True:
+ b[bi] = line[i]
+ d = line[i]
+ bi += 1
+ i += 1
+ if (('a' <= d) and (d <= 'z')) or (('A' <= d) and (d <= 'Z')) or (d == '~'):
+ break
+ elif d == ']':
+ b[bi] = line[i]
+ d = line[i]
+ bi += 1
+ i += 1
+ if d == 'P':
+ for j in range(0, 7):
+ b[bi] = line[i]
+ bi += 1
+ i += 1
+ elif (d is not None) and (d != ' '):
+ ## Fetch word
+ if indent == -1:
+ indent = i - 1
+ for j in range(0, indent):
+ if line[j] == ' ':
+ indentc += 1
+ b[bi] = d
+ bi += 1
+ if (not UCS.isCombining(d)) and (d != '­'):
+ cols += 1
+ map[cols] = bi
+ else:
+ ## Wrap?
+ mm = 0
+ bisub = 0
+ iwrap = wrap - (0 if indent == 1 else indentc)
+
+ while ((w > 8) and (cols > w + 5)) or (cols > iwrap): # TODO make configurable
+ ## wrap
+ x = w;
+ if mm + x not in map: # Too much whitespace ?
+ cols = 0
+ break
+ nbsp = b[map[mm + x]] == ' '
+ m = map[mm + x]
+
+ if ('­' in b[bisub : m]) and not nbsp:
+ hyphen = m - 1
+ while b[hyphen] != '­':
+ hyphen -= 1
+ while map[mm + x] > hyphen: ## Only looking backward, if foreward is required the word is probabily not hyphenated correctly
+ x -= 1
+ x += 1
+ m = map[mm + x]
+
+ mm += x - (0 if nbsp else 1) ## − 1 so we have space for a hythen
+
+ for bb in b[bisub : m]:
+ buf += bb
+ buf += '\n' if nbsp else '\0\n'
+ cols -= x - (0 if nbsp else 1)
+ bisub = m
+
+ w = iwrap
+ if indent != -1:
+ buf += line[:indent]
+
+ for j in range(bisub, bi):
+ b[j - bisub] = b[j]
+ bi -= bisub
+
+ if cols > w:
+ buf += '\n'
+ w = wrap
+ if indent != -1:
+ buf += line[:indent]
+ w -= indentc
+ for bb in b[:bi]:
+ buf += bb
+ w -= cols
+ cols = 0
+ bi = 0
+ if d is None:
+ i += 1
+ else:
+ if w > 0:
+ buf += ' '
+ w -= 1
+ else:
+ buf += '\n'
+ w = wrap
+ if indent != -1:
+ buf + line[:indent]
+ w -= indentc
+ buf += '\n'
+
+ rc = '\n'.join(line.rstrip() for line in buf[:-1].split('\n'));
+ rc = rc.replace('­', ''); # remove soft hyphens
+ rc = rc.replace('\0', '%s%s%s' % (AUTO_PUSH, self.hyphen, AUTO_POP))
+ return rc
+ except Exception as err:
+ import traceback
+ errormessage = ''.join(traceback.format_exception(type(err), err, None))
+ rc = '\n'.join(line.rstrip() for line in buf.split('\n'));
+ rc = rc.replace('\0', '%s%s%s' % (AUTO_PUSH, self.hyphen, AUTO_POP))
+ errormessage += '\n---- WRAPPING BUFFER ----\n\n' + rc
+ try:
+ if os.readlink('/proc/self/fd/2') != os.readlink('/proc/self/fd/1'):
+ printerr(errormessage, end='')
+ return message
+ except:
+ pass
+ return message + '\n\n\033[0;1;31m---- EXCEPTION IN PONYSAY WHILE WRAPPING ----\033[0m\n\n' + errormessage
+
+
+'''
+ANSI colour stack
+
+This is used to make layers with independent coloursations
+'''
+class ColourStack():
+ '''
+ Constructor
+
+ @param autopush:str String that, when used, will create a new independently colourised layer
+ @param autopop:str String that, when used, will end the current layer and continue of the previous layer
+ '''
+ def __init__(self, autopush, autopop):
+ self.autopush = autopush
+ self.autopop = autopop
+ self.lenpush = len(autopush)
+ self.lenpop = len(autopop)
+ self.bufproto = ' ' * (self.lenpush if self.lenpush > self.lenpop else self.lenpop)
+ self.stack = []
+ self.push()
+ self.seq = None
+
+
+ '''
+ Create a new independently colourised layer
+
+ @return :str String that should be inserted into your buffer
+ '''
+ def push(self):
+ self.stack.insert(0, [self.bufproto, None, None, [False] * 9])
+ if len(self.stack) == 1:
+ return None
+ return '\033[0m'
+
+
+ '''
+ End the current layer and continue of the previous layer
+
+ @return :str String that should be inserted into your buffer
+ '''
+ def pop(self):
+ old = self.stack.pop(0)
+ rc = '\033[0;'
+ if len(self.stack) == 0: # last resort in case something made it pop too mush
+ push()
+ new = self.stack[0]
+ if new[1] is not None: rc += new[1] + ';'
+ if new[2] is not None: rc += new[2] + ';'
+ for i in range(0, 9):
+ if new[3][i]:
+ rc += str(i + 1) + ';'
+ return rc[:-1] + 'm'
+
+
+ '''
+ Use this, in sequence, for which character in your buffer that contains yor autopush and autopop
+ string, the automatically get push and pop string to insert after each character
+
+ @param :chr One character in your buffer
+ @return :str The text to insert after the input character
+ '''
+ def feed(self, char):
+ if self.seq is not None:
+ self.seq += char
+ if (char == '~') or (('a' <= char) and (char <= 'z')) or (('A' <= char) and (char <= 'Z')):
+ if (self.seq[0] == '[') and (self.seq[-1] == 'm'):
+ self.seq = self.seq[1:-1].split(';')
+ (i, n) = (0, len(self.seq))
+ while i < n:
+ part = self.seq[i]
+ p = 0 if part == '' else int(part)
+ i += 1
+ if p == 0: self.stack[0][1:] = [None, None, [False] * 9]
+ elif (1 <= p) and (p <= 9): self.stack[0][3][p - 1] = True
+ elif (21 <= p) and (p <= 29): self.stack[0][3][p - 21] = False
+ elif p == 39: self.stack[0][1] = None
+ elif p == 49: self.stack[0][2] = None
+ elif (30 <= p) and (p <= 37): self.stack[0][1] = part
+ elif (90 <= p) and (p <= 97): self.stack[0][1] = part
+ elif (40 <= p) and (p <= 47): self.stack[0][2] = part
+ elif (100 <= p) and (p <= 107): self.stack[0][2] = part
+ elif p == 38:
+ self.stack[0][1] = '%s;%s;%s' % (part, self.seq[i], self.seq[i + 1])
+ i += 2
+ elif p == 48:
+ self.stack[0][2] = '%s;%s;%s' % (part, self.seq[i], self.seq[i + 1])
+ i += 2
+ self.seq = None
+ elif char == '\033':
+ self.seq = ''
+ buf = self.stack[0][0]
+ buf = buf[1:] + char
+ rc = ''
+ if buf[-self.lenpush:] == self.autopush: rc = self.push()
+ elif buf[-self.lenpop:] == self.autopop: rc = self.pop()
+ self.stack[0][0] = buf
+ return rc
+
+
+
+'''
+UCS utility class
+'''
+class UCS():
+ '''
+ Checks whether a character is a combining character
+
+ @param char:chr The character to test
+ @return :bool Whether the character is a combining character
+ '''
+ @staticmethod
+ def isCombining(char):
+ o = ord(char)
+ if (0x0300 <= o) and (o <= 0x036F): return True
+ if (0x20D0 <= o) and (o <= 0x20FF): return True
+ if (0x1DC0 <= o) and (o <= 0x1DFF): return True
+ if (0xFE20 <= o) and (o <= 0xFE2F): return True
+ return False
+
+
+ '''
+ Gets the number of combining characters in a string
+
+ @param string:str A text to count combining characters in
+ @return :int The number of combining characters in the string
+ '''
+ @staticmethod
+ def countCombining(string):
+ rc = 0
+ for char in string:
+ if UCS.isCombining(char):
+ rc += 1
+ return rc
+
+
+ '''
+ Gets length of a string not counting combining characters
+
+ @param string:str The text of which to determine the monospaced width
+ @return The determine the monospaced width of the text, provided it does not have escape sequnces
+ '''
+ @staticmethod
+ def dispLen(string):
+ return len(string) - UCS.countCombining(string)
+
+
+
+'''
+Class used for correcting spellos and typos,
+
+Note that this implementation will not find that correctly spelled word are correct faster than it corrects words.
+It is also limited to words of size 0 to 127 (inclusive)
+'''
+class SpelloCorrecter(): # Naïvely and quickly proted and adapted from optimised Java, may not be the nicest, or even fast, Python code
+ '''
+ Constructor
+
+ @param directories:list<str> List of directories that contains the file names with the correct spelling
+ @param ending:str The file name ending of the correctly spelled file names, this is removed for the name
+ '''
+ def __init__(self, directories, ending):
+ self.weights = {'k' : {'c' : 0.25, 'g' : 0.75, 'q' : 0.125},
+ 'c' : {'k' : 0.25, 'g' : 0.75, 's' : 0.5, 'z' : 0.5, 'q' : 0.125},
+ 's' : {'z' : 0.25, 'c' : 0.5},
+ 'z' : {'s' : 0.25, 'c' : 0.5},
+ 'g' : {'k' : 0.75, 'c' : 0.75, 'q' : 0.9},
+ 'o' : {'u' : 0.5},
+ 'u' : {'o' : 0.5, 'v' : 0.75, 'w' : 0.5},
+ 'b' : {'v' : 0.75},
+ 'v' : {'b' : 0.75, 'w' : 0.5, 'u' : 0.7},
+ 'w' : {'v' : 0.5, 'u' : 0.5},
+ 'q' : {'c' : 0.125, 'k' : 0.125, 'g' : 0.9}}
+
+ self.corrections = None
+ self.dictionary = [None] * 513
+ self.reusable = [0] * 512
+ self.dictionaryEnd = 512
+ self.closestDistance = 0
+
+ self.M = [None] * 128
+ for y in range(0, 128):
+ self.M[y] = [0] * 128
+ self.M[y][0] = y
+ m0 = self.M[0]
+ x = 127
+ while x > -1:
+ m0[x] = x
+ x -= 1
+
+ previous = ''
+ self.dictionary[-1] = previous;
+
+ for directory in directories:
+ for filename in os.listdir(directory):
+ if (not endswith(filename, ending)) or (len(filename) - len(ending) > 127):
+ continue
+ proper = filename[:-len(ending)]
+
+ if self.dictionaryEnd == 0:
+ self.dictionaryEnd = len(self.dictionary)
+ self.reusable = [0] * self.dictionaryEnd + self.reusable
+ self.dictionary = [None] * self.dictionaryEnd + self.dictionary
+
+ self.dictionaryEnd -= 1
+ self.dictionary[self.dictionaryEnd] = proper
+
+ prevCommon = min(len(previous), len(proper))
+ for i in range(0, prevCommon):
+ if previous[i] != proper[i]:
+ prevCommon = i
+ break
+ previous = proper
+ self.reusable[self.dictionaryEnd] = prevCommon
+ #part = self.dictionary[self.dictionaryEnd : len(self.dictionary) - 1]
+ #part.sort()
+ #self.dictionary[self.dictionaryEnd : len(self.dictionary) - 1] = part
+ #
+ #index = len(self.dictionary) - 1
+ #while index >= self.dictionaryEnd:
+ # proper = self.dictionary[index]
+ # prevCommon = min(len(previous), len(proper))
+ # for i in range(0, prevCommon):
+ # if previous[i] != proper[i]:
+ # prevCommon = i
+ # break
+ # previous = proper
+ # self.reusable[self.dictionaryEnd] = prevCommon
+ # index -= 1;
+
+
+ '''
+ Finds the closests correct spelled word
+
+ @param used:str The word to correct
+ @return (words, distance):(list<string>, int) A list the closest spellings and the weighted distance
+ '''
+ def correct(self, used):
+ if len(used) > 127:
+ return ([used], 0)
+
+ self.__correct(used)
+ return (self.corrections, self.closestDistance)
+
+
+ '''
+ Finds the closests correct spelled word
+
+ @param used:str The word to correct, it must satisfy all restrictions
+ '''
+ def __correct(self, used):
+ self.closestDistance = 0x7FFFFFFF
+ previous = self.dictionary[-1]
+ prevLen = 0
+ usedLen = len(used)
+
+ proper = None
+ prevCommon = 0
+
+ d = len(self.dictionary) - 1
+ while d > self.dictionaryEnd:
+ d -= 1
+ proper = self.dictionary[d]
+ if abs(len(proper) - usedLen) <= self.closestDistance:
+ if previous == self.dictionary[d + 1]:
+ prevCommon = self.reusable[d];
+ else:
+ prevCommon = min(prevLen, len(proper))
+ for i in range(0, prevCommon):
+ if previous[i] != proper[i]:
+ prevCommon = i
+ break
+
+ skip = min(prevLen, len(proper))
+ i = prevCommon
+ while i < skip:
+ for u in range(0, usedLen):
+ if (used[u] == previous[i]) or (used[u] == proper[i]):
+ skip = i
+ break
+ i += 1
+
+ common = min(skip, min(usedLen, len(proper)))
+ for i in range(0, common):
+ if used[i] != proper[i]:
+ common = i
+ break
+
+ distance = self.__distance(proper, skip, len(proper), used, common, usedLen)
+
+ if self.closestDistance > distance:
+ self.closestDistance = distance
+ self.corrections = [proper]
+ elif self.closestDistance == distance:
+ self.corrections.append(proper)
+
+ previous = proper;
+ if distance >= 0x7FFFFF00:
+ prevLen = distance & 255
+ else:
+ prevLen = len(proper)
+
+
+ '''
+ Calculate the distance between a correct word and a incorrect word
+
+ @param proper:str The correct word
+ @param y0:int The offset for `proper`
+ @param yn:int The length, before applying `y0`, of `proper`
+ @param used:str The incorrect word
+ @param x0:int The offset for `used`
+ @param xn:int The length, before applying `x0`, of `used`
+ @return :float The distance between the words
+ '''
+ def __distance(self, proper, y0, yn, used, x0, xn):
+ my = self.M[y0]
+ for y in range(y0, yn):
+ best = 0x7FFFFFFF
+ p = proper[y]
+ myy = self.M[y + 1] # only one array bound check, and at most one + ☺
+ x = x0
+ while x < xn:
+ change = my[x]
+ u = used[x]
+ if p == u:
+ # commence black magick … twilight would be so disappointed
+ x += 1
+ myy[x] = change
+ best = min(best, change)
+ remove = myy[x]
+ add = my[x + 1]
+
+ cw = 1
+ if my[x] in self.weights:
+ if p in self.weights[u]:
+ cw = self.weights[u][p]
+ x += 1
+
+ myy[x] = min(cw + change, 1 + min(remove, add))
+ if best > myy[x]:
+ best = myy[x]
+
+ if best > self.closestDistance:
+ return 0x7FFFFF00 | y
+ my = myy
+ return my[xn]
+
+
+
+
+'''
+The user's home directory
+'''
+HOME = os.environ['HOME'] if 'HOME' in os.environ else os.path.expanduser('~')
+
+
+'''
+Whether the program is execute in Linux VT (TTY)
+'''
+linuxvt = ('TERM' in os.environ) and (os.environ['TERM'] == 'linux')
+
+
+'''
+Whether the script is executed as ponythink
+'''
+isthink = (len(__file__) >= len('think')) and (__file__.endswith('think'))
+isthink = ((len(__file__) >= len('think.py')) and (__file__.endswith('think.py'))) or isthink
+
+
+'''
+Whether stdin is piped
+'''
+pipelinein = not sys.stdin.isatty()
+
+'''
+Whether stdout is piped
+'''
+pipelineout = not sys.stdout.isatty()
+
+'''
+Whether stderr is piped
+'''
+pipelineerr = not sys.stderr.isatty()
+
+
+'''
+Whether KMS is used
+'''
+usekms = Ponysay.isUsingKMS()
+
+
+'''
+Mode string that modifies or adds $ variables in the pony image
+'''
+mode = ''
+
+
+'''
+The directories where pony files are stored, ttyponies/ are used if the terminal is Linux VT (also known as TTY) and not with KMS
+'''
+appendset = set()
+xponydirs = []
+_ponydirs = [HOME + '/.local/share/ponysay/ponies/', '/usr/share/ponysay/ponies/']
+for ponydir in _ponydirs:
+ if os.path.isdir(ponydir) and (ponydir not in appendset):
+ xponydirs.append(ponydir)
+ appendset.add(ponydir)
+appendset = set()
+vtponydirs = []
+_ponydirs = [HOME + '/.local/share/ponysay/ttyponies/', '/usr/share/ponysay/ttyponies/']
+for ponydir in _ponydirs:
+ if os.path.isdir(ponydir) and (ponydir not in appendset):
+ vtponydirs.append(ponydir)
+ appendset.add(ponydir)
+
+
+'''
+The directories where pony files are stored, extrattyponies/ are used if the terminal is Linux VT (also known as TTY) and not with KMS
+'''
+appendset = set()
+extraxponydirs = []
+_extraponydirs = [HOME + '/.local/share/ponysay/extraponies/', '/usr/share/ponysay/extraponies/']
+for extraponydir in _extraponydirs:
+ if os.path.isdir(extraponydir) and (extraponydir not in appendset):
+ extraxponydirs.append(extraponydir)
+ appendset.add(extraponydir)
+appendset = set()
+extravtponydirs = []
+_extraponydirs = [HOME + '/.local/share/ponysay/extrattyponies/', '/usr/share/ponysay/extrattyponies/']
+for extraponydir in _extraponydirs:
+ if os.path.isdir(extraponydir) and (extraponydir not in appendset):
+ extravtponydirs.append(extraponydir)
+ appendset.add(extraponydir)
+
+
+'''
+The directories where quotes files are stored
+'''
+appendset = set()
+quotedirs = []
+_quotedirs = [HOME + '/.local/share/ponysay/quotes/', '/usr/share/ponysay/quotes/']
+for quotedir in _quotedirs:
+ if os.path.isdir(quotedir) and (quotedir not in appendset):
+ quotedirs.append(quotedir)
+ appendset.add(quotedir)
+
+
+'''
+The directories where balloon style files are stored
+'''
+appendset = set()
+balloondirs = []
+_balloondirs = [HOME + '/.local/share/ponysay/balloons/', '/usr/share/ponysay/balloons/']
+for balloondir in _balloondirs:
+ if os.path.isdir(balloondir) and (balloondir not in appendset):
+ balloondirs.append(balloondir)
+ appendset.add(balloondir)
+
+
+'''
+ucsmap files
+'''
+appendset = set()
+ucsmaps = []
+_ucsmaps = [HOME + '/.local/share/ponysay/ucsmap', '/usr/share/ponysay/ucsmap']
+for ucsmap in _ucsmaps:
+ if os.path.isdir(ucsmap) and (ucsmap not in appendset):
+ ucsmaps.append(ucsmap)
+ appendset.add(ucsmap)
+
+
+
+usage_saythink = '\033[34;1m(ponysay | ponythink)\033[21;39m'
+usage_common = '[-c] [-W\033[4mCOLUMN\033[24m] [-b\033[4mSTYLE\033[24m]'
+usage_listhelp = '(-l | -L | -B | +l | +L | -v | -h)'
+usage_file = '[-f\033[4mPONY\033[24m]* [[--] \033[4mmessage\033[24m]'
+usage_xfile = '(-F\033[4mPONY\033[24m)* [[--] \033[4mmessage\033[24m]'
+usage_quote = '(-q \033[4mPONY\033[24m)*'
+
+usage = '%s %s\n%s %s %s\n%s %s %s\n%s %s %s' % (usage_saythink, usage_listhelp,
+ usage_saythink, usage_common, usage_file,
+ usage_saythink, usage_common, usage_xfile,
+ usage_saythink, usage_common, usage_quote)
+
+usage = usage.replace('\033[', '\0')
+for sym in ('[', ']', '(', ')', '|', '...', '*'):
+ usage = usage.replace(sym, '\033[2m' + sym + '\033[22m')
+usage = usage.replace('\0', '\033[')
+
+'''
+Argument parsing
+'''
+opts = ArgParser(program = 'ponythink' if isthink else 'ponysay',
+ description = 'cowsay reimplemention for ponies',
+ usage = usage,
+ longdescription =
+'''Ponysay displays an image of a pony saying some text provided by the user.
+If \033[4mmessage\033[24m is not provided, it accepts standard input. For an extensive
+documentation run `info ponysay`, or for just a little more help than this
+run `man ponysay`. Ponysay has so much more to offer than described here.''')
+
+opts.add_argumentless(['--quoters'])
+opts.add_argumentless(['--onelist'])
+opts.add_argumentless(['++onelist'])
+
+opts.add_argumentless(['-X', '--256-colours', '--256colours', '--x-colours'])
+opts.add_argumentless(['-V', '--tty-colours', '--ttycolours', '--vt-colours'])
+opts.add_argumentless(['-K', '--kms-colours', '--kmscolours'])
+
+opts.add_argumented(['+c', '--colour'], arg = 'COLOUR')
+opts.add_argumented(['--colour-bubble', '--colour-balloon'], arg = 'COLOUR')
+opts.add_argumented(['--colour-link'], arg = 'COLOUR')
+opts.add_argumented(['--colour-msg', '--colour-message'], arg = 'COLOUR')
+opts.add_argumented(['--colour-pony'], arg = 'COLOUR')
+opts.add_argumented(['--colour-wrap', '--colour-hyphen'], arg = 'COLOUR')
+
+opts.add_argumentless(['-h', '--help'], help = 'Print this help message.')
+opts.add_argumentless(['-v', '--version'], help = 'Print the version of the program.')
+opts.add_argumentless(['-l', '--list'], help = 'List pony names.')
+opts.add_argumentless(['-L', '--symlist', '--altlist'], help = 'List pony names with alternatives.')
+opts.add_argumentless(['+l', '++list'], help = 'List non-MLP:FiM pony names.')
+opts.add_argumentless(['+L', '++symlist', '++altlist'], help = 'List non-MLP:FiM pony names with alternatives.')
+opts.add_argumentless(['-A', '--all'], help = 'List all pony names.')
+opts.add_argumentless(['+A', '++all', '--symall', '--altall'], help = 'List all pony names with alternatives.')
+opts.add_argumentless(['-B', '--bubblelist', '--balloonlist'], help = 'List balloon styles.')
+opts.add_argumentless(['-c', '--compact'], help = 'Compress messages.')
+opts.add_argumentless(['-o', '--pony-only', '--ponyonly'], help = 'Print only the pony.')
+opts.add_argumented( ['-W', '--wrap'], arg = 'COLUMN', help = 'Specify column where the message should be wrapped.')
+opts.add_argumented( ['-b', '--bubble', '--balloon'], arg = 'STYLE', help = 'Select a balloon style.')
+opts.add_argumented( ['-f', '--file', '--pony'], arg = 'PONY', help = 'Select a pony.\nEither a file name or a pony name.')
+opts.add_argumented( ['-F', '++file', '++pony'], arg = 'PONY', help = 'Select a non-MLP:FiM pony.')
+opts.add_argumented( ['-q', '--quote'], arg = 'PONY', help = 'Select a pony which will quote herself.')
+opts.add_variadic( ['--f', '--files', '--ponies'], arg = 'PONY')
+opts.add_variadic( ['--F', '++files', '++ponies'], arg = 'PONY')
+opts.add_variadic( ['--q', '--quotes'], arg = 'PONY')
+
+'''
+Whether at least one unrecognised option was used
+'''
+unrecognised = not opts.parse()
+
+
+
+'''
+Start the program from ponysay.__init__ if this is the executed file
+'''
+if __name__ == '__main__':
+ Ponysay(opts)
diff --git a/ponysay.pdf b/ponysay.pdf
deleted file mode 100644
index 01979df..0000000
--- a/ponysay.pdf
+++ /dev/null
Binary files differ
diff --git a/ponysay.py b/ponysay.py
index 5f77ed0..b74ed64 100755
--- a/ponysay.py
+++ b/ponysay.py
@@ -1,2458 +1,98 @@
#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-'''
-ponysay.py - Ponysay, cowsay reimplementation for ponies
-Copyright (C) 2012 Erkin Batu Altunbaş et al.
-
-This program is free software. It comes without any warranty, to
-the extent permitted by applicable law. You can redistribute it
-and/or modify it under the terms of the Do What The Fuck You Want
-To Public License, Version 2, as published by Sam Hocevar. See
-http://sam.zoy.org/wtfpl/COPYING for more details.
-
-
-Authors of ponysay.py:
-
- Erkin Batu Altunbaş: Project leader, helped write the first implementation
- Mattias "maandree" Andrée: Major contributor of both implementions
- Elis "etu" Axelsson: Major contributor of current implemention and patcher of the first implementation
- Sven-Hendrik "svenstaro" Haase: Major contributor of the first implementation
- Jan Alexander "heftig" Steffens: Major contributor of the first implementation
- Kyah "L-four" Rindlisbacher: Patched the first implementation
-'''
-
-import os
-import shutil
-import sys
-import random
-from subprocess import Popen, PIPE
-
-
-
-'''
-The version of ponysay
-'''
-VERSION = 'dev' # this line should not be edited, it is fixed by the build system
-
-
-
-'''
-Hack to enforce UTF-8 in output (in the future, if you see anypony not using utf-8 in
-programs by default, report them to Princess Celestia so she can banish them to the moon)
-
-@param text:str The text to print (empty string is default)
-@param end:str The appendix to the text to print (line breaking is default)
-'''
-def print(text = '', end = '\n'):
- sys.stdout.buffer.write((str(text) + end).encode('utf-8'))
-
-'''
-stderr equivalent to print()
-
-@param text:str The text to print (empty string is default)
-@param end:str The appendix to the text to print (line breaking is default)
-'''
-def printerr(text = '', end = '\n'):
- sys.stderr.buffer.write((str(text) + end).encode('utf-8'))
-
-fd3 = None
-'''
-/proc/self/fd/3 equivalent to print()
-
-@param text:str The text to print (empty string is default)
-@param end:str The appendix to the text to print (line breaking is default)
-'''
-def printinfo(text = '', end = '\n'):
- global fd3
- if os.path.exists('/proc/self/fd/3'):
- if fd3 is None:
- fd3 = os.fdopen(3, 'w')
- fd3.write(str(text) + end)
-
-
-'''
-Checks whether a text ends with a specific text, but has more
-
-@param text The text to test
-@param ending The desired end of the text
-@return :bool The result of the test
-'''
-def endswith(text, ending):
- return text.endswith(ending) and not (text == ending)
-
-
-
-'''
-This is the mane class of ponysay
-'''
-class Ponysay():
- '''
- Starts the part of the program the arguments indicate
-
- @param args:ArgParser Parsed command line arguments
- '''
- def __init__(self, args):
- if (args.argcount == 0) and not pipelinein:
- args.help()
- exit(254)
- return
-
- ## Modifyable global variables
- global linuxvt
- global usekms
- global mode
- global ponydirs
- global extraponydirs
-
- ## Emulate termial capabilities
- if args.opts['-X'] is not None: (linuxvt, usekms) = (False, False)
- elif args.opts['-V'] is not None: (linuxvt, usekms) = (True, False)
- elif args.opts['-K'] is not None: (linuxvt, usekms) = (True, True)
- ponydirs = vtponydirs if linuxvt and not usekms else xponydirs
- extraponydirs = extravtponydirs if linuxvt and not usekms else extraxponydirs
-
- ## Variadic variants of -f, -F and -q
- if args.opts['--f'] is not None:
- if args.opts['-f'] is not None: args.opts['-f'] += args.opts['--f']
- else: args.opts['-f'] = args.opts['--f']
- if args.opts['--F'] is not None:
- if args.opts['-F'] is not None: args.opts['-F'] += args.opts['--F']
- else: args.opts['-F'] = args.opts['--F']
- if args.opts['--q'] is not None:
- if args.opts['-q'] is not None: args.opts['-q'] += args.opts['--q']
- else: args.opts['-q'] = args.opts['--q']
-
- ## Run modes
- if args.opts['-h'] is not None: args.help()
- elif args.opts['--quoters'] is not None: self.quoters()
- elif args.opts['--onelist'] is not None: self.onelist()
- elif args.opts['-v'] is not None: self.version()
- elif args.opts['-l'] is not None: self.list()
- elif args.opts['-L'] is not None: self.linklist()
- elif args.opts['-B'] is not None: self.balloonlist()
- elif args.opts['++onelist'] is not None: self.__extraponies(); self.onelist()
- elif args.opts['+l'] is not None: self.__extraponies(); self.list()
- elif args.opts['+L'] is not None: self.__extraponies(); self.linklist()
- elif args.opts['-A'] is not None: self.list(); self.__extraponies(); self.list()
- elif args.opts['+A'] is not None: self.linklist(); self.__extraponies(); self.linklist()
- else:
- ## Colouring features
- if args.opts['--colour-pony'] is not None:
- mode += '\033[' + ';'.join(args.opts['--colour-pony']) + 'm'
- else:
- mode += '\033[0m'
- if args.opts['+c'] is not None:
- if args.opts['--colour-msg'] is None: args.opts['--colour-msg'] = args.opts['+c']
- if args.opts['--colour-link'] is None: args.opts['--colour-link'] = args.opts['+c']
- if args.opts['--colour-bubble'] is None: args.opts['--colour-bubble'] = args.opts['+c']
-
- ## Other extra features
- self.__extraponies(args)
- self.__bestpony(args)
- self.__ucsremap(args)
- if args.opts['-o'] is not None:
- mode += '$/= $$\\= $'
- args.message = ''
-
- ## The stuff
- if args.opts['-q'] is not None:
- warn = (args.opts['-f'] is not None) or (args.opts['-F'] is not None)
- if (len(args.opts['-q']) == 1) and ((args.opts['-q'][0] == '-f') or (args.opts['-q'][0] == '-F')):
- warn = True
- if args.opts['-q'][0] == '-f':
- args.opts['-q'] = args.files
- if args.opts['-f'] is not None:
- args.opts['-q'] += args.opts['-f']
- self.quote(args)
- if warn:
- printerr('-q cannot be used at the same time as -f or -F.')
- elif not unrecognised:
- self.print_pony(args)
- else:
- args.help()
- exit(255)
- return
-
-
- ##############################################
- ## Methods that run before the mane methods ##
- ##############################################
-
- '''
- Use extra ponies
-
- @param args:ArgParser Parsed command line arguments, may be `None`
- '''
- def __extraponies(self, args = None):
- ## If extraponies are used, change ponydir to extraponydir
- if args is None:
- ponydirs[:] = extraponydirs
- elif args.opts['-F'] is not None:
- args.opts['-f'] = args.opts['-F']
- ponydirs[:] = extraponydirs
-
-
- '''
- Use best.pony if nothing else is set
-
- @param args:ArgParser Parsed command line arguments
- '''
- def __bestpony(self, args):
- ## Set best.pony as the pony to display if none is selected
- if (args.opts['-f'] is None) or (args.opts['-q'] is None) or (len(args.opts['-q']) == 0):
- for ponydir in ponydirs:
- if os.path.isfile(ponydir + 'best.pony') or os.path.islink(ponydir + 'best.pony'):
- pony = os.path.realpath(ponydir + 'best.pony') # Canonical path
- args.opts['-f' if args.opts['-q'] is None else '-q'] = [pony]
- break
-
-
- '''
- Apply pony name remapping to args according to UCS settings
-
- @param args:ArgParser Parsed command line arguments
- '''
- def __ucsremap(self, args):
- ## Read UCS configurations
- env_ucs = os.environ['PONYSAY_UCS_ME'] if 'PONYSAY_UCS_ME' in os.environ else ''
- ucs_conf = 0
- if env_ucs in ('yes', 'y', '1'): ucs_conf = 1
- elif env_ucs in ('harder', 'h', '2'): ucs_conf = 2
-
- ## Stop UCS is not used
- if ucs_conf == 0:
- return
-
- ## Read all lines in all UCS → ASCII map files
- maplines = []
- for ucsmap in ucsmaps:
- if os.path.isfile(ucsmap):
- with open(ucsmap, 'rb') as mapfile:
- maplines += [line.replace('\n', '') for line in mapfile.read().decode('utf8', 'replace').split('\n')]
-
- ## Create UCS → ASCII mapping from read lines
- map = {}
- stripset = ' \t' # must be string, wtf! and way doesn't python's doc say so
- for line in maplines:
- if (len(line) > 0) and not (line[0] == '#'):
- s = line.index('→')
- ucs = line[:s] .strip(stripset)
- ascii = line[s + 1:].strip(stripset)
- map[ucs] = ascii
-
- ## Apply UCS → ASCII mapping to -f and -q arguments
- for flag in ('-f', '-q'):
- if args.opts[flag] is not None:
- for i in range(0, len(args.opts[flag])):
- if args.opts[flag][i] in map:
- args.opts[flag][i] = map[args.opts[flag][i]]
-
-
- #######################
- ## Auxiliary methods ##
- #######################
-
- '''
- Apply UCS:ise pony names according to UCS settings
-
- @param ponies:list<str> List of all ponies (of interrest)
- @param links:map<str> Map to fill with simulated symlink ponies, may be `None`
- '''
- def __ucsise(self, ponies, links = None):
- ## Read UCS configurations
- env_ucs = os.environ['PONYSAY_UCS_ME'] if 'PONYSAY_UCS_ME' in os.environ else ''
- ucs_conf = 0
- if env_ucs in ('yes', 'y', '1'): ucs_conf = 1
- elif env_ucs in ('harder', 'h', '2'): ucs_conf = 2
-
- ## Stop UCS is not used
- if ucs_conf == 0:
- return
-
- ## Read all lines in all UCS → ASCII map files
- maplines = []
- for ucsmap in ucsmaps:
- if os.path.isfile(ucsmap):
- with open(ucsmap, 'rb') as mapfile:
- maplines += [line.replace('\n', '') for line in mapfile.read().decode('utf8', 'replace').split('\n')]
-
- ## Create UCS → ASCII mapping from read lines
- map = {}
- stripset = ' \t' # must be string, wtf! and way doesn't python's doc say so
- for line in maplines:
- if not line.startswith('#'):
- s = line.index('→')
- ucs = line[:s] .strip(stripset)
- ascii = line[s + 1:].strip(stripset)
- map[ascii] = ucs
-
- ## Apply UCS → ACII mapping to ponies, by alias if weak settings
- if ucs_conf == 1:
- for pony in ponies:
- if pony in map:
- ponies.append(map[pony])
- if links is not None:
- links[map[pony]] = pony
- else:
- for j in range(0, len(ponies)):
- if ponies[j] in map:
- ponies[j] = map[ponies[j]]
-
-
- '''
- Returns one file with full path, names is filter for names, also accepts filepaths
-
- @param names:list<str> Ponies to choose from, may be `None`
- @param alt:bool For method internal use...
- @return :str The file name of a pony
- '''
- def __getponypath(self, names = None, alt = False):
- ponies = {}
-
- ## List all pony files, without the .pony ending
- for ponydir in ponydirs:
- for ponyfile in os.listdir(ponydir):
- if endswith(ponyfile, ".pony"):
- pony = ponyfile[:-5]
- if pony not in ponies:
- ponies[pony] = ponydir + ponyfile
-
- ## Support for explicit pony file names
- if names is not None:
- for name in names:
- if os.path.exists(name):
- ponies[name] = name
-
- ## If there is not select ponies, choose all of them
- if (names is None) or (len(names) == 0):
- names = list(ponies.keys())
-
- ## Select a random pony of the choosen onles
- pony = names[random.randrange(0, len(names))]
- if pony not in ponies:
- if not alt:
- autocorrect = SpelloCorrecter(ponydirs, '.pony')
- (alternatives, dist) = autocorrect.correct(pony)
- if (len(alternatives) > 0) and (dist <= 5): # TODO the limit `dist` should be configureable
- return self.__getponypath(alternatives, True)
- sys.stderr.write('I have never heard of anypony named %s\n' % (pony));
- exit(1)
- else:
- return ponies[pony]
-
-
- '''
- Returns a set with all ponies that have quotes and are displayable
-
- @return :set<str> All ponies that have quotes and are displayable
- '''
- def __quoters(self):
- ## List all unique quote files
- quotes = []
- quoteshash = set()
- _quotes = []
- for quotedir in quotedirs:
- _quotes += [item[:item.index('.')] for item in os.listdir(quotedir)]
- for quote in _quotes:
- if not quote == '':
- if not quote in quoteshash:
- quoteshash.add(quote)
- quotes.append(quote)
-
- ## Create a set of all ponyes that have quotes
- ponies = set()
- for ponydir in ponydirs:
- for pony in os.listdir(ponydir):
- if not pony[0] == '.':
- p = pony[:-5] # remove .pony
- for quote in quotes:
- if ('+' + p + '+') in ('+' + quote + '+'):
- if not p in ponies:
- ponies.add(p)
-
- return ponies
-
-
- '''
- Returns a list with all (pony, quote file) pairs
-
- @return (pony, quote):(str, str) All ponies–quote file-pairs
- '''
- def __quotes(self):
- ## Get all ponyquote files
- quotes = []
- for quotedir in quotedirs:
- quotes += [quotedir + item for item in os.listdir(quotedir)]
-
- ## Create list of all pony–quote file-pairs
- rc = []
- for ponydir in ponydirs:
- for pony in os.listdir(ponydir):
- if not pony[0] == '.':
- p = pony[:-5] # remove .pony
- for quote in quotes:
- q = quote[quote.rindex('/') + 1:]
- q = q[:q.rindex('.')]
- if ('+' + p + '+') in ('+' + q + '+'):
- rc.append((p, quote))
-
- return rc
-
-
- '''
- Gets the size of the terminal in (rows, columns)
-
- @return (rows, columns):(int, int) The number or lines and the number of columns in the terminal's display area
- '''
- def __gettermsize(self):
- ## Call `stty` to determine the size of the terminal, this way is better then using python's ncurses
- for channel in (sys.stderr, sys.stdout, sys.stdin):
- termsize = Popen(['stty', 'size'], stdout=PIPE, stdin=channel, stderr=PIPE).communicate()[0]
- if len(termsize) > 0:
- termsize = termsize.decode('utf8', 'replace')[:-1].split(' ') # [:-1] removes a \n
- termsize = [int(item) for item in termsize]
- return termsize
- return (24, 80) # fall back to minimal sane size
-
-
-
- #####################
- ## Listing methods ##
- #####################
-
- '''
- Columnise a list and prints it
-
- @param ponies:list<(str, str)> All items to list, each item should have to elements: unformated name, formated name
- '''
- def __columnise(self, ponies):
- ## Get terminal width, and a 2 which is the space between columns
- termwidth = self.__gettermsize()[1] + 2
- ## Sort the ponies, and get the cells' widths, and the largest width + 2
- ponies.sort(key = lambda pony : pony[0])
- widths = [UCS.dispLen(pony[0]) for pony in ponies]
- width = max(widths) + 2 # longest pony file name + space between columns
-
- ## Calculate the number of rows and columns, can create a list of empty columns
- cols = termwidth // width # do not believe electricians, this means ⌊termwidth / width⌋
- rows = (len(ponies) + cols - 1) // cols
- columns = []
- for c in range(0, cols): columns.append([])
-
- ## Fill the columns with cells of ponies
- (y, x) = (0, 0)
- for j in range(0, len(ponies)):
- cell = ponies[j][1] + ' ' * (width - widths[j]);
- columns[x].append(cell)
- y += 1
- if y == rows:
- x += 1
- y = 0
-
- ## Make the columnisation nicer by letting the last row be partially empty rather than the last column
- diff = rows * cols - len(ponies)
- if diff > 2:
- c = cols - 1
- diff -= 1
- while diff > 0:
- columns[c] = columns[c - 1][-diff:] + columns[c]
- c -= 1
- columns[c] = columns[c][:-diff]
- diff -= 1
-
- ## Create rows from columns
- lines = []
- for r in range(0, rows):
- lines.append([])
- for c in range(0, cols):
- if r < len(columns[c]):
- line = lines[r].append(columns[c][r])
-
- ## Print the matrix, with one extra blank row
- print('\n'.join([''.join(line)[:-2] for line in lines]))
- print()
-
-
- '''
- Lists the available ponies
- '''
- def list(self):
- ## Get all quoters
- quoters = self.__quoters()
-
- for ponydir in ponydirs: # Loop ponydirs
- ## Get all ponies in the directory
- _ponies = os.listdir(ponydir)
-
- ## Remove .pony from all files and skip those that does not have .pony
- ponies = []
- for pony in _ponies:
- if endswith(pony, '.pony'):
- ponies.append(pony[:-5])
-
- ## UCS:ise pony names, they are already sorted
- self.__ucsise(ponies)
-
- ## If ther directory is not empty print its name and all ponies, columnised
- if len(ponies) == 0:
- continue
- print('\033[1mponies located in ' + ponydir + '\033[21m')
- self.__columnise([(pony, '\033[1m' + pony + '\033[21m' if pony in quoters else pony) for pony in ponies])
-
-
- '''
- Lists the available ponies with alternatives inside brackets
- '''
- def linklist(self):
- ## Get the size of the terminal and all ponies with quotes
- termsize = self.__gettermsize()
- quoters = self.__quoters()
-
- for ponydir in ponydirs: # Loop ponydirs
- ## Get all pony files in the directory
- _ponies = os.listdir(ponydir)
-
- ## Remove .pony from all files and skip those that does not have .pony
- ponies = []
- for pony in _ponies:
- if endswith(pony, '.pony'):
- ponies.append(pony[:-5])
-
- ## If there are no ponies in the directory skip to next directory, otherwise, print the directories name
- if len(ponies) == 0:
- continue
- print('\033[1mponies located in ' + ponydir + '\033[21m')
-
- ## UCS:ise pony names
- pseudolinkmap = {}
- self.__ucsise(ponies, pseudolinkmap)
-
- ## Create target–link-pair, with `None` as link if the file is not a symlink or in `pseudolinkmap`
- pairs = []
- for pony in ponies:
- if pony in pseudolinkmap:
- pairs.append((pony, pseudolinkmap[pony] + '.pony'));
- else:
- pairs.append((pony, os.path.realpath(ponydir + pony + '.pony') if os.path.islink(ponydir + pony + '.pony') else None))
-
- ## Create map from source pony to alias ponies for each pony
- ponymap = {}
- for pair in pairs:
- if (pair[1] is None) or (pair[1] == ''):
- if pair[0] not in ponymap:
- ponymap[pair[0]] = []
- else:
- target = pair[1][:-5]
- if '/' in target:
- target = target[target.rindex('/') + 1:]
- if target in ponymap:
- ponymap[target].append(pair[0])
- else:
- ponymap[target] = [pair[0]]
-
- ## Create list of source ponies concatenated with alias ponies in brackets
- ponies = {}
- for pony in ponymap:
- w = UCS.dispLen(pony)
- item = '\033[1m' + pony + '\033[21m' if (pony in quoters) else pony
- syms = ponymap[pony]
- syms.sort()
- if len(syms) > 0:
- w += 2 + len(syms)
- item += ' ('
- first = True
- for sym in syms:
- w += UCS.dispLen(sym)
- if first: first = False
- else: item += ' '
- item += '\033[1m' + sym + '\033[21m' if (sym in quoters) else sym
- item += ')'
- ponies[(item.replace('\033[1m', '').replace('\033[21m', ''), item)] = w
-
- ## Print the ponies, columnised
- self.__columnise(list(ponies))
-
-
- '''
- Lists with all ponies that have quotes and are displayable, on one column without anything bold or otherwise formated
- '''
- def quoters(self):
- ## Get all quoters
- ponies = self.__quoters()
-
- ## UCS:ise and sort
- self.__ucsise(ponies)
- ponies.sort()
-
- ## Print each one on a seperate line, but skip duplicates
- last = ''
- for pony in ponies:
- if not pony == last:
- last = pony
- print(pony)
-
-
- '''
- Lists the available ponies on one column without anything bold or otherwise formated
- '''
- def onelist(self):
- ## Get all pony files
- _ponies = []
- for ponydir in ponydirs: # Loop ponydirs
- _ponies += os.listdir(ponydir)
-
- ## Remove .pony from all files and skip those that does not have .pony
- ponies = []
- for pony in _ponies:
- if endswith(pony, '.pony'):
- ponies.append(pony[:-5])
-
- ## UCS:ise and sort
- self.__ucsise(ponies)
- ponies.sort()
-
- ## Print each one on a seperate line, but skip duplicates
- last = ''
- for pony in ponies:
- if not pony == last:
- last = pony
- print(pony)
-
-
- #####################
- ## Balloon methods ##
- #####################
-
- '''
- Prints a list of all balloons
- '''
- def balloonlist(self):
- ## Get the size of the terminal
- termsize = self.__gettermsize()
-
- ## Get all balloons
- balloonset = set()
- for balloondir in balloondirs:
- for balloon in os.listdir(balloondir):
- ## Use .think if running ponythink, otherwise .say
- if isthink and endswith(balloon, '.think'):
- balloon = balloon[:-6]
- elif (not isthink) and endswith(balloon, '.say'):
- balloon = balloon[:-4]
- else:
- continue
-
- ## Add the balloon if there is none with the same name
- if balloon not in balloonset:
- balloonset.add(balloon)
-
- ## Print all balloos, columnised
- self.__columnise([(balloon, balloon) for balloon in list(balloonset)])
-
-
- '''
- Returns one file with full path, names is filter for style names, also accepts filepaths
-
- @param names:list<str> Balloons to choose from, may be `None`
- @param alt:bool For method internal use
- @param :str The file name of the balloon, will be `None` iff `names` is `None`
- '''
- def __getballoonpath(self, names, alt = False):
- ## Stop if their is no choosen balloon
- if names is None:
- return None
-
- ## Get all balloons
- balloons = {}
- for balloondir in balloondirs:
- for balloon in os.listdir(balloondir):
- balloonfile = balloon
- ## Use .think if running ponythink, otherwise .say
- if isthink and endswith(balloon, '.think'):
- balloon = balloon[:-6]
- elif (not isthink) and endswith(balloon, '.say'):
- balloon = balloon[:-4]
- else:
- continue
-
- ## Add the balloon if there is none with the same name
- if balloon not in balloons:
- balloons[balloon] = balloondir + balloonfile
-
- ## Support for explicit balloon file names
- for name in names:
- if os.path.exists(name):
- balloons[name] = name
-
- ## Select a random balloon of the choosen ones
- balloon = names[random.randrange(0, len(names))]
- if balloon not in balloons:
- if not alt:
- autocorrect = SpelloCorrecter(balloondirs, '.think' if isthink else '.say')
- (alternatives, dist) = autocorrect.correct(balloon)
- if (len(alternatives) > 0) and (dist <= 5): # TODO the limit `dist` should be configureable
- return self.__getballoonpath(alternatives, True)
- sys.stderr.write('That balloon style %s does not exist\n' % (balloon));
- exit(1)
- else:
- return balloons[balloon]
-
-
- '''
- Creates the balloon style object
-
- @param balloonfile:str The file with the balloon style, may be `None`
- @return :Balloon Instance describing the balloon's style
- '''
- def __getballoon(self, balloonfile):
- ## Use default balloon if none is specified
- if balloonfile is None:
- if isthink:
- return Balloon('o', 'o', '( ', ' )', [' _'], ['_'], ['_'], ['_'], ['_ '], ' )', ' )', ' )', ['- '], ['-'], ['-'], ['-'], [' -'], '( ', '( ', '( ')
- return Balloon('\\', '/', '< ', ' >', [' _'], ['_'], ['_'], ['_'], ['_ '], ' \\', ' |', ' /', ['- '], ['-'], ['-'], ['-'], [' -'], '\\ ', '| ', '/ ')
-
- ## Initialise map for balloon parts
- map = {}
- for elem in ('\\', '/', 'ww', 'ee', 'nw', 'nnw', 'n', 'nne', 'ne', 'nee', 'e', 'see', 'se', 'sse', 's', 'ssw', 'sw', 'sww', 'w', 'nww'):
- map[elem] = []
-
- ## Read all lines in the balloon file
- with open(balloonfile, 'rb') as balloonstream:
- data = balloonstream.read().decode('utf8', 'replace')
- data = [line.replace('\n', '') for line in data.split('\n')]
-
- ## Parse the balloon file, and fill the map
- last = None
- for line in data:
- if len(line) > 0:
- if line[0] == ':':
- map[last].append(line[1:])
- else:
- last = line[:line.index(':')]
- value = line[len(last) + 1:]
- map[last].append(value)
-
- ## Return the balloon
- return Balloon(map['\\'][0], map['/'][0], map['ww'][0], map['ee'][0], map['nw'], map['nnw'], map['n'],
- map['nne'], map['ne'], map['nee'][0], map['e'][0], map['see'][0], map['se'], map['sse'],
- map['s'], map['ssw'], map['sw'], map['sww'][0], map['w'][0], map['nww'][0])
-
-
-
- ########################
- ## Displaying methods ##
- ########################
-
- '''
- Prints the name of the program and the version of the program
- '''
- def version(self):
- ## Prints the "ponysay $VERSION", if this is modified, ./dev/dist.sh must be modified accordingly
- print('%s %s' % ('ponysay', VERSION))
-
-
- '''
- Print the pony with a speech or though bubble. message, pony and wrap from args are used.
-
- @param args:ArgParser Parsed command line arguments
- '''
- def print_pony(self, args):
- ## Get message and remove tailing whitespace from stdin (but not for each line)
- if args.message == None:
- msg = ''.join(sys.stdin.readlines()).rstrip()
- else:
- msg = args.message
- if args.opts['--colour-msg'] is not None:
- msg = '\033[' + ';'.join(args.opts['--colour-msg']) + 'm' + msg
-
- ## This algorithm should give some result as cowsay's (according to tests)
- if args.opts['-c'] is not None:
- buf = ''
- last = ' '
- CHARS = '\t \n'
- for c in msg:
- if (c in CHARS) and (last in CHARS):
- if last == '\n':
- buf += last
- last = c
- else:
- buf += c
- last = c
- msg = buf.strip(CHARS)
- buf = ''
- for c in msg:
- if (c != '\n') or (last != '\n'):
- buf += c
- last = c
- msg = buf.replace('\n', '\n\n')
-
- ## Get the pony
- pony = self.__getponypath(args.opts['-f'])
- printinfo('pony file: ' + pony)
-
- ## Use PNG file as pony file
- if endswith(pony.lower(), '.png'):
- pony = '\'' + pony.replace('\'', '\'\\\'\'') + '\''
- pngcmd = ('img2ponysay -p -- ' if linuxvt else 'img2ponysay -- ') + pony
- pngpipe = os.pipe()
- Popen(pngcmd, stdout=os.fdopen(pngpipe[1], 'w'), shell=True).wait()
- pony = '/proc/' + str(os.getpid()) + '/fd/' + str(pngpipe[0])
-
- ## If KMS is utilies, select a KMS pony file and create it if necessary
- pony = self.__kms(pony)
-
- ## If in Linux VT clean the terminal (See info/pdf-manual [Printing in TTY with KMS])
- if linuxvt:
- print('\033[H\033[2J', end='')
-
- ## Get width truncation and wrapping
- env_width = os.environ['PONYSAY_FULL_WIDTH'] if 'PONYSAY_FULL_WIDTH' in os.environ else None
- if env_width is None: env_width = ''
- widthtruncation = self.__gettermsize()[1] if env_width not in ('yes', 'y', '1') else None
- messagewrap = 40
- if (args.opts['-W'] is not None) and (len(args.opts['-W'][0]) > 0):
- messagewrap = args.opts['-W'][0]
- if messagewrap[0] in 'nmsNMS': # m is left to n on QWERTY and s is left to n on Dvorak
- messagewrap = None
- elif messagewrap[0] in 'iouIOU': # o is left to i on QWERTY and u is right to i on Dvorak
- messagewrap = self.__gettermsize()[1]
- else:
- messagewrap = int(args.opts['-W'][0])
-
- ## Get balloon object
- balloonfile = self.__getballoonpath(args.opts['-b'])
- printinfo('balloon style file: ' + str(balloonfile))
- balloon = self.__getballoon(balloonfile) if args.opts['-o'] is None else None
-
- ## Get hyphen style
- hyphencolour = ''
- if args.opts['--colour-wrap'] is not None:
- hyphencolour = '\033[' + ';'.join(args.opts['--colour-wrap']) + 'm'
- hyphen = '\033[31m' + hyphencolour + '-' # TODO make configurable
-
- ## Link and balloon colouring
- linkcolour = ''
- if args.opts['--colour-link'] is not None:
- linkcolour = '\033[' + ';'.join(args.opts['--colour-link']) + 'm'
- ballooncolour = ''
- if args.opts['--colour-bubble'] is not None:
- ballooncolour = '\033[' + ';'.join(args.opts['--colour-bubble']) + 'm'
-
-
- ## Run cowsay replacement
- backend = Backend(message = msg, ponyfile = pony, wrapcolumn = messagewrap, width = widthtruncation,
- balloon = balloon, hyphen = hyphen, linkcolour = linkcolour, ballooncolour = ballooncolour)
- backend.parse()
- output = backend.output
- if output.endswith('\n'):
- output = output[:-1]
-
-
- ## Load height trunction settings
- env_bottom = os.environ['PONYSAY_BOTTOM'] if 'PONYSAY_BOTTOM' in os.environ else None
- if env_bottom is None: env_bottom = ''
-
- env_height = os.environ['PONYSAY_TRUNCATE_HEIGHT'] if 'PONYSAY_TRUNCATE_HEIGHT' in os.environ else None
- if env_height is None: env_height = ''
-
- env_lines = os.environ['PONYSAY_SHELL_LINES'] if 'PONYSAY_SHELL_LINES' in os.environ else None
- if (env_lines is None) or (env_lines == ''): env_lines = '2'
-
- ## Print the output, truncated on height is so set
- lines = self.__gettermsize()[0] - int(env_lines)
- if linuxvt or (env_height is ('yes', 'y', '1')):
- if env_bottom is ('yes', 'y', '1'):
- for line in output.split('\n')[: -lines]:
- print(line)
- else:
- for line in output.split('\n')[: lines]:
- print(line)
- else:
- print(output)
-
-
- '''
- Print the pony with a speech or though bubble and a self quote
-
- @param args:ArgParser Parsed command line arguments
- '''
- def quote(self, args):
- ## Get all quotes, and if any pony is choosen just keep them
- pairs = self.__quotes()
- if len(args.opts['-q']) > 0:
- ponyset = {}
- for pony in args.opts['-q']:
- if endswith(pony, '.pony'):
- ponyname = pony[:-5]
- if '/' in ponyname:
- ponyname = ponyname[ponyname.rindex('/') + 1:]
- ponyset[ponyname] = pony
- else:
- ponyset[pony] = pony
- alts = []
- for pair in pairs:
- if pair[0] in ponyset:
- alts.append((ponyset[pair[0]], pair[1]))
- pairs = alts
-
- ## Select a random pony–quote-pair, load it and print it
- if not len(pairs) == 0:
- pair = pairs[random.randrange(0, len(pairs))]
- printinfo('quote file: ' + pair[1])
- with open(pair[1], 'rb') as qfile:
- args.message = qfile.read().decode('utf8', 'replace').strip()
- args.opts['-f'] = [pair[0]]
- elif len(args.opts['-q']) == 0:
- sys.stderr.write('Princess Celestia! All the ponies are mute!\n')
- exit(1)
- else:
- args.opts['-f'] = [args.opts['-q'][random.randrange(0, len(args.opts['-q']))]]
- args.message = 'Zecora! Help me, I am mute!'
-
- self.print_pony(args)
-
-
- '''
- Identifies whether KMS support is utilised
- '''
- @staticmethod
- def isUsingKMS():
- ## KMS is not utilised if Linux VT is not used
- if not linuxvt:
- return False
-
- ## Read the PONYSAY_KMS_PALETTE environment variable
- env_kms = os.environ['PONYSAY_KMS_PALETTE'] if 'PONYSAY_KMS_PALETTE' in os.environ else None
- if env_kms is None: env_kms = ''
-
- ## Read the PONYSAY_KMS_PALETTE_CMD environment variable, and run it
- env_kms_cmd = os.environ['PONYSAY_KMS_PALETTE_CMD'] if 'PONYSAY_KMS_PALETTE_CMD' in os.environ else None
- if (env_kms_cmd is not None) and (not env_kms_cmd == ''):
- env_kms = Popen(shlex.split(env_kms_cmd), stdout=PIPE, stdin=sys.stderr).communicate()[0].decode('utf8', 'replace')
- if env_kms[-1] == '\n':
- env_kms = env_kms[:-1]
-
- ## If the palette string is empty KMS is not utilised
- return env_kms != ''
-
-
- '''
- Returns the file name of the input pony converted to a KMS pony, or if KMS is not used, the input pony itself
-
- @param pony:str Choosen pony file
- @return :str Pony file to display
- '''
- def __kms(self, pony):
- ## If not in Linux VT, return the pony as is
- if not linuxvt:
- return pony
-
- ## KMS support version constant
- KMS_VERSION = '1'
-
- ## Read the PONYSAY_KMS_PALETTE environment variable
- env_kms = os.environ['PONYSAY_KMS_PALETTE'] if 'PONYSAY_KMS_PALETTE' in os.environ else None
- if env_kms is None: env_kms = ''
-
- ## Read the PONYSAY_KMS_PALETTE_CMD environment variable, and run it
- env_kms_cmd = os.environ['PONYSAY_KMS_PALETTE_CMD'] if 'PONYSAY_KMS_PALETTE_CMD' in os.environ else None
- if (env_kms_cmd is not None) and (not env_kms_cmd == ''):
- env_kms = Popen(shlex.split(env_kms_cmd), stdout=PIPE, stdin=sys.stderr).communicate()[0].decode('utf8', 'replace')
- if env_kms[-1] == '\n':
- env_kms = env_kms[:-1]
-
- ## If not using KMS, return the pony as is
- if env_kms == '':
- return pony
-
- ## Store palette string and a clong with just the essentials
- palette = env_kms
- palettefile = env_kms.replace('\033]P', '')
-
- ## Get and in necessary make cache directory
- cachedir = '/var/cache/ponysay'
- shared = True
- if not os.path.isdir(cachedir):
- cachedir = HOME + '/.cache/ponysay'
- shared = False
- if not os.path.isdir(cachedir):
- os.makedirs(cachedir)
- _cachedir = '\'' + cachedir.replace('\'', '\'\\\'\'') + '\''
-
- ## KMS support version control, clean everything if not matching
- newversion = False
- if not os.path.isfile(cachedir + '/.version'):
- newversion = True
- else:
- with open(cachedir + '/.version', 'rb') as cachev:
- if cachev.read().decode('utf8', 'replace').replace('\n', '') != KMS_VERSION:
- newversion = True
- if newversion:
- for cached in os.listdir(cachedir):
- cached = cachedir + '/' + cached
- if os.path.isdir(cached) and not os.path.islink(cached):
- shutil.rmtree(cached, False)
- else:
- os.remove(cached)
- with open(cachedir + '/.version', 'w+') as cachev:
- cachev.write(KMS_VERSION)
- if shared:
- Popen('chmod 666 -- ' + _cachedir + '/.version', shell=True).wait()
-
- ## Get kmspony directory and kmspony file
- kmsponies = cachedir + '/kmsponies/' + palettefile
- kmspony = (kmsponies + pony).replace('//', '/')
-
- ## If the kmspony is missing, create it
- if not os.path.isfile(kmspony):
- ## Protokmsponies are uncolourful ttyponies
- protokmsponies = cachedir + '/protokmsponies/'
- protokmspony = (protokmsponies + pony).replace('//', '/')
- protokmsponydir = protokmspony[:protokmspony.rindex('/')]
- kmsponydir = kmspony[: kmspony.rindex('/')]
-
- ## Change file names to be shell friendly
- _protokmspony = '\'' + protokmspony.replace('\'', '\'\\\'\'') + '\''
- _kmspony = '\'' + kmspony.replace('\'', '\'\\\'\'') + '\''
- _pony = '\'' + pony.replace('\'', '\'\\\'\'') + '\''
-
- ## Create protokmspony is missing
- if not os.path.isfile(protokmspony):
- if not os.path.isdir(protokmsponydir):
- os.makedirs(protokmsponydir)
- if shared:
- Popen('chmod -R 6777 -- ' + _cachedir, shell=True).wait()
- if not os.system('ponysay2ttyponysay < ' + _pony + ' > ' + _protokmspony) == 0:
- sys.stderr.write('Unable to run ponysay2ttyponysay successfully, you need util-say for KMS support\n')
- exit(1)
- if shared:
- Popen('chmod 666 -- ' + _protokmspony, shell=True).wait()
-
- ## Create kmspony
- if not os.path.isdir(kmsponydir):
- os.makedirs(kmsponydir)
- if shared:
- Popen('chmod -R 6777 -- ' + _cachedir, shell=True).wait()
- if not os.system('tty2colourfultty -p ' + palette + ' < ' + _protokmspony + ' > ' + _kmspony) == 0:
- sys.stderr.write('Unable to run tty2colourfultty successfully, you need util-say for KMS support\n')
- exit(1)
- if shared:
- Popen('chmod 666 -- ' + _kmspony, shell=True).wait()
-
- return kmspony
-
-
-
-'''
-Option takes no arguments
-'''
-ARGUMENTLESS = 0
-
-'''
-Option takes one argument per instance
-'''
-ARGUMENTED = 1
-
-'''
-Option consumes all following arguments
-'''
-VARIADIC = 2
-
-'''
-Simple argument parser
-'''
-class ArgParser():
- '''
- Constructor.
- The short description is printed on same line as the program name
-
- @param program:str The name of the program
- @param description:str Short, single-line, description of the program
- @param usage:str Formated, multi-line, usage text
- @param longdescription:str Long, multi-line, description of the program, may be `None`
- '''
- def __init__(self, program, description, usage, longdescription = None):
- self.__program = program
- self.__description = description
- self.__usage = usage
- self.__longdescription = longdescription
- self.__arguments = []
- self.opts = {}
- self.optmap = {}
-
-
- '''
- Add option that takes no arguments
-
- @param alternatives:list<str> Option names
- @param help:str Short description, use `None` to hide the option
- '''
- def add_argumentless(self, alternatives, help = None):
- ARGUMENTLESS
- self.__arguments.append((ARGUMENTLESS, alternatives, None, help))
- stdalt = alternatives[0]
- self.opts[stdalt] = None
- for alt in alternatives:
- self.optmap[alt] = (stdalt, ARGUMENTLESS)
-
- '''
- Add option that takes one argument
-
- @param alternatives:list<str> Option names
- @param arg:str The name of the takes argument, one word
- @param help:str Short description, use `None` to hide the option
- '''
- def add_argumented(self, alternatives, arg, help = None):
- self.__arguments.append((ARGUMENTED, alternatives, arg, help))
- stdalt = alternatives[0]
- self.opts[stdalt] = None
- for alt in alternatives:
- self.optmap[alt] = (stdalt, ARGUMENTED)
-
- '''
- Add option that takes all following argument
-
- @param alternatives:list<str> Option names
- @param arg:str The name of the takes arguments, one word
- @param help:str Short description, use `None` to hide the option
- '''
- def add_variadic(self, alternatives, arg, help = None):
- self.__arguments.append((VARIADIC, alternatives, arg, help))
- stdalt = alternatives[0]
- self.opts[stdalt] = None
- for alt in alternatives:
- self.optmap[alt] = (stdalt, VARIADIC)
-
-
- '''
- Parse arguments
-
- @param args:list<str> The command line arguments, should include the execute file at index 0, `sys.argv` is default
- @return :bool Whether no unrecognised option is used
- '''
- def parse(self, argv = sys.argv):
- self.argcount = len(argv) - 1
- self.files = []
-
- argqueue = []
- optqueue = []
- deque = []
- for arg in argv[1:]:
- deque.append(arg)
-
- dashed = False
- tmpdashed = False
- get = 0
- dontget = 0
- self.rc = True
-
- def unrecognised(arg):
- sys.stderr.write('%s: warning: unrecognised option %s\n' % (self.__program, arg))
- self.rc = False
-
- while len(deque) != 0:
- arg = deque[0]
- deque = deque[1:]
- if (get > 0) and (dontget == 0):
- get -= 1
- argqueue.append(arg)
- elif tmpdashed:
- self.files.append(arg)
- tmpdashed = False
- elif dashed: self.files.append(arg)
- elif arg == '++': tmpdashed = True
- elif arg == '--': dashed = True
- elif (len(arg) > 1) and (arg[0] in ('-', '+')):
- if (len(arg) > 2) and (arg[:2] in ('--', '++')):
- if dontget > 0:
- dontget -= 1
- elif (arg in self.optmap) and (self.optmap[arg][1] == ARGUMENTLESS):
- optqueue.append(arg)
- argqueue.append(None)
- elif '=' in arg:
- arg_opt = arg[:arg.index('=')]
- if (arg_opt in self.optmap) and (self.optmap[arg_opt][1] >= ARGUMENTED):
- optqueue.append(arg_opt)
- argqueue.append(arg[arg.index('=') + 1:])
- if self.optmap[arg_opt][1] == VARIADIC:
- dashed = True
- else:
- unrecognised(arg)
- elif (arg in self.optmap) and (self.optmap[arg][1] == ARGUMENTED):
- optqueue.append(arg)
- get += 1
- elif (arg in self.optmap) and (self.optmap[arg][1] == VARIADIC):
- optqueue.append(arg)
- argqueue.append(None)
- dashed = True
- else:
- unrecognised(arg)
- else:
- sign = arg[0]
- i = 1
- n = len(arg)
- while i < n:
- narg = sign + arg[i]
- i += 1
- if (narg in self.optmap):
- if self.optmap[narg][1] == ARGUMENTLESS:
- optqueue.append(narg)
- argqueue.append(None)
- elif self.optmap[narg][1] == ARGUMENTED:
- optqueue.append(narg)
- nargarg = arg[i:]
- if len(nargarg) == 0:
- get += 1
- else:
- argqueue.append(nargarg)
- break
- elif self.optmap[narg][1] == VARIADIC:
- optqueue.append(narg)
- nargarg = arg[i:]
- argqueue.append(nargarg if len(nargarg) > 0 else None)
- dashed = True
- break
- else:
- unrecognised(arg)
- else:
- self.files.append(arg)
-
- i = 0
- n = len(optqueue)
- while i < n:
- opt = optqueue[i]
- arg = argqueue[i]
- i += 1
- opt = self.optmap[opt][0]
- if (opt not in self.opts) or (self.opts[opt] is None):
- self.opts[opt] = []
- self.opts[opt].append(arg)
-
- for arg in self.__arguments:
- if (arg[0] == VARIADIC):
- varopt = self.opts[arg[1][0]]
- if varopt is not None:
- additional = ','.join(self.files).split(',') if len(self.files) > 0 else []
- if varopt[0] is None:
- self.opts[arg[1][0]] = additional
- else:
- self.opts[arg[1][0]] = varopt[0].split(',') + additional
- self.files = []
- break
-
- self.message = ' '.join(self.files) if len(self.files) > 0 else None
-
- return self.rc
-
-
- '''
- Prints a colourful help message
- '''
- def help(self):
- print('\033[1m%s\033[21m %s %s' % (self.__program, '-' if linuxvt else '—', self.__description))
- print()
- if self.__longdescription is not None:
- print(self.__longdescription)
- print()
-
- print('\033[1mUSAGE:\033[21m', end='')
- first = True
- for line in self.__usage.split('\n'):
- if first:
- first = False
- else:
- print(' or', end='')
- print('\t%s' % (line))
- print()
-
- print('\033[1mSYNOPSIS:\033[21m')
- (lines, lens) = ([], [])
- for opt in self.__arguments:
- opt_type = opt[0]
- opt_alts = opt[1]
- opt_arg = opt[2]
- opt_help = opt[3]
- if opt_help is None:
- continue
- (line, l) = ('', 0)
- first = opt_alts[0]
- last = opt_alts[-1]
- alts = ('', last) if first is last else (first, last)
- for opt_alt in alts:
- if opt_alt is alts[-1]:
- line += '%colour%' + opt_alt
- l += len(opt_alt)
- if opt_type == ARGUMENTED: line += ' \033[4m%s\033[24m' % (opt_arg); l += len(opt_arg) + 1
- elif opt_type == VARIADIC: line += ' [\033[4m%s\033[24m...]' % (opt_arg); l += len(opt_arg) + 6
- else:
- line += ' \033[2m%s\033[22m ' % (opt_alt)
- l += len(opt_alt) + 6
- lines.append(line)
- lens.append(l)
-
- col = max(lens)
- col += 8 - ((col - 4) & 7)
- index = 0
- for opt in self.__arguments:
- opt_help = opt[3]
- if opt_help is None:
- continue
- first = True
- colour = '36' if (index & 1) == 0 else '34'
- print(lines[index].replace('%colour%', '\033[%s;1m' % (colour)), end=' ' * (col - lens[index]))
- for line in opt_help.split('\n'):
- if first:
- first = False
- print('%s' % (line), end='\033[21;39m\n')
- else:
- print('%s\033[%sm%s\033[39m' % (' ' * col, colour, line))
- index += 1
-
- print()
-
-
-
-'''
-Balloon format class
-'''
-class Balloon():
- '''
- Constructor
-
- @param link:str The \-directional balloon line character
- @param linkmirror:str The /-directional balloon line character
- @param ww:str See the info manual
- @param ee:str See the info manual
- @param nw:list<str> See the info manual
- @param nnw:list<str> See the info manual
- @param n:list<str> See the info manual
- @param nne:list<str> See the info manual
- @param ne:list<str> See the info manual
- @param nee:str See the info manual
- @param e:str See the info manual
- @param see:str See the info manual
- @param se:list<str> See the info manual
- @param sse:list<str> See the info manual
- @param s:list<str> See the info manual
- @param ssw:list<str> See the info manual
- @param sw:list<str> See the info manual
- @param sww:str See the info manual
- @param w:str See the info manual
- @param nww:str See the info manual
- '''
- def __init__(self, link, linkmirror, ww, ee, nw, nnw, n, nne, ne, nee, e, see, se, sse, s, ssw, sw, sww, w, nww):
- (self.link, self.linkmirror) = (link, linkmirror)
- (self.ww, self.ee) = (ww, ee)
- (self.nw, self.ne, self.se, self.sw) = (nw, ne, se, sw)
- (self.nnw, self.n, self.nne) = (nnw, n, nne)
- (self.nee, self.e, self.see) = (nee, e, see)
- (self.sse, self.s, self.ssw) = (sse, s, ssw)
- (self.sww, self.w, self.nww) = (sww, w, nww)
-
- _ne = max(ne, key = UCS.dispLen)
- _nw = max(nw, key = UCS.dispLen)
- _se = max(se, key = UCS.dispLen)
- _sw = max(sw, key = UCS.dispLen)
-
- minE = UCS.dispLen(max([_ne, nee, e, see, _se, ee], key = UCS.dispLen))
- minW = UCS.dispLen(max([_nw, nww, e, sww, _sw, ww], key = UCS.dispLen))
- minN = len(max([ne, nne, n, nnw, nw], key = len))
- minS = len(max([se, sse, s, ssw, sw], key = len))
-
- self.minwidth = minE + minE
- self.minheight = minN + minS
-
-
- '''
- Generates a balloon with a message
-
- @param minw:int The minimum number of columns of the balloon
- @param minh:int The minimum number of lines of the balloon
- @param lines:list<str> The text lines to display
- @param lencalc:int(str) Function used to compute the length of a text line
- @return :str The balloon as a formated string
- '''
- def get(self, minw, minh, lines, lencalc):
- h = self.minheight + len(lines)
- w = self.minwidth + lencalc(max(lines, key = lencalc))
- if w < minw: w = minw
- if h < minh: h = minh
-
- if len(lines) > 1:
- (ws, es) = ({0 : self.nww, len(lines) - 1 : self.sww}, {0 : self.nee, len(lines) - 1 : self.see})
- for j in range(1, len(lines) - 1):
- ws[j] = self.w
- es[j] = self.e
- else:
- (ws, es) = ({0 : self.ww}, {0 : self.ee})
-
- rc = []
-
- for j in range(0, len(self.n)):
- outer = UCS.dispLen(self.nw[j]) + UCS.dispLen(self.ne[j])
- inner = UCS.dispLen(self.nnw[j]) + UCS.dispLen(self.nne[j])
- if outer + inner <= w:
- rc.append(self.nw[j] + self.nnw[j] + self.n[j] * (w - outer - inner) + self.nne[j] + self.ne[j])
- else:
- rc.append(self.nw[j] + self.n[j] * (w - outer) + self.ne[j])
-
- for j in range(0, len(lines)):
- rc.append(ws[j] + lines[j] + ' ' * (w - lencalc(lines[j]) - UCS.dispLen(self.w) - UCS.dispLen(self.e)) + es[j])
-
- for j in range(0, len(self.s)):
- outer = UCS.dispLen(self.sw[j]) + UCS.dispLen(self.se[j])
- inner = UCS.dispLen(self.ssw[j]) + UCS.dispLen(self.sse[j])
- if outer + inner <= w:
- rc.append(self.sw[j] + self.ssw[j] + self.s[j] * (w - outer - inner) + self.sse[j] + self.se[j])
- else:
- rc.append(self.sw[j] + self.s[j] * (w - outer) + self.se[j])
-
- return '\n'.join(rc)
-
-
-
-'''
-Super-ultra-extreme-awesomazing replacement for cowsay
-'''
-class Backend():
- '''
- Constructor
-
- @param message:str The message spoken by the pony
- @param ponyfile:str The pony file
- @param wrapcolumn:int The column at where to wrap the message, `None` for no wrapping
- @param width:int The width of the screen, `None` if truncation should not be applied
- @param balloon:Balloon The balloon style object, `None` if only the pony should be printed
- @param hyphen:str How hyphens added by the wordwrapper should be printed
- @param linkcolour:str How to colour the link character, empty string if none
- @param ballooncolour:str How to colour the balloon, empty string if none
- '''
- def __init__(self, message, ponyfile, wrapcolumn, width, balloon, hyphen, linkcolour, ballooncolour):
- self.message = message
- self.ponyfile = ponyfile
- self.wrapcolumn = None if wrapcolumn is None else wrapcolumn - (0 if balloon is None else balloon.minwidth)
- self.width = width
- self.balloon = balloon
- self.hyphen = hyphen
- self.ballooncolour = ballooncolour
-
- if self.balloon is not None:
- self.link = {'\\' : linkcolour + self.balloon.link,
- '/' : linkcolour + self.balloon.linkmirror}
- else:
- self.link = {}
-
- self.output = ''
- self.pony = None
-
-
- '''
- Process all data
- '''
- def parse(self):
- self.__expandMessage()
- self.__unpadMessage()
- self.__loadFile()
-
- if self.pony.startswith('$$$\n'):
- self.pony = self.pony[4:]
- infoend = self.pony.index('\n$$$\n')
- printinfo(self.pony[:infoend])
- self.pony = self.pony[infoend + 5:]
- self.pony = mode + self.pony
-
- self.__processPony()
- self.__truncate()
-
-
- '''
- Remove padding spaces fortune cookies are padded with whitespace (damn featherbrains)
- '''
- def __unpadMessage(self):
- lines = self.message.split('\n')
- for spaces in (8, 4, 2, 1):
- padded = True
- for line in lines:
- if not line.startswith(' ' * spaces):
- padded = False
- break
- if padded:
- for i in range(0, len(lines)):
- line = lines[i]
- while line.startswith(' ' * spaces):
- line = line[spaces:]
- lines[i] = line
- lines = [line.rstrip(' ') for line in lines]
- self.message = '\n'.join(lines)
-
-
- '''
- Converts all tabs in the message to spaces by expanding
- '''
- def __expandMessage(self):
- lines = self.message.split('\n')
- buf = ''
- for line in lines:
- (i, n, x) = (0, len(line), 0)
- while i < n:
- c = line[i]
- i += 1
- if c == '\033':
- colour = self.__getcolour(line, i - 1)
- i += len(colour) - 1
- buf += colour
- elif c == '\t':
- nx = 8 - (x & 7)
- buf += ' ' * nx
- x += nx
- else:
- buf += c
- if not UCS.isCombining(c):
- x += 1
- buf += '\n'
- self.message = buf[:-1]
-
-
- '''
- Loads the pony file
- '''
- def __loadFile(self):
- with open(self.ponyfile, 'rb') as ponystream:
- self.pony = ponystream.read().decode('utf8', 'replace')
-
-
- '''
- Truncate output to the width of the screen
- '''
- def __truncate(self):
- if self.width is None:
- return
- lines = self.output.split('\n')
- self.output = ''
- for line in lines:
- (i, n, x) = (0, len(line), 0)
- while i < n:
- c = line[i]
- i += 1
- if c == '\033':
- colour = self.__getcolour(line, i - 1)
- i += len(colour) - 1
- self.output += colour
- else:
- if x < self.width:
- self.output += c
- if not UCS.isCombining(c):
- x += 1
- self.output += '\n'
- self.output = self.output[:-1]
-
-
- '''
- Process the pony file and generate output to self.output
- '''
- def __processPony(self):
- self.output = ''
-
- AUTO_PUSH = '\033[01010~'
- AUTO_POP = '\033[10101~'
-
- variables = {'' : '$'}
- for key in self.link:
- variables[key] = AUTO_PUSH + self.link[key] + AUTO_POP
-
- indent = 0
- dollar = None
- balloonLines = None
- colourstack = ColourStack(AUTO_PUSH, AUTO_POP)
-
- (i, n, lineindex, skip, nonskip) = (0, len(self.pony), 0, 0, 0)
- while i < n:
- c = self.pony[i]
- if c == '\t':
- n += 7 - (indent & 7)
- ed = ' ' * (8 - (indent & 7))
- c = ' '
- self.pony = self.pony[:i] + ed + self.pony[i + 1:]
- i += 1
- if c == '$':
- if dollar is not None:
- if '=' in dollar:
- name = dollar[:dollar.find('=')]
- value = dollar[dollar.find('=') + 1:]
- variables[name] = value
- elif not dollar.startswith('balloon'):
- data = variables[dollar].replace('$', '$$')
- if data == '$$': # if not handled specially we will get an infinity loop
- if (skip == 0) or (nonskip > 0):
- if nonskip > 0:
- nonskip -= 1
- self.output += '$'
- indent += 1
- else:
- skip -= 1
- else:
- n += len(data)
- self.pony = self.pony[:i] + data + self.pony[i:]
- elif self.balloon is not None:
- (w, h) = (0, 0)
- props = dollar[7:]
- if len(props) > 0:
- if ',' in props:
- if props[0] is not ',':
- w = int(props[:props.index(',')])
- h = int(props[props.index(',') + 1:])
- else:
- w = int(props)
- balloon = self.__getballoon(w, h, indent)
- balloon = balloon.split('\n')
- balloon = [AUTO_PUSH + self.ballooncolour + item + AUTO_POP for item in balloon]
- for b in balloon[0]:
- self.output += b + colourstack.feed(b)
- if lineindex == 0:
- balloonpre = '\n' + (' ' * indent)
- for line in balloon[1:]:
- self.output += balloonpre;
- for b in line:
- self.output += b + colourstack.feed(b);
- indent = 0
- elif len(balloon) > 1:
- balloonLines = balloon
- balloonLine = 0
- balloonIndent = indent
- indent += self.__len(balloonLines[0])
- balloonLines[0] = None
- dollar = None
- else:
- dollar = ''
- elif dollar is not None:
- if c == '\033':
- c = self.pony[i]
- i += 1
- dollar += c
- elif c == '\033':
- colour = self.__getcolour(self.pony, i - 1)
- for b in colour:
- self.output += b + colourstack.feed(b);
- i += len(colour) - 1
- elif c == '\n':
- self.output += c
- indent = 0
- (skip, nonskip) = (0, 0)
- lineindex += 1
- if balloonLines is not None:
- balloonLine += 1
- if balloonLine == len(balloonLines):
- balloonLines = None
- else:
- if (balloonLines is not None) and (balloonLines[balloonLine] is not None) and (balloonIndent == indent):
- data = balloonLines[balloonLine]
- datalen = self.__len(data)
- skip += datalen
- nonskip += datalen
- data = data.replace('$', '$$')
- n += len(data)
- self.pony = self.pony[:i] + data + self.pony[i:]
- balloonLines[balloonLine] = None
- else:
- if (skip == 0) or (nonskip > 0):
- if nonskip > 0:
- nonskip -= 1
- self.output += c + colourstack.feed(c);
- if not UCS.isCombining(c):
- indent += 1
- else:
- skip -= 1
-
- if balloonLines is not None:
- for line in balloonLines[balloonLine:]:
- data = ' ' * (balloonIndent - indent) + line + '\n'
- for b in data:
- self.output += b + colourstack.feed(b);
- indent = 0
-
- self.output = self.output.replace(AUTO_PUSH, '').replace(AUTO_POP, '')
-
-
- '''
- Gets colour code att the currect offset in a buffer
-
- @param input:str The input buffer
- @param offset:int The offset at where to start reading, a escape must begin here
- @return :str The escape sequence
- '''
- def __getcolour(self, input, offset):
- (i, n) = (offset, len(input))
- rc = input[i]
- i += 1
- if i == n: return rc
- c = input[i]
- i += 1
- rc += c
-
- if c == ']':
- if i == n: return rc
- c = input[i]
- i += 1
- rc += c
- if c == 'P':
- di = 0
- while (di < 7) and (i < n):
- c = input[i]
- i += 1
- di += 1
- rc += c
- elif c == '[':
- while i < n:
- c = input[i]
- i += 1
- rc += c
- if (c == '~') or (('a' <= c) and (c <= 'z')) or (('A' <= c) and (c <= 'Z')):
- break
-
- return rc
-
-
- '''
- Calculates the number of visible characters in a text
-
- @param input:str The input buffer
- @return :int The number of visible characters
- '''
- def __len(self, input):
- (rc, i, n) = (0, 0, len(input))
- while i < n:
- c = input[i]
- if c == '\033':
- i += len(self.__getcolour(input, i))
- else:
- i += 1
- if not UCS.isCombining(c):
- rc += 1
- return rc
-
-
- '''
- Generates a balloon with the message
-
- @param width:int The minimum width of the balloon
- @param height:int The minimum height of the balloon
- @param left:int The column where the balloon starts
- @return :str The balloon the the message as a string
- '''
- def __getballoon(self, width, height, left):
- wrap = None
- if self.wrapcolumn is not None:
- wrap = self.wrapcolumn - left
- if wrap < 8:
- wrap = 8
-
- msg = self.message
- if wrap is not None:
- msg = self.__wrapMessage(msg, wrap)
-
- msg = msg.replace('\n', '\033[0m%s\n' % (self.ballooncolour)) + '\033[0m' + self.ballooncolour
-
- return self.balloon.get(width, height, msg.split('\n'), self.__len);
-
-
- '''
- Wraps the message
-
- @param message:str The message to wrap
- @param wrap:int The width at where to force wrapping
- @return :str The message wrapped
- '''
- def __wrapMessage(self, message, wrap):
- buf = ''
- try:
- AUTO_PUSH = '\033[01010~'
- AUTO_POP = '\033[10101~'
- msg = message.replace('\n', AUTO_PUSH + '\n' + AUTO_POP);
- cstack = ColourStack(AUTO_PUSH, AUTO_POP)
- for c in msg:
- buf += c + cstack.feed(c)
- lines = buf.replace(AUTO_PUSH, '').replace(AUTO_POP, '').split('\n')
- buf = ''
-
- for line in lines:
- b = [None] * len(line)
- map = {0 : 0}
- (bi, cols, w) = (0, 0, wrap)
- (indent, indentc) = (-1, 0)
-
- (i, n) = (0, len(line))
- while i <= n:
- d = None
- if i < n:
- d = line[i]
- i += 1
- if d == '\033': # TODO this should use self.__getcolour()
- ## Invisible stuff
- b[bi] = d
- bi += 1
- b[bi] = line[i]
- d = line[i]
- bi += 1
- i += 1
- if d == '[':
- while True:
- b[bi] = line[i]
- d = line[i]
- bi += 1
- i += 1
- if (('a' <= d) and (d <= 'z')) or (('A' <= d) and (d <= 'Z')) or (d == '~'):
- break
- elif d == ']':
- b[bi] = line[i]
- d = line[i]
- bi += 1
- i += 1
- if d == 'P':
- for j in range(0, 7):
- b[bi] = line[i]
- bi += 1
- i += 1
- elif (d is not None) and (d != ' '):
- ## Fetch word
- if indent == -1:
- indent = i - 1
- for j in range(0, indent):
- if line[j] == ' ':
- indentc += 1
- b[bi] = d
- bi += 1
- if (not UCS.isCombining(d)) and (d != '­'):
- cols += 1
- map[cols] = bi
- else:
- ## Wrap?
- mm = 0
- bisub = 0
- iwrap = wrap - (0 if indent == 1 else indentc)
-
- while ((w > 8) and (cols > w + 5)) or (cols > iwrap): # TODO make configurable
- ## wrap
- x = w;
- if mm + x not in map: # Too much whitespace ?
- cols = 0
- break
- nbsp = b[map[mm + x]] == ' '
- m = map[mm + x]
-
- if ('­' in b[bisub : m]) and not nbsp:
- hyphen = m - 1
- while b[hyphen] != '­':
- hyphen -= 1
- while map[mm + x] > hyphen: ## Only looking backward, if foreward is required the word is probabily not hyphenated correctly
- x -= 1
- x += 1
- m = map[mm + x]
-
- mm += x - (0 if nbsp else 1) ## − 1 so we have space for a hythen
-
- for bb in b[bisub : m]:
- buf += bb
- buf += '\n' if nbsp else '\0\n'
- cols -= x - (0 if nbsp else 1)
- bisub = m
-
- w = iwrap
- if indent != -1:
- buf += line[:indent]
-
- for j in range(bisub, bi):
- b[j - bisub] = b[j]
- bi -= bisub
-
- if cols > w:
- buf += '\n'
- w = wrap
- if indent != -1:
- buf += line[:indent]
- w -= indentc
- for bb in b[:bi]:
- buf += bb
- w -= cols
- cols = 0
- bi = 0
- if d is None:
- i += 1
- else:
- if w > 0:
- buf += ' '
- w -= 1
- else:
- buf += '\n'
- w = wrap
- if indent != -1:
- buf + line[:indent]
- w -= indentc
- buf += '\n'
-
- rc = '\n'.join(line.rstrip() for line in buf[:-1].split('\n'));
- rc = rc.replace('­', ''); # remove soft hyphens
- rc = rc.replace('\0', '%s%s%s' % (AUTO_PUSH, self.hyphen, AUTO_POP))
- return rc
- except Exception as err:
- import traceback
- errormessage = ''.join(traceback.format_exception(type(err), err, None))
- rc = '\n'.join(line.rstrip() for line in buf.split('\n'));
- rc = rc.replace('\0', '%s%s%s' % (AUTO_PUSH, self.hyphen, AUTO_POP))
- errormessage += '\n---- WRAPPING BUFFER ----\n\n' + rc
- try:
- if os.readlink('/proc/self/fd/2') != os.readlink('/proc/self/fd/1'):
- printerr(errormessage, end='')
- return message
- except:
- pass
- return message + '\n\n\033[0;1;31m---- EXCEPTION IN PONYSAY WHILE WRAPPING ----\033[0m\n\n' + errormessage
-
-
-'''
-ANSI colour stack
-
-This is used to make layers with independent coloursations
-'''
-class ColourStack():
- '''
- Constructor
-
- @param autopush:str String that, when used, will create a new independently colourised layer
- @param autopop:str String that, when used, will end the current layer and continue of the previous layer
- '''
- def __init__(self, autopush, autopop):
- self.autopush = autopush
- self.autopop = autopop
- self.lenpush = len(autopush)
- self.lenpop = len(autopop)
- self.bufproto = ' ' * (self.lenpush if self.lenpush > self.lenpop else self.lenpop)
- self.stack = []
- self.push()
- self.seq = None
-
-
- '''
- Create a new independently colourised layer
-
- @return :str String that should be inserted into your buffer
- '''
- def push(self):
- self.stack.insert(0, [self.bufproto, None, None, [False] * 9])
- if len(self.stack) == 1:
- return None
- return '\033[0m'
-
-
- '''
- End the current layer and continue of the previous layer
-
- @return :str String that should be inserted into your buffer
- '''
- def pop(self):
- old = self.stack.pop(0)
- rc = '\033[0;'
- if len(self.stack) == 0: # last resort in case something made it pop too mush
- push()
- new = self.stack[0]
- if new[1] is not None: rc += new[1] + ';'
- if new[2] is not None: rc += new[2] + ';'
- for i in range(0, 9):
- if new[3][i]:
- rc += str(i + 1) + ';'
- return rc[:-1] + 'm'
-
-
- '''
- Use this, in sequence, for which character in your buffer that contains yor autopush and autopop
- string, the automatically get push and pop string to insert after each character
-
- @param :chr One character in your buffer
- @return :str The text to insert after the input character
- '''
- def feed(self, char):
- if self.seq is not None:
- self.seq += char
- if (char == '~') or (('a' <= char) and (char <= 'z')) or (('A' <= char) and (char <= 'Z')):
- if (self.seq[0] == '[') and (self.seq[-1] == 'm'):
- self.seq = self.seq[1:-1].split(';')
- (i, n) = (0, len(self.seq))
- while i < n:
- part = self.seq[i]
- p = 0 if part == '' else int(part)
- i += 1
- if p == 0: self.stack[0][1:] = [None, None, [False] * 9]
- elif (1 <= p) and (p <= 9): self.stack[0][3][p - 1] = True
- elif (21 <= p) and (p <= 29): self.stack[0][3][p - 21] = False
- elif p == 39: self.stack[0][1] = None
- elif p == 49: self.stack[0][2] = None
- elif (30 <= p) and (p <= 37): self.stack[0][1] = part
- elif (90 <= p) and (p <= 97): self.stack[0][1] = part
- elif (40 <= p) and (p <= 47): self.stack[0][2] = part
- elif (100 <= p) and (p <= 107): self.stack[0][2] = part
- elif p == 38:
- self.stack[0][1] = '%s;%s;%s' % (part, self.seq[i], self.seq[i + 1])
- i += 2
- elif p == 48:
- self.stack[0][2] = '%s;%s;%s' % (part, self.seq[i], self.seq[i + 1])
- i += 2
- self.seq = None
- elif char == '\033':
- self.seq = ''
- buf = self.stack[0][0]
- buf = buf[1:] + char
- rc = ''
- if buf[-self.lenpush:] == self.autopush: rc = self.push()
- elif buf[-self.lenpop:] == self.autopop: rc = self.pop()
- self.stack[0][0] = buf
- return rc
-
-
-
-'''
-UCS utility class
-'''
-class UCS():
- '''
- Checks whether a character is a combining character
-
- @param char:chr The character to test
- @return :bool Whether the character is a combining character
- '''
- @staticmethod
- def isCombining(char):
- o = ord(char)
- if (0x0300 <= o) and (o <= 0x036F): return True
- if (0x20D0 <= o) and (o <= 0x20FF): return True
- if (0x1DC0 <= o) and (o <= 0x1DFF): return True
- if (0xFE20 <= o) and (o <= 0xFE2F): return True
- return False
-
-
- '''
- Gets the number of combining characters in a string
-
- @param string:str A text to count combining characters in
- @return :int The number of combining characters in the string
- '''
- @staticmethod
- def countCombining(string):
- rc = 0
- for char in string:
- if UCS.isCombining(char):
- rc += 1
- return rc
-
-
- '''
- Gets length of a string not counting combining characters
-
- @param string:str The text of which to determine the monospaced width
- @return The determine the monospaced width of the text, provided it does not have escape sequnces
- '''
- @staticmethod
- def dispLen(string):
- return len(string) - UCS.countCombining(string)
-
-
-
-'''
-Class used for correcting spellos and typos,
-
-Note that this implementation will not find that correctly spelled word are correct faster than it corrects words.
-It is also limited to words of size 0 to 127 (inclusive)
-'''
-class SpelloCorrecter(): # Naïvely and quickly proted and adapted from optimised Java, may not be the nicest, or even fast, Python code
- '''
- Constructor
-
- @param directories:list<str> List of directories that contains the file names with the correct spelling
- @param ending:str The file name ending of the correctly spelled file names, this is removed for the name
- '''
- def __init__(self, directories, ending):
- self.weights = {'k' : {'c' : 0.25, 'g' : 0.75, 'q' : 0.125},
- 'c' : {'k' : 0.25, 'g' : 0.75, 's' : 0.5, 'z' : 0.5, 'q' : 0.125},
- 's' : {'z' : 0.25, 'c' : 0.5},
- 'z' : {'s' : 0.25, 'c' : 0.5},
- 'g' : {'k' : 0.75, 'c' : 0.75, 'q' : 0.9},
- 'o' : {'u' : 0.5},
- 'u' : {'o' : 0.5, 'v' : 0.75, 'w' : 0.5},
- 'b' : {'v' : 0.75},
- 'v' : {'b' : 0.75, 'w' : 0.5, 'u' : 0.7},
- 'w' : {'v' : 0.5, 'u' : 0.5},
- 'q' : {'c' : 0.125, 'k' : 0.125, 'g' : 0.9}}
-
- self.corrections = None
- self.dictionary = [None] * 513
- self.reusable = [0] * 512
- self.dictionaryEnd = 512
- self.closestDistance = 0
-
- self.M = [None] * 128
- for y in range(0, 128):
- self.M[y] = [0] * 128
- self.M[y][0] = y
- m0 = self.M[0]
- x = 127
- while x > -1:
- m0[x] = x
- x -= 1
-
- previous = ''
- self.dictionary[-1] = previous;
-
- for directory in directories:
- for filename in os.listdir(directory):
- if (not endswith(filename, ending)) or (len(filename) - len(ending) > 127):
- continue
- proper = filename[:-len(ending)]
-
- if self.dictionaryEnd == 0:
- self.dictionaryEnd = len(self.dictionary)
- self.reusable = [0] * self.dictionaryEnd + self.reusable
- self.dictionary = [None] * self.dictionaryEnd + self.dictionary
-
- self.dictionaryEnd -= 1
- self.dictionary[self.dictionaryEnd] = proper
-
- prevCommon = min(len(previous), len(proper))
- for i in range(0, prevCommon):
- if previous[i] != proper[i]:
- prevCommon = i
- break
- previous = proper
- self.reusable[self.dictionaryEnd] = prevCommon
- #part = self.dictionary[self.dictionaryEnd : len(self.dictionary) - 1]
- #part.sort()
- #self.dictionary[self.dictionaryEnd : len(self.dictionary) - 1] = part
- #
- #index = len(self.dictionary) - 1
- #while index >= self.dictionaryEnd:
- # proper = self.dictionary[index]
- # prevCommon = min(len(previous), len(proper))
- # for i in range(0, prevCommon):
- # if previous[i] != proper[i]:
- # prevCommon = i
- # break
- # previous = proper
- # self.reusable[self.dictionaryEnd] = prevCommon
- # index -= 1;
-
-
- '''
- Finds the closests correct spelled word
-
- @param used:str The word to correct
- @return (words, distance):(list<string>, int) A list the closest spellings and the weighted distance
- '''
- def correct(self, used):
- if len(used) > 127:
- return ([used], 0)
-
- self.__correct(used)
- return (self.corrections, self.closestDistance)
-
-
- '''
- Finds the closests correct spelled word
-
- @param used:str The word to correct, it must satisfy all restrictions
- '''
- def __correct(self, used):
- self.closestDistance = 0x7FFFFFFF
- previous = self.dictionary[-1]
- prevLen = 0
- usedLen = len(used)
-
- proper = None
- prevCommon = 0
-
- d = len(self.dictionary) - 1
- while d > self.dictionaryEnd:
- d -= 1
- proper = self.dictionary[d]
- if abs(len(proper) - usedLen) <= self.closestDistance:
- if previous == self.dictionary[d + 1]:
- prevCommon = self.reusable[d];
- else:
- prevCommon = min(prevLen, len(proper))
- for i in range(0, prevCommon):
- if previous[i] != proper[i]:
- prevCommon = i
- break
-
- skip = min(prevLen, len(proper))
- i = prevCommon
- while i < skip:
- for u in range(0, usedLen):
- if (used[u] == previous[i]) or (used[u] == proper[i]):
- skip = i
- break
- i += 1
-
- common = min(skip, min(usedLen, len(proper)))
- for i in range(0, common):
- if used[i] != proper[i]:
- common = i
- break
-
- distance = self.__distance(proper, skip, len(proper), used, common, usedLen)
-
- if self.closestDistance > distance:
- self.closestDistance = distance
- self.corrections = [proper]
- elif self.closestDistance == distance:
- self.corrections.append(proper)
-
- previous = proper;
- if distance >= 0x7FFFFF00:
- prevLen = distance & 255
- else:
- prevLen = len(proper)
-
-
- '''
- Calculate the distance between a correct word and a incorrect word
-
- @param proper:str The correct word
- @param y0:int The offset for `proper`
- @param yn:int The length, before applying `y0`, of `proper`
- @param used:str The incorrect word
- @param x0:int The offset for `used`
- @param xn:int The length, before applying `x0`, of `used`
- @return :float The distance between the words
- '''
- def __distance(self, proper, y0, yn, used, x0, xn):
- my = self.M[y0]
- for y in range(y0, yn):
- best = 0x7FFFFFFF
- p = proper[y]
- myy = self.M[y + 1] # only one array bound check, and at most one + ☺
- x = x0
- while x < xn:
- change = my[x]
- u = used[x]
- if p == u:
- # commence black magick … twilight would be so disappointed
- x += 1
- myy[x] = change
- best = min(best, change)
- remove = myy[x]
- add = my[x + 1]
-
- cw = 1
- if my[x] in self.weights:
- if p in self.weights[u]:
- cw = self.weights[u][p]
- x += 1
-
- myy[x] = min(cw + change, 1 + min(remove, add))
- if best > myy[x]:
- best = myy[x]
-
- if best > self.closestDistance:
- return 0x7FFFFF00 | y
- my = myy
- return my[xn]
-
-
-
-
-'''
-The user's home directory
-'''
-HOME = os.environ['HOME'] if 'HOME' in os.environ else os.path.expanduser('~')
-
-
-'''
-Whether the program is execute in Linux VT (TTY)
-'''
-linuxvt = ('TERM' in os.environ) and (os.environ['TERM'] == 'linux')
-
-
-'''
-Whether the script is executed as ponythink
-'''
-isthink = (len(__file__) >= len('think')) and (__file__.endswith('think'))
-isthink = ((len(__file__) >= len('think.py')) and (__file__.endswith('think.py'))) or isthink
-
-
-'''
-Whether stdin is piped
-'''
-pipelinein = not sys.stdin.isatty()
-
-'''
-Whether stdout is piped
-'''
-pipelineout = not sys.stdout.isatty()
-
-'''
-Whether stderr is piped
-'''
-pipelineerr = not sys.stderr.isatty()
-
-
-'''
-Whether KMS is used
-'''
-usekms = Ponysay.isUsingKMS()
-
-
-'''
-Mode string that modifies or adds $ variables in the pony image
-'''
-mode = ''
-
-
-'''
-The directories where pony files are stored, ttyponies/ are used if the terminal is Linux VT (also known as TTY) and not with KMS
-'''
-appendset = set()
-xponydirs = []
-_ponydirs = [HOME + '/.local/share/ponysay/ponies/', '/usr/share/ponysay/ponies/']
-for ponydir in _ponydirs:
- if os.path.isdir(ponydir) and (ponydir not in appendset):
- xponydirs.append(ponydir)
- appendset.add(ponydir)
-appendset = set()
-vtponydirs = []
-_ponydirs = [HOME + '/.local/share/ponysay/ttyponies/', '/usr/share/ponysay/ttyponies/']
-for ponydir in _ponydirs:
- if os.path.isdir(ponydir) and (ponydir not in appendset):
- vtponydirs.append(ponydir)
- appendset.add(ponydir)
-
-
-'''
-The directories where pony files are stored, extrattyponies/ are used if the terminal is Linux VT (also known as TTY) and not with KMS
-'''
-appendset = set()
-extraxponydirs = []
-_extraponydirs = [HOME + '/.local/share/ponysay/extraponies/', '/usr/share/ponysay/extraponies/']
-for extraponydir in _extraponydirs:
- if os.path.isdir(extraponydir) and (extraponydir not in appendset):
- extraxponydirs.append(extraponydir)
- appendset.add(extraponydir)
-appendset = set()
-extravtponydirs = []
-_extraponydirs = [HOME + '/.local/share/ponysay/extrattyponies/', '/usr/share/ponysay/extrattyponies/']
-for extraponydir in _extraponydirs:
- if os.path.isdir(extraponydir) and (extraponydir not in appendset):
- extravtponydirs.append(extraponydir)
- appendset.add(extraponydir)
-
-
-'''
-The directories where quotes files are stored
-'''
-appendset = set()
-quotedirs = []
-_quotedirs = [HOME + '/.local/share/ponysay/quotes/', '/usr/share/ponysay/quotes/']
-for quotedir in _quotedirs:
- if os.path.isdir(quotedir) and (quotedir not in appendset):
- quotedirs.append(quotedir)
- appendset.add(quotedir)
-
-
-'''
-The directories where balloon style files are stored
-'''
-appendset = set()
-balloondirs = []
-_balloondirs = [HOME + '/.local/share/ponysay/balloons/', '/usr/share/ponysay/balloons/']
-for balloondir in _balloondirs:
- if os.path.isdir(balloondir) and (balloondir not in appendset):
- balloondirs.append(balloondir)
- appendset.add(balloondir)
-
-
-'''
-ucsmap files
-'''
-appendset = set()
-ucsmaps = []
-_ucsmaps = [HOME + '/.local/share/ponysay/ucsmap', '/usr/share/ponysay/ucsmap']
-for ucsmap in _ucsmaps:
- if os.path.isdir(ucsmap) and (ucsmap not in appendset):
- ucsmaps.append(ucsmap)
- appendset.add(ucsmap)
-
-
-
-usage_saythink = '\033[34;1m(ponysay | ponythink)\033[21;39m'
-usage_common = '[-c] [-W\033[4mCOLUMN\033[24m] [-b\033[4mSTYLE\033[24m]'
-usage_listhelp = '(-l | -L | -B | +l | +L | -v | -h)'
-usage_file = '[-f\033[4mPONY\033[24m]* [[--] \033[4mmessage\033[24m]'
-usage_xfile = '(-F\033[4mPONY\033[24m)* [[--] \033[4mmessage\033[24m]'
-usage_quote = '(-q \033[4mPONY\033[24m)*'
-
-usage = '%s %s\n%s %s %s\n%s %s %s\n%s %s %s' % (usage_saythink, usage_listhelp,
- usage_saythink, usage_common, usage_file,
- usage_saythink, usage_common, usage_xfile,
- usage_saythink, usage_common, usage_quote)
-
-usage = usage.replace('\033[', '\0')
-for sym in ('[', ']', '(', ')', '|', '...', '*'):
- usage = usage.replace(sym, '\033[2m' + sym + '\033[22m')
-usage = usage.replace('\0', '\033[')
-
-'''
-Argument parsing
-'''
-opts = ArgParser(program = 'ponythink' if isthink else 'ponysay',
- description = 'cowsay reimplemention for ponies',
- usage = usage,
- longdescription =
-'''Ponysay displays an image of a pony saying some text provided by the user.
-If \033[4mmessage\033[24m is not provided, it accepts standard input. For an extensive
-documentation run `info ponysay`, or for just a little more help than this
-run `man ponysay`. Ponysay has so much more to offer than described here.''')
-
-opts.add_argumentless(['--quoters'])
-opts.add_argumentless(['--onelist'])
-opts.add_argumentless(['++onelist'])
-
-opts.add_argumentless(['-X', '--256-colours', '--256colours', '--x-colours'])
-opts.add_argumentless(['-V', '--tty-colours', '--ttycolours', '--vt-colours'])
-opts.add_argumentless(['-K', '--kms-colours', '--kmscolours'])
-
-opts.add_argumented(['+c', '--colour'], arg = 'COLOUR')
-opts.add_argumented(['--colour-bubble', '--colour-balloon'], arg = 'COLOUR')
-opts.add_argumented(['--colour-link'], arg = 'COLOUR')
-opts.add_argumented(['--colour-msg', '--colour-message'], arg = 'COLOUR')
-opts.add_argumented(['--colour-pony'], arg = 'COLOUR')
-opts.add_argumented(['--colour-wrap', '--colour-hyphen'], arg = 'COLOUR')
-
-opts.add_argumentless(['-h', '--help'], help = 'Print this help message.')
-opts.add_argumentless(['-v', '--version'], help = 'Print the version of the program.')
-opts.add_argumentless(['-l', '--list'], help = 'List pony names.')
-opts.add_argumentless(['-L', '--symlist', '--altlist'], help = 'List pony names with alternatives.')
-opts.add_argumentless(['+l', '++list'], help = 'List non-MLP:FiM pony names.')
-opts.add_argumentless(['+L', '++symlist', '++altlist'], help = 'List non-MLP:FiM pony names with alternatives.')
-opts.add_argumentless(['-A', '--all'], help = 'List all pony names.')
-opts.add_argumentless(['+A', '++all', '--symall', '--altall'], help = 'List all pony names with alternatives.')
-opts.add_argumentless(['-B', '--bubblelist', '--balloonlist'], help = 'List balloon styles.')
-opts.add_argumentless(['-c', '--compact'], help = 'Compress messages.')
-opts.add_argumentless(['-o', '--pony-only', '--ponyonly'], help = 'Print only the pony.')
-opts.add_argumented( ['-W', '--wrap'], arg = 'COLUMN', help = 'Specify column where the message should be wrapped.')
-opts.add_argumented( ['-b', '--bubble', '--balloon'], arg = 'STYLE', help = 'Select a balloon style.')
-opts.add_argumented( ['-f', '--file', '--pony'], arg = 'PONY', help = 'Select a pony.\nEither a file name or a pony name.')
-opts.add_argumented( ['-F', '++file', '++pony'], arg = 'PONY', help = 'Select a non-MLP:FiM pony.')
-opts.add_argumented( ['-q', '--quote'], arg = 'PONY', help = 'Select a pony which will quote herself.')
-opts.add_variadic( ['--f', '--files', '--ponies'], arg = 'PONY')
-opts.add_variadic( ['--F', '++files', '++ponies'], arg = 'PONY')
-opts.add_variadic( ['--q', '--quotes'], arg = 'PONY')
-
-'''
-Whether at least one unrecognised option was used
-'''
-unrecognised = not opts.parse()
-
-
-
-'''
-Start the program from ponysay.__init__ if this is the executed file
-'''
-if __name__ == '__main__':
- Ponysay(opts)
+import os, sys, random
+from os.path import dirname, realpath, exists
+import argparse, textwrap
+try:
+ import re2 as re
+except:
+ import re
+
+balloonstyles={'cowsay': ('<\\|/ _ >\\|/ - \\/', '(((( _ )))) - \\/')}
+
+ponypath = realpath(dirname(__file__)+'/../share/ponies')
+if not exists(ponypath):
+ ponypath=realpath(dirname(__file__)+'/ponies')
+termwidth = 80
+try:
+ termwidth = os.get_terminal_size()[0]
+except:
+ pass
+
+def list_ponies(markQuotes=False):
+ quotes = lambda n: ' (q)' if markQuotes and exists(ponypath+'/'+n+'.quotes') else ''
+ return [ f[:-5]+quotes(f[:-5]) for f in os.listdir(ponypath) if not f.endswith('quotes') ]
+
+def list_ponies_with_quotes(markQuotes=False):
+ return [ f[:-7] for f in os.listdir(ponypath) if f.endswith('quotes') ]
+
+def load_pony(name):
+ return open(ponypath+'/'+name+'.pony').readlines()
+
+def random_quote(name):
+ quotepath=ponypath+'/'+name+'.quotes'
+ if exists(quotepath):
+ return random.choice(open(quotepath).read().split('\n\n'))
+ else:
+ return None
+
+def render_balloon(text, balloonstyle, minwidth=0, maxwidth=40, pad=str.center):
+ if text is None:
+ return []
+ [ls, lb, lm, lt, tl, t, tr, rs, rt, rm, rb, br, b, bl, _, _] = balloonstyle
+ lines = [ wrapline for textline in text.split('\n') for wrapline in textwrap.wrap(textline, maxwidth) ]
+ width = max([ len(line) for line in lines ]+[minwidth])
+ lines = [ pad(line, width) for line in lines ]
+ sides = [(lt, rt)] + [(lm, rm)]*(len(lines)-2) + [(lb, rb)] if len(lines) > 1 else [(ls, rs)]
+ return [tl+t*(width+2)+tr+'\n']+\
+ [sides[i][0]+' '+line+' '+sides[i][1]+'\n' for i,line in enumerate(lines)]+\
+ [bl+b*(width+2)+br+'\n']
+
+def render_pony(name, text=None, balloonstyle=balloonstyles['cowsay'][0], width=80, center=False, centertext=False):
+ pony = load_pony(name) #CAUTION: these lines already end with '\n'
+ balloon = link_l = link_r = ''
+ if text:
+ [link_l, link_r] = balloonstyle[-2:]
+ for i,line in enumerate(pony):
+ match = re.search('\$balloon([0-9]*)\$', line)
+ if match:
+ minwidth = int(match.group(1) or '0')
+ pony[i:i+1] = render_balloon(text, balloonstyle, minwidth=minwidth, maxwidth=int(width/2), pad=str.center if centertext else str.ljust)
+ break
+ #FIXME I have no idea what these three-dollar-sign-pairs thingys are for. Can they occur more than once per pony?
+ try:
+ first = pony.index('$$$\n')
+ second = pony[first+1:].index('$$$\n')
+ pony[first:] = pony[first+1+second+1:]
+ except:
+ pass
+ pony = [ line.replace('$\\$', link_l).replace('$/$', link_r) for line in pony ]
+ indent = ''
+ if center:
+ ponywidth = max([ len(re.sub(r'\x1B\[[0-9;]+m|\$.*\$', '', line)) for line in pony ])
+ indent = ' '*int((width-ponywidth)/2)
+ wre = re.compile('((\x1B\[[0-9;]+m)?.){0,%s}' % width)
+ return ''.join([ indent+wre.search(line).group()+'\n' for line in pony ])
+
+parser = argparse.ArgumentParser(description='Cowsay with ponies')
+parser.add_argument('-p', '--pony', type=str, default='random', help='The name of the pony to be used. Use "-p list" to list all ponies, "-p random" (default) to use a random pony.')
+parser.add_argument('-q', '--quote', action='store_true', help='Use a random quote of the pony being displayed as text')
+parser.add_argument('-c', '--center', action='store_true', help='Use a random quote of the pony being displayed as text')
+parser.add_argument('-t', '--center-text', action='store_true', help='Center the text in the bubble')
+parser.add_argument('-w', '--width', type=int, default=termwidth, help='Terminal width. Use 0 for unlimited width. Default: autodetect')
+parser.add_argument('text', type=str, nargs='*', help='The text to be placed in the speech bubble')
+args = parser.parse_args()
+
+if args.pony == "list":
+ print('\n'.join(sorted(list_ponies(True))))
+ sys.exit()
+pony = args.pony
+if pony == "random":
+ pony = random.choice(list_ponies() if not args.quote else list_ponies_with_quotes())
+text = ' '.join(args.text) or None
+if text == '-':
+ text = '\n'.join(sys.stdin.readlines())
+if args.quote:
+ text = random_quote(pony)
+
+print(render_pony(pony, text, width=args.width or sys.maxint, center=args.center, centertext=args.center_text))