Про линки в вики
Nov. 5th, 2017 05:02 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Тут в связи с переездом всех моих сюжетов в единую платформу - fossil, решил заодно проверить, много ли у меня в соотвествующих wiki висячих ссылок.
Написал скриптик:
Результат
Что удивительно - наиболее давно разрабатываемая реальность - самая бедная (тем более что я знаю, что там еще многие существующие страницы нуждаются в серьезной доработке. Я, например на страницу Вента не залил ни одной из нарисованных еще четверть века назад и давно отсканированных карт Венты.
Все плохо и в вики по единственной законченной книге - спейсианской. Там, кстати, могут быть посчитаны не все висячие ссылки, поскольку там присутствуют страницы в формате Fossil Wiki, а вышеприведенный скрипт парсит только markdown.
Написал скриптик:
#!/usr/bin/python # -*- coding: utf-8 -*- """ Поиск висячих ссылок в fossil wiki Запускается из открытого checkout-а. Предполагает что все страницы в формате markdown """ import re,sys,os if sys.stdout.encoding != 'UTF-8': import codecs sys.stdout = codecs.getwriter('utf-8')(sys.stdout, 'strict') from subprocess import Popen,PIPE,CalledProcessError def fossil(args, stdin=None): """ Запускаем fossil с аргументами из списка args. передавая ему на вход строку stdin. Возвращает stdout. Выбрасывает CalledProcessError если fossil-у что-то не понравилось """ p=Popen(["fossil"]+args,stdin=PIPE, stdout=PIPE,stderr=PIPE) (out,err) = p.communicate(stdin) if p.returncode!=0: print >>sys.stderr,err raise CalledProcessError(p.returncode," ".join(["fossil"]+args),err) return out # # Получить список страниц и сконвертирвоать его в ключи словаря со # значениями 1 # pages=dict(map(lambda x:(x,1),fossil(["wiki","list"]).split("\n"))) # # Поскольку в конце вывода fossil wiki list есть перевод строки, # в словаре будет один лишний элемент с пустым ключом del pages[''] print "Wiki contains %d pages" % len(pages.keys()) dangling={} for page in pages: contents = fossil(["wiki","export",page]) for link in re.finditer("\(wiki\?name=([^)]+)\)",contents): linkname=link.group(1).replace("+"," ") linkname=re.sub("%([0-9A-Fa-f]{2})",lambda m:chr(int(m.group(1),16)),linkname) anchor=linkname.find("#") if anchor > -1: linkname=linkname[:anchor] if linkname in pages: continue if linkname in dangling: dangling[linkname].add(page) else: dangling[linkname]=set([page]) print "Found %d dangling links"%len(dangling.keys()) for page in sorted(dangling.keys()): print u"%-40s %s"%(page.decode("utf-8"),",".join(dangling[page]).decode("utf-8"))и погонял его на все репозитории.
Результат
репозиторий | всего страниц | висячих ссылок |
Русалки | 34 | 0 |
Ясмина | 206 | 0 |
Спейсиане | 226 | 122 |
Галактическая Федерация | 76 | 116 |
Что удивительно - наиболее давно разрабатываемая реальность - самая бедная (тем более что я знаю, что там еще многие существующие страницы нуждаются в серьезной доработке. Я, например на страницу Вента не залил ни одной из нарисованных еще четверть века назад и давно отсканированных карт Венты.
Все плохо и в вики по единственной законченной книге - спейсианской. Там, кстати, могут быть посчитаны не все висячие ссылки, поскольку там присутствуют страницы в формате Fossil Wiki, а вышеприведенный скрипт парсит только markdown.