остроwok, очень много ссылок на китайское определение или перекрестных, либо на несуществующие слова, либо с номером, простые можно добавить автоматом, а вот ошибочные надо составить список для исправления, если у вас есть алгоритм расскажите, а то у меня баговый запрос получился и в списки попали косм. и слова где см. это не помета, а слова, п тот кто добавлял тег см. к шанхайскому диалекту вобще наобум его туда ставил походу. еще есть английские see kǔgērmen(r) 苦哥儿们 но и ссылка идет на английское, а китайские вобще хоровод закольцованый, например 乞寒胡 乞寒 乞寒胡 乞寒泼胡
бкрс, 萨沙 понятно, что могут быть ошибочные, но хуже-то не будет, все равно ведь слово по ссылке надо как-то смотреть.
К тому же можно будет стопроцентно выловить неработающие ссылки - для этого алгоритм уже есть.
остроwok, алгоритм выборки есть но не расстановки рефов, например если там такое
1) бла-бла (также слово1, см.)
2) см. слово2, слово3
3) см. в шапке таблице
4) см. слово4 3)
в первом случае по идее надо удалить, но иногда там ссылки по теме если это что-то буддийское, во втором случае нужно выбрать одно из двух, в третьем случае см. вобще не ссылка, в четвертом надо открыть слово4 и скопировать от туда 3ее значение, предварительно убедившись что это именно оно. Эти варианты не поддадуться автоматизации. Я не рискну написать скрипт расстановки на 5000 слов, если у вас такой скрипт есть, поделитесь.Представляю себе следующий вариант Если найдем "см." или "см. также." и нет ссылки то еслиследующее слово не кириллицей и не скобка то обрамить [ref][/ref], а ведь наверняка есть варианты которые я не учел, тут как с авто pinyin и авто переводом с английского, главное, чтоб на выходе не получилась ерунда.
остроwok, на самом деле тут проблема преобразования [c][i] в [p]. Они часто по разному оформляются, уже года 3 за них взяться не могу.
Хотя стоит в тудушке
остроwok, бкрс, [c][i] в [p] это не главная задача, я склоняюсь, что ссылки надо править полностью включая китайские и английские 亦作“ 见“ 犹言 谓 see, в идеале полностью избавится от каскадов и циклов и некачественных точек назначений, к сожалению программированием полноценно могу только по выходным заниматься, если интересно давайте откроем клуб любителей Greasemonkey, но к сожалению качество моего программирования и знания JavaScript пока на уровне "стыдно показать людям, засмеют", а открыть 5000 вкладок в firefox и внести столько исправлений за раз не позволяют именно сомнения в качестве моих скриптов, 欲速则不达
бкрс, остроwok, вот скрипт для замены [c] в [p] работает только для примитивных случаев помета + слово, для остальных случаев, где теги намешаны в кучу не работает и может сломать карточку
использовать осторожно, обычную карточку поломает, кое-где попадаются фантики и ошибки OCR рекоммендую только для полуавтоматической правки, не для массовой, мало ли.
остроwok, если у вас firefox последних версий то там можно открыть ScratchPad нажав Shift-F4 туда копируйте код, когда открыта страница редактирования слова нажимаете Run и вуаля, только сейчас заметил не работает когда тег в теге или есть [/m] :( короче полностью автоматизировать пока не получается
бкрс, я глянул но там тоже не все варианты, бывает и что-то типа такого [c][/c] [c][/c] [c][/c], можно конечно тупо тег [с] заменить на [p] но тогда лишних тегов наплодится, основная загвоздка я так пониаю различить где курсив это курсив, а где курсив это часть пометы, не все так просто :((
имхо, регулярки — это не тот инструмент для данной задачи. ну или хотя бы не основной. нам нужен двухсторонний преобразователь dsl <-> html. объясняю, зачем.
0) парсим dsl, исправляя ошибки преобразовываем в html. (у меня такой на питоне уже написан, если что. учитывает много ошибок).
1) напильником доводим парсер до состояния, когда для _любой_ карточки он будет выдавать ровно такой же html, как и преобразователь на сайте.
суть пилить отдельный от сайта парсер в том, чтоб не на javascript его писать — ну негодный язык для обработки текста, тем более в таких количествах. к тому же, есть куча библиотек, допускающих разбор "супа из тегов" — невалидного html кода. на сайте, насколько я помню с тех времён, когда там в кишках копался, идёт банально replace тегов, и уже забота браузера из этого как-то построить DOM. так вот, нужно чтобы полученные браузером и парсером DOM'ы были идентичны для любых исходных. как это проверять автоматически, если действительно задействованы механизмы браузера — не знаю.
далее, 2) полученный html (валидный, естественно, ибо DOM), преобразовываем назад в dsl, но в последнем ошибок уже не будет.
3) из паранойи, можно ещё раз перегнать полученный dsl в html, просто для спокойной души убедиться, что html оба раза одинаковый.
ratijas, о каких ошибках идет речь? если это ошибки OCR то их только вручную и править, например распознался как 鸟 вместо 乌 или наоборот, тут никакой парсер не поможет, там еще фантики попадаются непреобразованные иногда, а если это несуществующие ссылки то только перевод из сателлитов или тщательное гугление... А если речь идет о замене тегов [i][c] на [p], то там как раз грамматика по Хомскому, задача тривиальная для студента 3-его курса, но не для меня, давно это было... а на чем писать дело десятое, хоть на lisp'е, дерзайте
бкрс, потому что регулярки в корне не предназначены для парсинга формальных языков, коие есть stateful. регулярками вы даже программу на brainf*ck не распарсите, т.к. в языке предусмотрены вложенные циклы.
萨沙, да, речь шла об ошибках синтаксиса, которые, между прочим, сильно попортили мне кровь при конвертации словаря на мак.
ratijas, да нет тут как раз примитивный случай если курсивом и черненькое то тег [i] если зелёненькое то [p], рекурсивно нужно запускать три функции: анализировать_если_никакой_тег_не_открыт(строка)
анализировать_если_попался_тегi(курсив=тру, зелень,обрезатьстроку)
анализировать_если_попался_тегс(курсив=тегiнезакрыт,зелень=тру,обрезатьстроку) как-то так, к сожалению это было очень давно, я не помню всех тонкостей
ну это на таких простых случаях. html без cdata и специальной хрени в аттибутах тоже можно регулярками, но шаг в сорону — и за вами прийдет [c]ктулху[/c]. да и у нас внутри c-i бывают теги (точно помню, что натыкался). а если не закрыт? ошибочный html или "оставить как есть"?
у меня регулярки это решили. там такое полотно на два экрана — список из шаблон-замена. и в определённом порядке, как я указал, ни-ни напутать. но решение таково, что всё-таки приходится прогнать сквозь терпеливый парсер, чтобы быть на 100% уверенным в валидности.
вот что предназначено для формальных языков, так это Форма Бэкуса — Наура и DTD, и соответствующий софт к ним. ну, конечно, это для очень серьёзных задач, и порог вхождения там намного выше)
ratijas, по хорошему надо добавить проверку на JavaScript таких случаев в окне редактирования, когда "не по ГОСТУ". Опишите все возможные случаи в wiki или на форуме на русском языке, если у вас есть время, конечно.
К тому же можно будет стопроцентно выловить неработающие ссылки - для этого алгоритм уже есть.
1) бла-бла (также слово1, см.)
2) см. слово2, слово3
3) см. в шапке таблице
4) см. слово4 3)
в первом случае по идее надо удалить, но иногда там ссылки по теме если это что-то буддийское, во втором случае нужно выбрать одно из двух, в третьем случае см. вобще не ссылка, в четвертом надо открыть слово4 и скопировать от туда 3ее значение, предварительно убедившись что это именно оно. Эти варианты не поддадуться автоматизации. Я не рискну написать скрипт расстановки на 5000 слов, если у вас такой скрипт есть, поделитесь.Представляю себе следующий вариант Если найдем "см." или "см. также." и нет ссылки то еслиследующее слово не кириллицей и не скобка то обрамить [ref][/ref], а ведь наверняка есть варианты которые я не учел, тут как с авто pinyin и авто переводом с английского, главное, чтоб на выходе не получилась ерунда.
Хотя стоит в тудушке
var obj = document.getElementById('ruf');
obj.value = obj.value.replace('[c][i]','[p]');
obj.value = obj.value.replace('[i][c]','[p]');
obj.value = obj.value.replace('[/c] ','[/p] ');
obj.value = obj.value.replace('[/i][/c]','[/p] ');
obj.value = obj.value.replace('[c] ','[p]');
obj.value = obj.value.replace(' [/c] ','[/p] ');
obj.value = obj.value.replace('[/c] [/i] ','[/p] ');
obj.value = obj.value.replace('[/i] [/c]','[/p] ');
obj.value = obj.value.replace('[/c] [/i]','[/p] ');
частный случай для см. 汉字:
var obj = document.getElementById('ruf');
obj.value = obj.value.replace('[c]','[p]');
obj.value = obj.value.replace('[i][c]','[p]');
obj.value = obj.value.replace('[/c] ','[/p] [ref]');
obj.value = obj.value.replace('[/i][/c]','[/p] [ref]');
obj.value = obj.value.replace('[c] ','[p]');
obj.value = obj.value.replace(' [/c] ','[/p] [ref]');
obj.value = obj.value.replace('[/c] [/i] ','[/p] [ref]');
obj.value = obj.value.replace('[/i] [/c]','[/p] [ref]');
obj.value = obj.value.replace('[/c] [/i]','[/p] [ref]');
obj.value = obj.value+'[/ref]';
использовать осторожно, обычную карточку поломает, кое-где попадаются фантики и ошибки OCR рекоммендую только для полуавтоматической правки, не для массовой, мало ли.
[c]хххzzz[/c]
поэтому надо регулярками, иначе будут ошибки
надо просто не полениться сделать
имхо, регулярки — это не тот инструмент для данной задачи. ну или хотя бы не основной. нам нужен двухсторонний преобразователь dsl <-> html. объясняю, зачем.
0) парсим dsl, исправляя ошибки преобразовываем в html. (у меня такой на питоне уже написан, если что. учитывает много ошибок).
1) напильником доводим парсер до состояния, когда для _любой_ карточки он будет выдавать ровно такой же html, как и преобразователь на сайте.
суть пилить отдельный от сайта парсер в том, чтоб не на javascript его писать — ну негодный язык для обработки текста, тем более в таких количествах. к тому же, есть куча библиотек, допускающих разбор "супа из тегов" — невалидного html кода. на сайте, насколько я помню с тех времён, когда там в кишках копался, идёт банально replace тегов, и уже забота браузера из этого как-то построить DOM. так вот, нужно чтобы полученные браузером и парсером DOM'ы были идентичны для любых исходных. как это проверять автоматически, если действительно задействованы механизмы браузера — не знаю.
далее, 2) полученный html (валидный, естественно, ибо DOM), преобразовываем назад в dsl, но в последнем ошибок уже не будет.
3) из паранойи, можно ещё раз перегнать полученный dsl в html, просто для спокойной души убедиться, что html оба раза одинаковый.
так вот.
могу посодействовать в реализации.
Через dom, наверное, тоже можно. Но это немного "странно".
за list отдельный респект :D
анализировать_если_попался_тегi(курсив=тру, зелень,обрезатьстроку)
анализировать_если_попался_тегс(курсив=тегiнезакрыт,зелень=тру,обрезатьстроку) как-то так, к сожалению это было очень давно, я не помню всех тонкостей
Там всего надо несколько строчек.
Они с текстом работают, а это текст.
у меня регулярки это решили. там такое полотно на два экрана — список из шаблон-замена. и в определённом порядке, как я указал, ни-ни напутать. но решение таково, что всё-таки приходится прогнать сквозь терпеливый парсер, чтобы быть на 100% уверенным в валидности.
вот что предназначено для формальных языков, так это Форма Бэкуса — Наура и DTD, и соответствующий софт к ним. ну, конечно, это для очень серьёзных задач, и порог вхождения там намного выше)
ок, займусь на выходных. благо, их будет много.