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 internetu 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)

Niestety, na ogół mamy do czynienia z tekstem 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 myśli nt. „Python: Utop sierotki w zupie

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

  2. 1) Po to, żeby sobie móc prosto dopisać dwuliterowe wersje w miarę potrzeb.
    2) Sugerujesz, że   jest krótsze, czy bardziej przenośne (tekst, HTML, XML)?
    3) Co to znaczy pomijać niektóre tagi?

  3. Ha. Do sub-a podajesz jednak dobry argument, co jednak (podobnie jak w moim poprzednim komentarzu) zostało zinterpretowane przez przeglądarkę (encja   nie została „wyeskejpowana”).

    Nie wiedziałem, że pozwalasz w komentarzach na niektóre tagi HTML.

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

  4. Do sub podaję u'\u00a0', co oznacza niełamliwą spację (wcześniej faktycznie niechcący została rozwinięta). &nbsp; to jej bardzo długi, nieprzenośny zapis.

    Ponieważ nie podmieniam białych znaków na encje HTML, nie miałem dotąd problemów z żadnymi znacznikami. Jedyny problem, jaki mogę sobie wyobrazić, to spójnik poprzedzający znak końca wiersza w elementach z white-space: pre.

  5. Tak, wiem jaki kod ma niełamliwa spacja w unikodzie. Wcześniejsze moje „czepialstwa” wynikały z tego, że przeglądarka zintepretowała część kodu.

    Zamiana ta może być problematyczna faktycznie wewnątrz znaczków z white-space: pre jeśli np. po spójniku występuje znak tabulacja (który łapie się pod \s).

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>