ויקיפדיה:תחזוקה/קישורים לפסקאות לא קיימות

מתוך ויקיפדיה, האנציקלופדיה החופשית
הדף נמצא בשלבי עבודה: כדי למנוע התנגשויות עריכה ועבודה כפולה, אתם מתבקשים שלא לערוך את הדף בטרם תוסר ההודעה הזו, אלא אם כן תיאמתם זאת עם מניח התבנית.
אם הדף לא נערך במשך שבוע ניתן להסיר את התבנית ולערוך אותו, אך לפני כן רצוי להזכיר את התבנית למשתמש שהניח אותה, באמצעות הודעה בדף שיחתו.
הדף נמצא בשלבי עבודה: כדי למנוע התנגשויות עריכה ועבודה כפולה, אתם מתבקשים שלא לערוך את הדף בטרם תוסר ההודעה הזו, אלא אם כן תיאמתם זאת עם מניח התבנית.
אם הדף לא נערך במשך שבוע ניתן להסיר את התבנית ולערוך אותו, אך לפני כן רצוי להזכיר את התבנית למשתמש שהניח אותה, באמצעות הודעה בדף שיחתו. שיחה
קוד
from __future__ import unicode_literals
import re
from collections import Counter
import pywikibot
from pywikibot import xmlreader
from datetime import datetime
from urllib.parse import unquote

titleSectionDict = {}
pagesParsed = {}
pagesRead = {}
redirects = {}

def clean(str):
    source=str
    dotEncoded=r'\.[0-9A-E]{2}'
    dots=re.findall(dotEncoded, str)
    for dot in dots:
        str=str.replace(dot, dot.replace('.', '%'))
    encoded=r'\%[0-9A-E]{2}'
    if len(list(re.findall(encoded, str))) > 0:
       str=unquote(str)
    if not all(c.isprintable() for c in str):
       str=source
    str = str.replace('_', ' ')
    str = re.sub(r'\s\s+', ' ', str) # remove redundant spaces - they don't matter in the link to section syntax
    return str

def removeLinks(sec):
    link = re.compile(r'\[\[([^\|\[\]]+\|)[^\|\]]+\]\]')
    m = link.search(sec)
    if m == None:
        return re.sub(r'(\[\[|\]\])', '', sec)
    length = len(m.group(1))
    start = m.start(1)
    sec = sec[:start]+sec[start+length:]
    return removeLinks(sec)

def removeRedundantSpaces(sec):
    sec = re.sub(r'\s\s+', ' ', sec) # remove redundant spaces - they don't matter in the link to section syntax
    return sec.strip()

def addSection(title, sec):
    sec = removeRedundantSpaces(sec)
    titleSectionDict[(title, sec)] = True
    titleSectionDict[(title, clean(sec))] = True # also add cleaned form - as in-text section links are stored in the cleaned form

def parsePage(title):
     if title not in pagesRead:
         return
     text=pagesRead[title]
     section = re.compile(r'\=\=+\s*([^\=\n]+)\s*\=\=+')
     for sec in section.findall(text):
         sec = removeLinks(sec) # remove links - they're not included in the link to section syntax
         addSection(title, sec)
     anchor = re.compile(r'\{\{\s*עוגן\s*\|\s*([^\|\}]+)\s*[\|\}]')
     for a in anchor.findall(text):
         addSection(title, a)
     pagesParsed[title] = True

def checkSectionExists(title, sectionName):
     if (title, sectionName) not in titleSectionDict:
        if title in pagesParsed:
           return False
        else:
           if title not in pagesRead:
              return False
           else:
              parsePage(title)
        return checkSectionExists(title, sectionName)
     else:
        return True

reader = xmlreader.XmlDump(XML_DUMP_FILE)
parser = reader.parse()
linksToSections = []
# avoiding titles with hashtag by looking on full link
section_link = re.compile(r'\[\[\s*([^\|\]]+\#[^\|\]]+)\s*\|[^\]]+\]\]')
sec=re.compile(r'([^\#]+)\#([^\#]*)')
linkToOtherWiki=r'\:?([a-zA-Z]{1,3}|commons|wikt)\:.+'
fileLink=r'(File|Image|קובץ|תמונה)\:.*'
redirect=r'\#\s*(הפניה|redirect|REDIRECT)\s*\[\[([^\]\#]+).*\]\]'
for page in parser:
    if page.ns != '0' or len(page.text) == 0: continue
    if page.text[0] == '#':
       if re.match(redirect, page.text):
          result=re.compile(redirect).search(page.text)
          redirects[page.title]=clean(result.group(2))
       continue
    pagesRead[page.title] = page.text
    for sec_link in section_link.findall(page.text):
        result=sec.search(sec_link)
        dest=removeRedundantSpaces(clean(result.group(1)))
        if re.match(linkToOtherWiki, dest) or re.match(fileLink, dest):
           continue
        section=removeRedundantSpaces(clean(result.group(2)))
        linksToSections.append([page.title, dest, section])

for r in redirects:
   dest=redirects[r]
   if dest in pagesRead:
       pagesRead[r]=pagesRead[dest]

nonExistingLinksToSections = list(filter(lambda x: not checkSectionExists(x[1], x[2]), linksToSections))
nonExistingLinksToSections.sort(key = lambda x: x[1])

print('\'\'\'סה״כ %s דפים\'\'\' נכון לתאריך %s'%(len(nonExistingLinksToSections), datetime.now().strftime("%d/%m/%Y, %H:%M%:%S")))
print('\n'.join(['* [[%s#%s]] - קישור קיים ב[[%s]]'%(dest,sec,title) for (title,dest,sec) in nonExistingLinksToSections]))

דף זה מציג קישורים לפסקאות ספציפיות בדף מסוים באמצעות התחביר [[דף מקושר#פסקה מקושרת]], כאשר פסקת היעד אינה קיימת.

מה יש לעשות עבור מקרים אלה?

  • אם מזהים פסקה קיימת שנראית כמו הפסקה הרלוונטית (כך שהקישור לא עובד כעת בשל שינוי איות או ניסוח הכותרת, או בשל טעות הקלדה בשם הכותרת) - יש לשנות את ההפניה לפסקה זו.
  • בהמשך לנאמר לעיל - בחלק מהמקרים ייתכן שהערך אליו מפנים שינה שם ובעקבות זאת הקישור נשבר. מומלץ לחפש קישורים עם שם דומה, לעיתים יופיע באמצעות תבנית {{פירוש נוסף}} בראש הערך אליו מפנים.
  • אם אין פסקה רלוונטית כלל, ניתן ליצור כזו - או (ברוב המקרים) להסיר את ההפניה המיותרת לפסקה ספציפית. ככלל אין במקרה זה נזק מסוים, מלבד מידע נוסף שיצטבר בדף זה ויקשה על הטיפול בדפים מהמקרה הראשון.
  • ניתן גם להשתמש בתבנית {{עוגן}} על מנת לייצר נקודת יעד דמוית כותרת פסקה, שגם אליה ניתן יהיה לקשר באמצעות תחביר קישור לפסקה.

הדף יתעדכן מדי פעם, או לפי בקשה. אך בין ריצות מומלץ לסמן בכל פעם דף שטיפלתם בו באמצעות תבנית {{כתב מחוק}}, או למחוק אותו מהרשימה. ניתן לערוך את הרשימה עצמה בויקיפדיה:תחזוקה/קישורים לפסקאות לא קיימות/רשימה.

סה״כ 8387 דפים נכון לתאריך 22/01/2021, 21:59:00