goomod + 1C
Я большой поклонник игры World of Goo. Однажды пройдя ее полностью и влюбившись в смешные шарики Goo, прекрасную физику и атмосферу игры я не успокоился и выкачал все доступные дополнительные уровни, так называемые mod’ы, созданные фэнами этой игрушки. На тот момент, когда я ее проходил, а это было где-то в середине 2009 года, на сайте было негусто уровней. Помимо этого выкачал кучу разного видео, оформлений, других игрушек автора и других интересных фич, создав тем самым своего рода анталогию игры у себя на компьютере.
И вот недавно мне понадобилось освободить место на компе. Взор пал на увесистую папку с игрушками. Чтобы залить это все дело на диск, я решил зайти на сайт, проверить, не добавилось ли там еще новых уровней. Количество добавившихся модов превзошло все мои ожидания и поэтому, чтобы не выкачивать их всех вручную я решил натравить на сайт Offline Explorer. Мне удалось выкачать весь сайт, но к сожалению, как я ни старался, не смог выдрать и сами вложения. Так как из языков «программирования» у меня сейчас на компе стоит только 2С’ка, то буквально за полчаса родилась обработка, которая парсит файлы на предмет ссылок на файлы с расширением .goomod 🙂 Дальше — дело техники: в редакторе PSPad с помощью макроса привести внутренние ссылки во внешние и стравить это все дело Download Монстру. Вуаля 😉 В данной обработке расширение можно указать свое. В данном виде обработка парсит внутренние ссылки, начинающиеся с ../, но раскомментировав строки 31 и 35, и закомментировав, соответсвенно, строки 32 и 36 можно добится парсинга http:// ссылок. Привожу код обработки:
Процедура КнопкаВыполнитьНажатие(Кнопка)
gooFiles = Новый СписокЗначений;
Если ЗначениеЗаполнено(Каталог) Тогда
СписокФайлов = НайтиФайлы(Каталог, "*.*");
Для каждого htmlFile Из СписокФайлов Цикл
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(htmlFile.ПолноеИмя);
Для НомерСтроки = 1 По ТекстовыйДокумент.КоличествоСтрок() Цикл
ОбработкаПрерыванияПользователя();
СтрокаДокумента = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки);
tmpСтрокаДокумента = СтрЗаменить(СтрокаДокумента, Символ(10), " ");
ПозицияРасширения = Найти(tmpСтрокаДокумента, "." + РасширениеИскомыхФайлов);
Пока ПозицияРасширения <> 0 Цикл
Для поз = 3 По ПозицияРасширения Цикл
//http:// ../
//1234567 123
Если Сред(tmpСтрокаДокумента, ПозицияРасширения - поз, 1) = "/" Тогда
//Если Сред(tmpСтрокаДокумента, ПозицияРасширения - поз - 1, 1) = "/" Тогда //http://
Если Сред(tmpСтрокаДокумента, ПозицияРасширения - поз - 1, 1) = "."
И Сред(tmpСтрокаДокумента, ПозицияРасширения - поз - 2, 1) = "." Тогда //../
//gooFiles.Добавить(Сред(tmpСтрокаДокумента, ПозицияРасширения - поз - 6, ПозицияРасширения - (ПозицияРасширения - поз - 6) + СтрДлина(РасширениеИскомыхФайлов) + 1));
gooFiles.Добавить(Сред(tmpСтрокаДокумента, ПозицияРасширения - поз - 2, ПозицияРасширения - (ПозицияРасширения - поз - 2) + СтрДлина(РасширениеИскомыхФайлов) + 1));
прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
tmpСтрокаДокумента = Сред(tmpСтрокаДокумента, ПозицияРасширения + СтрДлина(РасширениеИскомыхФайлов) + 1);
ПозицияРасширения = Найти(tmpСтрокаДокумента, "." + РасширениеИскомыхФайлов);
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
КонецЦикла;
КонецЕсли;
//удалим дубликаты
УдаленныеЭлементы = 0;
Для file = 0 по gooFiles.Количество() - 1 Цикл
Для file_tmp = 0 по gooFiles.Количество() - 1 Цикл
Если file_tmp = file - УдаленныеЭлементы Тогда
продолжить
КонецЕсли;
Если gooFiles[file - УдаленныеЭлементы].Значение = gooFiles[file_tmp].Значение Тогда
gooFiles.Удалить(file - УдаленныеЭлементы);
УдаленныеЭлементы = УдаленныеЭлементы + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для каждого gooFile Из gooFiles Цикл
Сообщить(gooFile.Значение)
КонецЦикла;
КонецПроцедуры
Процедура КаталогНачалоВыбора(Элемент, СтандартнаяОбработка)
ДиалогФыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
ДиалогФыбораФайла.Заголовок = НСтр("ru = 'Выберите каталог файлов с ссылками на моды World of Goo'; uk = ''");
ДиалогФыбораФайла.ПредварительныйПросмотр = ЛОЖЬ;
Если ЗначениеЗаполнено(Каталог) Тогда
ДиалогФыбораФайла.Каталог = Каталог;
КонецЕсли;
//ДиалогФыбораФайла.Фильтр = "Файлы с ссылками на моды World of Goo (*.html)|*.html";
Если ДиалогФыбораФайла.Выбрать() Тогда
Каталог = ДиалогФыбораФайла.Каталог;
КонецЕсли;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Каталог = ВосстановитьЗначение("Каталог_goomod");
РасширениеИскомыхФайлов = ВосстановитьЗначение("РасширениеИскомыхФайлов_goomod");
Если НЕ ЗначениеЗаполнено(РасширениеИскомыхФайлов) Тогда
РасширениеИскомыхФайлов = "goomod"
КонецЕсли;
КонецПроцедуры
Процедура ПриЗакрытии()
СохранитьЗначение("Каталог_goomod", Каталог);
СохранитьЗначение("РасширениеИскомыхФайлов_goomod", РасширениеИскомыхФайлов);
КонецПроцедуры
Скачать: goomod.epf (Одна Загрузка)


