Wikipedysta:BotOks/AntyColorbox

Powód

Skopiowano 2010-10-10 z WP:ZDBOT, Usunięcie colorboksu z szablonów klubów sportowych (barwy klubu), być może innych podobnych

Opis zlecenia: Poruszałem już ten problem w WP:BAR, tam problem nie spotkał się ze zbyt szerokim odzewem. Wklejam całość dyskusji:

Od jakiegoś czasu modne są colorboksy w infoboksach: [1]. Czy mamy jakiś konsensus w tej sprawie (wstawiać/tępić)? Ja bym tępił.

  1. Choinka. (Choć trzeba przyznać, że nie zaburza to tak układu jak flagi).
  2. Brak jakiegokolwiek fallbacku do formy tekstowej. W przeglądarce czysto tekstowej się to poprawnie nie wyświetli.
  3. Brak jakiegokolwiek fallbacku do formy tekstowej. Daltoniści mają niezły problem.
  4. Mylące. Stal Mielec ma barwy biało-niebieskie, a nie #fff-#00f. O ile biel jest jedna, to niebieski jest szerszym pojęciem. Należałoby uźródłowić wybór konkretnego odcienia.

W grę wchodziłaby również naprawa colorboksa (dodanie fallbacka), ale szczerze mówiąc nie wyobrażam sobie jak miałoby to działać. Pozdrawiam, Skalee. 11:35, 9 wrz 2011 (CEST)

  • I jeszcze się paskudnie nazywa. Jesteśmy Wikipedią polskojęzyczną. A punkt czwarty to problem z ORem, więc estetyka jest nieistotna -- Bulwersator (dyskusja) 10:28, 10 wrz 2011 (CEST)
  • Ponad 1500 linkujących -- Bulwersator (dyskusja) 10:30, 10 wrz 2011 (CEST)

Zamierzam zastąpić kolorowe kwadraty czystym tekstem. Jestem przekonany o słuszności tej zmiany, dysponuję swoim botem, który te edycje może przeprowadzić, ale z uwagi na skalę problemu chciałem jeszcze raz zasięgnąć opinii.

Pozdrawiam, Skalee. 17:43, 26 wrz 2011 (CEST)odpowiedz

Chętni operatorzy botów: Wikipedysta:BotOks

Dyskusja:

Jest Będzie Będzie (ostatni kolor)
Blue niebiesko niebieskie
Red czerwono czerwone
itd.
Na przykład:             -> niebiesko-czerwono-niebieskie. Pozdrawiam, Skalee. 21:29, 26 wrz 2011 (CEST)odpowiedz
A skąd wiadomo iż nie był to kolor opisany jako granatowy? Albo ciemnoniebieski? -- Bulwersator (dyskusja) 22:17, 26 wrz 2011 (CEST)odpowiedz
Nie wiadomo. Zakładam, że edytor wprowadzający {{colorbox}} nie zniszczył takiej informacji i zastosował inny kolor, być może w postaci #rgb. Jeżeli zniszczył, to zastępujemy błędną informację inną błędną informacją. Nie pogarszamy sprawy, a tępimy szkodliwą praktykę. Ew. przejrzenie historii faktycznie komplikuje sprawę i moim zdaniem jest przesadą, wolałbym tego uniknąć. Być może konieczne byłoby operowanie na dumpach, być może udałoby się wykorzystać wikiblame. W każdym razie na pewno zachowam i opublikuję wykaz przeprowadzonych operacji. Pozdrawiam, Skalee. 22:29, 26 wrz 2011 (CEST)odpowiedz

Opis operacji

Zastąpienie wywołania szablonu {{colorbox}} opisem tekstowym według zasady podanej w tabeli w powyższej sekcji. Pomijane są:

  1. colorboksy poza szablonem {{Klub sportowy infobox}}
  2. colorboksy w parametrach innych niż barwy
  3. wszystkie colorboksy w parametrze jeżeli towarzyszy im jakiś tekst
  4. wszystkie colorboksy w parametrze jeżeli jeden z nich zawiera nierozpoznawany kolor

Ponieważ po każdym przejściu przez wszystkie linkujące dodaję brakujące definicje kolorów, to cofnięte zmiany bota zostaną ponownie przeprowadzone. Jeżeli z jakiegoś powodu chcesz tego uniknąć, podyskutuj o tym ze mną: Pozdrawiam, Skalee. 12:05, 10 paź 2011 (CEST).odpowiedz

Kolory interpretowane według następującej reguły:

Interpretacja Stare wartości ¹ Wartości "naciągane" ²
niebieski '#00f', '#0000ff', 'blue' #00008b', '#0000cc', '#0000cd', '#0000dd', '#1c80c6', '#00bfff', '#0099ff', '#007fff', '#00cfff', '#87cefa', '#84cfff', '#2898ff', '#3333ff', '#023d8e', '#054aa7', '#0033ff', '#003fff'
biały '#fff', '#ffffff', 'white', 'whtie', '#fffffff', 'ffffff'
czarny '#000', '#000000', 'black', '#111', '#111111'
żółty '#ff0', '#ffff00', 'yellow', '#fff000', '#fbfc71', '#fef602', '#fff300', '#fff301', '#fdee00', '#ef9b0f'
czerwony '#f00', '#ff0000', 'red', '#ff0010', '#ff2000', '#ff2400', '#ff3030', '#cc0000', '#dd0000'
zielony '#008000', 'green', '#0f0', '#00ff00' '#008800', '#008744', '#008600', '#009900', '#009600', '#006400', '#006600', '#006633', '#228b22', '#3a9d23', '#00c040', '#0f8c0a', '#017b2e'
granatowy '#000080', 'navy' 'darkblue'
pomarańczowy '#ffa500', 'orange' '#f60', '#ff6600', '#ff8c00', '#ffa000', '#ff8800', '#ff7300', '#ff6c00', '#b803ff', '#fe7f00', '#ec5302']:
fioletowy 'violet', '#b803ff'
bordowy '#800000'
purpurowy '#800080', 'purple'
złoty 'gold'
srebrny 'silver'

