Reimplementing file manager and code editor (untested)
TODO: Add ftp auth back
This commit is contained in:
parent
dfc2b5af17
commit
0eabe27196
205 changed files with 4044 additions and 20 deletions
|
@ -0,0 +1,16 @@
|
|||
using System.ComponentModel;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Moonlight.Features.FileManager.Configuration;
|
||||
|
||||
public class FileManagerData
|
||||
{
|
||||
[JsonProperty("MaxFileOpenSize")]
|
||||
[Description(
|
||||
"This specifies the maximum file size a user will be able to open in the file editor in kilobytes")]
|
||||
public int MaxFileOpenSize { get; set; } = 1024 * 5; // 5 MB
|
||||
|
||||
[JsonProperty("OperationTimeout")]
|
||||
[Description("This specifies the general timeout for file manager operations. This can but has not to be used by file accesses")]
|
||||
public int OperationTimeout { get; set; } = 5;
|
||||
}
|
210
Moonlight/Features/FileManager/Helpers/EditorModeDetector.cs
Normal file
210
Moonlight/Features/FileManager/Helpers/EditorModeDetector.cs
Normal file
|
@ -0,0 +1,210 @@
|
|||
namespace Moonlight.Features.FileManager.Helpers;
|
||||
|
||||
public static class EditorModeDetector
|
||||
{
|
||||
// We probably will never need every of this modes ;)
|
||||
private static readonly Dictionary<string, string[]> ExtensionIndex = new()
|
||||
{
|
||||
{ "abap", new[] { "abap" } },
|
||||
{ "abc", new[] { "abc" } },
|
||||
{ "actionscript", new[] { "as" } },
|
||||
{ "ada", new[] { "ada", "adb" } },
|
||||
{ "alda", new[] { "alda" } },
|
||||
{ "apache_conf", new[] { "htaccess", "htgroups", "htpasswd", "conf", "htaccess", "htgroups", "htpasswd" } },
|
||||
{ "apex", new[] { "apex", "cls", "trigger", "tgr" } },
|
||||
{ "aql", new[] { "aql" } },
|
||||
{ "asciidoc", new[] { "asciidoc", "adoc" } },
|
||||
{ "asl", new[] { "dsl", "asl", "asl.json" } },
|
||||
{ "assembly_x86", new[] { "asm", "a" } },
|
||||
{ "astro", new[] { "astro" } },
|
||||
{ "autohotkey", new[] { "ahk" } },
|
||||
{ "batchfile", new[] { "bat", "cmd" } },
|
||||
{ "bibtex", new[] { "bib" } },
|
||||
{ "c_cpp", new[] { "cpp", "c", "cc", "cxx", "h", "hh", "hpp", "ino" } },
|
||||
{ "c9search", new[] { "c9search_results" } },
|
||||
{ "cirru", new[] { "cirru", "cr" } },
|
||||
{ "clojure", new[] { "clj", "cljs" } },
|
||||
{ "cobol", new[] { "cbl", "cob" } },
|
||||
{ "coffee", new[] { "coffee", "cf", "cson", "cakefile" } },
|
||||
{ "coldfusion", new[] { "cfm", "cfc" } },
|
||||
{ "crystal", new[] { "cr" } },
|
||||
{ "csharp", new[] { "cs" } },
|
||||
{ "csound_document", new[] { "csd" } },
|
||||
{ "csound_orchestra", new[] { "orc" } },
|
||||
{ "csound_score", new[] { "sco" } },
|
||||
{ "css", new[] { "css" } },
|
||||
{ "curly", new[] { "curly" } },
|
||||
{ "cuttlefish", new[] { "conf" } },
|
||||
{ "d", new[] { "d", "di" } },
|
||||
{ "dart", new[] { "dart" } },
|
||||
{ "diff", new[] { "diff", "patch" } },
|
||||
{ "django", new[] { "djt", "html.djt", "dj.html", "djhtml" } },
|
||||
{ "dockerfile", new[] { "dockerfile" } },
|
||||
{ "dot", new[] { "dot" } },
|
||||
{ "drools", new[] { "drl" } },
|
||||
{ "edifact", new[] { "edi" } },
|
||||
{ "eiffel", new[] { "e", "ge" } },
|
||||
{ "ejs", new[] { "ejs" } },
|
||||
{ "elixir", new[] { "ex", "exs" } },
|
||||
{ "elm", new[] { "elm" } },
|
||||
{ "erlang", new[] { "erl", "hrl" } },
|
||||
{ "flix", new[] { "flix" } },
|
||||
{ "forth", new[] { "frt", "fs", "ldr", "fth", "4th" } },
|
||||
{ "fortran", new[] { "f", "f90" } },
|
||||
{ "fsharp", new[] { "fsi", "fs", "ml", "mli", "fsx", "fsscript" } },
|
||||
{ "fsl", new[] { "fsl" } },
|
||||
{ "ftl", new[] { "ftl" } },
|
||||
{ "gcode", new[] { "gcode" } },
|
||||
{ "gherkin", new[] { "feature" } },
|
||||
{ "gitignore", new[] { ".gitignore" } },
|
||||
{ "glsl", new[] { "glsl", "frag", "vert" } },
|
||||
{ "gobstones", new[] { "gbs" } },
|
||||
{ "golang", new[] { "go" } },
|
||||
{ "graphqlschema", new[] { "gql" } },
|
||||
{ "groovy", new[] { "groovy" } },
|
||||
{ "haml", new[] { "haml" } },
|
||||
{ "handlebars", new[] { "hbs", "handlebars", "tpl", "mustache" } },
|
||||
{ "haskell", new[] { "hs" } },
|
||||
{ "haskell_cabal", new[] { "cabal" } },
|
||||
{ "haxe", new[] { "hx" } },
|
||||
{ "hjson", new[] { "hjson" } },
|
||||
{ "html", new[] { "html", "htm", "xhtml", "vue", "we", "wpy" } },
|
||||
{ "html_elixir", new[] { "eex", "html.eex" } },
|
||||
{ "html_ruby", new[] { "erb", "rhtml", "html.erb" } },
|
||||
{ "ini", new[] { "ini", "conf", "cfg", "prefs" } },
|
||||
{ "io", new[] { "io" } },
|
||||
{ "ion", new[] { "ion" } },
|
||||
{ "jack", new[] { "jack" } },
|
||||
{ "jade", new[] { "jade", "pug" } },
|
||||
{ "java", new[] { "java" } },
|
||||
{ "javascript", new[] { "js", "jsm", "jsx", "cjs", "mjs" } },
|
||||
{ "jexl", new[] { "jexl" } },
|
||||
{ "json", new[] { "json" } },
|
||||
{ "json5", new[] { "json5" } },
|
||||
{ "jsoniq", new[] { "jq" } },
|
||||
{ "jsp", new[] { "jsp" } },
|
||||
{ "jssm", new[] { "jssm", "jssm_state" } },
|
||||
{ "jsx", new[] { "jsx" } },
|
||||
{ "julia", new[] { "jl" } },
|
||||
{ "kotlin", new[] { "kt", "kts" } },
|
||||
{ "latex", new[] { "tex", "latex", "ltx", "bib" } },
|
||||
{ "latte", new[] { "latte" } },
|
||||
{ "less", new[] { "less" } },
|
||||
{ "liquid", new[] { "liquid" } },
|
||||
{ "lisp", new[] { "lisp" } },
|
||||
{ "livescript", new[] { "ls" } },
|
||||
{ "log", new[] { "log" } },
|
||||
{ "logiql", new[] { "logic", "lql" } },
|
||||
{ "logtalk", new[] { "lgt" } },
|
||||
{ "lsl", new[] { "lsl" } },
|
||||
{ "lua", new[] { "lua" } },
|
||||
{ "luapage", new[] { "lp" } },
|
||||
{ "lucene", new[] { "lucene" } },
|
||||
{ "makefile", new[] { "makefile", "gnumakefile", "makefile", "ocamlmakefile", "make" } },
|
||||
{ "markdown", new[] { "md", "markdown" } },
|
||||
{ "mask", new[] { "mask" } },
|
||||
{ "matlab", new[] { "matlab" } },
|
||||
{ "maze", new[] { "mz" } },
|
||||
{ "mediawiki", new[] { "wiki", "mediawiki" } },
|
||||
{ "mel", new[] { "mel" } },
|
||||
{ "mips", new[] { "s", "asm" } },
|
||||
{ "mixal", new[] { "mixal" } },
|
||||
{ "mushcode", new[] { "mc", "mush" } },
|
||||
{ "mysql", new[] { "mysql" } },
|
||||
{ "nasal", new[] { "nas" } },
|
||||
{ "nginx", new[] { "nginx", "conf" } },
|
||||
{ "nim", new[] { "nim" } },
|
||||
{ "nix", new[] { "nix" } },
|
||||
{ "nsis", new[] { "nsi", "nsh" } },
|
||||
{ "nunjucks", new[] { "nunjucks", "nunjs", "nj", "njk" } },
|
||||
{ "objectivec", new[] { "m", "mm" } },
|
||||
{ "ocaml", new[] { "ml", "mli" } },
|
||||
{ "odin", new[] { "odin" } },
|
||||
{ "partiql", new[] { "partiql", "pql" } },
|
||||
{ "pascal", new[] { "pas", "p" } },
|
||||
{ "perl", new[] { "pl", "pm" } },
|
||||
{ "pgsql", new[] { "pgsql" } },
|
||||
{ "php", new[] { "php", "inc", "phtml", "shtml", "php3", "php4", "php5", "phps", "phpt", "aw", "ctp", "module" } },
|
||||
{ "php_laravel_blade", new[] { "blade.php" } },
|
||||
{ "pig", new[] { "pig" } },
|
||||
{ "plsql", new[] { "plsql" } },
|
||||
{ "powershell", new[] { "ps1" } },
|
||||
{ "praat", new[] { "praat", "praatscript", "psc", "proc" } },
|
||||
{ "prisma", new[] { "prisma" } },
|
||||
{ "prolog", new[] { "plg", "prolog" } },
|
||||
{ "properties", new[] { "properties" } },
|
||||
{ "protobuf", new[] { "proto" } },
|
||||
{ "prql", new[] { "prql" } },
|
||||
{ "puppet", new[] { "epp", "pp" } },
|
||||
{ "python", new[] { "py" } },
|
||||
{ "qml", new[] { "qml" } },
|
||||
{ "r", new[] { "r" } },
|
||||
{ "raku", new[] { "raku", "rakumod", "rakutest", "p6", "pl6", "pm6" } },
|
||||
{ "razor", new[] { "cshtml", "asp" } },
|
||||
{ "rdoc", new[] { "rd" } },
|
||||
{ "red", new[] { "red", "reds" } },
|
||||
{ "rhtml", new[] { "rhtml" } },
|
||||
{ "robot", new[] { "robot", "resource" } },
|
||||
{ "rst", new[] { "rst" } },
|
||||
{ "ruby", new[] { "rb", "ru", "gemspec", "rake", "guardfile", "rakefile", "gemfile" } },
|
||||
{ "rust", new[] { "rs" } },
|
||||
{ "sac", new[] { "sac" } },
|
||||
{ "sass", new[] { "sass" } },
|
||||
{ "scad", new[] { "scad" } },
|
||||
{ "scala", new[] { "scala", "sbt" } },
|
||||
{ "scheme", new[] { "scm", "sm", "rkt", "oak", "scheme" } },
|
||||
{ "scrypt", new[] { "scrypt" } },
|
||||
{ "scss", new[] { "scss" } },
|
||||
{ "sh", new[] { "sh", "bash", ".bashrc" } },
|
||||
{ "sjs", new[] { "sjs" } },
|
||||
{ "slim", new[] { "slim", "skim" } },
|
||||
{ "smarty", new[] { "smarty", "tpl" } },
|
||||
{ "smithy", new[] { "smithy" } },
|
||||
{ "snippets", new[] { "snippets" } },
|
||||
{ "soy_template", new[] { "soy" } },
|
||||
{ "space", new[] { "space" } },
|
||||
{ "sparql", new[] { "rq" } },
|
||||
{ "sql", new[] { "sql" } },
|
||||
{ "sqlserver", new[] { "sqlserver" } },
|
||||
{ "stylus", new[] { "styl", "stylus" } },
|
||||
{ "svg", new[] { "svg" } },
|
||||
{ "swift", new[] { "swift" } },
|
||||
{ "tcl", new[] { "tcl" } },
|
||||
{ "terraform", new[] { "tf", "tfvars", "terragrunt" } },
|
||||
{ "tex", new[] { "tex" } },
|
||||
{ "text", new[] { "txt" } },
|
||||
{ "textile", new[] { "textile" } },
|
||||
{ "toml", new[] { "toml" } },
|
||||
{ "tsx", new[] { "tsx" } },
|
||||
{ "turtle", new[] { "ttl" } },
|
||||
{ "twig", new[] { "twig", "swig" } },
|
||||
{ "typescript", new[] { "ts", "mts", "cts", "typescript", "str" } },
|
||||
{ "vala", new[] { "vala" } },
|
||||
{ "vbscript", new[] { "vbs", "vb" } },
|
||||
{ "velocity", new[] { "vm" } },
|
||||
{ "verilog", new[] { "v", "vh", "sv", "svh" } },
|
||||
{ "vhdl", new[] { "vhd", "vhdl" } },
|
||||
{ "visualforce", new[] { "vfp", "component", "page" } },
|
||||
{ "wollok", new[] { "wlk", "wpgm", "wtest" } },
|
||||
{ "xml", new[] { "xml", "rdf", "rss", "wsdl", "xslt", "atom", "mathml", "mml", "xul", "xbl", "xaml" } },
|
||||
{ "xquery", new[] { "xq" } },
|
||||
{ "yaml", new[] { "yaml", "yml" } },
|
||||
{ "zeek", new[] { "zeek", "bro" } }
|
||||
};
|
||||
|
||||
public static string GetModeFromFile(string fileName)
|
||||
{
|
||||
var extension = Path.GetExtension(fileName).Replace(".", "");
|
||||
|
||||
if (string.IsNullOrEmpty(extension))
|
||||
return "text";
|
||||
|
||||
foreach (var entry in ExtensionIndex)
|
||||
{
|
||||
if (entry.Value.Any(x => string.Equals(x, extension, StringComparison.InvariantCultureIgnoreCase)))
|
||||
return entry.Key;
|
||||
}
|
||||
|
||||
return "text";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
using Moonlight.Core.Services.Utils;
|
||||
using Moonlight.Features.FileManager.Services;
|
||||
|
||||
namespace Moonlight.Features.FileManager.Http.Controllers;
|
||||
|
||||
[ApiController]
|
||||
[Route("api/upload")]
|
||||
public class UploadController : Controller
|
||||
{
|
||||
private readonly JwtService JwtService;
|
||||
private readonly SharedFileAccessService SharedFileAccessService;
|
||||
|
||||
public UploadController(
|
||||
JwtService jwtService,
|
||||
SharedFileAccessService sharedFileAccessService)
|
||||
{
|
||||
JwtService = jwtService;
|
||||
SharedFileAccessService = sharedFileAccessService;
|
||||
}
|
||||
|
||||
// The following method/api endpoint needs some explanation:
|
||||
// Because of blazor and dropzone.js, we need an api endpoint
|
||||
// to upload files via the built in file manager.
|
||||
// As we learned from user experiences in v1b
|
||||
// a large data transfer via the signal r connection might lead to
|
||||
// failing uploads for some users with a unstable connection. That's
|
||||
// why we implement this api endpoint. It can potentially prevent
|
||||
// upload from malicious scripts as well. To verify the user is
|
||||
// authenticated we use a jwt.
|
||||
// The jwt specifies what
|
||||
// connection we want to upload the file. This jwt
|
||||
// will be generated every 5 minutes in the file upload service
|
||||
// and only last 6 minutes.
|
||||
|
||||
|
||||
[HttpPost]
|
||||
public async Task<ActionResult> Upload([FromQuery(Name = "token")] string uploadToken)
|
||||
{
|
||||
// Check if a file exist and if it is not too big
|
||||
if (!Request.Form.Files.Any())
|
||||
return BadRequest("File is missing in request");
|
||||
|
||||
if (Request.Form.Files.Count > 1)
|
||||
return BadRequest("Too many files sent");
|
||||
|
||||
// Validate request
|
||||
if (!await JwtService.Validate(uploadToken, "FileUpload"))
|
||||
return StatusCode(403);
|
||||
|
||||
var uploadContext = await JwtService.Decode(uploadToken);
|
||||
|
||||
if (!uploadContext.ContainsKey("FileAccessId"))
|
||||
return BadRequest();
|
||||
|
||||
if (!int.TryParse(uploadContext["FileAccessId"], out int fileAccessId))
|
||||
return BadRequest();
|
||||
|
||||
// Load file access for this file
|
||||
var fileAccess = await SharedFileAccessService.Get(fileAccessId);
|
||||
|
||||
if (fileAccess == null)
|
||||
return BadRequest("Invalid file access id");
|
||||
|
||||
// Actually upload the file
|
||||
var file = Request.Form.Files.First();
|
||||
await fileAccess.WriteFileStream(file.FileName, file.OpenReadStream());
|
||||
|
||||
// Cleanup
|
||||
fileAccess.Dispose();
|
||||
|
||||
return Ok();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
namespace Moonlight.Features.FileManager.Models.Abstractions.FileAccess;
|
||||
|
||||
public class FileEntry
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public long Size { get; set; }
|
||||
public bool IsFile { get; set; }
|
||||
public bool IsDirectory { get; set; }
|
||||
public DateTime LastModifiedAt { get; set; }
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
namespace Moonlight.Features.FileManager.Models.Abstractions.FileAccess;
|
||||
|
||||
public interface IFileAccess : IDisposable
|
||||
{
|
||||
public Task<FileEntry[]> List();
|
||||
public Task ChangeDirectory(string relativePath);
|
||||
public Task SetDirectory(string path);
|
||||
public Task<string> GetCurrentDirectory();
|
||||
public Task Delete(string path);
|
||||
public Task Move(string from, string to);
|
||||
public Task CreateDirectory(string name);
|
||||
public Task CreateFile(string name);
|
||||
public Task<string> ReadFile(string name);
|
||||
public Task WriteFile(string name, string content);
|
||||
public Task<Stream> ReadFileStream(string name);
|
||||
public Task WriteFileStream(string name, Stream dataStream);
|
||||
public IFileAccess Clone();
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
namespace Moonlight.Features.FileManager.Models.Abstractions.FileAccess;
|
||||
|
||||
public interface IFileCompressAccess
|
||||
{
|
||||
public Task Compress(string[] names);
|
||||
public Task Decompress(string name);
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
namespace Moonlight.Features.FileManager.Models.Abstractions.FileAccess;
|
||||
|
||||
public interface IFileLaunchAccess
|
||||
{
|
||||
public Task<string> GetLaunchUrl();
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
namespace Moonlight.Features.FileManager.Models.Abstractions;
|
||||
|
||||
public class FileUpload
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public Stream Stream { get; set; }
|
||||
public long Size { get; set; }
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
namespace Moonlight.Features.FileManager.Models.Abstractions;
|
||||
|
||||
public class FileUploadConnection
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public string Url { get; set; }
|
||||
public Func<FileUpload, Task>? OnFileReceived { get; set; }
|
||||
public Func<string, Task>? OnUrlChanged { get; set; }
|
||||
public DateTime LastSeenAt { get; set; } = DateTime.UtcNow;
|
||||
}
|
25
Moonlight/Features/FileManager/Services/DropzoneService.cs
Normal file
25
Moonlight/Features/FileManager/Services/DropzoneService.cs
Normal file
|
@ -0,0 +1,25 @@
|
|||
using Microsoft.JSInterop;
|
||||
using MoonCore.Attributes;
|
||||
|
||||
namespace Moonlight.Features.FileManager.Services;
|
||||
|
||||
[Scoped]
|
||||
public class DropzoneService
|
||||
{
|
||||
private readonly IJSRuntime JsRuntime;
|
||||
|
||||
public DropzoneService(IJSRuntime jsRuntime)
|
||||
{
|
||||
JsRuntime = jsRuntime;
|
||||
}
|
||||
|
||||
public async Task Create(string id, string initialUrl)
|
||||
{
|
||||
await JsRuntime.InvokeVoidAsync("moonlight.dropzone.create", id, initialUrl);
|
||||
}
|
||||
|
||||
public async Task UpdateUrl(string id, string url)
|
||||
{
|
||||
await JsRuntime.InvokeVoidAsync("moonlight.dropzone.updateUrl", id, url);
|
||||
}
|
||||
}
|
35
Moonlight/Features/FileManager/Services/EditorService.cs
Normal file
35
Moonlight/Features/FileManager/Services/EditorService.cs
Normal file
|
@ -0,0 +1,35 @@
|
|||
using Microsoft.JSInterop;
|
||||
using MoonCore.Attributes;
|
||||
|
||||
namespace Moonlight.Features.FileManager.Services;
|
||||
|
||||
[Scoped]
|
||||
public class EditorService
|
||||
{
|
||||
private readonly IJSRuntime JsRuntime;
|
||||
|
||||
public EditorService(IJSRuntime jsRuntime)
|
||||
{
|
||||
JsRuntime = jsRuntime;
|
||||
}
|
||||
|
||||
public async Task Create(string mount, string theme = "one_dark", string mode = "text", string initialContent = "",
|
||||
int lines = 30, int fontSize = 15)
|
||||
{
|
||||
await JsRuntime.InvokeVoidAsync(
|
||||
"moonlight.editor.create",
|
||||
mount,
|
||||
theme,
|
||||
mode,
|
||||
initialContent,
|
||||
lines,
|
||||
fontSize
|
||||
);
|
||||
}
|
||||
|
||||
public async Task SetValue(string content) => await JsRuntime.InvokeVoidAsync("moonlight.editor.setValue", content);
|
||||
|
||||
public async Task<string> GetValue() => await JsRuntime.InvokeAsync<string>("moonlight.editor.getValue");
|
||||
|
||||
public async Task SetMode(string mode) => await JsRuntime.InvokeVoidAsync("moonlight.editor.setMode", mode);
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
using MoonCore.Attributes;
|
||||
using Moonlight.Core.Services.Utils;
|
||||
using Moonlight.Features.FileManager.Models.Abstractions.FileAccess;
|
||||
|
||||
namespace Moonlight.Features.FileManager.Services;
|
||||
|
||||
[Singleton]
|
||||
public class SharedFileAccessService
|
||||
{
|
||||
private readonly JwtService JwtService;
|
||||
private readonly List<IFileAccess> FileAccesses = new();
|
||||
|
||||
public SharedFileAccessService(JwtService jwtService)
|
||||
{
|
||||
JwtService = jwtService;
|
||||
}
|
||||
|
||||
public Task<int> Register(IFileAccess fileAccess)
|
||||
{
|
||||
lock (FileAccesses)
|
||||
FileAccesses.Add(fileAccess);
|
||||
|
||||
return Task.FromResult(fileAccess.GetHashCode());
|
||||
}
|
||||
|
||||
public Task Unregister(IFileAccess fileAccess)
|
||||
{
|
||||
lock (FileAccesses)
|
||||
{
|
||||
if (FileAccesses.Contains(fileAccess))
|
||||
FileAccesses.Remove(fileAccess);
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task<IFileAccess?> Get(int id)
|
||||
{
|
||||
lock (FileAccesses)
|
||||
{
|
||||
var fileAccess = FileAccesses.FirstOrDefault(x => x.GetHashCode() == id);
|
||||
|
||||
if (fileAccess == null)
|
||||
return Task.FromResult<IFileAccess?>(null);
|
||||
|
||||
return Task.FromResult<IFileAccess?>(fileAccess.Clone());
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<string> GenerateUrl(IFileAccess fileAccess)
|
||||
{
|
||||
var token = await JwtService.Create(data =>
|
||||
{
|
||||
data.Add("FileAccessId", fileAccess.GetHashCode().ToString());
|
||||
}, "FileUpload", TimeSpan.FromMinutes(6));
|
||||
|
||||
return $"/api/upload?token={token}";
|
||||
}
|
||||
}
|
48
Moonlight/Features/FileManager/UI/Components/Editor.razor
Normal file
48
Moonlight/Features/FileManager/UI/Components/Editor.razor
Normal file
|
@ -0,0 +1,48 @@
|
|||
@using Moonlight.Features.FileManager.Services
|
||||
@inject EditorService EditorService
|
||||
|
||||
<div id="@Identifier"></div>
|
||||
|
||||
@code
|
||||
{
|
||||
[Parameter] public string InitialContent { get; set; } = "";
|
||||
[Parameter] public string Theme { get; set; } = "one_dark";
|
||||
[Parameter] public string Mode { get; set; } = "text";
|
||||
[Parameter] public int Lines { get; set; } = 30;
|
||||
[Parameter] public int FontSize { get; set; } = 15;
|
||||
[Parameter] public bool EnableAutoInit { get; set; } = false;
|
||||
|
||||
private string Identifier;
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
Identifier = "editor" + GetHashCode();
|
||||
}
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
if (firstRender)
|
||||
{
|
||||
if(EnableAutoInit)
|
||||
await Initialize();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task Initialize()
|
||||
{
|
||||
await EditorService.Create(
|
||||
Identifier,
|
||||
Theme,
|
||||
Mode,
|
||||
InitialContent,
|
||||
Lines,
|
||||
FontSize
|
||||
);
|
||||
}
|
||||
|
||||
public async Task<string> GetContent() => await EditorService.GetValue();
|
||||
|
||||
public async Task SetContent(string content) => await EditorService.SetValue(content);
|
||||
|
||||
public async Task SetMode(string mode) => await EditorService.SetMode(mode);
|
||||
}
|
115
Moonlight/Features/FileManager/UI/Components/FileEditor.razor
Normal file
115
Moonlight/Features/FileManager/UI/Components/FileEditor.razor
Normal file
|
@ -0,0 +1,115 @@
|
|||
@inject ToastService ToastService
|
||||
@inject HotKeyService HotKeyService
|
||||
|
||||
@using Moonlight.Features.FileManager.Models.Abstractions.FileAccess
|
||||
@using MoonCoreUI.Services
|
||||
@using Moonlight.Core.Services
|
||||
@using MoonCore.Helpers
|
||||
@using Moonlight.Features.FileManager.Helpers
|
||||
|
||||
@implements IDisposable
|
||||
|
||||
<div class="card mb-2 border-0 rounded">
|
||||
<div class="card-body py-3 rounded" style="background-color: rgb(21, 21, 33)">
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="d-flex align-items-center">
|
||||
<span class="fw-bold fs-5 align-middle">@(File.Name) (@(Formatter.FormatSize(File.Size)))</span>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<WButton OnClick="OnClose" CssClasses="btn btn-sm btn-primary">
|
||||
<i class="bx bx-sm bx-arrow-back"></i>Back
|
||||
</WButton>
|
||||
<WButton OnClick="OnSave" CssClasses="btn btn-sm btn-success">
|
||||
<i class="bx bx-sm bx-save"></i>Save
|
||||
</WButton>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Editor @ref="Editor" InitialContent="Loading file"/>
|
||||
|
||||
@code
|
||||
{
|
||||
[Parameter] public FileEntry File { get; set; }
|
||||
|
||||
[Parameter] public IFileAccess FileAccess { get; set; }
|
||||
|
||||
[Parameter] public bool CloseOnSave { get; set; } = false;
|
||||
|
||||
[Parameter] public Func<Task>? OnClosed { get; set; }
|
||||
|
||||
private Editor Editor;
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
if (firstRender)
|
||||
{
|
||||
// Initialize the editor
|
||||
await Editor.Initialize();
|
||||
|
||||
// Load file and check the file type
|
||||
var fileData = await FileAccess.ReadFile(File.Name);
|
||||
var mode = EditorModeDetector.GetModeFromFile(File.Name);
|
||||
|
||||
// Finalize editor
|
||||
await Editor.SetMode(mode);
|
||||
await Editor.SetContent(fileData);
|
||||
|
||||
HotKeyService.HotKeyPressed += OnHotKeyPressed;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task OnClose()
|
||||
{
|
||||
if (OnClosed != null)
|
||||
await OnClosed.Invoke();
|
||||
}
|
||||
|
||||
private async Task OnSave()
|
||||
{
|
||||
try
|
||||
{
|
||||
var content = await Editor.GetContent();
|
||||
await FileAccess.WriteFile(File.Name, content);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Logger.Warn($"An unhandled error has occured while saving a file using access type {FileAccess.GetType().FullName}");
|
||||
Logger.Warn(e);
|
||||
|
||||
await ToastService.Danger("An unknown error has occured while saving the file. Please try again later");
|
||||
return;
|
||||
}
|
||||
|
||||
await ToastService.Success("Successfully saved file");
|
||||
|
||||
if (CloseOnSave)
|
||||
{
|
||||
if (OnClosed != null)
|
||||
await OnClosed.Invoke();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task OnHotKeyPressed(string hotKey)
|
||||
{
|
||||
if (hotKey == "save")
|
||||
{
|
||||
await OnSave();
|
||||
return;
|
||||
}
|
||||
|
||||
if (hotKey == "close")
|
||||
{
|
||||
await OnClose();
|
||||
return;
|
||||
}
|
||||
|
||||
// Define more hotkeys here
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
HotKeyService.HotKeyPressed -= OnHotKeyPressed;
|
||||
}
|
||||
}
|
268
Moonlight/Features/FileManager/UI/Components/FileManager.razor
Normal file
268
Moonlight/Features/FileManager/UI/Components/FileManager.razor
Normal file
|
@ -0,0 +1,268 @@
|
|||
@using Moonlight.Features.FileManager.Models.Abstractions.FileAccess
|
||||
@using Moonlight.Core.Configuration
|
||||
@using MoonCore.Helpers
|
||||
@using MoonCore.Services
|
||||
@using MoonCoreUI.Services
|
||||
|
||||
@inject AlertService AlertService
|
||||
@inject ConfigService<ConfigV1> ConfigService
|
||||
@inject ToastService ToastService
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="card-title">
|
||||
<div class="badge badge-primary badge-lg fs-5 py-2">
|
||||
@{
|
||||
var elements = Path
|
||||
.Split("/")
|
||||
.Where(x => !string.IsNullOrEmpty(x))
|
||||
.ToList();
|
||||
|
||||
int i = 1;
|
||||
var root = "/";
|
||||
}
|
||||
|
||||
<a href="#" @onclick:preventDefault @onclick="() => NavigateToPath(root)" class="invisible-a mx-2">/</a>
|
||||
@foreach (var element in elements)
|
||||
{
|
||||
var pathToCd = "/" + string.Join('/', elements.Take(i));
|
||||
|
||||
<a href="#" @onclick:preventDefault @onclick="() => NavigateToPath(pathToCd)" class="invisible-a">@(element)</a>
|
||||
<div class="mx-2">/</div>
|
||||
|
||||
i++;
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-toolbar">
|
||||
@if (ShowFileUploader)
|
||||
{
|
||||
<button type="button" @onclick="ToggleFileUploader" class="btn btn-light-primary me-3">
|
||||
Back
|
||||
</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
<a href="javascript:void(0)" class="btn btn-secondary me-3">
|
||||
<i class="bx bx-sm bx-link-external me-2"></i>
|
||||
Launch
|
||||
</a>
|
||||
<button type="button" @onclick="ToggleFileUploader" class="btn btn-light-primary me-3">
|
||||
<i class="bx bx-sm bx-upload me-2"></i>
|
||||
Upload
|
||||
</button>
|
||||
<div class="dropdown">
|
||||
<a class="btn btn-primary dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
New
|
||||
</a>
|
||||
<ul class="dropdown-menu" aria-labelledby="dropdownMenuLink">
|
||||
<li>
|
||||
<a href="#" @onclick:preventDefault @onclick="CreateFile" class="dropdown-item">
|
||||
<i class="bx bx-sm bx-file text-primary me-2 align-middle"></i>
|
||||
<span class="align-middle fs-6">File</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" @onclick:preventDefault @onclick="CreateDirectory" class="dropdown-item">
|
||||
<i class="bx bx-sm bx-folder text-primary me-2 align-middle"></i>
|
||||
<span class="align-middle fs-6">Folder</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body" @ondragenter="() => ToggleFileUploader(true)">
|
||||
@if (ShowFileUploader)
|
||||
{
|
||||
<FileUploader @ref="FileUploader" FileAccess="FileAccess"/>
|
||||
}
|
||||
else if (ShowFileEditor)
|
||||
{
|
||||
<FileEditor File="EditorOpenFile" FileAccess="FileAccess" OnClosed="OnEditorClosed"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<FileView @ref="FileView"
|
||||
FileAccess="FileAccess"
|
||||
OnPathChanged="OnPathChanged"
|
||||
OnFileClicked="OnFileClicked"
|
||||
OnMoveRequested="StartMove"/>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<SmartModal @ref="MoveModal" CssClasses="modal-dialog-centered">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Select the location to move '@(MoveEntry.Name)'</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body" style="overflow-y: scroll; max-height: 80vh">
|
||||
<FileView
|
||||
FileAccess="MoveAccess"
|
||||
ShowActions="false"
|
||||
ShowHeader="false"
|
||||
ShowSelect="false"
|
||||
ShowSize="false"
|
||||
ShowLastModified="false"/>
|
||||
</div>
|
||||
<div class="modal-footer p-3">
|
||||
<div class="btn-group w-100">
|
||||
<WButton OnClick="FinishMove" Text="Move" CssClasses="btn btn-primary w-50 me-3"/>
|
||||
<button class="btn btn-secondary w-50" data-bs-dismiss="modal">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
</SmartModal>
|
||||
|
||||
@code
|
||||
{
|
||||
[Parameter] public IFileAccess FileAccess { get; set; }
|
||||
|
||||
// Navigation
|
||||
private string Path = "/";
|
||||
private FileView? FileView;
|
||||
|
||||
// Uploading
|
||||
private bool ShowFileUploader = false;
|
||||
private FileUploader? FileUploader;
|
||||
|
||||
// Editing
|
||||
private bool ShowFileEditor = false;
|
||||
private FileEntry EditorOpenFile;
|
||||
|
||||
// Move
|
||||
private FileEntry MoveEntry;
|
||||
private SmartModal MoveModal;
|
||||
private IFileAccess MoveAccess;
|
||||
|
||||
private async Task OnPathChanged(string path)
|
||||
{
|
||||
Path = path;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private async Task NavigateToPath(string path)
|
||||
{
|
||||
if (ShowFileUploader)
|
||||
await ToggleFileUploader(false);
|
||||
|
||||
if (FileView == null)
|
||||
return;
|
||||
|
||||
await FileView.NavigateToPath(path);
|
||||
}
|
||||
|
||||
#region Uploader
|
||||
|
||||
private async Task ToggleFileUploader() => await ToggleFileUploader(!ShowFileUploader);
|
||||
|
||||
private async Task ToggleFileUploader(bool b)
|
||||
{
|
||||
ShowFileUploader = b;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region mkdir / touch
|
||||
|
||||
private async Task CreateFile()
|
||||
{
|
||||
if (FileView == null)
|
||||
return;
|
||||
|
||||
var name = await AlertService.Text("Enter the filename", "");
|
||||
|
||||
await FileAccess.CreateFile(name);
|
||||
|
||||
await FileView.Refresh();
|
||||
|
||||
// Open editor to start editing
|
||||
await OpenEditor(new FileEntry()
|
||||
{
|
||||
Size = 0,
|
||||
Name = name,
|
||||
IsFile = true,
|
||||
IsDirectory = false,
|
||||
LastModifiedAt = DateTime.UtcNow
|
||||
});
|
||||
}
|
||||
|
||||
private async Task CreateDirectory()
|
||||
{
|
||||
if (FileView == null)
|
||||
return;
|
||||
|
||||
var name = await AlertService.Text("Enter the foldername", "");
|
||||
|
||||
await FileAccess.CreateDirectory(name);
|
||||
|
||||
await FileView.Refresh();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Editor
|
||||
|
||||
private async Task OnFileClicked(FileEntry fileEntry) => await OpenEditor(fileEntry);
|
||||
|
||||
private async Task OpenEditor(FileEntry fileEntry)
|
||||
{
|
||||
var fileSizeInKilobytes = ByteSizeValue.FromBytes(fileEntry.Size).KiloBytes;
|
||||
|
||||
if (fileSizeInKilobytes > ConfigService.Get().FileManager.MaxFileOpenSize)
|
||||
{
|
||||
await ToastService.Danger("Unable to open file as it exceeds the max file size limit");
|
||||
return;
|
||||
}
|
||||
|
||||
EditorOpenFile = fileEntry;
|
||||
|
||||
// Prepare editor
|
||||
ShowFileEditor = true;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private async Task OnEditorClosed()
|
||||
{
|
||||
ShowFileEditor = false;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Move
|
||||
|
||||
private async Task StartMove(FileEntry fileEntry)
|
||||
{
|
||||
MoveEntry = fileEntry;
|
||||
MoveAccess = FileAccess.Clone();
|
||||
|
||||
await MoveAccess.SetDirectory("/");
|
||||
await MoveModal.Show();
|
||||
}
|
||||
|
||||
private async Task FinishMove()
|
||||
{
|
||||
var pathToMove = await MoveAccess.GetCurrentDirectory();
|
||||
MoveAccess.Dispose();
|
||||
|
||||
// Ensure path ends with a /
|
||||
if (!pathToMove.EndsWith("/"))
|
||||
pathToMove += "/";
|
||||
|
||||
// Perform move and process ui updates
|
||||
await FileAccess.Move(MoveEntry.Name, pathToMove);
|
||||
|
||||
await MoveModal.Hide();
|
||||
|
||||
if (FileView == null)
|
||||
return;
|
||||
|
||||
await FileView.Refresh();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
|
@ -0,0 +1,89 @@
|
|||
@using Moonlight.Features.FileManager.Models.Abstractions.FileAccess
|
||||
@using Moonlight.Features.FileManager.Services
|
||||
|
||||
@inject DropzoneService DropzoneService
|
||||
@inject SharedFileAccessService SharedFileAccessService
|
||||
|
||||
@implements IDisposable
|
||||
|
||||
<div class="d-flex justify-content-center">
|
||||
<div class="col-md-8" @ondrop:preventDefault>
|
||||
<div class="dropzone dropzone-queue" id="@DropzoneId">
|
||||
<div class="dropzone-panel mb-lg-0 mb-2">
|
||||
<div class="card border border-1 border-primary bg-secondary" style="pointer-events: none">
|
||||
<div class="card-body">
|
||||
<div class="text-center fs-1 fw-bold">
|
||||
Drag a file or folder or <a class="dropzone-select" style="pointer-events: all">click to upload files</a>
|
||||
</div>
|
||||
</div>
|
||||
<img src="/svg/upload.svg" class="card-img-bottom" alt="Upload icon" style="max-height: 15vw">
|
||||
</div>
|
||||
</div>
|
||||
<div class="dropzone-items wm-200px">
|
||||
<div class="dropzone-item" style="display:none">
|
||||
<div class="dropzone-file">
|
||||
<div class="dropzone-filename" title="some_image_file_name.jpg">
|
||||
<span data-dz-name>some_image_file_name.jpg</span>
|
||||
<strong>(<span data-dz-size>340kb</span>)</strong>
|
||||
</div>
|
||||
<div class="dropzone-error" data-dz-errormessage></div>
|
||||
</div>
|
||||
<div class="dropzone-progress">
|
||||
<div class="progress">
|
||||
<div
|
||||
class="progress-bar bg-primary"
|
||||
role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" data-dz-uploadprogress>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dropzone-toolbar">
|
||||
<span class="dropzone-delete" data-dz-remove>
|
||||
<i class="bx bx-x fs-1"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@code
|
||||
{
|
||||
[Parameter] public IFileAccess FileAccess { get; set; }
|
||||
|
||||
private CancellationTokenSource Cancellation = new();
|
||||
private string DropzoneId;
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
DropzoneId = $"dropzone{GetHashCode()}";
|
||||
}
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
if (firstRender)
|
||||
{
|
||||
await SharedFileAccessService.Register(FileAccess);
|
||||
var url = await SharedFileAccessService.GenerateUrl(FileAccess);
|
||||
|
||||
await DropzoneService.Create(DropzoneId, url);
|
||||
|
||||
Task.Run(async () => // Update the dropzone url every 5 minutes so the token does not expire
|
||||
{
|
||||
while (!Cancellation.IsCancellationRequested)
|
||||
{
|
||||
await Task.Delay(TimeSpan.FromMinutes(5));
|
||||
|
||||
var newUrl = await SharedFileAccessService.GenerateUrl(FileAccess);
|
||||
await DropzoneService.UpdateUrl(DropzoneId, newUrl);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public async void Dispose()
|
||||
{
|
||||
Cancellation.Cancel();
|
||||
await SharedFileAccessService.Unregister(FileAccess);
|
||||
}
|
||||
}
|
390
Moonlight/Features/FileManager/UI/Components/FileView.razor
Normal file
390
Moonlight/Features/FileManager/UI/Components/FileView.razor
Normal file
|
@ -0,0 +1,390 @@
|
|||
@using Moonlight.Features.FileManager.Models.Abstractions.FileAccess
|
||||
@using MoonCoreUI.Services
|
||||
@using MoonCore.Helpers
|
||||
|
||||
@inject ToastService ToastService
|
||||
@inject AlertService AlertService
|
||||
|
||||
<LazyLoader @ref="LazyLoader" Load="Load">
|
||||
<table class="w-100 table table-responsive table-row-bordered">
|
||||
<tbody>
|
||||
|
||||
@if (ShowHeader)
|
||||
{
|
||||
<tr>
|
||||
@if (ShowSelect)
|
||||
{
|
||||
<td class="w-10px align-middle">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" @oninput="args => ToggleAll(args)">
|
||||
</div>
|
||||
</td>
|
||||
}
|
||||
@if (ShowIcons)
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
<td class="align-middle fs-6 text-muted">
|
||||
Name
|
||||
</td>
|
||||
@if (ShowSize)
|
||||
{
|
||||
<td class="align-middle fs-6 text-muted d-none d-sm-table-cell text-end">
|
||||
Size
|
||||
</td>
|
||||
}
|
||||
@if (ShowLastModified)
|
||||
{
|
||||
<td class="align-middle fs-6 text-muted d-none d-sm-table-cell text-end">
|
||||
Last modified at
|
||||
</td>
|
||||
}
|
||||
@if (SelectedEntries.Count == 0)
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
else
|
||||
{
|
||||
<td class="w-50 fs-6 text-end">
|
||||
<span class="text-primary">@SelectedEntries.Count</span> element(s) selected
|
||||
<div class="ms-2 btn-group">
|
||||
<WButton OnClick="() => Delete(SelectedEntries.ToArray())" CssClasses="btn btn-icon btn-danger">
|
||||
<i class="text-white bx bx-sm bx-trash"></i>
|
||||
</WButton>
|
||||
</div>
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
|
||||
@if (ShowGoUp && Path != "/" && !DisableNavigation)
|
||||
{
|
||||
<tr>
|
||||
@if (ShowSelect)
|
||||
{
|
||||
<td class="w-10px align-middle">
|
||||
</td>
|
||||
}
|
||||
@if (ShowIcons)
|
||||
{
|
||||
<td class="w-10px align-middle">
|
||||
</td>
|
||||
}
|
||||
<td class="align-middle fs-6">
|
||||
@{
|
||||
var upPath = "..";
|
||||
}
|
||||
|
||||
<a href="#"
|
||||
@onclick:preventDefault
|
||||
@onclick="() => Navigate(upPath)">
|
||||
Go up
|
||||
</a>
|
||||
</td>
|
||||
@if (ShowSize)
|
||||
{
|
||||
<td class="align-middle fs-6 d-none d-sm-table-cell text-end">
|
||||
<span>-</span>
|
||||
</td>
|
||||
}
|
||||
@if (ShowLastModified)
|
||||
{
|
||||
<td class="align-middle fs-6 d-none d-sm-table-cell text-end">
|
||||
-
|
||||
</td>
|
||||
}
|
||||
@if (ShowActions)
|
||||
{
|
||||
<td class="w-50 text-end">
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
|
||||
@foreach (var entry in Entries)
|
||||
{
|
||||
<tr>
|
||||
@if (ShowSelect)
|
||||
{
|
||||
<td class="w-10px align-middle">
|
||||
<div class="form-check">
|
||||
@if (SelectedEntries.Contains(entry))
|
||||
{
|
||||
<input class="form-check-input" type="checkbox" value="1" checked="checked" @oninput="args => HandleSelected(entry, args)">
|
||||
}
|
||||
else
|
||||
{
|
||||
<input class="form-check-input" type="checkbox" value="0" @oninput="args => HandleSelected(entry, args)">
|
||||
}
|
||||
</div>
|
||||
</td>
|
||||
}
|
||||
@if (ShowIcons)
|
||||
{
|
||||
<td class="w-10px align-middle">
|
||||
@if (entry.IsFile)
|
||||
{
|
||||
<i class="bx bx-md bx-file"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
<i class="bx bx-md bx-folder"></i>
|
||||
}
|
||||
</td>
|
||||
}
|
||||
<td class="align-middle fs-6">
|
||||
@if (DisableNavigation)
|
||||
{
|
||||
<span>@(entry.Name)</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<a href="#"
|
||||
@onclick:preventDefault
|
||||
@onclick="() => HandleClick(entry)">
|
||||
@(entry.Name)
|
||||
</a>
|
||||
}
|
||||
</td>
|
||||
@if (ShowSize)
|
||||
{
|
||||
<td class="align-middle fs-6 d-none d-sm-table-cell text-end">
|
||||
@if (entry.IsFile)
|
||||
{
|
||||
@(Formatter.FormatSize(entry.Size))
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>-</span>
|
||||
}
|
||||
</td>
|
||||
}
|
||||
@if (ShowLastModified)
|
||||
{
|
||||
<td class="align-middle fs-6 d-none d-sm-table-cell text-end">
|
||||
@(Formatter.FormatDate(entry.LastModifiedAt))
|
||||
</td>
|
||||
}
|
||||
@if (ShowActions)
|
||||
{
|
||||
<td class="w-50 text-end">
|
||||
<div class="btn-group">
|
||||
<WButton OnClick="() => Delete(entry)" CssClasses="btn btn-icon btn-danger">
|
||||
<i class="text-white bx bx-sm bx-trash"></i>
|
||||
</WButton>
|
||||
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-icon btn-secondary rounded-start-0" type="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
<i class="text-white bx bx-sm bx-dots-horizontal-rounded"></i>
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li>
|
||||
<a href="#" @onclick:preventDefault @onclick="() => Rename(entry)" class="dropdown-item">Rename</a>
|
||||
</li>
|
||||
@if (OnMoveRequested != null)
|
||||
{
|
||||
<li>
|
||||
<a href="#" @onclick:preventDefault @onclick="() => RequestMove(entry)" class="dropdown-item">Move</a>
|
||||
</li>
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</LazyLoader>
|
||||
|
||||
|
||||
@code
|
||||
{
|
||||
[Parameter] public IFileAccess FileAccess { get; set; }
|
||||
|
||||
[Parameter] public Func<FileEntry, bool>? Filter { get; set; }
|
||||
[Parameter] public bool ShowSize { get; set; } = true;
|
||||
[Parameter] public bool ShowLastModified { get; set; } = true;
|
||||
[Parameter] public bool ShowIcons { get; set; } = true;
|
||||
[Parameter] public bool ShowActions { get; set; } = true;
|
||||
[Parameter] public bool ShowSelect { get; set; } = true;
|
||||
[Parameter] public bool ShowGoUp { get; set; } = true;
|
||||
[Parameter] public bool ShowHeader { get; set; } = true;
|
||||
[Parameter] public bool DisableNavigation { get; set; } = false;
|
||||
[Parameter] public Func<FileEntry, Task>? OnFileClicked { get; set; }
|
||||
[Parameter] public Func<Task>? OnSelectionChanged { get; set; }
|
||||
[Parameter] public Func<string, Task>? OnPathChanged { get; set; }
|
||||
[Parameter] public Func<FileEntry, Task>? OnMoveRequested { get; set; }
|
||||
|
||||
public readonly List<FileEntry> SelectedEntries = new();
|
||||
|
||||
private LazyLoader LazyLoader;
|
||||
private FileEntry[] Entries;
|
||||
private string Path = "/";
|
||||
|
||||
private async Task Load(LazyLoader lazyLoader)
|
||||
{
|
||||
await lazyLoader.SetText("Loading files and folders");
|
||||
|
||||
// Load all entries
|
||||
Entries = await FileAccess.List();
|
||||
|
||||
await lazyLoader.SetText("Sorting files and folders");
|
||||
|
||||
// Perform sorting and filtering
|
||||
if (Filter != null)
|
||||
{
|
||||
Entries = Entries
|
||||
.Where(x => Filter.Invoke(x))
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
Entries = Entries
|
||||
.GroupBy(x => x.IsFile)
|
||||
.OrderBy(x => x.Key)
|
||||
.SelectMany(x => x.OrderBy(y => y.Name))
|
||||
.ToArray();
|
||||
|
||||
SelectedEntries.Clear();
|
||||
|
||||
Path = await FileAccess.GetCurrentDirectory();
|
||||
|
||||
if (OnPathChanged != null)
|
||||
await OnPathChanged.Invoke(Path);
|
||||
}
|
||||
|
||||
private async Task HandleClick(FileEntry fileEntry)
|
||||
{
|
||||
if (fileEntry.IsDirectory && !DisableNavigation)
|
||||
{
|
||||
await Navigate(fileEntry.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (OnFileClicked != null)
|
||||
await OnFileClicked.Invoke(fileEntry);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task Delete(params FileEntry[] entries)
|
||||
{
|
||||
if (entries.Length == 0)
|
||||
return;
|
||||
|
||||
var toastId = "fileDelete" + GetHashCode();
|
||||
await ToastService.CreateProgress(toastId, $"[0/{entries.Length}] Deleting items");
|
||||
|
||||
int i = 0;
|
||||
foreach (var entry in entries)
|
||||
{
|
||||
await ToastService.ModifyProgress(toastId, $"[{i + 1}/{entries.Length}] Deleting '{entry.Name}'");
|
||||
|
||||
await FileAccess.Delete(entry.Name);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
await ToastService.RemoveProgress(toastId);
|
||||
await ToastService.Success($"Successfully deleted {i} item(s)");
|
||||
|
||||
await LazyLoader.Reload();
|
||||
}
|
||||
|
||||
private async Task Rename(FileEntry fileEntry)
|
||||
{
|
||||
var name = await AlertService.Text($"Rename '{fileEntry.Name}'", "", fileEntry.Name);
|
||||
|
||||
if(string.IsNullOrEmpty(name))
|
||||
return;
|
||||
|
||||
await FileAccess.Move(fileEntry.Name, name);
|
||||
|
||||
await LazyLoader.Reload();
|
||||
}
|
||||
|
||||
private async Task RequestMove(FileEntry fileEntry)
|
||||
{
|
||||
if(OnMoveRequested == null)
|
||||
return;
|
||||
|
||||
await OnMoveRequested.Invoke(fileEntry);
|
||||
}
|
||||
|
||||
#region Selection
|
||||
|
||||
private async Task HandleSelected(FileEntry fileEntry, ChangeEventArgs args)
|
||||
{
|
||||
if (args.Value == null) // This should never be called. Still i want to handle it
|
||||
return;
|
||||
|
||||
if (args.Value.ToString() == "True")
|
||||
{
|
||||
if (!SelectedEntries.Contains(fileEntry))
|
||||
SelectedEntries.Add(fileEntry);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (SelectedEntries.Contains(fileEntry))
|
||||
SelectedEntries.Remove(fileEntry);
|
||||
}
|
||||
|
||||
if (OnSelectionChanged != null)
|
||||
await OnSelectionChanged.Invoke();
|
||||
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private async Task ToggleAll(ChangeEventArgs args)
|
||||
{
|
||||
if (args.Value == null)
|
||||
return;
|
||||
|
||||
if (args.Value.ToString() == "True")
|
||||
{
|
||||
foreach (var entry in Entries)
|
||||
{
|
||||
if (!SelectedEntries.Contains(entry))
|
||||
SelectedEntries.Add(entry);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedEntries.Clear();
|
||||
}
|
||||
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Navigation
|
||||
|
||||
public async Task Navigate(string name)
|
||||
{
|
||||
await LazyLoader.Reload(async loader =>
|
||||
{
|
||||
await loader.SetText("Switching directory on target");
|
||||
await FileAccess.ChangeDirectory(name);
|
||||
|
||||
if (OnPathChanged != null)
|
||||
await OnPathChanged.Invoke(await FileAccess.GetCurrentDirectory());
|
||||
});
|
||||
}
|
||||
|
||||
public async Task NavigateToPath(string path)
|
||||
{
|
||||
await LazyLoader.Reload(async loader =>
|
||||
{
|
||||
await loader.SetText("Switching directory on target");
|
||||
await FileAccess.SetDirectory(path);
|
||||
|
||||
if (OnPathChanged != null)
|
||||
await OnPathChanged.Invoke(await FileAccess.GetCurrentDirectory());
|
||||
});
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public async Task Refresh() => await LazyLoader.Reload();
|
||||
}
|
|
@ -34,6 +34,14 @@
|
|||
<Folder Include="Features\Dummy\Services\" />
|
||||
<Folder Include="Features\Dummy\UI\Components\" />
|
||||
<Folder Include="Features\Dummy\UI\Views\" />
|
||||
<Folder Include="Features\FileManager\Entities\" />
|
||||
<Folder Include="Features\FileManager\Exceptions\" />
|
||||
<Folder Include="Features\FileManager\Extensions\" />
|
||||
<Folder Include="Features\FileManager\Http\Middleware\" />
|
||||
<Folder Include="Features\FileManager\Http\Requests\" />
|
||||
<Folder Include="Features\FileManager\Http\Resources\" />
|
||||
<Folder Include="Features\FileManager\Models\Forms\" />
|
||||
<Folder Include="Features\FileManager\UI\Views\" />
|
||||
<Folder Include="Features\Servers\Api\Resources\" />
|
||||
<Folder Include="Features\Servers\Configuration\" />
|
||||
<Folder Include="Features\Servers\Http\Requests\" />
|
||||
|
@ -53,8 +61,8 @@
|
|||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="MoonCore" Version="1.0.2" />
|
||||
<PackageReference Include="MoonCoreUI" Version="1.0.1" />
|
||||
<PackageReference Include="MoonCore" Version="1.0.5" />
|
||||
<PackageReference Include="MoonCoreUI" Version="1.0.3" />
|
||||
<PackageReference Include="Otp.NET" Version="1.3.0" />
|
||||
<PackageReference Include="QRCoder" Version="1.4.3" />
|
||||
<PackageReference Include="XtermBlazor" Version="1.10.1" />
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
@foreach (var theme in themes)
|
||||
{
|
||||
var finalUrl = theme.CssUrl.StartsWith("/") ? theme.CssUrl : $"/api/assetproxy/theme/{theme.Id}/css";
|
||||
|
||||
|
||||
<!-- Theme: @(theme.Name) by @(theme.Author) -->
|
||||
<link href="@(finalUrl)" rel="stylesheet" type="text/css"/>
|
||||
}
|
||||
|
@ -37,8 +37,11 @@
|
|||
<link href="/css/sweetalert2dark.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="/css/interfont.css" rel="stylesheet" type="text/css"/>
|
||||
@* <link href="https://fonts.googleapis.com/css?family=Inter:300,400,500,600,700" rel="stylesheet" type="text/css"> *@
|
||||
|
||||
<link href="/_content/XtermBlazor/XtermBlazor.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<link href="/_content/XtermBlazor/XtermBlazor.css" rel="stylesheet" type="text/css"/>
|
||||
|
||||
<link href="/editor/ace.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="/editor/dracula.css"/>
|
||||
</head>
|
||||
<body data-kt-app-header-fixed="true"
|
||||
data-kt-app-header-fixed-mobile="true"
|
||||
|
@ -58,6 +61,7 @@
|
|||
<script src="/_content/BlazorTable/BlazorTable.min.js"></script>
|
||||
<script src="/js/sweetalert2.js"></script>
|
||||
<script src="/js/ckeditor.js"></script>
|
||||
<script src="/js/dropzone.min.js"></script>
|
||||
|
||||
<script src="/_content/XtermBlazor/XtermBlazor.min.js"></script>
|
||||
|
||||
|
@ -66,12 +70,14 @@
|
|||
if (!string.IsNullOrEmpty(theme.JsUrl))
|
||||
{
|
||||
var finalUrl = theme.JsUrl.StartsWith("/") ? theme.JsUrl : $"/api/assetproxy/theme/{theme.Id}/js";
|
||||
|
||||
|
||||
<!-- Theme: @(theme.Name) by @(theme.Author) -->
|
||||
<script src="@(finalUrl)"></script>
|
||||
}
|
||||
}
|
||||
|
||||
<script src="/editor/ace.js"></script>
|
||||
|
||||
<script src="/_framework/blazor.server.js"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -13,14 +13,20 @@ using Moonlight.Features.Servers.Http.Middleware;
|
|||
using Moonlight.Features.ServiceManagement.Entities.Enums;
|
||||
using Moonlight.Features.ServiceManagement.Services;
|
||||
|
||||
Directory.CreateDirectory(PathBuilder.Dir("storage"));
|
||||
Directory.CreateDirectory(PathBuilder.Dir("storage", "logs"));
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
var configService = new ConfigService<ConfigV1>(
|
||||
PathBuilder.File("storage", "config.json")
|
||||
);
|
||||
|
||||
Directory.CreateDirectory(PathBuilder.Dir("storage"));
|
||||
Directory.CreateDirectory(PathBuilder.Dir("storage", "logs"));
|
||||
builder.WebHost.ConfigureKestrel(options =>
|
||||
{
|
||||
var uploadLimit = ByteSizeValue.FromMegaBytes(configService.Get().WebServer.HttpUploadLimit).Bytes;
|
||||
options.Limits.MaxRequestBodySize = uploadLimit;
|
||||
});
|
||||
|
||||
// Setup logger
|
||||
var now = DateTime.UtcNow;
|
||||
|
|
|
@ -26,6 +26,9 @@
|
|||
@import "vendors/plugins/variables";
|
||||
@import "vendors/plugins/variables-dark";
|
||||
|
||||
// Enable plugin styles here
|
||||
@import "vendors/plugins/dropzone";
|
||||
|
||||
// Custom layout variables
|
||||
@import "layout/base/variables";
|
||||
@import "layout/variables.custom";
|
1025
Moonlight/wwwroot/editor/ace.css
vendored
Normal file
1025
Moonlight/wwwroot/editor/ace.css
vendored
Normal file
File diff suppressed because it is too large
Load diff
17
Moonlight/wwwroot/editor/ace.js
vendored
Normal file
17
Moonlight/wwwroot/editor/ace.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-abap.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-abap.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-abc.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-abc.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/abc_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:["zupfnoter.information.comment.line.percentage","information.keyword","in formation.keyword.embedded"],regex:"(%%%%)(hn\\.[a-z]*)(.*)",comment:"Instruction Comment"},{token:["information.comment.line.percentage","information.keyword.embedded"],regex:"(%%)(.*)",comment:"Instruction Comment"},{token:"comment.line.percentage",regex:"%.*",comment:"Comments"},{token:"barline.keyword.operator",regex:"[\\[:]*[|:][|\\]:]*(?:\\[?[0-9]+)?|\\[[0-9]+",comment:"Bar lines"},{token:["information.keyword.embedded","information.argument.string.unquoted"],regex:"(\\[[A-Za-z]:)([^\\]]*\\])",comment:"embedded Header lines"},{token:["information.keyword","information.argument.string.unquoted"],regex:"^([A-Za-z]:)([^%\\\\]*)",comment:"Header lines"},{token:["text","entity.name.function","string.unquoted","text"],regex:"(\\[)([A-Z]:)(.*?)(\\])",comment:"Inline fields"},{token:["accent.constant.language","pitch.constant.numeric","duration.constant.numeric"],regex:"([\\^=_]*)([A-Ga-gz][,']*)([0-9]*/*[><0-9]*)",comment:"Notes"},{token:"zupfnoter.jumptarget.string.quoted",regex:'[\\"!]\\^\\:.*?[\\"!]',comment:"Zupfnoter jumptarget"},{token:"zupfnoter.goto.string.quoted",regex:'[\\"!]\\^\\@.*?[\\"!]',comment:"Zupfnoter goto"},{token:"zupfnoter.annotation.string.quoted",regex:'[\\"!]\\^\\!.*?[\\"!]',comment:"Zupfnoter annoation"},{token:"zupfnoter.annotationref.string.quoted",regex:'[\\"!]\\^\\#.*?[\\"!]',comment:"Zupfnoter annotation reference"},{token:"chordname.string.quoted",regex:'[\\"!]\\^.*?[\\"!]',comment:"abc chord"},{token:"string.quoted",regex:'[\\"!].*?[\\"!]',comment:"abc annotation"}]},this.normalizeRules()};s.metaData={fileTypes:["abc"],name:"ABC",scopeName:"text.abcnotation"},r.inherits(s,i),t.ABCHighlightRules=s}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/abc",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/abc_highlight_rules","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./abc_highlight_rules").ABCHighlightRules,o=e("./folding/cstyle").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart="%",this.$id="ace/mode/abc",this.snippetFileId="ace/snippets/abc"}.call(u.prototype),t.Mode=u}); (function() {
|
||||
ace.require(["ace/mode/abc"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-actionscript.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-actionscript.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-ada.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-ada.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/ada_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="abort|else|new|return|abs|elsif|not|reverse|abstract|end|null|accept|entry|select|access|exception|of|separate|aliased|exit|or|some|all|others|subtype|and|for|out|synchronized|array|function|overriding|at|tagged|generic|package|task|begin|goto|pragma|terminate|body|private|then|if|procedure|type|case|in|protected|constant|interface|until||is|raise|use|declare|range|delay|limited|record|when|delta|loop|rem|while|digits|renames|with|do|mod|requeue|xor",t="true|false|null",n="count|min|max|avg|sum|rank|now|coalesce|main",r=this.createKeywordMapper({"support.function":n,keyword:e,"constant.language":t},"identifier",!0);this.$rules={start:[{token:"comment",regex:"--.*$"},{token:"string",regex:'".*?"'},{token:"string",regex:"'.'"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:r,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"paren.lparen",regex:"[\\(]"},{token:"paren.rparen",regex:"[\\)]"},{token:"text",regex:"\\s+"}]}};r.inherits(s,i),t.AdaHighlightRules=s}),ace.define("ace/mode/ada",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ada_highlight_rules","ace/range"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./ada_highlight_rules").AdaHighlightRules,o=e("../range").Range,u=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart="--",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"){var o=t.match(/^.*(begin|loop|then|is|do)\s*$/);o&&(r+=n)}return r},this.checkOutdent=function(e,t,n){var r=t+n;return r.match(/^\s*(begin|end)$/)?!0:!1},this.autoOutdent=function(e,t,n){var r=t.getLine(n),i=t.getLine(n-1),s=this.$getIndent(i).length,u=this.$getIndent(r).length;if(u<=s)return;t.outdentRows(new o(n,0,n+2,0))},this.$id="ace/mode/ada"}.call(u.prototype),t.Mode=u}); (function() {
|
||||
ace.require(["ace/mode/ada"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-alda.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-alda.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-apache_conf.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-apache_conf.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-apex.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-apex.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-applescript.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-applescript.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-aql.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-aql.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/aql_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="for|search|outbound|inbound|any|graph|prune|options|shortest_path|to|in|return|filter|sort|limit|let|collect|remove|update|replace|insers|upsert|with",t="true|false",n="append|contains_array|count|count_distinct|count_unique|first|flatten|intersection|last|length|minus|nth|outersection|pop|position|push|remove_nth|remove_value|remove_values|reverse|shift|slice|sorted|sorted_unique|union|union_distinct|unique|unshift|date_now|date_iso8601|date_timestamp|is_datestring|date_dayofweek|date_year|date_month|date_day|date_hour|date_minute|date_second|date_millisecond|date_dayofyear|date_isoweek|date_leapyear|date_quarter|date_days_in_month|date_trunc|date_format|date_add|date_subtract|date_diff|date_compare|attributes|count|has|is_same_collection|keep|length|matches|merge|merge_recursive|parse_identifier|translate|unset|unset_recursive|values|zip|fulltext|distance|geo_contains|geo_distance|geo_equals|geo_intersects|is_in_polygon|not_null|first_list|first_document|check_document|collection_count|collections|count|current_user|document|length|hash|apply|assert|/ warn|call|fail|noopt|passthru|sleep|v8|version|abs|acos|asin|atan|atan2|average|avg|ceil|cos|degrees|exp|exp2|floor|log|log2|log10|max|median|min|percentile|pi|pow|radians|rand|range|round|sin|sqrt|stddev_population|stddev_sample|stddev|sum|tan|variance_population|variance_sample|variance|char_length|concat|concat_separator|contains|count|encode_uri_component|find_first|find_last|json_parse|json_stringify|left|length|levenshtein_distance|like|lower|ltrim|md5|random_token|regex_matches|regex_split|regex_test|regex_replace|reverse|right|rtrim|sha1|sha512|split|soundex|substitute|substring|tokens|to_base64|to_hex|trim|upper|uuid|to_bool|to_number|to_string|to_array|to_list|is_null|is_bool|is_number|is_string|is_array|is_list|is_object|is_document|is_datestring|is_key|typename|",r=this.createKeywordMapper({"support.function":n,keyword:e,"constant.language":t},"identifier",!0);this.$rules={start:[{token:"comment",regex:"//.*$"},{token:"string",regex:'".*?"'},{token:"string",regex:"'.*?'"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:r,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"paren.lparen",regex:"[\\(]"},{token:"paren.rparen",regex:"[\\)]"},{token:"text",regex:"\\s+"}]},this.normalizeRules()};r.inherits(s,i),t.AqlHighlightRules=s}),ace.define("ace/mode/aql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/aql_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./aql_highlight_rules").AqlHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.lineCommentStart="//",this.$id="ace/mode/aql"}.call(o.prototype),t.Mode=o}); (function() {
|
||||
ace.require(["ace/mode/aql"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-asciidoc.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-asciidoc.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-asl.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-asl.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-assembly_x86.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-assembly_x86.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-autohotkey.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-autohotkey.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-batchfile.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-batchfile.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/batchfile_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"keyword.command.dosbatch",regex:"\\b(?:append|assoc|at|attrib|break|cacls|cd|chcp|chdir|chkdsk|chkntfs|cls|cmd|color|comp|compact|convert|copy|date|del|dir|diskcomp|diskcopy|doskey|echo|endlocal|erase|fc|find|findstr|format|ftype|graftabl|help|keyb|label|md|mkdir|mode|more|move|path|pause|popd|print|prompt|pushd|rd|recover|ren|rename|replace|restore|rmdir|set|setlocal|shift|sort|start|subst|time|title|tree|type|ver|verify|vol|xcopy)\\b",caseInsensitive:!0},{token:"keyword.control.statement.dosbatch",regex:"\\b(?:goto|call|exit)\\b",caseInsensitive:!0},{token:"keyword.control.conditional.if.dosbatch",regex:"\\bif\\s+not\\s+(?:exist|defined|errorlevel|cmdextversion)\\b",caseInsensitive:!0},{token:"keyword.control.conditional.dosbatch",regex:"\\b(?:if|else)\\b",caseInsensitive:!0},{token:"keyword.control.repeat.dosbatch",regex:"\\bfor\\b",caseInsensitive:!0},{token:"keyword.operator.dosbatch",regex:"\\b(?:EQU|NEQ|LSS|LEQ|GTR|GEQ)\\b"},{token:["doc.comment","comment"],regex:"(?:^|\\b)(rem)($|\\s.*$)",caseInsensitive:!0},{token:"comment.line.colons.dosbatch",regex:"::.*$"},{include:"variable"},{token:"punctuation.definition.string.begin.shell",regex:'"',push:[{token:"punctuation.definition.string.end.shell",regex:'"',next:"pop"},{include:"variable"},{defaultToken:"string.quoted.double.dosbatch"}]},{token:"keyword.operator.pipe.dosbatch",regex:"[|]"},{token:"keyword.operator.redirect.shell",regex:"&>|\\d*>&\\d*|\\d*(?:>>|>|<)|\\d*<&|\\d*<>"}],variable:[{token:"constant.numeric",regex:"%%\\w+|%[*\\d]|%\\w+%"},{token:"constant.numeric",regex:"%~\\d+"},{token:["markup.list","constant.other","markup.list"],regex:"(%)(\\w+)(%?)"}]},this.normalizeRules()};s.metaData={name:"Batch File",scopeName:"source.dosbatch",fileTypes:["bat"]},r.inherits(s,i),t.BatchFileHighlightRules=s}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/batchfile",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/batchfile_highlight_rules","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./batchfile_highlight_rules").BatchFileHighlightRules,o=e("./folding/cstyle").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart="::",this.blockComment="",this.$id="ace/mode/batchfile"}.call(u.prototype),t.Mode=u}); (function() {
|
||||
ace.require(["ace/mode/batchfile"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-c9search.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-c9search.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/c9search_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function o(e,t){try{return new RegExp(e,t)}catch(n){}}var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,u=function(){this.$rules={start:[{tokenNames:["c9searchresults.constant.numeric","c9searchresults.text","c9searchresults.text","c9searchresults.keyword"],regex:/(^\s+[0-9]+)(:)(\d*\s?)([^\r\n]+)/,onMatch:function(e,t,n){var r=this.splitRegex.exec(e),i=this.tokenNames,s=[{type:i[0],value:r[1]},{type:i[1],value:r[2]}];r[3]&&(r[3]==" "?s[1]={type:i[1],value:r[2]+" "}:s.push({type:i[1],value:r[3]}));var o=n[1],u=r[4],a,f=0;if(o&&o.exec){o.lastIndex=0;while(a=o.exec(u)){var l=u.substring(f,a.index);f=o.lastIndex,l&&s.push({type:i[2],value:l});if(a[0])s.push({type:i[3],value:a[0]});else if(!l)break}}return f<u.length&&s.push({type:i[2],value:u.substr(f)}),s}},{regex:"^Searching for [^\\r\\n]*$",onMatch:function(e,t,n){var r=e.split("\x01");if(r.length<3)return"text";var s,u,a=0,f=[{value:r[a++]+"'",type:"text"},{value:u=r[a++],type:"text"},{value:"'"+r[a++],type:"text"}];r[2]!==" in"&&f.push({value:"'"+r[a++]+"'",type:"text"},{value:r[a++],type:"text"}),f.push({value:" "+r[a++]+" ",type:"text"}),r[a+1]?(s=r[a+1],f.push({value:"("+r[a+1]+")",type:"text"}),a+=1):a-=1;while(a++<r.length)r[a]&&f.push({value:r[a],type:"text"});u&&(/regex/.test(s)||(u=i.escapeRegExp(u)),/whole/.test(s)&&(u="\\b"+u+"\\b"));var l=u&&o("("+u+")",/ sensitive/.test(s)?"g":"ig");return l&&(n[0]=t,n[1]=l),f}},{regex:"^(?=Found \\d+ matches)",token:"text",next:"numbers"},{token:"string",regex:"^\\S:?[^:]+",next:"numbers"}],numbers:[{regex:"\\d+",token:"constant.numeric"},{regex:"$",token:"text",next:"start"}]},this.normalizeRules()};r.inherits(u,s),t.C9SearchHighlightRules=u}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/folding/c9search",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(){};r.inherits(o,s),function(){this.foldingStartMarker=/^(\S.*:|Searching for.*)$/,this.foldingStopMarker=/^(\s+|Found.*)$/,this.getFoldWidgetRange=function(e,t,n){var r=e.doc.getAllLines(n),s=r[n],o=/^(Found.*|Searching for.*)$/,u=/^(\S.*:|\s*)$/,a=o.test(s)?o:u,f=n,l=n;if(this.foldingStartMarker.test(s)){for(var c=n+1,h=e.getLength();c<h;c++)if(a.test(r[c]))break;l=c}else if(this.foldingStopMarker.test(s)){for(var c=n-1;c>=0;c--){s=r[c];if(a.test(s))break}f=c}if(f!=l){var p=s.length;return a===o&&(p=s.search(/\(Found[^)]+\)$|$/)),new i(f,p,l,0)}}}.call(o.prototype)}),ace.define("ace/mode/c9search",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/c9search_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/c9search"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./c9search_highlight_rules").C9SearchHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("./folding/c9search").FoldMode,a=function(){this.HighlightRules=s,this.$outdent=new o,this.foldingRules=new u};r.inherits(a,i),function(){this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id="ace/mode/c9search"}.call(a.prototype),t.Mode=a}); (function() {
|
||||
ace.require(["ace/mode/c9search"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-c_cpp.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-c_cpp.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-cirru.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-cirru.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/cirru_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"constant.numeric",regex:/[\d\.]+/},{token:"comment.line.double-dash",regex:/--/,next:"comment"},{token:"storage.modifier",regex:/\(/},{token:"storage.modifier",regex:/,/,next:"line"},{token:"support.function",regex:/[^\(\)"\s{}\[\]]+/,next:"line"},{token:"string.quoted.double",regex:/"/,next:"string"},{token:"storage.modifier",regex:/\)/}],comment:[{token:"comment.line.double-dash",regex:/ +[^\n]+/,next:"start"}],string:[{token:"string.quoted.double",regex:/"/,next:"line"},{token:"constant.character.escape",regex:/\\/,next:"escape"},{token:"string.quoted.double",regex:/[^\\"]+/}],escape:[{token:"constant.character.escape",regex:/./,next:"string"}],line:[{token:"constant.numeric",regex:/[\d\.]+/},{token:"markup.raw",regex:/^\s*/,next:"start"},{token:"storage.modifier",regex:/\$/,next:"start"},{token:"variable.parameter",regex:/[^\(\)"\s{}\[\]]+/},{token:"storage.modifier",regex:/\(/,next:"start"},{token:"storage.modifier",regex:/\)/},{token:"markup.raw",regex:/^ */,next:"start"},{token:"string.quoted.double",regex:/"/,next:"string"}]}};r.inherits(s,i),t.CirruHighlightRules=s}),ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!="#")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!="#")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\S/),a=s.search(/\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?"start":"","";if(u==-1){if(i==a&&r[i]=="#"&&s[i]=="#")return e.foldWidgets[n-1]="",e.foldWidgets[n+1]="","start"}else if(u==i&&r[i]=="#"&&o[i]=="#"&&e.getLine(n-2).search(/\S/)==-1)return e.foldWidgets[n-1]="start",e.foldWidgets[n+1]="","";return u!=-1&&u<i?e.foldWidgets[n-1]="start":e.foldWidgets[n-1]="",i<a?"start":""}}.call(o.prototype)}),ace.define("ace/mode/cirru",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/cirru_highlight_rules","ace/mode/folding/coffee"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./cirru_highlight_rules").CirruHighlightRules,o=e("./folding/coffee").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart="--",this.$id="ace/mode/cirru"}.call(u.prototype),t.Mode=u}); (function() {
|
||||
ace.require(["ace/mode/cirru"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-clojure.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-clojure.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-cobol.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-cobol.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/cobol_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="ACCEPT|MERGE|SUM|ADD||MESSAGE|TABLE|ADVANCING|MODE|TAPE|AFTER|MULTIPLY|TEST|ALL|NEGATIVE|TEXT|ALPHABET|NEXT|THAN|ALSO|NO|THEN|ALTERNATE|NOT|THROUGH|AND|NUMBER|THRU|ANY|OCCURS|TIME|ARE|OF|TO|AREA|OFF|TOP||ASCENDING|OMITTED|TRUE|ASSIGN|ON|TYPE|AT|OPEN|UNIT|AUTHOR|OR|UNTIL|BEFORE|OTHER|UP|BLANK|OUTPUT|USE|BLOCK|PAGE|USING|BOTTOM|PERFORM|VALUE|BY|PIC|VALUES|CALL|PICTURE|WHEN|CANCEL|PLUS|WITH|CD|POINTER|WRITE|CHARACTER|POSITION||ZERO|CLOSE|POSITIVE|ZEROS|COLUMN|PROCEDURE|ZEROES|COMMA|PROGRAM|COMMON|PROGRAM-ID|COMMUNICATION|QUOTE|COMP|RANDOM|COMPUTE|READ|CONTAINS|RECEIVE|CONFIGURATION|RECORD|CONTINUE|REDEFINES|CONTROL|REFERENCE|COPY|REMAINDER|COUNT|REPLACE|DATA|REPORT|DATE|RESERVE|DAY|RESET|DELETE|RETURN|DESTINATION|REWIND|DISABLE|REWRITE|DISPLAY|RIGHT|DIVIDE|RUN|DOWN|SAME|ELSE|SEARCH|ENABLE|SECTION|END|SELECT|ENVIRONMENT|SENTENCE|EQUAL|SET|ERROR|SIGN|EXIT|SEQUENTIAL|EXTERNAL|SIZE|FLASE|SORT|FILE|SOURCE|LENGTH|SPACE|LESS|STANDARD|LIMIT|START|LINE|STOP|LOCK|STRING|LOW-VALUE|SUBTRACT",t="true|false|null",n="count|min|max|avg|sum|rank|now|coalesce|main",r=this.createKeywordMapper({"support.function":n,keyword:e,"constant.language":t},"identifier",!0);this.$rules={start:[{token:"comment",regex:"\\*.*$"},{token:"string",regex:'".*?"'},{token:"string",regex:"'.*?'"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:r,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"paren.lparen",regex:"[\\(]"},{token:"paren.rparen",regex:"[\\)]"},{token:"text",regex:"\\s+"}]}};r.inherits(s,i),t.CobolHighlightRules=s}),ace.define("ace/mode/cobol",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/cobol_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./cobol_highlight_rules").CobolHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.lineCommentStart="*",this.$id="ace/mode/cobol"}.call(o.prototype),t.Mode=o}); (function() {
|
||||
ace.require(["ace/mode/cobol"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-coffee.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-coffee.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-coldfusion.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-coldfusion.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-crystal.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-crystal.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-csharp.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-csharp.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-csound_document.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-csound_document.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-csound_orchestra.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-csound_orchestra.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-csound_score.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-csound_score.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-csp.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-csp.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/csp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e=this.createKeywordMapper({"constant.language":"child-src|connect-src|default-src|font-src|frame-src|img-src|manifest-src|media-src|object-src|script-src|style-src|worker-src|base-uri|plugin-types|sandbox|disown-opener|form-action|frame-ancestors|report-uri|report-to|upgrade-insecure-requests|block-all-mixed-content|require-sri-for|reflected-xss|referrer|policy-uri",variable:"'none'|'self'|'unsafe-inline'|'unsafe-eval'|'strict-dynamic'|'unsafe-hashed-attributes'"},"identifier",!0);this.$rules={start:[{token:"string.link",regex:/https?:[^;\s]*/},{token:"operator.punctuation",regex:/;/},{token:e,regex:/[^\s;]+/}]}};r.inherits(s,i),t.CspHighlightRules=s}),ace.define("ace/mode/csp",["require","exports","module","ace/mode/text","ace/mode/csp_highlight_rules","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./text").Mode,i=e("./csp_highlight_rules").CspHighlightRules,s=e("../lib/oop"),o=function(){this.HighlightRules=i};s.inherits(o,r),function(){this.$id="ace/mode/csp"}.call(o.prototype),t.Mode=o}); (function() {
|
||||
ace.require(["ace/mode/csp"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-css.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-css.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-curly.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-curly.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-d.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-d.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-dart.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-dart.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-diff.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-diff.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/diff_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{regex:"^(?:\\*{15}|={67}|-{3}|\\+{3})$",token:"punctuation.definition.separator.diff",name:"keyword"},{regex:"^(@@)(\\s*.+?\\s*)(@@)(.*)$",token:["constant","constant.numeric","constant","comment.doc.tag"]},{regex:"^(\\d+)([,\\d]+)(a|d|c)(\\d+)([,\\d]+)(.*)$",token:["constant.numeric","punctuation.definition.range.diff","constant.function","constant.numeric","punctuation.definition.range.diff","invalid"],name:"meta."},{regex:"^(\\-{3}|\\+{3}|\\*{3})( .+)$",token:["constant.numeric","meta.tag"]},{regex:"^([!+>])(.*?)(\\s*)$",token:["support.constant","text","invalid"]},{regex:"^([<\\-])(.*?)(\\s*)$",token:["support.function","string","invalid"]},{regex:"^(diff)(\\s+--\\w+)?(.+?)( .+)?$",token:["variable","variable","keyword","variable"]},{regex:"^Index.+$",token:"variable"},{regex:"^\\s+$",token:"text"},{regex:"\\s*$",token:"invalid"},{defaultToken:"invisible",caseInsensitive:!0}]}};r.inherits(s,i),t.DiffHighlightRules=s}),ace.define("ace/mode/folding/diff",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(e,t){this.regExpList=e,this.flag=t,this.foldingStartMarker=RegExp("^("+e.join("|")+")",this.flag)};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=e.getLine(n),i={row:n,column:r.length},o=this.regExpList;for(var u=1;u<=o.length;u++){var a=RegExp("^("+o.slice(0,u).join("|")+")",this.flag);if(a.test(r))break}for(var f=e.getLength();++n<f;){r=e.getLine(n);if(a.test(r))break}if(n==i.row+1)return;return new s(i.row,i.column,n-1,r.length)}}.call(o.prototype)}),ace.define("ace/mode/diff",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/diff_highlight_rules","ace/mode/folding/diff"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./diff_highlight_rules").DiffHighlightRules,o=e("./folding/diff").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o(["diff","@@|\\*{5}"],"i")};r.inherits(u,i),function(){this.$id="ace/mode/diff",this.snippetFileId="ace/snippets/diff"}.call(u.prototype),t.Mode=u}); (function() {
|
||||
ace.require(["ace/mode/diff"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-django.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-django.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-dockerfile.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-dockerfile.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-dot.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-dot.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-drools.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-drools.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-edifact.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-edifact.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),ace.define("ace/mode/edifact_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o=function(){var e="UNH",t="ADR|AGR|AJT|ALC|ALI|APP|APR|ARD|ARR|ASI|ATT|AUT|BAS|BGM|BII|BUS|CAV|CCD|CCI|CDI|CDS|CDV|CED|CIN|CLA|CLI|CMP|CNI|CNT|COD|COM|COT|CPI|CPS|CPT|CST|CTA|CUX|DAM|DFN|DGS|DII|DIM|DLI|DLM|DMS|DOC|DRD|DSG|DSI|DTM|EDT|EFI|ELM|ELU|ELV|EMP|EQA|EQD|EQN|ERC|ERP|EVE|FCA|FII|FNS|FNT|FOR|FSQ|FTX|GDS|GEI|GID|GIN|GIR|GOR|GPO|GRU|HAN|HYN|ICD|IDE|IFD|IHC|IMD|IND|INP|INV|IRQ|LAN|LIN|LOC|MEA|MEM|MKS|MOA|MSG|MTD|NAD|NAT|PAC|PAI|PAS|PCC|PCD|PCI|PDI|PER|PGI|PIA|PNA|POC|PRC|PRI|PRV|PSD|PTY|PYT|QRS|QTY|QUA|QVR|RCS|REL|RFF|RJL|RNG|ROD|RSL|RTE|SAL|SCC|SCD|SEG|SEL|SEQ|SFI|SGP|SGU|SPR|SPS|STA|STC|STG|STS|TAX|TCC|TDT|TEM|TMD|TMP|TOD|TPL|TRU|TSR|UNB|UNZ|UNT|UGH|UGT|UNS|VLI",e="UNH",n="null|Infinity|NaN|undefined",r="",s="BY|SE|ON|INV|JP|UNOA",o=this.createKeywordMapper({"variable.language":"this",keyword:s,"entity.name.segment":t,"entity.name.header":e,"constant.language":n,"support.function":r},"identifier");this.$rules={start:[{token:"punctuation.operator",regex:"\\+.\\+"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:o,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+"},{token:"punctuation.operator",regex:"\\:|'"},{token:"identifier",regex:"\\:D\\:"}]},this.embedRules(i,"doc-",[i.getEndRule("start")])};o.metaData={fileTypes:["edi"],keyEquivalent:"^~E",name:"Edifact",scopeName:"source.edifact"},r.inherits(o,s),t.EdifactHighlightRules=o}),ace.define("ace/mode/edifact",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/edifact_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./edifact_highlight_rules").EdifactHighlightRules,o=function(){this.HighlightRules=s};r.inherits(o,i),function(){this.$id="ace/mode/edifact",this.snippetFileId="ace/snippets/edifact"}.call(o.prototype),t.Mode=o}); (function() {
|
||||
ace.require(["ace/mode/edifact"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-eiffel.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-eiffel.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/eiffel_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="across|agent|alias|all|attached|as|assign|attribute|check|class|convert|create|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|Precursor|redefine|rename|require|rescue|retry|select|separate|some|then|undefine|until|variant|when",t="and|implies|or|xor",n="Void",r="True|False",i="Current|Result",s=this.createKeywordMapper({"constant.language":n,"constant.language.boolean":r,"variable.language":i,"keyword.operator":t,keyword:e},"identifier",!0),o=/(?:[^"%\b\f\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)+?/;this.$rules={start:[{token:"string.quoted.other",regex:/"\[/,next:"aligned_verbatim_string"},{token:"string.quoted.other",regex:/"\{/,next:"non-aligned_verbatim_string"},{token:"string.quoted.double",regex:/"(?:[^%\b\f\n\r\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)*?"/},{token:"comment.line.double-dash",regex:/--.*/},{token:"constant.character",regex:/'(?:[^%\b\f\n\r\t\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)'/},{token:"constant.numeric",regex:/\b0(?:[xX][\da-fA-F](?:_*[\da-fA-F])*|[cC][0-7](?:_*[0-7])*|[bB][01](?:_*[01])*)\b/},{token:"constant.numeric",regex:/(?:\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?[eE][+-]?)?\d(?:_*\d)*|\d(?:_*\d)*\.?/},{token:"paren.lparen",regex:/[\[({]|<<|\|\(/},{token:"paren.rparen",regex:/[\])}]|>>|\|\)/},{token:"keyword.operator",regex:/:=|->|\.(?=\w)|[;,:?]/},{token:"keyword.operator",regex:/\\\\|\|\.\.\||\.\.|\/[~\/]?|[><\/]=?|[-+*^=~]/},{token:function(e){var t=s(e);return t==="identifier"&&e===e.toUpperCase()&&(t="entity.name.type"),t},regex:/[a-zA-Z][a-zA-Z\d_]*\b/},{token:"text",regex:/\s+/}],aligned_verbatim_string:[{token:"string",regex:/]"/,next:"start"},{token:"string",regex:o}],"non-aligned_verbatim_string":[{token:"string.quoted.other",regex:/}"/,next:"start"},{token:"string.quoted.other",regex:o}]}};r.inherits(s,i),t.EiffelHighlightRules=s}),ace.define("ace/mode/eiffel",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/eiffel_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./eiffel_highlight_rules").EiffelHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.lineCommentStart="--",this.$id="ace/mode/eiffel"}.call(o.prototype),t.Mode=o}); (function() {
|
||||
ace.require(["ace/mode/eiffel"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-ejs.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-ejs.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-elixir.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-elixir.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-elm.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-elm.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/elm_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e=this.createKeywordMapper({keyword:"as|case|class|data|default|deriving|do|else|export|foreign|hiding|jsevent|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|open|then|type|where|_|port|\u03bb"},"identifier"),t=/\\(\d+|['"\\&trnbvf])/,n=/[a-z_]/.source,r=/[A-Z]/.source,i=/[a-z_A-Z0-9']/.source;this.$rules={start:[{token:"string.start",regex:'"',next:"string"},{token:"string.character",regex:"'(?:"+t.source+"|.)'?"},{regex:/0(?:[xX][0-9A-Fa-f]+|[oO][0-7]+)|\d+(\.\d+)?([eE][-+]?\d*)?/,token:"constant.numeric"},{token:"comment",regex:"--.*"},{token:"keyword",regex:/\.\.|\||:|=|\\|"|->|<-|\u2192/},{token:"keyword.operator",regex:/[-!#$%&*+.\/<=>?@\\^|~:\u03BB\u2192]+/},{token:"operator.punctuation",regex:/[,;`]/},{regex:r+i+"+\\.?",token:function(e){return e[e.length-1]=="."?"entity.name.function":"constant.language"}},{regex:"^"+n+i+"+",token:function(e){return"constant.language"}},{token:e,regex:"[\\w\\xff-\\u218e\\u2455-\\uffff]+\\b"},{regex:"{-#?",token:"comment.start",onMatch:function(e,t,n){return this.next=e.length==2?"blockComment":"docComment",this.token}},{token:"variable.language",regex:/\[markdown\|/,next:"markdown"},{token:"paren.lparen",regex:/[\[({]/},{token:"paren.rparen",regex:/[\])}]/}],markdown:[{regex:/\|\]/,next:"start"},{defaultToken:"string"}],blockComment:[{regex:"{-",token:"comment.start",push:"blockComment"},{regex:"-}",token:"comment.end",next:"pop"},{defaultToken:"comment"}],docComment:[{regex:"{-",token:"comment.start",push:"docComment"},{regex:"-}",token:"comment.end",next:"pop"},{defaultToken:"doc.comment"}],string:[{token:"constant.language.escape",regex:t},{token:"text",regex:/\\(\s|$)/,next:"stringGap"},{token:"string.end",regex:'"',next:"start"},{defaultToken:"string"}],stringGap:[{token:"text",regex:/\\/,next:"string"},{token:"error",regex:"",next:"start"}]},this.normalizeRules()};r.inherits(s,i),t.ElmHighlightRules=s}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/elm",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/elm_highlight_rules","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./elm_highlight_rules").ElmHighlightRules,o=e("./folding/cstyle").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart="--",this.blockComment={start:"{-",end:"-}",nestable:!0},this.$id="ace/mode/elm"}.call(u.prototype),t.Mode=u}); (function() {
|
||||
ace.require(["ace/mode/elm"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-erlang.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-erlang.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-forth.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-forth.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-fortran.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-fortran.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-fsharp.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-fsharp.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-fsl.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-fsl.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/fsl_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"punctuation.definition.comment.mn",regex:/\/\*/,push:[{token:"punctuation.definition.comment.mn",regex:/\*\//,next:"pop"},{defaultToken:"comment.block.fsl"}]},{token:"comment.line.fsl",regex:/\/\//,push:[{token:"comment.line.fsl",regex:/$/,next:"pop"},{defaultToken:"comment.line.fsl"}]},{token:"entity.name.function",regex:/\${/,push:[{token:"entity.name.function",regex:/}/,next:"pop"},{defaultToken:"keyword.other"}],comment:"js outcalls"},{token:"constant.numeric",regex:/[0-9]*\.[0-9]*\.[0-9]*/,comment:"semver"},{token:"constant.language.fslLanguage",regex:"(?:graph_layout|machine_name|machine_author|machine_license|machine_comment|machine_language|machine_version|machine_reference|npm_name|graph_layout|on_init|on_halt|on_end|on_terminate|on_finalize|on_transition|on_action|on_stochastic_action|on_legal|on_main|on_forced|on_validation|on_validation_failure|on_transition_refused|on_forced_transition_refused|on_action_refused|on_enter|on_exit|start_states|end_states|terminal_states|final_states|fsl_version)\\s*:"},{token:"keyword.control.transition.fslArrow",regex:/<->|<-|->|<=>|=>|<=|<~>|~>|<~|<-=>|<=->|<-~>|<~->|<=~>|<~=>/},{token:"constant.numeric.fslProbability",regex:/[0-9]+%/,comment:"edge probability annotation"},{token:"constant.character.fslAction",regex:/\'[^']*\'/,comment:"action annotation"},{token:"string.quoted.double.fslLabel.doublequoted",regex:/\"[^"]*\"/,comment:"fsl label annotation"},{token:"entity.name.tag.fslLabel.atom",regex:/[a-zA-Z0-9_.+&()#@!?,]/,comment:"fsl label annotation"}]},this.normalizeRules()};s.metaData={fileTypes:["fsl","fsl_state"],name:"FSL",scopeName:"source.fsl"},r.inherits(s,i),t.FSLHighlightRules=s}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/fsl",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/fsl_highlight_rules","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./fsl_highlight_rules").FSLHighlightRules,o=e("./folding/cstyle").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.$id="ace/mode/fsl",this.snippetFileId="ace/snippets/fsl"}.call(u.prototype),t.Mode=u}); (function() {
|
||||
ace.require(["ace/mode/fsl"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-ftl.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-ftl.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-gcode.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-gcode.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/gcode_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="IF|DO|WHILE|ENDWHILE|CALL|ENDIF|SUB|ENDSUB|GOTO|REPEAT|ENDREPEAT|CALL",t="PI",n="ATAN|ABS|ACOS|ASIN|SIN|COS|EXP|FIX|FUP|ROUND|LN|TAN",r=this.createKeywordMapper({"support.function":n,keyword:e,"constant.language":t},"identifier",!0);this.$rules={start:[{token:"comment",regex:"\\(.*\\)"},{token:"comment",regex:"([N])([0-9]+)"},{token:"string",regex:"([G])([0-9]+\\.?[0-9]?)"},{token:"string",regex:"([M])([0-9]+\\.?[0-9]?)"},{token:"constant.numeric",regex:"([-+]?([0-9]*\\.?[0-9]+\\.?))|(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)"},{token:r,regex:"[A-Z]"},{token:"keyword.operator",regex:"EQ|LT|GT|NE|GE|LE|OR|XOR"},{token:"paren.lparen",regex:"[\\[]"},{token:"paren.rparen",regex:"[\\]]"},{token:"text",regex:"\\s+"}]}};r.inherits(s,i),t.GcodeHighlightRules=s}),ace.define("ace/mode/gcode",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/gcode_highlight_rules","ace/range"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./gcode_highlight_rules").GcodeHighlightRules,o=e("../range").Range,u=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.$id="ace/mode/gcode"}.call(u.prototype),t.Mode=u}); (function() {
|
||||
ace.require(["ace/mode/gcode"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-gherkin.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-gherkin.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/gherkin_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s="\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})",o=function(){var e=[{name:"en",labels:"Feature|Background|Scenario(?: Outline)?|Examples",keywords:"Given|When|Then|And|But"}],t=e.map(function(e){return e.labels}).join("|"),n=e.map(function(e){return e.keywords}).join("|");this.$rules={start:[{token:"constant.numeric",regex:"(?:(?:[1-9]\\d*)|(?:0))"},{token:"comment",regex:"#.*$"},{token:"keyword",regex:"(?:"+t+"):|(?:"+n+")\\b"},{token:"keyword",regex:"\\*"},{token:"string",regex:'"{3}',next:"qqstring3"},{token:"string",regex:'"',next:"qqstring"},{token:"text",regex:"^\\s*(?=@[\\w])",next:[{token:"text",regex:"\\s+"},{token:"variable.parameter",regex:"@[\\w]+"},{token:"empty",regex:"",next:"start"}]},{token:"comment",regex:"<[^>]+>"},{token:"comment",regex:"\\|(?=.)",next:"table-item"},{token:"comment",regex:"\\|$",next:"start"}],qqstring3:[{token:"constant.language.escape",regex:s},{token:"string",regex:'"{3}',next:"start"},{defaultToken:"string"}],qqstring:[{token:"constant.language.escape",regex:s},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"start"},{defaultToken:"string"}],"table-item":[{token:"comment",regex:/$/,next:"start"},{token:"comment",regex:/\|/},{token:"string",regex:/\\./},{defaultToken:"string"}]},this.normalizeRules()};r.inherits(o,i),t.GherkinHighlightRules=o}),ace.define("ace/mode/gherkin",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/gherkin_highlight_rules"],function(e,t,n){var r=e("../lib/oop"),i=e("./text").Mode,s=e("./gherkin_highlight_rules").GherkinHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.lineCommentStart="#",this.$id="ace/mode/gherkin",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=" ",s=this.getTokenizer().getLineTokens(t,e),o=s.tokens;return t.match("[ ]*\\|")&&(r+="| "),o.length&&o[o.length-1].type=="comment"?r:(e=="start"&&(t.match("Scenario:|Feature:|Scenario Outline:|Background:")?r+=i:t.match("(Given|Then).+(:)$|Examples:")?r+=i:t.match("\\*.+")&&(r+="* ")),r)}}.call(o.prototype),t.Mode=o}); (function() {
|
||||
ace.require(["ace/mode/gherkin"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-gitignore.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-gitignore.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/gitignore_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment",regex:/^\s*#.*$/},{token:"keyword",regex:/^\s*!.*$/}]},this.normalizeRules()};s.metaData={fileTypes:["gitignore"],name:"Gitignore"},r.inherits(s,i),t.GitignoreHighlightRules=s}),ace.define("ace/mode/gitignore",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/gitignore_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./gitignore_highlight_rules").GitignoreHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.lineCommentStart="#",this.$id="ace/mode/gitignore"}.call(o.prototype),t.Mode=o}); (function() {
|
||||
ace.require(["ace/mode/gitignore"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-glsl.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-glsl.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-gobstones.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-gobstones.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-golang.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-golang.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-graphqlschema.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-graphqlschema.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/graphqlschema_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="type|interface|union|enum|schema|input|implements|extends|scalar",t="Int|Float|String|ID|Boolean",n=this.createKeywordMapper({keyword:e,"storage.type":t},"identifier");this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:n,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"}]},this.normalizeRules()};r.inherits(s,i),t.GraphQLSchemaHighlightRules=s}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/graphqlschema",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/graphqlschema_highlight_rules","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./graphqlschema_highlight_rules").GraphQLSchemaHighlightRules,o=e("./folding/cstyle").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart="#",this.$id="ace/mode/graphqlschema",this.snippetFileId="ace/snippets/graphqlschema"}.call(u.prototype),t.Mode=u}); (function() {
|
||||
ace.require(["ace/mode/graphqlschema"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-groovy.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-groovy.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-haml.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-haml.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-handlebars.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-handlebars.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-haskell.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-haskell.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-haskell_cabal.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-haskell_cabal.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/haskell_cabal_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment",regex:"^\\s*--.*$"},{token:["keyword"],regex:/^(\s*\w.*?)(:(?:\s+|$))/},{token:"constant.numeric",regex:/[\d_]+(?:(?:[\.\d_]*)?)/},{token:"constant.language.boolean",regex:"(?:true|false|TRUE|FALSE|True|False|yes|no)\\b"},{token:"markup.heading",regex:/^(\w.*)$/}]}};r.inherits(s,i),t.CabalHighlightRules=s}),ace.define("ace/mode/folding/haskell_cabal",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.isHeading=function(e,t){var n="markup.heading",r=e.getTokens(t)[0];return t==0||r&&r.type.lastIndexOf(n,0)===0},this.getFoldWidget=function(e,t,n){if(this.isHeading(e,n))return"start";if(t==="markbeginend"&&!/^\s*$/.test(e.getLine(n))){var r=e.getLength();while(++n<r)if(!/^\s*$/.test(e.getLine(n)))break;if(n==r||this.isHeading(e,n))return"end"}return""},this.getFoldWidgetRange=function(e,t,n){var r=e.getLine(n),i=r.length,o=e.getLength(),u=n,a=n;if(this.isHeading(e,n)){while(++n<o)if(this.isHeading(e,n)){n--;break}a=n;if(a>u)while(a>u&&/^\s*$/.test(e.getLine(a)))a--;if(a>u){var f=e.getLine(a).length;return new s(u,i,a,f)}}else if(this.getFoldWidget(e,t,n)==="end"){var a=n,f=e.getLine(a).length;while(--n>=0)if(this.isHeading(e,n))break;var r=e.getLine(n),i=r.length;return new s(n,i,a,f)}}}.call(o.prototype)}),ace.define("ace/mode/haskell_cabal",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/haskell_cabal_highlight_rules","ace/mode/folding/haskell_cabal"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./haskell_cabal_highlight_rules").CabalHighlightRules,o=e("./folding/haskell_cabal").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart="--",this.blockComment=null,this.$id="ace/mode/haskell_cabal"}.call(u.prototype),t.Mode=u}); (function() {
|
||||
ace.require(["ace/mode/haskell_cabal"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-haxe.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-haxe.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-hjson.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-hjson.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-html.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-html.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-html_elixir.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-html_elixir.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-html_ruby.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-html_ruby.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-ini.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-ini.js
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
ace.define("ace/mode/ini_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s="\\\\(?:[\\\\0abtrn;#=:]|x[a-fA-F\\d]{4})",o=function(){this.$rules={start:[{token:"punctuation.definition.comment.ini",regex:"#.*",push_:[{token:"comment.line.number-sign.ini",regex:"$|^",next:"pop"},{defaultToken:"comment.line.number-sign.ini"}]},{token:"punctuation.definition.comment.ini",regex:";.*",push_:[{token:"comment.line.semicolon.ini",regex:"$|^",next:"pop"},{defaultToken:"comment.line.semicolon.ini"}]},{token:["keyword.other.definition.ini","text","punctuation.separator.key-value.ini"],regex:"\\b([a-zA-Z0-9_.-]+)\\b(\\s*)(=)"},{token:["punctuation.definition.entity.ini","constant.section.group-title.ini","punctuation.definition.entity.ini"],regex:"^(\\[)(.*?)(\\])"},{token:"punctuation.definition.string.begin.ini",regex:"'",push:[{token:"punctuation.definition.string.end.ini",regex:"'",next:"pop"},{token:"constant.language.escape",regex:s},{defaultToken:"string.quoted.single.ini"}]},{token:"punctuation.definition.string.begin.ini",regex:'"',push:[{token:"constant.language.escape",regex:s},{token:"punctuation.definition.string.end.ini",regex:'"',next:"pop"},{defaultToken:"string.quoted.double.ini"}]}]},this.normalizeRules()};o.metaData={fileTypes:["ini","conf"],keyEquivalent:"^~I",name:"Ini",scopeName:"source.ini"},r.inherits(o,i),t.IniHighlightRules=o}),ace.define("ace/mode/folding/ini",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(){};r.inherits(o,s),function(){this.foldingStartMarker=/^\s*\[([^\])]*)]\s*(?:$|[;#])/,this.getFoldWidgetRange=function(e,t,n){var r=this.foldingStartMarker,s=e.getLine(n),o=s.match(r);if(!o)return;var u=o[1]+".",a=s.length,f=e.getLength(),l=n,c=n;while(++n<f){s=e.getLine(n);if(/^\s*$/.test(s))continue;o=s.match(r);if(o&&o[1].lastIndexOf(u,0)!==0)break;c=n}if(c>l){var h=e.getLine(c).length;return new i(l,a,c,h)}}}.call(o.prototype)}),ace.define("ace/mode/ini",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ini_highlight_rules","ace/mode/folding/ini"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./ini_highlight_rules").IniHighlightRules,o=e("./folding/ini").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart=";",this.blockComment=null,this.$id="ace/mode/ini"}.call(u.prototype),t.Mode=u}); (function() {
|
||||
ace.require(["ace/mode/ini"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
8
Moonlight/wwwroot/editor/mode-io.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-io.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-ion.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-ion.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-jack.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-jack.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-jade.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-jade.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-java.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-java.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-javascript.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-javascript.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-json.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-json.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-json5.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-json5.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-jsoniq.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-jsoniq.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-jsp.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-jsp.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-jssm.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-jssm.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
Moonlight/wwwroot/editor/mode-jsx.js
vendored
Normal file
8
Moonlight/wwwroot/editor/mode-jsx.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue