Files
App-Installer-For-Windows-8…/shared/html/reader.html
2026-04-04 19:27:45 +08:00

725 lines
44 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>Package Reader</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="js/module.js"></script>
<script type="text/javascript" src="js/polyfill-ie.js"></script>
<link rel="stylesheet" href="libs/winjs/1.0/css/ui-light.css" id="winjs-style-1">
<link rel="stylesheet" href="libs/winjs/2.0/css/ui-light.css" id="winjs-style">
<script type="text/javascript" src="libs/winjs/1.0/js/base.js"></script>
<script type="text/javascript" src="libs/winjs/1.0/js/ui.js"></script>
<script type="text/javascript" src="js/color.js"></script>
<script type="text/javascript" src="js/promise.js"></script>
<script type="text/javascript" src="js/bridge.js"></script>
<script type="text/javascript" src="js/dpimodes.js"></script>
<script type="text/javascript" src="js/resources.js"></script>
<script type="text/javascript" src="js/animation.js"></script>
<link rel="stylesheet" href="fonts/fonts.css">
<link rel="stylesheet" href="fonts/segx.css">
<link rel="stylesheet" href="manager/page.css">
<link rel="stylesheet" href="reader/page.css">
<script type="text/javascript" src="js/handler.js"></script>
<script type="text/javascript" src="js/event.js"></script>
<script type="text/javascript" src="js/tileback.js"></script>
<script type="text/javascript" src="js/load.js"></script>
<link rel="stylesheet" type="text/css" href="libs/msgbox/contentdlg.css">
<script type="text/javascript" src="libs/msgbox/contentdlg.js"></script>
<link rel="stylesheet" type="text/css" href="libs/msgbox/msgbox.css">
<script type="text/javascript" src="libs/msgbox/msgbox.js"></script>
<script type="text/javascript" src="js/init.js"></script>
<script type="text/javascript" src="js/pkginfo.js"></script>
<script type="text/javascript" src="js/http.js"></script>
<script type="text/javascript" src="js/storergapi.js"></script>
<script type="text/javascript" src="js/dboxapi.js"></script>
<script type="text/javascript" src="js/datasrc.js"></script>
<script type="text/javascript" src="js/appbar.js"></script>
<script type="text/javascript" src="js/pagemgr.js"></script>
<script type="text/javascript" src="js/search.js"></script>
<link rel="stylesheet" href="css/statusbar.css">
<script type="text/javascript" src="js/statusbar.js"></script>
<script type="text/javascript" src="js/rdinit.js"></script>
<style>
.itemrow {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-content: center;
justify-content: flex-start;
align-items: center;
margin: 10px 0;
}
</style>
</head>
<body>
<div id="readerpage" class="pagecontainer full">
<div class="page full guide fold">
<main class="main">
<div id="page-reader" style="display: none;" class="ispage padding">
<h2>读取</h2>
<p>请选择一个包,获取其信息。</p>
<div>
<label for="read-pkgpath">文件路径</label>
<div class="itemrow">
<input type="text" id="read-pkgpath" style="margin-right: 10px;">
<button id="read-browse">浏览</button>
</div>
<script>
(function() {
var readBrowse = document.getElementById("read-browse");
var readPkgpath = document.getElementById("read-pkgpath");
var lastDir = external.Storage.Folders.desktop;
readBrowse.onclick = function() {
var explorer = external.Storage.Explorer;
explorer.file(
"{appxpkg}|*.appx;*.appxbundle;*.msix;*.msixbundle|{allfiles}|*.*",
lastDir,
function(result) {
if (!result) return;
readPkgpath.value = result;
lastDir = external.Storage.Path.getDir(result);
}
);
};
})();
</script>
</div>
<div class="itemrow">
<input type="checkbox" id="read-usepri" style="margin-left: 0;">
<label for="read-usepri">需要解析 PRI 资源文件</label>
</div>
<style>
.part-read-button {
margin-bottom: 5px;
}
</style>
<button id="read-btn" class="part-read-button">读取</button>
<button id="read-result-save" class="part-read-button">将读取结果保存为文件</button>
<button id="read-result-xml" class="part-read-button">保存为 XML 文件</button>
<button id="read-result-json" class="part-read-button">保存为 JSON 文件</button>
<br>
<progress id="read-loading" style="display: none;"></progress>
<p style="margin-bottom: 2px; margin-top: 5px;">读取结果:</p>
<iframe id="read-result" width="100%" frameborder="0" src="report.html"></iframe>
<script>
(function() {
var readResult = document.getElementById("read-result");
var de = DomEvent;
function readResultResizeEvent(e) {
var parent = readResult.parentElement.parentElement;
var newHeight = parent.getBoundingClientRect().height - readResult.getBoundingClientRect().top - 24;
//console.log(e, parent.getBoundingClientRect().height, readResult.getBoundingClientRect().top, newHeight);
readResult.style.height = parseInt(newHeight) + "px";
}
var de_rrre = de.Utils.debounce(readResultResizeEvent, 200);
de.Monitor.observe(readResult, de.Types.position, de_rrre);
de.Monitor.observe(readResult.parentElement.parentElement, de.Types.resize, de_rrre);
})();
</script>
<script>
(function(global) {
var readBtn = document.getElementById("read-btn");
var readResult = document.getElementById("read-result");
var readPkgpath = document.getElementById("read-pkgpath");
var readBrowse = document.getElementById("read-browse");
var readUsepri = document.getElementById("read-usepri");
var readLoading = document.getElementById("read-loading");
var readSave = document.getElementById("read-result-save");
var readToXml = document.getElementById("read-result-xml");
var readToJson = document.getElementById("read-result-json");
readResult.style.display = "none";
readBtn.onclick = function() {
var self = this;
self.disabled = true;
readResult.style.display = "none";
readLoading.style.display = "";
readPkgpath.disabled = true;
readBrowse.disabled = true;
readSave.disabled = true;
readToXml.disabled = true;
readToJson.disabled = true;
readUsepri.disabled = true;
function onCompleted() {
self.disabled = false;
readPkgpath.disabled = false;
readBrowse.disabled = false;
readSave.disabled = false;
readToXml.disabled = false;
readToJson.disabled = false;
readUsepri.disabled = false;
}
if (!readPkgpath.value) {
readResult.style.display = "";
readLoading.style.display = "none";
onCompleted();
readResult.contentWindow.setReport({
status: false,
message: "请选择一个有效文件"
});
self.disabled = false;
return;
}
var pr = Package.reader;
pr.readFromPackage(readPkgpath.value, readUsepri.checked).then(function(pi) {
readLoading.style.display = "none";
readResult.style.display = "";
readResult.contentWindow.setReport(pi);
}, function(err) {
readLoading.style.display = "none";
readResult.style.display = "";
readResult.contentWindow.setReport(err);
}).done(onCompleted, onCompleted);
};
readSave.onclick = function() {
var container = document.createElement("div");
document.body.appendChild(container);
var dlg = new WinJS.UI.ContentDialog(container);
dlg.content = (function() {
var cont = document.createElement("div");
var progress = document.createElement("progress");
progress.classList.add("win-ring");
progress.style.color = "white";
var span = document.createElement("span");
span.textContent = "正在保存文件";
progress.style.marginRight = "10px";
cont.setAttribute("style", "display: flex; flex-direction: row; align-items: center; display: -ms-flexbox; -ms-flex-direction: row; -ms-align-items: center;")
cont.appendChild(progress);
cont.appendChild(span);
return cont;
})();
dlg.commands.splice(0, dlg.commands.length);
var lastDir = external.Storage.Folders.desktop;
return dlg.show().then(function(id) {
return new Promise(function(c, e) {
external.Storage.save(
"{htmlfile}|*.html;*.htm",
lastDir,
"report-" + new Date().getTime(),
c
);
});
}).then(function(filepath) {
if (!filepath) return dlg.hide().then(function() {
return dlg.dispose();
});
var file = external.Storage.getFile(filepath);
file.content = readResult.contentWindow.getReport();
return dlg.hide().then(function() {
return dlg.dispose();
});
}).then(null, function(err) {
dlg.hide().then(function() {
dlg.title = "保存时发生问题";
dlg.content = err.message || err;
dlg.commands.push(new WinJS.UI.ContentDialogCommand(
getPublicRes(800)
));
return dlg.showAsync().then(function() {
return dlg.dispose();
});
})
});
};
readToJson.onclick = function() {
var self = this;
var container = document.createElement("div");
document.body.appendChild(container);
var dlg = new WinJS.UI.ContentDialog(container);
dlg.content = (function() {
var cont = document.createElement("div");
var progress = document.createElement("progress");
progress.classList.add("win-ring");
progress.style.color = "white";
var span = document.createElement("span");
span.textContent = "正在生成 JSON 文件,请稍候... \n这可能需要比较长的时间。";
progress.style.marginRight = "10px";
cont.setAttribute("style", "display: flex; flex-direction: row; align-items: center; display: -ms-flexbox; -ms-flex-direction: row; -ms-align-items: center;")
cont.appendChild(progress);
cont.appendChild(span);
return cont;
})();
dlg.commands.splice(0, dlg.commands.length);
var lastDir = external.Storage.Folders.desktop;
return dlg.show().then(function(id) {
return new Promise(function(c, e) {
external.Storage.save(
"{jsonzipfile}|*.zip",
lastDir,
"report-" + new Date().getTime(),
c
);
});
}).then(function(filepath) {
return new Promise(function(c, e) {
if (!readPkgpath.value) {
e(new Error("请选择一个有效文件"));
return;
}
try {
var pkg = Package.reader.package(readPkgpath.value);
pkg.saveJsonFileAsync(filepath, function() {
try {
pkg.dispose();
} catch (ex) {}
c();
}, function(ex) {
try {
pkg.dispose();
} catch (ex2) {}
e(ex);
});
} catch (pex) {
e(pex);
}
}).then(function() {
return dlg.hide().then(function() {
return dlg.dispose();
});
}).then(null, function(err) {
dlg.hide().then(function() {
dlg.title = "保存时发生问题";
dlg.content = err.message || err;
dlg.commands.push(new WinJS.UI.ContentDialogCommand(
getPublicRes(800)
));
return dlg.showAsync().then(function() {
return dlg.dispose();
});
})
});
});
};
readToXml.onclick = function() {
var self = this;
var container = document.createElement("div");
document.body.appendChild(container);
var dlg = new WinJS.UI.ContentDialog(container);
dlg.content = (function() {
var cont = document.createElement("div");
var progress = document.createElement("progress");
progress.classList.add("win-ring");
progress.style.color = "white";
var span = document.createElement("span");
span.textContent = "正在生成 XML 文件,请稍候... \n这可能需要比较长的时间。";
progress.style.marginRight = "10px";
cont.setAttribute("style", "display: flex; flex-direction: row; align-items: center; display: -ms-flexbox; -ms-flex-direction: row; -ms-align-items: center;")
cont.appendChild(progress);
cont.appendChild(span);
return cont;
})();
dlg.commands.splice(0, dlg.commands.length);
var lastDir = external.Storage.Folders.desktop;
return dlg.show().then(function(id) {
return new Promise(function(c, e) {
external.Storage.save(
"{xmlzipfile}|*.zip",
lastDir,
"report-" + new Date().getTime(),
c
);
});
}).then(function(filepath) {
return new Promise(function(c, e) {
try {
if (!readPkgpath.value) {
e(new Error("请选择一个有效文件"));
return;
}
var pkg = Package.reader.package(readPkgpath.value);
pkg.saveXmlFileAsync(filepath, function() {
try {
pkg.dispose();
} catch (ex) {}
c();
}, function(ex) {
try {
pkg.dispose();
} catch (ex2) {}
e(ex);
});
} catch (pex) {
e(pex);
}
}).then(function() {
return dlg.hide().then(function() {
return dlg.dispose();
});
}).then(null, function(err) {
dlg.hide().then(function() {
dlg.title = "保存时发生问题";
dlg.content = err.message || err;
dlg.commands.push(new WinJS.UI.ContentDialogCommand(
getPublicRes(800)
));
return dlg.showAsync().then(function() {
return dlg.dispose();
});
})
});
});
};
})(this);
</script>
</div>
<div id="page-acquire" style="display: none;" class="ispage padding">
<h2>获取</h2>
<div id="acquire-forbidden" style="width: 100%;">
<p>由于来自 store.rg-adguard.net 的限制,现在暂时无法实现对包的获取。请自行打开下面 URL 进行访问。</p>
<a onclick="external.Process.open ('https://store.rg-adguard.net')">store.rg-adguard.net</a>
</div>
<div id="acquire-enable" style="width: 100%;">
<p>请在下面的输入框中输入要查询的内容,设置好参数后将进行查询。</p>
<div>
<div>
<input type="text" id="acquire-input">
<select id="acquire-valuetype" name="type">
<option value="url">分享链接</option>
<option value="ProductId">产品 ID</option>
<option value="PackageFamilyName">包系列名</option>
<option value="CategoryId">类别 ID</option>
</select>
<select id="acquire-channel" name="ring">
<option title="Windows Insider Fast" value="WIF">快速</option>
<option title="Windows Insider Slow" value="WIS">慢速</option>
<option title="Release Preview" value="RP" selected>发布预览</option>
<option title="Default OS" value="Retail">正式</option>
</select>
</div>
<div>
<div class="itemrow">
<input type="checkbox" id="acquire-smartquery" style="margin-left: 0px;">
<label for="acquire-smartquery">自动查询</label>
</div>
<button id="acquire-query">查询</button>
</div>
</div>
<style>
.acquire-item {
display: flex;
flex-direction: column;
flex-wrap: nowrap;
align-content: flex-start;
justify-content: flex-start;
width: 100%;
margin: 5px 0;
box-sizing: border-box;
padding: 5px;
border: 1px solid #ccc;
-ms-user-select: element;
user-select: all;
}
.acquire-item #name {
font-size: 11pt;
width: 100%;
line-height: 1.3em;
overflow-x: hidden;
overflow-y: hidden;
text-overflow: ellipsis;
font-weight: normal;
}
.acquire-item .medium {
width: 100%;
font-size: 10pt;
line-height: 1.2em;
font-weight: normal;
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-content: center;
justify-content: space-between;
align-items: center;
margin-top: 3px;
margin-bottom: 3px;
}
.acquire-item .medium div {
text-align: center;
flex: 0 0 auto;
}
.acquire-item .medium #ext {
text-align: left;
max-width: 100px;
/*min-width: 97px;*/
}
.acquire-item .medium div:nth-child(1),
.acquire-item .medium div:nth-child(3),
.acquire-item .medium div:nth-child(5) {
background-color: #e9fff5;
}
.acquire-item .medium div:nth-child(2),
.acquire-item .medium div:nth-child(4),
.acquire-item .medium div:nth-child(6) {
background-color: #ffffef;
}
.acquire-item .bottom {
font-weight: bold;
font-size: 9pt;
display: flex;
flex-direction: row;
align-content: center;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
}
.acquire-item #hashpart {
flex: 1;
overflow-y: hidden;
overflow-x: hidden;
text-overflow: ellipsis;
}
.acquire-item:hover {
background-color: rgba(0, 0, 0, 0.122);
}
.acquire-item #download {
cursor: pointer;
font-size: 10pt;
}
</style>
<div id="acquire-template" class="acquire-item" style="display: none;">
<div id="name" class="top" title="Identity Name">Identity Name</div>
<div class="medium">
<div id="ext" title="File Type">Appx</div>
<div id="version" title="Version">1.0.0.0</div>
<div id="architecture" title="Processor Architecture">neutral</div>
<div id="publisherId" title="Identity Publisher Id"></div>
<div id="size" title="File Size"></div>
</div>
<div class="bottom">
<div id="hashpart"><span>SHA-1: </span><span id="hash"></span></div>
<div><a download id="download" href="">点击下载</a></div>
</div>
</div>
<div id="acquire-loading">
<br>
<div class="container itemrow">
<progress class="win-ring" style="margin-right: 10px;"></progress>
<span class="win-label title" data-res-resxml="MANAGER_APP_INSTALLEDAPPS_LOADING"></span>
<br>
</div>
</div>
<div id="acquire-result" style="width: 100%;">
<p style="font-weight: normal;" title="Category ID"><span>类别 ID</span>: <span id="acquire-categoryid" style="user-select: text; -ms-user-select: element;"></span></p>
<h3>以下可能为检索到的应用</h3>
<div id="acquire-list-app" style="width: 100%;"></div>
<h3>以下可能为检索到的依赖项</h3>
<div id="acquire-list-dep" style="width: 100%;"></div>
</div>
<script>
(function(global) {
var conf = external.Config.current;
var set = conf.getSection("Settings");
var isForbidden = !set.getKey("EnableAcquire").readBool(false);
var acquireInput = document.getElementById("acquire-input");
var acquireValuetype = document.getElementById("acquire-valuetype");
var acquireChannel = document.getElementById("acquire-channel");
var acquireSmartquery = document.getElementById("acquire-smartquery");
var acquireQuery = document.getElementById("acquire-query");
var acquireResult = document.getElementById("acquire-result");
var acquireListApp = document.getElementById("acquire-list-app");
var acquireListDep = document.getElementById("acquire-list-dep");
var acquireForbidden = document.getElementById("acquire-forbidden");
var acquireEnable = document.getElementById("acquire-enable");
var acquireCategoryid = document.getElementById("acquire-categoryid");
var acquireTemplate = document.getElementById("acquire-template");
var acquireLoading = document.getElementById("acquire-loading");
var acquireLoadingRing = acquireLoading.querySelector(".win-ring");
var acquireLoadingLabel = acquireLoading.querySelector(".win-label");
acquireForbidden.style.display = isForbidden ? "" : "none";
acquireEnable.style.display = isForbidden ? "none" : "";
acquireResult.style.display = isForbidden ? "none" : "none";
var dataSrc = {
apps: new DataView.DataSource(),
deps: new DataView.DataSource()
};
var putils = Package.Utils;
var templateFunc = function(item, index) {
var node = acquireTemplate.cloneNode(true);
node.style.display = "";
node.id = "";
var lastDotIndex = item.file.lastIndexOf(".");
var fileNamePart = lastDotIndex !== -1 ? item.file.substring(0, lastDotIndex) : item.file;
var fileExtension = lastDotIndex !== -1 ? item.file.substring(lastDotIndex + 1) : "";
var identityName = putils.parsePackageFullName(fileNamePart);
node.querySelector("#name").textContent = identityName.name;
node.querySelector("#ext").textContent = fileExtension;
node.querySelector("#version").textContent = identityName.version;
node.querySelector("#architecture").textContent = identityName.architecture;
node.querySelector("#publisherId").textContent = identityName.publisherId;
node.querySelector("#size").textContent = item.size;
node.querySelector("#hash").textContent = item.sha1;
node.title = item.file;
node.querySelector("#download").href = item.url;
node.querySelector("#download").title = item.url;
return node;
};
var listView = {
apps: new DataView.ListView(acquireListApp, templateFunc),
deps: new DataView.ListView(acquireListDep, templateFunc)
};
listView.apps.bind(dataSrc.apps);
listView.deps.bind(dataSrc.deps);
var keys = Object.keys(listView);
keys.forEach(function(k, i) {
var listview = listView[k];
var p = document.createElement("p");
p.textContent = "还没有内容...";
listview.emptyView = p;
});
acquireLoading.statusBar = new TransitionPanel(acquireLoading, {
axis: "y",
speed: 500,
});
acquireSmartquery.onchange = function() {
acquireValuetype.disabled =
acquireChannel.disabled = this.checked;
};
acquireSmartquery.checked = set.getKey("AcquireSmartQuery").readBool(false);
acquireValuetype.disabled =
acquireChannel.disabled = acquireSmartquery.checked;
acquireQuery.onclick = function() {
var self = this;
self.disabled = true;
acquireResult.style.display = "none";
acquireLoadingRing.style.display = "";
acquireLoading.statusBar.show();
var queryFunc = StoreRG.xhr.parse;
if (acquireSmartquery.checked) {
queryFunc = StoreRG.xhr.smartQuery;
}
acquireInput.disabled =
acquireSmartquery.disabled =
acquireValuetype.disabled =
acquireChannel.disabled = true;
queryFunc = StoreRG.test;
acquireLoadingLabel.textContent = "正在查询...";
queryFunc(acquireInput.value, acquireValuetype.value, acquireChannel.value).then(function(result) {
acquireCategoryid.textContent = result.categoryId;
var applist = [];
var deplist = [];
result.datas.forEach(function(item, index) {
if (item.file.indexOf(".BlockMap") >= 0) return;
if (putils.isDependency(item.file)) {
deplist.push(item);
} else {
applist.push(item);
}
});
dataSrc.apps.updateList(applist, function(item) {
return item.file;
});
listView.apps.refresh();
dataSrc.deps.updateList(deplist, function(item) {
return item.file;
});
listView.deps.refresh();
acquireLoadingLabel.textContent = "已获取到 {0} 个信息"
.replace("{0}", applist.length + deplist.length);
}, function(err) {
dataSrc.apps.clear();
dataSrc.deps.clear();
listView.apps.refresh();
listView.deps.refresh();
acquireLoadingLabel.textContent = err.message || err;
return Promise.wrap();
}).done(function() {
acquireResult.style.display = "";
setTimeout(function() {
acquireLoading.statusBar.hide();
}, 10000);
self.disabled = false;
acquireLoadingRing.style.display = "none";
acquireInput.disabled =
acquireSmartquery.disabled = false;
acquireValuetype.disabled =
acquireChannel.disabled = acquireSmartquery.checked;
});
}
})(this);
</script>
</div>
</div>
</main>
<aside class="win-ui-dark">
<nav class="container">
<ul class="list top">
<li class="title">
<div role="img">&#58344;</div>
<!--<div role="placeholder"></div>-->
<span class="win-type-base" data-res-resxml="READER_APPTITLE"></span>
</li>
<script>
(function($) {
var foldBtn = document.querySelector(".page aside nav ul li.title");
var page = document.querySelector(".pagecontainer .page");
Windows.UI.Event.Util.addEvent(foldBtn, "dblclick", function() {
page.classList.toggle("fold");
});
})(this);
</script>
</ul>
<hr>
<ul class="list">
<li id="tag-reader">
<div role="img">&#57650;</div>
<span class="win-type-base" data-res-resxml="MANAGER_MANAGE"></span>
</li>
<li id="tag-acquire">
<div role="img">&#57624;</div>
<span class="win-type-base" data-res-resxml="MANAGER_MANAGE"></span>
</li>
<li id="tag-settings">
<div role="img">&#57621;</div>
<span class="win-type-base" data-res-resxml="MANAGER_SETTINGS"></span>
</li>
<script>
(function(global) {
var isexec = false;
var settag = document.getElementById("tag-settings");
Windows.UI.Event.Util.addEvent(settag, "click", function() {
if (isexec) return;
var self = this;
try {
var settingpath = external.Storage.Path.combine(external.Storage.Path.root, "settings.exe");
//var cmdline = "\"{execfile}\" manager".replace("{execfile}", settingpath);
external.Process.runAsync(
"reader",
settingpath,
1,
"",
function(ret) {
isexec = false;
self.classList.remove("selected");
}
);
isexec = true;
self.classList.add("selected");
} catch (e) {
console.error(e);
}
});
})(this);
</script>
</ul>
</nav>
</aside>
</div>
</div>
</body>
</html>