Exemple #1
0
        public async Task <JObject> GetMarkdownIt(string text)
        {
            _jsengine = _jsengine ?? JsEngineSwitcher.Instance.CreateDefaultEngine();

            var version = "8.4.0";

            if (_mardownit == null)
            {
                _mardownit = await _httpClient.GetStringAsync($"https://raw.githubusercontent.com/markdown-it/markdown-it/{version}/dist/markdown-it.min.js");

                _jsengine.Execute(_mardownit);
                _jsengine.Evaluate("var MarkdownIt = markdownit();");
            }

            var inputval = "input_" + Guid.NewGuid().ToString().Replace("-", "_");

            _jsengine.SetVariableValue(inputval, text);

            var script = $"MarkdownIt.render({inputval});";
            var result = _jsengine.Evaluate(script)?.ToString();

            _jsengine.RemoveVariable(inputval);

            var jsonResult = new JObject
            {
                ["name"]    = "markdown-it",
                ["version"] = version,
                ["html"]    = result
            };

            return(jsonResult);
        }
        public override IRow Operate(IRow row)
        {
            foreach (var field in _input)
            {
                _engine.SetVariableValue(field.Alias, row[field]);
            }
            try {
                var value = Context.Field.Convert(_engine.Evaluate(Context.Operation.Script));
                if (value == null && !_errors.ContainsKey(0))
                {
                    Context.Error($"{_engine.Name} transform in {Context.Field.Alias} returns null!");
                    _errors[0] = $"{_engine.Name} transform in {Context.Field.Alias} returns null!";
                }
                else
                {
                    row[Context.Field] = value;
                }
            } catch (JsRuntimeException jse) {
                if (!_errors.ContainsKey(jse.LineNumber))
                {
                    Context.Error("Script: " + Context.Operation.Script.Replace("{", "{{").Replace("}", "}}"));
                    Context.Error(jse, "Error Message: " + jse.Message);
                    Context.Error("Variables:");
                    foreach (var field in _input)
                    {
                        Context.Error($"{field.Alias}:{row[field]}");
                    }
                    _errors[jse.LineNumber] = jse.Message;
                }
            }


            return(row);
        }
Exemple #3
0
        public async Task <JObject> GetCommonMarkJs(string text)
        {
            _jsengine = _jsengine ?? JsEngineSwitcher.Instance.CreateDefaultEngine();

            var version = "0.28.1";

            if (_commonmarkjs == null)
            {
                _commonmarkjs = await _httpClient.GetStringAsync($"https://raw.githubusercontent.com/commonmark/commonmark.js/{version}/dist/commonmark.min.js");

                _jsengine.Execute(_commonmarkjs);
            }

            var inputval = "input_" + Guid.NewGuid().ToString().Replace("-", "_");

            _jsengine.SetVariableValue(inputval, text);

            var script = $"(new commonmark.HtmlRenderer()).render((new commonmark.Parser()).parse({inputval}));";
            var result = _jsengine.Evaluate(script)?.ToString();

            _jsengine.RemoveVariable(inputval);

            var jsonResult = new JObject
            {
                ["name"]    = "commonmark.js",
                ["version"] = version,
                ["html"]    = result
            };

            return(jsonResult);
        }
Exemple #4
0
        public static string GetCondition(List <string> constants, List <int> useConstants, string condition, string className)
        {
            GetJsEngineSwitcher();
            return(antiDupCache.GetOrAdd(condition, () =>
            {
                var js = @"var antlr4={};
antlr4.Token={};
antlr4.Token.EOF=-1;
var {3}={};
{3}.EOF = antlr4.Token.EOF;
{0}
var testNums=[{1}];
var result=[];
for(var i=0;i<testNums.length;i++){
    var _la=testNums[i];
    if({2}){
        result.push(_la)
    }
}
outResult=result.join(',');
";
                js = js.Replace("{0}", string.Join("\r\n", constants));
                js = js.Replace("{1}", string.Join(",", useConstants));
                js = js.Replace("{2}", condition);
                js = js.Replace("{3}", className);

                IJsEngine engine = JsEngineSwitcher.Current.CreateEngine(JintJsEngine.EngineName);
                engine.SetVariableValue("outResult", "");
                engine.Evaluate(js);
                var result = engine.GetVariableValue <string>("outResult");
                engine.Dispose();
                return result;
            }));
        }
Exemple #5
0
        public string Transform(string markdown)
        {
            string result;

            lock (_compilationSynchronizer)
            {
                Initialize();

                _jsEngine.SetVariableValue("_markdownString", markdown);

                result = _jsEngine.Evaluate <string>("markedHelper.compile(_markdownString)");
            }

            return(HtmlUtility.SanitizeHtml(result));
        }
Exemple #6
0
        /// <summary>
        /// Initializes a Sass compiler
        /// </summary>
        private void InitializeCompiler()
        {
            if (_initialized)
            {
                return;
            }

            lock (_initializationSynchronizer)
            {
                if (_initialized)
                {
                    return;
                }

                string serializedOptions = _jsonSerializer.SerializeObject(_options);

                try
                {
                    _jsEngine = _createJsEngineInstance();
                    _jsEngine.EmbedHostObject(FILE_MANAGER_VARIABLE_NAME, _fileManager);
                    _jsEngine.SetVariableValue(CURRENT_OS_PLATFORM_NAME, GetCurrentOSPlatformName());

                    Assembly assembly = this.GetType()
#if !NET40
                                        .GetTypeInfo()
#endif
                                        .Assembly
                    ;

                    _jsEngine.ExecuteResource(ResourceHelpers.GetResourceName(ES6_POLYFILLS_FILE_NAME), assembly, true);
                    _jsEngine.ExecuteResource(ResourceHelpers.GetResourceName(SASS_LIBRARY_FILE_NAME), assembly, true);
                    _jsEngine.ExecuteResource(ResourceHelpers.GetResourceName(SASS_HELPER_FILE_NAME), assembly, true);
                    _jsEngine.Execute($"var sassHelper = new SassHelper({serializedOptions});");

                    _version = _jsEngine.Evaluate <string>("SassHelper.getVersion();");
                }
                catch (JsEngineLoadException e)
                {
                    throw SassErrorHelpers.WrapCompilerLoadException(e);
                }
                catch (JsException e)
                {
                    throw SassErrorHelpers.WrapCompilerLoadException(e, true);
                }

                _initialized = true;
            }
        }
        public override object Evaluate(string script, params KeyValuePair <string, object>[] kvp)
        {
            object result = null;

            if (kvp != null)
            {
                foreach (var obj in kvp)
                {
                    //判定是否为值类型
                    if (obj.Value.GetType().IsValueType || obj.Value is string)
                    {
                        js.SetVariableValue(obj.Key, obj.Value);
                    }
                    else
                    {
                        js.EmbedHostObject(obj.Key, obj.Value);
                    }
                }
            }
            try
            {
                result = js.Evaluate(script);
            }
            catch (JavaScriptEngineSwitcher.Core.JsException jse)
            {
                if (jse.InnerException != null)
                {
                    if (jse.InnerException is VroomJs.JsException)
                    {
                        var vjse = (VroomJs.JsException)jse.InnerException;
                        throw new HostJsException(jse.Message, script, vjse.Line, vjse.Column);
                    }
                }
                else
                {
                    throw new HostJsException(jse.Message, script, 0, 0);
                }
            }

            return(result);
        }
Exemple #8
0
        public virtual void SettingAndGettingVariableWithUndefinedValueIsCorrect()
        {
            // Arrange
            const string variableName = "myVar1";
            object       input        = Undefined.Value;

            // Act
            _jsEngine.SetVariableValue(variableName, input);
            bool variableExists = _jsEngine.HasVariable(variableName);
            var  output         = _jsEngine.GetVariableValue(variableName);

            // Assert
            Assert.IsFalse(variableExists);
            Assert.AreEqual(input, output);
        }
Exemple #9
0
 public void SetVariableValue(string variableName, object value)
 {
     CheckDisposed();
     _engine.SetVariableValue(variableName, value);
 }
Exemple #10
0
        /// <inheritdoc />
        public IEnumerable <IDocument> Execute(IReadOnlyList <IDocument> inputs, IExecutionContext context)
        {
            HtmlParser parser = new HtmlParser();

            using (IJsEnginePool enginePool = context.GetJsEnginePool(x =>
            {
                if (string.IsNullOrWhiteSpace(_highlightJsFile))
                {
                    x.ExecuteResource("highlight-all.js", typeof(Highlight));
                }
                else
                {
                    x.ExecuteFile(_highlightJsFile);
                }
            }))
            {
                return(inputs.AsParallel().Select(context, input =>
                {
                    // We materialize the list before exiting the using statement, so safe to access enginePool
                    // ReSharper disable once AccessToDisposedClosure
                    using (IJsEngine engine = enginePool.GetEngine())
                    {
                        try
                        {
                            using (Stream stream = input.GetStream())
                                using (IHtmlDocument htmlDocument = parser.Parse(stream))
                                {
                                    foreach (AngleSharp.Dom.IElement element in htmlDocument.QuerySelectorAll(_codeQuerySelector))
                                    {
                                        // Don't highlight anything that potentially is already highlighted
                                        if (element.ClassList.Contains("hljs"))
                                        {
                                            continue;
                                        }


                                        // Make sure to use TextContent, otherwise you'll get escaped html which highlight.js won't parse
                                        engine.SetVariableValue("input", element.TextContent);

                                        // Check if they specified a language in their code block
                                        string language = element.ClassList.FirstOrDefault(i => i.StartsWith("language"));

                                        try
                                        {
                                            if (language != null)
                                            {
                                                engine.SetVariableValue("language", language.Replace("language-", ""));
                                                engine.Execute("result = hljs.highlight(language, input)");
                                            }
                                            else
                                            {
                                                language = "(auto)"; // set this to auto in case there is an exception below
                                                engine.Execute("result = hljs.highlightAuto(input)");
                                                string detectedLanguage = engine.Evaluate <string>("result.language");
                                                if (string.IsNullOrWhiteSpace(detectedLanguage) == false)
                                                {
                                                    element.ClassList.Add("language-" + detectedLanguage);
                                                }
                                            }

                                            element.ClassList.Add("hljs");
                                            string formatted = engine.Evaluate <string>("result.value");
                                            element.InnerHtml = formatted;
                                        }
                                        catch (Exception innerEx)
                                        {
                                            if (innerEx.Message.Contains("Unknown language: ") && _warnOnMissingLanguage)
                                            {
                                                Trace.Warning("Exception while highlighting source code for {0} using language {1}: {2}", input.SourceString(), language, innerEx.Message);
                                            }
                                            else
                                            {
                                                Trace.Information("Exception while highlighting source code for {0} using language {1}: {2}", input.SourceString(), language, innerEx.Message);
                                            }
                                        }
                                    }
                                    string content = htmlDocument.ToHtml();
                                    return context.GetDocument(input, content);
                                }
                        }
                        catch (Exception ex)
                        {
                            Trace.Warning("Exception while highlighting source code for {0}: {1}", input.SourceString(), ex.Message);
                            return input;
                        }
                    }
                }).ToList());
            }
        }
Exemple #11
0
 public void SetVariableValue(string variableName, object value)
 {
     jsEngine.SetVariableValue(variableName, value);
 }