From d8c32c68cbbbd65686e9c205e1614f690c9dba8c Mon Sep 17 00:00:00 2001 From: the1812 Date: Tue, 19 Mar 2019 17:07:22 +0800 Subject: [PATCH] Support dynamic import --- .gitignore | 1 + bilibili-evolved.offline.user.js | 10 ++++++-- bilibili-evolved.preview-offline.user.js | 10 ++++++-- bilibili-evolved.preview.user.js | 8 ++++++- bilibili-evolved.user.js | 8 ++++++- builder/dotnet/ClientBuilder.cs | 12 +++------- builder/dotnet/RegexReplacer.cs | 29 +++++++++++++++++++++++ builder/dotnet/ResourceBuilder.cs | 25 ++++++++++--------- builder/dotnet/publish/build.dll | Bin 30208 -> 31232 bytes client/resource-manager.js | 8 ++++++- 10 files changed, 84 insertions(+), 27 deletions(-) create mode 100644 builder/dotnet/RegexReplacer.cs diff --git a/.gitignore b/.gitignore index 497525037..5dbf658d2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .vscode/ builder/node/ +builder/dotnet/Properties .node_modules/ package-lock.json build.cache diff --git a/bilibili-evolved.offline.user.js b/bilibili-evolved.offline.user.js index 88a0060e6..da01641db 100644 --- a/bilibili-evolved.offline.user.js +++ b/bilibili-evolved.offline.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name Bilibili Evolved (Offline) -// @version 245.99 +// @version 246.06 // @description Bilibili Evolved 的离线版, 所有功能都已内置于脚本中. // @author Grant Howard, Coulomb-G // @copyright 2019, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G) @@ -1660,6 +1660,7 @@ class ResourceManager constructor() { this.data = Resource.all; + this.skippedImport = []; this.attributes = {}; this.styleManager = new StyleManager(this); const styleMethods = Object.getOwnPropertyNames(StyleManager.prototype).filter(it => it !== "constructor"); @@ -1712,7 +1713,12 @@ class ResourceManager import(componentName) { const resource = Resource.all[componentName]; - if (resource && resource.type.name === "html") + if (!resource) + { + this.skippedImport.push(componentName); + return; + } + if (resource.type.name === "html") { if (!resource.downloaded) { diff --git a/bilibili-evolved.preview-offline.user.js b/bilibili-evolved.preview-offline.user.js index 342686ccf..dea9f2676 100644 --- a/bilibili-evolved.preview-offline.user.js +++ b/bilibili-evolved.preview-offline.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name Bilibili Evolved (Preview Offline) -// @version 245.99 +// @version 246.06 // @description Bilibili Evolved 的预览离线版, 可以抢先体验新功能, 并且所有功能都已内置于脚本中. // @author Grant Howard, Coulomb-G // @copyright 2019, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G) @@ -1660,6 +1660,7 @@ class ResourceManager constructor() { this.data = Resource.all; + this.skippedImport = []; this.attributes = {}; this.styleManager = new StyleManager(this); const styleMethods = Object.getOwnPropertyNames(StyleManager.prototype).filter(it => it !== "constructor"); @@ -1712,7 +1713,12 @@ class ResourceManager import(componentName) { const resource = Resource.all[componentName]; - if (resource && resource.type.name === "html") + if (!resource) + { + this.skippedImport.push(componentName); + return; + } + if (resource.type.name === "html") { if (!resource.downloaded) { diff --git a/bilibili-evolved.preview.user.js b/bilibili-evolved.preview.user.js index 5e449a58d..3e5f0982c 100644 --- a/bilibili-evolved.preview.user.js +++ b/bilibili-evolved.preview.user.js @@ -1611,6 +1611,7 @@ class ResourceManager constructor() { this.data = Resource.all; + this.skippedImport = []; this.attributes = {}; this.styleManager = new StyleManager(this); const styleMethods = Object.getOwnPropertyNames(StyleManager.prototype).filter(it => it !== "constructor"); @@ -1663,7 +1664,12 @@ class ResourceManager import(componentName) { const resource = Resource.all[componentName]; - if (resource && resource.type.name === "html") + if (!resource) + { + this.skippedImport.push(componentName); + return; + } + if (resource.type.name === "html") { if (!resource.downloaded) { diff --git a/bilibili-evolved.user.js b/bilibili-evolved.user.js index 49cb3ed9d..189a5302f 100644 --- a/bilibili-evolved.user.js +++ b/bilibili-evolved.user.js @@ -1611,6 +1611,7 @@ class ResourceManager constructor() { this.data = Resource.all; + this.skippedImport = []; this.attributes = {}; this.styleManager = new StyleManager(this); const styleMethods = Object.getOwnPropertyNames(StyleManager.prototype).filter(it => it !== "constructor"); @@ -1663,7 +1664,12 @@ class ResourceManager import(componentName) { const resource = Resource.all[componentName]; - if (resource && resource.type.name === "html") + if (!resource) + { + this.skippedImport.push(componentName); + return; + } + if (resource.type.name === "html") { if (!resource.downloaded) { diff --git a/builder/dotnet/ClientBuilder.cs b/builder/dotnet/ClientBuilder.cs index 538efc16e..655cbca2f 100644 --- a/builder/dotnet/ClientBuilder.cs +++ b/builder/dotnet/ClientBuilder.cs @@ -12,17 +12,11 @@ namespace BilibiliEvolved.Build public ProjectBuilder BuildClient() { var source = File.ReadAllText("client/bilibili-evolved.js"); - var importRegex = new Regex(@"import (.*) from [""'](.*)[""'];", RegexOptions.Compiled | RegexOptions.IgnoreCase); - while (true) + source = RegexReplacer.Replace(source, @"import (.*) from [""'](.*)[""'];", match => { - var match = importRegex.Match(source); - if (!match.Success) - { - break; - } var module = File.ReadAllText("client/" + match.Groups[2].Value.Replace("./", "") + ".js").Replace("export ", ""); - source = source.Replace(match.Value, module); - } + return module; + }); File.WriteAllText(SourcePath, source); Source = File.ReadAllText(SourcePath); WriteSuccess("Client Build complete."); diff --git a/builder/dotnet/RegexReplacer.cs b/builder/dotnet/RegexReplacer.cs new file mode 100644 index 000000000..49a178386 --- /dev/null +++ b/builder/dotnet/RegexReplacer.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace BilibiliEvolved.Build +{ + static class RegexReplacer + { + public static string Replace(string text, string regexText, Func func) + { + var regex = new Regex(regexText, RegexOptions.Compiled | RegexOptions.IgnoreCase); + while (true) + { + var match = regex.Match(text); + if (!match.Success) + { + break; + } + text = text.Replace(match.Value, func(match)); + } + return text; + } + } +} \ No newline at end of file diff --git a/builder/dotnet/ResourceBuilder.cs b/builder/dotnet/ResourceBuilder.cs index d21dc62e2..459560e3f 100644 --- a/builder/dotnet/ResourceBuilder.cs +++ b/builder/dotnet/ResourceBuilder.cs @@ -142,23 +142,26 @@ namespace BilibiliEvolved.Build { if (!input.StartsWith("(() =>")) { - var importRegex = new Regex(@"import (.*) from [""'](.*)[""'];", RegexOptions.Compiled | RegexOptions.IgnoreCase); - while (true) + Func convertToRuntimeSource = source => { - var match = importRegex.Match(input); - if (!match.Success) - { - break; - } - var imported = match.Groups[1].Value.Replace(" as ", ":"); - var source = match.Groups[2].Value; var index = source.LastIndexOf("/"); if (index != -1) { source = source.Remove(0, index + 1); } - input = input.Replace(match.Value, $"const {imported} = resources.import(\"{source}\");"); - } + return source; + }; + input = RegexReplacer.Replace(input, @"import (.*) from [""'](.*)[""'];", match => + { + var imported = match.Groups[1].Value.Replace(" as ", ":"); + var source = convertToRuntimeSource(match.Groups[2].Value); + return $"const {imported} = resources.import(\"{source}\");"; + }); + input = RegexReplacer.Replace(input, @" import\((.*)\)", match => + { + var source = convertToRuntimeSource(match.Groups[1].Value); + return $" resources.importAsync(\"{source}\");"; + }); input = @"(() => { return (settings, resources) => diff --git a/builder/dotnet/publish/build.dll b/builder/dotnet/publish/build.dll index f3ac2f856c891d156f37df3fbb726eec7e3d7c4a..0ec9cbf7869eb442bc62f75be7d8a122f53c2289 100644 GIT binary patch delta 12408 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 delta 11670 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 it !== "constructor"); @@ -55,7 +56,12 @@ export class ResourceManager import(componentName) { const resource = Resource.all[componentName]; - if (resource && resource.type.name === "html") + if (!resource) + { + this.skippedImport.push(componentName); + return; + } + if (resource.type.name === "html") { if (!resource.downloaded) {