Python: Utop sierotki w zupie

Ot, taki znak, że nie umar­łem. Dziś w programie dość popularny błąd składu, choć wielu uważa, że inter­netu reguły nie dotyczą. A sierotki wykoń­czymy tak:

import re

def sierotki(text):
    reg = re.compile(u'\\b(a|i|o|u|w|z)\\b\\s+')
    return reg.sub(u'\\1\u00a0', text)

Nie­stety, na ogół mamy do czynienia z tek­stem zawierającym znaczniki:

import re
from BeautifulSoup import BeautifulSoup

def sierotki(text):
    soup = BeautifulSoup(text)
    reg = re.compile(u'\\b(a|i|o|u|w|z)\\b\\s+')
    for val in soup.findAll(text=reg):
        val.replaceWith(reg.sub(u'\\1\u00a0', val))
    return unicode(soup)

I na koniec bonus, blok dla Django:

from django import template
register = template.Library()

@register.tag(name='sierotki')
def do_sierotki(parser, token):
    nodelist = parser.parse(('endsierotki',))
    parser.delete_first_token()
    return SierotkiNode(nodelist)

class SierotkiNode(template.Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist
    def render(self, context):
        output = self.nodelist.render(context)
        return sierotki(output)

7 Responses to “Python: Utop sierotki w zupie”


  • Czemu u’\\b(a|i|o|u|w|z)\\b\\s+’ a nie r’\b([aiouwz])\b\s+’? Wer­sja przyj­mująca HTML na wej­ściu powinna chyba robić reg.sub(r’\1 ’, val) i pomijać nie­które tagi (jak np. ).

  • 1) Po to, żeby sobie móc prosto dopisać dwuliterowe wer­sje w miarę potrzeb.
    2) Sugerujesz, że   jest krót­sze, czy bar­dziej prze­nośne (tekst, HTML, XML)?
    3) Co to znaczy pomijać nie­które tagi?

  • Ha. Do sub-a podajesz jed­nak dobry argument, co jed­nak (podob­nie jak w moim poprzed­nim komen­tarzu) zostało zin­ter­pretowane przez prze­glądarkę (encja   nie została „wyeskejpowana”).

    Nie wiedziałem, że pozwalasz w komen­tarzach na nie­które tagi HTML.

    Mówiąc o tagach miałem na myśli m.in. <pre>.

  • Do sub podaję u'\u00a0', co oznacza nie­łam­liwą spację (wcześniej fak­tycz­nie nie­chcący została roz­winięta). &nbsp; to jej bar­dzo długi, nie­prze­nośny zapis.

    Ponie­waż nie pod­mieniam białych znaków na encje HTML, nie miałem dotąd problemów z żadnymi znacz­nikami. Jedyny problem, jaki mogę sobie wyobrazić, to spój­nik poprzedzający znak końca wier­sza w elemen­tach z white-space: pre.

  • Tak, wiem jaki kod ma nie­łam­liwa spacja w unikodzie. Wcześniej­sze moje „czepial­stwa” wynikały z tego, że prze­glądarka zin­tepretowała część kodu.

    Zamiana ta może być problematyczna fak­tycz­nie wewnątrz znacz­ków z white-space: pre jeśli np. po spój­niku występuje znak tabulacja (który łapie się pod \s).

  • A Syn­Prezesa się nie odzywał?

  • Chyba jestem zboczony, bo „do_sierotki” śmier­dzi mi więzieniem.

Leave a Reply