Skip to content

Commit 9251d41

Browse files
committed
Change JavaScript engine to ClearScript and update HighlightJS
1 parent dff017d commit 9251d41

10 files changed

Lines changed: 168 additions & 527 deletions

File tree

.gitmodules

Lines changed: 0 additions & 3 deletions
This file was deleted.

HighlightJS.cs

Lines changed: 34 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,67 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using Microsoft.Scripting.JavaScript;
54
using System.IO;
5+
using Microsoft.ClearScript.V8;
6+
using AngleSharp.Dom;
7+
using Microsoft.ClearScript;
68

79
namespace PowerSyntax
810
{
911
public class HighlightJS : IDisposable
1012
{
13+
class Importer
14+
{
15+
public Importer(HighlightJS hljs)
16+
{
17+
this.hljs = hljs;
18+
}
19+
20+
public object EvaluateFile(string filename)
21+
{
22+
string code = hljs.resource.ReadAllText(Path.Combine($@"\lib\{filename.Substring(2)}.js"));
23+
return hljs.engine.Evaluate(new DocumentInfo(filename), code);
24+
}
25+
26+
private HighlightJS hljs;
27+
};
28+
1129
public HighlightJS(IResourceProvider resource)
1230
{
1331
this.resource = resource;
1432

15-
runtime = new JavaScriptRuntime();
16-
engine = runtime.CreateEngine();
17-
context = engine.AcquireContext();
33+
engine = new V8ScriptEngine();
1834

19-
engine.SetGlobalFunction("require", Require);
35+
engine.AddHostObject("require", new Func<string, object>(x => {
36+
string code = resource.ReadAllText(Path.Combine($@"\lib\{x.Substring(2)}.js"));
37+
return engine.Evaluate(new DocumentInfo(x), @"(function(){ var exports = {}; var module = { exports: exports };" + code + @"; return exports === module.exports ? exports : module.exports; })()");
38+
}));
2039

21-
hljs = Require(engine, true, engine.UndefinedValue, Params(engine.Converter.FromString(@".\index"))) as JavaScriptObject;
40+
hljs = engine.Script.require(@".\index");
2241

23-
var listLanguages = hljs.GetPropertyByName("listLanguages") as JavaScriptFunction;
24-
languages = (listLanguages.Invoke(Params()) as JavaScriptArray).Select(x => engine.Converter.ToString(x)).OrderBy(x => x).ToArray();
42+
var listLanguages = hljs.GetProperty("listLanguages") as ScriptObject;
43+
var languagesArray = listLanguages.Invoke(false) as ScriptObject;
44+
var length = languagesArray.GetProperty("length") as int? ?? 0;
45+
languages = Enumerable.Range(0, length).Select(x => languagesArray.GetProperty(x).ToString()).ToArray();
2546

26-
highlightJsFunction = engine.EvaluateScriptText(@"((hljs, code, languageSubset) => hljs.highlightAuto(code, languageSubset).value)").Invoke(Params()) as JavaScriptFunction;
47+
highlightJsFunction = engine.Evaluate(@"((hljs, code, languageSubset) => hljs.highlightAuto(code, [languageSubset]).value)") as ScriptObject;
2748
}
2849

2950
public void Dispose()
3051
{
31-
highlightJsFunction.Dispose();
32-
hljs.Dispose();
33-
context.Dispose();
3452
engine.Dispose();
35-
runtime.Dispose();
3653
}
3754

3855
public IList<string> ListLanguages() => languages;
3956

4057
public string HighlightAuto(string code, string language)
4158
{
42-
return string.IsNullOrEmpty(code) ? string.Empty : engine.Converter.ToString(HighlightAuto(engine.Converter.FromString(code), engine.Converter.FromString(language)));
43-
}
44-
45-
private JavaScriptValue HighlightAuto(JavaScriptValue code, JavaScriptValue language)
46-
{
47-
return highlightJsFunction.Invoke(Params(hljs, code, Array(language)));
48-
}
49-
50-
private IEnumerable<JavaScriptValue> Params() => Enumerable.Empty<JavaScriptValue>();
51-
private IEnumerable<JavaScriptValue> Params(params JavaScriptValue[] args) => args;
52-
private JavaScriptArray Array() => engine.CreateArray(0);
53-
private JavaScriptArray Array(params JavaScriptValue[] args)
54-
{
55-
var array = engine.CreateArray(args.Length);
56-
for (int i = 0; i < args.Length; ++i)
57-
{
58-
array[i] = args[i];
59-
}
60-
return array;
61-
}
62-
63-
private JavaScriptValue Require(JavaScriptEngine engine, bool construct, JavaScriptValue thisValue, IEnumerable<JavaScriptValue> arguments)
64-
{
65-
var args = arguments
66-
.Select(x => engine.Converter.ToString(x))
67-
.Select(x => Path.Combine($@"\lib\{x.Substring(2)}.js"))
68-
.ToArray();
69-
string code = resource.ReadAllText(args[0]);
70-
71-
var old_module = engine.GetGlobalVariable("module");
72-
var old_export = engine.GetGlobalVariable("exports");
73-
try
74-
{
75-
var module = engine.CreateObject();
76-
var exports = engine.CreateObject();
77-
module.SetPropertyByName("exports", exports);
78-
engine.SetGlobalVariable("exports", exports);
79-
engine.SetGlobalVariable("module", module);
80-
engine.Execute(new Microsoft.Scripting.ScriptSource(args[0], code));
81-
var m_exports = module.GetPropertyByName("exports");
82-
return m_exports == exports ? exports : m_exports;
83-
}
84-
finally
85-
{
86-
engine.SetGlobalVariable("module", old_export);
87-
engine.SetGlobalVariable("exports", old_module);
88-
}
59+
return highlightJsFunction.Invoke(false, hljs, code, language).ToString();
8960
}
9061

91-
private JavaScriptRuntime runtime = null;
92-
private JavaScriptEngine engine = null;
93-
private JavaScriptExecutionContext context = null;
94-
private JavaScriptFunction highlightJsFunction = null;
95-
private JavaScriptObject hljs = null;
62+
private V8ScriptEngine engine = null;
63+
private ScriptObject highlightJsFunction = null;
64+
private ScriptObject hljs = null;
9665

9766
private string[] languages = null;
9867
private IResourceProvider resource = null;

LICENSE

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,13 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
7979
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
8080
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8181

82-
jsrt-dotnet
82+
ClearScript
8383
-----------------------------------------------
8484

85-
Copyright (c) 2015 Rob Paveza
85+
MIT License
86+
87+
Copyright (c) Microsoft Corporation
88+
All rights reserved.
8689

8790
Permission is hereby granted, free of charge, to any person obtaining a copy
8891
of this software and associated documentation files (the "Software"), to deal
@@ -100,4 +103,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
100103
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
101104
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
102105
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
103-
SOFTWARE.
106+
SOFTWARE.

0 commit comments

Comments
 (0)