1 - Kolory były interpretowane głównie na podst. artykułu Kolory w Internecie (odstępstwa: #800000 jako bordowy; nie interpretowałem kolorów szarych) 2 - Po kolejnych przejściach algorytmu przeglądałem listę nierozpoznanych kolorów. Czasem jakiś kolor powtarzał się często, co wskazywało na edycję tego samego Wikipedysty (sporadycznie to sprawdzałem) albo nie pozostawiał wątpliwości interpretacyjnych (bardzo niewiele odbiegał od tego w kolumnie stare wartości), wtedy uznawałem go za "wyładniony" odcień

Wszelkie wątpliwości interpretacyjne (oraz inne problemy) robot zgłaszał na specjalnej podstronie.

Podsumowanie

Spostrzeżenia:

  1. Większość spośród pominiętych artykułów nastręczała trudności podczas interpretacji konkretnych barw. Część artykułów została później naprawiona ręcznie.
  2. Wiele artykułów zawiera błędne dane, które nijak nie wytrzymają konfrontacji z źródłami. Sprawdziłem tak kilkanaście artykułów i kilka z nich przedstawiała błędne informacje. Może warto zebrać informacje z jakichś skarbów kibica? Tutaj dane z 90minut.pl dla IV najwyższych lig polskich: Wikipedysta:BotOks/AntyColorbox/kolory. W przyszłości możliwe botowanie pod kątem takich danych.
  3. Pojęcie barw klubowych jest powszechne w Polsce, wydaje się jednak być mniej popularne poza nią. Drużyny mają swoje loga, maskotki czy wzory koszulek, ale na stronach większości zagranicznych klubów (spośród tych, które sprawdziłem, czyli ok. 20) nie doszukałem się konkretnej informacji o barwach.

Opis techniczny

Narzędzia

  • Python 2.7.2
  • pywikipedia

Listing skryptu

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

import pdb

import string
import sys
import io
import time
from re import search, split, match, sub
import re

sys.path.insert(0, 'pywikipedia')
sys.path.insert(0, '.')

del sys

import wikipedia, config

log = None
operations = None
page_name = None

unrecognized = []

class Early(Exception):
    None

def translate(color, is_last):
    global unrecognized
    #              hex short/long,    textual,    similar/misspellings
    if   color in ['#00f', '#0000ff', 'blue',     '#00008b', '#0000cc', '#0000cd', '#0000dd', '#1c80c6', '#00bfff', '#0099ff', '#007fff', '#00cfff', '#87cefa', '#84cfff', '#2898ff', '#3333ff', '#023d8e', '#054aa7', '#0033ff', '#003fff']: # #00008b uznaję za niebieski, jako że niedokładnie odpowiada granatowi i uznaję, że ktoś kombinował z dobraniem barwy
        return u'niebieskie' if is_last else u'niebiesko-'
    elif color in ['#fff', '#ffffff', 'white',    'whtie', '#fffffff', 'ffffff']:
        return u'białe' if is_last else u'biało-'
    elif color in ['#000', '#000000', 'black',    '#111', '#111111']:
        return u'czarne' if is_last else u'czarno-'
    elif color in ['#ff0', '#ffff00', 'yellow',   '#fff000', '#fbfc71', '#fef602', '#fff300', '#fff301', '#fdee00', '#ef9b0f']:
        return u'żółte' if is_last else u'żółto-'
    elif color in ['#f00', '#ff0000', 'red',      '#ff0010', '#ff2000', '#ff2400', '#ff3030', '#cc0000', '#dd0000']:
        return u'czerwone' if is_last else u'czerwono-'
    elif color in [        '#008000', 'green',    '#0f0', '#00ff00', '#008800', '#008744', '#008600', '#009900', '#009600', '#006400', '#006600', '#006633', '#228b22', '#3a9d23', '#00c040', '#0f8c0a', '#017b2e']:
        return u'zielone' if is_last else u'zielono-'
    elif color in [        '#000080', 'navy', 'darkblue']:
        return u'granatowe' if is_last else u'granatowo-'
    elif color in ['#ffa500',         'orange',   '#f60', '#ff6600', '#ff8c00', '#ffa000', '#ff8800', '#ff7300', '#ff6c00', '#b803ff', '#fe7f00', '#ec5302']:
        return u'pomarańczowe' if is_last else u'pomarańczowo-'
    elif color in [                   'violet',   '#b803ff']:
        return u'fioletowe' if is_last else u'fioletowo-'
    elif color in [        '#800000']:
        return u'bordowe' if is_last else u'bordowo-'
    elif color in [        '#800080', 'purple']:
        return u'purpurowe' if is_last else u'purpurowo-'
    elif color in [                   'gold']:
        return u'złote' if is_last else u'złoto-'
    elif color in [                   'silver']:
        return u'srebrne' if is_last else u'srebrno-'
    else:
        unrecognized.append(color)
        raise Exception("Can't translate " + color + ".")

RE_INNER_TPL  = ur"\{\{[^}]*\}\}"
RE_LINK       = ur"\[\[[^]]*\]\]"
RE_PARAM      = ur"\|(?:%s|%s|[^{}|])*" % (RE_INNER_TPL, RE_LINK)

RE_KS_INFOBOX = ur"\{\{Klub sportowy infobox\s*(%s)*\}\}" % RE_PARAM
RE_COLORBOX   = lambda capture_color: ur"\{\{\s*colorbox\s*\|(%s#?[a-z0-9]+)\s*\}\}" % (capture_color and ur"?P<color>" or ur"?:")

barwy_found = False

def fix_param(p):
    global barwy_found, page_name, operations
    if not search(u"=", p.group(0)):
        return p.group(0) # Czasami brakuje znaku =, tego błędu nie poprawiamy.
    name_part, val_part = p.group(0).split(u'=', 1)
    if name_part[1:].strip() != u"barwy":
        return p.group(0)
    barwy_found = True
    out = u""
    colorbox_found = False
    other_text_found = False

    tokenized = split(ur"(%s)" % RE_COLORBOX(False), val_part, flags=re.I)
    tokenized.reverse()
    for i in range(len(tokenized)):
        token = tokenized[i]
        m = match(ur"\A%s\Z" % RE_COLORBOX(True), token, flags=re.I)
        if m:
            out = translate(m.group('color').lower(), not colorbox_found) + out
            colorbox_found = True
        elif match(ur"\A\s*\Z", token):
            if i in [0, len(tokenized) - 1]:
                out = token + out
        else:
            other_text_found = True

    if colorbox_found and other_text_found:
        raise Exception(u"Extra text present: '%s'" % val_part.strip())
    elif colorbox_found:
        operations.write(u"%s %s -> %s\n" % (page_name.ljust(25, '.'), val_part.strip(), out.strip()))
        return u"=".join((name_part, u"".join(out)))
    else:
        raise Early(u"No colorbox found, just text: '%s'" % val_part.strip())

def fix_template(t):
    return sub(RE_PARAM, fix_param, t.group(0), flags=re.I)

def fix(src):
    global barwy_found
    barwy_found = False
    new = sub(RE_KS_INFOBOX, fix_template, src, flags=re.I)
    if barwy_found:
        return new
    else:
        raise Early(u"No parameter 'barwy' found")

def run(page):
    global page_name
    if page.title().find(':') < 0:
        time.sleep(1)
        old = page.get()
        page_name = page.title()

        try:
            new = fix(old)
            page.put(new,  maxTries=1, comment=u"Robot naprawia szablon: Wyrzucenie colorboksów z infoboksów, zlecenie [[WP:ZDBOT]] (''Usunięcie colorboksu z szablonów klubów sportowych (barwy klubu), być może innych podobnych''), szczegóły [[Wikipedysta:BotOks/AntyColorbox]].")
            msg = u"DONE:  %s" % page.title()
            time.sleep(5)
        except Early as ex:
            msg = u"GOOD:  %s %s" % (page.title().ljust(25, '.'), unicode(ex))
        except Exception as ex:
            msg = u"FAIL:  %s %s" % (page.title().ljust(25, '.'), unicode(ex))
    else:
        msg = u"OMIT:  %s" % page.title()
    print msg
    log.write(msg + '\n')


def main():
    global operations, log, unrecognized
    try:
        log = io.open('logs.txt', 'w')
        operations = io.open('operations.txt', 'a')
        klub_tpl = u"Szablon:Klub sportowy infobox"
        colb_tpl = u"Szablon:Colorbox"

        wikipedia.handleArgs()
        site = wikipedia.getSite()

        klub_page = wikipedia.Page(site, klub_tpl)
        colb_page = wikipedia.Page(site, colb_tpl)

        colb_refs = [page for page in colb_page.getReferences()]

        intersection = [page for page in klub_page.getReferences() if page in colb_refs]

        for page in intersection:
           run(page)

        unrecognized.sort()
        unrecognized_rows = map(lambda s: u"|{{colorbox|%s}}\n|%s\n|-\n" % (s, s), unrecognized)
        unrecognized_text = u"".join([u"{|\n! Wzorzec !! Zapis\n|-\n"] + unrecognized_rows + [u"|}"])
        unrec_page = wikipedia.Page(site, u"Wikipedysta:BotOks/AntyColorbox/doInterpretacji")
        unrec_page.put(unrecognized_text, maxTries=1, comment=u"Robot nie poradził sobie z następującymi kolorami.")

    finally:
        log.close()
        operations.close()

if __name__ == "__main__":
    try:
        main()
    finally:
        wikipedia.stopme()

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.
Kembali kehalaman sebelumnya