Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Publicaciones sobre marave

El software libre es bueno conmigo.

Pe­ro eso no es tan im­por­tan­te, yo po­dría ga­nar­me la vi­da ha­cien­do otra co­sa. Es­toy se­gu­ro que se­ría com­pe­ten­te pa­ra al­go, aún si no se me ocu­rre na­da en es­te mo­men­to.

Más im­por­tan­te es que me da li­ber­tad pa­ra ju­ga­r. Por lo tan­to es­te post es una es­pe­cie de re­por­te de las co­sas con las que ju­gué. No jue­gos, no son lo mío, pe­ro co­sas que ha­go por di­ver­sió­n.

Sí, al­gu­nas de es­tas sig­ni­fi­can que soy un ti­po muy ra­ro.

Li­mi­tán­do­me al úl­ti­mo par de se­ma­nas o al­go así:

Hu­bo bas­tan­te in­te­rés en Ma­ra­ve, mi edi­tor sin dis­trac­cio­nes y es por­que salió en Li­nux Jour­na­l.

Leí el ar­tícu­lo (la­men­ta­ble­men­te no pue­do po­ner un li­nk) y fué su­per po­si­ti­vo, al­gu­nas ci­ta­s:

"ma­ra­ve makes the du­ll world of text edi­ting ro­man­tic and im­mer­si­ve wi­th beau­ti­ful mi­ni­ma­lis­m"

"... it does­n't just ha­ve mi­ni­ma­lism and sim­pli­ci­ty, it has mi­ni­ma­lism and sim­pli­ci­ty com­bi­ned wi­th beau­ty and a pal­pa­ble de­sign ethi­c. ma­ra­ve has sou­l, and I lo­ve tha­t."

Así que gra­cias por la ama­bi­li­dad al au­to­r, y al­go que no­té: se en­contró con un bug enor­me y no se dio cuen­ta :-)

El icono del des­tor­ni­lla­dor de­be­ría mos­trar el diá­lo­go de con­fi­gu­ra­ció­n. Sin em­bar­go, pa­re­ce que en Ubun­tu (y tal vez en otras dis­tro­s, no lo sé) no apa­re­ce, y to­do lo que se ve es que el tex­to se mue­ve un po­co. Es­to es lo que de­be­ría ha­ber vis­to:

marave15

Yo nun­ca lo pu­de re­pro­du­ci­r, pe­ro voy a ins­ta­lar una VM de Ubun­tu pa­ra ver­lo, así que tal vez pron­to.

En co­sas re­la­cio­na­da­s, ma­ra­ve salió en una re­vis­ta ale­ma­na ha­ce un par de me­s­es, pe­ro no pu­de ob­te­ner una co­pia del ar­tícu­lo. (De pa­so: no es ra­zo­na­ble en­viar una co­pia de es­tas co­sas al au­tor del pro­gra­ma que es­tás pro­ban­do? Nin­gu­na re­vis­ta no si­quie­ra me avi­só­!)

En cual­quier ca­so, si al­guien tie­ne es­ta re­vis­ta y me pue­de de­cir que di­ce el ar­tícu­lo so­bre edi­to­res sin dis­trac­cio­nes, me va a po­ner con­ten­to:

Acá es­tá el ade­lan­to del ar­tícu­lo

Y es­ta pa­re­ce ser la re­vis­ta:

https://shop.linuxnewmedia.de/store/eh01/EH10165/de/product_image/variant/bounding_product

En cuan­to a pro­yec­tos nue­vos (sí, siem­pre ten­go pro­yec­tos nue­vo­s) me en­contré con es­te ex­ce­len­te ar­tícu­lo de Ro­ger Al­sing acer­ca de apro­xi­mar la Mo­na Li­sa con 50 po­lí­go­nos <h­ttp://­ro­ge­ral­sin­g.­co­m/2008/12/07/­ge­ne­ti­c-­pro­gra­m­min­g-e­vo­lu­tio­n-o­f-­mo­na-­li­sa/ > y, sien­do un nerd con asom­bro­sas he­rra­mien­tas de pro­gra­ma­ción a mi al­can­ce... es­cri­bí un fra­mewo­rk pa­ra pro­bar esa cla­se de al­go­rit­mo­s.

Le pu­se evo­lu­to y es­tá en http://e­vo­lu­to­.­google­co­de.­com.

Só­lo hi­ce un al­go­rit­mo muy sim­ple, ba­sa­do en trián­gu­los se­mi­trans­pa­ren­tes, pe­ro fun­cio­na... mi­ra­do con ca­ri­ño.

Se pue­de ver co­mo el ojo de­re­cho se que­da tra­ba­do en un mí­ni­mo lo­cal :-)

Evo­lu­to tie­ne una bi­blio­te­ca de al­go­rit­mos (ac­tual­men­te va­cía) y se pue­den edi­tar y rea­pli­car ins­tan­tá­nea­men­te si uno quie­rem y ver las ge­ne­ra­cio­nes cam­biar en pan­ta­lla.

Ne­ce­si­ta­ría bas­tan­te tra­ba­jo pa­ra ser un pro­gra­ma pu­li­do, pe­ro al­go es al­go.

Es­tu­ve pa­vean­do con crear un pro­gra­ma pa­ra ver pre­sen­ta­cio­nes en PDF pe­ro to­da­via le fal­ta una vi­da:

109301062

En lo que es tal vez mi pro­yec­to más es­ta­ble­ci­do, rs­t2­pdf. Co­rre­gí va­rios bugs, y le es­tá ha­cien­do fal­ta un re­lea­se:

Issue 186: El texto no rodea las imágenes cuando se especifica

Lo arre­glé con una op­ción nue­va, así que el com­por­ta­mien­to por de­fault es el mis­mo, pe­ro an­da. No que­do muy bue­no, pe­ro an­da.

Issue 307: La directiva replace no funciona en header/footer en algunos casos

Fué un pro­ble­ma muy in­te­re­san­te, muy di­ver­ti­do!

hacerlo funcionar con Sphinx 1.*

Hay una par­te que si­gue ro­ta, pe­ro lo que arre­glé no fué te­rri­ble.

Desrromper bookrest

le fal­ta mu­chí­si­mo la­bu­ro, pe­ro por lo me­nos lo que an­da­ba an­tes an­da de nue­vo. Si no sa­bés que es book­res­t, es un fron­tend grá­fi­co pa­ra rs­t2­pdf / pro­ce­sa­dor de tex­to­s, acá lo ves en ac­ció­n:

Tam­bién hi­ce va­rios re­lea­ses de mis pa­que­tes de AUR

Ade­más tra­ba­jé, y al­gu­nas otras co­sas. Bas­tan­te pro­duc­ti­vo!

Marave 0.7 liberado

Ma­ra­ve es un edi­tor "re­la­ja­do" ins­pi­ra­do por om­mw­ri­te­r, Da­rk­Room y mu­chos otro. Po­see una in­ter­faz es­par­ta­na a pan­ta­lla com­ple­ta con ele­men­tos que se "des­va­ne­cen" pa­ra no in­ter­po­ner­se en­tre el usua­rio y su tex­to.

So­por­ta re­sal­ta­do de sin­ta­xis, co­rrec­tor or­to­grá­fi­co en lí­nea, mú­si­ca de fon­do, fee­dba­ck au­di­ble de te­cla­do, te­ma­s, ex­ten­sión via plu­gin­s, y mu­cho má­s.

La cap­tu­ra de pan­ta­lla obli­ga­to­ria:

marave18

No hay gran­des fea­tu­res nue­vos en 0.7 pe­ro hay cam­bios in­ter­nos gran­de­s, y bugs im­por­tan­tes co­rre­gi­do­s:

  • Co­­­rre­­gi­­do bug que ro­m­­pía abrir ar­­chi­­vos si no ha­­bía co­­­rre­c­­tor or­­to­­­grá­­fi­­co

  • Im­­ple­­men­­ta­­do so­­­po­r­­te pa­­ra len­­gua­­jes RTL

  • Va­­rios arre­­glos me­­no­­­res

  • Re­­fa­c­­to­­­rea­­do co­m­­ple­­to del co­m­­po­­­nen­­te edi­­tor

¿Tenemos tan poca idea de lo que cuesta el software?

Real­men­te, Ma­ra­ve es co­mo mu­cho un mes de pro­gra­mar par­t-­ti­me. Có­mo pue­de eso hu­ma­na­men­te ser U$S71355 o "1 año per­so­na"?

¿Es­ta ba­su­ra es lo me­jor que te­ne­mos pa­ra es­ti­mar cos­to­s? Si es así, la pr­óxi­ma vez que vean al­go co­mo "El pro­gra­ma X lle­va­ría Y años y cos­ta­ría Z dó­la­res", re­cór­ten­lo por un fac­tor de 10 o má­s.

És­to es lo que cos­tó de­sa­rro­llar Ma­ra­ve:

  • Na­­da

Bue­no, és­to es lo que hu­bie­ra cos­ta­do si lo co­bra­ra:

Es­toy su­po­nien­do unas 100 ho­ras de mi tiem­po. A mi pre­cio de "o­ja­lá me lo pa­guen", U$S 40/ho­ra, son U$S 4000, que quie­re de­cir que Oh­loh le pi­fia por un 1600%.

Por otro la­do, por tan­to tra­ba­jo free­lan­ce no te voy a co­brar pre­cio com­ple­to, lo más se­gu­ro es que te co­bra al­go co­mo U$S 20/ho­ra lo que quie­re de­cir que Oh­loh es­tá un 3000% arri­ba.

En con­clu­sió­n: si te gus­ta mi có­di­go (y lo po­dés ver por vos mis­mo), con­tra­ta­me, soy o in­creí­ble­men­te ba­ra­to o in­creí­ble­men­te rá­pi­do.

Marave 0.6 en la calle

Co­sas nue­va­s:

  • Re­s­al­­ta­­do de si­n­­ta­­xis

  • Plu­­gins

  • Bugs arre­­gla­­dos

  • Ani­­ma­­cio­­­nes más bo­­­ni­­tas

  • Li­m­­pie­­za de có­­­di­­go

Cap­tu­ra de pan­ta­lla gra­tui­ta:

Extendiendo Marave

En­ton­ces la so­lu­ció­n, en la an­ti­gua tra­di­ción de Ema­cs y Vim es... ha­cer­lo ex­ten­si­ble.

Soy un gran fan de los pro­gra­mas ex­ten­si­bles por el usua­rio.

Así que... acá es­tá la ana­to­mía de un plu­gin de Ma­ra­ve tal co­mo fun­cio­na aho­ra mis­mo en SVN trunk, lo que por su­pues­to pue­de cam­biar en cual­quier mo­men­to.

Creando un plugin

Só­lo hay que crear un ar­chi­vo .py en la car­pe­ta plu­gin­s. És­te es el plu­gin más bá­si­co, que no ha­ce na­da:

# -*- coding: utf-8 -*-

from plugins import Plugin
class Smarty(Plugin):
    name='smarty'
    shortcut='Ctrl+.'
    description='Smart quote and dash replacement'
    mode="qBde"

Va­lo­res por de­fault de al­go con­fi­gu­ra­ble (en es­te ca­so "mo­de") se po­nen en la cla­se.

Los cam­pos obli­ga­to­rio­s:

  • sho­r­­tcu­­t: un ata­­jo de te­­cla­­do que dis­­pa­­ra es­­te plu­­gin

  • na­­me: un no­m­­bre co­r­­to

  • des­­cri­p­­tio­­n: una des­­cri­p­­ción de una lí­­nea

¿Qué ha­ce es­to? Agre­ga el plu­gin a la lis­ta en el diá­lo­go de pre­fe­ren­cia­s, y se pue­de abrir el diá­lo­go de con­fi­gu­ra­ción del plu­gi­n, don­de se pue­de cam­biar el shor­tcu­t:

maraveplugin1

Si se ha­bi­li­ta es­te plu­gi­n, cuan­do el usua­rio use ese shor­tcu­t, se lla­ma al mé­to­do "run" del plu­gi­n.

Haciéndolo Configurable

És­te plu­gin so­por­ta dis­tin­tos mo­dos de ope­ra­ció­n. Pa­ra ha­cer que es­to sea ac­ce­si­ble al usua­rio, hay que im­ple­men­tar unos po­cos mé­to­dos ma­s.

El mé­to­do addCon­fi­gWi­dge­ts to­ma co­mo ar­gu­men­to un diá­lo­go, y agre­ga lo que uno quie­ra ahí:

@classmethod
def addConfigWidgets(self, dialog):
    print 'Adding widgets to smarty config'
    l=dialog.ui.layout
    self.q=QtGui.QCheckBox(dialog.tr('Replace normal quotes'))
    if 'q' in self.mode:
        self.q.setChecked(True)
    self.b=QtGui.QCheckBox(dialog.tr('Replace backtick-style quotes (` and ``)'))
    if 'B' in self.mode:
        self.b.setChecked(True)
    self.d=QtGui.QCheckBox(dialog.tr('Replace -- by en-dash, --- by em-dash'))
    if 'd' in self.mode:
        self.d.setChecked(True)
    self.e=QtGui.QCheckBox(dialog.tr('Replace ellipses'))
    if 'e' in self.mode:
        self.e.setChecked(True)
    l.addWidget(self.q)
    l.addWidget(self.b)
    l.addWidget(self.d)
    l.addWidget(self.e)

Y en­ton­ces el diá­lo­go de con­fi­gu­ra­ción se ve así:

maraveplugin2

Tam­bién que­re­mos que esas op­cio­nes se pue­dan guar­dar en al­gún la­do, en­ton­ces reim­ple­men­ta­mos save­Con­fi­g:

@classmethod
def saveConfig(self, dialog):

    self.shortcut=unicode(dialog.ui.shortcut.text())
    self.settings.setValue('plugin-'+self.name+'-shortcut', self.shortcut)

    newmode=""
    if self.q.isChecked():
        newmode+='q'
    if self.b.isChecked():
        newmode+='B'
    if self.d.isChecked():
        newmode+='d'
    if self.e.isChecked():
        newmode+='e'
    self.mode=newmode

    self.settings.setValue('plugin-smarty-mode',self.mode)
    self.settings.sync()

Y que­re­mos que esas op­cio­nes se lean an­tes de crear el plu­gi­n, en­ton­ce­s:

@classmethod
def loadConfig(self):
    print 'SMARTY loadconfig', self.settings
    if self.settings:
        sc=self.settings.value('plugin-'+self.name+'-shortcut')
        if sc.isValid():
            self.shortcut=unicode(sc.toString())
        mode=self.settings.value('plugin-smarty-mode')
        if mode.isValid():
            self.mode=unicode(mode.toString())

Que haga algo!

Y sí, hay que ha­cer que sir­va pa­ra al­go. El plu­gin tie­ne ac­ce­so a un "clien­t" que es la ven­ta­na prin­ci­pal de Ma­ra­ve. To­do es­tá ahí, en al­gu­na par­te ;-)

def run(self):
    print 'running smarty plugin'
    text=unicode(self.client.editor.toPlainText()).splitlines()
    prog=QtGui.QProgressDialog(self.client.tr("Applying smarty"),
                               self.client.tr("Cancel"),
                               0,len(text),
                               self.client)
    prog.show()
    output=[]
    for i,l in enumerate(text):
        output.append(unescape(smartyPants(l,self.mode)))
        prog.setValue(i)
        QtGui.QApplication.instance().processEvents()
    prog.hide()
    self.client.editor.setPlainText('\n'.join(output))

Y ya es­tá, si se ha­bi­li­ta el plu­gin smar­ty, se pue­den "a­rre­gla­r" las co­mi­lla­s, guio­nes y elip­sis con una com­bi­na­ción de te­clas :-)

Có­di­go fuen­te com­ple­to aquí: http://­co­de.­google.­co­m/­p/­ma­ra­ve/­sour­ce/­bro­wse/­trunk/­ma­ra­ve/­plu­gin­s/s­mar­ty.­py

Fal­ta ha­ce­r: otras ma­ne­ras de in­te­grar plu­gins en la in­ter­fa­ce, bo­to­nes, pa­ne­le­s, etc.


Contents © 2000-2023 Roberto Alsina