Beispiel #1
0
        public static async Task <FormattedText> GetFormattedCodeAsync(string code, ScriptingOptions ScriptingOptions, FormatColorScheme ColorScheme)
        {
            var script = new Script <TGlobals>(x => null, ScriptingOptions);

            script.Code = code;
            script.m_ScriptingOptions = ScriptingOptions;

            var hostedScriptRunner = script.GetOrCreateScriptRunner(Array.Empty <IParameter>(), script.Code, script.m_ScriptingOptions);
            var task   = RemoteTask.ClientComplete <FormattedText>(hostedScriptRunner.GetFormattedCodeAsync(code, ScriptingOptions, ColorScheme), CancellationToken.None);
            var result = await task;

            return(result);
        }
        internal async Task <string> InternalGetRtfFormattedCodeAsync(string scriptCode, ScriptingOptions Options, FormatColorScheme ColorScheme)
        {
            var document = GetOrCreateDocument(Array.Empty <IParameter>(), scriptCode, Options);

            document = Formatter.FormatAsync(document).Result;
            SourceText documentText = await document.GetTextAsync();

            IEnumerable <ClassifiedSpan> classifiedSpans = await Classifier.GetClassifiedSpansAsync(document, Microsoft.CodeAnalysis.Text.TextSpan.FromBounds(0, documentText.Length));

            var ranges = classifiedSpans.Select(classifiedSpan =>
                                                new Range(classifiedSpan, documentText.GetSubText(classifiedSpan.TextSpan).ToString()));

            var LineSpans = documentText.Lines.Select(x => x.SpanIncludingLineBreak);


            var result = new StringBuilder();

            // RTF Header
            result.AppendLine(@"{\rtf1\ansi\deff0");

            // RTF Color table
            var colorDefinitions = ColorScheme.GetColorsInRtfOrder().Select(x => $"\\red{x.R}\\green{x.G}\\blue{x.B};");

            result.AppendLine(@"{\colortbl;" + String.Join(String.Empty, colorDefinitions) + "}");


            var originalText = documentText.ToString();
            var codeBuilder  = new StringBuilder();

            var segmentedSpans = DivideSpans(LineSpans, ranges.Select(x => x.TextSpan)).ToArray();

            foreach (var span in segmentedSpans)
            {
                var info = ranges.SingleOrDefault(x => x.TextSpan.CompareTo(span) == 0);

                if (info != null)
                {
                    var colorIndex = ColorScheme.GetColorIndexForKeyword(info.ClassificationType);
                    codeBuilder.AppendLine(Environment.NewLine + @"\cf" + colorIndex);
                }

                var text = originalText.Substring(span.Start, span.Length);
                text = GetRtfUnicodeEscapedString(text);
                text = text.Replace(Environment.NewLine, @"\line" + Environment.NewLine);
                codeBuilder.Append(text);
            }

            result.Append(codeBuilder.ToString());
            result.AppendLine("}");

            return(result.ToString());
        }
        public RemoteTask <FormattedText> GetFormattedCodeAsync(string scriptCode, ScriptingOptions Options, FormatColorScheme ColorScheme)
        {
            var result = RemoteTask.ServerStart <FormattedText>(cts => InternalGetFormattedCodeAsync(scriptCode, Options, ColorScheme));

            return(result);
        }
        internal async Task <FormattedText> InternalGetFormattedCodeAsync(string scriptCode, ScriptingOptions Options, FormatColorScheme ColorScheme)
        {
            var document = GetOrCreateDocument(Array.Empty <IParameter>(), scriptCode, Options);

            document = Formatter.FormatAsync(document).Result;
            SourceText documentText = await document.GetTextAsync();

            IEnumerable <ClassifiedSpan> classifiedSpans = await Classifier.GetClassifiedSpansAsync(document, Microsoft.CodeAnalysis.Text.TextSpan.FromBounds(0, documentText.Length));

            var ranges = classifiedSpans.Select(classifiedSpan =>
                                                new Range(classifiedSpan, documentText.GetSubText(classifiedSpan.TextSpan).ToString()));

            var LineSpans = documentText.Lines.Select(x => x.SpanIncludingLineBreak);
            var result    = new FormattedText();

            var originalText = documentText.ToString();
            var codeBuilder  = new StringBuilder();

            var segmentedSpans = DivideSpans(LineSpans, ranges.Select(x => x.TextSpan)).ToArray();

            FormattedTextLine line = result.AppendLine();

            foreach (var span in segmentedSpans)
            {
                var info = ranges.SingleOrDefault(x => x.TextSpan.CompareTo(span) == 0);

                TextFormat format;

                if (info != null)
                {
                    var color = ColorScheme.GetColorForKeyword(info.ClassificationType);
                    format = new TextFormat(color);
                }
                else
                {
                    var color = ColorScheme.Unknown;
                    format = new TextFormat(color);
                }

                var text = originalText.Substring(span.Start, span.Length);

                if (text.EndsWith(Environment.NewLine))
                {
                    text = text.Substring(0, text.Length - Environment.NewLine.Length);
                    line.AppendText(text, format);
                    line = result.AppendLine();
                }
                else
                {
                    line.AppendText(text, format);
                }


                //{
                //text = text.Substring(0, text.Length - Environment.NewLine.Length);

                // line = result.AppendLine();

                /*  } else
                 * {
                 *    line.AppendText(text, format);
                 * }*/
            }

            return(result);
        }
        public RemoteTask <string> GetRtfFormattedCodeAsync(string originalScriptCode, ScriptingOptions Options, FormatColorScheme ColorScheme)
        {
            var result = RemoteTask.ServerStart <string>(cts => InternalGetRtfFormattedCodeAsync(originalScriptCode, Options, ColorScheme));

            return(result);
        }