Измените .webarchive изнутри какао и запишите снова - PullRequest
0 голосов
/ 07 марта 2011

У меня есть доступ к файлу .webarchive. Мне до сих пор удалось создать веб-архив (используя PyObjC) из файла. Я хочу изменить некоторые элементы в дереве DOM и записать измененные данные.

Полагаю, мне нужен доступ к какому-либо корневому дереву DOM (веб-архив - это одна веб-страница без ссылок) с учетом веб-архива.

У кого-нибудь есть идеи, как это сделать в Какао? Спасибо

Ответы [ 2 ]

0 голосов
/ 08 марта 2011

Ваш код для загрузки WebArchive в WebView выглядит правильно (я не очень знаком с PyObjC). Модифицировать DOM довольно легко, используя методы из API WebKit ( документация ). Сложность в том, как только вы изменили DOM и хотите записать изменения обратно в WebArchive. Простое сохранение нового WebArchive не сработает, потому что это не сохранит ваши изменения, поэтому вам нужно написать новый исходный код. Вот некоторый код, который сделает это (здесь WebView webview, а оригинальный WevArchive находится в archivePath, и измененная версия также будет записана там):

//Get the string representation of the current DOM tree
NSString *sourceString = [(DOMHTMLElement *)[[[webview mainFrame] DOMDocument] documentElement] outerHTML];
NSData *sourceData = [sourceString dataUsingEncoding:NSUTF8StringEncoding];

//Load the archive from disk to a dictionary (it's a plist)
NSMutableDictionary *archive = [[NSMutableDictionary alloc] initWithContentsOfURL:[NSURL fileURLWithPath:archivePath]];
//Modify the main HTML
[(NSMutableDictionary *)[archive objectForKey:@"WebMainResource"] setObject:sourceData forKey:@"WebResourceData"];
//Write the plist back out
NSData *data = [NSPropertyListSerialization dataFromPropertyList:archive format:NSPropertyListBinaryFormat_v1_0 errorDescription:nil];
[data writeToURL:[NSURL fileURLWithPath:ArchivePath] atomically:YES];

Это немного взломано, потому что оно опирается на внутреннюю структуру архивного формата, которая не документирована, но я думаю, что вы можете с уверенностью предположить, что она не изменится кардинально.

0 голосов
/ 07 марта 2011

Возможное решение (еще не проверено)

from Foundation import *
import objc
import WebKit
from WebKit import *
d=NSData.dataWithContentsOfFile_("/tmp/x.webarchive")
ws=WebArchive.alloc().initWithData_(d)
wv=WebView.alloc().initWithFrame_frameName_groupName_(((100, 100),(100,100)), "foo",None)
mf=wv.mainFrame()
mf.loadArchive_(ws)
...