From b6c62af0159e74b9c2859b8dd751440bd249661e Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 26 Nov 2015 17:14:22 +0100 Subject: [PATCH 001/841] fixes upgrade script --- .../AddUniqueIdPropertyTypeGroupColumn.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/AddUniqueIdPropertyTypeGroupColumn.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/AddUniqueIdPropertyTypeGroupColumn.cs index bb09faaa7f..8a50f6fa3d 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/AddUniqueIdPropertyTypeGroupColumn.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/AddUniqueIdPropertyTypeGroupColumn.cs @@ -69,7 +69,7 @@ ON cmsContentType.nodeId = umbracoNode.id")) } // set the Unique Id to the one we've generated - Update.Table("cmsPropertyTypeGroup").Set(new { uniqueID = guid }).Where(new { id = data.ptId }); + Update.Table("cmsPropertyTypeGroup").Set(new { uniqueID = guid }).Where(new { id = data.grId }); } } } From 5772bcc7f253052c64a673aa5aa2f4089f51a2cc Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 30 Nov 2015 16:39:27 +0100 Subject: [PATCH 002/841] Implement GetXxxFileStream for Deploy --- .../Interfaces/ITemplateRepository.cs | 8 ++++++++ .../Repositories/TemplateRepository.cs | 19 +++++++++++++++++++ src/Umbraco.Core/Services/FileService.cs | 8 ++++++++ src/Umbraco.Core/Services/IFileService.cs | 8 ++++++++ src/Umbraco.Core/Services/IMediaService.cs | 8 ++++++++ src/Umbraco.Core/Services/MediaService.cs | 8 ++++++++ 6 files changed, 59 insertions(+) diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs index 14957ac49f..ad6939f847 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using Umbraco.Core.Models; namespace Umbraco.Core.Persistence.Repositories @@ -54,5 +55,12 @@ namespace Umbraco.Core.Persistence.Repositories /// to validate /// True if Script is valid, otherwise false bool ValidateTemplate(ITemplate template); + + /// + /// Gets the content of a template as a stream. + /// + /// The filesystem path to the template. + /// The content of the template. + Stream GetFileStream(string path); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index 0a0dbe37dd..7213dfc92a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -475,6 +475,25 @@ namespace Umbraco.Core.Persistence.Repositories } } + public Stream GetFileStream(string filename) + { + var ext = Path.GetExtension(filename); + IFileSystem fs; + switch (ext) + { + case ".cshtml": + case ".vbhtml": + fs = _viewsFileSystem; + break; + case ".master": + fs = _masterpagesFileSystem; + break; + default: + throw new Exception("Unsupported extension " + ext + "."); + } + return fs.OpenFile(filename); + } + #region Implementation of ITemplateRepository public ITemplate Get(string alias) diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index c3d6c3f2de..17ba21802e 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -515,6 +515,14 @@ namespace Umbraco.Core.Services } } + public Stream GetTemplateFileStream(string path) + { + using (var repository = _repositoryFactory.CreateTemplateRepository(_dataUowProvider.GetUnitOfWork())) + { + return repository.GetFileStream(path); + } + } + #endregion #region Partial Views diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 18318de1db..45aa8d03dc 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using Umbraco.Core.Models; namespace Umbraco.Core.Services @@ -224,5 +225,12 @@ namespace Umbraco.Core.Services /// templates in business logic. Without this, it could cause the wrong rendering engine to be used for a package. /// RenderingEngine DetermineTemplateRenderingEngine(ITemplate template); + + /// + /// Gets the content of a template as a stream. + /// + /// The filesystem path to the template. + /// The content of the template. + Stream GetTemplateFileStream(string path); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/IMediaService.cs b/src/Umbraco.Core/Services/IMediaService.cs index d32acdd6b1..863c5728b3 100644 --- a/src/Umbraco.Core/Services/IMediaService.cs +++ b/src/Umbraco.Core/Services/IMediaService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.IO; using Umbraco.Core.Models; using Umbraco.Core.Persistence.DatabaseModelDefinitions; @@ -369,5 +370,12 @@ namespace Umbraco.Core.Services /// Optional id of the user creating the media item /// IMedia CreateMediaWithIdentity(string name, int parentId, string mediaTypeAlias, int userId = 0); + + /// + /// Gets the content of a media as a stream. + /// + /// The filesystem path to the media. + /// The content of the media. + Stream GetMediaFileStream(string path); } } diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 3bc97c60bc..f7a88b7ac6 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; +using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading; @@ -9,6 +10,7 @@ using System.Xml.Linq; using Umbraco.Core.Auditing; using Umbraco.Core.Configuration; using Umbraco.Core.Events; +using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; @@ -1248,6 +1250,12 @@ namespace Umbraco.Core.Services } } + public Stream GetMediaFileStream(string path) + { + var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + return fs.OpenFile(path); + } + #region Event Handlers /// From e68dda81d2f002d6affd97e944f927a996821b10 Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 8 Dec 2015 12:53:11 +0100 Subject: [PATCH 003/841] Try to make sense of files and medias for Deploy --- src/Umbraco.Core/IO/FileSystemExtensions.cs | 16 +- src/Umbraco.Core/IO/FileSystemWrapper.cs | 4 +- src/Umbraco.Core/IO/IFileSystem.cs | 3 +- src/Umbraco.Core/IO/MediaFileSystem.cs | 31 +- src/Umbraco.Core/IO/PhysicalFileSystem.cs | 168 +++++-- src/Umbraco.Core/IO/ResizedImage.cs | 20 - src/Umbraco.Core/IO/UmbracoMediaFile.cs | 98 ++--- src/Umbraco.Core/Media/ImageHelper.cs | 410 +++++++++++------- src/Umbraco.Core/Media/MediaHelper.cs | 286 ++++++++++++ .../Media/MediaSubfolderCounter.cs | 58 --- .../Media/UploadAutoFillProperties.cs | 200 +++++++++ src/Umbraco.Core/Models/ContentExtensions.cs | 164 +++---- src/Umbraco.Core/Models/File.cs | 15 + src/Umbraco.Core/Models/IFile.cs | 8 + .../Interfaces/ITemplateRepository.cs | 11 +- .../Repositories/TemplateRepository.cs | 96 ++-- src/Umbraco.Core/Services/FileService.cs | 12 +- src/Umbraco.Core/Services/IFileService.cs | 11 +- src/Umbraco.Core/Services/IMediaService.cs | 25 +- src/Umbraco.Core/Services/MediaService.cs | 24 +- src/Umbraco.Core/Umbraco.Core.csproj | 4 +- .../Editors/ContentControllerBase.cs | 6 + src/Umbraco.Web/Editors/ImagesController.cs | 77 +--- src/Umbraco.Web/MediaPropertyExtensions.cs | 106 ----- .../FileUploadPropertyEditor.cs | 259 +++++------ .../FileUploadPropertyValueEditor.cs | 222 ++++------ .../ImageCropperPropertyEditor.cs | 401 ++++++++--------- .../ImageCropperPropertyValueEditor.cs | 212 ++++----- src/Umbraco.Web/Umbraco.Web.csproj | 1 - .../businesslogic/datatype/FileHandlerData.cs | 2 +- 30 files changed, 1698 insertions(+), 1252 deletions(-) delete mode 100644 src/Umbraco.Core/IO/ResizedImage.cs create mode 100644 src/Umbraco.Core/Media/MediaHelper.cs delete mode 100644 src/Umbraco.Core/Media/MediaSubfolderCounter.cs create mode 100644 src/Umbraco.Core/Media/UploadAutoFillProperties.cs delete mode 100644 src/Umbraco.Web/MediaPropertyExtensions.cs diff --git a/src/Umbraco.Core/IO/FileSystemExtensions.cs b/src/Umbraco.Core/IO/FileSystemExtensions.cs index 64dcfc25a0..b71a4cf0c7 100644 --- a/src/Umbraco.Core/IO/FileSystemExtensions.cs +++ b/src/Umbraco.Core/IO/FileSystemExtensions.cs @@ -39,13 +39,19 @@ namespace Umbraco.Core.IO public static long GetSize(this IFileSystem fs, string path) { + // no idea why GetSize is not part of IFileSystem, but + // for physical file system we have way better & faster ways + // to get the size, than to read the entire thing in memory! + var physical = fs as PhysicalFileSystem; + if (physical != null) + return physical.GetSize(path); + + // other filesystems... bah... using (var file = fs.OpenFile(path)) + using (var sr = new StreamReader(file)) { - using (var sr = new StreamReader(file)) - { - var str = sr.ReadToEnd(); - return str.Length; - } + var str = sr.ReadToEnd(); + return str.Length; } } diff --git a/src/Umbraco.Core/IO/FileSystemWrapper.cs b/src/Umbraco.Core/IO/FileSystemWrapper.cs index ba2ad8f48b..676626d069 100644 --- a/src/Umbraco.Core/IO/FileSystemWrapper.cs +++ b/src/Umbraco.Core/IO/FileSystemWrapper.cs @@ -48,9 +48,9 @@ namespace Umbraco.Core.IO _wrapped.AddFile(path, stream); } - public void AddFile(string path, Stream stream, bool overrideIfExists) + public void AddFile(string path, Stream stream, bool overrideExisting) { - _wrapped.AddFile(path, stream, overrideIfExists); + _wrapped.AddFile(path, stream, overrideExisting); } public IEnumerable GetFiles(string path) diff --git a/src/Umbraco.Core/IO/IFileSystem.cs b/src/Umbraco.Core/IO/IFileSystem.cs index 3b38432c5c..b4e173b256 100644 --- a/src/Umbraco.Core/IO/IFileSystem.cs +++ b/src/Umbraco.Core/IO/IFileSystem.cs @@ -19,7 +19,7 @@ namespace Umbraco.Core.IO void AddFile(string path, Stream stream); - void AddFile(string path, Stream stream, bool overrideIfExists); + void AddFile(string path, Stream stream, bool overrideExisting); IEnumerable GetFiles(string path); @@ -31,7 +31,6 @@ namespace Umbraco.Core.IO bool FileExists(string path); - string GetRelativePath(string fullPathOrUrl); string GetFullPath(string path); diff --git a/src/Umbraco.Core/IO/MediaFileSystem.cs b/src/Umbraco.Core/IO/MediaFileSystem.cs index b35264d752..face234970 100644 --- a/src/Umbraco.Core/IO/MediaFileSystem.cs +++ b/src/Umbraco.Core/IO/MediaFileSystem.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; @@ -25,24 +26,31 @@ namespace Umbraco.Core.IO _contentConfig = contentConfig; } - public string GetRelativePath(int propertyId, string fileName) + [Obsolete("This low-level method should NOT exist.")] + public string GetRelativePath(int propertyId, string fileName) { - var seperator = _contentConfig.UploadAllowDirectories + var sep = _contentConfig.UploadAllowDirectories ? Path.DirectorySeparatorChar : '-'; - return propertyId.ToString(CultureInfo.InvariantCulture) + seperator + fileName; + return propertyId.ToString(CultureInfo.InvariantCulture) + sep + fileName; } + [Obsolete("This low-level method should NOT exist.")] public string GetRelativePath(string subfolder, string fileName) { - var seperator = _contentConfig.UploadAllowDirectories + var sep = _contentConfig.UploadAllowDirectories ? Path.DirectorySeparatorChar : '-'; - return subfolder + seperator + fileName; + return subfolder + sep + fileName; } + // what's below is weird + // we are not deleting custom thumbnails + // MediaFileSystem is not just IFileSystem + // etc + public IEnumerable GetThumbnails(string path) { var parentDirectory = Path.GetDirectoryName(path); @@ -68,5 +76,16 @@ namespace Umbraco.Core.IO GetThumbnails(path) .ForEach(DeleteFile); } + + public void CopyThumbnails(string sourcePath, string targetPath) + { + var targetPathBase = Path.GetDirectoryName(targetPath) ?? ""; + foreach (var sourceThumbPath in GetThumbnails(sourcePath)) + { + var sourceThumbFilename = Path.GetFileName(sourceThumbPath) ?? ""; + var targetThumbPath = Path.Combine(targetPathBase, sourceThumbFilename); + this.CopyFile(sourceThumbPath, targetThumbPath); + } + } } } diff --git a/src/Umbraco.Core/IO/PhysicalFileSystem.cs b/src/Umbraco.Core/IO/PhysicalFileSystem.cs index 47daff932d..7456fb29a4 100644 --- a/src/Umbraco.Core/IO/PhysicalFileSystem.cs +++ b/src/Umbraco.Core/IO/PhysicalFileSystem.cs @@ -12,6 +12,9 @@ namespace Umbraco.Core.IO // eg "c:" or "c:\path\to\site" or "\\server\path" private readonly string _rootPath; + // _rootPath, with separators replaced by forward-slashes. + private readonly string _rootPathFwd; + // the ??? url, using url separator chars, NOT ending with a separator // eg "" (?) or "/Scripts" or ??? private readonly string _rootUrl; @@ -25,6 +28,7 @@ namespace Umbraco.Core.IO _rootPath = IOHelper.MapPath(virtualRoot); _rootPath = EnsureDirectorySeparatorChar(_rootPath); _rootPath = _rootPath.TrimEnd(Path.DirectorySeparatorChar); + _rootPathFwd = EnsureUrlSeparatorChar(_rootPath); _rootUrl = IOHelper.ResolveUrl(virtualRoot); _rootUrl = EnsureUrlSeparatorChar(_rootUrl); @@ -48,17 +52,22 @@ namespace Umbraco.Core.IO //var localRoot = AppDomain.CurrentDomain.BaseDirectory; var localRoot = IOHelper.GetRootDirectorySafe(); if (Path.IsPathRooted(rootPath) == false) - { rootPath = Path.Combine(localRoot, rootPath); - } rootPath = EnsureDirectorySeparatorChar(rootPath); - rootUrl = EnsureUrlSeparatorChar(rootUrl); - _rootPath = rootPath.TrimEnd(Path.DirectorySeparatorChar); + _rootPathFwd = EnsureUrlSeparatorChar(_rootPath); + + rootUrl = EnsureUrlSeparatorChar(rootUrl); _rootUrl = rootUrl.TrimEnd('/'); } + /// + /// Gets directories in a directory. + /// + /// The filesystem-relative path to the directory. + /// The filesystem-relative path to the directories in the directory. + /// Filesystem-relative paths use forward-slashes as directory separators. public IEnumerable GetDirectories(string path) { var fullPath = GetFullPath(path); @@ -80,11 +89,20 @@ namespace Umbraco.Core.IO return Enumerable.Empty(); } + /// + /// Deletes a directory. + /// + /// The filesystem-relative path of the directory. public void DeleteDirectory(string path) { DeleteDirectory(path, false); } + /// + /// Deletes a directory. + /// + /// The filesystem-relative path of the directory. + /// A value indicating whether to recursively delete sub-directories. public void DeleteDirectory(string path, bool recursive) { var fullPath = GetFullPath(path); @@ -101,38 +119,71 @@ namespace Umbraco.Core.IO } } + /// + /// Gets a value indicating whether a directory exists. + /// + /// The filesystem-relative path of the directory. + /// A value indicating whether a directory exists. public bool DirectoryExists(string path) { var fullPath = GetFullPath(path); return Directory.Exists(fullPath); } + /// + /// Saves a file. + /// + /// The filesystem-relative path of the file. + /// A stream containing the file data. + /// Overrides the existing file, if any. public void AddFile(string path, Stream stream) { AddFile(path, stream, true); } - public void AddFile(string path, Stream stream, bool overrideIfExists) + /// + /// Saves a file. + /// + /// The filesystem-relative path of the file. + /// A stream containing the file data. + /// A value indicating whether to override the existing file, if any. + /// If a file exists and is false, an exception is thrown. + public void AddFile(string path, Stream stream, bool overrideExisting) { var fullPath = GetFullPath(path); var exists = File.Exists(fullPath); - if (exists && overrideIfExists == false) + if (exists && overrideExisting == false) throw new InvalidOperationException(string.Format("A file at path '{0}' already exists", path)); - Directory.CreateDirectory(Path.GetDirectoryName(fullPath)); // ensure it exists + var directory = Path.GetDirectoryName(fullPath); + if (directory == null) throw new InvalidOperationException("Could not get directory."); + Directory.CreateDirectory(directory); // ensure it exists - if (stream.CanSeek) + if (stream.CanSeek) // fixme - what else? stream.Seek(0, 0); - using (var destination = (Stream)File.Create(fullPath)) + using (var destination = (Stream) File.Create(fullPath)) stream.CopyTo(destination); } + /// + /// Gets files in a directory. + /// + /// The filesystem-relative path of the directory. + /// The filesystem-relative path to the files in the directory. + /// Filesystem-relative paths use forward-slashes as directory separators. public IEnumerable GetFiles(string path) { return GetFiles(path, "*.*"); } + /// + /// Gets files in a directory. + /// + /// The filesystem-relative path of the directory. + /// A filter. + /// The filesystem-relative path to the matching files in the directory. + /// Filesystem-relative paths use forward-slashes as directory separators. public IEnumerable GetFiles(string path, string filter) { var fullPath = GetFullPath(path); @@ -154,12 +205,21 @@ namespace Umbraco.Core.IO return Enumerable.Empty(); } + /// + /// Opens a file. + /// + /// The filesystem-relative path to the file. + /// public Stream OpenFile(string path) { var fullPath = GetFullPath(path); return File.OpenRead(fullPath); } + /// + /// Deletes a file. + /// + /// The filesystem-relative path to the file. public void DeleteFile(string path) { var fullPath = GetFullPath(path); @@ -176,23 +236,25 @@ namespace Umbraco.Core.IO } } + /// + /// Gets a value indicating whether a file exists. + /// + /// The filesystem-relative path to the file. + /// A value indicating whether the file exists. public bool FileExists(string path) { var fullpath = GetFullPath(path); return File.Exists(fullpath); } - // beware, many things depend on how the GetRelative/AbsolutePath methods work! - /// - /// Gets the relative path. + /// Gets the filesystem-relative path of a full path or of an url. /// /// The full path or url. /// The path, relative to this filesystem's root. /// /// The relative path is relative to this filesystem's root, not starting with any - /// directory separator. If input was recognized as a url (path), then output uses url (path) separator - /// chars. + /// directory separator. All separators are forward-slashes. /// public string GetRelativePath(string fullPathOrUrl) { @@ -203,25 +265,22 @@ namespace Umbraco.Core.IO return path.Substring(_rootUrl.Length) // strip it .TrimStart('/'); // it's relative - // test path - path = EnsureDirectorySeparatorChar(fullPathOrUrl); + if (IOHelper.PathStartsWith(path, _rootPathFwd, '/')) // if it starts with the root url... + return path.Substring(_rootPathFwd.Length) // strip it + .TrimStart('/'); // it's relative - if (IOHelper.PathStartsWith(path, _rootPath, Path.DirectorySeparatorChar)) // if it starts with the root path - return path.Substring(_rootPath.Length) // strip it - .TrimStart(Path.DirectorySeparatorChar); // it's relative - - // unchanged - including separators - return fullPathOrUrl; + // unchanged - what else? + return path; } /// /// Gets the full path. /// - /// The full or relative path. + /// The full or filesystem-relative path. /// The full path. /// /// On the physical filesystem, the full path is the rooted (ie non-relative), safe (ie within this - /// filesystem's root) path. All separators are converted to Path.DirectorySeparatorChar. + /// filesystem's root) path. All separators are Path.DirectorySeparatorChar. /// public string GetFullPath(string path) { @@ -229,49 +288,82 @@ namespace Umbraco.Core.IO var opath = path; path = EnsureDirectorySeparatorChar(path); + // fixme - this part should go! // not sure what we are doing here - so if input starts with a (back) slash, // we assume it's not a FS relative path and we try to convert it... but it // really makes little sense? if (path.StartsWith(Path.DirectorySeparatorChar.ToString())) path = GetRelativePath(path); - // if already a full path, return - if (IOHelper.PathStartsWith(path, _rootPath, Path.DirectorySeparatorChar)) - return path; + // if not already rooted, combine with the root path + if (IOHelper.PathStartsWith(path, _rootPath, Path.DirectorySeparatorChar) == false) + path = Path.Combine(_rootPath, path); - // else combine and sanitize, ie GetFullPath will take care of any relative + // sanitize - GetFullPath will take care of any relative // segments in path, eg '../../foo.tmp' - it may throw a SecurityException // if the combined path reaches illegal parts of the filesystem - var fpath = Path.Combine(_rootPath, path); - fpath = Path.GetFullPath(fpath); + path = Path.GetFullPath(path); // at that point, path is within legal parts of the filesystem, ie we have // permissions to reach that path, but it may nevertheless be outside of // our root path, due to relative segments, so better check - if (IOHelper.PathStartsWith(fpath, _rootPath, Path.DirectorySeparatorChar)) - return fpath; + if (IOHelper.PathStartsWith(path, _rootPath, Path.DirectorySeparatorChar)) + return path; + // nothing prevents us to reach the file, security-wise, yet it is outside + // this filesystem's root - throw throw new FileSecurityException("File '" + opath + "' is outside this filesystem's root."); } + /// + /// Gets the url. + /// + /// The filesystem-relative path. + /// The url. + /// All separators are forward-slashes. public string GetUrl(string path) { path = EnsureUrlSeparatorChar(path).Trim('/'); return _rootUrl + "/" + path; } + /// + /// Gets the last-modified date of a directory or file. + /// + /// The filesystem-relative path to the directory or the file. + /// The last modified date of the directory or the file. public DateTimeOffset GetLastModified(string path) { - return DirectoryExists(path) - ? new DirectoryInfo(GetFullPath(path)).LastWriteTimeUtc - : new FileInfo(GetFullPath(path)).LastWriteTimeUtc; + var fullpath = GetFullPath(path); + return DirectoryExists(fullpath) + ? new DirectoryInfo(fullpath).LastWriteTimeUtc + : new FileInfo(fullpath).LastWriteTimeUtc; } + /// + /// Gets the created date of a directory or file. + /// + /// The filesystem-relative path to the directory or the file. + /// The created date of the directory or the file. public DateTimeOffset GetCreated(string path) { - return DirectoryExists(path) - ? Directory.GetCreationTimeUtc(GetFullPath(path)) - : File.GetCreationTimeUtc(GetFullPath(path)); + var fullpath = GetFullPath(path); + return DirectoryExists(fullpath) + ? Directory.GetCreationTimeUtc(fullpath) + : File.GetCreationTimeUtc(fullpath); + } + + /// + /// Gets the size of a file. + /// + /// The filesystem-relative path to the file. + /// The file of the size, in bytes. + /// If the file does not exist, returns -1. + public long GetSize(string path) + { + var fullPath = GetFullPath(path); + var file = new FileInfo(fullPath); + return file.Exists ? file.Length : -1; } #region Helper Methods diff --git a/src/Umbraco.Core/IO/ResizedImage.cs b/src/Umbraco.Core/IO/ResizedImage.cs deleted file mode 100644 index 6586699ecf..0000000000 --- a/src/Umbraco.Core/IO/ResizedImage.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Umbraco.Core.IO -{ - internal class ResizedImage - { - public ResizedImage() - { - } - - public ResizedImage(int width, int height, string fileName) - { - Width = width; - Height = height; - FileName = fileName; - } - - public int Width { get; set; } - public int Height { get; set; } - public string FileName { get; set; } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/IO/UmbracoMediaFile.cs b/src/Umbraco.Core/IO/UmbracoMediaFile.cs index b8fe310f54..17162bcfa8 100644 --- a/src/Umbraco.Core/IO/UmbracoMediaFile.cs +++ b/src/Umbraco.Core/IO/UmbracoMediaFile.cs @@ -1,11 +1,6 @@ using System; -using System.Collections.Generic; using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; using System.IO; -using System.Linq; -using System.Threading.Tasks; using System.Web; using Umbraco.Core.Configuration; using Umbraco.Core.Logging; @@ -87,14 +82,13 @@ namespace Umbraco.Core.IO { Filename = _fs.GetFileName(Path); Extension = _fs.GetExtension(Path) != null - ? _fs.GetExtension(Path).Substring(1).ToLowerInvariant() + ? _fs.GetExtension(Path).TrimStart('.').ToLowerInvariant() : ""; Url = _fs.GetUrl(Path); + Exists = _fs.FileExists(Path); if (Exists == false) - { LogHelper.Warn("The media file doesn't exist: " + Path); - } } public bool Exists { get; private set; } @@ -117,27 +111,15 @@ namespace Umbraco.Core.IO { get { - if (_length == null) - { - if (Exists) - { - _length = _fs.GetSize(Path); - } - else - { - _length = -1; - } - } + if (_length != null) return _length.Value; + _length = Exists ? _fs.GetSize(Path) : -1; return _length.Value; } } public bool SupportsResizing { - get - { - return UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes.InvariantContains(Extension); - } + get { return ImageHelper.IsImageFile(Extension); } } public string GetFriendlyName() @@ -147,67 +129,49 @@ namespace Umbraco.Core.IO public Size GetDimensions() { - if (_size == null) - { - if (_fs.FileExists(Path)) - { - EnsureFileSupportsResizing(); + if (_size != null) return _size.Value; - using (var fs = _fs.OpenFile(Path)) - { - _size = ImageHelper.GetDimensions(fs); - } - } - else + if (_fs.FileExists(Path)) + { + EnsureFileSupportsResizing(); + + using (var fs = _fs.OpenFile(Path)) { - _size = new Size(-1, -1); + _size = ImageHelper.GetDimensions(fs); } } + else + { + _size = new Size(-1, -1); + } + return _size.Value; } public string Resize(int width, int height) { - if (Exists) - { - EnsureFileSupportsResizing(); + if (Exists == false) return string.Empty; - var fileNameThumb = DoResize(width, height, -1, string.Empty); - - return _fs.GetUrl(fileNameThumb); - } - return string.Empty; + EnsureFileSupportsResizing(); + var filepath = Resize(width, height, -1, string.Empty); + return _fs.GetUrl(filepath); } - public string Resize(int maxWidthHeight, string fileNameAddition) + public string Resize(int maxWidthHeight, string filenameAddition) { - if (Exists) - { - EnsureFileSupportsResizing(); + if (Exists == false) return string.Empty; - var fileNameThumb = DoResize(-1, -1, maxWidthHeight, fileNameAddition); - - return _fs.GetUrl(fileNameThumb); - } - return string.Empty; + EnsureFileSupportsResizing(); + var filepath = Resize(-1, -1, maxWidthHeight, filenameAddition); + return _fs.GetUrl(filepath); } - private string DoResize(int width, int height, int maxWidthHeight, string fileNameAddition) + private string Resize(int width, int height, int maxWidthHeight, string sizeName) { - using (var fs = _fs.OpenFile(Path)) + using (var filestream = _fs.OpenFile(Path)) + using (var image = Image.FromStream(filestream)) { - using (var image = Image.FromStream(fs)) - { - var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition) - ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal))) - : string.Format("{0}_{1}.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); - - var thumbnail = maxWidthHeight == -1 - ? ImageHelper.GenerateThumbnail(image, width, height, fileNameThumb, Extension, _fs) - : ImageHelper.GenerateThumbnail(image, maxWidthHeight, fileNameThumb, Extension, _fs); - - return thumbnail.FileName; - } + return ImageHelper.GenerateResized(_fs, image, Path, sizeName, maxWidthHeight, width, height).Filepath; } } @@ -216,7 +180,5 @@ namespace Umbraco.Core.IO if (SupportsResizing == false) throw new InvalidOperationException(string.Format("The file {0} is not an image, so can't get dimensions", Filename)); } - - } } diff --git a/src/Umbraco.Core/Media/ImageHelper.cs b/src/Umbraco.Core/Media/ImageHelper.cs index 5842bb67bb..2b62c37645 100644 --- a/src/Umbraco.Core/Media/ImageHelper.cs +++ b/src/Umbraco.Core/Media/ImageHelper.cs @@ -3,36 +3,52 @@ using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; -using System.Globalization; using System.IO; using System.Linq; +using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Media.Exif; +using Umbraco.Core.Models; namespace Umbraco.Core.Media { /// - /// A helper class used for imaging + /// Provides helper methods for managing images. /// internal static class ImageHelper { + private static readonly Dictionary DefaultSizes = new Dictionary + { + { 100, "thumb" }, + { 500, "big-thumb" } + }; + /// - /// Gets the dimensions of an image based on a stream + /// Gets a value indicating whether the file extension corresponds to an image. /// - /// - /// - /// - /// First try with EXIF, this is because it is insanely faster and doesn't use any memory to read exif data than to load in the entire - /// image via GDI. Otherwise loading an image into GDI consumes a crazy amount of memory on large images. - /// - /// Of course EXIF data might not exist in every file and can only exist in JPGs - /// - public static Size GetDimensions(Stream imageStream) + /// The file extension. + /// A value indicating whether the file extension corresponds to an image. + public static bool IsImageFile(string extension) + { + if (extension == null) return false; + extension = extension.TrimStart('.'); + return UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes.InvariantContains(extension); + } + + /// + /// Gets the dimensions of an image. + /// + /// A stream containing the image bytes. + /// The dimension of the image. + /// First try with EXIF as it is faster and does not load the entire image + /// in memory. Fallback to GDI which means loading the image in memory and thus + /// use potentially large amounts of memory. + public static Size GetDimensions(Stream stream) { //Try to load with exif try { - var jpgInfo = ImageFile.FromStream(imageStream); + var jpgInfo = ImageFile.FromStream(stream); if (jpgInfo.Format != ImageFileFormat.Unknown && jpgInfo.Properties.ContainsKey(ExifTag.PixelYDimension) @@ -52,16 +68,20 @@ namespace Umbraco.Core.Media } //we have no choice but to try to read in via GDI - using (var image = Image.FromStream(imageStream)) + using (var image = Image.FromStream(stream)) { var fileWidth = image.Width; var fileHeight = image.Height; return new Size(fileWidth, fileHeight); - } - + } } + /// + /// Gets the MIME type of an image. + /// + /// The image. + /// The MIME type of the image. public static string GetMimeType(this Image image) { var format = image.RawFormat; @@ -69,172 +89,226 @@ namespace Umbraco.Core.Media return codec.MimeType; } - /// - /// Creates the thumbnails if the image is larger than all of the specified ones. - /// - /// - /// - /// - /// - /// - /// - internal static IEnumerable GenerateMediaThumbnails( + #region GenerateThumbnails + + public static IEnumerable GenerateThumbnails( + IFileSystem fs, + Image image, + string filepath, + string preValue) + { + if (string.IsNullOrWhiteSpace(preValue)) + return GenerateThumbnails(fs, image, filepath); + + var additionalSizes = new List(); + var sep = preValue.Contains(",") ? "," : ";"; + var values = preValue.Split(new[] { sep }, StringSplitOptions.RemoveEmptyEntries); + foreach (var value in values) + { + int size; + if (int.TryParse(value, out size)) + additionalSizes.Add(size); + } + + return GenerateThumbnails(fs, image, filepath, additionalSizes); + } + + public static IEnumerable GenerateThumbnails( + IFileSystem fs, + Image image, + string filepath, + IEnumerable additionalSizes = null) + { + var w = image.Width; + var h = image.Height; + + var sizes = additionalSizes == null ? DefaultSizes.Keys : DefaultSizes.Keys.Concat(additionalSizes); + + // start with default sizes, + // add additional sizes, + // filter out duplicates, + // filter out those that would be larger that the original image + // and create the thumbnail + return sizes + .Distinct() + .Where(x => w >= x && h >= x) + .Select(x => GenerateResized(fs, image, filepath, DefaultSizes.ContainsKey(x) ? DefaultSizes[x] : "", x)) + .ToList(); // now + } + + public static IEnumerable GenerateThumbnails( IFileSystem fs, - string fileName, - string extension, - Image originalImage, - IEnumerable additionalThumbSizes) + Stream filestream, + string filepath, + PropertyType propertyType) { - - var result = new List(); - - var allSizesDictionary = new Dictionary {{100,"thumb"}, {500,"big-thumb"}}; - - //combine the static dictionary with the additional sizes with only unique values - var allSizes = allSizesDictionary.Select(kv => kv.Key) - .Union(additionalThumbSizes.Where(x => x > 0).Distinct()); - - var sizesDictionary = allSizes.ToDictionary(s => s, s => allSizesDictionary.ContainsKey(s) ? allSizesDictionary[s]: ""); - - foreach (var s in sizesDictionary) + // get the original image from the original stream + if (filestream.CanSeek) filestream.Seek(0, 0); // fixme - what if we cannot seek? + using (var image = Image.FromStream(filestream)) { - var size = s.Key; - var name = s.Value; - if (originalImage.Width >= size && originalImage.Height >= size) + return GenerateThumbnails(fs, image, filepath, propertyType); + } + } + + public static IEnumerable GenerateThumbnails( + IFileSystem fs, + Image image, + string filepath, + PropertyType propertyType) + { + // if the editor is an upload field, check for additional thumbnail sizes + // that can be defined in the prevalue for the property data type. otherwise, + // just use the default sizes. + var sizes = propertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias + ? ApplicationContext.Current.Services.DataTypeService + .GetPreValuesByDataTypeId(propertyType.DataTypeDefinitionId) + .FirstOrDefault() + : string.Empty; + + return GenerateThumbnails(fs, image, filepath, sizes); + } + + #endregion + + #region GenerateResized - Generate at resized filepath derived from origin filepath + + public static ResizedImage GenerateResized(IFileSystem fs, Image originImage, string originFilepath, string sizeName, int maxWidthHeight) + { + return GenerateResized(fs, originImage, originFilepath, sizeName, maxWidthHeight, -1, -1); + } + + public static ResizedImage GenerateResized(IFileSystem fs, Image originImage, string originFilepath, string sizeName, int fixedWidth, int fixedHeight) + { + return GenerateResized(fs, originImage, originFilepath, sizeName, -1, fixedWidth, fixedHeight); + } + + public static ResizedImage GenerateResized(IFileSystem fs, Image originImage, string originFilepath, string sizeName, int maxWidthHeight, int fixedWidth, int fixedHeight) + { + if (string.IsNullOrWhiteSpace(sizeName)) + sizeName = "UMBRACOSYSTHUMBNAIL"; + var extension = Path.GetExtension(originFilepath) ?? string.Empty; + var filebase = originFilepath.TrimEnd(extension); + var resizedFilepath = filebase + "_" + sizeName + ".jpg"; + + return GenerateResizedAt(fs, originImage, resizedFilepath, maxWidthHeight, fixedWidth, fixedHeight); + } + + #endregion + + #region GenerateResizedAt - Generate at specified resized filepath + + public static ResizedImage GenerateResizedAt(IFileSystem fs, Image originImage, string resizedFilepath, int maxWidthHeight) + { + return GenerateResizedAt(fs, originImage, resizedFilepath, maxWidthHeight, -1, -1); + } + + public static ResizedImage GenerateResizedAt(IFileSystem fs, Image originImage, int fixedWidth, int fixedHeight, string resizedFilepath) + { + return GenerateResizedAt(fs, originImage, resizedFilepath, -1, fixedWidth, fixedHeight); + } + + public static ResizedImage GenerateResizedAt(IFileSystem fs, Image originImage, string resizedFilepath, int maxWidthHeight, int fixedWidth, int fixedHeight) + { + // target dimensions + int width, height; + + // if maxWidthHeight then get ratio + if (maxWidthHeight > 0) + { + var fx = (float) originImage.Size.Width / maxWidthHeight; + var fy = (float) originImage.Size.Height / maxWidthHeight; + var f = Math.Max(fx, fy); // fit in thumbnail size + width = (int) Math.Round(originImage.Size.Width / f); + height = (int) Math.Round(originImage.Size.Height / f); + if (width == 0) width = 1; + if (height == 0) height = 1; + } + else if (fixedWidth > 0 && fixedHeight > 0) + { + width = fixedWidth; + height = fixedHeight; + } + else + { + width = height = 1; + } + + // create new image with best quality settings + using (var bitmap = new Bitmap(width, height)) + using (var graphics = Graphics.FromImage(bitmap)) + { + // if the image size is rather large we cannot use the best quality interpolation mode + // because we'll get out of mem exceptions. So we detect how big the image is and use + // the mid quality interpolation mode when the image size exceeds our max limit. + graphics.InterpolationMode = originImage.Width > 5000 || originImage.Height > 5000 + ? InterpolationMode.Bilinear // mid quality + : InterpolationMode.HighQualityBicubic; // best quality + + // everything else is best-quality + graphics.SmoothingMode = SmoothingMode.HighQuality; + graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + graphics.CompositingQuality = CompositingQuality.HighQuality; + + // copy the old image to the new and resize + var rect = new Rectangle(0, 0, width, height); + graphics.DrawImage(originImage, rect, 0, 0, originImage.Width, originImage.Height, GraphicsUnit.Pixel); + + // copy metadata + // fixme - er... no? + + // get an encoder - based upon the file type + var extension = (Path.GetExtension(resizedFilepath) ?? "").TrimStart('.').ToLowerInvariant(); + var encoders = ImageCodecInfo.GetImageEncoders(); + var encoder = extension == "png" || extension == "gif" + ? encoders.Single(t => t.MimeType.Equals("image/png")) + : encoders.Single(t => t.MimeType.Equals("image/jpeg")); + + // set compresion ratio to 90% + var encoderParams = new EncoderParameters(); + encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 90L); + + // save the new image + using (var stream = new MemoryStream()) { - result.Add(Resize(fs, fileName, extension, size, name, originalImage)); + bitmap.Save(stream, encoder, encoderParams); + stream.Seek(0, 0); + if (resizedFilepath.Contains("UMBRACOSYSTHUMBNAIL")) + { + var filepath = resizedFilepath.Replace("UMBRACOSYSTHUMBNAIL", maxWidthHeight.ToInvariantString()); + fs.AddFile(filepath, stream); + // TODO: Remove this, this is ONLY here for backwards compatibility but it is essentially completely unusable see U4-5385 + stream.Seek(0, 0); + resizedFilepath = resizedFilepath.Replace("UMBRACOSYSTHUMBNAIL", width + "x" + height); + } + + fs.AddFile(resizedFilepath, stream); } + + return new ResizedImage(resizedFilepath, width, height); } - - return result; } - /// - /// Performs an image resize - /// - /// - /// - /// - /// - /// - /// - /// - private static ResizedImage Resize(IFileSystem fileSystem, string path, string extension, int maxWidthHeight, string fileNameAddition, Image originalImage) + #endregion + + #region Inner classes + + public class ResizedImage { - var fileNameThumb = String.IsNullOrEmpty(fileNameAddition) - ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", path.Substring(0, path.LastIndexOf("."))) - : string.Format("{0}_{1}.jpg", path.Substring(0, path.LastIndexOf(".")), fileNameAddition); + public ResizedImage() + { } - var thumb = GenerateThumbnail( - originalImage, - maxWidthHeight, - fileNameThumb, - extension, - fileSystem); - - return thumb; - } - - internal static ResizedImage GenerateThumbnail(Image image, int maxWidthHeight, string thumbnailFileName, string extension, IFileSystem fs) - { - return GenerateThumbnail(image, maxWidthHeight, -1, -1, thumbnailFileName, extension, fs); - } - - internal static ResizedImage GenerateThumbnail(Image image, int fixedWidth, int fixedHeight, string thumbnailFileName, string extension, IFileSystem fs) - { - return GenerateThumbnail(image, -1, fixedWidth, fixedHeight, thumbnailFileName, extension, fs); - } - - private static ResizedImage GenerateThumbnail(Image image, int maxWidthHeight, int fixedWidth, int fixedHeight, string thumbnailFileName, string extension, IFileSystem fs) - { - // Generate thumbnail - float f = 1; - if (maxWidthHeight >= 0) + public ResizedImage(string filepath, int width, int height) { - var fx = (float)image.Size.Width / maxWidthHeight; - var fy = (float)image.Size.Height / maxWidthHeight; - - // must fit in thumbnail size - f = Math.Max(fx, fy); + Filepath = filepath; + Width = width; + Height = height; } - //depending on if we are doing fixed width resizing or not. - fixedWidth = (maxWidthHeight > 0) ? image.Width : fixedWidth; - fixedHeight = (maxWidthHeight > 0) ? image.Height : fixedHeight; - - var widthTh = (int)Math.Round(fixedWidth / f); - var heightTh = (int)Math.Round(fixedHeight / f); - - // fixes for empty width or height - if (widthTh == 0) - widthTh = 1; - if (heightTh == 0) - heightTh = 1; - - // Create new image with best quality settings - using (var bp = new Bitmap(widthTh, heightTh)) - { - using (var g = Graphics.FromImage(bp)) - { - //if the image size is rather large we cannot use the best quality interpolation mode - // because we'll get out of mem exceptions. So we'll detect how big the image is and use - // the mid quality interpolation mode when the image size exceeds our max limit. - - if (image.Width > 5000 || image.Height > 5000) - { - //use mid quality - g.InterpolationMode = InterpolationMode.Bilinear; - } - else - { - //use best quality - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - } - - - g.SmoothingMode = SmoothingMode.HighQuality; - g.PixelOffsetMode = PixelOffsetMode.HighQuality; - g.CompositingQuality = CompositingQuality.HighQuality; - - // Copy the old image to the new and resized - var rect = new Rectangle(0, 0, widthTh, heightTh); - g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); - - // Copy metadata - var imageEncoders = ImageCodecInfo.GetImageEncoders(); - - var codec = extension.ToLower() == "png" || extension.ToLower() == "gif" - ? imageEncoders.Single(t => t.MimeType.Equals("image/png")) - : imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); - - // Set compresion ratio to 90% - var ep = new EncoderParameters(); - ep.Param[0] = new EncoderParameter(Encoder.Quality, 90L); - - // Save the new image using the dimensions of the image - var predictableThumbnailName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", maxWidthHeight.ToString(CultureInfo.InvariantCulture)); - using (var ms = new MemoryStream()) - { - bp.Save(ms, codec, ep); - ms.Seek(0, 0); - - fs.AddFile(predictableThumbnailName, ms); - } - - // TODO: Remove this, this is ONLY here for backwards compatibility but it is essentially completely unusable see U4-5385 - var newFileName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", string.Format("{0}x{1}", widthTh, heightTh)); - using (var ms = new MemoryStream()) - { - bp.Save(ms, codec, ep); - ms.Seek(0, 0); - - fs.AddFile(newFileName, ms); - } - - return new ResizedImage(widthTh, heightTh, newFileName); - } - } + public string Filepath { get; set; } + public int Width { get; set; } + public int Height { get; set; } } + #endregion } } diff --git a/src/Umbraco.Core/Media/MediaHelper.cs b/src/Umbraco.Core/Media/MediaHelper.cs new file mode 100644 index 0000000000..55bbd80d3b --- /dev/null +++ b/src/Umbraco.Core/Media/MediaHelper.cs @@ -0,0 +1,286 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Umbraco.Core.Configuration; +using Umbraco.Core.IO; +using Umbraco.Core.Models; + +namespace Umbraco.Core.Media +{ + /// + /// Provides helper methods for managing medias. + /// + /// Medias can be anything that can be uploaded via an upload + /// property, including but not limited to, images. See ImageHelper for + /// image-specific methods. + internal static class MediaHelper + { + private static long _folderCounter; + private static bool _folderCounterInitialized; + private static readonly object FolderCounterLock = new object(); + + // fixme - should be a config option of some sort! + //public static bool UseTheNewMediaPathScheme { get; set; } + public const bool UseTheNewMediaPathScheme = false; + + public static MediaFileSystem FileSystem { get { return FileSystemProviderManager.Current.GetFileSystemProvider(); } } + + #region Media Path + + /// + /// Gets the file path of a media file. + /// + /// The file name. + /// The unique identifier of the content/media owning the file. + /// The unique identifier of the property type owning the file. + /// The filesystem-relative path to the media file. + public static string GetMediaPath(string filename, Guid cuid, Guid puid) + { + filename = Path.GetFileName(filename); + if (filename == null) throw new ArgumentException("Cannot become a safe filename.", "filename"); + filename = IOHelper.SafeFileName(filename.ToLowerInvariant()); + + string folder; + if (UseTheNewMediaPathScheme == false) + { + // old scheme: filepath is "/" OR "-" + // default media filesystem maps to "~/media/" + folder = GetNextFolder(); + } + else + { + // new scheme: path is "-/" OR "--" + // default media filesystem maps to "~/media/" + // fixme - this assumes that the keys exists and won't change (even when creating a new content) + // fixme - this is going to create looooong filepaths, any chance we can shorten them? + folder = cuid.ToString("N") + "-" + puid.ToString("N"); + } + + var filepath = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories + ? Path.Combine(folder, filename) + : folder + "-" + filename; + + return filepath; + } + + /// + /// Gets the file path of a media file. + /// + /// The file name. + /// A previous file path. + /// The unique identifier of the content/media owning the file. + /// The unique identifier of the property type owning the file. + /// The filesystem-relative path to the media file. + /// In the old, legacy, number-based scheme, we try to re-use the media folder + /// specified by . Else, we create a new one. + public static string GetMediaPath(string filename, string prevpath, Guid cuid, Guid puid) + { + if (UseTheNewMediaPathScheme || string.IsNullOrWhiteSpace(prevpath)) + return GetMediaPath(filename, cuid, puid); + + filename = Path.GetFileName(filename); + if (filename == null) throw new ArgumentException("Cannot become a safe filename.", "filename"); + filename = IOHelper.SafeFileName(filename.ToLowerInvariant()); + + // old scheme, with a previous path + // prevpath should be "/" OR "-" + // and we want to reuse the "" part, so try to find it + + var sep = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories ? "/" : "-"; + var pos = prevpath.IndexOf(sep, StringComparison.Ordinal); + var s = pos > 0 ? prevpath.Substring(0, pos) : null; + int ignored; + + var folder = (pos > 0 && int.TryParse(s, out ignored)) ? s : GetNextFolder(); + + // ReSharper disable once AssignNullToNotNullAttribute + var filepath = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories + ? Path.Combine(folder, filename) + : folder + "-" + filename; + + return filepath; + } + + /// + /// Gets the next media folder in the original number-based scheme. + /// + /// + internal static string GetNextFolder() + { + lock (FolderCounterLock) + { + if (_folderCounterInitialized == false) + { + // fixme - seed was not respected in MediaSubfolderCounter? + _folderCounter = 1000; // seed + var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + var directories = fs.GetDirectories(""); + foreach (var directory in directories) + { + long folderNumber; + if (long.TryParse(directory, out folderNumber) && folderNumber > _folderCounter) + _folderCounter = folderNumber; + } + + _folderCounterInitialized = true; + } + } + + return Interlocked.Increment(ref _folderCounter).ToString(CultureInfo.InvariantCulture); + } + + #endregion + + /// + /// Stores a media file. + /// + /// The content item owning the media file. + /// The property type owning the media file. + /// The media file name. + /// A stream containing the media bytes. + /// An optional filesystem-relative filepath to the previous media file. + /// The filesystem-relative filepath to the media file. + /// + /// The file is considered "owned" by the content/propertyType. + /// If an is provided then that file (and thumbnails) is deleted + /// before the new file is saved, and depending on the media path scheme, the folder + /// may be reused for the new file. + /// + public static string StoreFile(IContentBase content, PropertyType propertyType, string filename, Stream filestream, string oldpath) + { + if (content == null) throw new ArgumentNullException("content"); + if (propertyType == null) throw new ArgumentNullException("propertyType"); + if (string.IsNullOrWhiteSpace(filename)) throw new ArgumentException("Null or empty.", "filename"); + if (filestream == null) throw new ArgumentNullException("filestream"); + + // clear the old file, if any + var fs = FileSystem; + if (string.IsNullOrWhiteSpace(oldpath)) + fs.DeleteFile(oldpath, true); + + // sanity check - fixme - every entity should be created with a proper Guid + if (content.Key == Guid.Empty) content.Key = Guid.NewGuid(); + + // get the filepath, store the data + // use oldpath as "prevpath" to try and reuse the folder, in original number-based scheme + var filepath = GetMediaPath(filename, oldpath, content.Key, propertyType.Key); + fs.AddFile(filepath, filestream); + return filepath; + } + + /// + /// Clears a media file. + /// + /// The filesystem-relative path to the media file. + public static void DeleteFile(string filepath) + { + FileSystem.DeleteFile(filepath, true); + } + + /// + /// Copies a media file. + /// + /// The content item owning the copy of the media file. + /// The property type owning the copy of the media file. + /// The filesystem-relative path to the source media file. + /// The filesystem-relative path to the copy of the media file. + public static string CopyFile(IContentBase content, PropertyType propertyType, string sourcepath) + { + if (content == null) throw new ArgumentNullException("content"); + if (propertyType == null) throw new ArgumentNullException("propertyType"); + if (string.IsNullOrWhiteSpace(sourcepath)) throw new ArgumentException("Null or empty.", "sourcepath"); + + // ensure we have a file to copy + var fs = FileSystem; + if (fs.FileExists(sourcepath) == false) return null; + + // sanity check - fixme - every entity should be created with a proper Guid + if (content.Key == Guid.Empty) content.Key = Guid.NewGuid(); + + // get the filepath + var filename = Path.GetFileName(sourcepath); + var filepath = GetMediaPath(filename, content.Key, propertyType.Key); + fs.CopyFile(sourcepath, filepath); + fs.CopyThumbnails(sourcepath, filepath); + return filepath; + } + + /// + /// Gets or creates a property for a content item. + /// + /// The content item. + /// The property type alias. + /// The property. + private static Property GetProperty(IContentBase content, string propertyTypeAlias) + { + var property = content.Properties.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); + if (property != null) return property; + + var propertyType = content.GetContentType().CompositionPropertyTypes + .FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); + if (propertyType == null) + throw new Exception("No property type exists with alias " + propertyTypeAlias + "."); + + property = new Property(propertyType); + content.Properties.Add(property); + return property; + } + + public static void SetUploadFile(IContentBase content, string propertyTypeAlias, string filename, Stream filestream) + { + var property = GetProperty(content, propertyTypeAlias); + var svalue = property.Value as string; + var oldpath = svalue == null ? null : FileSystem.GetRelativePath(svalue); + var filepath = StoreFile(content, property.PropertyType, filename, filestream, oldpath); + property.Value = FileSystem.GetUrl(filepath); + SetUploadFile(content, property, null, filepath, filestream); + } + + public static void SetUploadFile(IContentBase content, string propertyTypeAlias, string filepath) + { + var property = GetProperty(content, propertyTypeAlias); + var svalue = property.Value as string; + var oldpath = svalue == null ? null : FileSystem.GetRelativePath(svalue); // FIXME DELETE? + if (string.IsNullOrWhiteSpace(oldpath) == false && oldpath != filepath) + FileSystem.DeleteFile(oldpath); + property.Value = FileSystem.GetUrl(filepath); + var fs = FileSystem; + using (var filestream = fs.OpenFile(filepath)) + { + SetUploadFile(content, property, fs, filepath, filestream); + } + } + + // sets a file for the FileUpload property editor + // ie generates thumbnails and populates autofill properties + private static void SetUploadFile(IContentBase content, Property property, IFileSystem fs, string filepath, Stream filestream) + { + // check if file is an image (and supports resizing and thumbnails etc) + var extension = Path.GetExtension(filepath); + var isImage = ImageHelper.IsImageFile(extension); + + // specific stuff for images (thumbnails etc) + if (isImage) + { + using (var image = Image.FromStream(filestream)) + { + // use one image for all + ImageHelper.GenerateThumbnails(fs, image, filepath, property.PropertyType); + UploadAutoFillProperties.Populate(content, property.Alias, filepath, filestream, image); + } + } + else + { + // will use filepath for extension, and filestream for length + UploadAutoFillProperties.Populate(content, property.Alias, filepath, filestream); + } + } + } +} diff --git a/src/Umbraco.Core/Media/MediaSubfolderCounter.cs b/src/Umbraco.Core/Media/MediaSubfolderCounter.cs deleted file mode 100644 index 6f0142cacf..0000000000 --- a/src/Umbraco.Core/Media/MediaSubfolderCounter.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using Umbraco.Core.IO; - -namespace Umbraco.Core.Media -{ - /// - /// Internal singleton to handle the numbering of subfolders within the Media-folder. - /// When this class is initiated it will look for numbered subfolders and select the highest number, - /// which will be the start point for the naming of the next subfolders. If no subfolders exists - /// then the starting point will be 1000, ie. /media/1000/koala.jpg - /// - internal class MediaSubfolderCounter - { - #region Singleton - - private long _numberedFolder = 1000;//Default starting point - private static readonly ReaderWriterLockSlim ClearLock = new ReaderWriterLockSlim(); - private static readonly Lazy Lazy = new Lazy(() => new MediaSubfolderCounter()); - - public static MediaSubfolderCounter Current { get { return Lazy.Value; } } - - private MediaSubfolderCounter() - { - var folders = new List(); - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - var directories = fs.GetDirectories(""); - foreach (var directory in directories) - { - long dirNum; - if (long.TryParse(directory, out dirNum)) - { - folders.Add(dirNum); - } - } - var last = folders.OrderBy(x => x).LastOrDefault(); - if(last != default(long)) - _numberedFolder = last; - } - - #endregion - - /// - /// Returns an increment of the numbered media subfolders. - /// - /// A value - public long Increment() - { - using (new ReadLock(ClearLock)) - { - _numberedFolder = _numberedFolder + 1; - return _numberedFolder; - } - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Media/UploadAutoFillProperties.cs b/src/Umbraco.Core/Media/UploadAutoFillProperties.cs new file mode 100644 index 0000000000..c7157c4eb6 --- /dev/null +++ b/src/Umbraco.Core/Media/UploadAutoFillProperties.cs @@ -0,0 +1,200 @@ +using System; +using System.Drawing; +using System.IO; +using System.Linq; +using Umbraco.Core.Configuration; +using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.IO; +using Umbraco.Core.Models; + +namespace Umbraco.Core.Media +{ + /// + /// Provides extension methods to manage auto-fill properties for upload fields. + /// + internal static class UploadAutoFillProperties + { + /// + /// Gets the auto-fill configuration for a specified property alias. + /// + /// The property type alias. + /// The auto-fill configuration for the specified property alias, or null. + public static IImagingAutoFillUploadField GetConfig(string propertyTypeAlias) + { + var autoFillConfigs = UmbracoConfig.For.UmbracoSettings().Content.ImageAutoFillProperties; + return autoFillConfigs == null ? null : autoFillConfigs.FirstOrDefault(x => x.Alias == propertyTypeAlias); + } + + /// + /// Resets the auto-fill properties of a content item, for a specified property alias. + /// + /// The content item. + /// The property type alias. + public static void Reset(IContentBase content, string propertyTypeAlias) + { + if (content == null) throw new ArgumentNullException("content"); + if (propertyTypeAlias == null) throw new ArgumentNullException("propertyTypeAlias"); + + // get the config, no config = nothing to do + var autoFillConfig = GetConfig(propertyTypeAlias); + if (autoFillConfig == null) return; // nothing + + // reset + Reset(content, autoFillConfig); + } + + /// + /// Resets the auto-fill properties of a content item, for a specified auto-fill configuration. + /// + /// The content item. + /// The auto-fill configuration. + public static void Reset(IContentBase content, IImagingAutoFillUploadField autoFillConfig) + { + if (content == null) throw new ArgumentNullException("content"); + if (autoFillConfig == null) throw new ArgumentNullException("autoFillConfig"); + + ResetProperties(content, autoFillConfig); + } + + /// + /// Populates the auto-fill properties of a content item. + /// + /// The content item. + /// The property type alias. + /// The filesystem-relative filepath, or null to clear properties. + public static void Populate(IContentBase content, string propertyTypeAlias, string filepath) + { + if (content == null) throw new ArgumentNullException("content"); + if (propertyTypeAlias == null) throw new ArgumentNullException("propertyTypeAlias"); + + // no property = nothing to do + if (content.Properties.Contains(propertyTypeAlias) == false) return; + + // get the config, no config = nothing to do + var autoFillConfig = GetConfig(propertyTypeAlias); + if (autoFillConfig == null) return; // nothing + + // populate + Populate(content, autoFillConfig, filepath); + } + + /// + /// Populates the auto-fill properties of a content item. + /// + /// The content item. + /// The property type alias. + /// The filesystem-relative filepath, or null to clear properties. + /// The stream containing the file data. + /// The file data as an image object. + public static void Populate(IContentBase content, string propertyTypeAlias, string filepath, Stream filestream, Image image = null) + { + if (content == null) throw new ArgumentNullException("content"); + if (propertyTypeAlias == null) throw new ArgumentNullException("propertyTypeAlias"); + + // no property = nothing to do + if (content.Properties.Contains(propertyTypeAlias) == false) return; + + // get the config, no config = nothing to do + var autoFillConfig = GetConfig(propertyTypeAlias); + if (autoFillConfig == null) return; // nothing + + // populate + Populate(content, autoFillConfig, filepath, filestream, image); + } + + /// + /// Populates the auto-fill properties of a content item, for a specified auto-fill configuration. + /// + /// The content item. + /// The auto-fill configuration. + /// The filesystem path to the uploaded file. + /// The parameter is the path relative to the filesystem. + public static void Populate(IContentBase content, IImagingAutoFillUploadField autoFillConfig, string filepath) + { + if (content == null) throw new ArgumentNullException("content"); + if (autoFillConfig == null) throw new ArgumentNullException("autoFillConfig"); + + // no file = reset, file = auto-fill + if (filepath.IsNullOrWhiteSpace()) + { + ResetProperties(content, autoFillConfig); + } + else + { + var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + using (var filestream = fs.OpenFile(filepath)) + { + var extension = (Path.GetExtension(filepath) ?? "").TrimStart('.'); + var size = ImageHelper.IsImageFile(extension) ? (Size?) ImageHelper.GetDimensions(filestream) : null; + SetProperties(content, autoFillConfig, size, filestream.Length, extension); + } + } + } + + /// + /// Populates the auto-fill properties of a content item. + /// + /// The content item. + /// + /// The filesystem-relative filepath, or null to clear properties. + /// The stream containing the file data. + /// The file data as an image object. + public static void Populate(IContentBase content, IImagingAutoFillUploadField autoFillConfig, string filepath, Stream filestream, Image image = null) + { + if (content == null) throw new ArgumentNullException("content"); + if (autoFillConfig == null) throw new ArgumentNullException("autoFillConfig"); + + // no file = reset, file = auto-fill + if (filepath.IsNullOrWhiteSpace() || filestream == null) + { + ResetProperties(content, autoFillConfig); + } + else + { + var extension = (Path.GetExtension(filepath) ?? "").TrimStart('.'); + Size? size; + if (image == null) + size = ImageHelper.IsImageFile(extension) ? (Size?) ImageHelper.GetDimensions(filestream) : null; + else + size = new Size(image.Width, image.Height); + SetProperties(content, autoFillConfig, size, filestream.Length, extension); + } + } + + private static void SetProperties(IContentBase content, IImagingAutoFillUploadField autoFillConfig, Size? size, long length, string extension) + { + if (content == null) throw new ArgumentNullException("content"); + if (autoFillConfig == null) throw new ArgumentNullException("autoFillConfig"); + + if (content.Properties.Contains(autoFillConfig.WidthFieldAlias)) + content.Properties[autoFillConfig.WidthFieldAlias].Value = size.HasValue ? size.Value.Width.ToInvariantString() : string.Empty; + + if (content.Properties.Contains(autoFillConfig.HeightFieldAlias)) + content.Properties[autoFillConfig.HeightFieldAlias].Value = size.HasValue ? size.Value.Height.ToInvariantString() : string.Empty; + + if (content.Properties.Contains(autoFillConfig.LengthFieldAlias)) + content.Properties[autoFillConfig.LengthFieldAlias].Value = length; + + if (content.Properties.Contains(autoFillConfig.ExtensionFieldAlias)) + content.Properties[autoFillConfig.ExtensionFieldAlias].Value = extension; +} + + private static void ResetProperties(IContentBase content, IImagingAutoFillUploadField autoFillConfig) + { + if (content == null) throw new ArgumentNullException("content"); + if (autoFillConfig == null) throw new ArgumentNullException("autoFillConfig"); + + if (content.Properties.Contains(autoFillConfig.WidthFieldAlias)) + content.Properties[autoFillConfig.WidthFieldAlias].Value = string.Empty; + + if (content.Properties.Contains(autoFillConfig.HeightFieldAlias)) + content.Properties[autoFillConfig.HeightFieldAlias].Value = string.Empty; + + if (content.Properties.Contains(autoFillConfig.LengthFieldAlias)) + content.Properties[autoFillConfig.LengthFieldAlias].Value = string.Empty; + + if (content.Properties.Contains(autoFillConfig.ExtensionFieldAlias)) + content.Properties[autoFillConfig.ExtensionFieldAlias].Value = string.Empty; + } + } +} diff --git a/src/Umbraco.Core/Models/ContentExtensions.cs b/src/Umbraco.Core/Models/ContentExtensions.cs index e91996e32a..863f6b197a 100644 --- a/src/Umbraco.Core/Models/ContentExtensions.cs +++ b/src/Umbraco.Core/Models/ContentExtensions.cs @@ -1,25 +1,15 @@ using System; using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.Globalization; using System.IO; using System.Linq; using System.Web; -using System.Xml; using System.Xml.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using Umbraco.Core.Configuration; -using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Media; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Membership; -using Umbraco.Core.Strings; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Services; namespace Umbraco.Core.Models @@ -329,7 +319,7 @@ namespace Umbraco.Core.Models { if (property.Value is string) { - var value = (string)property.Value; + var value = (string) property.Value; property.Value = value.ToValidXmlString(); } } @@ -444,6 +434,19 @@ namespace Umbraco.Core.Models } } + public static IContentTypeComposition GetContentType(this IContentBase contentBase) + { + if (contentBase == null) throw new ArgumentNullException("contentBase"); + + var content = contentBase as IContent; + if (content != null) return content.ContentType; + var media = contentBase as IMedia; + if (media != null) return media.ContentType; + var member = contentBase as IMember; + if (member != null) return member.ContentType; + throw new NotSupportedException("Unsupported IContentBase implementation: " + contentBase.GetType().FullName + "."); + } + #region SetValue for setting file contents /// @@ -454,20 +457,24 @@ namespace Umbraco.Core.Models /// The containing the file that will be uploaded public static void SetValue(this IContentBase content, string propertyTypeAlias, HttpPostedFileBase value) { - // Ensure we get the filename without the path in IE in intranet mode + // ensure we get the filename without the path in IE in intranet mode // http://stackoverflow.com/questions/382464/httppostedfile-filename-different-from-ie - var fileName = value.FileName; - if (fileName.LastIndexOf(@"\") > 0) - fileName = fileName.Substring(fileName.LastIndexOf(@"\") + 1); + var filename = value.FileName; + var pos = filename.LastIndexOf(@"\", StringComparison.InvariantCulture); + if (pos > 0) + filename = filename.Substring(pos + 1); - var name = - IOHelper.SafeFileName( - fileName.Substring(fileName.LastIndexOf(IOHelper.DirSepChar) + 1, - fileName.Length - fileName.LastIndexOf(IOHelper.DirSepChar) - 1) - .ToLower()); + // strip any directory info + pos = filename.LastIndexOf(IOHelper.DirSepChar); + if (pos > 0) + filename = filename.Substring(pos + 1); - if (string.IsNullOrEmpty(name) == false) - SetFileOnContent(content, propertyTypeAlias, name, value.InputStream); + // get a safe filename - should this be done by MediaHelper? + filename = IOHelper.SafeFileName(filename); + if (string.IsNullOrWhiteSpace(filename)) return; + filename = filename.ToLower(); // fixme - er... why? + + MediaHelper.SetUploadFile(content, propertyTypeAlias, filename, value.InputStream); } /// @@ -494,104 +501,33 @@ namespace Umbraco.Core.Models } /// - /// Sets and uploads the file from a as the property value + /// Sets a content item property value with a file coming from a stream. /// - /// to add property value to - /// Alias of the property to save the value on - /// Name of the file - /// to save to disk - public static void SetValue(this IContentBase content, string propertyTypeAlias, string fileName, Stream fileStream) + /// The content item. + /// The property type alias. + /// Name of the file + /// The stream containing the file data. + /// This really is for FileUpload fields only, and should be obsoleted. For anything else, + /// you need to store the file by yourself using and then figure out + /// how to deal with auto-fill properties (if any) and thumbnails (if any) by yourself. + public static void SetValue(this IContentBase content, string propertyTypeAlias, string filename, Stream filestream) { - var name = IOHelper.SafeFileName(fileName); + if (filename == null || filestream == null) return; - if (string.IsNullOrEmpty(name) == false && fileStream != null) - SetFileOnContent(content, propertyTypeAlias, name, fileStream); + // get a safe filename - should this be done by MediaHelper? + filename = IOHelper.SafeFileName(filename); + if (string.IsNullOrWhiteSpace(filename)) return; + filename = filename.ToLower(); // fixme - er... why? + + MediaHelper.SetUploadFile(content, propertyTypeAlias, filename, filestream); } - private static void SetFileOnContent(IContentBase content, string propertyTypeAlias, string filename, Stream fileStream) + public static string StoreFile(this IContentBase content, string propertyTypeAlias, string filename, Stream filestream, string oldpath) { - var property = content.Properties.FirstOrDefault(x => x.Alias == propertyTypeAlias); - if (property == null) - return; - - //TODO: ALl of this naming logic needs to be put into the ImageHelper and then we need to change FileUploadPropertyValueEditor to do the same! - - var numberedFolder = MediaSubfolderCounter.Current.Increment(); - var fileName = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories - ? Path.Combine(numberedFolder.ToString(CultureInfo.InvariantCulture), filename) - : numberedFolder + "-" + filename; - - var extension = Path.GetExtension(filename).Substring(1).ToLowerInvariant(); - - //the file size is the length of the stream in bytes - var fileSize = fileStream.Length; - - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - fs.AddFile(fileName, fileStream); - - //Check if file supports resizing and create thumbnails - var supportsResizing = UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes.InvariantContains(extension); - - //the config section used to auto-fill properties - IImagingAutoFillUploadField uploadFieldConfigNode = null; - - //Check for auto fill of additional properties - if (UmbracoConfig.For.UmbracoSettings().Content.ImageAutoFillProperties != null) - { - uploadFieldConfigNode = UmbracoConfig.For.UmbracoSettings().Content.ImageAutoFillProperties - .FirstOrDefault(x => x.Alias == propertyTypeAlias); - - } - - if (supportsResizing) - { - //get the original image from the original stream - if (fileStream.CanSeek) fileStream.Seek(0, 0); - using (var originalImage = Image.FromStream(fileStream)) - { - var additionalSizes = new List(); - - //Look up Prevalues for this upload datatype - if it is an upload datatype - get additional configured sizes - if (property.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias) - { - //Get Prevalues by the DataType's Id: property.PropertyType.DataTypeId - var values = ApplicationContext.Current.Services.DataTypeService.GetPreValuesByDataTypeId(property.PropertyType.DataTypeDefinitionId); - var thumbnailSizes = values.FirstOrDefault(); - //Additional thumbnails configured as prevalues on the DataType - if (thumbnailSizes != null) - { - foreach (var thumb in thumbnailSizes.Split(new[] { ";", "," }, StringSplitOptions.RemoveEmptyEntries)) - { - int thumbSize; - if (thumb != "" && int.TryParse(thumb, out thumbSize)) - { - additionalSizes.Add(thumbSize); - } - } - } - } - - ImageHelper.GenerateMediaThumbnails(fs, fileName, extension, originalImage, additionalSizes); - - //while the image is still open, we'll check if we need to auto-populate the image properties - if (uploadFieldConfigNode != null) - { - content.SetValue(uploadFieldConfigNode.WidthFieldAlias, originalImage.Width.ToString(CultureInfo.InvariantCulture)); - content.SetValue(uploadFieldConfigNode.HeightFieldAlias, originalImage.Height.ToString(CultureInfo.InvariantCulture)); - } - - } - } - - //if auto-fill is true, then fill the remaining, non-image properties - if (uploadFieldConfigNode != null) - { - content.SetValue(uploadFieldConfigNode.LengthFieldAlias, fileSize.ToString(CultureInfo.InvariantCulture)); - content.SetValue(uploadFieldConfigNode.ExtensionFieldAlias, extension); - } - - //Set the value of the property to that of the uploaded file's url - property.Value = fs.GetUrl(fileName); + var propertyType = content.GetContentType() + .CompositionPropertyTypes.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); + if (propertyType == null) throw new ArgumentException("Invalid property type alias " + propertyTypeAlias + "."); + return MediaHelper.StoreFile(content, propertyType, filename, filestream, oldpath); } #endregion diff --git a/src/Umbraco.Core/Models/File.cs b/src/Umbraco.Core/Models/File.cs index 8ead6da5f8..da093f792a 100644 --- a/src/Umbraco.Core/Models/File.cs +++ b/src/Umbraco.Core/Models/File.cs @@ -25,6 +25,21 @@ namespace Umbraco.Core.Models private string _content; internal Func GetFileContent { get; set; } + // whether to use whatever already exists on filesystem + internal bool _useExistingContent; + + /// + /// Indicates that the file should use whatever content already + /// exists on the filesystem which manages the file, bypassing content + /// management entirely. + /// + /// Only for the next save. Is resetted when the file is saved. + public void UseExistingContent() + { + _useExistingContent = true; + _content = null; // force content to be loaded + } + protected File(string path, Func getFileContent = null) { _path = SanitizePath(path); diff --git a/src/Umbraco.Core/Models/IFile.cs b/src/Umbraco.Core/Models/IFile.cs index de900c50ec..0d1cf24cdd 100644 --- a/src/Umbraco.Core/Models/IFile.cs +++ b/src/Umbraco.Core/Models/IFile.cs @@ -39,6 +39,14 @@ namespace Umbraco.Core.Models /// string Content { get; set; } + /// + /// Indicates that the file should use whatever content already + /// exists on the filesystem which manages the file, bypassing content + /// management entirely. + /// + /// Only for the next save. Is resetted when the file is saved. + void UseExistingContent(); + /// /// Gets or sets the file's virtual path (i.e. the file path relative to the root of the website) /// diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs index ad6939f847..147e0b40f8 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs @@ -59,8 +59,15 @@ namespace Umbraco.Core.Persistence.Repositories /// /// Gets the content of a template as a stream. /// - /// The filesystem path to the template. + /// The filesystem path to the template. /// The content of the template. - Stream GetFileStream(string path); + Stream GetFileStream(string filepath); + + /// + /// Sets the content of a template. + /// + /// The filesystem path to the template. + /// The content of the template. + void SetFile(string filepath, Stream content); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index a2f7c841fc..da18a16598 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -202,29 +202,7 @@ namespace Umbraco.Core.Persistence.Repositories template.Path = nodeDto.Path; //now do the file work - - if (DetermineTemplateRenderingEngine(entity) == RenderingEngine.Mvc) - { - var result = _viewHelper.CreateView(template, true); - if (result != entity.Content) - { - entity.Content = result; - //re-persist it... though we don't really care about the templates in the db do we??!! - dto.Design = result; - Database.Update(dto); - } - } - else - { - var result = _masterPageHelper.CreateMasterPage(template, this, true); - if (result != entity.Content) - { - entity.Content = result; - //re-persist it... though we don't really care about the templates in the db do we??!! - dto.Design = result; - Database.Update(dto); - } - } + SaveFile(template, dto); template.ResetDirtyProperties(); @@ -274,29 +252,7 @@ namespace Umbraco.Core.Persistence.Repositories template.IsMasterTemplate = axisDefs.Any(x => x.ParentId == dto.NodeId); //now do the file work - - if (DetermineTemplateRenderingEngine(entity) == RenderingEngine.Mvc) - { - var result = _viewHelper.UpdateViewFile(entity, originalAlias); - if (result != entity.Content) - { - entity.Content = result; - //re-persist it... though we don't really care about the templates in the db do we??!! - dto.Design = result; - Database.Update(dto); - } - } - else - { - var result = _masterPageHelper.UpdateMasterPageFile(entity, originalAlias, this); - if (result != entity.Content) - { - entity.Content = result; - //re-persist it... though we don't really care about the templates in the db do we??!! - dto.Design = result; - Database.Update(dto); - } - } + SaveFile((Template) entity, dto, originalAlias); entity.ResetDirtyProperties(); @@ -305,6 +261,38 @@ namespace Umbraco.Core.Persistence.Repositories template.GetFileContent = file => GetFileContent((Template) file, false); } + private void SaveFile(Template template, TemplateDto dto, string originalAlias = null) + { + string content; + + if (template._useExistingContent) + { + content = _viewHelper.GetFileContents(template); // BUT the template does not exist yet?! + template._useExistingContent = false; // reset + } + else + { + if (DetermineTemplateRenderingEngine(template) == RenderingEngine.Mvc) + { + content = originalAlias == null + ? _viewHelper.CreateView(template, true) + : _viewHelper.UpdateViewFile(template, originalAlias); + } + else + { + content = originalAlias == null + ? _masterPageHelper.CreateMasterPage(template, this, true) + : _masterPageHelper.UpdateMasterPageFile(template, originalAlias, this); + } + } + + template.Content = content; + + if (dto.Design == content) return; + dto.Design = content; + Database.Update(dto); // though... we don't care about the db value really??!! + } + protected override void PersistDeletedItem(ITemplate entity) { var deletes = GetDeleteClauses().ToArray(); @@ -475,9 +463,19 @@ namespace Umbraco.Core.Persistence.Repositories } } - public Stream GetFileStream(string filename) + public Stream GetFileStream(string filepath) { - var ext = Path.GetExtension(filename); + return GetFileSystem(filepath).OpenFile(filepath); + } + + public void SetFile(string filepath, Stream content) + { + GetFileSystem(filepath).AddFile(filepath, content, true); + } + + private IFileSystem GetFileSystem(string filepath) + { + var ext = Path.GetExtension(filepath); IFileSystem fs; switch (ext) { @@ -491,7 +489,7 @@ namespace Umbraco.Core.Persistence.Repositories default: throw new Exception("Unsupported extension " + ext + "."); } - return fs.OpenFile(filename); + return fs; } #region Implementation of ITemplateRepository diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 17ba21802e..5c2aaff930 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -515,11 +515,19 @@ namespace Umbraco.Core.Services } } - public Stream GetTemplateFileStream(string path) + public Stream GetTemplateFileStream(string filepath) { using (var repository = _repositoryFactory.CreateTemplateRepository(_dataUowProvider.GetUnitOfWork())) { - return repository.GetFileStream(path); + return repository.GetFileStream(filepath); + } + } + + public void SetTemplateFile(string filepath, Stream content) + { + using (var repository = _repositoryFactory.CreateTemplateRepository(_dataUowProvider.GetUnitOfWork())) + { + repository.SetFile(filepath, content); } } diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 45aa8d03dc..ef608850c0 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -229,8 +229,15 @@ namespace Umbraco.Core.Services /// /// Gets the content of a template as a stream. /// - /// The filesystem path to the template. + /// The filesystem path to the template. /// The content of the template. - Stream GetTemplateFileStream(string path); + Stream GetTemplateFileStream(string filepath); + + /// + /// Sets the content of a template. + /// + /// The filesystem path to the template. + /// The content of the template. + void SetTemplateFile(string filepath, Stream content); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/IMediaService.cs b/src/Umbraco.Core/Services/IMediaService.cs index 863c5728b3..40f8c86ced 100644 --- a/src/Umbraco.Core/Services/IMediaService.cs +++ b/src/Umbraco.Core/Services/IMediaService.cs @@ -374,8 +374,29 @@ namespace Umbraco.Core.Services /// /// Gets the content of a media as a stream. /// - /// The filesystem path to the media. + /// The filesystem path to the media. /// The content of the media. - Stream GetMediaFileStream(string path); + Stream GetMediaFileStream(string filepath); + + /// + /// Sets the content of a media. + /// + /// The filesystem path to the media. + /// The content of the media. + void SetMediaFile(string filepath, Stream content); + + /// + /// Deletes a media file and all thumbnails. + /// + /// The filesystem path to the media. + void DeleteMediaFile(string filepath); + + /// + /// Generates thumbnails. + /// + /// The filesystem-relative path to the original image. + /// The property type. + /// This should be obsoleted, we should not generate thumbnails. + void GenerateThumbnails(string filepath, PropertyType propertyType); } } diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 431eb52c8d..19bf01f991 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Configuration; using Umbraco.Core.Events; using Umbraco.Core.IO; using Umbraco.Core.Logging; +using Umbraco.Core.Media; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; @@ -1258,10 +1259,27 @@ namespace Umbraco.Core.Services } } - public Stream GetMediaFileStream(string path) + public Stream GetMediaFileStream(string filepath) { - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - return fs.OpenFile(path); + return MediaHelper.FileSystem.OpenFile(filepath); + } + + public void SetMediaFile(string filepath, Stream stream) + { + MediaHelper.FileSystem.AddFile(filepath, stream, true); + } + + public void DeleteMediaFile(string filepath) + { + MediaHelper.FileSystem.DeleteFile(filepath, true); + } + + public void GenerateThumbnails(string filepath, PropertyType propertyType) + { + using (var filestream = MediaHelper.FileSystem.OpenFile(filepath)) + { + ImageHelper.GenerateThumbnails(MediaHelper.FileSystem, filestream, filepath, propertyType); + } } #region Event Handlers diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 997f57b0ca..776a090884 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -356,6 +356,8 @@ + + @@ -482,7 +484,6 @@ - @@ -531,7 +532,6 @@ - diff --git a/src/Umbraco.Web/Editors/ContentControllerBase.cs b/src/Umbraco.Web/Editors/ContentControllerBase.cs index bf9f2056b3..ec9763b678 100644 --- a/src/Umbraco.Web/Editors/ContentControllerBase.cs +++ b/src/Umbraco.Web/Editors/ContentControllerBase.cs @@ -100,6 +100,12 @@ namespace Umbraco.Web.Editors if (files.Any()) { d.Add("files", files); + // add extra things needed to figure out where to put the files + // fixme - every entity should have a Guid when created - would that be breaking? + if (contentItem.PersistedContent.Key == Guid.Empty) + contentItem.PersistedContent.Key = Guid.NewGuid(); + d.Add("cuid", contentItem.PersistedContent.Key); + d.Add("puid", dboProperty.PropertyType.Key); } var data = new ContentPropertyData(p.Value, p.PreValues, d); diff --git a/src/Umbraco.Web/Editors/ImagesController.cs b/src/Umbraco.Web/Editors/ImagesController.cs index 39960317b1..ce55d16e95 100644 --- a/src/Umbraco.Web/Editors/ImagesController.cs +++ b/src/Umbraco.Web/Editors/ImagesController.cs @@ -33,17 +33,13 @@ namespace Umbraco.Web.Editors { var media = Services.MediaService.GetById(mediaId); if (media == null) - { return Request.CreateResponse(HttpStatusCode.NotFound); - } + var imageProp = media.Properties[Constants.Conventions.Media.File]; if (imageProp == null) - { return Request.CreateResponse(HttpStatusCode.NotFound); - } var imagePath = imageProp.Value.ToString(); - return GetBigThumbnail(imagePath); } @@ -57,10 +53,9 @@ namespace Umbraco.Web.Editors /// public HttpResponseMessage GetBigThumbnail(string originalImagePath) { - if (string.IsNullOrWhiteSpace(originalImagePath)) - return Request.CreateResponse(HttpStatusCode.OK); - - return GetResized(originalImagePath, 500, "big-thumb"); + return string.IsNullOrWhiteSpace(originalImagePath) + ? Request.CreateResponse(HttpStatusCode.OK) + : GetResized(originalImagePath, 500, "big-thumb"); } /// @@ -76,17 +71,13 @@ namespace Umbraco.Web.Editors { var media = Services.MediaService.GetById(mediaId); if (media == null) - { return new HttpResponseMessage(HttpStatusCode.NotFound); - } + var imageProp = media.Properties[Constants.Conventions.Media.File]; if (imageProp == null) - { return new HttpResponseMessage(HttpStatusCode.NotFound); - } var imagePath = imageProp.Value.ToString(); - return GetResized(imagePath, width); } @@ -111,63 +102,43 @@ namespace Umbraco.Web.Editors /// /// /// - /// + /// /// - private HttpResponseMessage GetResized(string imagePath, int width, string suffix) + private HttpResponseMessage GetResized(string imagePath, int width, string sizeName) { - var mediaFileSystem = FileSystemProviderManager.Current.GetFileSystemProvider(); + var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); var ext = Path.GetExtension(imagePath); - //we need to check if it is an image by extension - if (UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes.InvariantContains(ext.TrimStart('.')) == false) - { + // we need to check if it is an image by extension + if (ImageHelper.IsImageFile(ext) == false) return Request.CreateResponse(HttpStatusCode.NotFound); - } - var thumbFilePath = imagePath.TrimEnd(ext) + "_" + suffix + ".jpg"; - var fullOrgPath = mediaFileSystem.GetFullPath(mediaFileSystem.GetRelativePath(imagePath)); - var fullNewPath = mediaFileSystem.GetFullPath(mediaFileSystem.GetRelativePath(thumbFilePath)); - var thumbIsNew = mediaFileSystem.FileExists(fullNewPath) == false; - if (thumbIsNew) + var resizedPath = imagePath.TrimEnd(ext) + "_" + sizeName + ".jpg"; + var generate = fs.FileExists(resizedPath) == false; + if (generate) { - //we need to generate it - if (mediaFileSystem.FileExists(fullOrgPath) == false) - { + // we need to generate it - if we have a source + if (fs.FileExists(imagePath) == false) return Request.CreateResponse(HttpStatusCode.NotFound); - } - using (var fileStream = mediaFileSystem.OpenFile(fullOrgPath)) + using (var fileStream = fs.OpenFile(imagePath)) + using (var originalImage = Image.FromStream(fileStream)) { - if (fileStream.CanSeek) fileStream.Seek(0, 0); - using (var originalImage = Image.FromStream(fileStream)) - { - //If it is bigger, then do the resize - if (originalImage.Width >= width && originalImage.Height >= width) - { - ImageHelper.GenerateThumbnail( - originalImage, - width, - fullNewPath, - "jpg", - mediaFileSystem); - } - else - { - //just return the original image - fullNewPath = fullOrgPath; - } - - } + // if original image is bigger than requested size, then resize, else return original image + if (originalImage.Width >= width && originalImage.Height >= width) + ImageHelper.GenerateResizedAt(fs, originalImage, resizedPath, width); + else + resizedPath = imagePath; } } var result = Request.CreateResponse(HttpStatusCode.OK); //NOTE: That we are not closing this stream as the framework will do that for us, if we try it will // fail. See http://stackoverflow.com/questions/9541351/returning-binary-file-from-controller-in-asp-net-web-api - var stream = mediaFileSystem.OpenFile(fullNewPath); + var stream = fs.OpenFile(resizedPath); if (stream.CanSeek) stream.Seek(0, 0); result.Content = new StreamContent(stream); - result.Headers.Date = mediaFileSystem.GetLastModified(imagePath); + result.Headers.Date = fs.GetLastModified(imagePath); result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); return result; } diff --git a/src/Umbraco.Web/MediaPropertyExtensions.cs b/src/Umbraco.Web/MediaPropertyExtensions.cs deleted file mode 100644 index cc6d018174..0000000000 --- a/src/Umbraco.Web/MediaPropertyExtensions.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Umbraco.Core; -using Umbraco.Core.Configuration; -using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.IO; -using Umbraco.Core.Models; - -namespace Umbraco.Web -{ - internal static class MediaPropertyExtensions - { - - internal static void AutoPopulateFileMetaDataProperties(this IContentBase model, string propertyAlias, string relativefilePath = null) - { - var mediaFileSystem = FileSystemProviderManager.Current.GetFileSystemProvider(); - var uploadFieldConfigNode = - UmbracoConfig.For.UmbracoSettings().Content.ImageAutoFillProperties - .FirstOrDefault(x => x.Alias == propertyAlias); - - if (uploadFieldConfigNode != null && model.Properties.Contains(propertyAlias)) - { - if (relativefilePath == null) - relativefilePath = model.GetValue(propertyAlias); - - //now we need to check if there is a path - if (!string.IsNullOrEmpty(relativefilePath)) - { - var fullPath = mediaFileSystem.GetFullPath(mediaFileSystem.GetRelativePath(relativefilePath)); - var umbracoFile = new UmbracoMediaFile(fullPath); - FillProperties(uploadFieldConfigNode, model, umbracoFile); - } - else - { - //for now I'm just resetting this - ResetProperties(uploadFieldConfigNode, model); - } - } - } - - internal static void ResetFileMetaDataProperties(this IContentBase content, IImagingAutoFillUploadField uploadFieldConfigNode) - { - if (uploadFieldConfigNode == null) throw new ArgumentNullException("uploadFieldConfigNode"); - ResetProperties(uploadFieldConfigNode, content); - } - - private static void ResetProperties(IImagingAutoFillUploadField uploadFieldConfigNode, IContentBase content) - { - if (content.Properties.Contains(uploadFieldConfigNode.WidthFieldAlias)) - content.Properties[uploadFieldConfigNode.WidthFieldAlias].Value = string.Empty; - - if (content.Properties.Contains(uploadFieldConfigNode.HeightFieldAlias)) - content.Properties[uploadFieldConfigNode.HeightFieldAlias].Value = string.Empty; - - if (content.Properties.Contains(uploadFieldConfigNode.LengthFieldAlias)) - content.Properties[uploadFieldConfigNode.LengthFieldAlias].Value = string.Empty; - - if (content.Properties.Contains(uploadFieldConfigNode.ExtensionFieldAlias)) - content.Properties[uploadFieldConfigNode.ExtensionFieldAlias].Value = string.Empty; - } - - - internal static void PopulateFileMetaDataProperties(this IContentBase content, IImagingAutoFillUploadField uploadFieldConfigNode, string relativeFilePath) - { - if (uploadFieldConfigNode == null) throw new ArgumentNullException("uploadFieldConfigNode"); - if (relativeFilePath.IsNullOrWhiteSpace() == false) - { - var mediaFileSystem = FileSystemProviderManager.Current.GetFileSystemProvider(); - var fullPath = mediaFileSystem.GetFullPath(mediaFileSystem.GetRelativePath(relativeFilePath)); - var umbracoFile = new UmbracoMediaFile(fullPath); - FillProperties(uploadFieldConfigNode, content, umbracoFile); - } - else - { - //for now I'm just resetting this since we cant detect a file - ResetProperties(uploadFieldConfigNode, content); - } - } - - private static void FillProperties(IImagingAutoFillUploadField uploadFieldConfigNode, IContentBase content, UmbracoMediaFile um) - { - if (uploadFieldConfigNode == null) throw new ArgumentNullException("uploadFieldConfigNode"); - if (content == null) throw new ArgumentNullException("content"); - if (um == null) throw new ArgumentNullException("um"); - var size = um.SupportsResizing ? (Size?)um.GetDimensions() : null; - - if (content.Properties.Contains(uploadFieldConfigNode.WidthFieldAlias)) - content.Properties[uploadFieldConfigNode.WidthFieldAlias].Value = size.HasValue ? size.Value.Width.ToInvariantString() : string.Empty; - - if (content.Properties.Contains(uploadFieldConfigNode.HeightFieldAlias)) - content.Properties[uploadFieldConfigNode.HeightFieldAlias].Value = size.HasValue ? size.Value.Height.ToInvariantString() : string.Empty; - - if (content.Properties.Contains(uploadFieldConfigNode.LengthFieldAlias)) - content.Properties[uploadFieldConfigNode.LengthFieldAlias].Value = um.Length; - - if (content.Properties.Contains(uploadFieldConfigNode.ExtensionFieldAlias)) - content.Properties[uploadFieldConfigNode.ExtensionFieldAlias].Value = um.Extension; - } - - - } -} diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs index 72beb09e69..bf1086513a 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs @@ -2,18 +2,11 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Drawing; -using System.Globalization; +using System.IO; using System.Linq; -using System.Text.RegularExpressions; -using System.Xml; -using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using umbraco.cms.businesslogic.Files; using Umbraco.Core; -using Umbraco.Core.Configuration; -using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.IO; -using Umbraco.Core.Logging; +using Umbraco.Core.Media; using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; @@ -23,35 +16,55 @@ namespace Umbraco.Web.PropertyEditors [PropertyEditor(Constants.PropertyEditors.UploadFieldAlias, "File upload", "fileupload", Icon = "icon-download-alt", Group = "media")] public class FileUploadPropertyEditor : PropertyEditor { - /// - /// We're going to bind to the MediaService Saving event so that we can populate the umbracoFile size, type, etc... label fields - /// if we find any attached to the current media item. - /// - /// - /// I think this kind of logic belongs on this property editor, I guess it could exist elsewhere but it all has to do with the upload field. - /// + // The FileUploadPropertyEditor properties own files and as such must manage these files, + // so we are binding to events in order to make sure that + // - files are deleted when the owning content/media is + // - files are copied when the owning content is + // - populate the auto-fill properties when the owning content/media is saved + // + // NOTE: + // although some code fragments seem to want to support uploading multiple files, + // this is NOT a feature of the FileUploadPropertyEditor and is NOT supported + // + // auto-fill properties are recalculated EVERYTIME the content/media is saved, + // even if the property has NOT been modified (it could be the same filename but + // a different file) - this is accepted (auto-fill props should die) + // + // FIXME + // for some weird backward compatibility reasons, + // - media copy is not supported + // - auto-fill properties are not supported for content items + // - auto-fill runs on MediaService.Created which makes no sense (no properties yet) + static FileUploadPropertyEditor() { + MediaService.Created += MediaServiceCreated; // see above - makes no sense MediaService.Saving += MediaServiceSaving; - MediaService.Created += MediaServiceCreating; - ContentService.Copied += ContentServiceCopied; + //MediaService.Copied += MediaServiceCopied; // see above - missing - MediaService.Deleted += (sender, args) => - args.MediaFilesToDelete.AddRange(ServiceDeleted(args.DeletedEntities.Cast())); - MediaService.EmptiedRecycleBin += (sender, args) => - args.Files.AddRange(ServiceEmptiedRecycleBin(args.AllPropertyData)); - ContentService.Deleted += (sender, args) => - args.MediaFilesToDelete.AddRange(ServiceDeleted(args.DeletedEntities.Cast())); - ContentService.EmptiedRecycleBin += (sender, args) => - args.Files.AddRange(ServiceEmptiedRecycleBin(args.AllPropertyData)); - MemberService.Deleted += (sender, args) => - args.MediaFilesToDelete.AddRange(ServiceDeleted(args.DeletedEntities.Cast())); + ContentService.Copied += ContentServiceCopied; + //ContentService.Saving += ContentServiceSaving; // see above - missing + + MediaService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); + + MediaService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( + GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); + + ContentService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); + + ContentService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( + GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); + + MemberService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); } /// - /// Creates our custom value editor + /// Creates the corresponding property value editor. /// - /// + /// The corresponding property value editor. protected override PropertyValueEditor CreateValueEditor() { var baseEditor = base.CreateValueEditor(); @@ -59,123 +72,121 @@ namespace Umbraco.Web.PropertyEditors return new FileUploadPropertyValueEditor(baseEditor); } + /// + /// Creates the corresponding preValue editor. + /// + /// The corresponding preValue editor. protected override PreValueEditor CreatePreValueEditor() { return new FileUploadPreValueEditor(); } /// - /// Ensures any files associated are removed + /// Gets a value indicating whether a property is an upload field. /// - /// - static IEnumerable ServiceEmptiedRecycleBin(Dictionary> allPropertyData) + /// The property. + /// A value indicating whether to check that the property has a non-empty value. + /// A value indicating whether a property is an upload field, and (optionaly) has a non-empty value. + private static bool IsUploadField(Property property, bool ensureValue) { - var list = new List(); - //Get all values for any image croppers found - foreach (var uploadVal in allPropertyData - .SelectMany(x => x.Value) - .Where(x => x.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias) - .Select(x => x.Value) - .WhereNotNull()) - { - if (uploadVal.ToString().IsNullOrWhiteSpace() == false) - { - list.Add(uploadVal.ToString()); - } - } - return list; + if (property.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias) + return false; + if (ensureValue == false) + return true; + return property.Value is string && string.IsNullOrWhiteSpace((string) property.Value) == false; } /// - /// Ensures any files associated are removed + /// Gets the files that need to be deleted when entities are deleted. /// - /// - static IEnumerable ServiceDeleted(IEnumerable deletedEntities) + /// The properties that were deleted. + static IEnumerable GetFilesToDelete(IEnumerable properties) { - var list = new List(); - foreach (var property in deletedEntities.SelectMany(deletedEntity => deletedEntity - .Properties - .Where(x => x.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias - && x.Value != null - && string.IsNullOrEmpty(x.Value.ToString()) == false))) - { - if (property.Value != null && property.Value.ToString().IsNullOrWhiteSpace() == false) - { - list.Add(property.Value.ToString()); - } - } - return list; + var fs = MediaHelper.FileSystem; + + return properties + .Where(x => IsUploadField(x, true)) + .Select(x => fs.GetRelativePath((string) x.Value)) + .ToList(); } /// - /// After the content is copied we need to check if there are files that also need to be copied + /// After a content has been copied, also copy uploaded files. /// - /// - /// - static void ContentServiceCopied(IContentService sender, Core.Events.CopyEventArgs e) + /// The event sender. + /// The event arguments. + static void ContentServiceCopied(IContentService sender, Core.Events.CopyEventArgs args) { - if (e.Original.Properties.Any(x => x.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias)) + // get the upload field properties with a value + var properties = args.Original.Properties.Where(x => IsUploadField(x, true)); + + // copy files + var isUpdated = false; + var fs = MediaHelper.FileSystem; + foreach (var property in properties) { - bool isUpdated = false; - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - - //Loop through properties to check if the content contains media that should be deleted - foreach (var property in e.Original.Properties.Where(x => x.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias - && x.Value != null - && string.IsNullOrEmpty(x.Value.ToString()) == false)) - { - if (fs.FileExists(fs.GetRelativePath(property.Value.ToString()))) - { - var currentPath = fs.GetRelativePath(property.Value.ToString()); - var propertyId = e.Copy.Properties.First(x => x.Alias == property.Alias).Id; - var newPath = fs.GetRelativePath(propertyId, System.IO.Path.GetFileName(currentPath)); - - fs.CopyFile(currentPath, newPath); - e.Copy.SetValue(property.Alias, fs.GetUrl(newPath)); - - //Copy thumbnails - foreach (var thumbPath in fs.GetThumbnails(currentPath)) - { - var newThumbPath = fs.GetRelativePath(propertyId, System.IO.Path.GetFileName(thumbPath)); - fs.CopyFile(thumbPath, newThumbPath); - } - isUpdated = true; - } - } - - if (isUpdated) - { - //need to re-save the copy with the updated path value - sender.Save(e.Copy); - } + var sourcePath = fs.GetRelativePath((string) property.Value); + var copyPath = MediaHelper.CopyFile(args.Copy, property.PropertyType, sourcePath); + args.Copy.SetValue(property.Alias, fs.GetUrl(copyPath)); + isUpdated = true; } + + // if updated, re-save the copy with the updated value + if (isUpdated) + sender.Save(args.Copy); } - static void MediaServiceCreating(IMediaService sender, Core.Events.NewEventArgs e) + /// + /// After a media has been created, auto-fill the properties. + /// + /// The event sender. + /// The event arguments. + static void MediaServiceCreated(IMediaService sender, Core.Events.NewEventArgs args) { - AutoFillProperties(e.Entity); + AutoFillProperties(args.Entity); } - static void MediaServiceSaving(IMediaService sender, Core.Events.SaveEventArgs e) + /// + /// After a media has been saved, auto-fill the properties. + /// + /// The event sender. + /// The event arguments. + static void MediaServiceSaving(IMediaService sender, Core.Events.SaveEventArgs args) { - foreach (var m in e.SavedEntities) + foreach (var entity in args.SavedEntities) + AutoFillProperties(entity); + } + + /// + /// After a content item has been saved, auto-fill the properties. + /// + /// The event sender. + /// The event arguments. + static void ContentServiceSaving(IContentService sender, Core.Events.SaveEventArgs args) + { + foreach (var entity in args.SavedEntities) + AutoFillProperties(entity); + } + + /// + /// Auto-fill properties (or clear). + /// + /// The content. + static void AutoFillProperties(IContentBase content) + { + var properties = content.Properties.Where(x => IsUploadField(x, false)); + var fs = MediaHelper.FileSystem; + + foreach (var property in properties) { - AutoFillProperties(m); - } - } + var autoFillConfig = UploadAutoFillProperties.GetConfig(property.Alias); + if (autoFillConfig == null) continue; - static void AutoFillProperties(IContentBase model) - { - foreach (var p in model.Properties.Where(x => x.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias)) - { - var uploadFieldConfigNode = - UmbracoConfig.For.UmbracoSettings().Content.ImageAutoFillProperties - .FirstOrDefault(x => x.Alias == p.Alias); - - if (uploadFieldConfigNode != null) - { - model.PopulateFileMetaDataProperties(uploadFieldConfigNode, p.Value == null ? string.Empty : p.Value.ToString()); - } + var svalue = property.Value as string; + if (string.IsNullOrWhiteSpace(svalue)) + UploadAutoFillProperties.Reset(content, autoFillConfig); + else + UploadAutoFillProperties.Populate(content, autoFillConfig, fs.GetRelativePath(svalue)); } } @@ -185,7 +196,6 @@ namespace Umbraco.Web.PropertyEditors internal class FileUploadPreValueEditor : ValueListPreValueEditor { public FileUploadPreValueEditor() - : base() { var field = Fields.First(); field.Description = "Enter a max width/height for each thumbnail"; @@ -210,14 +220,12 @@ namespace Umbraco.Web.PropertyEditors { //there should only be one val var delimited = dictionary.First().Value.Value.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - for (var index = 0; index < delimited.Length; index++) - { - result.Add(new PreValue(index, delimited[index])); - } + var i = 0; + result.AddRange(delimited.Select(x => new PreValue(i++, x))); } //the items list will be a dictionary of it's id -> value we need to use the id for persistence for backwards compatibility - return new Dictionary { { "items", result.ToDictionary(x => x.Id, x => PreValueAsDictionary(x)) } }; + return new Dictionary { { "items", result.ToDictionary(x => x.Id, PreValueAsDictionary) } }; } private IDictionary PreValueAsDictionary(PreValue preValue) @@ -274,6 +282,5 @@ namespace Umbraco.Web.PropertyEditors } } } - } } diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs index e4ff4da1d6..f07928591e 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs @@ -20,159 +20,125 @@ using Umbraco.Core; namespace Umbraco.Web.PropertyEditors { /// - /// The editor for the file upload property editor + /// The value editor for the file upload property editor. /// internal class FileUploadPropertyValueEditor : PropertyValueEditorWrapper { - public FileUploadPropertyValueEditor(PropertyValueEditor wrapped) : base(wrapped) - { - } + public FileUploadPropertyValueEditor(PropertyValueEditor wrapped) + : base(wrapped) + { } /// - /// Overrides the deserialize value so that we can save the file accordingly + /// Converts the value received from the editor into the value can be stored in the database. /// - /// - /// This is value passed in from the editor. We normally don't care what the editorValue.Value is set to because - /// we are more interested in the files collection associated with it, however we do care about the value if we - /// are clearing files. By default the editorValue.Value will just be set to the name of the file (but again, we - /// just ignore this and deal with the file collection in editorValue.AdditionalData.ContainsKey("files") ) - /// - /// - /// The current value persisted for this property. This will allow us to determine if we want to create a new - /// file path or use the existing file path. - /// - /// + /// The value received from the editor. + /// The current value of the property + /// The converted value. + /// + /// The is used to re-use the folder, if possible. + /// The is value passed in from the editor. We normally don't care what + /// the editorValue.Value is set to because we are more interested in the files collection associated with it, + /// however we do care about the value if we are clearing files. By default the editorValue.Value will just + /// be set to the name of the file - but again, we just ignore this and deal with the file collection in + /// editorValue.AdditionalData.ContainsKey("files") + /// We only process ONE file. We understand that the current value may contain more than one file, + /// and that more than one file may be uploaded, so we take care of them all, but we only store ONE file. + /// Other places (FileUploadPropertyEditor...) do NOT deal with multiple files, and our logic for reusing + /// folders would NOT work, etc. + /// public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue) { - if (currentValue == null) - { - currentValue = string.Empty; - } + currentValue = currentValue ?? string.Empty; - //if the value is the same then just return the current value so we don't re-process everything - if (string.IsNullOrEmpty(currentValue.ToString()) == false && editorValue.Value == currentValue.ToString()) - { + // at that point, + // currentValue is either empty or "/media/path/to/img.jpg" + // editorValue.Value is { "clearFiles": true } or { "selectedFiles": "img1.jpg,img2.jpg" } + // comparing them makes little sense + + // check the editorValue value to see whether we need to clear files + var editorJsonValue = editorValue.Value as JObject; + var clears = editorJsonValue != null && editorJsonValue["clearFiles"] != null && editorJsonValue["clearFiles"].Value(); + var uploads = editorValue.AdditionalData.ContainsKey("files") && editorValue.AdditionalData["files"] is IEnumerable; + + // nothing = no changes, return what we have already (leave existing files intact) + if (clears == false && uploads == false) return currentValue; - } - //check the editorValue value to see if we need to clear the files or not. - var clear = false; - var json = editorValue.Value as JObject; - if (json != null && json["clearFiles"] != null && json["clearFiles"].Value()) + // get the current file paths + var fs = MediaHelper.FileSystem; + var currentPaths = currentValue.ToString() + .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Select(x => fs.GetRelativePath(x)) // get the fs-relative path + .ToArray(); + + // if clearing, remove these files and return + if (clears) { - clear = json["clearFiles"].Value(); + foreach (var pathToRemove in currentPaths) + fs.DeleteFile(pathToRemove, true); + return string.Empty; // no more files } + + // ensure we have the required guids + if (editorValue.AdditionalData.ContainsKey("cuid") == false // for the content item + || editorValue.AdditionalData.ContainsKey("puid") == false) // and the property type + throw new Exception("Missing cuid/puid additional data."); + var cuido = editorValue.AdditionalData["cuid"]; + var puido = editorValue.AdditionalData["puid"]; + if ((cuido is Guid) == false || (puido is Guid) == false) + throw new Exception("Invalid cuid/puid additional data."); + var cuid = (Guid) cuido; + var puid = (Guid) puido; + if (cuid == Guid.Empty || puid == Guid.Empty) + throw new Exception("Invalid cuid/puid additional data."); - var currentPersistedValues = new string[] {}; - if (string.IsNullOrEmpty(currentValue.ToString()) == false) + // process the files + var files = ((IEnumerable) editorValue.AdditionalData["files"]).ToArray(); + + var newPaths = new List(); + const int maxLength = 1; // we only process ONE file + for (var i = 0; i < maxLength /*files.Length*/; i++) { - currentPersistedValues = currentValue.ToString().Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries); - } + var file = files[i]; - var newValue = new List(); + // skip invalid files + if (UploadFileTypeValidator.ValidateFileExtension(file.FileName) == false) + continue; - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + // get the filepath + // in case we are using the old path scheme, try to re-use numbers (bah...) + var reuse = i < currentPaths.Length ? currentPaths[i] : null; // this would be WRONG with many files + var filepath = MediaHelper.GetMediaPath(file.FileName, reuse, cuid, puid); // fs-relative path - if (clear) - { - //Remove any files that are saved for this item - foreach (var toRemove in currentPersistedValues) + using (var filestream = File.OpenRead(file.TempFilePath)) { - fs.DeleteFile(fs.GetRelativePath(toRemove), true); - } - return ""; - } - - //check for any files - if (editorValue.AdditionalData.ContainsKey("files")) - { - var files = editorValue.AdditionalData["files"] as IEnumerable; - if (files != null) - { - //now we just need to move the files to where they should be - var filesAsArray = files.ToArray(); - //a list of all of the newly saved files so we can compare with the current saved files and remove the old ones - var savedFilePaths = new List(); - for (var i = 0; i < filesAsArray.Length; i++) + fs.AddFile(filepath, filestream, true); // must overwrite! + + var ext = fs.GetExtension(filepath); + if (ImageHelper.IsImageFile(ext)) { - var file = filesAsArray[i]; - - //don't continue if this is not allowed! - if (UploadFileTypeValidator.ValidateFileExtension(file.FileName) == false) - { - continue; - } - - //TODO: ALl of this naming logic needs to be put into the ImageHelper and then we need to change ContentExtensions to do the same! - - var currentPersistedFile = currentPersistedValues.Length >= (i + 1) - ? currentPersistedValues[i] - : ""; - - var name = IOHelper.SafeFileName(file.FileName.Substring(file.FileName.LastIndexOf(IOHelper.DirSepChar) + 1, file.FileName.Length - file.FileName.LastIndexOf(IOHelper.DirSepChar) - 1).ToLower()); - - var subfolder = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories - ? currentPersistedFile.Replace(fs.GetUrl("/"), "").Split('/')[0] - : currentPersistedFile.Substring(currentPersistedFile.LastIndexOf("/", StringComparison.Ordinal) + 1).Split('-')[0]; - - int subfolderId; - var numberedFolder = int.TryParse(subfolder, out subfolderId) - ? subfolderId.ToString(CultureInfo.InvariantCulture) - : MediaSubfolderCounter.Current.Increment().ToString(CultureInfo.InvariantCulture); - - var fileName = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories - ? Path.Combine(numberedFolder, name) - : numberedFolder + "-" + name; - - using (var fileStream = File.OpenRead(file.TempFilePath)) - { - var umbracoFile = UmbracoMediaFile.Save(fileStream, fileName); - - if (umbracoFile.SupportsResizing) - { - var additionalSizes = new List(); - //get the pre-vals value - var thumbs = editorValue.PreValues.FormatAsDictionary(); - if (thumbs.Any()) - { - var thumbnailSizes = thumbs.First().Value.Value; - // additional thumbnails configured as prevalues on the DataType - foreach (var thumb in thumbnailSizes.Split(new[] { ";", "," }, StringSplitOptions.RemoveEmptyEntries)) - { - int thumbSize; - if (thumb == "" || int.TryParse(thumb, out thumbSize) == false) continue; - additionalSizes.Add(thumbSize); - } - } - - using (var image = Image.FromStream(fileStream)) - { - ImageHelper.GenerateMediaThumbnails(fs, fileName, umbracoFile.Extension, image, additionalSizes); - } - - } - newValue.Add(umbracoFile.Url); - //add to the saved paths - savedFilePaths.Add(umbracoFile.Url); - } - //now remove the temp file - File.Delete(file.TempFilePath); + var preValues = editorValue.PreValues.FormatAsDictionary(); + var sizes = preValues.Any() ? preValues.First().Value.Value : string.Empty; + using (var image = Image.FromStream(filestream)) + ImageHelper.GenerateThumbnails(fs, image, filepath, sizes); } - - //Remove any files that are no longer saved for this item - foreach (var toRemove in currentPersistedValues.Except(savedFilePaths)) - { - fs.DeleteFile(fs.GetRelativePath(toRemove), true); - } - - return string.Join(",", newValue); + // all related properties (auto-fill) are managed by FileUploadPropertyEditor + // when the content is saved (through event handlers) + + newPaths.Add(filepath); } } - //if we've made it here, we had no files to save and we were not clearing anything so just persist the same value we had before - return currentValue; + // remove all temp files + foreach (var file in files) + File.Delete(file.TempFilePath); + + // remove files that are not there anymore + foreach (var pathToRemove in currentPaths.Except(newPaths)) + fs.DeleteFile(pathToRemove, true); + + return string.Join(",", newPaths.Select(x => fs.GetUrl(x))); } - } } \ No newline at end of file diff --git a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs index 9858217a5b..a913d2cb44 100644 --- a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs @@ -2,13 +2,11 @@ using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; +using System.IO; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Umbraco.Core; -using Umbraco.Core.Configuration; -using Umbraco.Core.IO; using Umbraco.Core.Logging; +using Umbraco.Core.Media; using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; @@ -18,48 +16,62 @@ namespace Umbraco.Web.PropertyEditors [PropertyEditor(Constants.PropertyEditors.ImageCropperAlias, "Image Cropper", "imagecropper", ValueType = "JSON", HideLabel = false, Group="media", Icon="icon-crop")] public class ImageCropperPropertyEditor : PropertyEditor { + // The ImageCropperPropertyEditor properties own files and as such must manage these files, + // so we are binding to events in order to make sure that + // - files are deleted when the owning content/media is + // - files are copied when the owning content is (NOTE: not supporting media copy here!) + // - populate the auto-fill properties when files are changing + // - populate the auto-fill properties when the owning content/media is saved + // + // NOTE: + // uploading multiple files is NOT a feature of the ImageCropperPropertyEditor + // + // auto-fill properties are recalculated EVERYTIME the content/media is saved, + // even if the property has NOT been modified (it could be the same filename but + // a different file) - this is accepted (auto-fill props should die) + // + // FIXME + // for some weird backward compatibility reasons, + // - media copy is not supported + // - auto-fill properties are not supported for content items + // - auto-fill runs on MediaService.Created which makes no sense (no properties yet) - /// - /// We're going to bind to the MediaService Saving event so that we can populate the umbracoFile size, type, etc... label fields - /// if we find any attached to the current media item. - /// - /// - /// I think this kind of logic belongs on this property editor, I guess it could exist elsewhere but it all has to do with the cropper. - /// static ImageCropperPropertyEditor() { + MediaService.Created += MediaServiceCreated; // see above - makes no sense MediaService.Saving += MediaServiceSaving; - MediaService.Created += MediaServiceCreated; - ContentService.Copied += ContentServiceCopied; + //MediaService.Copied += MediaServiceCopied; // see above - missing - MediaService.Deleted += (sender, args) => - args.MediaFilesToDelete.AddRange(ServiceDeleted(args.DeletedEntities.Cast())); - MediaService.EmptiedRecycleBin += (sender, args) => - args.Files.AddRange(ServiceEmptiedRecycleBin(args.AllPropertyData)); - ContentService.Deleted += (sender, args) => - args.MediaFilesToDelete.AddRange(ServiceDeleted(args.DeletedEntities.Cast())); - ContentService.EmptiedRecycleBin += (sender, args) => - args.Files.AddRange(ServiceEmptiedRecycleBin(args.AllPropertyData)); - MemberService.Deleted += (sender, args) => - args.MediaFilesToDelete.AddRange(ServiceDeleted(args.DeletedEntities.Cast())); + ContentService.Copied += ContentServiceCopied; + //ContentService.Saving += ContentServiceSaving; // see above - missing + + MediaService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); + + MediaService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( + GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); + + ContentService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); + + ContentService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( + GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); + + MemberService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); + } + + // preValues + private IDictionary _internalPreValues; + public override IDictionary DefaultPreValues + { + get { return _internalPreValues; } + set { _internalPreValues = value; } } /// - /// Creates our custom value editor + /// Initializes a new instance of the class. /// - /// - protected override PropertyValueEditor CreateValueEditor() - { - var baseEditor = base.CreateValueEditor(); - return new ImageCropperPropertyValueEditor(baseEditor); - } - - protected override PreValueEditor CreatePreValueEditor() - { - return new ImageCropperPreValueEditor(); - } - - public ImageCropperPropertyEditor() { _internalPreValues = new Dictionary @@ -70,194 +82,191 @@ namespace Umbraco.Web.PropertyEditors } /// - /// Ensures any files associated are removed + /// Creates the corresponding property value editor. /// - /// - static IEnumerable ServiceEmptiedRecycleBin(Dictionary> allPropertyData) + /// The corresponding property value editor. + protected override PropertyValueEditor CreateValueEditor() { - var list = new List(); - //Get all values for any image croppers found - foreach (var cropperVal in allPropertyData - .SelectMany(x => x.Value) - .Where(x => x.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.ImageCropperAlias) - .Select(x => x.Value) - .WhereNotNull()) - { - JObject json; - try - { - json = JsonConvert.DeserializeObject(cropperVal.ToString()); - } - catch (Exception ex) - { - LogHelper.Error("An error occurred parsing the value stored in the image cropper value: " + cropperVal, ex); - continue; - } - - if (json["src"] != null && json["src"].ToString().IsNullOrWhiteSpace() == false) - { - list.Add(json["src"].ToString()); - } - } - return list; + var baseEditor = base.CreateValueEditor(); + return new ImageCropperPropertyValueEditor(baseEditor); } /// - /// Ensures any files associated are removed + /// Creates the corresponding preValue editor. /// - /// - static IEnumerable ServiceDeleted(IEnumerable deletedEntities) + /// The corresponding preValue editor. + protected override PreValueEditor CreatePreValueEditor() { - var list = new List(); - foreach (var property in deletedEntities.SelectMany(deletedEntity => deletedEntity - .Properties - .Where(x => x.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.ImageCropperAlias - && x.Value != null - && string.IsNullOrEmpty(x.Value.ToString()) == false))) - { - JObject json; - try - { - json = JsonConvert.DeserializeObject(property.Value.ToString()); - } - catch (Exception ex) - { - LogHelper.Error("An error occurred parsing the value stored in the image cropper value: " + property.Value, ex); - continue; - } - - if (json["src"] != null && json["src"].ToString().IsNullOrWhiteSpace() == false) - { - list.Add(json["src"].ToString()); - } - } - return list; + return new ImageCropperPreValueEditor(); } /// - /// After the content is copied we need to check if there are files that also need to be copied + /// Gets a value indicating whether a property is an image cropper field. /// - /// - /// - static void ContentServiceCopied(IContentService sender, Core.Events.CopyEventArgs e) + /// The property. + /// A value indicating whether to check that the property has a non-empty value. + /// A value indicating whether a property is an image cropper field, and (optionaly) has a non-empty value. + private static bool IsCropperField(Property property, bool ensureValue) { - if (e.Original.Properties.Any(x => x.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.ImageCropperAlias)) + if (property.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.ImageCropperAlias) + return false; + if (ensureValue == false) + return true; + return property.Value is string && string.IsNullOrWhiteSpace((string)property.Value) == false; + } + + /// + /// Parses the property value into a json object. + /// + /// The property value. + /// A value indicating whether to log the error. + /// The json object corresponding to the property value. + /// In case of an error, optionaly logs the error and returns null. + private static JObject GetJObject(string value, bool writeLog) + { + if (string.IsNullOrWhiteSpace(value)) + return null; + + try { - bool isUpdated = false; - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - - //Loop through properties to check if the content contains media that should be deleted - foreach (var property in e.Original.Properties.Where(x => x.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.ImageCropperAlias - && x.Value != null - && string.IsNullOrEmpty(x.Value.ToString()) == false)) - { - JObject json; - try - { - json = JsonConvert.DeserializeObject(property.Value.ToString()); - } - catch (Exception ex) - { - LogHelper.Error("An error occurred parsing the value stored in the image cropper value: " + property.Value.ToString(), ex); - continue; - } - - if (json["src"] != null && json["src"].ToString().IsNullOrWhiteSpace() == false) - { - if (fs.FileExists(fs.GetRelativePath(json["src"].ToString()))) - { - var currentPath = fs.GetRelativePath(json["src"].ToString()); - var propertyId = e.Copy.Properties.First(x => x.Alias == property.Alias).Id; - var newPath = fs.GetRelativePath(propertyId, System.IO.Path.GetFileName(currentPath)); - - fs.CopyFile(currentPath, newPath); - json["src"] = fs.GetUrl(newPath); - e.Copy.SetValue(property.Alias, json.ToString()); - - //Copy thumbnails - foreach (var thumbPath in fs.GetThumbnails(currentPath)) - { - var newThumbPath = fs.GetRelativePath(propertyId, System.IO.Path.GetFileName(thumbPath)); - fs.CopyFile(thumbPath, newThumbPath); - } - isUpdated = true; - } - } - - - } - - if (isUpdated) - { - //need to re-save the copy with the updated path value - sender.Save(e.Copy); - } + return JsonConvert.DeserializeObject(value); + } + catch (Exception ex) + { + if (writeLog) + LogHelper.Error("Could not parse image cropper value \"" + value + "\"", ex); + return null; } } - static void MediaServiceCreated(IMediaService sender, Core.Events.NewEventArgs e) + /// + /// Gets the files that need to be deleted when entities are deleted. + /// + /// The properties that were deleted. + static IEnumerable GetFilesToDelete(IEnumerable properties) { - AutoFillProperties(e.Entity); + var fs = MediaHelper.FileSystem; + + return properties.Where(x => IsCropperField(x, true)).Select(x => + { + var jo = GetJObject((string) x.Value, true); + if (jo == null || jo["src"] == null) return null; + var src = jo["src"].Value(); + return string.IsNullOrWhiteSpace(src) ? null : fs.GetRelativePath(src); + }).WhereNotNull(); } - static void MediaServiceSaving(IMediaService sender, Core.Events.SaveEventArgs e) + /// + /// After a content has been copied, also copy uploaded files. + /// + /// The event sender. + /// The event arguments. + static void ContentServiceCopied(IContentService sender, Core.Events.CopyEventArgs args) { - foreach (var m in e.SavedEntities) + // get the image cropper field properties with a value + var properties = args.Original.Properties.Where(x => IsCropperField(x, true)); + + // copy files + var isUpdated = false; + var fs = MediaHelper.FileSystem; + foreach (var property in properties) { - AutoFillProperties(m); + var jo = GetJObject((string) property.Value, true); + if (jo == null || jo["src"] == null) continue; + + var src = jo["src"].Value(); + if (string.IsNullOrWhiteSpace(src)) continue; + + var sourcePath = fs.GetRelativePath(src); + var copyPath = MediaHelper.CopyFile(args.Copy, property.PropertyType, sourcePath); + jo["src"] = fs.GetUrl(copyPath); + args.Copy.SetValue(property.Alias, jo.ToString()); + isUpdated = true; } + + // if updated, re-save the copy with the updated value + if (isUpdated) + sender.Save(args.Copy); } - static void AutoFillProperties(IContentBase model) + /// + /// After a media has been created, auto-fill the properties. + /// + /// The event sender. + /// The event arguments. + static void MediaServiceCreated(IMediaService sender, Core.Events.NewEventArgs args) { - foreach (var p in model.Properties.Where(x => x.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.ImageCropperAlias)) - { - var uploadFieldConfigNode = - UmbracoConfig.For.UmbracoSettings().Content.ImageAutoFillProperties - .FirstOrDefault(x => x.Alias == p.Alias); + AutoFillProperties(args.Entity); + } - if (uploadFieldConfigNode != null) + /// + /// After a media has been saved, auto-fill the properties. + /// + /// The event sender. + /// The event arguments. + static void MediaServiceSaving(IMediaService sender, Core.Events.SaveEventArgs args) + { + foreach (var entity in args.SavedEntities) + AutoFillProperties(entity); + } + + /// + /// After a content item has been saved, auto-fill the properties. + /// + /// The event sender. + /// The event arguments. + static void ContentServiceSaving(IContentService sender, Core.Events.SaveEventArgs args) + { + foreach (var entity in args.SavedEntities) + AutoFillProperties(entity); + } + + /// + /// Auto-fill properties (or clear). + /// + /// The content. + static void AutoFillProperties(IContentBase content) + { + var properties = content.Properties.Where(x => IsCropperField(x, false)); + var fs = MediaHelper.FileSystem; + + foreach (var property in properties) + { + var autoFillConfig = UploadAutoFillProperties.GetConfig(property.Alias); + if (autoFillConfig == null) continue; + + var svalue = property.Value as string; + if (string.IsNullOrWhiteSpace(svalue)) { - if (p.Value != null) - { - JObject json = null; - try - { - json = JObject.Parse((string)p.Value); - } - catch (JsonException) - { - //note: we are swallowing this exception because in some cases a normal string/non json value will be passed in which will just be the - // file path like /media/23454/hello.jpg - // This will happen everytime an image is uploaded via the folder browser and we don't really want to pollute the log since it's not actually - // a problem and we take care of this below. - // see: http://issues.umbraco.org/issue/U4-4756 - } - if (json != null && json["src"] != null) - { - model.PopulateFileMetaDataProperties(uploadFieldConfigNode, json["src"].Value()); - } - else if (p.Value is string) - { - var src = p.Value == null ? string.Empty : p.Value.ToString(); - var config = ApplicationContext.Current.Services.DataTypeService.GetPreValuesByDataTypeId(p.PropertyType.DataTypeDefinitionId).FirstOrDefault(); - var crops = string.IsNullOrEmpty(config) == false ? config : "[]"; - p.Value = "{src: '" + p.Value + "', crops: " + crops + "}"; - //Only provide the source path, not the whole JSON value - model.PopulateFileMetaDataProperties(uploadFieldConfigNode, src); - } - } - else - model.ResetFileMetaDataProperties(uploadFieldConfigNode); + UploadAutoFillProperties.Reset(content, autoFillConfig); + continue; } - } - } - private IDictionary _internalPreValues; - public override IDictionary DefaultPreValues - { - get { return _internalPreValues; } - set { _internalPreValues = value; } + var jo = GetJObject(svalue, false); + string src; + if (jo == null) + { + // so we have a non-empty string value that cannot be parsed into a json object + // see http://issues.umbraco.org/issue/U4-4756 + // it can happen when an image is uploaded via the folder browser, in which case + // the property value will be the file source eg '/media/23454/hello.jpg' and we + // are fixing that anomaly here - does not make any sense at all but... bah... + var config = ApplicationContext.Current.Services.DataTypeService + .GetPreValuesByDataTypeId(property.PropertyType.DataTypeDefinitionId).FirstOrDefault(); + var crops = string.IsNullOrWhiteSpace(config) ? "[]" : config; + src = svalue; + property.Value = "{src: '" + svalue + "', crops: " + crops + "}"; + } + else + { + src = jo["src"] == null ? null : jo["src"].Value(); + } + + if (src == null) + UploadAutoFillProperties.Reset(content, autoFillConfig); + else + UploadAutoFillProperties.Populate(content, autoFillConfig, fs.GetRelativePath(src)); + } } internal class ImageCropperPreValueEditor : PreValueEditor diff --git a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs index 7c84ff7026..aa46bd9843 100644 --- a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs @@ -1,6 +1,7 @@ using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; +using System.Drawing; using System.Globalization; using System.IO; using System.Linq; @@ -16,145 +17,160 @@ using Umbraco.Core.Models; using Umbraco.Core.Models.Editors; using Umbraco.Core.PropertyEditors; using Umbraco.Web.Models.ContentEditing; +using File = System.IO.File; namespace Umbraco.Web.PropertyEditors { + /// + /// The value editor for the image cropper property editor. + /// internal class ImageCropperPropertyValueEditor : PropertyValueEditorWrapper { public ImageCropperPropertyValueEditor(PropertyValueEditor wrapped) : base(wrapped) - { - - } - + { } /// - /// Overrides the deserialize value so that we can save the file accordingly + /// Converts the value received from the editor into the value can be stored in the database. /// - /// + /// The value received from the editor. + /// The current value of the property + /// The converted value. + /// + /// The is used to re-use the folder, if possible. + /// FIXME this is ?! /// This is value passed in from the editor. We normally don't care what the editorValue.Value is set to because /// we are more interested in the files collection associated with it, however we do care about the value if we /// are clearing files. By default the editorValue.Value will just be set to the name of the file (but again, we /// just ignore this and deal with the file collection in editorValue.AdditionalData.ContainsKey("files") ) - /// - /// - /// The current value persisted for this property. This will allow us to determine if we want to create a new - /// file path or use the existing file path. - /// - /// + /// + /// public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue) { + var fs = MediaHelper.FileSystem; - - string oldFile = string.Empty; - string newFile = string.Empty; - JObject newJson = null; - JObject oldJson = null; - - //get the old src path - if (currentValue != null && string.IsNullOrEmpty(currentValue.ToString()) == false) + // get the current path + var currentPath = string.Empty; + try { - try - { - oldJson = JObject.Parse(currentValue.ToString()); - } - catch (Exception ex) - { - //for some reason the value is invalid so continue as if there was no value there - LogHelper.WarnWithException("Could not parse current db value to a JObject", ex); - } - - if (oldJson != null && oldJson["src"] != null) - { - oldFile = oldJson["src"].Value(); - } + var svalue = currentValue as string; + var currentJson = string.IsNullOrWhiteSpace(svalue) ? null : JObject.Parse(svalue); + if (currentJson != null && currentJson["src"] != null) + currentPath = currentJson["src"].Value(); } + catch (Exception ex) + { + // for some reason the value is invalid so continue as if there was no value there + LogHelper.WarnWithException("Could not parse current db value to a JObject.", ex); + } + if (string.IsNullOrWhiteSpace(currentPath) == false) + currentPath = fs.GetRelativePath(currentPath); - //get the new src path + // get the new json and path + JObject editorJson = null; + var editorFile = string.Empty; if (editorValue.Value != null) { - newJson = editorValue.Value as JObject; - if (newJson != null && newJson["src"] != null) - { - newFile = newJson["src"].Value(); - } + editorJson = editorValue.Value as JObject; + if (editorJson != null && editorJson["src"] != null) + editorFile = editorJson["src"].Value(); } - //compare old and new src path - //if not alike, that means we have a new file, or delete the current one... - if (string.IsNullOrEmpty(newFile) || editorValue.AdditionalData.ContainsKey("files")) + // ensure we have the required guids + if (editorValue.AdditionalData.ContainsKey("cuid") == false // for the content item + || editorValue.AdditionalData.ContainsKey("puid") == false) // and the property type + throw new Exception("Missing cuid/puid additional data."); + var cuido = editorValue.AdditionalData["cuid"]; + var puido = editorValue.AdditionalData["puid"]; + if ((cuido is Guid) == false || (puido is Guid) == false) + throw new Exception("Invalid cuid/puid additional data."); + var cuid = (Guid)cuido; + var puid = (Guid)puido; + if (cuid == Guid.Empty || puid == Guid.Empty) + throw new Exception("Invalid cuid/puid additional data."); + + // editorFile is empty whenever a new file is being uploaded + // or when the file is cleared (in which case editorJson is null) + // else editorFile contains the unchanged value + + var uploads = editorValue.AdditionalData.ContainsKey("files") && editorValue.AdditionalData["files"] is IEnumerable; + var files = uploads ? ((IEnumerable)editorValue.AdditionalData["files"]).ToArray() : new ContentItemFile[0]; + var file = uploads ? files.FirstOrDefault() : null; + + if (file == null) // not uploading a file { - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - - //if we have an existing file, delete it - if (string.IsNullOrEmpty(oldFile) == false) - fs.DeleteFile(fs.GetRelativePath(oldFile), true); - else - oldFile = string.Empty; - - //if we have a new file, add it to the media folder and set .src - - if (editorValue.AdditionalData.ContainsKey("files")) + // if editorFile is empty then either there was nothing to begin with, + // or it has been cleared and we need to remove the file - else the + // value is unchanged. + if (string.IsNullOrWhiteSpace(editorFile) && string.IsNullOrWhiteSpace(currentPath) == false) { - var files = editorValue.AdditionalData["files"] as IEnumerable; - if (files != null && files.Any()) - { - var file = files.First(); - - if (UploadFileTypeValidator.ValidateFileExtension(file.FileName)) - { - //create name and folder number - var name = IOHelper.SafeFileName(file.FileName.Substring(file.FileName.LastIndexOf(IOHelper.DirSepChar) + 1, file.FileName.Length - file.FileName.LastIndexOf(IOHelper.DirSepChar) - 1).ToLower()); - - //try to reuse the folder number from the current file - var subfolder = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories - ? oldFile.Replace(fs.GetUrl("/"), "").Split('/')[0] - : oldFile.Substring(oldFile.LastIndexOf("/", StringComparison.Ordinal) + 1).Split('-')[0]; - - //if we dont find one, create a new one - int subfolderId; - var numberedFolder = int.TryParse(subfolder, out subfolderId) - ? subfolderId.ToString(CultureInfo.InvariantCulture) - : MediaSubfolderCounter.Current.Increment().ToString(CultureInfo.InvariantCulture); - - //set a file name or full path - var fileName = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories - ? Path.Combine(numberedFolder, name) - : numberedFolder + "-" + name; - - //save file and assign to the json - using (var fileStream = System.IO.File.OpenRead(file.TempFilePath)) - { - var umbracoFile = UmbracoMediaFile.Save(fileStream, fileName); - newJson["src"] = umbracoFile.Url; - - return newJson.ToString(); - } - } - } + fs.DeleteFile(currentPath, true); + return null; // clear } + + return editorJson == null ? null : editorJson.ToString(); // unchanged } - //incase we submit nothing back - if (editorValue.Value == null) + // process the file + var filepath = editorJson == null ? null : ProcessFile(editorValue, file, fs, currentPath, cuid, puid); + + // remove all temp files + foreach (var f in files) + File.Delete(f.TempFilePath); + + // remove current file if replaced + if (currentPath != filepath && string.IsNullOrWhiteSpace(currentPath) == false) + fs.DeleteFile(currentPath, true); + + // update json and return + if (editorJson == null) return null; + editorJson["src"] = filepath == null ? string.Empty : fs.GetUrl(filepath); + return editorJson.ToString(); + } + + private string ProcessFile(ContentPropertyData editorValue, ContentItemFile file, IFileSystem fs, string currentPath, Guid cuid, Guid puid) + { + // process the file + // no file, invalid file, reject change + if (UploadFileTypeValidator.ValidateFileExtension(file.FileName) == false) return null; - return editorValue.Value.ToString(); + // get the filepath + // in case we are using the old path scheme, try to re-use numbers (bah...) + var filepath = MediaHelper.GetMediaPath(file.FileName, currentPath, cuid, puid); // fs-relative path + + using (var filestream = File.OpenRead(file.TempFilePath)) + { + fs.AddFile(filepath, filestream, true); // must overwrite! + + var ext = fs.GetExtension(filepath); + if (ImageHelper.IsImageFile(ext)) + { + var preValues = editorValue.PreValues.FormatAsDictionary(); + var sizes = preValues.Any() ? preValues.First().Value.Value : string.Empty; + using (var image = Image.FromStream(filestream)) + ImageHelper.GenerateThumbnails(fs, image, filepath, sizes); + } + + // all related properties (auto-fill) are managed by ImageCropperPropertyEditor + // when the content is saved (through event handlers) + } + + return filepath; } - - public override string ConvertDbToString(Property property, PropertyType propertyType, Core.Services.IDataTypeService dataTypeService) { - if(property.Value == null || string.IsNullOrEmpty(property.Value.ToString())) + if (property.Value == null || string.IsNullOrEmpty(property.Value.ToString())) return null; - //if we dont have a json structure, we will get it from the property type + // if we dont have a json structure, we will get it from the property type var val = property.Value.ToString(); if (val.DetectIsJson()) return val; + // more magic here ;-( var config = dataTypeService.GetPreValuesByDataTypeId(propertyType.DataTypeDefinitionId).FirstOrDefault(); - var crops = !string.IsNullOrEmpty(config) ? config : "[]"; + var crops = string.IsNullOrEmpty(config) ? "[]" : config; var newVal = "{src: '" + val + "', crops: " + crops + "}"; return newVal; } diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 68c7f5c592..d037d79f8c 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -456,7 +456,6 @@ - diff --git a/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs b/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs index 12f151876d..b80b2892a4 100644 --- a/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs +++ b/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs @@ -73,7 +73,7 @@ namespace umbraco.cms.businesslogic.datatype int subfolderId; var numberedFolder = int.TryParse(subfolder, out subfolderId) ? subfolderId.ToString(CultureInfo.InvariantCulture) - : MediaSubfolderCounter.Current.Increment().ToString(CultureInfo.InvariantCulture); + : MediaHelper.GetNextFolder(); var fileName = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories ? Path.Combine(numberedFolder, name) From 02fd789f206870382368ed7baab577b3bbcaad89 Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 16 Dec 2015 17:16:44 +0100 Subject: [PATCH 004/841] Sanitize UniqueId --- src/Umbraco.Core/Media/MediaHelper.cs | 6 ----- src/Umbraco.Core/Models/Content.cs | 12 --------- src/Umbraco.Core/Models/ContentType.cs | 13 ---------- src/Umbraco.Core/Models/ContentTypeBase.cs | 5 ---- .../Models/ContentTypeCompositionBase.cs | 3 --- src/Umbraco.Core/Models/DataTypeDefinition.cs | 8 ------ src/Umbraco.Core/Models/DictionaryItem.cs | 11 -------- src/Umbraco.Core/Models/EntityBase/Entity.cs | 6 +++-- src/Umbraco.Core/Models/Media.cs | 12 --------- src/Umbraco.Core/Models/MediaType.cs | 21 ---------------- src/Umbraco.Core/Models/Member.cs | 5 +--- src/Umbraco.Core/Models/MemberGroup.cs | 12 --------- src/Umbraco.Core/Models/MemberType.cs | 21 ---------------- src/Umbraco.Core/Models/PublicAccessEntry.cs | 12 --------- src/Umbraco.Core/Models/PublicAccessRule.cs | 12 --------- src/Umbraco.Core/Models/Rdbms/NodeDto.cs | 6 ----- .../Models/Rdbms/PropertyTypeDto.cs | 6 ----- .../Models/Rdbms/PropertyTypeGroupDto.cs | 6 ----- src/Umbraco.Core/Models/Template.cs | 12 --------- .../Factories/PropertyGroupFactory.cs | 8 ++---- .../Repositories/ContentTypeBaseRepository.cs | 1 + .../Repositories/EntityContainerRepository.cs | 7 ++---- .../Services/Importing/PackageImportTests.cs | 25 +++++++++++++++++++ .../Editors/ContentControllerBase.cs | 3 --- .../controls/ContentTypeControlNew.ascx.cs | 3 +-- 25 files changed, 36 insertions(+), 200 deletions(-) diff --git a/src/Umbraco.Core/Media/MediaHelper.cs b/src/Umbraco.Core/Media/MediaHelper.cs index 55bbd80d3b..5367455a43 100644 --- a/src/Umbraco.Core/Media/MediaHelper.cs +++ b/src/Umbraco.Core/Media/MediaHelper.cs @@ -165,9 +165,6 @@ namespace Umbraco.Core.Media if (string.IsNullOrWhiteSpace(oldpath)) fs.DeleteFile(oldpath, true); - // sanity check - fixme - every entity should be created with a proper Guid - if (content.Key == Guid.Empty) content.Key = Guid.NewGuid(); - // get the filepath, store the data // use oldpath as "prevpath" to try and reuse the folder, in original number-based scheme var filepath = GetMediaPath(filename, oldpath, content.Key, propertyType.Key); @@ -201,9 +198,6 @@ namespace Umbraco.Core.Media var fs = FileSystem; if (fs.FileExists(sourcepath) == false) return null; - // sanity check - fixme - every entity should be created with a proper Guid - if (content.Key == Guid.Empty) content.Key = Guid.NewGuid(); - // get the filepath var filename = Path.GetFileName(sourcepath); var filepath = GetMediaPath(filename, content.Key, propertyType.Key); diff --git a/src/Umbraco.Core/Models/Content.cs b/src/Umbraco.Core/Models/Content.cs index 2238260611..b8e96c2793 100644 --- a/src/Umbraco.Core/Models/Content.cs +++ b/src/Umbraco.Core/Models/Content.cs @@ -340,18 +340,6 @@ namespace Umbraco.Core.Models } } - /// - /// Method to call when Entity is being saved - /// - /// Created date is set and a Unique key is assigned - internal override void AddingEntity() - { - base.AddingEntity(); - - if(Key == Guid.Empty) - Key = Guid.NewGuid(); - } - /// /// Method to call when Entity is being updated /// diff --git a/src/Umbraco.Core/Models/ContentType.cs b/src/Umbraco.Core/Models/ContentType.cs index 355d724fbe..b6021e6538 100644 --- a/src/Umbraco.Core/Models/ContentType.cs +++ b/src/Umbraco.Core/Models/ContentType.cs @@ -137,19 +137,6 @@ namespace Umbraco.Core.Models return result; } - /// - /// Method to call when Entity is being saved - /// - /// Created date is set and a Unique key is assigned - internal override void AddingEntity() - { - base.AddingEntity(); - - if (Key == Guid.Empty) - Key = Guid.NewGuid(); - } - - /// /// Creates a deep clone of the current entity with its identity/alias and it's property identities reset /// diff --git a/src/Umbraco.Core/Models/ContentTypeBase.cs b/src/Umbraco.Core/Models/ContentTypeBase.cs index a83defb7b5..7218a2421d 100644 --- a/src/Umbraco.Core/Models/ContentTypeBase.cs +++ b/src/Umbraco.Core/Models/ContentTypeBase.cs @@ -452,11 +452,6 @@ namespace Umbraco.Core.Models /// Returns True if PropertyType was added, otherwise False public bool AddPropertyType(PropertyType propertyType) { - if (propertyType.HasIdentity == false) - { - propertyType.Key = Guid.NewGuid(); - } - if (PropertyTypeExists(propertyType.Alias) == false) { _propertyTypes.Add(propertyType); diff --git a/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs b/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs index 5ac21885d7..cba0ed07b7 100644 --- a/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs +++ b/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs @@ -210,9 +210,6 @@ namespace Umbraco.Core.Models /// Returns True if PropertyType was added, otherwise False public override bool AddPropertyType(PropertyType propertyType, string propertyGroupName) { - if (propertyType.HasIdentity == false) - propertyType.Key = Guid.NewGuid(); - // ensure no duplicate alias - over all composition properties if (PropertyTypeExists(propertyType.Alias)) return false; diff --git a/src/Umbraco.Core/Models/DataTypeDefinition.cs b/src/Umbraco.Core/Models/DataTypeDefinition.cs index a2ca15e46a..4c12d6fbef 100644 --- a/src/Umbraco.Core/Models/DataTypeDefinition.cs +++ b/src/Umbraco.Core/Models/DataTypeDefinition.cs @@ -265,13 +265,5 @@ namespace Umbraco.Core.Models { get { return _additionalData; } } - - internal override void AddingEntity() - { - base.AddingEntity(); - - if(Key == default(Guid)) - Key = Guid.NewGuid(); - } } } diff --git a/src/Umbraco.Core/Models/DictionaryItem.cs b/src/Umbraco.Core/Models/DictionaryItem.cs index 7e59726c80..367e897c35 100644 --- a/src/Umbraco.Core/Models/DictionaryItem.cs +++ b/src/Umbraco.Core/Models/DictionaryItem.cs @@ -87,16 +87,5 @@ namespace Umbraco.Core.Models enumerable => enumerable.GetHashCode())); } } - - /// - /// Method to call before inserting a new entity in the db - /// - internal override void AddingEntity() - { - base.AddingEntity(); - - Key = Guid.NewGuid(); - } - } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/EntityBase/Entity.cs b/src/Umbraco.Core/Models/EntityBase/Entity.cs index eeacb771a9..c4838dfd0a 100644 --- a/src/Umbraco.Core/Models/EntityBase/Entity.cs +++ b/src/Umbraco.Core/Models/EntityBase/Entity.cs @@ -62,9 +62,9 @@ namespace Umbraco.Core.Models.EntityBase { get { + // if an entity does NOT have a UniqueId yet, assign one now if (_key == Guid.Empty) - return _id.ToGuid(); - + _key = Guid.NewGuid(); return _key; } set @@ -136,6 +136,7 @@ namespace Umbraco.Core.Models.EntityBase { _hasIdentity = false; _id = default(int); + _key = Guid.Empty; } /// @@ -242,6 +243,7 @@ namespace Umbraco.Core.Models.EntityBase { //Memberwise clone on Entity will work since it doesn't have any deep elements // for any sub class this will work for standard properties as well that aren't complex object's themselves. + var ignored = this.Key; // ensure that 'this' has a key, before cloning var clone = (Entity)MemberwiseClone(); //ensure the clone has it's own dictionaries clone.ResetChangeTrackingCollections(); diff --git a/src/Umbraco.Core/Models/Media.cs b/src/Umbraco.Core/Models/Media.cs index 4f922d28cf..a7e794a400 100644 --- a/src/Umbraco.Core/Models/Media.cs +++ b/src/Umbraco.Core/Models/Media.cs @@ -118,17 +118,5 @@ namespace Umbraco.Core.Models //The Media Recycle Bin Id is -21 so we correct that here ParentId = parentId == -20 ? -21 : parentId; } - - /// - /// Method to call when Entity is being saved - /// - /// Created date is set and a Unique key is assigned - internal override void AddingEntity() - { - base.AddingEntity(); - - if (Key == Guid.Empty) - Key = Guid.NewGuid(); - } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/MediaType.cs b/src/Umbraco.Core/Models/MediaType.cs index 052e231136..c8e2915afd 100644 --- a/src/Umbraco.Core/Models/MediaType.cs +++ b/src/Umbraco.Core/Models/MediaType.cs @@ -38,26 +38,5 @@ namespace Umbraco.Core.Models : base(parent, alias) { } - - /// - /// Method to call when Entity is being saved - /// - /// Created date is set and a Unique key is assigned - internal override void AddingEntity() - { - base.AddingEntity(); - - if (Key == Guid.Empty) - Key = Guid.NewGuid(); - } - - /// - /// Method to call when Entity is being updated - /// - /// Modified Date is set and a new Version guid is set - internal override void UpdatingEntity() - { - base.UpdatingEntity(); - } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Member.cs b/src/Umbraco.Core/Models/Member.cs index 7788fadf75..70c21e4307 100644 --- a/src/Umbraco.Core/Models/Member.cs +++ b/src/Umbraco.Core/Models/Member.cs @@ -509,11 +509,8 @@ namespace Umbraco.Core.Models { base.AddingEntity(); - if (Key == Guid.Empty) - { - Key = Guid.NewGuid(); + if (ProviderUserKey == null) ProviderUserKey = Key; - } } /// diff --git a/src/Umbraco.Core/Models/MemberGroup.cs b/src/Umbraco.Core/Models/MemberGroup.cs index e52448a11d..ff7e05be9e 100644 --- a/src/Umbraco.Core/Models/MemberGroup.cs +++ b/src/Umbraco.Core/Models/MemberGroup.cs @@ -60,17 +60,5 @@ namespace Umbraco.Core.Models } public IDictionary AdditionalData { get; private set; } - - /// - /// Method to call when Entity is being saved - /// - /// Created date is set and a Unique key is assigned - internal override void AddingEntity() - { - base.AddingEntity(); - - if (Key == Guid.Empty) - Key = Guid.NewGuid(); - } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/MemberType.cs b/src/Umbraco.Core/Models/MemberType.cs index 74a879be81..9000a33b54 100644 --- a/src/Umbraco.Core/Models/MemberType.cs +++ b/src/Umbraco.Core/Models/MemberType.cs @@ -131,26 +131,5 @@ namespace Umbraco.Core.Models MemberTypePropertyTypes.Add(propertyTypeAlias, tuple); } } - - /// - /// Method to call when Entity is being saved - /// - /// Created date is set and a Unique key is assigned - internal override void AddingEntity() - { - base.AddingEntity(); - - if (Key == Guid.Empty) - Key = Guid.NewGuid(); - } - - /// - /// Method to call when Entity is being updated - /// - /// Modified Date is set and a new Version guid is set - internal override void UpdatingEntity() - { - base.UpdatingEntity(); - } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/PublicAccessEntry.cs b/src/Umbraco.Core/Models/PublicAccessEntry.cs index 27d1cd2121..9e12d6ab57 100644 --- a/src/Umbraco.Core/Models/PublicAccessEntry.cs +++ b/src/Umbraco.Core/Models/PublicAccessEntry.cs @@ -108,18 +108,6 @@ namespace Umbraco.Core.Models } } - /// - /// Method to call on entity saved when first added - /// - internal override void AddingEntity() - { - if (Key == default(Guid)) - { - Key = Guid.NewGuid(); - } - base.AddingEntity(); - } - [DataMember] public int LoginNodeId { diff --git a/src/Umbraco.Core/Models/PublicAccessRule.cs b/src/Umbraco.Core/Models/PublicAccessRule.cs index 484652e8bd..c785d028d0 100644 --- a/src/Umbraco.Core/Models/PublicAccessRule.cs +++ b/src/Umbraco.Core/Models/PublicAccessRule.cs @@ -28,18 +28,6 @@ namespace Umbraco.Core.Models public Guid AccessEntryId { get; internal set; } - /// - /// Method to call on entity saved when first added - /// - internal override void AddingEntity() - { - if (Key == default(Guid)) - { - Key = Guid.NewGuid(); - } - base.AddingEntity(); - } - public string RuleValue { get { return _ruleValue; } diff --git a/src/Umbraco.Core/Models/Rdbms/NodeDto.cs b/src/Umbraco.Core/Models/Rdbms/NodeDto.cs index 7003c58e77..c5fac092df 100644 --- a/src/Umbraco.Core/Models/Rdbms/NodeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/NodeDto.cs @@ -10,12 +10,6 @@ namespace Umbraco.Core.Models.Rdbms [ExplicitColumns] internal class NodeDto { - public NodeDto() - { - //By default, always generate a new guid - UniqueId = Guid.NewGuid(); - } - public const int NodeIdSeed = 1050; [Column("id")] diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs index 74a6d34289..2be4b24157 100644 --- a/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/PropertyTypeDto.cs @@ -10,12 +10,6 @@ namespace Umbraco.Core.Models.Rdbms [ExplicitColumns] internal class PropertyTypeDto { - public PropertyTypeDto() - { - //by default always create a new guid - UniqueId = Guid.NewGuid(); - } - [Column("id")] [PrimaryKeyColumn(IdentitySeed = 50)] public int Id { get; set; } diff --git a/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs b/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs index 42abd9ed49..68de420a97 100644 --- a/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/PropertyTypeGroupDto.cs @@ -11,12 +11,6 @@ namespace Umbraco.Core.Models.Rdbms [ExplicitColumns] internal class PropertyTypeGroupDto { - public PropertyTypeGroupDto() - { - //by default always create a new guid - UniqueId = Guid.NewGuid(); - } - [Column("id")] [PrimaryKeyColumn(IdentitySeed = 12)] public int Id { get; set; } diff --git a/src/Umbraco.Core/Models/Template.cs b/src/Umbraco.Core/Models/Template.cs index 4aca88f286..1c8b44b674 100644 --- a/src/Umbraco.Core/Models/Template.cs +++ b/src/Umbraco.Core/Models/Template.cs @@ -118,18 +118,6 @@ namespace Umbraco.Core.Models return ApplicationContext.Current.Services.FileService.DetermineTemplateRenderingEngine(this); } - /// - /// Method to call when Entity is being saved - /// - /// Created date is set and a Unique key is assigned - internal override void AddingEntity() - { - base.AddingEntity(); - - if (Key == Guid.Empty) - Key = Guid.NewGuid(); - } - public void SetMasterTemplate(ITemplate masterTemplate) { if (masterTemplate == null) diff --git a/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs b/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs index 5b2cad3415..2dfb996bb3 100644 --- a/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs @@ -99,9 +99,7 @@ namespace Umbraco.Core.Persistence.Factories ContentTypeNodeId = _contentTypeId, SortOrder = propertyGroup.SortOrder, Text = propertyGroup.Name, - UniqueId = propertyGroup.Key == Guid.Empty - ? Guid.NewGuid() - : propertyGroup.Key + UniqueId = propertyGroup.Key }; if (propertyGroup.HasIdentity) @@ -124,9 +122,7 @@ namespace Umbraco.Core.Persistence.Factories Name = propertyType.Name, SortOrder = propertyType.SortOrder, ValidationRegExp = propertyType.ValidationRegExp, - UniqueId = propertyType.Key == Guid.Empty - ? Guid.NewGuid() - : propertyType.Key + UniqueId = propertyType.Key }; if (tabId != default(int)) diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs index 5ed0f62124..21748e6ffd 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs @@ -466,6 +466,7 @@ AND umbracoNode.id <> @id", propType.DataTypeDefinitionId = dto.DataTypeId; propType.Description = dto.Description; propType.Id = dto.Id; + propType.Key = dto.UniqueId; propType.Name = dto.Name; propType.Mandatory = dto.Mandatory; propType.SortOrder = dto.SortOrder; diff --git a/src/Umbraco.Core/Persistence/Repositories/EntityContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/EntityContainerRepository.cs index 6fd5045e04..fcdd2bd3d2 100644 --- a/src/Umbraco.Core/Persistence/Repositories/EntityContainerRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/EntityContainerRepository.cs @@ -174,12 +174,10 @@ namespace Umbraco.Core.Persistence.Repositories Path = path, SortOrder = 0, Text = entity.Name, - UserId = entity.CreatorId + UserId = entity.CreatorId, + UniqueId = entity.Key }; - if (entity.Key != default(Guid)) - nodeDto.UniqueId = entity.Key; - // insert, get the id, update the path with the id var id = Convert.ToInt32(Database.Insert(nodeDto)); nodeDto.Path = nodeDto.Path + "," + nodeDto.NodeId; @@ -187,7 +185,6 @@ namespace Umbraco.Core.Persistence.Repositories // refresh the entity entity.Id = id; - entity.Key = nodeDto.UniqueId; entity.Path = nodeDto.Path; entity.Level = nodeDto.Level; entity.SortOrder = 0; diff --git a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs index 215f24e375..04f785c82d 100644 --- a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs +++ b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs @@ -74,6 +74,31 @@ namespace Umbraco.Tests.Services.Importing Assert.That(uBlogsyLanding.CompositionPropertyGroups.Count(), Is.EqualTo(5)); } + [Test] + public void PackagingService_Can_Import_Inherited_ContentTypes_And_Verify_PropertyTypes_UniqueIds() + { + // Arrange + var strXml = ImportResources.InheritedDocTypes_Package; + var xml = XElement.Parse(strXml); + var dataTypeElement = xml.Descendants("DataTypes").First(); + var templateElement = xml.Descendants("Templates").First(); + var docTypeElement = xml.Descendants("DocumentTypes").First(); + var packagingService = ServiceContext.PackagingService; + + // Act + var dataTypes = packagingService.ImportDataTypeDefinitions(dataTypeElement); + var templates = packagingService.ImportTemplates(templateElement); + var contentTypes = packagingService.ImportContentTypes(docTypeElement); + + // Assert + var mRBasePage = contentTypes.First(x => x.Alias == "MRBasePage"); + foreach (var propertyType in mRBasePage.PropertyTypes) + { + var propertyTypeDto = this.DatabaseContext.Database.First("WHERE id = @id", new { id = propertyType.Id }); + Assert.AreEqual(propertyTypeDto.UniqueId, propertyType.Key); + } + } + [Test] public void PackagingService_Can_Import_Inherited_ContentTypes_And_Verify_PropertyGroups_And_PropertyTypes() { diff --git a/src/Umbraco.Web/Editors/ContentControllerBase.cs b/src/Umbraco.Web/Editors/ContentControllerBase.cs index ec9763b678..758356a8f8 100644 --- a/src/Umbraco.Web/Editors/ContentControllerBase.cs +++ b/src/Umbraco.Web/Editors/ContentControllerBase.cs @@ -101,9 +101,6 @@ namespace Umbraco.Web.Editors { d.Add("files", files); // add extra things needed to figure out where to put the files - // fixme - every entity should have a Guid when created - would that be breaking? - if (contentItem.PersistedContent.Key == Guid.Empty) - contentItem.PersistedContent.Key = Guid.NewGuid(); d.Add("cuid", contentItem.PersistedContent.Key); d.Add("puid", dboProperty.PropertyType.Key); } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs index 24694ad706..83163b3b93 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs @@ -1081,8 +1081,7 @@ jQuery(document).ready(function() {{ refreshDropDowns(); }}); Name = gpData.Name.Trim(), Mandatory = gpData.Mandatory, ValidationRegExp = gpData.Validation, - Description = gpData.Description, - Key = Guid.NewGuid() + Description = gpData.Description }; //gpData.Tab == 0 Generic Properties / No Group if (gpData.Tab == 0) From a05c71ec859342fe2b45ce474bad97c3ad21d69a Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 11 Dec 2015 17:22:47 +0100 Subject: [PATCH 005/841] Fix files and medias upload --- .../Media/UploadAutoFillProperties.cs | 20 ++++++++++++++----- src/Umbraco.Tests/Models/MediaXmlTest.cs | 11 ++++++++++ .../Querying/ContentTypeSqlMappingTests.cs | 8 ++++---- .../FileUploadPropertyEditor.cs | 2 +- .../ImageCropperPropertyEditor.cs | 2 +- 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Core/Media/UploadAutoFillProperties.cs b/src/Umbraco.Core/Media/UploadAutoFillProperties.cs index c7157c4eb6..553c994599 100644 --- a/src/Umbraco.Core/Media/UploadAutoFillProperties.cs +++ b/src/Umbraco.Core/Media/UploadAutoFillProperties.cs @@ -5,6 +5,7 @@ using System.Linq; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; +using Umbraco.Core.Logging; using Umbraco.Core.Models; namespace Umbraco.Core.Media @@ -121,12 +122,21 @@ namespace Umbraco.Core.Media } else { - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - using (var filestream = fs.OpenFile(filepath)) + // if anything goes wrong, just reset the properties + try { - var extension = (Path.GetExtension(filepath) ?? "").TrimStart('.'); - var size = ImageHelper.IsImageFile(extension) ? (Size?) ImageHelper.GetDimensions(filestream) : null; - SetProperties(content, autoFillConfig, size, filestream.Length, extension); + using (var filestream = MediaHelper.FileSystem.OpenFile(filepath)) + { + var extension = (Path.GetExtension(filepath) ?? "").TrimStart('.'); + var size = ImageHelper.IsImageFile(extension) ? (Size?)ImageHelper.GetDimensions(filestream) : null; + SetProperties(content, autoFillConfig, size, filestream.Length, extension); + } + } + catch (Exception ex) + { + LogHelper.Error(typeof(UploadAutoFillProperties), "Could not populate upload auto-fill properties for file \"" + + filepath + "\".", ex); + ResetProperties(content, autoFillConfig); } } } diff --git a/src/Umbraco.Tests/Models/MediaXmlTest.cs b/src/Umbraco.Tests/Models/MediaXmlTest.cs index a5db651115..bd711d2191 100644 --- a/src/Umbraco.Tests/Models/MediaXmlTest.cs +++ b/src/Umbraco.Tests/Models/MediaXmlTest.cs @@ -9,6 +9,7 @@ using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; using umbraco.editorControls.tinyMCE3; using umbraco.interfaces; +using Umbraco.Web.PropertyEditors; namespace Umbraco.Tests.Models { @@ -44,9 +45,19 @@ namespace Umbraco.Tests.Models var mediaType = MockedContentTypes.CreateImageMediaType("image2"); ServiceContext.ContentTypeService.Save(mediaType); + // reference, so static ctor runs, so event handlers register + // and then, this will reset the width, height... because the file does not exist, of course ;-( + var ignored = new FileUploadPropertyEditor(); + var media = MockedMedia.CreateMediaImage(mediaType, -1); ServiceContext.MediaService.Save(media, 0); + // so we have to force-reset these values because the property editor has cleared them + media.SetValue(Constants.Conventions.Media.Width, "200"); + media.SetValue(Constants.Conventions.Media.Height, "200"); + media.SetValue(Constants.Conventions.Media.Bytes, "100"); + media.SetValue(Constants.Conventions.Media.Extension, "png"); + var nodeName = media.ContentType.Alias.ToSafeAliasWithForcingCheck(); var urlName = media.GetUrlSegment(); diff --git a/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs b/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs index 916b6d3333..caf872a995 100644 --- a/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs +++ b/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs @@ -151,10 +151,10 @@ namespace Umbraco.Tests.Persistence.Querying DatabaseContext.Database.Execute(new Sql(string.Format("SET IDENTITY_INSERT {0} OFF ", SqlSyntaxContext.SqlSyntaxProvider.GetQuotedTableName("cmsContentType")))); DatabaseContext.Database.Execute(new Sql(string.Format("SET IDENTITY_INSERT {0} ON ", SqlSyntaxContext.SqlSyntaxProvider.GetQuotedTableName("cmsPropertyTypeGroup")))); - DatabaseContext.Database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 77776, ContentTypeNodeId = 99999, Text = "Group1", SortOrder = 1 }); - DatabaseContext.Database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 77777, ContentTypeNodeId = 99999, Text = "Group2", SortOrder = 2 }); - DatabaseContext.Database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 77778, ContentTypeNodeId = 99999, Text = "Group3", SortOrder = 3 }); - DatabaseContext.Database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 77779, ContentTypeNodeId = 99999, Text = "Group4", SortOrder = 4 }); + DatabaseContext.Database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 77776, UniqueId = 77776.ToGuid(), ContentTypeNodeId = 99999, Text = "Group1", SortOrder = 1 }); + DatabaseContext.Database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 77777, UniqueId = 77777.ToGuid(), ContentTypeNodeId = 99999, Text = "Group2", SortOrder = 2 }); + DatabaseContext.Database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 77778, UniqueId = 77778.ToGuid(), ContentTypeNodeId = 99999, Text = "Group3", SortOrder = 3 }); + DatabaseContext.Database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 77779, UniqueId = 77779.ToGuid(), ContentTypeNodeId = 99999, Text = "Group4", SortOrder = 4 }); DatabaseContext.Database.Execute(new Sql(string.Format("SET IDENTITY_INSERT {0} OFF ", SqlSyntaxContext.SqlSyntaxProvider.GetQuotedTableName("cmsPropertyTypeGroup")))); DatabaseContext.Database.Execute(new Sql(string.Format("SET IDENTITY_INSERT {0} ON ", SqlSyntaxContext.SqlSyntaxProvider.GetQuotedTableName("cmsPropertyType")))); diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs index bf1086513a..74882fd0e4 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs @@ -89,7 +89,7 @@ namespace Umbraco.Web.PropertyEditors /// A value indicating whether a property is an upload field, and (optionaly) has a non-empty value. private static bool IsUploadField(Property property, bool ensureValue) { - if (property.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias) + if (property.PropertyType.PropertyEditorAlias != Constants.PropertyEditors.UploadFieldAlias) return false; if (ensureValue == false) return true; diff --git a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs index a913d2cb44..bfbe578875 100644 --- a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs @@ -108,7 +108,7 @@ namespace Umbraco.Web.PropertyEditors /// A value indicating whether a property is an image cropper field, and (optionaly) has a non-empty value. private static bool IsCropperField(Property property, bool ensureValue) { - if (property.PropertyType.PropertyEditorAlias == Constants.PropertyEditors.ImageCropperAlias) + if (property.PropertyType.PropertyEditorAlias != Constants.PropertyEditors.ImageCropperAlias) return false; if (ensureValue == false) return true; From 14adc2a3b36137b6f425bcdac0eec75efb5c52ac Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 26 Jan 2016 14:18:30 +0100 Subject: [PATCH 006/841] deploy-30 refactoring --- src/Umbraco.Core/IO/FileSystemExtensions.cs | 5 ++ src/Umbraco.Core/IO/FileSystemWrapper.cs | 2 + src/Umbraco.Core/IO/IFileSystem.cs | 4 +- src/Umbraco.Core/IO/MediaFileSystem.cs | 10 ++-- src/Umbraco.Core/IO/PhysicalFileSystem.cs | 50 +++++++++---------- src/Umbraco.Core/IO/UmbracoMediaFile.cs | 8 +-- src/Umbraco.Core/Media/ImageHelper.cs | 41 +++++++++++++++ .../Repositories/TemplateRepository.cs | 34 ++++++------- src/Umbraco.Web/Editors/ImagesController.cs | 4 +- 9 files changed, 104 insertions(+), 54 deletions(-) diff --git a/src/Umbraco.Core/IO/FileSystemExtensions.cs b/src/Umbraco.Core/IO/FileSystemExtensions.cs index b71a4cf0c7..baa8c1d6d4 100644 --- a/src/Umbraco.Core/IO/FileSystemExtensions.cs +++ b/src/Umbraco.Core/IO/FileSystemExtensions.cs @@ -39,6 +39,11 @@ namespace Umbraco.Core.IO public static long GetSize(this IFileSystem fs, string path) { + // unwrap, eg MediaFileSystem is wrapping an IFileSystem + FileSystemWrapper w; + while ((w = fs as FileSystemWrapper) != null) + fs = w.Wrapped; + // no idea why GetSize is not part of IFileSystem, but // for physical file system we have way better & faster ways // to get the size, than to read the entire thing in memory! diff --git a/src/Umbraco.Core/IO/FileSystemWrapper.cs b/src/Umbraco.Core/IO/FileSystemWrapper.cs index 676626d069..db4ab115f6 100644 --- a/src/Umbraco.Core/IO/FileSystemWrapper.cs +++ b/src/Umbraco.Core/IO/FileSystemWrapper.cs @@ -23,6 +23,8 @@ namespace Umbraco.Core.IO _wrapped = wrapped; } + internal IFileSystem Wrapped { get { return _wrapped; } } + public IEnumerable GetDirectories(string path) { return _wrapped.GetDirectories(path); diff --git a/src/Umbraco.Core/IO/IFileSystem.cs b/src/Umbraco.Core/IO/IFileSystem.cs index b4e173b256..3e1c1e3527 100644 --- a/src/Umbraco.Core/IO/IFileSystem.cs +++ b/src/Umbraco.Core/IO/IFileSystem.cs @@ -16,10 +16,10 @@ namespace Umbraco.Core.IO void DeleteDirectory(string path, bool recursive); bool DirectoryExists(string path); - + void AddFile(string path, Stream stream); - void AddFile(string path, Stream stream, bool overrideExisting); + void AddFile(string path, Stream stream, bool overrideIfExists); IEnumerable GetFiles(string path); diff --git a/src/Umbraco.Core/IO/MediaFileSystem.cs b/src/Umbraco.Core/IO/MediaFileSystem.cs index face234970..b6ef6f7bf5 100644 --- a/src/Umbraco.Core/IO/MediaFileSystem.cs +++ b/src/Umbraco.Core/IO/MediaFileSystem.cs @@ -51,6 +51,7 @@ namespace Umbraco.Core.IO // MediaFileSystem is not just IFileSystem // etc + [Obsolete("", true)] public IEnumerable GetThumbnails(string path) { var parentDirectory = Path.GetDirectoryName(path); @@ -61,7 +62,8 @@ namespace Umbraco.Core.IO .ToList(); } - public void DeleteFile(string path, bool deleteThumbnails) + [Obsolete("", true)] + public void DeleteFile(string path, bool deleteThumbnails) { DeleteFile(path); @@ -71,13 +73,15 @@ namespace Umbraco.Core.IO DeleteThumbnails(path); } - public void DeleteThumbnails(string path) + [Obsolete("", true)] + public void DeleteThumbnails(string path) { GetThumbnails(path) .ForEach(DeleteFile); } - public void CopyThumbnails(string sourcePath, string targetPath) + [Obsolete("", true)] + public void CopyThumbnails(string sourcePath, string targetPath) { var targetPathBase = Path.GetDirectoryName(targetPath) ?? ""; foreach (var sourceThumbPath in GetThumbnails(sourcePath)) diff --git a/src/Umbraco.Core/IO/PhysicalFileSystem.cs b/src/Umbraco.Core/IO/PhysicalFileSystem.cs index 7456fb29a4..6b07ff21f8 100644 --- a/src/Umbraco.Core/IO/PhysicalFileSystem.cs +++ b/src/Umbraco.Core/IO/PhysicalFileSystem.cs @@ -12,27 +12,26 @@ namespace Umbraco.Core.IO // eg "c:" or "c:\path\to\site" or "\\server\path" private readonly string _rootPath; - // _rootPath, with separators replaced by forward-slashes. + // _rootPath, but with separators replaced by forward-slashes + // eg "c:" or "c:/path/to/site" or "//server/path" + // (is used in GetRelativePath) private readonly string _rootPathFwd; - // the ??? url, using url separator chars, NOT ending with a separator - // eg "" (?) or "/Scripts" or ??? + // the relative url, using url separator chars, NOT ending with a separator + // eg "" or "/Views" or "/Media" or "//Media" in case of a virtual path private readonly string _rootUrl; + // virtualRoot should be "~/path/to/root" eg "~/Views" + // the "~/" is mandatory. public PhysicalFileSystem(string virtualRoot) { if (virtualRoot == null) throw new ArgumentNullException("virtualRoot"); if (virtualRoot.StartsWith("~/") == false) throw new ArgumentException("The virtualRoot argument must be a virtual path and start with '~/'"); - _rootPath = IOHelper.MapPath(virtualRoot); - _rootPath = EnsureDirectorySeparatorChar(_rootPath); - _rootPath = _rootPath.TrimEnd(Path.DirectorySeparatorChar); + _rootPath = EnsureDirectorySeparatorChar(IOHelper.MapPath(virtualRoot)).TrimEnd(Path.DirectorySeparatorChar); _rootPathFwd = EnsureUrlSeparatorChar(_rootPath); - - _rootUrl = IOHelper.ResolveUrl(virtualRoot); - _rootUrl = EnsureUrlSeparatorChar(_rootUrl); - _rootUrl = _rootUrl.TrimEnd('/'); + _rootUrl = EnsureUrlSeparatorChar(IOHelper.ResolveUrl(virtualRoot)).TrimEnd('/'); } public PhysicalFileSystem(string rootPath, string rootUrl) @@ -47,19 +46,16 @@ namespace Umbraco.Core.IO throw new ArgumentException("The rootPath argument cannot be a virtual path and cannot start with '~/'"); // rootPath should be... rooted, as in, it's a root path! - // but the test suite App.config cannot really "root" anything so we'll have to do it here - - //var localRoot = AppDomain.CurrentDomain.BaseDirectory; - var localRoot = IOHelper.GetRootDirectorySafe(); if (Path.IsPathRooted(rootPath) == false) + { + // but the test suite App.config cannot really "root" anything so we have to do it here + var localRoot = IOHelper.GetRootDirectorySafe(); rootPath = Path.Combine(localRoot, rootPath); + } - rootPath = EnsureDirectorySeparatorChar(rootPath); - _rootPath = rootPath.TrimEnd(Path.DirectorySeparatorChar); + _rootPath = EnsureDirectorySeparatorChar(rootPath).TrimEnd(Path.DirectorySeparatorChar); _rootPathFwd = EnsureUrlSeparatorChar(_rootPath); - - rootUrl = EnsureUrlSeparatorChar(rootUrl); - _rootUrl = rootUrl.TrimEnd('/'); + _rootUrl = EnsureUrlSeparatorChar(rootUrl).TrimEnd('/'); } /// @@ -152,7 +148,7 @@ namespace Umbraco.Core.IO { var fullPath = GetFullPath(path); var exists = File.Exists(fullPath); - if (exists && overrideExisting == false) + if (exists && overrideExisting == false) throw new InvalidOperationException(string.Format("A file at path '{0}' already exists", path)); var directory = Path.GetDirectoryName(fullPath); @@ -261,13 +257,15 @@ namespace Umbraco.Core.IO // test url var path = fullPathOrUrl.Replace('\\', '/'); // ensure url separator char - if (IOHelper.PathStartsWith(path, _rootUrl, '/')) // if it starts with the root url... - return path.Substring(_rootUrl.Length) // strip it - .TrimStart('/'); // it's relative + // if it starts with the root url, strip it and trim the starting slash to make it relative + // eg "/Media/1234/img.jpg" => "1234/img.jpg" + if (IOHelper.PathStartsWith(path, _rootUrl, '/')) + return path.Substring(_rootUrl.Length).TrimStart('/'); - if (IOHelper.PathStartsWith(path, _rootPathFwd, '/')) // if it starts with the root url... - return path.Substring(_rootPathFwd.Length) // strip it - .TrimStart('/'); // it's relative + // if it starts with the root path, strip it and trim the starting slash to make it relative + // eg "c:/websites/test/root/Media/1234/img.jpg" => "1234/img.jpg" + if (IOHelper.PathStartsWith(path, _rootPathFwd, '/')) + return path.Substring(_rootPathFwd.Length).TrimStart('/'); // unchanged - what else? return path; diff --git a/src/Umbraco.Core/IO/UmbracoMediaFile.cs b/src/Umbraco.Core/IO/UmbracoMediaFile.cs index 17162bcfa8..27699baef4 100644 --- a/src/Umbraco.Core/IO/UmbracoMediaFile.cs +++ b/src/Umbraco.Core/IO/UmbracoMediaFile.cs @@ -111,7 +111,7 @@ namespace Umbraco.Core.IO { get { - if (_length != null) return _length.Value; + if (_length.HasValue) return _length.Value; _length = Exists ? _fs.GetSize(Path) : -1; return _length.Value; } @@ -129,7 +129,7 @@ namespace Umbraco.Core.IO public Size GetDimensions() { - if (_size != null) return _size.Value; + if (_size.HasValue) return _size.Value; if (_fs.FileExists(Path)) { @@ -157,12 +157,12 @@ namespace Umbraco.Core.IO return _fs.GetUrl(filepath); } - public string Resize(int maxWidthHeight, string filenameAddition) + public string Resize(int maxWidthHeight, string fileNameAddition) { if (Exists == false) return string.Empty; EnsureFileSupportsResizing(); - var filepath = Resize(-1, -1, maxWidthHeight, filenameAddition); + var filepath = Resize(-1, -1, maxWidthHeight, fileNameAddition); return _fs.GetUrl(filepath); } diff --git a/src/Umbraco.Core/Media/ImageHelper.cs b/src/Umbraco.Core/Media/ImageHelper.cs index 281a229d49..a9775321e8 100644 --- a/src/Umbraco.Core/Media/ImageHelper.cs +++ b/src/Umbraco.Core/Media/ImageHelper.cs @@ -89,6 +89,47 @@ namespace Umbraco.Core.Media return codec.MimeType; } + #region Manage thumbnails + + public static IEnumerable GetThumbnails(IFileSystem fs, string path) + { + var parentDirectory = Path.GetDirectoryName(path); + var extension = Path.GetExtension(path); + + return fs.GetFiles(parentDirectory) + .Where(x => x.StartsWith(path.TrimEnd(extension) + "_thumb") || x.StartsWith(path.TrimEnd(extension) + "_big-thumb")) + .ToList(); + } + + public static void DeleteFile(IFileSystem fs, string path, bool deleteThumbnails) + { + fs.DeleteFile(path); + + if (deleteThumbnails == false) + return; + + DeleteThumbnails(fs, path); + } + + public static void DeleteThumbnails(IFileSystem fs, string path) + { + GetThumbnails(fs, path) + .ForEach(fs.DeleteFile); + } + + public static void CopyThumbnails(IFileSystem fs, string sourcePath, string targetPath) + { + var targetPathBase = Path.GetDirectoryName(targetPath) ?? ""; + foreach (var sourceThumbPath in GetThumbnails(fs, sourcePath)) + { + var sourceThumbFilename = Path.GetFileName(sourceThumbPath) ?? ""; + var targetThumbPath = Path.Combine(targetPathBase, sourceThumbFilename); + fs.CopyFile(sourceThumbPath, targetThumbPath); + } + } + + #endregion + #region GenerateThumbnails public static IEnumerable GenerateThumbnails( diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index 7addacdd87..cf5c883dc0 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -41,7 +41,7 @@ namespace Umbraco.Core.Persistence.Repositories _viewsFileSystem = viewFileSystem; _templateConfig = templateConfig; _viewHelper = new ViewHelper(_viewsFileSystem); - _masterPageHelper = new MasterPageHelper(_masterpagesFileSystem); + _masterPageHelper = new MasterPageHelper(_masterpagesFileSystem); } @@ -80,7 +80,7 @@ namespace Umbraco.Core.Persistence.Repositories if (dtos.Count == 0) return Enumerable.Empty(); - //look up the simple template definitions that have a master template assigned, this is used + //look up the simple template definitions that have a master template assigned, this is used // later to populate the template item's properties var childIds = (ids.Any() ? GetAxisDefinitions(dtos.ToArray()) @@ -90,7 +90,7 @@ namespace Umbraco.Core.Persistence.Repositories ParentId = x.NodeDto.ParentId, Name = x.Alias })).ToArray(); - + return dtos.Select(d => MapFromDto(d, childIds)); } @@ -104,7 +104,7 @@ namespace Umbraco.Core.Persistence.Repositories if (dtos.Count == 0) return Enumerable.Empty(); - //look up the simple template definitions that have a master template assigned, this is used + //look up the simple template definitions that have a master template assigned, this is used // later to populate the template item's properties var childIds = GetAxisDefinitions(dtos.ToArray()).ToArray(); @@ -311,14 +311,14 @@ namespace Umbraco.Core.Persistence.Repositories { var masterpageName = string.Concat(entity.Alias, ".master"); _masterpagesFileSystem.DeleteFile(masterpageName); - } + } } #endregion private IEnumerable GetAxisDefinitions(params TemplateDto[] templates) { - //look up the simple template definitions that have a master template assigned, this is used + //look up the simple template definitions that have a master template assigned, this is used // later to populate the template item's properties var childIdsSql = new Sql() .Select("nodeId,alias,parentID") @@ -327,7 +327,7 @@ namespace Umbraco.Core.Persistence.Repositories .On(SqlSyntax, dto => dto.NodeId, dto => dto.NodeId) //lookup axis's .Where("umbracoNode." + SqlSyntax.GetQuotedColumnName("id") + " IN (@parentIds) OR umbracoNode.parentID IN (@childIds)", - new {parentIds = templates.Select(x => x.NodeDto.ParentId), childIds = templates.Select(x => x.NodeId)}); + new {parentIds = templates.Select(x => x.NodeDto.ParentId), childIds = templates.Select(x => x.NodeId)}); var childIds = Database.Fetch(childIdsSql) .Select(x => new UmbracoEntity @@ -542,7 +542,7 @@ namespace Umbraco.Core.Persistence.Repositories //return the list - it will be naturally ordered by level return descendants; } - + public IEnumerable GetDescendants(string alias) { var all = base.GetAll().ToArray(); @@ -586,7 +586,7 @@ namespace Umbraco.Core.Persistence.Repositories /// [Obsolete("Use GetDescendants instead")] public TemplateNode GetTemplateNode(string alias) - { + { //first get all template objects var allTemplates = base.GetAll().ToArray(); @@ -595,7 +595,7 @@ namespace Umbraco.Core.Persistence.Repositories { return null; } - + var top = selfTemplate; while (top.MasterTemplateAlias.IsNullOrWhiteSpace() == false) { @@ -646,16 +646,16 @@ namespace Umbraco.Core.Persistence.Repositories } /// - /// This checks what the default rendering engine is set in config but then also ensures that there isn't already - /// a template that exists in the opposite rendering engine's template folder, then returns the appropriate + /// This checks what the default rendering engine is set in config but then also ensures that there isn't already + /// a template that exists in the opposite rendering engine's template folder, then returns the appropriate /// rendering engine to use. - /// + /// /// /// /// The reason this is required is because for example, if you have a master page file already existing under ~/masterpages/Blah.aspx - /// and then you go to create a template in the tree called Blah and the default rendering engine is MVC, it will create a Blah.cshtml - /// empty template in ~/Views. This means every page that is using Blah will go to MVC and render an empty page. - /// This is mostly related to installing packages since packages install file templates to the file system and then create the + /// and then you go to create a template in the tree called Blah and the default rendering engine is MVC, it will create a Blah.cshtml + /// empty template in ~/Views. This means every page that is using Blah will go to MVC and render an empty page. + /// This is mostly related to installing packages since packages install file templates to the file system and then create the /// templates in business logic. Without this, it could cause the wrong rendering engine to be used for a package. /// public RenderingEngine DetermineTemplateRenderingEngine(ITemplate template) @@ -763,7 +763,7 @@ namespace Umbraco.Core.Persistence.Repositories /// private void EnsureValidAlias(ITemplate template) { - //ensure unique alias + //ensure unique alias template.Alias = template.Alias.ToCleanString(CleanStringType.UnderscoreAlias); if (template.Alias.Length > 100) diff --git a/src/Umbraco.Web/Editors/ImagesController.cs b/src/Umbraco.Web/Editors/ImagesController.cs index b732dbd79e..eae620e745 100644 --- a/src/Umbraco.Web/Editors/ImagesController.cs +++ b/src/Umbraco.Web/Editors/ImagesController.cs @@ -112,8 +112,8 @@ namespace Umbraco.Web.Editors return Request.CreateResponse(HttpStatusCode.NotFound); //redirect to ImageProcessor thumbnail with rnd generated from last modified time of original media file - var response = Request.CreateResponse( HttpStatusCode.Found ); - var imageLastModified = fs.GetLastModified( imagePath ); + var response = Request.CreateResponse(HttpStatusCode.Found); + var imageLastModified = fs.GetLastModified(imagePath); response.Headers.Location = new Uri( string.Format( "{0}?rnd={1}&width={2}", imagePath, string.Format( "{0:yyyyMMddHHmmss}", imageLastModified ), width ), UriKind.Relative ); return response; } From 378e8f5cd93f3fd5919b0dcd01e66862c45c4a22 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 15 Apr 2016 13:25:11 +0200 Subject: [PATCH 007/841] deploy-30 - fixes --- src/Umbraco.Core/IO/MediaFileSystem.cs | 45 ++++---------- src/Umbraco.Core/Media/ImageHelper.cs | 2 + src/Umbraco.Core/Media/MediaHelper.cs | 13 ++-- .../Media/UploadAutoFillProperties.cs | 2 +- src/Umbraco.Core/Models/ContentExtensions.cs | 60 ++++++++++++------- src/Umbraco.Core/Models/File.cs | 15 ----- src/Umbraco.Core/Models/IFile.cs | 8 --- src/Umbraco.Core/Models/Template.cs | 2 +- src/Umbraco.Core/Models/TemplateOnDisk.cs | 52 ++++++++++++++++ .../Interfaces/ITemplateRepository.cs | 4 +- .../Repositories/TemplateRepository.cs | 13 ++-- .../Repositories/VersionableRepositoryBase.cs | 3 +- src/Umbraco.Core/Services/FileService.cs | 12 ++-- src/Umbraco.Core/Services/IFileService.cs | 4 +- src/Umbraco.Core/Services/IMediaService.cs | 4 +- src/Umbraco.Core/Services/MediaService.cs | 6 +- src/Umbraco.Core/Umbraco.Core.csproj | 1 + .../FileUploadPropertyValueEditor.cs | 4 +- .../ImageCropperPropertyValueEditor.cs | 4 +- .../umbraco/channels/UmbracoMetaWeblogAPI.cs | 2 +- src/umbraco.cms/businesslogic/Content.cs | 3 +- .../media/UmbracoFileMediaFactory.cs | 2 +- .../media/UmbracoMediaFactory.cs | 14 ++++- 23 files changed, 161 insertions(+), 114 deletions(-) create mode 100644 src/Umbraco.Core/Models/TemplateOnDisk.cs diff --git a/src/Umbraco.Core/IO/MediaFileSystem.cs b/src/Umbraco.Core/IO/MediaFileSystem.cs index b6ef6f7bf5..9dd0a8fda1 100644 --- a/src/Umbraco.Core/IO/MediaFileSystem.cs +++ b/src/Umbraco.Core/IO/MediaFileSystem.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Media; namespace Umbraco.Core.IO { @@ -26,6 +27,8 @@ namespace Umbraco.Core.IO _contentConfig = contentConfig; } + // none of the methods below are used in Core anymore + [Obsolete("This low-level method should NOT exist.")] public string GetRelativePath(int propertyId, string fileName) { @@ -36,7 +39,7 @@ namespace Umbraco.Core.IO return propertyId.ToString(CultureInfo.InvariantCulture) + sep + fileName; } - [Obsolete("This low-level method should NOT exist.")] + [Obsolete("This low-level method should NOT exist.", false)] public string GetRelativePath(string subfolder, string fileName) { var sep = _contentConfig.UploadAllowDirectories @@ -46,50 +49,28 @@ namespace Umbraco.Core.IO return subfolder + sep + fileName; } - // what's below is weird - // we are not deleting custom thumbnails - // MediaFileSystem is not just IFileSystem - // etc - - [Obsolete("", true)] + [Obsolete("Use ImageHelper.GetThumbnails instead.", false)] public IEnumerable GetThumbnails(string path) - { - var parentDirectory = Path.GetDirectoryName(path); - var extension = Path.GetExtension(path); - - return GetFiles(parentDirectory) - .Where(x => x.StartsWith(path.TrimEnd(extension) + "_thumb") || x.StartsWith(path.TrimEnd(extension) + "_big-thumb")) - .ToList(); + { + return ImageHelper.GetThumbnails(this, path); } - [Obsolete("", true)] + [Obsolete("Use ImageHelper.DeleteFile instead.", false)] public void DeleteFile(string path, bool deleteThumbnails) { - DeleteFile(path); - - if (deleteThumbnails == false) - return; - - DeleteThumbnails(path); + ImageHelper.DeleteFile(this, path, deleteThumbnails); } - [Obsolete("", true)] + [Obsolete("Use ImageHelper.DeleteThumbnails instead.", false)] public void DeleteThumbnails(string path) { - GetThumbnails(path) - .ForEach(DeleteFile); + ImageHelper.DeleteThumbnails(this, path); } - [Obsolete("", true)] + [Obsolete("Use ImageHelper.CopyThumbnails instead.", false)] public void CopyThumbnails(string sourcePath, string targetPath) { - var targetPathBase = Path.GetDirectoryName(targetPath) ?? ""; - foreach (var sourceThumbPath in GetThumbnails(sourcePath)) - { - var sourceThumbFilename = Path.GetFileName(sourceThumbPath) ?? ""; - var targetThumbPath = Path.Combine(targetPathBase, sourceThumbFilename); - this.CopyFile(sourceThumbPath, targetThumbPath); - } + ImageHelper.CopyThumbnails(this, sourcePath, targetPath); } } } diff --git a/src/Umbraco.Core/Media/ImageHelper.cs b/src/Umbraco.Core/Media/ImageHelper.cs index a9775321e8..61d786a1fa 100644 --- a/src/Umbraco.Core/Media/ImageHelper.cs +++ b/src/Umbraco.Core/Media/ImageHelper.cs @@ -91,6 +91,8 @@ namespace Umbraco.Core.Media #region Manage thumbnails + // note: this does not find 'custom' thumbnails? + // will find _thumb and _big-thumb but NOT _custom? public static IEnumerable GetThumbnails(IFileSystem fs, string path) { var parentDirectory = Path.GetDirectoryName(path); diff --git a/src/Umbraco.Core/Media/MediaHelper.cs b/src/Umbraco.Core/Media/MediaHelper.cs index 5367455a43..4b7133cce0 100644 --- a/src/Umbraco.Core/Media/MediaHelper.cs +++ b/src/Umbraco.Core/Media/MediaHelper.cs @@ -41,6 +41,7 @@ namespace Umbraco.Core.Media /// The unique identifier of the content/media owning the file. /// The unique identifier of the property type owning the file. /// The filesystem-relative path to the media file. + /// With the old media path scheme, this CREATES a new media path each time it is invoked. public static string GetMediaPath(string filename, Guid cuid, Guid puid) { filename = Path.GetFileName(filename); @@ -79,7 +80,7 @@ namespace Umbraco.Core.Media /// The unique identifier of the property type owning the file. /// The filesystem-relative path to the media file. /// In the old, legacy, number-based scheme, we try to re-use the media folder - /// specified by . Else, we create a new one. + /// specified by . Else, we CREATE a new one. Each time we are invoked. public static string GetMediaPath(string filename, string prevpath, Guid cuid, Guid puid) { if (UseTheNewMediaPathScheme || string.IsNullOrWhiteSpace(prevpath)) @@ -112,14 +113,14 @@ namespace Umbraco.Core.Media /// Gets the next media folder in the original number-based scheme. /// /// + /// Should be private, is internal for legacy FileHandlerData which is obsolete. internal static string GetNextFolder() { lock (FolderCounterLock) { if (_folderCounterInitialized == false) { - // fixme - seed was not respected in MediaSubfolderCounter? - _folderCounter = 1000; // seed + _folderCounter = 1000; // seed - was not respected in MediaSubfolderCounter? var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); var directories = fs.GetDirectories(""); foreach (var directory in directories) @@ -163,7 +164,7 @@ namespace Umbraco.Core.Media // clear the old file, if any var fs = FileSystem; if (string.IsNullOrWhiteSpace(oldpath)) - fs.DeleteFile(oldpath, true); + ImageHelper.DeleteFile(fs, oldpath, true); // get the filepath, store the data // use oldpath as "prevpath" to try and reuse the folder, in original number-based scheme @@ -178,7 +179,7 @@ namespace Umbraco.Core.Media /// The filesystem-relative path to the media file. public static void DeleteFile(string filepath) { - FileSystem.DeleteFile(filepath, true); + ImageHelper.DeleteFile(FileSystem, filepath, true); } /// @@ -202,7 +203,7 @@ namespace Umbraco.Core.Media var filename = Path.GetFileName(sourcepath); var filepath = GetMediaPath(filename, content.Key, propertyType.Key); fs.CopyFile(sourcepath, filepath); - fs.CopyThumbnails(sourcepath, filepath); + ImageHelper.CopyThumbnails(fs, sourcepath, filepath); return filepath; } diff --git a/src/Umbraco.Core/Media/UploadAutoFillProperties.cs b/src/Umbraco.Core/Media/UploadAutoFillProperties.cs index 553c994599..625bdc4e47 100644 --- a/src/Umbraco.Core/Media/UploadAutoFillProperties.cs +++ b/src/Umbraco.Core/Media/UploadAutoFillProperties.cs @@ -11,7 +11,7 @@ using Umbraco.Core.Models; namespace Umbraco.Core.Media { /// - /// Provides extension methods to manage auto-fill properties for upload fields. + /// Provides methods to manage auto-fill properties for upload fields. /// internal static class UploadAutoFillProperties { diff --git a/src/Umbraco.Core/Models/ContentExtensions.cs b/src/Umbraco.Core/Models/ContentExtensions.cs index 863f6b197a..e54653ea29 100644 --- a/src/Umbraco.Core/Models/ContentExtensions.cs +++ b/src/Umbraco.Core/Models/ContentExtensions.cs @@ -450,11 +450,11 @@ namespace Umbraco.Core.Models #region SetValue for setting file contents /// - /// Sets and uploads the file from a HttpPostedFileBase object as the property value + /// Stores and sets an uploaded HttpPostedFileBase as a property value. /// - /// to add property value to - /// Alias of the property to save the value on - /// The containing the file that will be uploaded + /// A content item. + /// The property alias. + /// The uploaded . public static void SetValue(this IContentBase content, string propertyTypeAlias, HttpPostedFileBase value) { // ensure we get the filename without the path in IE in intranet mode @@ -478,37 +478,37 @@ namespace Umbraco.Core.Models } /// - /// Sets and uploads the file from a HttpPostedFile object as the property value + /// Stores and sets an uploaded HttpPostedFile as a property value. /// - /// to add property value to - /// Alias of the property to save the value on - /// The containing the file that will be uploaded + /// A content item. + /// The property alias. + /// The uploaded . public static void SetValue(this IContentBase content, string propertyTypeAlias, HttpPostedFile value) { - SetValue(content, propertyTypeAlias, (HttpPostedFileBase)new HttpPostedFileWrapper(value)); + SetValue(content, propertyTypeAlias, (HttpPostedFileBase) new HttpPostedFileWrapper(value)); } /// - /// Sets and uploads the file from a HttpPostedFileWrapper object as the property value + /// Stores and sets an uploaded HttpPostedFileWrapper as a property value. /// - /// to add property value to - /// Alias of the property to save the value on - /// The containing the file that will be uploaded + /// A content item. + /// The property alias. + /// The uploaded . [Obsolete("There is no reason for this overload since HttpPostedFileWrapper inherits from HttpPostedFileBase")] public static void SetValue(this IContentBase content, string propertyTypeAlias, HttpPostedFileWrapper value) { - SetValue(content, propertyTypeAlias, (HttpPostedFileBase)value); + SetValue(content, propertyTypeAlias, (HttpPostedFileBase) value); } /// - /// Sets a content item property value with a file coming from a stream. + /// Stores and sets a file as a property value. /// - /// The content item. - /// The property type alias. - /// Name of the file - /// The stream containing the file data. + /// A content item. + /// The property alias. + /// The name of the file. + /// A stream containing the file data. /// This really is for FileUpload fields only, and should be obsoleted. For anything else, - /// you need to store the file by yourself using and then figure out + /// you need to store the file by yourself using Store and then figure out /// how to deal with auto-fill properties (if any) and thumbnails (if any) by yourself. public static void SetValue(this IContentBase content, string propertyTypeAlias, string filename, Stream filestream) { @@ -522,12 +522,28 @@ namespace Umbraco.Core.Models MediaHelper.SetUploadFile(content, propertyTypeAlias, filename, filestream); } - public static string StoreFile(this IContentBase content, string propertyTypeAlias, string filename, Stream filestream, string oldpath) + /// + /// Stores a file. + /// + /// A content item. + /// The property alias. + /// The name of the file. + /// A stream containing the file data. + /// The original file path, if any. + /// The path to the file, relative to the media filesystem. + /// + /// Does NOT set the property value, so one should probably store the file and then do + /// something alike: property.Value = MediaHelper.FileSystem.GetUrl(filepath). + /// The original file path is used, in the old media file path scheme, to try and reuse + /// the "folder number" that was assigned to the previous file referenced by the property, + /// if any. + /// + public static string StoreFile(this IContentBase content, string propertyTypeAlias, string filename, Stream filestream, string filepath) { var propertyType = content.GetContentType() .CompositionPropertyTypes.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); if (propertyType == null) throw new ArgumentException("Invalid property type alias " + propertyTypeAlias + "."); - return MediaHelper.StoreFile(content, propertyType, filename, filestream, oldpath); + return MediaHelper.StoreFile(content, propertyType, filename, filestream, filepath); } #endregion diff --git a/src/Umbraco.Core/Models/File.cs b/src/Umbraco.Core/Models/File.cs index da093f792a..8ead6da5f8 100644 --- a/src/Umbraco.Core/Models/File.cs +++ b/src/Umbraco.Core/Models/File.cs @@ -25,21 +25,6 @@ namespace Umbraco.Core.Models private string _content; internal Func GetFileContent { get; set; } - // whether to use whatever already exists on filesystem - internal bool _useExistingContent; - - /// - /// Indicates that the file should use whatever content already - /// exists on the filesystem which manages the file, bypassing content - /// management entirely. - /// - /// Only for the next save. Is resetted when the file is saved. - public void UseExistingContent() - { - _useExistingContent = true; - _content = null; // force content to be loaded - } - protected File(string path, Func getFileContent = null) { _path = SanitizePath(path); diff --git a/src/Umbraco.Core/Models/IFile.cs b/src/Umbraco.Core/Models/IFile.cs index 0d1cf24cdd..de900c50ec 100644 --- a/src/Umbraco.Core/Models/IFile.cs +++ b/src/Umbraco.Core/Models/IFile.cs @@ -39,14 +39,6 @@ namespace Umbraco.Core.Models /// string Content { get; set; } - /// - /// Indicates that the file should use whatever content already - /// exists on the filesystem which manages the file, bypassing content - /// management entirely. - /// - /// Only for the next save. Is resetted when the file is saved. - void UseExistingContent(); - /// /// Gets or sets the file's virtual path (i.e. the file path relative to the root of the website) /// diff --git a/src/Umbraco.Core/Models/Template.cs b/src/Umbraco.Core/Models/Template.cs index 1c8b44b674..6a271ad7ab 100644 --- a/src/Umbraco.Core/Models/Template.cs +++ b/src/Umbraco.Core/Models/Template.cs @@ -15,7 +15,7 @@ using Umbraco.Core.Strings; namespace Umbraco.Core.Models { /// - /// Represents a Template file + /// Represents a Template file. /// [Serializable] [DataContract(IsReference = true)] diff --git a/src/Umbraco.Core/Models/TemplateOnDisk.cs b/src/Umbraco.Core/Models/TemplateOnDisk.cs new file mode 100644 index 0000000000..7f89b47e34 --- /dev/null +++ b/src/Umbraco.Core/Models/TemplateOnDisk.cs @@ -0,0 +1,52 @@ +using System; +using System.Runtime.Serialization; + +namespace Umbraco.Core.Models +{ + /// + /// Represents a Template file that can have its content on disk. + /// + [Serializable] + [DataContract(IsReference = true)] + public class TemplateOnDisk : Template + { + /// + /// Initializes a new instance of the class. + /// + /// The name of the template. + /// The alias of the template. + public TemplateOnDisk(string name, string alias) + : base(name, alias) + { + IsOnDisk = true; + } + + /// + /// Gets or sets a value indicating whether the content is on disk already. + /// + public bool IsOnDisk { get; set; } + + /// + /// Gets or sets the content. + /// + /// + /// Getting the content while the template is "on disk" throws, + /// the template must be saved before its content can be retrieved. + /// Setting the content means it is not "on disk" anymore, and the + /// template becomes (and behaves like) a normal template. + /// + public override string Content + { + get + { + if (IsOnDisk) throw new InvalidOperationException("On-disk template do not have content until saved."); + return base.Content; + } + set + { + base.Content = value; + IsOnDisk = false; + } + } + } +} diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs index 48b0cf66b7..11ac404f5d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs @@ -64,13 +64,13 @@ namespace Umbraco.Core.Persistence.Repositories /// /// The filesystem path to the template. /// The content of the template. - Stream GetFileStream(string filepath); + Stream GetFileContent(string filepath); /// /// Sets the content of a template. /// /// The filesystem path to the template. /// The content of the template. - void SetFile(string filepath, Stream content); + void SetFileContent(string filepath, Stream content); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index 0242d9d222..34cbd30df7 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -251,13 +251,15 @@ namespace Umbraco.Core.Persistence.Repositories { string content; - if (template._useExistingContent) + var templateOnDisk = template as TemplateOnDisk; + if (templateOnDisk != null && templateOnDisk.IsOnDisk) { - content = _viewHelper.GetFileContents(template); // BUT the template does not exist yet?! - template._useExistingContent = false; // reset + // if "template on disk" load content from disk + content = _viewHelper.GetFileContents(template); } else { + // else, create or write template.Content to disk if (DetermineTemplateRenderingEngine(template) == RenderingEngine.Mvc) { content = originalAlias == null @@ -272,6 +274,7 @@ namespace Umbraco.Core.Persistence.Repositories } } + // once content has been set, "template on disk" are not "on disk" anymore template.Content = content; if (dto.Design == content) return; @@ -449,12 +452,12 @@ namespace Umbraco.Core.Persistence.Repositories } } - public Stream GetFileStream(string filepath) + public Stream GetFileContent(string filepath) { return GetFileSystem(filepath).OpenFile(filepath); } - public void SetFile(string filepath, Stream content) + public void SetFileContent(string filepath, Stream content) { GetFileSystem(filepath).AddFile(filepath, content, true); } diff --git a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs index 56b0b63ad5..6ffa692fa0 100644 --- a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs @@ -22,6 +22,7 @@ using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; using Umbraco.Core.Dynamics; using Umbraco.Core.IO; +using Umbraco.Core.Media; namespace Umbraco.Core.Persistence.Repositories { @@ -579,7 +580,7 @@ WHERE EXISTS( } else { - fs.DeleteFile(file, true); + ImageHelper.DeleteFile(fs, file, true); } } catch (Exception e) diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 1dae926c6a..06ab3c5229 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -558,19 +558,19 @@ namespace Umbraco.Core.Services } } - public Stream GetTemplateFileStream(string filepath) + public Stream GetTemplateFileContent(string filepath) { - using (var repository = _repositoryFactory.CreateTemplateRepository(_dataUowProvider.GetUnitOfWork())) + using (var repository = RepositoryFactory.CreateTemplateRepository(UowProvider.GetUnitOfWork())) { - return repository.GetFileStream(filepath); + return repository.GetFileContent(filepath); } } - public void SetTemplateFile(string filepath, Stream content) + public void SetTemplateFileContent(string filepath, Stream content) { - using (var repository = _repositoryFactory.CreateTemplateRepository(_dataUowProvider.GetUnitOfWork())) + using (var repository = RepositoryFactory.CreateTemplateRepository(UowProvider.GetUnitOfWork())) { - repository.SetFile(filepath, content); + repository.SetFileContent(filepath, content); } } diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 8ea1d9b23b..010dd7067f 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -242,13 +242,13 @@ namespace Umbraco.Core.Services /// /// The filesystem path to the template. /// The content of the template. - Stream GetTemplateFileStream(string filepath); + Stream GetTemplateFileContent(string filepath); /// /// Sets the content of a template. /// /// The filesystem path to the template. /// The content of the template. - void SetTemplateFile(string filepath, Stream content); + void SetTemplateFileContent(string filepath, Stream content); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/IMediaService.cs b/src/Umbraco.Core/Services/IMediaService.cs index 83c815c78d..3fcad5f32e 100644 --- a/src/Umbraco.Core/Services/IMediaService.cs +++ b/src/Umbraco.Core/Services/IMediaService.cs @@ -377,14 +377,14 @@ namespace Umbraco.Core.Services /// /// The filesystem path to the media. /// The content of the media. - Stream GetMediaFileStream(string filepath); + Stream GetMediaFileContent(string filepath); /// /// Sets the content of a media. /// /// The filesystem path to the media. /// The content of the media. - void SetMediaFile(string filepath, Stream content); + void SetMediaFileContent(string filepath, Stream content); /// /// Deletes a media file and all thumbnails. diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 5240c5c9b3..121b7f508e 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -1259,19 +1259,19 @@ namespace Umbraco.Core.Services } } - public Stream GetMediaFileStream(string filepath) + public Stream GetMediaFileContent(string filepath) { return MediaHelper.FileSystem.OpenFile(filepath); } - public void SetMediaFile(string filepath, Stream stream) + public void SetMediaFileContent(string filepath, Stream stream) { MediaHelper.FileSystem.AddFile(filepath, stream, true); } public void DeleteMediaFile(string filepath) { - MediaHelper.FileSystem.DeleteFile(filepath, true); + ImageHelper.DeleteFile(MediaHelper.FileSystem, filepath, true); } public void GenerateThumbnails(string filepath, PropertyType propertyType) diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index f329fab881..1ebd25cda5 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -403,6 +403,7 @@ + diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs index 857f2860b2..1bba10c7a3 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs @@ -75,7 +75,7 @@ namespace Umbraco.Web.PropertyEditors if (clears) { foreach (var pathToRemove in currentPaths) - fs.DeleteFile(pathToRemove, true); + ImageHelper.DeleteFile(fs, pathToRemove, true); return string.Empty; // no more files } @@ -136,7 +136,7 @@ namespace Umbraco.Web.PropertyEditors // remove files that are not there anymore foreach (var pathToRemove in currentPaths.Except(newPaths)) - fs.DeleteFile(pathToRemove, true); + ImageHelper.DeleteFile(fs, pathToRemove, true); return string.Join(",", newPaths.Select(x => fs.GetUrl(x))); diff --git a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs index cf46037402..f1f26f003b 100644 --- a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs @@ -122,7 +122,7 @@ namespace Umbraco.Web.PropertyEditors // value is unchanged. if (string.IsNullOrWhiteSpace(editorFile) && string.IsNullOrWhiteSpace(currentPath) == false) { - fs.DeleteFile(currentPath, true); + ImageHelper.DeleteFile(fs, currentPath, true); return null; // clear } @@ -138,7 +138,7 @@ namespace Umbraco.Web.PropertyEditors // remove current file if replaced if (currentPath != filepath && string.IsNullOrWhiteSpace(currentPath) == false) - fs.DeleteFile(currentPath, true); + ImageHelper.DeleteFile(fs, currentPath, true); // update json and return if (editorJson == null) return null; diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/channels/UmbracoMetaWeblogAPI.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/channels/UmbracoMetaWeblogAPI.cs index 6eefec8ab0..b4fa6ed573 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/channels/UmbracoMetaWeblogAPI.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/channels/UmbracoMetaWeblogAPI.cs @@ -450,7 +450,7 @@ namespace umbraco.presentation.channels Property fileObject = m.getProperty(userChannel.MediaTypeFileProperty); var filename = file.name.Replace("/", "_"); - var relativeFilePath = _fs.GetRelativePath(fileObject.Id, filename); + var relativeFilePath = UmbracoMediaFactory.GetRelativePath(fileObject.Id, filename); fileObject.Value = _fs.GetUrl(relativeFilePath); fileUrl.url = fileObject.Value.ToString(); diff --git a/src/umbraco.cms/businesslogic/Content.cs b/src/umbraco.cms/businesslogic/Content.cs index f014ddae93..e7b9d7fe66 100644 --- a/src/umbraco.cms/businesslogic/Content.cs +++ b/src/umbraco.cms/businesslogic/Content.cs @@ -13,6 +13,7 @@ using umbraco.DataLayer; using System.Runtime.CompilerServices; using umbraco.cms.helpers; using umbraco.cms.businesslogic.datatype.controls; +using Umbraco.Core.Media; using File = System.IO.File; using Property = umbraco.cms.businesslogic.property.Property; using PropertyType = umbraco.cms.businesslogic.propertytype.PropertyType; @@ -631,7 +632,7 @@ namespace umbraco.cms.businesslogic } else { - fs.DeleteFile(relativeFilePath, true); + ImageHelper.DeleteFile(fs, relativeFilePath, true); } } } diff --git a/src/umbraco.cms/businesslogic/media/UmbracoFileMediaFactory.cs b/src/umbraco.cms/businesslogic/media/UmbracoFileMediaFactory.cs index 0c265d8b07..dc13f83ea6 100644 --- a/src/umbraco.cms/businesslogic/media/UmbracoFileMediaFactory.cs +++ b/src/umbraco.cms/businesslogic/media/UmbracoFileMediaFactory.cs @@ -29,7 +29,7 @@ namespace umbraco.cms.businesslogic.media var propertyId = media.getProperty(Constants.Conventions.Media.File).Id; // Get paths - var destFilePath = FileSystem.GetRelativePath(propertyId, uploadedFile.FileName); + var destFilePath = GetRelativePath(propertyId, uploadedFile.FileName); var ext = Path.GetExtension(destFilePath).Substring(1); //var absoluteDestPath = HttpContext.Current.Server.MapPath(destPath); diff --git a/src/umbraco.cms/businesslogic/media/UmbracoMediaFactory.cs b/src/umbraco.cms/businesslogic/media/UmbracoMediaFactory.cs index 54d8dfa770..8cdf519a09 100644 --- a/src/umbraco.cms/businesslogic/media/UmbracoMediaFactory.cs +++ b/src/umbraco.cms/businesslogic/media/UmbracoMediaFactory.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading; @@ -99,7 +100,7 @@ namespace umbraco.cms.businesslogic.media if (int.TryParse(subfolder, out subfolderId)) { - var destFilePath = FileSystem.GetRelativePath(subfolderId, fileName); + var destFilePath = GetRelativePath(subfolderId, fileName); var destFileUrl = FileSystem.GetUrl(destFilePath); if (prop.Value.ToString() == destFileUrl) @@ -154,6 +155,17 @@ namespace umbraco.cms.businesslogic.media return friendlyName; } + public static string GetRelativePath(int propertyId, string fileName) + { + var contentConfig = UmbracoConfig.For.UmbracoSettings().Content; + + var sep = contentConfig.UploadAllowDirectories + ? Path.DirectorySeparatorChar + : '-'; + + return propertyId.ToString(CultureInfo.InvariantCulture) + sep + fileName; + } + #endregion } } From 179f36e2a2ffd67a9a60c0a860c180bf561c8707 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 15 Apr 2016 16:36:53 +0200 Subject: [PATCH 008/841] deploy-30 - fixes --- src/Umbraco.Core/Models/TemplateOnDisk.cs | 3 +-- .../Persistence/Repositories/FileRepository.cs | 16 +++++++++++++--- .../Repositories/TemplateRepository.cs | 14 +++++++++++++- src/Umbraco.Core/Services/MediaService.cs | 11 ++++++++++- .../config/ClientDependency.config | 2 +- 5 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Core/Models/TemplateOnDisk.cs b/src/Umbraco.Core/Models/TemplateOnDisk.cs index 7f89b47e34..a8420adcb6 100644 --- a/src/Umbraco.Core/Models/TemplateOnDisk.cs +++ b/src/Umbraco.Core/Models/TemplateOnDisk.cs @@ -39,8 +39,7 @@ namespace Umbraco.Core.Models { get { - if (IsOnDisk) throw new InvalidOperationException("On-disk template do not have content until saved."); - return base.Content; + return IsOnDisk ? string.Empty : base.Content; } set { diff --git a/src/Umbraco.Core/Persistence/Repositories/FileRepository.cs b/src/Umbraco.Core/Persistence/Repositories/FileRepository.cs index e1e4c3105a..7ce0d71097 100644 --- a/src/Umbraco.Core/Persistence/Repositories/FileRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/FileRepository.cs @@ -217,10 +217,20 @@ namespace Umbraco.Core.Persistence.Repositories protected string GetFileContent(string filename) { - using (var stream = FileSystem.OpenFile(filename)) - using (var reader = new StreamReader(stream, Encoding.UTF8, true)) + if (FileSystem.FileExists(filename) == false) + return null; + + try { - return reader.ReadToEnd(); + using (var stream = FileSystem.OpenFile(filename)) + using (var reader = new StreamReader(stream, Encoding.UTF8, true)) + { + return reader.ReadToEnd(); + } + } + catch + { + return null; // deal with race conds } } diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index 34cbd30df7..5ee83a47a8 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -418,6 +418,8 @@ namespace Umbraco.Core.Persistence.Repositories fsname = string.Concat(template.Alias, ".master"); if (_masterpagesFileSystem.FileExists(fsname)) return GetFileContent(template, _masterpagesFileSystem, fsname, init); + + template.VirtualPath = string.Empty; // file not found... return string.Empty; } @@ -454,7 +456,17 @@ namespace Umbraco.Core.Persistence.Repositories public Stream GetFileContent(string filepath) { - return GetFileSystem(filepath).OpenFile(filepath); + var fs = GetFileSystem(filepath); + if (fs.FileExists(filepath) == false) return null; + + try + { + return GetFileSystem(filepath).OpenFile(filepath); + } + catch + { + return null; // deal with race conds + } } public void SetFileContent(string filepath, Stream content) diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 121b7f508e..7cd1c2ab00 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -1261,7 +1261,16 @@ namespace Umbraco.Core.Services public Stream GetMediaFileContent(string filepath) { - return MediaHelper.FileSystem.OpenFile(filepath); + if (MediaHelper.FileSystem.FileExists(filepath) == false) + return null; + try + { + return MediaHelper.FileSystem.OpenFile(filepath); + } + catch + { + return null; // deal with race conds + } } public void SetMediaFileContent(string filepath, Stream stream) diff --git a/src/Umbraco.Web.UI/config/ClientDependency.config b/src/Umbraco.Web.UI/config/ClientDependency.config index 80d8db2da3..fd5df58715 100644 --- a/src/Umbraco.Web.UI/config/ClientDependency.config +++ b/src/Umbraco.Web.UI/config/ClientDependency.config @@ -10,7 +10,7 @@ NOTES: * Compression/Combination/Minification is not enabled unless debug="false" is specified on the 'compiliation' element in the web.config * A new version will invalidate both client and server cache and create new persisted files --> - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7dfc288f93648fb512c7032aea719e6993434063 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 12 Jun 2016 12:26:08 +0200 Subject: [PATCH 011/841] setup view + load ace editor --- .../lib/ace/ace-src-min-noconflict.js | 10 + src/Umbraco.Web.UI.Client/lib/ace/mode-css.js | 1 + .../lib/ace/mode-javascript.js | 1 + .../lib/ace/mode-razor.js | 1 + .../components/umbaceeditor.directive.js | 341 ++++++++++++++++++ .../src/views/templates/edit.controller.js | 92 +++++ .../src/views/templates/edit.html | 94 +++++ src/Umbraco.Web/UI/JavaScript/JsInitialize.js | 5 + 8 files changed, 545 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/lib/ace/ace-src-min-noconflict.js create mode 100644 src/Umbraco.Web.UI.Client/lib/ace/mode-css.js create mode 100644 src/Umbraco.Web.UI.Client/lib/ace/mode-javascript.js create mode 100644 src/Umbraco.Web.UI.Client/lib/ace/mode-razor.js create mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/templates/edit.html diff --git a/src/Umbraco.Web.UI.Client/lib/ace/ace-src-min-noconflict.js b/src/Umbraco.Web.UI.Client/lib/ace/ace-src-min-noconflict.js new file mode 100644 index 0000000000..b338717bfd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/ace/ace-src-min-noconflict.js @@ -0,0 +1,10 @@ +(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE = "ace",e=function(){return this}();!e&&typeof window!="undefined"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!="undefined")return;var t=function(e,n,r){if(typeof e!="string"){t.original?t.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t=="string"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)==="[object Array]"){var o=[];for(var u=0,a=t.length;u1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((i.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&window.navigator.product==="Gecko",t.isOldGecko=t.isGecko&&parseInt((i.match(/rv\:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isTouchPad=i.indexOf("TouchPad")>=0,t.isChromeOS=i.indexOf(" CrOS ")>=0}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){s.OSKey&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1),a&8&&n>=91&&n<=93&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null),s.count=0,s.lastT=0}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addTouchMoveListener=function(e,n){if("ontouchmove"in e){var r,i;t.addListener(e,"touchstart",function(e){var t=e.changedTouches[0];r=t.clientX,i=t.clientY}),t.addListener(e,"touchmove",function(e){var t=1,s=e.changedTouches[0];e.wheelX=-(s.clientX-r)/t,e.wheelY=-(s.clientY-i)/t,r=s.clientX,i=s.clientY,n(e)})}},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){var t=e.keyCode;s[t]=(s[t]||0)+1,t==91||t==92?s.OSKey=!0:s.OSKey&&e.timeStamp-s.lastT>200&&s.count==1&&f(),s[t]==1&&s.count++,s.lastT=e.timeStamp;var r=a(n,e,t);return u=e.defaultPrevented,r}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){var t=e.keyCode;s[t]?s.count=Math.max(s.count-1,0):f();if(t==91||t==92)s.OSKey=!1;s[t]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l;t.addListener(n,"message",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())}),n.postMessage(r,"*")}}t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/lib/lang",["require","exports","module"],function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;n.$blockScrolling++,this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select"),n.$blockScrolling--},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);t.$blockScrolling++;if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=f(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);n.$blockScrolling++;if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=f(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.$blockScrolling--,n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=a(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>o||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()},this.onTouchMove=function(e){var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(u.prototype),t.DefaultHandlers=u}),ace.define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(e,t,n){"use strict";function s(e){this.isOpen=!1,this.$element=null,this.$parentNode=e}var r=e("./lib/oop"),i=e("./lib/dom");(function(){this.$init=function(){return this.$element=i.createElement("div"),this.$element.className="ace_tooltip",this.$element.style.display="none",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(e){i.setInnerText(this.getElement(),e)},this.setHtml=function(e){this.getElement().innerHTML=e},this.setPosition=function(e,t){this.getElement().style.left=e+"px",this.getElement().style.top=t+"px"},this.setClassName=function(e){i.addCssClass(this.getElement(),e)},this.show=function(e,t,n){e!=null&&this.setText(e),t!=null&&n!=null&&this.setPosition(t,n),this.isOpen||(this.getElement().style.display="block",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display="none",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(s.prototype),t.Tooltip=s}),ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(e,t,n){"use strict";function u(e){function l(){var r=u.getDocumentPosition().row,s=n.$annotations[r];if(!s)return c();var o=t.session.getLength();if(r==o){var a=t.renderer.pixelToScreenCoordinates(0,u.y).row,l=u.$pos;if(a>t.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.$blockScrolling+=1,t.moveCursorToPosition(e),t.$blockScrolling-=1,S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(m),t.$blockScrolling-=1,t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a)},t.init=f}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("../config"),l=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),r.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var f=e.renderer.$gutter;r.addListener(f,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(f,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(f,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(f,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(f,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new u(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,o=function(e){if(!e)return;if(i.isWebKit&&!e.which&&s.releaseMouse)return s.releaseMouse();s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new u(e,s.editor),s.$mouseMoved=!0},a=function(e){clearInterval(l),f(),s[s.state+"End"]&&s[s.state+"End"](e),s.state="",n.$keepTextAreaAtCursor==null&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent("mouseup",e)},f=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){a(e)});s.$onCaptureMouseMove=o,s.releaseMouse=r.capture(this.editor.container,o,a);var l=setInterval(f,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),ace.define("ace/mouse/fold_handler",["require","exports","module"],function(e,t,n){"use strict";function r(e){e.on("click",function(t){var n=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(n.row,n.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}t.FoldHandler=r}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.rowt.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column-n,e.column).split(" ").length-1==n?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s){this.moveCursorTo(s.end.row,s.end.column);return}if(i=this.session.nonTokenRe.exec(r))t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t);if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}if(o=this.session.tokenRe.exec(s))t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t,n=0,r,i=/\s/,s=this.session.tokenRe;s.lastIndex=0;if(t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((r=e[n])&&i.test(r))n++;if(n<1){s.lastIndex=0;while((r=e[n])&&!s.test(r)){s.lastIndex=0,n++;if(i.test(r)){if(n>2){n--;break}while((r=e[n])&&i.test(r))n++;if(n>2)break}}}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column);t===0&&(this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var r=this.session.screenToDocumentPosition(n.row+e,n.column);e!==0&&t===0&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&(r.row>0||e>0)&&r.row++,this.moveCursorTo(r.row,r.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),ace.define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}}}).call(r.prototype),t.TokenIterator=r}),ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],function(e,t,n){"use strict";var r=e("../tokenizer").Tokenizer,i=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour").Behaviour,o=e("../unicode"),u=e("../lib/lang"),a=e("../token_iterator").TokenIterator,f=e("../range").Range,l=function(){this.HighlightRules=i,this.$behaviour=new s};(function(){this.tokenRe=new RegExp("^["+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules,this.$tokenizer=new r(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(e,t,n,r){function w(e){for(var t=n;t<=r;t++)e(i.getLine(t),t)}var i=t.doc,s=!0,o=!0,a=Infinity,f=t.getTabSize(),l=!1;if(!this.lineCommentStart){if(!this.blockComment)return!1;var c=this.blockComment.start,h=this.blockComment.end,p=new RegExp("^(\\s*)(?:"+u.escapeRegExp(c)+")"),d=new RegExp("(?:"+u.escapeRegExp(h)+")\\s*$"),v=function(e,t){if(g(e,t))return;if(!s||/\S/.test(e))i.insertInLine({row:t,column:e.length},h),i.insertInLine({row:t,column:a},c)},m=function(e,t){var n;(n=e.match(d))&&i.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(p))&&i.removeInLine(t,n[1].length,n[0].length)},g=function(e,n){if(p.test(e))return!0;var r=t.getTokens(n);for(var i=0;i2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),a==Infinity&&(a=E,s=!1,o=!1),l&&a%f!=0&&(a=Math.floor(a/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new a(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,l=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new f(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new a(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new f(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);l.start.row==c&&(l.start.column+=h),l.end.row==c&&(l.end.column+=h),t.selection.fromOrientedRange(l)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);var n=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.rowr)break;l.start.row==r&&l.start.column>=t.column&&(l.start.column!=t.column||!this.$insertRight)&&(l.start.column+=o,l.start.row+=s);if(l.end.row==r&&l.end.column>=t.column){if(l.end.column==t.column&&this.$insertRight)continue;l.end.column==t.column&&o>0&&al.start.column&&l.end.column==u[a+1].start.column&&(l.end.column-=o),l.end.column+=o,l.end.row+=s}}if(s!=0&&a=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(t=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s){t.children||t.all?this.removeFold(s):this.expandFold(s);return}var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range)){this.removeFold(s);return}}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=e.length-1;r!=-1;r--){var i=e[r];i.group=="doc"?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=0;re.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,l=s.start,o=l.row-a.row,u=l.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new f(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),s=this.$wrapData,o=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,s){var o;if(e!=null){o=this.$getDisplayTokens(e,a.length),o[0]=n;for(var f=1;fr-b){var w=a+r-b;if(e[w-1]>=p&&e[w]>=p){y(w);continue}if(e[w]==n||e[w]==u){for(w;w!=a-1;w--)if(e[w]==n)break;if(w>a){y(w);continue}w=a+r;for(w;w>2)),a-1);while(w>E&&e[w]E&&e[w]E&&e[w]==l)w--}else while(w>E&&e[w]E){y(++w);continue}w=a+r,e[w]==t&&w--,y(w-b)}return s},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(l):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var o=a[f],r=this.$docRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:Infinity;while(o<=e){u=this.getRowLength(r);if(o+u>e||r>=h)break;o+=u,r++,r>d&&(r=p.end.row+1,p=this.getNextFoldLine(r,p),d=p?p.start.row:Infinity),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o))}if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||r>h)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}var v=0;if(this.$useWrapMode){var m=this.$wrapData[r];if(m){var g=Math.floor(e-o);s=m[g],g>0&&m.length&&(v=m.indent,i=m[g-1]||m[m.length-1],n=n.substring(i))}}return i+=this.$getStringScreenWidth(n,t-v)[1],this.$useWrapMode&&i>=s&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()}}).call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize")},initialValue:4,handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i){if(!e.start){var o=e.offset+(i||0);r=new s(n,o,n,o+e.length);if(!e.length&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start))return r=null,!1}else r=e;return!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=0;u--)if(i(o[u],t,s))return!0};else var u=function(e,t,s){var o=r.getMatchOffsets(e,n);for(var u=0;u=o;r--)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=u,o=s.row;r>=o;r--)if(n(e.getLine(r),r))return}:function(n){var r=s.row,i=e.getLine(r).substr(s.column);if(n(i,r,s.column))return;for(r+=1;r<=u;r++)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=o,u=s.row;r<=u;r++)if(n(e.getLine(r),r))return};return{forEach:a}}}).call(o.prototype),t.Search=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||0}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r||n.isDefault?r=-100:r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","Ctrl-E"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Ctrl-Shift-E"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:o("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:o("Ctrl-Shift-Home","Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:o("Shift-Up","Shift-Up"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:o("Ctrl-Shift-End","Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:o("Shift-Down","Shift-Down"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:o("Alt-Shift-Left","Command-Shift-Left"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:o("Shift-Left","Shift-Left"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:o("Alt-Shift-Right","Command-Shift-Right"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:o("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:o("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(e){},readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:o("Alt-Delete","Ctrl-K"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:o("Ctrl-T","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o0&&this.$blockScrolling--;var n=t&&t.scrollIntoView;if(n){switch(n){case"center-animate":n="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var r=this.selection.getRange(),i=this.renderer.layerConfig;(r.start.row>=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this})},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container,"fontSize")},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column-1,r=t.end.column+1,i=e.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(n>=0&&/^[\w\d]/.test(o)||r<=s&&/[\w\d]$/.test(o))return;o=i.substring(t.start.column,t.end.column);if(!/^[\w\d]+$/.test(o))return;var u=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o});return u},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e,t){var n={text:e,event:t};this.commands.exec("paste",this,n)},this.$handlePaste=function(e){typeof e=="string"&&(e={text:e}),this._signal("paste",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var n=t.split(/\r\n|\r|\n/),r=this.selection.rangeList.ranges;if(n.length>r.length||n.length<2||!n[1])return this.commands.exec("insertstring",this,t);for(var i=r.length;i--;){var s=r[i];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[i])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,r=n.getMode(),i=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=r.transformAction(n.getState(i.row),"insertion",this,n,e);s&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text)}e==" "&&(e=this.session.getTabString());if(!this.selection.isEmpty()){var o=this.getSelectionRange();i=this.session.remove(o),this.clearSelection()}else if(this.session.getOverwrite()){var o=new p.fromPoints(i,i);o.end.column+=e.length,this.session.remove(o)}if(e=="\n"||e=="\r\n"){var u=n.getLine(i.row);if(i.column>u.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e),h=n.insert(i,e);s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var d=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},d)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var r=new p(0,0,0,0);for(var i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&np+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),this.$blockScrolling-=1,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))}}).call(b.prototype),g.defineOptions(b.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),t.Editor=b}),ace.define("ace/undomanager",["require","exports","module"],function(e,t,n){"use strict";var r=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines.length==1?null:e.lines,text:e.lines.length==1?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function n(e,t){var n=new Array(e.length);for(var r=0;r0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return this.dirtyCounter===0},this.$serializeDeltas=function(t){return n(t,e)},this.$deserializeDeltas=function(e){return n(e,t)}}).call(r.prototype),t.UndoManager=r}),ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/lang"),o=e("../lib/event_emitter").EventEmitter,u=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e&&e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;to&&(v=s.end.row+1,s=t.getNextFoldLine(v,s),o=s?s.start.row:Infinity);if(v>i){while(this.$cells.length>d+1)p=this.$cells.pop(),this.element.removeChild(p.element);break}p=this.$cells[++d],p||(p={element:null,textNode:null,foldWidget:null},p.element=r.createElement("div"),p.textNode=document.createTextNode(""),p.element.appendChild(p.textNode),this.element.appendChild(p.element),this.$cells[d]=p);var m="ace_gutter-cell ";a[v]&&(m+=a[v]),f[v]&&(m+=f[v]),this.$annotations[v]&&(m+=this.$annotations[v].className),p.element.className!=m&&(p.element.className=m);var g=t.getRowLength(v)*e.lineHeight+"px";g!=p.element.style.height&&(p.element.style.height=g);if(u){var y=u[v];y==null&&(y=u[v]=t.getFoldWidget(v))}if(y){p.foldWidget||(p.foldWidget=r.createElement("span"),p.element.appendChild(p.foldWidget));var m="ace_fold-widget ace_"+y;y=="start"&&v==o&&vn.right-t.right)return"foldWidgets"}}).call(u.prototype),t.Gutter=u}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){var e=e||this.config;if(!e)return;this.config=e;var t=[];for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}this.element.innerHTML=t.join("")},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,n,i,s,o){var u=this.session,a=n.start.row,f=n.end.row,l=a,c=0,h=0,p=u.getScreenLastRowColumn(l),d=new r(l,n.start.column,l,h);for(;l<=f;l++)d.start.row=d.end.row=l,d.start.column=l==a?n.start.column:u.getRowWrapIndent(l),d.end.column=p,c=h,h=p,p=l+1p,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"",e.push("
"),u=this.$getTop(t.end.row,r);var f=t.end.column*r.characterWidth;e.push("
"),o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var l=(t.start.column?1:0)|(t.end.column?0:8);e.push("
")},this.drawSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;e.push("
")},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),e.push("
")},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;e.push("
")}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.$updateEolChar=function(){var e=this.session.doc.getNewLineCharacter()=="\n"?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;n"+s.stringRepeat(this.TAB_CHAR,n)+""):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var r="ace_indent-guide",i="",o="";if(this.showInvisibles){r+=" ace_invisible",i=" ace_invisible_space",o=" ace_invisible_tab";var u=s.stringRepeat(this.SPACE_CHAR,this.tabSize),a=s.stringRepeat(this.TAB_CHAR,this.tabSize)}else var u=s.stringRepeat(" ",this.tabSize),a=u;this.$tabStrings[" "]=""+u+"",this.$tabStrings[" "]=""+a+""}},this.updateLines=function(e,t,n){(this.config.lastRow!=e.lastRow||this.config.firstRow!=e.firstRow)&&this.scrollLines(e),this.config=e;var r=Math.max(t,e.firstRow),i=Math.min(n,e.lastRow),s=this.element.childNodes,o=0;for(var u=e.firstRow;uf&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),f=a?a.start.row:Infinity);if(u>i)break;var l=s[o++];if(l){var c=[];this.$renderLine(c,u,!this.$useLineGroups(),u==f?a:!1),l.style.height=e.lineHeight*this.session.getRowLength(u)+"px",l.innerHTML=c.join("")}u++}},this.scrollLines=function(e){var t=this.config;this.config=e;if(!t||t.lastRow0;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(var r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);r>0;r--)n.removeChild(n.lastChild);if(e.firstRowt.lastRow){var i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(i)}},this.$renderLinesFragment=function(e,t,n){var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=i.createElement("div"),f=[];this.$renderLine(f,s,!1,s==u?o:!1),a.innerHTML=f.join("");if(this.$useLineGroups())a.className="ace_line_group",r.appendChild(a),a.style.height=e.lineHeight*this.session.getRowLength(s)+"px";else while(a.firstChild)r.appendChild(a.firstChild);s++}return r},this.update=function(e){this.config=e;var t=[],n=e.firstRow,r=e.lastRow,i=n,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>r)break;this.$useLineGroups()&&t.push("
"),this.$renderLine(t,i,!1,i==o?s:!1),this.$useLineGroups()&&t.push("
"),i++}this.element.innerHTML=t.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,u=function(e,n,r,o,u){if(n)return i.showInvisibles?""+s.stringRepeat(i.SPACE_CHAR,e.length)+"":e;if(e=="&")return"&";if(e=="<")return"<";if(e==">")return">";if(e==" "){var a=i.session.getScreenTabSize(t+o);return t+=a-1,i.$tabStrings[a]}if(e=="\u3000"){var f=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",l=i.showInvisibles?i.SPACE_CHAR:"";return t+=1,""+l+""}return r?""+i.SPACE_CHAR+"":(t+=1,""+e+"")},a=r.replace(o,u);if(!this.$textToken[n.type]){var f="ace_"+n.type.replace(/\./g," ace_"),l="";n.type=="fold"&&(l=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("",a,"")}else e.push(a);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);return r<=0||r>=n?t:t[0]==" "?(r-=r%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],r/this.tabSize)),t.substr(r)):t[0]==" "?(e.push(s.stringRepeat(this.$tabStrings[" "],r)),t.substr(r)):t},this.$renderWrappedLine=function(e,t,n,r){var i=0,o=0,u=n[0],a=0;for(var f=0;f=u)a=this.$renderToken(e,a,l,c.substring(0,u-i)),c=c.substring(u-i),i=u,r||e.push("","
"),e.push(s.stringRepeat("\u00a0",n.indent)),o++,a=0,u=n[o]||Number.MAX_VALUE;c.length!=0&&(i+=c.length,a=this.$renderToken(e,a,l,c))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;s");if(i.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)}this.showInvisibles&&(r&&(t=r.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),n||e.push("
")},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i,s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),i===undefined&&(i=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(i?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&!i&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible)return;this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+n.column*this.config.characterWidth,i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,r=0;if(t===undefined||t.length===0)t=[{cursor:null}];for(var n=0,i=t.length;ne.height+e.offset||s.top<0)&&n>1)continue;var o=(this.cursors[r++]||this.addCursor()).style;this.drawCursor?this.drawCursor(o,s,e,t[n],this.session):(o.left=s.left+"px",o.top=s.top+"px",o.width=e.characterWidth+"px",o.height=e.lineHeight+"px")}while(this.cursors.length>r)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e}}).call(u.prototype);var a=function(e,t){u.call(this,e),this.scrollTop=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};r.inherits(a,u),function(){this.classSuffix="-v",this.onScroll=function(){this.skipEvent||(this.scrollTop=this.element.scrollTop,this._emit("scroll",{data:this.scrollTop})),this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=function(e){this.inner.style.height=e+"px"},this.setScrollHeight=function(e){this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=this.element.scrollTop=e)}}.call(a.prototype);var f=function(e,t){u.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(f,u),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(f.prototype),t.ScrollBar=a,t.ScrollBarV=a,t.ScrollBarH=f,t.VScrollBar=a,t.HScrollBar=f}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){this.changes=this.changes|e;if(!this.pending&&this.changes){this.pending=!0;var t=this;r.nextFrame(function(){t.pending=!1;var e;while(e=t.changes)t.changes=0,t.onRender(e)},this.window)}}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=0,f=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),a||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat("X",a),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){r.implement(this,u),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=i.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;t>0&&t<1?a=50:a=100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",o.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(a===50){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var n={height:e.height,width:e.width/a}}else var n={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/a};return n.width===0||n.height===0?null:n},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,a);var t=this.$main.getBoundingClientRect();return t.width/a},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(f.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./lib/useragent"),u=e("./layer/gutter").Gutter,a=e("./layer/marker").Marker,f=e("./layer/text").Text,l=e("./layer/cursor").Cursor,c=e("./scrollbar").HScrollBar,h=e("./scrollbar").VScrollBar,p=e("./renderloop").RenderLoop,d=e("./layer/font_metrics").FontMetrics,v=e("./lib/event_emitter").EventEmitter,m='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}';i.importCssString(m,"ace_editor.css");var g=function(e,t){var n=this;this.container=e||i.createElement("div"),this.$keepTextAreaAtCursor=!o.isOldIE,i.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new u(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new a(this.content);var r=this.$textLayer=new f(this.content);this.canvas=r.element,this.$markerFront=new a(this.content),this.$cursorLayer=new l(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new c(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new d(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,v),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var i=0,s=this.$size,o={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};r&&(e||s.height!=r)&&(s.height=r,i|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",i|=this.CHANGE_SCROLL);if(n&&(e||s.width!=n)){i|=this.CHANGE_SIZE,s.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px";if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)i|=this.CHANGE_FULL}return s.$dirty=!n||!r,i&&this._signal("resize",o),i},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor)return;var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;var r=this.textarea.style,i=this.lineHeight;if(t<0||t>e.height-i){r.top=r.left="0";return}var s=this.characterWidth;if(this.$composition){var o=this.textarea.value.replace(/^\x01+/,"");s*=this.session.$getStringScreenWidth(o)[0]+2,i+=2}n-=this.scrollLeft,n>this.$size.scrollerWidth-s&&(n=this.$size.scrollerWidth-s),n+=this.gutterWidth,r.height=i+"px",r.width=s+"px",r.left=Math.min(n,this.$size.scrollerWidth-s)+"px",r.top=Math.min(t,this.$size.height-i)+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+"px",this.content.style.marginTop=-n.offset+"px",this.content.style.width=n.width+2*this.$padding+"px",this.content.style.height=n.minHeight+"px"}e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||r!=this.$vScroll){r!=this.$vScroll&&(this.$vScroll=r,this.scrollBarV.setVisible(r));var i=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,i,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=this.scrollTop%this.lineHeight,l=t.scrollerHeight+this.lineHeight,c=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=c;var h=this.scrollMargin;this.session.setScrollTop(Math.max(-h.top,Math.min(this.scrollTop,i-t.scrollerHeight+h.bottom))),this.session.setScrollLeft(Math.max(-h.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+h.right)));var p=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+c<0||this.scrollTop>h.top),d=a!==p;d&&(this.$vScroll=p,this.scrollBarV.setVisible(p));var v=Math.ceil(l/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-f)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),l=t.scrollerHeight+e.getRowLength(g)*w+b,f=this.scrollTop-y*w;var S=0;this.layerConfig.width!=s&&(S=this.CHANGE_H_SCROLL);if(u||d)S=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),d&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:l,maxHeight:i,offset:f,gutterOffset:Math.max(0,Math.ceil((f+t.height-t.scrollerHeight)/w)),height:this.$size.scrollerHeight},S},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(ts?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=(e+this.scrollLeft-n.left-this.$padding)/this.characterWidth,i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:r-s>0?1:-1}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.round((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=(t+this.scrollTop-n.top)/this.lineHeight;return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+Math.round(r.column*this.characterWidth),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null},this.setTheme=function(e,t){function o(r){if(n.$themeId!=e)return t&&t();if(!r.cssClass)return;i.importCssString(r.cssText,r.cssClass,n.container.ownerDocument),n.theme&&i.removeCssClass(n.container,n.theme.cssClass);var s="padding"in r?r.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=r.cssClass,n.theme=r,i.addCssClass(n.container,r.cssClass),i.setCssClass(n.container,"ace_dark",r.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:r}),t&&t()}var n=this;this.$themeId=e,n._dispatchEvent("themeChange",{theme:e});if(!e||typeof e=="string"){var r=e||this.$options.theme.initialValue;s.loadModule(["theme",r],o)}else o(e)},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){i.setCssClass(this.container,e,t!==!1)},this.unsetStyle=function(e){i.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(g.prototype),s.defineOptions(g.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){typeof e=="number"&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=i.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){(!this.$hScrollBarAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){(!this.$vScrollBarAlwaysVisible||!this.$vScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){typeof e=="number"&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},maxPixelHeight:{set:function(e){this.updateFull()},initialValue:0},scrollPastEnd:{set:function(e){e=+e||0;if(this.$scrollPastEnd==e)return;this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=g}),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,o=e("../config"),u=function(t,n,r,i){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl);if(o.get("packaged")||!e.toUrl)i=i||o.moduleUrl(n,"worker");else{var s=this.$normalizePath;i=i||s(e.toUrl("ace/worker/worker.js",null,"_"));var u={};t.forEach(function(t){u[t]=s(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{this.$worker=new Worker(i)}catch(a){if(!(a instanceof window.DOMException))throw a;var f=this.$workerBlob(i),l=window.URL||window.webkitURL,c=l.createObjectURL(f);this.$worker=new Worker(c),l.revokeObjectURL(c)}this.$worker.postMessage({init:!0,tlns:u,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return i.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var r=this.callbackId++;this.callbacks[r]=n,t.push(r)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){console.error(n.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),e.action=="insert"?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;if(!e)return;this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})},this.$workerBlob=function(e){var t="importScripts('"+i.qualifyURL(e)+"');";try{return new Blob([t],{type:"application/javascript"})}catch(n){var r=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,s=new r;return s.append(t),s.getBlob("application/javascript")}}}).call(u.prototype);var a=function(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,i=!1,u=Object.create(s),a=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){a.messageBuffer.push(e),r&&(i?setTimeout(f):f())},this.setEmitSync=function(e){i=e};var f=function(){var e=a.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};u.postMessage=function(e){a.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.messageBuffer.length)f()})};a.prototype=u.prototype,t.UIWorkerClient=a,t.WorkerClient=u}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)d--;if(d>0){var m=0;while(r[m].isEmpty())m++}for(var g=d;g>=m;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges();var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./editor").Editor,o=e("./edit_session").EditSession,u=e("./undomanager").UndoManager,a=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,t.edit=function(e){if(typeof e=="string"){var n=e;e=document.getElementById(n);if(!e)throw new Error("ace.edit can't find div #"+n)}if(e&&e.env&&e.env.editor instanceof s)return e.env.editor;var o="";if(e&&/input|textarea/i.test(e.tagName)){var u=e;o=u.value,e=r.createElement("pre"),u.parentNode.replaceChild(e,u)}else e&&(o=r.getInnerText(e),e.innerHTML="");var f=t.createEditSession(o),l=new s(new a(e));l.setSession(f);var c={document:f,editor:l,onResize:l.resize.bind(l,null)};return u&&(c.textarea=u),i.addListener(window,"resize",c.onResize),l.on("destroy",function(){i.removeListener(window,"resize",c.onResize),c.editor.container.env=null}),l.container.env=l.env=c,l},t.createEditSession=function(e,t){var n=new o(e,t);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u,t.version="1.2.3"}); + (function() { + ace.require(["ace/ace"], function(a) { + a && a.config.init(true); + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + }); + })(); diff --git a/src/Umbraco.Web.UI.Client/lib/ace/mode-css.js b/src/Umbraco.Web.UI.Client/lib/ace/mode-css.js new file mode 100644 index 0000000000..02e4cc380b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/ace/mode-css.js @@ -0,0 +1 @@ +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),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/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),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(++tf)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(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),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.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}) diff --git a/src/Umbraco.Web.UI.Client/lib/ace/mode-javascript.js b/src/Umbraco.Web.UI.Client/lib/ace/mode-javascript.js new file mode 100644 index 0000000000..20afa82e76 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/ace/mode-javascript.js @@ -0,0 +1 @@ +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/javascript_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";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=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/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),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(++tf)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(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../range").Range,a=e("../worker/worker_client").WorkerClient,f=e("./behaviour/cstyle").CstyleBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}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.createWorker=function(e){var t=new a(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(c.prototype),t.Mode=c}) diff --git a/src/Umbraco.Web.UI.Client/lib/ace/mode-razor.js b/src/Umbraco.Web.UI.Client/lib/ace/mode-razor.js new file mode 100644 index 0000000000..bb23872e84 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/ace/mode-razor.js @@ -0,0 +1 @@ +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/javascript_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";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=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/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),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(++tf)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(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../range").Range,a=e("../worker/worker_client").WorkerClient,f=e("./behaviour/cstyle").CstyleBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}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.createWorker=function(e){var t=new a(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(c.prototype),t.Mode=c}),ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),ace.define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),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.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}),ace.define("ace/mode/xml_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(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.xml-decl.xml","keyword.xml-decl.xml"],regex:"(<\\?)(xml)(?=[\\s])",next:"xml_decl",caseInsensitive:!0},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],processing_instruction:[{token:"punctuation.instruction.xml",regex:"\\?>",next:"start"},{defaultToken:"instruction.xml"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({noJSX:!0})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=f.value.charAt(0);if(l=='"'||l=="'"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,"tag-name"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":""},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"tag-name"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"attribute-name"))i=n.stepBackward();if(i)return i.value}var r=e("../token_iterator").TokenIterator,i=["accesskey","class","contenteditable","contextmenu","dir","draggable","dropzone","hidden","id","inert","itemid","itemprop","itemref","itemscope","itemtype","lang","spellcheck","style","tabindex","title","translate"],s=["onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onscroll","onseeked","onseeking","onselect","onshow","onstalled","onsubmit","onsuspend","ontimeupdate","onvolumechange","onwaiting"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{"text/css":1,"image/png":1,"image/jpeg":1,"image/gif":1},sizes:1},meta:{"http-equiv":{"content-type":1},name:{description:1,keywords:1},content:{"text/html; charset=UTF-8":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{"text/javascript":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},"var":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{"allow-same-origin":1,"allow-top-navigation":1,"allow-forms":1,"allow-scripts":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,"default":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{"accept-charset":1,action:1,autocomplete:1,enctype:{"multipart/form-data":1,"application/x-www-form-urlencoded":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,"for":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,"datetime-local":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{"application/x-www-form-urlencoded":1,"multipart/form-data":1,"text/plain":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},name:1,pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{"for":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,"tag-name")||f(i,"tag-open")||f(i,"end-tag-open"))return this.getTagCompletions(e,t,n,r);if(f(i,"tag-whitespace")||f(i,"attribute-name"))return this.getAttributeCompletions(e,t,n,r);if(f(i,"attribute-value"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:"tag",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'="$0"',meta:"attribute",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]=="object"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:"attribute value",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=["Aacute;","aacute;","Acirc;","acirc;","acute;","AElig;","aelig;","Agrave;","agrave;","alefsym;","Alpha;","alpha;","amp;","and;","ang;","Aring;","aring;","asymp;","Atilde;","atilde;","Auml;","auml;","bdquo;","Beta;","beta;","brvbar;","bull;","cap;","Ccedil;","ccedil;","cedil;","cent;","Chi;","chi;","circ;","clubs;","cong;","copy;","crarr;","cup;","curren;","Dagger;","dagger;","dArr;","darr;","deg;","Delta;","delta;","diams;","divide;","Eacute;","eacute;","Ecirc;","ecirc;","Egrave;","egrave;","empty;","emsp;","ensp;","Epsilon;","epsilon;","equiv;","Eta;","eta;","ETH;","eth;","Euml;","euml;","euro;","exist;","fnof;","forall;","frac12;","frac14;","frac34;","frasl;","Gamma;","gamma;","ge;","gt;","hArr;","harr;","hearts;","hellip;","Iacute;","iacute;","Icirc;","icirc;","iexcl;","Igrave;","igrave;","image;","infin;","int;","Iota;","iota;","iquest;","isin;","Iuml;","iuml;","Kappa;","kappa;","Lambda;","lambda;","lang;","laquo;","lArr;","larr;","lceil;","ldquo;","le;","lfloor;","lowast;","loz;","lrm;","lsaquo;","lsquo;","lt;","macr;","mdash;","micro;","middot;","minus;","Mu;","mu;","nabla;","nbsp;","ndash;","ne;","ni;","not;","notin;","nsub;","Ntilde;","ntilde;","Nu;","nu;","Oacute;","oacute;","Ocirc;","ocirc;","OElig;","oelig;","Ograve;","ograve;","oline;","Omega;","omega;","Omicron;","omicron;","oplus;","or;","ordf;","ordm;","Oslash;","oslash;","Otilde;","otilde;","otimes;","Ouml;","ouml;","para;","part;","permil;","perp;","Phi;","phi;","Pi;","pi;","piv;","plusmn;","pound;","Prime;","prime;","prod;","prop;","Psi;","psi;","quot;","radic;","rang;","raquo;","rArr;","rarr;","rceil;","rdquo;","real;","reg;","rfloor;","Rho;","rho;","rlm;","rsaquo;","rsquo;","sbquo;","Scaron;","scaron;","sdot;","sect;","shy;","Sigma;","sigma;","sigmaf;","sim;","spades;","sub;","sube;","sum;","sup;","sup1;","sup2;","sup3;","supe;","szlig;","Tau;","tau;","there4;","Theta;","theta;","thetasym;","thinsp;","THORN;","thorn;","tilde;","times;","trade;","Uacute;","uacute;","uArr;","uarr;","Ucirc;","ucirc;","Ugrave;","ugrave;","uml;","upsih;","Upsilon;","upsilon;","Uuml;","uuml;","weierp;","Xi;","xi;","Yacute;","yacute;","yen;","Yuml;","yuml;","Zeta;","zeta;","zwj;","zwnj;"];return i.map(function(e){return{caption:e,snippet:e,meta:"html entity",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text").Mode,o=e("./javascript").Mode,u=e("./css").Mode,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./behaviour/xml").XmlBehaviour,l=e("./folding/html").FoldMode,c=e("./html_completions").HtmlCompletions,h=e("../worker/worker_client").WorkerClient,p=["area","base","br","col","embed","hr","img","input","keygen","link","meta","menuitem","param","source","track","wbr"],d=["li","dt","dd","p","rt","rp","optgroup","option","colgroup","td","th"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({"js-":o,"css-":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:""},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h(["ace"],"ace/mode/html_worker","Worker");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call("setOptions",[{context:this.fragmentContext}]),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/html"}.call(v.prototype),t.Mode=v}),ace.define("ace/mode/csharp_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=this.createKeywordMapper({"variable.language":"this",keyword:"abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic","constant.language":"null|true|false"},"identifier");this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},i.getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",next:"comment"},{token:"string",regex:/'(?:.|\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n]))'/},{token:"string",start:'"',end:'"|$',next:[{token:"constant.language.escape",regex:/\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/},{token:"invalid",regex:/\\./}]},{token:"string",start:'@"',end:'"',next:[{token:"constant.language.escape",regex:'""'}]},{token:"string",start:/\$"/,end:'"|$',next:[{token:"constant.language.escape",regex:/\\(:?$)|{{/},{token:"constant.language.escape",regex:/\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/},{token:"invalid",regex:/\\./}]},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:e,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"keyword",regex:"^\\s*#(if|else|elif|endif|define|undef|warning|error|line|region|endregion|pragma)"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",regex:".+"}]},this.embedRules(i,"doc-",[i.getEndRule("start")]),this.normalizeRules()};r.inherits(o,s),t.CSharpHighlightRules=o}),ace.define("ace/mode/razor_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/html_highlight_rules","ace/mode/csharp_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./doc_comment_highlight_rules").DocCommentHighlightRules,o=e("./html_highlight_rules").HtmlHighlightRules,u=e("./csharp_highlight_rules").CSharpHighlightRules,a="razor-block-",f=function(){u.call(this);var e=function(e,t){return typeof t=="function"?t(e):t},t="in-braces";this.$rules.start.unshift({regex:"[\\[({]",onMatch:function(e,n,r){var i=/razor-[^\-]+-/.exec(n)[0];return r.unshift(e),r.unshift(i+t),this.next=i+t,"paren.lparen"}});var n={"{":"}","[":"]","(":")"};this.$rules[t]=i.deepCopy(this.$rules.start),this.$rules[t].unshift({regex:"[\\])}]",onMatch:function(t,r,i){var s=i[1];return n[s]!==t?"invalid.illegal":(i.shift(),i.shift(),this.next=e(t,i[0])||"start","paren.rparen")}})};r.inherits(f,u);var l=function(){o.call(this);var e={regex:"@[({]|@functions{",onMatch:function(e,t,n){return n.unshift(e),n.unshift("razor-block-start"),this.next="razor-block-start","punctuation.block.razor"}},t={"@{":"}","@(":")","@functions{":"}"},n={regex:"[})]",onMatch:function(e,n,r){var i=r[1];return t[i]!==e?"invalid.illegal":(r.shift(),r.shift(),this.next=r.shift()||"start","punctuation.block.razor")}},r={regex:"@(?![{(])",onMatch:function(e,t,n){return n.unshift("razor-short-start"),this.next="razor-short-start","punctuation.short.razor"}},i={token:"",regex:"(?=[^A-Za-z_\\.()\\[\\]])",next:"pop"},s={regex:"@(?=if)",onMatch:function(e,t,n){return n.unshift(function(e){return e!=="}"?"start":n.shift()||"start"}),this.next="razor-block-start","punctuation.control.razor"}},u=[{token:["meta.directive.razor","text","identifier"],regex:"^(\\s*@model)(\\s+)(.+)$"},e,r];for(var a in this.$rules)this.$rules[a].unshift.apply(this.$rules[a],u);this.embedRules(f,"razor-block-",[n],["start"]),this.embedRules(f,"razor-short-",[i],["start"]),this.normalizeRules()};r.inherits(l,o),t.RazorHighlightRules=l,t.RazorLangHighlightRules=f}),ace.define("ace/mode/razor_completions",["require","exports","module","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../token_iterator").TokenIterator,i=["abstract","as","base","bool","break","byte","case","catch","char","checked","class","const","continue","decimal","default","delegate","do","double","else","enum","event","explicit","extern","false","finally","fixed","float","for","foreach","goto","if","implicit","in","int","interface","internal","is","lock","long","namespace","new","null","object","operator","out","override","params","private","protected","public","readonly","ref","return","sbyte","sealed","short","sizeof","stackalloc","static","string","struct","switch","this","throw","true","try","typeof","uint","ulong","unchecked","unsafe","ushort","using","var","virtual","void","volatile","while"],s=["Html","Model","Url","Layout"],o=function(){};(function(){this.getCompletions=function(e,t,n,r){if(e.lastIndexOf("razor-short-start")==-1&&e.lastIndexOf("razor-block-start")==-1)return[];var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e.lastIndexOf("razor-short-start")!=-1)return this.getShortStartCompletions(e,t,n,r);if(e.lastIndexOf("razor-block-start")!=-1)return this.getKeywordCompletions(e,t,n,r)},this.getShortStartCompletions=function(e,t,n,r){return s.map(function(e){return{value:e,meta:"keyword",score:Number.MAX_VALUE}})},this.getKeywordCompletions=function(e,t,n,r){return s.concat(i).map(function(e){return{value:e,meta:"keyword",score:Number.MAX_VALUE}})}}).call(o.prototype),t.RazorCompletions=o}),ace.define("ace/mode/razor",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/razor_highlight_rules","ace/mode/razor_completions","ace/mode/html_completions"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./html").Mode,s=e("./razor_highlight_rules").RazorHighlightRules,o=e("./razor_completions").RazorCompletions,u=e("./html_completions").HtmlCompletions,a=function(){i.call(this),this.$highlightRules=new s,this.$completer=new o,this.$htmlCompleter=new u};r.inherits(a,i),function(){this.getCompletions=function(e,t,n,r){var i=this.$completer.getCompletions(e,t,n,r),s=this.$htmlCompleter.getCompletions(e,t,n,r);return i.concat(s)},this.createWorker=function(e){return null},this.$id="ace/mode/razor"}.call(a.prototype),t.Mode=a}) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js new file mode 100644 index 0000000000..331354491a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js @@ -0,0 +1,341 @@ +(function() { + 'use strict'; + + function AceEditorDirective(umbAceEditorConfig) { + + if (angular.isUndefined(window.ace)) { + throw new Error('ui-ace need ace to work... (o rly?)'); + } + + /** + * Sets editor options such as the wrapping mode or the syntax checker. + * + * The supported options are: + * + *
    + *
  • showGutter
  • + *
  • useWrapMode
  • + *
  • onLoad
  • + *
  • theme
  • + *
  • mode
  • + *
+ * + * @param acee + * @param session ACE editor session + * @param {object} opts Options to be set + */ + var setOptions = function(acee, session, opts) { + + // sets the ace worker path, if running from concatenated + // or minified source + if (angular.isDefined(opts.workerPath)) { + var config = window.ace.require('ace/config'); + config.set('workerPath', opts.workerPath); + } + // ace requires loading + if (angular.isDefined(opts.require)) { + opts.require.forEach(function(n) { + window.ace.require(n); + }); + } + // Boolean options + if (angular.isDefined(opts.showGutter)) { + acee.renderer.setShowGutter(opts.showGutter); + } + if (angular.isDefined(opts.useWrapMode)) { + session.setUseWrapMode(opts.useWrapMode); + } + if (angular.isDefined(opts.showInvisibles)) { + acee.renderer.setShowInvisibles(opts.showInvisibles); + } + if (angular.isDefined(opts.showIndentGuides)) { + acee.renderer.setDisplayIndentGuides(opts.showIndentGuides); + } + if (angular.isDefined(opts.useSoftTabs)) { + session.setUseSoftTabs(opts.useSoftTabs); + } + if (angular.isDefined(opts.showPrintMargin)) { + acee.setShowPrintMargin(opts.showPrintMargin); + } + + // commands + if (angular.isDefined(opts.disableSearch) && opts.disableSearch) { + acee.commands.addCommands([{ + name: 'unfind', + bindKey: { + win: 'Ctrl-F', + mac: 'Command-F' + }, + exec: function() { + return false; + }, + readOnly: true + }]); + } + + // Basic options + if (angular.isString(opts.theme)) { + acee.setTheme('ace/theme/' + opts.theme); + } + if (angular.isString(opts.mode)) { + session.setMode('ace/mode/' + opts.mode); + } + // Advanced options + if (angular.isDefined(opts.firstLineNumber)) { + if (angular.isNumber(opts.firstLineNumber)) { + session.setOption('firstLineNumber', opts.firstLineNumber); + } else if (angular.isFunction(opts.firstLineNumber)) { + session.setOption('firstLineNumber', opts.firstLineNumber()); + } + } + + // advanced options + var key, obj; + if (angular.isDefined(opts.advanced)) { + for (key in opts.advanced) { + // create a javascript object with the key and value + obj = { + name: key, + value: opts.advanced[key] + }; + // try to assign the option to the ace editor + acee.setOption(obj.name, obj.value); + } + } + + // advanced options for the renderer + if (angular.isDefined(opts.rendererOptions)) { + for (key in opts.rendererOptions) { + // create a javascript object with the key and value + obj = { + name: key, + value: opts.rendererOptions[key] + }; + // try to assign the option to the ace editor + acee.renderer.setOption(obj.name, obj.value); + } + } + + // onLoad callbacks + angular.forEach(opts.callbacks, function(cb) { + if (angular.isFunction(cb)) { + cb(acee); + } + }); + }; + + function link(scope, el, attr, ngModel) { + + /** + * Corresponds the umbAceEditorConfig ACE configuration. + * @type object + */ + var options = umbAceEditorConfig.ace || {}; + + /** + * umbAceEditorConfig merged with user options via json in attribute or data binding + * @type object + */ + var opts = angular.extend({}, options, scope.$eval(attr.umbAceEditor)); + + /** + * ACE editor + * @type object + */ + var acee = window.ace.edit(el[0]); + + /** + * ACE editor session. + * @type object + * @see [EditSession]{@link http://ace.c9.io/#nav=api&api=edit_session} + */ + var session = acee.getSession(); + + /** + * Reference to a change listener created by the listener factory. + * @function + * @see listenerFactory.onChange + */ + var onChangeListener; + + /** + * Reference to a blur listener created by the listener factory. + * @function + * @see listenerFactory.onBlur + */ + var onBlurListener; + + /** + * Calls a callback by checking its existing. The argument list + * is variable and thus this function is relying on the arguments + * object. + * @throws {Error} If the callback isn't a function + */ + var executeUserCallback = function() { + + /** + * The callback function grabbed from the array-like arguments + * object. The first argument should always be the callback. + * + * @see [arguments]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments} + * @type {*} + */ + var callback = arguments[0]; + + /** + * Arguments to be passed to the callback. These are taken + * from the array-like arguments object. The first argument + * is stripped because that should be the callback function. + * + * @see [arguments]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments} + * @type {Array} + */ + var args = Array.prototype.slice.call(arguments, 1); + + if (angular.isDefined(callback)) { + scope.$evalAsync(function() { + if (angular.isFunction(callback)) { + callback(args); + } else { + throw new Error('ui-ace use a function as callback.'); + } + }); + } + }; + + + + /** + * Listener factory. Until now only change listeners can be created. + * @type object + */ + var listenerFactory = { + /** + * Creates a change listener which propagates the change event + * and the editor session to the callback from the user option + * onChange. It might be exchanged during runtime, if this + * happens the old listener will be unbound. + * + * @param callback callback function defined in the user options + * @see onChangeListener + */ + onChange: function(callback) { + return function(e) { + var newValue = session.getValue(); + + if (ngModel && newValue !== ngModel.$viewValue && + // HACK make sure to only trigger the apply outside of the + // digest loop 'cause ACE is actually using this callback + // for any text transformation ! + !scope.$$phase && !scope.$root.$$phase) { + scope.$evalAsync(function() { + ngModel.$setViewValue(newValue); + }); + } + + executeUserCallback(callback, e, acee); + }; + }, + /** + * Creates a blur listener which propagates the editor session + * to the callback from the user option onBlur. It might be + * exchanged during runtime, if this happens the old listener + * will be unbound. + * + * @param callback callback function defined in the user options + * @see onBlurListener + */ + onBlur: function(callback) { + return function() { + executeUserCallback(callback, acee); + }; + } + }; + + attr.$observe('readonly', function(value) { + acee.setReadOnly(!!value || value === ''); + }); + + // Value Blind + if (ngModel) { + ngModel.$formatters.push(function(value) { + if (angular.isUndefined(value) || value === null) { + return ''; + } else if (angular.isObject(value) || angular.isArray(value)) { + throw new Error('ui-ace cannot use an object or an array as a model'); + } + return value; + }); + + ngModel.$render = function() { + session.setValue(ngModel.$viewValue); + }; + } + + // Listen for option updates + var updateOptions = function(current, previous) { + if (current === previous) { + return; + } + opts = angular.extend({}, options, scope.$eval(attr.umbAceEditor)); + + opts.callbacks = [opts.onLoad]; + if (opts.onLoad !== options.onLoad) { + // also call the global onLoad handler + opts.callbacks.unshift(options.onLoad); + } + + // EVENTS + + // unbind old change listener + session.removeListener('change', onChangeListener); + + // bind new change listener + onChangeListener = listenerFactory.onChange(opts.onChange); + session.on('change', onChangeListener); + + // unbind old blur listener + //session.removeListener('blur', onBlurListener); + acee.removeListener('blur', onBlurListener); + + // bind new blur listener + onBlurListener = listenerFactory.onBlur(opts.onBlur); + acee.on('blur', onBlurListener); + + setOptions(acee, session, opts); + }; + + scope.$watch(attr.umbAceEditor, updateOptions, /* deep watch */ true); + + // set the options here, even if we try to watch later, if this + // line is missing things go wrong (and the tests will also fail) + updateOptions(options); + + el.on('$destroy', function() { + acee.session.$stopWorker(); + acee.destroy(); + }); + + scope.$watch(function() { + return [el[0].offsetWidth, el[0].offsetHeight]; + }, function() { + acee.resize(); + acee.renderer.updateFull(); + }, true); + + } + + var directive = { + restrict: 'EA', + require: '?ngModel', + link: link + }; + + return directive; + } + + angular.module('umbraco.directives') + .constant('umbAceEditorConfig', {}) + .directive('umbAceEditor', AceEditorDirective); + +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js new file mode 100644 index 0000000000..b44ce8f20c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -0,0 +1,92 @@ +(function () { + "use strict"; + + function TemplatesEditController($scope) { + + var vm = this; + + vm.page = {}; + vm.page.loading = false; + + vm.mode = "css"; + + vm.aceOption = { + mode: vm.mode.toLowerCase(), + onLoad: function(ace) { + + console.log(ace); + + // HACK to have the ace instance in the scope... + /* + $scope.modeChanged = function() { + _ace.getSession().setMode("ace/mode/" + $scope.mode.toLowerCase()); + }; + */ + + } + }; + + vm.aceModel = ';; Scheme code in here.\n' + + '(define (double x)\n\t(* x x))\n\n\n' + + '\n' + + '\n\t\n\t\n\t\n\n\n\n' + + '// Javascript code in here.\n' + + 'function foo(msg) {\n\tvar r = Math.random();\n\treturn "" + r + " : " + msg;\n}'; + + vm.openPageFieldOverlay = openPageFieldOverlay; + vm.openDictionaryItemOverlay = openDictionaryItemOverlay; + vm.openQueryBuilderOverlay = openQueryBuilderOverlay; + + function init() { + + + } + + function openPageFieldOverlay() { + vm.pageFieldOverlay = { + view: "mediapicker", + show: true, + submit: function(model) { + + }, + close: function(model) { + vm.pageFieldOverlay.show = false; + vm.pageFieldOverlay = null; + } + }; + } + + function openDictionaryItemOverlay() { + vm.dictionaryItemOverlay = { + view: "mediapicker", + show: true, + submit: function(model) { + + }, + close: function(model) { + vm.dictionaryItemOverlay.show = false; + vm.dictionaryItemOverlay = null; + } + }; + } + + function openQueryBuilderOverlay() { + vm.queryBuilderOverlay = { + view: "mediapicker", + show: true, + submit: function(model) { + + }, + close: function(model) { + vm.queryBuilderOverlay.show = false; + vm.queryBuilderOverlay = null; + } + }; + } + + init(); + + } + + angular.module("umbraco").controller("Umbraco.Editors.Templates.EditController", TemplatesEditController); +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html new file mode 100644 index 0000000000..c6244a8035 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -0,0 +1,94 @@ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
diff --git a/src/Umbraco.Web/UI/JavaScript/JsInitialize.js b/src/Umbraco.Web/UI/JavaScript/JsInitialize.js index 0314c65fae..afd12f27a9 100644 --- a/src/Umbraco.Web/UI/JavaScript/JsInitialize.js +++ b/src/Umbraco.Web/UI/JavaScript/JsInitialize.js @@ -16,6 +16,11 @@ 'lib/ng-file-upload/ng-file-upload.min.js', 'lib/angular-local-storage/angular-local-storage.min.js', + 'lib/ace/ace-src-min-noconflict.js', + 'lib/ace/mode-javascript.js', + 'lib/ace/mode-razor.js', + 'lib/ace/mode-css.js', + 'lib/bootstrap/js/bootstrap.2.3.2.min.js', 'lib/bootstrap-tabdrop/bootstrap-tabdrop.js', 'lib/umbraco/Extensions.js', From e7754d313e6baae2bbfdcd7bbddc84478777769e Mon Sep 17 00:00:00 2001 From: Jeavon Leopold Date: Sun, 12 Jun 2016 16:36:26 +0200 Subject: [PATCH 012/841] Initially adding the Core Value Converters package into Core! Currently this will break all the existing things but it makes views insanely simple with ModelsBuilder!! --- src/Umbraco.Core/EnumerableExtensions.cs | 16 ++ src/Umbraco.Web/Models/RelatedLink.cs | 184 +++++++++++++++ src/Umbraco.Web/Models/RelatedLinkType.cs | 27 +++ src/Umbraco.Web/Models/RelatedLinks.cs | 110 +++++++++ .../ContentPickerPropertyConverter.cs | 177 +++++++++++++++ .../MediaPickerPropertyConverter.cs | 145 ++++++++++++ .../MultiNodeTreePickerPropertyConverter.cs | 194 ++++++++++++++++ .../MultipleMediaPickerPropertyConverter.cs | 212 ++++++++++++++++++ .../RelatedLinksEditorValueConvertor.cs | 133 ++++------- src/Umbraco.Web/Umbraco.Web.csproj | 7 + 10 files changed, 1118 insertions(+), 87 deletions(-) create mode 100644 src/Umbraco.Web/Models/RelatedLink.cs create mode 100644 src/Umbraco.Web/Models/RelatedLinkType.cs create mode 100644 src/Umbraco.Web/Models/RelatedLinks.cs create mode 100644 src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs create mode 100644 src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs create mode 100644 src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs create mode 100644 src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs diff --git a/src/Umbraco.Core/EnumerableExtensions.cs b/src/Umbraco.Core/EnumerableExtensions.cs index 58d4d453b7..83eb080049 100644 --- a/src/Umbraco.Core/EnumerableExtensions.cs +++ b/src/Umbraco.Core/EnumerableExtensions.cs @@ -301,5 +301,21 @@ namespace Umbraco.Core && list1Groups.All(g => g.Count() == list2Groups[g.Key].Count()); } + /// + /// Returns the items of the given enumerable as a pure enumerable. + /// + /// When quering lists using methods such as , the result, despite appearing to look like and quack like an + /// the type is actually an instance of + /// + /// + ///The item to find. + ///The index of the first matching item, or -1 if the item was not found. + internal static IEnumerable Yield(this IEnumerable source) + { + foreach (var element in source) + { + yield return element; + } + } } } diff --git a/src/Umbraco.Web/Models/RelatedLink.cs b/src/Umbraco.Web/Models/RelatedLink.cs new file mode 100644 index 0000000000..145ca6ea7d --- /dev/null +++ b/src/Umbraco.Web/Models/RelatedLink.cs @@ -0,0 +1,184 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Umbraco +// +// +// Defines the RelatedLink type. +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using Newtonsoft.Json.Linq; + +namespace Umbraco.Web.Models +{ + /// + /// The related link model + /// + public class RelatedLink + { + // ReSharper disable InconsistentNaming + + /// + /// The _link item. + /// + private readonly JToken _linkItem; + + /// + /// The _caption. + /// + private string _caption; + + /// + /// The _new window. + /// + private bool? _newWindow; + + /// + /// The _is internal. + /// + private bool? _isInternal; + + /// + /// The _link. + /// + private string _link; + + /// + /// The _linkDeleted. + /// + private bool? _linkDeleted; + + /// + /// The _type. + /// + private RelatedLinkType _type; + + /// + /// Initializes a new instance of the class. + /// + /// + /// The link item. + /// + public RelatedLink(JToken linkItem) + { + this._linkItem = linkItem; + + // get the current Link to set the _linkDeleted is a internal link + var currentLink = this.Link; + } + + /// + /// Gets the caption. + /// + public string Caption + { + get + { + if (string.IsNullOrEmpty(this._caption)) + { + this._caption = this._linkItem.Value("caption"); + } + + return this._caption; + } + } + + /// + /// Gets a value indicating whether new window. + /// + public bool NewWindow + { + get + { + if (this._newWindow == null) + { + this._newWindow = this._linkItem.Value("newWindow"); + } + + return this._newWindow.GetValueOrDefault(); + } + } + + /// + /// Gets a value indicating whether the link is internal. + /// + public bool IsInternal + { + get + { + if (this._isInternal == null) + { + this._isInternal = this._linkItem.Value("isInternal"); + } + + return this._isInternal.GetValueOrDefault(); + } + } + + /// + /// Gets the type. + /// + public RelatedLinkType? Type + { + get + { + if (Enum.TryParse(this._linkItem.Value("type"), true, out this._type)) + { + return this._type; + } + + return null; + } + } + + /// + /// Gets the link. + /// + public string Link + { + get + { + if (string.IsNullOrEmpty(this._link)) + { + if (this.IsInternal) + { + if (UmbracoContext.Current == null) + { + return null; + } + + this._link = UmbracoContext.Current.UrlProvider.GetUrl(this._linkItem.Value("internal")); + if (this._link.Equals("#")) + { + this._linkDeleted = true; + this._link = this._linkItem.Value("internal"); + } + else + { + this._linkDeleted = false; + } + } + else + { + this._link = this._linkItem.Value("link"); + } + } + + return this._link; + } + } + + /// + /// Gets a value indicating whether deleted. + /// + internal bool InternalLinkDeleted + { + get + { + var linkDeleted = this._linkDeleted; + return linkDeleted != null && (bool)linkDeleted; + } + } + } +} diff --git a/src/Umbraco.Web/Models/RelatedLinkType.cs b/src/Umbraco.Web/Models/RelatedLinkType.cs new file mode 100644 index 0000000000..8de88d5520 --- /dev/null +++ b/src/Umbraco.Web/Models/RelatedLinkType.cs @@ -0,0 +1,27 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Umbraco +// +// +// Defines the RelatedLinkType type. +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace Umbraco.Web.Models +{ + /// + /// The related link type. + /// + public enum RelatedLinkType + { + /// + /// Internal link type + /// + Internal, + + /// + /// External link type + /// + External + } +} diff --git a/src/Umbraco.Web/Models/RelatedLinks.cs b/src/Umbraco.Web/Models/RelatedLinks.cs new file mode 100644 index 0000000000..60d2ef03b5 --- /dev/null +++ b/src/Umbraco.Web/Models/RelatedLinks.cs @@ -0,0 +1,110 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Umbraco +// +// +// Defines the RelatedLinks type. +// +// -------------------------------------------------------------------------------------------------------------------- + +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Umbraco.Core.Logging; + +namespace Umbraco.Web.Models +{ + /// + /// The related links model + /// + public class RelatedLinks : IEnumerable + { + // ReSharper disable InconsistentNaming + + /// + /// The _property data. + /// + private readonly string _propertyData; + + /// + /// The _related links. + /// + private readonly List _relatedLinks = new List(); + + /// + /// Initializes a new instance of the class. + /// + /// + /// The property data. + /// + public RelatedLinks(string propertyData) + { + this._propertyData = propertyData; + + if (!string.IsNullOrEmpty(propertyData)) + { + var relatedLinks = JsonConvert.DeserializeObject(propertyData); + + foreach (var item in relatedLinks) + { + var relatedLink = new RelatedLink(item); + if (!relatedLink.InternalLinkDeleted) + { + this._relatedLinks.Add(relatedLink); + } + else + { + LogHelper.Warn( + string.Format("Related Links value converter skipped a link as the node has been unpublished/deleted (Internal Link NodeId: {0}, Link Caption: \"{1}\")", relatedLink.Link, relatedLink.Caption)); + } + } + } + } + + /// + /// Gets the property data. + /// + public string PropertyData + { + get + { + return this._propertyData; + } + } + + /// + /// The any. + /// + /// + /// The . + /// + public bool Any() + { + return Enumerable.Any(this); + } + + /// + /// The get enumerator. + /// + /// + /// The . + /// + public IEnumerator GetEnumerator() + { + return this._relatedLinks.GetEnumerator(); + } + + /// + /// The get enumerator. + /// + /// + /// The . + /// + IEnumerator IEnumerable.GetEnumerator() + { + return this.GetEnumerator(); + } + } +} diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs new file mode 100644 index 0000000000..643e936c06 --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs @@ -0,0 +1,177 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Umbraco +// +// +// The content picker property editor converter. +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Globalization; + +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.PropertyEditors; + +namespace Umbraco.Web.PropertyEditors.ValueConverters +{ + /// + /// The content picker property value converter. + /// + public class ContentPickerPropertyConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + /// + /// The properties to exclude. + /// + private static readonly List PropertiesToExclude = new List() + { + Constants.Conventions.Content.InternalRedirectId.ToLower(CultureInfo.InvariantCulture), + Constants.Conventions.Content.Redirect.ToLower(CultureInfo.InvariantCulture) + }; + + /// + /// Checks if this converter can convert the property editor and registers if it can. + /// + /// + /// The published property type. + /// + /// + /// The . + /// + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.ContentPickerAlias); + } + + /// + /// Convert the raw string into a nodeId integer + /// + /// + /// The published property type. + /// + /// + /// The value of the property + /// + /// + /// The preview. + /// + /// + /// The . + /// + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + var attemptConvertInt = source.TryConvertTo(); + if (attemptConvertInt.Success) + { + return attemptConvertInt.Result; + } + + return null; + } + + /// + /// Convert the source nodeId into a IPublishedContent (or DynamicPublishedContent) + /// + /// + /// The published property type. + /// + /// + /// The value of the property + /// + /// + /// The preview. + /// + /// + /// The . + /// + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + if (source == null) + { + return null; + } + + if (UmbracoContext.Current != null) + { + if ((propertyType.PropertyTypeAlias != null && PropertiesToExclude.Contains(propertyType.PropertyTypeAlias.ToLower(CultureInfo.InvariantCulture))) == false) + { + var content = UmbracoContext.Current.ContentCache.GetById((int)source); + return content; + } + } + + return source; + } + + /// + /// The convert source to xPath. + /// + /// + /// The property type. + /// + /// + /// The source. + /// + /// + /// The preview. + /// + /// + /// The . + /// + public override object ConvertSourceToXPath(PublishedPropertyType propertyType, object source, bool preview) + { + return source.ToString(); + } + + /// + /// The CLR type that the value converter returns. + /// + /// + /// The property type. + /// + /// + /// The . + /// + public virtual Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(IPublishedContent); + } + + /// + /// The get property cache level. + /// + /// + /// The property type. + /// + /// + /// The cache value. + /// + /// + /// The . + /// + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) + { + PropertyCacheLevel returnLevel; + switch (cacheValue) + { + case PropertyCacheValue.Object: + returnLevel = PropertyCacheLevel.ContentCache; + break; + case PropertyCacheValue.Source: + returnLevel = PropertyCacheLevel.Content; + break; + case PropertyCacheValue.XPath: + returnLevel = PropertyCacheLevel.Content; + break; + default: + returnLevel = PropertyCacheLevel.None; + break; + } + + return returnLevel; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs new file mode 100644 index 0000000000..3bdba5d07b --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerPropertyConverter.cs @@ -0,0 +1,145 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Umbraco +// +// +// The legacy media picker value converter +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; + +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.PropertyEditors; + +namespace Umbraco.Web.PropertyEditors.ValueConverters +{ + /// + /// The media picker property value converter. + /// + public class MediaPickerPropertyConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + /// + /// Checks if this converter can convert the property editor and registers if it can. + /// + /// + /// The published property type. + /// + /// + /// The . + /// + public override bool IsConverter(PublishedPropertyType propertyType) + { + // ** Value converter disabled as not sure if we want to convert the legacy media picker or not ** + return false; + + //return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.MediaPickerAlias); + } + + /// + /// Convert the raw string into a nodeId integer + /// + /// + /// The published property type. + /// + /// + /// The value of the property + /// + /// + /// The preview. + /// + /// + /// The . + /// + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + var attemptConvertInt = source.TryConvertTo(); + if (attemptConvertInt.Success) + { + return attemptConvertInt.Result; + } + + return null; + } + + /// + /// Convert the source nodeId into a IPublishedContent (or DynamicPublishedContent) + /// + /// + /// The published property type. + /// + /// + /// The value of the property + /// + /// + /// The preview. + /// + /// + /// The . + /// + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + if (source == null) + { + return null; + } + + if (UmbracoContext.Current != null) + { + return UmbracoContext.Current.MediaCache.GetById((int)source); + } + + return null; + } + + /// + /// The get property cache level. + /// + /// + /// The property type. + /// + /// + /// The cache value. + /// + /// + /// The . + /// + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) + { + PropertyCacheLevel returnLevel; + switch (cacheValue) + { + case PropertyCacheValue.Object: + returnLevel = PropertyCacheLevel.ContentCache; + break; + case PropertyCacheValue.Source: + returnLevel = PropertyCacheLevel.Content; + break; + case PropertyCacheValue.XPath: + returnLevel = PropertyCacheLevel.Content; + break; + default: + returnLevel = PropertyCacheLevel.None; + break; + } + + return returnLevel; + } + + /// + /// The CLR type that the value converter returns. + /// + /// + /// The property type. + /// + /// + /// The . + /// + public virtual Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(IPublishedContent); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs new file mode 100644 index 0000000000..af72de0cb2 --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs @@ -0,0 +1,194 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Umbraco +// +// +// The multi node tree picker property editor value converter. +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.PropertyEditors; + +namespace Umbraco.Web.PropertyEditors.ValueConverters +{ + + /// + /// The multi node tree picker property editor value converter. + /// + public class MultiNodeTreePickerPropertyConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + /// + /// Checks if this converter can convert the property editor and registers if it can. + /// + /// + /// The published property type. + /// + /// + /// The . + /// + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.MultiNodeTreePickerAlias); + } + + /// + /// Convert the raw string into a nodeId integer array + /// + /// + /// The published property type. + /// + /// + /// The value of the property + /// + /// + /// The preview. + /// + /// + /// The . + /// + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + var nodeIds = + source.ToString() + .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries) + .Select(int.Parse) + .ToArray(); + + return nodeIds; + } + + /// + /// Convert the source nodeId into a IEnumerable of IPublishedContent (or DynamicPublishedContent) + /// + /// + /// The published property type. + /// + /// + /// The value of the property + /// + /// + /// The preview. + /// + /// + /// The . + /// + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + if (source == null) + { + return null; + } + + var nodeIds = (int[])source; + + var multiNodeTreePicker = new List(); + + if (UmbracoContext.Current != null) + { + var umbHelper = new UmbracoHelper(UmbracoContext.Current); + + if (nodeIds.Length > 0) + { + var objectType = UmbracoObjectTypes.Unknown; + + foreach (var nodeId in nodeIds) + { + var multiNodeTreePickerItem = GetPublishedContent(nodeId, ref objectType, UmbracoObjectTypes.Document, umbHelper.TypedContent) + ?? GetPublishedContent(nodeId, ref objectType, UmbracoObjectTypes.Media, umbHelper.TypedMedia) + ?? GetPublishedContent(nodeId, ref objectType, UmbracoObjectTypes.Member, umbHelper.TypedMember); + + if (multiNodeTreePickerItem != null) + { + multiNodeTreePicker.Add(multiNodeTreePickerItem); + } + } + } + + return multiNodeTreePicker.Yield().Where(x => x != null); + } + + return null; + } + + /// + /// The get property cache level. + /// + /// + /// The property type. + /// + /// + /// The cache value. + /// + /// + /// The . + /// + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) + { + PropertyCacheLevel returnLevel; + switch (cacheValue) + { + case PropertyCacheValue.Object: + returnLevel = PropertyCacheLevel.ContentCache; + break; + case PropertyCacheValue.Source: + returnLevel = PropertyCacheLevel.Content; + break; + case PropertyCacheValue.XPath: + returnLevel = PropertyCacheLevel.Content; + break; + default: + returnLevel = PropertyCacheLevel.None; + break; + } + + return returnLevel; + } + + /// + /// The CLR type that the value converter returns. + /// + /// + /// The property type. + /// + /// + /// The . + /// + public virtual Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(IEnumerable); + } + + /// + /// Attempt to get an IPublishedContent instance based on ID and content type + /// + /// The content node ID + /// The type of content being requested + /// The type of content expected/supported by + /// A function to fetch content of type + /// The requested content, or null if either it does not exist or does not match + private IPublishedContent GetPublishedContent(int nodeId, ref UmbracoObjectTypes actualType, UmbracoObjectTypes expectedType, Func contentFetcher) + { + // is the actual type supported by the content fetcher? + if (actualType != UmbracoObjectTypes.Unknown && actualType != expectedType) + { + // no, return null + return null; + } + + // attempt to get the content + var content = contentFetcher(nodeId); + if (content != null) + { + // if we found the content, assign the expected type to the actual type so we don't have to keep looking for other types of content + actualType = expectedType; + } + return content; + } + } +} diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs new file mode 100644 index 0000000000..a31e6e2ef4 --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs @@ -0,0 +1,212 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Umbraco +// +// +// The multiple media picker property editor converter. +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Linq; + +using Umbraco.Core; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.PropertyEditors; + +namespace Umbraco.Web.PropertyEditors.ValueConverters +{ + /// + /// The multiple media picker property value converter. + /// + public class MultipleMediaPickerPropertyConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + /// + /// Checks if this converter can convert the property editor and registers if it can. + /// + /// + /// The property type. + /// + /// + /// The . + /// + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.MultipleMediaPickerAlias); + } + + /// + /// Convert the raw string into a nodeId integer array or a single integer + /// + /// + /// The published property type. + /// + /// + /// The value of the property + /// + /// + /// The preview. + /// + /// + /// The . + /// + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + if (IsMultipleDataType(propertyType.DataTypeId)) + { + var nodeIds = + source.ToString() + .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries) + .Select(int.Parse) + .ToArray(); + return nodeIds; + } + + var attemptConvertInt = source.TryConvertTo(); + if (attemptConvertInt.Success) + { + return attemptConvertInt.Result; + } + else + { + var nodeIds = + source.ToString() + .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries) + .Select(int.Parse) + .ToArray(); + + if (nodeIds.Length > 0) + { + var error = + string.Format( + "Data type \"{0}\" is not set to allow multiple items but appears to contain multiple items, check the setting and save the data type again", + ApplicationContext.Current.Services.DataTypeService.GetDataTypeDefinitionById( + propertyType.DataTypeId).Name); + + LogHelper.Warn(error); + throw new Exception(error); + } + } + + return null; + } + + /// + /// Convert the source nodeId into a IPublishedContent or IEnumerable of IPublishedContent (or DynamicPublishedContent) depending on data type setting + /// + /// + /// The published property type. + /// + /// + /// The value of the property + /// + /// + /// The preview. + /// + /// + /// The . + /// + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + if (source == null) + { + return null; + } + + if (UmbracoContext.Current == null) + { + return null; + } + + var umbHelper = new UmbracoHelper(UmbracoContext.Current); + + if (IsMultipleDataType(propertyType.DataTypeId)) + { + var nodeIds = (int[])source; + var multiMediaPicker = Enumerable.Empty(); + if (nodeIds.Length > 0) + { + multiMediaPicker = umbHelper.TypedMedia(nodeIds).Where(x => x != null); + } + + return multiMediaPicker; + } + + // single value picker + var nodeId = (int)source; + + return umbHelper.TypedMedia(nodeId); + } + + /// + /// The get property cache level. + /// + /// + /// The property type. + /// + /// + /// The cache value. + /// + /// + /// The . + /// + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) + { + PropertyCacheLevel returnLevel; + switch (cacheValue) + { + case PropertyCacheValue.Object: + returnLevel = PropertyCacheLevel.ContentCache; + break; + case PropertyCacheValue.Source: + returnLevel = PropertyCacheLevel.Content; + break; + case PropertyCacheValue.XPath: + returnLevel = PropertyCacheLevel.Content; + break; + default: + returnLevel = PropertyCacheLevel.None; + break; + } + + return returnLevel; + } + + /// + /// The get property value type. + /// + /// + /// The property type. + /// + /// + /// The . + /// + public virtual Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return IsMultipleDataType(propertyType.DataTypeId) ? typeof(IEnumerable) : typeof(IPublishedContent); + } + + /// + /// The is multiple data type. + /// + /// + /// The data type id. + /// + /// + /// The . + /// + public bool IsMultipleDataType(int dataTypeId) + { + var dts = ApplicationContext.Current.Services.DataTypeService; + var multiPickerPreValue = + dts.GetPreValuesCollectionByDataTypeId(dataTypeId) + .PreValuesAsDictionary.FirstOrDefault( + x => string.Equals(x.Key, "multiPicker", StringComparison.InvariantCultureIgnoreCase)).Value; + + return multiPickerPreValue != null && multiPickerPreValue.Value.TryConvertTo().Result; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs index a0368db769..5df37ebfb9 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs @@ -1,106 +1,65 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Xml; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; +// -------------------------------------------------------------------------------------------------------------------- +// +// Umbraco +// +// +// Defines the RelatedLinksPropertyConverter type. +// +// -------------------------------------------------------------------------------------------------------------------- + using Umbraco.Core; -using Umbraco.Core.Logging; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; -using Umbraco.Core.PropertyEditors.ValueConverters; +using Umbraco.Web.Models; namespace Umbraco.Web.PropertyEditors.ValueConverters { - [PropertyValueType(typeof(JArray))] - [PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.Content)] - [DefaultPropertyValueConverter(typeof(JsonValueConverter))] //this shadows the JsonValueConverter - public class RelatedLinksEditorValueConvertor : PropertyValueConverterBase + /// + /// The related links property value converter. + /// + [PropertyValueType(typeof(RelatedLinks))] + [PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.ContentCache)] + public class RelatedLinksPropertyConverter : PropertyValueConverterBase { + /// + /// Checks if this converter can convert the property editor and registers if it can. + /// + /// + /// The property type. + /// + /// + /// The . + /// public override bool IsConverter(PublishedPropertyType propertyType) { - return Constants.PropertyEditors.RelatedLinksAlias.Equals(propertyType.PropertyEditorAlias); + return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.RelatedLinksAlias); } - public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + /// + /// Convert the source nodeId into a RelatedLinks object + /// + /// + /// The published property type. + /// + /// + /// The value of the property + /// + /// + /// The preview. + /// + /// + /// The . + /// + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) { - if (source == null) return null; - var sourceString = source.ToString(); - - if (sourceString.DetectIsJson()) + if (source == null) { - try - { - var obj = JsonConvert.DeserializeObject(sourceString); - //update the internal links if we have a context - if (UmbracoContext.Current != null) - { - var helper = new UmbracoHelper(UmbracoContext.Current); - foreach (var a in obj) - { - var type = a.Value("type"); - if (type.IsNullOrWhiteSpace() == false) - { - if (type == "internal") - { - var linkId = a.Value("link"); - var link = helper.NiceUrl(linkId); - a["link"] = link; - } - } - } - } - return obj; - } - catch (Exception ex) - { - LogHelper.Error("Could not parse the string " + sourceString + " to a json object", ex); - } + return null; } - //it's not json, just return the string - return sourceString; - } - - public override object ConvertSourceToXPath(PublishedPropertyType propertyType, object source, bool preview) - { - if (source == null) return null; var sourceString = source.ToString(); - if (sourceString.DetectIsJson()) - { - try - { - var obj = JsonConvert.DeserializeObject(sourceString); - - var d = new XmlDocument(); - var e = d.CreateElement("links"); - d.AppendChild(e); - - var values = (IEnumerable)source; - foreach (dynamic link in obj) - { - var ee = d.CreateElement("link"); - ee.SetAttribute("title", link.title); - ee.SetAttribute("link", link.link); - ee.SetAttribute("type", link.type); - ee.SetAttribute("newwindow", link.newWindow); - - e.AppendChild(ee); - } - - return d.CreateNavigator(); - } - catch (Exception ex) - { - LogHelper.Error("Could not parse the string " + sourceString + " to a json object", ex); - } - } - - //it's not json, just return the string - return sourceString; + return UmbracoContext.Current != null ? new RelatedLinks(sourceString) : null; } } -} +} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index de4b49bc77..6d44805856 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -342,6 +342,9 @@ + + + @@ -356,8 +359,12 @@ + + + + From ebd2bf149c2544ee3b1f4ffb8761fb2a237efb24 Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Sun, 12 Jun 2016 18:48:46 +0200 Subject: [PATCH 013/841] Basic editor + macro dialog implemented --- src/Umbraco.Web.UI.Client/bower.json | 3 +- .../lib/ace-razor-mode/theme/razor_chrome.css | 161 ++++++++++++++++++ .../lib/ace/ace-src-min-noconflict.js | 10 -- src/Umbraco.Web.UI.Client/lib/ace/mode-css.js | 1 - .../lib/ace/mode-javascript.js | 1 - .../lib/ace/mode-razor.js | 1 - .../components/editor/umb-editor-header.html | 2 +- .../src/views/templates/edit.controller.js | 103 ++++++++--- .../src/views/templates/edit.html | 80 ++++----- src/Umbraco.Web/UI/JavaScript/JsInitialize.js | 6 +- src/Umbraco.Web/Umbraco.Web.csproj | 3 + 11 files changed, 286 insertions(+), 85 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/lib/ace-razor-mode/theme/razor_chrome.css delete mode 100644 src/Umbraco.Web.UI.Client/lib/ace/ace-src-min-noconflict.js delete mode 100644 src/Umbraco.Web.UI.Client/lib/ace/mode-css.js delete mode 100644 src/Umbraco.Web.UI.Client/lib/ace/mode-javascript.js delete mode 100644 src/Umbraco.Web.UI.Client/lib/ace/mode-razor.js diff --git a/src/Umbraco.Web.UI.Client/bower.json b/src/Umbraco.Web.UI.Client/bower.json index d1397b5d4e..dbd1b36d65 100644 --- a/src/Umbraco.Web.UI.Client/bower.json +++ b/src/Umbraco.Web.UI.Client/bower.json @@ -27,6 +27,7 @@ "tinymce": "~4.1.10", "codemirror": "~5.3.0", "angular-local-storage": "~0.2.3", - "moment": "~2.10.3" + "moment": "~2.10.3", + "ace-builds": "^1.2.3" } } diff --git a/src/Umbraco.Web.UI.Client/lib/ace-razor-mode/theme/razor_chrome.css b/src/Umbraco.Web.UI.Client/lib/ace-razor-mode/theme/razor_chrome.css new file mode 100644 index 0000000000..7f401520d5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/ace-razor-mode/theme/razor_chrome.css @@ -0,0 +1,161 @@ +.ace-chrome .ace_gutter { + background: white !important; + color: #ccc !important; + overflow : hidden; +} + +.ace-chrome .ace_print-margin { + +} + +.ace-chrome { + background-color: #FFFFFF; + color: black; +} + +.ace-chrome .ace_cursor { + color: black; +} + +.ace-chrome .ace_invisible { + color: rgb(191, 191, 191); +} + +.ace-chrome .ace_constant.ace_buildin { + color: rgb(88, 72, 246); +} + +.ace-chrome .ace_constant.ace_language { + color: rgb(88, 92, 246); +} + +.ace-chrome .ace_constant.ace_library { + color: rgb(6, 150, 14); +} + +.ace-chrome .ace_invalid { + background-color: rgb(153, 0, 0); + color: white; +} + +.ace_punctuation.ace_short.ace_razor{ + background: yellow; +} + +.ace-chrome .ace_fold { +} + +.ace-chrome .ace_support.ace_function { + color: rgb(60, 76, 114); +} + +.ace-chrome .ace_support.ace_constant { + color: rgb(6, 150, 14); +} + +.ace-chrome .ace_support.ace_type, +.ace-chrome .ace_support.ace_class +.ace-chrome .ace_support.ace_other { + color: rgb(109, 121, 222); +} + +.ace-chrome .ace_variable.ace_parameter { + font-style:italic; + color:#FD971F; +} +.ace-chrome .ace_keyword.ace_operator { + color: rgb(104, 118, 135); +} + +.ace-chrome .ace_comment { + color: #236e24; +} + +.ace-chrome .ace_comment.ace_doc { + color: #236e24; +} + +.ace-chrome .ace_comment.ace_doc.ace_tag { + color: #236e24; +} + +.ace-chrome .ace_constant.ace_numeric { + color: rgb(0, 0, 205); +} + +.ace-chrome .ace_variable { + color: rgb(49, 132, 149); +} + +.ace-chrome .ace_xml-pe { + color: rgb(104, 104, 91); +} + +.ace-chrome .ace_entity.ace_name.ace_function { + color: #0000A2; +} + + +.ace-chrome .ace_heading { + color: rgb(12, 7, 255); +} + +.ace-chrome .ace_list { + color:rgb(185, 6, 144); +} + +.ace-chrome .ace_marker-layer .ace_selection { + background: rgb(181, 213, 255); +} + +.ace-chrome .ace_marker-layer .ace_step { + background: rgb(252, 255, 0); +} + +.ace-chrome .ace_marker-layer .ace_stack { + background: rgb(164, 229, 101); +} + +.ace-chrome .ace_marker-layer .ace_bracket { + margin: -1px 0 0 -1px; + border: 1px solid rgb(192, 192, 192); +} + +.ace-chrome .ace_marker-layer .ace_active-line { + background: rgba(0, 0, 0, 0.07) !important; +} + +.ace-chrome .ace_gutter-active-line { + background: rgba(0, 0, 0, 0.07) !important; +} + +.ace-chrome .ace_marker-layer .ace_selected-word { + background: rgb(250, 250, 255); + border: 1px solid rgb(200, 200, 250); +} + +.ace-chrome .ace_storage, +.ace-chrome .ace_keyword, +.ace-chrome .ace_meta.ace_tag { + color: rgb(147, 15, 128); +} + +.ace-chrome .ace_string.ace_regex { + color: rgb(255, 0, 0) +} + +.ace-chrome .ace_string { + color: #1A1AA6; +} + +.ace-chrome .ace_entity.ace_other.ace_attribute-name { + color: #994409; +} + +.ace-chrome .ace_indent-guide { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; +} + +.ace-chrome .ace_razor { + background: yellow; +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/ace/ace-src-min-noconflict.js b/src/Umbraco.Web.UI.Client/lib/ace/ace-src-min-noconflict.js deleted file mode 100644 index b338717bfd..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/ace/ace-src-min-noconflict.js +++ /dev/null @@ -1,10 +0,0 @@ -(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE = "ace",e=function(){return this}();!e&&typeof window!="undefined"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!="undefined")return;var t=function(e,n,r){if(typeof e!="string"){t.original?t.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t=="string"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)==="[object Array]"){var o=[];for(var u=0,a=t.length;u1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((i.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&window.navigator.product==="Gecko",t.isOldGecko=t.isGecko&&parseInt((i.match(/rv\:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isTouchPad=i.indexOf("TouchPad")>=0,t.isChromeOS=i.indexOf(" CrOS ")>=0}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){s.OSKey&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1),a&8&&n>=91&&n<=93&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null),s.count=0,s.lastT=0}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addTouchMoveListener=function(e,n){if("ontouchmove"in e){var r,i;t.addListener(e,"touchstart",function(e){var t=e.changedTouches[0];r=t.clientX,i=t.clientY}),t.addListener(e,"touchmove",function(e){var t=1,s=e.changedTouches[0];e.wheelX=-(s.clientX-r)/t,e.wheelY=-(s.clientY-i)/t,r=s.clientX,i=s.clientY,n(e)})}},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){var t=e.keyCode;s[t]=(s[t]||0)+1,t==91||t==92?s.OSKey=!0:s.OSKey&&e.timeStamp-s.lastT>200&&s.count==1&&f(),s[t]==1&&s.count++,s.lastT=e.timeStamp;var r=a(n,e,t);return u=e.defaultPrevented,r}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){var t=e.keyCode;s[t]?s.count=Math.max(s.count-1,0):f();if(t==91||t==92)s.OSKey=!1;s[t]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l;t.addListener(n,"message",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())}),n.postMessage(r,"*")}}t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/lib/lang",["require","exports","module"],function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;n.$blockScrolling++,this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select"),n.$blockScrolling--},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);t.$blockScrolling++;if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=f(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);n.$blockScrolling++;if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=f(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.$blockScrolling--,n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=a(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>o||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()},this.onTouchMove=function(e){var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(u.prototype),t.DefaultHandlers=u}),ace.define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(e,t,n){"use strict";function s(e){this.isOpen=!1,this.$element=null,this.$parentNode=e}var r=e("./lib/oop"),i=e("./lib/dom");(function(){this.$init=function(){return this.$element=i.createElement("div"),this.$element.className="ace_tooltip",this.$element.style.display="none",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(e){i.setInnerText(this.getElement(),e)},this.setHtml=function(e){this.getElement().innerHTML=e},this.setPosition=function(e,t){this.getElement().style.left=e+"px",this.getElement().style.top=t+"px"},this.setClassName=function(e){i.addCssClass(this.getElement(),e)},this.show=function(e,t,n){e!=null&&this.setText(e),t!=null&&n!=null&&this.setPosition(t,n),this.isOpen||(this.getElement().style.display="block",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display="none",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(s.prototype),t.Tooltip=s}),ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(e,t,n){"use strict";function u(e){function l(){var r=u.getDocumentPosition().row,s=n.$annotations[r];if(!s)return c();var o=t.session.getLength();if(r==o){var a=t.renderer.pixelToScreenCoordinates(0,u.y).row,l=u.$pos;if(a>t.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.$blockScrolling+=1,t.moveCursorToPosition(e),t.$blockScrolling-=1,S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(m),t.$blockScrolling-=1,t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a)},t.init=f}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("../config"),l=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),r.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var f=e.renderer.$gutter;r.addListener(f,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(f,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(f,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(f,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(f,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new u(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,o=function(e){if(!e)return;if(i.isWebKit&&!e.which&&s.releaseMouse)return s.releaseMouse();s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new u(e,s.editor),s.$mouseMoved=!0},a=function(e){clearInterval(l),f(),s[s.state+"End"]&&s[s.state+"End"](e),s.state="",n.$keepTextAreaAtCursor==null&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent("mouseup",e)},f=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){a(e)});s.$onCaptureMouseMove=o,s.releaseMouse=r.capture(this.editor.container,o,a);var l=setInterval(f,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),ace.define("ace/mouse/fold_handler",["require","exports","module"],function(e,t,n){"use strict";function r(e){e.on("click",function(t){var n=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(n.row,n.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}t.FoldHandler=r}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.rowt.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column-n,e.column).split(" ").length-1==n?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s){this.moveCursorTo(s.end.row,s.end.column);return}if(i=this.session.nonTokenRe.exec(r))t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t);if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}if(o=this.session.tokenRe.exec(s))t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t,n=0,r,i=/\s/,s=this.session.tokenRe;s.lastIndex=0;if(t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((r=e[n])&&i.test(r))n++;if(n<1){s.lastIndex=0;while((r=e[n])&&!s.test(r)){s.lastIndex=0,n++;if(i.test(r)){if(n>2){n--;break}while((r=e[n])&&i.test(r))n++;if(n>2)break}}}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column);t===0&&(this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var r=this.session.screenToDocumentPosition(n.row+e,n.column);e!==0&&t===0&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&(r.row>0||e>0)&&r.row++,this.moveCursorTo(r.row,r.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),ace.define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}}}).call(r.prototype),t.TokenIterator=r}),ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],function(e,t,n){"use strict";var r=e("../tokenizer").Tokenizer,i=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour").Behaviour,o=e("../unicode"),u=e("../lib/lang"),a=e("../token_iterator").TokenIterator,f=e("../range").Range,l=function(){this.HighlightRules=i,this.$behaviour=new s};(function(){this.tokenRe=new RegExp("^["+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules,this.$tokenizer=new r(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(e,t,n,r){function w(e){for(var t=n;t<=r;t++)e(i.getLine(t),t)}var i=t.doc,s=!0,o=!0,a=Infinity,f=t.getTabSize(),l=!1;if(!this.lineCommentStart){if(!this.blockComment)return!1;var c=this.blockComment.start,h=this.blockComment.end,p=new RegExp("^(\\s*)(?:"+u.escapeRegExp(c)+")"),d=new RegExp("(?:"+u.escapeRegExp(h)+")\\s*$"),v=function(e,t){if(g(e,t))return;if(!s||/\S/.test(e))i.insertInLine({row:t,column:e.length},h),i.insertInLine({row:t,column:a},c)},m=function(e,t){var n;(n=e.match(d))&&i.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(p))&&i.removeInLine(t,n[1].length,n[0].length)},g=function(e,n){if(p.test(e))return!0;var r=t.getTokens(n);for(var i=0;i2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),a==Infinity&&(a=E,s=!1,o=!1),l&&a%f!=0&&(a=Math.floor(a/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new a(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,l=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new f(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new a(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new f(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);l.start.row==c&&(l.start.column+=h),l.end.row==c&&(l.end.column+=h),t.selection.fromOrientedRange(l)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);var n=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.rowr)break;l.start.row==r&&l.start.column>=t.column&&(l.start.column!=t.column||!this.$insertRight)&&(l.start.column+=o,l.start.row+=s);if(l.end.row==r&&l.end.column>=t.column){if(l.end.column==t.column&&this.$insertRight)continue;l.end.column==t.column&&o>0&&al.start.column&&l.end.column==u[a+1].start.column&&(l.end.column-=o),l.end.column+=o,l.end.row+=s}}if(s!=0&&a=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(t=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s){t.children||t.all?this.removeFold(s):this.expandFold(s);return}var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range)){this.removeFold(s);return}}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=e.length-1;r!=-1;r--){var i=e[r];i.group=="doc"?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=0;re.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,l=s.start,o=l.row-a.row,u=l.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new f(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),s=this.$wrapData,o=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,s){var o;if(e!=null){o=this.$getDisplayTokens(e,a.length),o[0]=n;for(var f=1;fr-b){var w=a+r-b;if(e[w-1]>=p&&e[w]>=p){y(w);continue}if(e[w]==n||e[w]==u){for(w;w!=a-1;w--)if(e[w]==n)break;if(w>a){y(w);continue}w=a+r;for(w;w>2)),a-1);while(w>E&&e[w]E&&e[w]E&&e[w]==l)w--}else while(w>E&&e[w]E){y(++w);continue}w=a+r,e[w]==t&&w--,y(w-b)}return s},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(l):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var o=a[f],r=this.$docRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:Infinity;while(o<=e){u=this.getRowLength(r);if(o+u>e||r>=h)break;o+=u,r++,r>d&&(r=p.end.row+1,p=this.getNextFoldLine(r,p),d=p?p.start.row:Infinity),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o))}if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||r>h)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}var v=0;if(this.$useWrapMode){var m=this.$wrapData[r];if(m){var g=Math.floor(e-o);s=m[g],g>0&&m.length&&(v=m.indent,i=m[g-1]||m[m.length-1],n=n.substring(i))}}return i+=this.$getStringScreenWidth(n,t-v)[1],this.$useWrapMode&&i>=s&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()}}).call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize")},initialValue:4,handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i){if(!e.start){var o=e.offset+(i||0);r=new s(n,o,n,o+e.length);if(!e.length&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start))return r=null,!1}else r=e;return!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=0;u--)if(i(o[u],t,s))return!0};else var u=function(e,t,s){var o=r.getMatchOffsets(e,n);for(var u=0;u=o;r--)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=u,o=s.row;r>=o;r--)if(n(e.getLine(r),r))return}:function(n){var r=s.row,i=e.getLine(r).substr(s.column);if(n(i,r,s.column))return;for(r+=1;r<=u;r++)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=o,u=s.row;r<=u;r++)if(n(e.getLine(r),r))return};return{forEach:a}}}).call(o.prototype),t.Search=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||0}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r||n.isDefault?r=-100:r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","Ctrl-E"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Ctrl-Shift-E"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:o("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:o("Ctrl-Shift-Home","Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:o("Shift-Up","Shift-Up"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:o("Ctrl-Shift-End","Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:o("Shift-Down","Shift-Down"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:o("Alt-Shift-Left","Command-Shift-Left"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:o("Shift-Left","Shift-Left"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:o("Alt-Shift-Right","Command-Shift-Right"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:o("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:o("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(e){},readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:o("Alt-Delete","Ctrl-K"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:o("Ctrl-T","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o0&&this.$blockScrolling--;var n=t&&t.scrollIntoView;if(n){switch(n){case"center-animate":n="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var r=this.selection.getRange(),i=this.renderer.layerConfig;(r.start.row>=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this})},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container,"fontSize")},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column-1,r=t.end.column+1,i=e.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(n>=0&&/^[\w\d]/.test(o)||r<=s&&/[\w\d]$/.test(o))return;o=i.substring(t.start.column,t.end.column);if(!/^[\w\d]+$/.test(o))return;var u=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o});return u},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e,t){var n={text:e,event:t};this.commands.exec("paste",this,n)},this.$handlePaste=function(e){typeof e=="string"&&(e={text:e}),this._signal("paste",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var n=t.split(/\r\n|\r|\n/),r=this.selection.rangeList.ranges;if(n.length>r.length||n.length<2||!n[1])return this.commands.exec("insertstring",this,t);for(var i=r.length;i--;){var s=r[i];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[i])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,r=n.getMode(),i=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=r.transformAction(n.getState(i.row),"insertion",this,n,e);s&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text)}e==" "&&(e=this.session.getTabString());if(!this.selection.isEmpty()){var o=this.getSelectionRange();i=this.session.remove(o),this.clearSelection()}else if(this.session.getOverwrite()){var o=new p.fromPoints(i,i);o.end.column+=e.length,this.session.remove(o)}if(e=="\n"||e=="\r\n"){var u=n.getLine(i.row);if(i.column>u.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e),h=n.insert(i,e);s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var d=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},d)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var r=new p(0,0,0,0);for(var i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&np+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),this.$blockScrolling-=1,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))}}).call(b.prototype),g.defineOptions(b.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),t.Editor=b}),ace.define("ace/undomanager",["require","exports","module"],function(e,t,n){"use strict";var r=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines.length==1?null:e.lines,text:e.lines.length==1?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function n(e,t){var n=new Array(e.length);for(var r=0;r0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return this.dirtyCounter===0},this.$serializeDeltas=function(t){return n(t,e)},this.$deserializeDeltas=function(e){return n(e,t)}}).call(r.prototype),t.UndoManager=r}),ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/lang"),o=e("../lib/event_emitter").EventEmitter,u=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e&&e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;to&&(v=s.end.row+1,s=t.getNextFoldLine(v,s),o=s?s.start.row:Infinity);if(v>i){while(this.$cells.length>d+1)p=this.$cells.pop(),this.element.removeChild(p.element);break}p=this.$cells[++d],p||(p={element:null,textNode:null,foldWidget:null},p.element=r.createElement("div"),p.textNode=document.createTextNode(""),p.element.appendChild(p.textNode),this.element.appendChild(p.element),this.$cells[d]=p);var m="ace_gutter-cell ";a[v]&&(m+=a[v]),f[v]&&(m+=f[v]),this.$annotations[v]&&(m+=this.$annotations[v].className),p.element.className!=m&&(p.element.className=m);var g=t.getRowLength(v)*e.lineHeight+"px";g!=p.element.style.height&&(p.element.style.height=g);if(u){var y=u[v];y==null&&(y=u[v]=t.getFoldWidget(v))}if(y){p.foldWidget||(p.foldWidget=r.createElement("span"),p.element.appendChild(p.foldWidget));var m="ace_fold-widget ace_"+y;y=="start"&&v==o&&vn.right-t.right)return"foldWidgets"}}).call(u.prototype),t.Gutter=u}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){var e=e||this.config;if(!e)return;this.config=e;var t=[];for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}this.element.innerHTML=t.join("")},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,n,i,s,o){var u=this.session,a=n.start.row,f=n.end.row,l=a,c=0,h=0,p=u.getScreenLastRowColumn(l),d=new r(l,n.start.column,l,h);for(;l<=f;l++)d.start.row=d.end.row=l,d.start.column=l==a?n.start.column:u.getRowWrapIndent(l),d.end.column=p,c=h,h=p,p=l+1p,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"",e.push("
"),u=this.$getTop(t.end.row,r);var f=t.end.column*r.characterWidth;e.push("
"),o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var l=(t.start.column?1:0)|(t.end.column?0:8);e.push("
")},this.drawSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;e.push("
")},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),e.push("
")},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;e.push("
")}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.$updateEolChar=function(){var e=this.session.doc.getNewLineCharacter()=="\n"?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;n"+s.stringRepeat(this.TAB_CHAR,n)+""):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var r="ace_indent-guide",i="",o="";if(this.showInvisibles){r+=" ace_invisible",i=" ace_invisible_space",o=" ace_invisible_tab";var u=s.stringRepeat(this.SPACE_CHAR,this.tabSize),a=s.stringRepeat(this.TAB_CHAR,this.tabSize)}else var u=s.stringRepeat(" ",this.tabSize),a=u;this.$tabStrings[" "]=""+u+"",this.$tabStrings[" "]=""+a+""}},this.updateLines=function(e,t,n){(this.config.lastRow!=e.lastRow||this.config.firstRow!=e.firstRow)&&this.scrollLines(e),this.config=e;var r=Math.max(t,e.firstRow),i=Math.min(n,e.lastRow),s=this.element.childNodes,o=0;for(var u=e.firstRow;uf&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),f=a?a.start.row:Infinity);if(u>i)break;var l=s[o++];if(l){var c=[];this.$renderLine(c,u,!this.$useLineGroups(),u==f?a:!1),l.style.height=e.lineHeight*this.session.getRowLength(u)+"px",l.innerHTML=c.join("")}u++}},this.scrollLines=function(e){var t=this.config;this.config=e;if(!t||t.lastRow0;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(var r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);r>0;r--)n.removeChild(n.lastChild);if(e.firstRowt.lastRow){var i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(i)}},this.$renderLinesFragment=function(e,t,n){var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=i.createElement("div"),f=[];this.$renderLine(f,s,!1,s==u?o:!1),a.innerHTML=f.join("");if(this.$useLineGroups())a.className="ace_line_group",r.appendChild(a),a.style.height=e.lineHeight*this.session.getRowLength(s)+"px";else while(a.firstChild)r.appendChild(a.firstChild);s++}return r},this.update=function(e){this.config=e;var t=[],n=e.firstRow,r=e.lastRow,i=n,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>r)break;this.$useLineGroups()&&t.push("
"),this.$renderLine(t,i,!1,i==o?s:!1),this.$useLineGroups()&&t.push("
"),i++}this.element.innerHTML=t.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,u=function(e,n,r,o,u){if(n)return i.showInvisibles?""+s.stringRepeat(i.SPACE_CHAR,e.length)+"":e;if(e=="&")return"&";if(e=="<")return"<";if(e==">")return">";if(e==" "){var a=i.session.getScreenTabSize(t+o);return t+=a-1,i.$tabStrings[a]}if(e=="\u3000"){var f=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",l=i.showInvisibles?i.SPACE_CHAR:"";return t+=1,""+l+""}return r?""+i.SPACE_CHAR+"":(t+=1,""+e+"")},a=r.replace(o,u);if(!this.$textToken[n.type]){var f="ace_"+n.type.replace(/\./g," ace_"),l="";n.type=="fold"&&(l=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("",a,"")}else e.push(a);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);return r<=0||r>=n?t:t[0]==" "?(r-=r%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],r/this.tabSize)),t.substr(r)):t[0]==" "?(e.push(s.stringRepeat(this.$tabStrings[" "],r)),t.substr(r)):t},this.$renderWrappedLine=function(e,t,n,r){var i=0,o=0,u=n[0],a=0;for(var f=0;f=u)a=this.$renderToken(e,a,l,c.substring(0,u-i)),c=c.substring(u-i),i=u,r||e.push("","
"),e.push(s.stringRepeat("\u00a0",n.indent)),o++,a=0,u=n[o]||Number.MAX_VALUE;c.length!=0&&(i+=c.length,a=this.$renderToken(e,a,l,c))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;s");if(i.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)}this.showInvisibles&&(r&&(t=r.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),n||e.push("
")},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i,s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),i===undefined&&(i=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(i?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&!i&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible)return;this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+n.column*this.config.characterWidth,i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,r=0;if(t===undefined||t.length===0)t=[{cursor:null}];for(var n=0,i=t.length;ne.height+e.offset||s.top<0)&&n>1)continue;var o=(this.cursors[r++]||this.addCursor()).style;this.drawCursor?this.drawCursor(o,s,e,t[n],this.session):(o.left=s.left+"px",o.top=s.top+"px",o.width=e.characterWidth+"px",o.height=e.lineHeight+"px")}while(this.cursors.length>r)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e}}).call(u.prototype);var a=function(e,t){u.call(this,e),this.scrollTop=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};r.inherits(a,u),function(){this.classSuffix="-v",this.onScroll=function(){this.skipEvent||(this.scrollTop=this.element.scrollTop,this._emit("scroll",{data:this.scrollTop})),this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=function(e){this.inner.style.height=e+"px"},this.setScrollHeight=function(e){this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=this.element.scrollTop=e)}}.call(a.prototype);var f=function(e,t){u.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(f,u),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(f.prototype),t.ScrollBar=a,t.ScrollBarV=a,t.ScrollBarH=f,t.VScrollBar=a,t.HScrollBar=f}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){this.changes=this.changes|e;if(!this.pending&&this.changes){this.pending=!0;var t=this;r.nextFrame(function(){t.pending=!1;var e;while(e=t.changes)t.changes=0,t.onRender(e)},this.window)}}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=0,f=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),a||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat("X",a),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){r.implement(this,u),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=i.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;t>0&&t<1?a=50:a=100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",o.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(a===50){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var n={height:e.height,width:e.width/a}}else var n={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/a};return n.width===0||n.height===0?null:n},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,a);var t=this.$main.getBoundingClientRect();return t.width/a},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(f.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./lib/useragent"),u=e("./layer/gutter").Gutter,a=e("./layer/marker").Marker,f=e("./layer/text").Text,l=e("./layer/cursor").Cursor,c=e("./scrollbar").HScrollBar,h=e("./scrollbar").VScrollBar,p=e("./renderloop").RenderLoop,d=e("./layer/font_metrics").FontMetrics,v=e("./lib/event_emitter").EventEmitter,m='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}';i.importCssString(m,"ace_editor.css");var g=function(e,t){var n=this;this.container=e||i.createElement("div"),this.$keepTextAreaAtCursor=!o.isOldIE,i.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new u(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new a(this.content);var r=this.$textLayer=new f(this.content);this.canvas=r.element,this.$markerFront=new a(this.content),this.$cursorLayer=new l(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new c(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new d(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,v),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var i=0,s=this.$size,o={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};r&&(e||s.height!=r)&&(s.height=r,i|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",i|=this.CHANGE_SCROLL);if(n&&(e||s.width!=n)){i|=this.CHANGE_SIZE,s.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px";if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)i|=this.CHANGE_FULL}return s.$dirty=!n||!r,i&&this._signal("resize",o),i},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor)return;var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;var r=this.textarea.style,i=this.lineHeight;if(t<0||t>e.height-i){r.top=r.left="0";return}var s=this.characterWidth;if(this.$composition){var o=this.textarea.value.replace(/^\x01+/,"");s*=this.session.$getStringScreenWidth(o)[0]+2,i+=2}n-=this.scrollLeft,n>this.$size.scrollerWidth-s&&(n=this.$size.scrollerWidth-s),n+=this.gutterWidth,r.height=i+"px",r.width=s+"px",r.left=Math.min(n,this.$size.scrollerWidth-s)+"px",r.top=Math.min(t,this.$size.height-i)+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+"px",this.content.style.marginTop=-n.offset+"px",this.content.style.width=n.width+2*this.$padding+"px",this.content.style.height=n.minHeight+"px"}e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||r!=this.$vScroll){r!=this.$vScroll&&(this.$vScroll=r,this.scrollBarV.setVisible(r));var i=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,i,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=this.scrollTop%this.lineHeight,l=t.scrollerHeight+this.lineHeight,c=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=c;var h=this.scrollMargin;this.session.setScrollTop(Math.max(-h.top,Math.min(this.scrollTop,i-t.scrollerHeight+h.bottom))),this.session.setScrollLeft(Math.max(-h.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+h.right)));var p=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+c<0||this.scrollTop>h.top),d=a!==p;d&&(this.$vScroll=p,this.scrollBarV.setVisible(p));var v=Math.ceil(l/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-f)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),l=t.scrollerHeight+e.getRowLength(g)*w+b,f=this.scrollTop-y*w;var S=0;this.layerConfig.width!=s&&(S=this.CHANGE_H_SCROLL);if(u||d)S=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),d&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:l,maxHeight:i,offset:f,gutterOffset:Math.max(0,Math.ceil((f+t.height-t.scrollerHeight)/w)),height:this.$size.scrollerHeight},S},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(ts?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=(e+this.scrollLeft-n.left-this.$padding)/this.characterWidth,i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:r-s>0?1:-1}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.round((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=(t+this.scrollTop-n.top)/this.lineHeight;return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+Math.round(r.column*this.characterWidth),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null},this.setTheme=function(e,t){function o(r){if(n.$themeId!=e)return t&&t();if(!r.cssClass)return;i.importCssString(r.cssText,r.cssClass,n.container.ownerDocument),n.theme&&i.removeCssClass(n.container,n.theme.cssClass);var s="padding"in r?r.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=r.cssClass,n.theme=r,i.addCssClass(n.container,r.cssClass),i.setCssClass(n.container,"ace_dark",r.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:r}),t&&t()}var n=this;this.$themeId=e,n._dispatchEvent("themeChange",{theme:e});if(!e||typeof e=="string"){var r=e||this.$options.theme.initialValue;s.loadModule(["theme",r],o)}else o(e)},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){i.setCssClass(this.container,e,t!==!1)},this.unsetStyle=function(e){i.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(g.prototype),s.defineOptions(g.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){typeof e=="number"&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=i.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){(!this.$hScrollBarAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){(!this.$vScrollBarAlwaysVisible||!this.$vScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){typeof e=="number"&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},maxPixelHeight:{set:function(e){this.updateFull()},initialValue:0},scrollPastEnd:{set:function(e){e=+e||0;if(this.$scrollPastEnd==e)return;this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=g}),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,o=e("../config"),u=function(t,n,r,i){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl);if(o.get("packaged")||!e.toUrl)i=i||o.moduleUrl(n,"worker");else{var s=this.$normalizePath;i=i||s(e.toUrl("ace/worker/worker.js",null,"_"));var u={};t.forEach(function(t){u[t]=s(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{this.$worker=new Worker(i)}catch(a){if(!(a instanceof window.DOMException))throw a;var f=this.$workerBlob(i),l=window.URL||window.webkitURL,c=l.createObjectURL(f);this.$worker=new Worker(c),l.revokeObjectURL(c)}this.$worker.postMessage({init:!0,tlns:u,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return i.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var r=this.callbackId++;this.callbacks[r]=n,t.push(r)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){console.error(n.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),e.action=="insert"?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;if(!e)return;this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})},this.$workerBlob=function(e){var t="importScripts('"+i.qualifyURL(e)+"');";try{return new Blob([t],{type:"application/javascript"})}catch(n){var r=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,s=new r;return s.append(t),s.getBlob("application/javascript")}}}).call(u.prototype);var a=function(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,i=!1,u=Object.create(s),a=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){a.messageBuffer.push(e),r&&(i?setTimeout(f):f())},this.setEmitSync=function(e){i=e};var f=function(){var e=a.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};u.postMessage=function(e){a.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.messageBuffer.length)f()})};a.prototype=u.prototype,t.UIWorkerClient=a,t.WorkerClient=u}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)d--;if(d>0){var m=0;while(r[m].isEmpty())m++}for(var g=d;g>=m;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges();var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./editor").Editor,o=e("./edit_session").EditSession,u=e("./undomanager").UndoManager,a=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,t.edit=function(e){if(typeof e=="string"){var n=e;e=document.getElementById(n);if(!e)throw new Error("ace.edit can't find div #"+n)}if(e&&e.env&&e.env.editor instanceof s)return e.env.editor;var o="";if(e&&/input|textarea/i.test(e.tagName)){var u=e;o=u.value,e=r.createElement("pre"),u.parentNode.replaceChild(e,u)}else e&&(o=r.getInnerText(e),e.innerHTML="");var f=t.createEditSession(o),l=new s(new a(e));l.setSession(f);var c={document:f,editor:l,onResize:l.resize.bind(l,null)};return u&&(c.textarea=u),i.addListener(window,"resize",c.onResize),l.on("destroy",function(){i.removeListener(window,"resize",c.onResize),c.editor.container.env=null}),l.container.env=l.env=c,l},t.createEditSession=function(e,t){var n=new o(e,t);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u,t.version="1.2.3"}); - (function() { - ace.require(["ace/ace"], function(a) { - a && a.config.init(true); - if (!window.ace) - window.ace = a; - for (var key in a) if (a.hasOwnProperty(key)) - window.ace[key] = a[key]; - }); - })(); diff --git a/src/Umbraco.Web.UI.Client/lib/ace/mode-css.js b/src/Umbraco.Web.UI.Client/lib/ace/mode-css.js deleted file mode 100644 index 02e4cc380b..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/ace/mode-css.js +++ /dev/null @@ -1 +0,0 @@ -ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),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/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),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(++tf)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(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),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.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}) diff --git a/src/Umbraco.Web.UI.Client/lib/ace/mode-javascript.js b/src/Umbraco.Web.UI.Client/lib/ace/mode-javascript.js deleted file mode 100644 index 20afa82e76..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/ace/mode-javascript.js +++ /dev/null @@ -1 +0,0 @@ -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/javascript_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";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=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/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),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(++tf)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(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../range").Range,a=e("../worker/worker_client").WorkerClient,f=e("./behaviour/cstyle").CstyleBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}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.createWorker=function(e){var t=new a(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(c.prototype),t.Mode=c}) diff --git a/src/Umbraco.Web.UI.Client/lib/ace/mode-razor.js b/src/Umbraco.Web.UI.Client/lib/ace/mode-razor.js deleted file mode 100644 index bb23872e84..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/ace/mode-razor.js +++ /dev/null @@ -1 +0,0 @@ -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/javascript_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";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=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/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),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(++tf)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(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../range").Range,a=e("../worker/worker_client").WorkerClient,f=e("./behaviour/cstyle").CstyleBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}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.createWorker=function(e){var t=new a(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(c.prototype),t.Mode=c}),ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),ace.define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),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.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}),ace.define("ace/mode/xml_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(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.xml-decl.xml","keyword.xml-decl.xml"],regex:"(<\\?)(xml)(?=[\\s])",next:"xml_decl",caseInsensitive:!0},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],processing_instruction:[{token:"punctuation.instruction.xml",regex:"\\?>",next:"start"},{defaultToken:"instruction.xml"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({noJSX:!0})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=f.value.charAt(0);if(l=='"'||l=="'"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,"tag-name"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":""},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"tag-name"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"attribute-name"))i=n.stepBackward();if(i)return i.value}var r=e("../token_iterator").TokenIterator,i=["accesskey","class","contenteditable","contextmenu","dir","draggable","dropzone","hidden","id","inert","itemid","itemprop","itemref","itemscope","itemtype","lang","spellcheck","style","tabindex","title","translate"],s=["onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onscroll","onseeked","onseeking","onselect","onshow","onstalled","onsubmit","onsuspend","ontimeupdate","onvolumechange","onwaiting"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{"text/css":1,"image/png":1,"image/jpeg":1,"image/gif":1},sizes:1},meta:{"http-equiv":{"content-type":1},name:{description:1,keywords:1},content:{"text/html; charset=UTF-8":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{"text/javascript":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},"var":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{"allow-same-origin":1,"allow-top-navigation":1,"allow-forms":1,"allow-scripts":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,"default":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{"accept-charset":1,action:1,autocomplete:1,enctype:{"multipart/form-data":1,"application/x-www-form-urlencoded":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,"for":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,"datetime-local":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{"application/x-www-form-urlencoded":1,"multipart/form-data":1,"text/plain":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},name:1,pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{"for":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,"tag-name")||f(i,"tag-open")||f(i,"end-tag-open"))return this.getTagCompletions(e,t,n,r);if(f(i,"tag-whitespace")||f(i,"attribute-name"))return this.getAttributeCompletions(e,t,n,r);if(f(i,"attribute-value"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:"tag",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'="$0"',meta:"attribute",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]=="object"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:"attribute value",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=["Aacute;","aacute;","Acirc;","acirc;","acute;","AElig;","aelig;","Agrave;","agrave;","alefsym;","Alpha;","alpha;","amp;","and;","ang;","Aring;","aring;","asymp;","Atilde;","atilde;","Auml;","auml;","bdquo;","Beta;","beta;","brvbar;","bull;","cap;","Ccedil;","ccedil;","cedil;","cent;","Chi;","chi;","circ;","clubs;","cong;","copy;","crarr;","cup;","curren;","Dagger;","dagger;","dArr;","darr;","deg;","Delta;","delta;","diams;","divide;","Eacute;","eacute;","Ecirc;","ecirc;","Egrave;","egrave;","empty;","emsp;","ensp;","Epsilon;","epsilon;","equiv;","Eta;","eta;","ETH;","eth;","Euml;","euml;","euro;","exist;","fnof;","forall;","frac12;","frac14;","frac34;","frasl;","Gamma;","gamma;","ge;","gt;","hArr;","harr;","hearts;","hellip;","Iacute;","iacute;","Icirc;","icirc;","iexcl;","Igrave;","igrave;","image;","infin;","int;","Iota;","iota;","iquest;","isin;","Iuml;","iuml;","Kappa;","kappa;","Lambda;","lambda;","lang;","laquo;","lArr;","larr;","lceil;","ldquo;","le;","lfloor;","lowast;","loz;","lrm;","lsaquo;","lsquo;","lt;","macr;","mdash;","micro;","middot;","minus;","Mu;","mu;","nabla;","nbsp;","ndash;","ne;","ni;","not;","notin;","nsub;","Ntilde;","ntilde;","Nu;","nu;","Oacute;","oacute;","Ocirc;","ocirc;","OElig;","oelig;","Ograve;","ograve;","oline;","Omega;","omega;","Omicron;","omicron;","oplus;","or;","ordf;","ordm;","Oslash;","oslash;","Otilde;","otilde;","otimes;","Ouml;","ouml;","para;","part;","permil;","perp;","Phi;","phi;","Pi;","pi;","piv;","plusmn;","pound;","Prime;","prime;","prod;","prop;","Psi;","psi;","quot;","radic;","rang;","raquo;","rArr;","rarr;","rceil;","rdquo;","real;","reg;","rfloor;","Rho;","rho;","rlm;","rsaquo;","rsquo;","sbquo;","Scaron;","scaron;","sdot;","sect;","shy;","Sigma;","sigma;","sigmaf;","sim;","spades;","sub;","sube;","sum;","sup;","sup1;","sup2;","sup3;","supe;","szlig;","Tau;","tau;","there4;","Theta;","theta;","thetasym;","thinsp;","THORN;","thorn;","tilde;","times;","trade;","Uacute;","uacute;","uArr;","uarr;","Ucirc;","ucirc;","Ugrave;","ugrave;","uml;","upsih;","Upsilon;","upsilon;","Uuml;","uuml;","weierp;","Xi;","xi;","Yacute;","yacute;","yen;","Yuml;","yuml;","Zeta;","zeta;","zwj;","zwnj;"];return i.map(function(e){return{caption:e,snippet:e,meta:"html entity",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text").Mode,o=e("./javascript").Mode,u=e("./css").Mode,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./behaviour/xml").XmlBehaviour,l=e("./folding/html").FoldMode,c=e("./html_completions").HtmlCompletions,h=e("../worker/worker_client").WorkerClient,p=["area","base","br","col","embed","hr","img","input","keygen","link","meta","menuitem","param","source","track","wbr"],d=["li","dt","dd","p","rt","rp","optgroup","option","colgroup","td","th"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({"js-":o,"css-":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:""},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h(["ace"],"ace/mode/html_worker","Worker");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call("setOptions",[{context:this.fragmentContext}]),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/html"}.call(v.prototype),t.Mode=v}),ace.define("ace/mode/csharp_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=this.createKeywordMapper({"variable.language":"this",keyword:"abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic","constant.language":"null|true|false"},"identifier");this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},i.getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",next:"comment"},{token:"string",regex:/'(?:.|\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n]))'/},{token:"string",start:'"',end:'"|$',next:[{token:"constant.language.escape",regex:/\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/},{token:"invalid",regex:/\\./}]},{token:"string",start:'@"',end:'"',next:[{token:"constant.language.escape",regex:'""'}]},{token:"string",start:/\$"/,end:'"|$',next:[{token:"constant.language.escape",regex:/\\(:?$)|{{/},{token:"constant.language.escape",regex:/\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/},{token:"invalid",regex:/\\./}]},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:e,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"keyword",regex:"^\\s*#(if|else|elif|endif|define|undef|warning|error|line|region|endregion|pragma)"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",regex:".+"}]},this.embedRules(i,"doc-",[i.getEndRule("start")]),this.normalizeRules()};r.inherits(o,s),t.CSharpHighlightRules=o}),ace.define("ace/mode/razor_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/html_highlight_rules","ace/mode/csharp_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./doc_comment_highlight_rules").DocCommentHighlightRules,o=e("./html_highlight_rules").HtmlHighlightRules,u=e("./csharp_highlight_rules").CSharpHighlightRules,a="razor-block-",f=function(){u.call(this);var e=function(e,t){return typeof t=="function"?t(e):t},t="in-braces";this.$rules.start.unshift({regex:"[\\[({]",onMatch:function(e,n,r){var i=/razor-[^\-]+-/.exec(n)[0];return r.unshift(e),r.unshift(i+t),this.next=i+t,"paren.lparen"}});var n={"{":"}","[":"]","(":")"};this.$rules[t]=i.deepCopy(this.$rules.start),this.$rules[t].unshift({regex:"[\\])}]",onMatch:function(t,r,i){var s=i[1];return n[s]!==t?"invalid.illegal":(i.shift(),i.shift(),this.next=e(t,i[0])||"start","paren.rparen")}})};r.inherits(f,u);var l=function(){o.call(this);var e={regex:"@[({]|@functions{",onMatch:function(e,t,n){return n.unshift(e),n.unshift("razor-block-start"),this.next="razor-block-start","punctuation.block.razor"}},t={"@{":"}","@(":")","@functions{":"}"},n={regex:"[})]",onMatch:function(e,n,r){var i=r[1];return t[i]!==e?"invalid.illegal":(r.shift(),r.shift(),this.next=r.shift()||"start","punctuation.block.razor")}},r={regex:"@(?![{(])",onMatch:function(e,t,n){return n.unshift("razor-short-start"),this.next="razor-short-start","punctuation.short.razor"}},i={token:"",regex:"(?=[^A-Za-z_\\.()\\[\\]])",next:"pop"},s={regex:"@(?=if)",onMatch:function(e,t,n){return n.unshift(function(e){return e!=="}"?"start":n.shift()||"start"}),this.next="razor-block-start","punctuation.control.razor"}},u=[{token:["meta.directive.razor","text","identifier"],regex:"^(\\s*@model)(\\s+)(.+)$"},e,r];for(var a in this.$rules)this.$rules[a].unshift.apply(this.$rules[a],u);this.embedRules(f,"razor-block-",[n],["start"]),this.embedRules(f,"razor-short-",[i],["start"]),this.normalizeRules()};r.inherits(l,o),t.RazorHighlightRules=l,t.RazorLangHighlightRules=f}),ace.define("ace/mode/razor_completions",["require","exports","module","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../token_iterator").TokenIterator,i=["abstract","as","base","bool","break","byte","case","catch","char","checked","class","const","continue","decimal","default","delegate","do","double","else","enum","event","explicit","extern","false","finally","fixed","float","for","foreach","goto","if","implicit","in","int","interface","internal","is","lock","long","namespace","new","null","object","operator","out","override","params","private","protected","public","readonly","ref","return","sbyte","sealed","short","sizeof","stackalloc","static","string","struct","switch","this","throw","true","try","typeof","uint","ulong","unchecked","unsafe","ushort","using","var","virtual","void","volatile","while"],s=["Html","Model","Url","Layout"],o=function(){};(function(){this.getCompletions=function(e,t,n,r){if(e.lastIndexOf("razor-short-start")==-1&&e.lastIndexOf("razor-block-start")==-1)return[];var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e.lastIndexOf("razor-short-start")!=-1)return this.getShortStartCompletions(e,t,n,r);if(e.lastIndexOf("razor-block-start")!=-1)return this.getKeywordCompletions(e,t,n,r)},this.getShortStartCompletions=function(e,t,n,r){return s.map(function(e){return{value:e,meta:"keyword",score:Number.MAX_VALUE}})},this.getKeywordCompletions=function(e,t,n,r){return s.concat(i).map(function(e){return{value:e,meta:"keyword",score:Number.MAX_VALUE}})}}).call(o.prototype),t.RazorCompletions=o}),ace.define("ace/mode/razor",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/razor_highlight_rules","ace/mode/razor_completions","ace/mode/html_completions"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./html").Mode,s=e("./razor_highlight_rules").RazorHighlightRules,o=e("./razor_completions").RazorCompletions,u=e("./html_completions").HtmlCompletions,a=function(){i.call(this),this.$highlightRules=new s,this.$completer=new o,this.$htmlCompleter=new u};r.inherits(a,i),function(){this.getCompletions=function(e,t,n,r){var i=this.$completer.getCompletions(e,t,n,r),s=this.$htmlCompleter.getCompletions(e,t,n,r);return i.concat(s)},this.createWorker=function(e){return null},this.$id="ace/mode/razor"}.call(a.prototype),t.Mode=a}) diff --git a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html index fd112a018a..d610c1bc5b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html @@ -2,7 +2,7 @@
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index b44ce8f20c..28244b1a7c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -1,47 +1,96 @@ (function () { "use strict"; - function TemplatesEditController($scope) { + function TemplatesEditController($scope, $routeParams, templateResource, assetsService, notificationsService, editorState, navigationService, appState, macroService) { var vm = this; - vm.page = {}; - vm.page.loading = false; + vm.page.loading = true; + + //menu + vm.page.menu = {}; + vm.page.menu.currentSection = appState.getSectionState("currentSection"); + vm.page.menu.currentNode = null; - vm.mode = "css"; - - vm.aceOption = { - mode: vm.mode.toLowerCase(), - onLoad: function(ace) { - - console.log(ace); - - // HACK to have the ace instance in the scope... - /* - $scope.modeChanged = function() { - _ace.getSession().setMode("ace/mode/" + $scope.mode.toLowerCase()); - }; - */ - - } + vm.insert = function(str){ + vm.editor.insert(str); + vm.editor.focus(); }; - vm.aceModel = ';; Scheme code in here.\n' + - '(define (double x)\n\t(* x x))\n\n\n' + - '\n' + - '\n\t\n\t\n\t\n\n\n\n' + - '// Javascript code in here.\n' + - 'function foo(msg) {\n\tvar r = Math.random();\n\treturn "" + r + " : " + msg;\n}'; + vm.save = function(){ + vm.page.saveButtonState = "busy"; + vm.template.content = vm.editor.getValue(); + + templateResource.save(vm.template).then(function(saved){ + notificationsService.success("Template saved") + vm.page.saveButtonState = "success"; + vm.template = saved; + + //sync state + editorState.set(vm.template); + navigationService.syncTree({ tree: "templates", path: vm.template.path, forceReload: true }).then(function (syncArgs) { + vm.page.menu.currentNode = syncArgs.node; + }); + + + }, function(err){ + notificationsService.error("Template save failed") + vm.page.saveButtonState = "error"; + }); + }; + + vm.init = function(){ + + + //we need to load this somewhere, for now its here. + assetsService.loadCss("lib/ace-razor-mode/theme/razor_chrome.css"); + templateResource.getById($routeParams.id).then(function(template){ + + vm.page.loading = false; + vm.template = template; + + //sync state + editorState.set(vm.template); + navigationService.syncTree({ tree: "templates", path: vm.template.path, forceReload: true }).then(function (syncArgs) { + vm.page.menu.currentNode = syncArgs.node; + }); + + vm.aceOption = { + mode: "razor", + theme: "chrome", + + onLoad: function(_editor) { + vm.editor = _editor; + } + }; + }); + + }; + vm.openPageFieldOverlay = openPageFieldOverlay; vm.openDictionaryItemOverlay = openDictionaryItemOverlay; vm.openQueryBuilderOverlay = openQueryBuilderOverlay; + vm.openMacroOverlay = openMacroOverlay; - function init() { + function openMacroOverlay() { + + vm.macroPickerOverlay = { + view: "macropicker", + dialogData: {}, + show: true, + submit: function(model) { + var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, "Mvc"); + vm.insert(macroObject.syntax); + vm.macroPickerOverlay.show = false; + vm.macroPickerOverlay = null; + } + }; } + function openPageFieldOverlay() { vm.pageFieldOverlay = { view: "mediapicker", @@ -84,7 +133,7 @@ }; } - init(); + vm.init(); } diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index c6244a8035..eeab721902 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -2,7 +2,11 @@ -
+ + @@ -10,65 +14,63 @@ name="vm.template.name" alias="vm.template.alias" hideDescription="true" - hide-icon="true"> + description="vm.template.virtualPath" + menu="vm.page.menu" + hide-icon="false"> - +
+ + + + + + +
- - - - - - - - - - - - - -
+
+ + +
+
+ ng-model="vm.template.content">
+
- + + + + - - - - +
-
+ + + @@ -339,9 +340,11 @@ + + From 2368ea7cf84557a8f572b92569b41f9a70072d65 Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Sun, 12 Jun 2016 18:49:05 +0200 Subject: [PATCH 014/841] Serverside template services --- .../src/common/resources/template.resource.js | 172 ++++++++++++++++++ .../Editors/BackOfficeController.cs | 4 + src/Umbraco.Web/Editors/TemplateController.cs | 110 +++++++++++ .../Models/ContentEditing/TemplateDisplay.cs | 34 ++++ .../Models/Mapping/TemplateModelMapping.cs | 29 +++ 5 files changed, 349 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/common/resources/template.resource.js create mode 100644 src/Umbraco.Web/Editors/TemplateController.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/TemplateDisplay.cs create mode 100644 src/Umbraco.Web/Models/Mapping/TemplateModelMapping.cs diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/template.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/template.resource.js new file mode 100644 index 0000000000..c90bb1766d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/resources/template.resource.js @@ -0,0 +1,172 @@ +/** + * @ngdoc service + * @name umbraco.resources.templateResource + * @description Loads in data for templates + **/ +function templateResource($q, $http, umbDataFormatter, umbRequestHelper) { + + return { + + /** + * @ngdoc method + * @name umbraco.resources.templateResource#getById + * @methodOf umbraco.resources.templateResource + * + * @description + * Gets a template item with a given id + * + * ##usage + *
+         * templateResource.getById(1234)
+         *    .then(function(template) {
+         *        alert('its here!');
+         *    });
+         * 
+ * + * @param {Int} id id of template to retrieve + * @returns {Promise} resourcePromise object. + * + */ + getById: function (id) { + + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "templateApiBaseUrl", + "GetById", + [{ id: id }])), + "Failed to retrieve data for template id " + id); + }, + + /** + * @ngdoc method + * @name umbraco.resources.templateResource#getByName + * @methodOf umbraco.resources.templateResource + * + * @description + * Gets a template item with a given name + * + * ##usage + *
+         * templateResource.getByName("upload")
+         *    .then(function(datatype) {
+         *        alert('its here!');
+         *    });
+         * 
+ * + * @param {String} name Name of template to retrieve + * @returns {Promise} resourcePromise object. + * + */ + getByAlias: function (alias) { + + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "templateApiBaseUrl", + "GetByAlias", + [{ alias: alias }])), + "Failed to retrieve data for template with alias: " + alias); + }, + + getAll: function () { + + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "templateApiBaseUrl", + "GetAll")), + "Failed to retrieve data"); + }, + + + /** + * @ngdoc method + * @name umbraco.resources.contentResource#getScaffold + * @methodOf umbraco.resources.contentResource + * + * @description + * Returns a scaffold of an empty template item + * + * The scaffold is used to build editors for templates that has not yet been populated with data. + * + * ##usage + *
+         * templateResource.getScaffold()
+         *    .then(function(scaffold) {
+         *        var myType = scaffold;
+         *        myType.name = "My new template";
+         *
+         *        templateResource.save(myType, myType.preValues, true)
+         *            .then(function(type){
+         *                alert("Retrieved, updated and saved again");
+         *            });
+         *    });
+         * 
+ * + * @returns {Promise} resourcePromise object containing the template scaffold. + * + */ + getScaffold: function () { + + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "templateApiBaseUrl", + "GetEmpty")), + "Failed to retrieve data for empty template"); + }, + + /** + * @ngdoc method + * @name umbraco.resources.templateResource#deleteById + * @methodOf umbraco.resources.templateResource + * + * @description + * Deletes a template with a given id + * + * ##usage + *
+         * templateResource.deleteById(1234)
+         *    .then(function() {
+         *        alert('its gone!');
+         *    });
+         * 
+ * + * @param {Int} id id of content item to delete + * @returns {Promise} resourcePromise object. + * + */ + deleteById: function(id) { + return umbRequestHelper.resourcePromise( + $http.post( + umbRequestHelper.getApiUrl( + "templateApiBaseUrl", + "DeleteById", + [{ id: id }])), + "Failed to delete item " + id); + }, + + + /** + * @ngdoc method + * @name umbraco.resources.templateResource#save + * @methodOf umbraco.resources.templateResource + * + * @description + * Saves or update a template + * + * @param {Object} template object to create/update + * @returns {Promise} resourcePromise object. + * + */ + save: function (template) { + + return umbRequestHelper.resourcePromise( + $http.post(umbRequestHelper.getApiUrl("templateApiBaseUrl", "PostSave"), template), + "Failed to save data for template id " + template.id); + } + }; +} + +angular.module("umbraco.resources").factory("templateResource", templateResource); diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs index 95e1f7803e..968a047fba 100644 --- a/src/Umbraco.Web/Editors/BackOfficeController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeController.cs @@ -327,6 +327,10 @@ namespace Umbraco.Web.Editors "tagApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl( controller => controller.GetAllTags(null)) }, + { + "templateApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl( + controller => controller.GetById(0)) + }, { "memberTreeBaseUrl", Url.GetUmbracoApiServiceBaseUrl( controller => controller.GetNodes("-1", null)) diff --git a/src/Umbraco.Web/Editors/TemplateController.cs b/src/Umbraco.Web/Editors/TemplateController.cs new file mode 100644 index 0000000000..27b7c67e11 --- /dev/null +++ b/src/Umbraco.Web/Editors/TemplateController.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using System.Web.Http; +using AutoMapper; +using Umbraco.Core.Models; +using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.Mvc; +using Umbraco.Web.WebApi.Filters; +using Constants = Umbraco.Core.Constants; + +namespace Umbraco.Web.Editors +{ + [PluginController("UmbracoApi")] + [UmbracoTreeAuthorize(Constants.Trees.Templates)] + public class TemplateController : UmbracoAuthorizedJsonController + { + /// + /// Gets data type by alias + /// + /// + /// + public TemplateDisplay GetByAlias(string alias) + { + var template = Services.FileService.GetTemplate(alias); + return template == null ? null : Mapper.Map(template); + } + + /// + /// Get all templates + /// + /// + public IEnumerable GetAll() + { + return Services.FileService.GetTemplates().Select(Mapper.Map); + } + + /// + /// Gets the content json for the content id + /// + /// + /// + public TemplateDisplay GetById(int id) + { + var template = Services.FileService.GetTemplate(id); + + if (template == null) + { + throw new HttpResponseException(HttpStatusCode.NotFound); + } + return Mapper.Map(template); + } + + /// + /// Deletes a template wth a given ID + /// + /// + /// + [HttpDelete] + [HttpPost] + public HttpResponseMessage DeleteById(int id) + { + var template = Services.FileService.GetTemplate(id); + if (template == null) + { + throw new HttpResponseException(HttpStatusCode.NotFound); + } + + Services.FileService.DeleteTemplate(template.Alias); + return Request.CreateResponse(HttpStatusCode.OK); + } + + public TemplateDisplay GetEmpty() + { + var dt = new Template("", ""); + return Mapper.Map((ITemplate)dt); + } + + /// + /// Saves the data type + /// + /// + /// + public TemplateDisplay PostSave(TemplateDisplay display) + { + if(display.Id > 0) + { + var template = Services.FileService.GetTemplate(display.Id); + Mapper.Map(display, template); + Services.FileService.SaveTemplate(template); + return display; + } + else + { + //create + ITemplate master = null; + if (string.IsNullOrEmpty(display.MasterTemplateAlias) == false) + master = Services.FileService.GetTemplate(display.MasterTemplateAlias); + + var template = Services.FileService.CreateTemplateWithIdentity(display.Name, display.Content, master); + Mapper.Map(template, display); + return display; + } + } + } +} diff --git a/src/Umbraco.Web/Models/ContentEditing/TemplateDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/TemplateDisplay.cs new file mode 100644 index 0000000000..dacccb8ceb --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/TemplateDisplay.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Umbraco.Web.Models.ContentEditing +{ + [DataContract(Name = "template", Namespace = "")] + public class TemplateDisplay + { + [DataMember(Name = "id")] + public int Id { get; set; } + + [DataMember(Name = "name")] + public string Name { get; set; } + + [DataMember(Name = "alias")] + public string Alias { get; set; } + + [DataMember(Name = "content")] + public string Content { get; set; } + + [DataMember(Name = "path")] + public string Path { get; set; } + + [DataMember(Name = "virtualPath")] + public string VirtualPath { get; set; } + + [DataMember(Name = "masterTemplateAlias")] + public string MasterTemplateAlias { get; set; } + } +} diff --git a/src/Umbraco.Web/Models/Mapping/TemplateModelMapping.cs b/src/Umbraco.Web/Models/Mapping/TemplateModelMapping.cs new file mode 100644 index 0000000000..c4f96b7def --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/TemplateModelMapping.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Mapping; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + internal class TemplateModelMapper : MapperConfiguration + { + public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) + { + config.CreateMap(); + + config.CreateMap() + .ForMember(x => x.Key, exp => exp.Ignore()) + .ForMember(x => x.Path, exp => exp.Ignore()) + .ForMember(x => x.CreateDate, exp => exp.Ignore()) + .ForMember(x => x.UpdateDate, exp => exp.Ignore()) + .ForMember(x => x.VirtualPath, exp => exp.Ignore()) + .ForMember(x => x.Path, exp => exp.Ignore()); + } + } +} From 8a66943f4a3786b86429cc737f010e8bcc8956b6 Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Sun, 12 Jun 2016 18:49:19 +0200 Subject: [PATCH 015/841] Makes template tree load the new angular editor --- src/Umbraco.Web/Trees/TemplatesTreeController.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Umbraco.Web/Trees/TemplatesTreeController.cs b/src/Umbraco.Web/Trees/TemplatesTreeController.cs index 61cff8f862..b99a9ebff3 100644 --- a/src/Umbraco.Web/Trees/TemplatesTreeController.cs +++ b/src/Umbraco.Web/Trees/TemplatesTreeController.cs @@ -52,8 +52,7 @@ namespace Umbraco.Web.Trees queryStrings, template.Name, template.IsMasterTemplate ? "icon-newspaper" : "icon-newspaper-alt", - template.IsMasterTemplate, - GetEditorPath(template, queryStrings)))); + template.IsMasterTemplate))); return nodes; } From a3614fee0dce1e1157bad7eb03d7feff70dd9af9 Mon Sep 17 00:00:00 2001 From: hemraker Date: Mon, 13 Jun 2016 13:08:33 +0200 Subject: [PATCH 016/841] Added ace to gruntFile.js --- src/Umbraco.Web.UI.Client/gruntFile.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/gruntFile.js b/src/Umbraco.Web.UI.Client/gruntFile.js index d5b785c54c..5d92cdbd8e 100644 --- a/src/Umbraco.Web.UI.Client/gruntFile.js +++ b/src/Umbraco.Web.UI.Client/gruntFile.js @@ -394,7 +394,7 @@ module.exports = function (grunt) { tutorials: { src: [], title: '' - } + } }, eslint:{ @@ -519,7 +519,10 @@ module.exports = function (grunt) { 'addon/selection/*', 'addon/dialog/*' ] - } + }, + 'ace-builds': { + files: ['src-min-noconflict/**'] + } } } }, From db2dafd40c19242be871b8d0f2de71c929dcd48b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Jun 2016 15:19:30 +0200 Subject: [PATCH 017/841] make it possible to lock a description in the editor header --- .../components/editor/umbeditorheader.directive.js | 1 + src/Umbraco.Web.UI.Client/src/less/panel.less | 6 ++++++ .../src/views/components/editor/umb-editor-header.html | 4 +++- src/Umbraco.Web.UI.Client/src/views/templates/edit.html | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js index cc57eb6e74..4d9222fa45 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js @@ -254,6 +254,7 @@ Use this directive to construct a header inside the main editor window. hideAlias: "@", description: "=", hideDescription: "@", + descriptionLocked: "@", navigation: "=" }, link: link diff --git a/src/Umbraco.Web.UI.Client/src/less/panel.less b/src/Umbraco.Web.UI.Client/src/less/panel.less index a1776bf12d..09cc6792c0 100644 --- a/src/Umbraco.Web.UI.Client/src/less/panel.less +++ b/src/Umbraco.Web.UI.Client/src/less/panel.less @@ -480,6 +480,12 @@ input.umb-panel-header-description { } } +.umb-panel-header-locked-description { + font-size: 12px; + margin-left: 2px; + margin-top: 3px; +} + .umb-editor-drawer-content { display: flex; align-items: center; diff --git a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html index d610c1bc5b..72a28d8de3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html @@ -43,9 +43,11 @@ class="umb-panel-header-description" localize="placeholder" placeholder="@placeholders_enterDescription" - ng-if="!hideDescription" + ng-if="!hideDescription && !descriptionLocked" ng-model="$parent.description" /> +
{{ description }}
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index eeab721902..9edecde33c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -15,6 +15,7 @@ alias="vm.template.alias" hideDescription="true" description="vm.template.virtualPath" + description-locked="true" menu="vm.page.menu" hide-icon="false"> From e18a668e131599218c83a1256e100f7d316983ce Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Jun 2016 15:22:13 +0200 Subject: [PATCH 018/841] add toolbar --- .../src/views/templates/edit.html | 60 ++++++++++++++----- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 9edecde33c..c73c8f20a6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -22,27 +22,59 @@ -
- - - - - - -
+ -
- - -
- + + + + + + + + + + + + +
- +
From b2ea92940ef5a8d9de9a0e558c9bcd4357a1200c Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Mon, 13 Jun 2016 15:48:47 +0200 Subject: [PATCH 019/841] Moves querybuilder to a overlay --- .../querybuilder/querybuilder.controller.js | 101 +++++++++++++ .../overlays/querybuilder/querybuilder.html | 136 ++++++++++++++++++ 2 files changed, 237 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js new file mode 100644 index 0000000000..1680c4f9d1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js @@ -0,0 +1,101 @@ +angular.module("umbraco").controller('Umbraco.Overlays.QueryBuilderController', + function($scope, $http, dialogService){ + + $http.get("backoffice/UmbracoApi/TemplateQuery/GetAllowedProperties").then(function(response) { + $scope.properties = response.data; + }); + + $http.get("backoffice/UmbracoApi/TemplateQuery/GetContentTypes").then(function (response) { + $scope.contentTypes = response.data; + }); + + $http.get("backoffice/UmbracoApi/TemplateQuery/GetFilterConditions").then(function (response) { + $scope.conditions = response.data; + }); + + + $scope.query = { + contentType: { + name: "Everything" + }, + source:{ + name: "My website" + }, + filters:[ + { + property:undefined, + operator: undefined + } + ], + sort:{ + property:{ + alias: "", + name: "", + }, + direction: "ascending" + } + }; + + + + $scope.chooseSource = function(query){ + dialogService.contentPicker({ + callback: function (data) { + + if (data.id > 0) { + query.source = { id: data.id, name: data.name }; + } else { + query.source.name = "My website"; + delete query.source.id; + } + } + }); + }; + + var throttledFunc = _.throttle(function() { + + $http.post("backoffice/UmbracoApi/TemplateQuery/PostTemplateQuery", $scope.query).then(function (response) { + $scope.model.result = response.data; + }); + + }, 200); + + $scope.$watch("query", function(value) { + throttledFunc(); + }, true); + + $scope.getPropertyOperators = function (property) { + + var conditions = _.filter($scope.conditions, function(condition) { + var index = condition.appliesTo.indexOf(property.type); + return index >= 0; + }); + return conditions; + }; + + + $scope.addFilter = function(query){ + query.filters.push({}); + }; + + $scope.trashFilter = function (query) { + query.filters.splice(query,1); + }; + + $scope.changeSortOrder = function(query){ + if(query.sort.direction === "ascending"){ + query.sort.direction = "descending"; + }else{ + query.sort.direction = "ascending"; + } + }; + + $scope.setSortProperty = function(query, property){ + query.sort.property = property; + if(property.type === "datetime"){ + query.sort.direction = "descending"; + }else{ + query.sort.direction = "ascending"; + } + }; + }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html new file mode 100644 index 0000000000..d18cb3a412 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html @@ -0,0 +1,136 @@ +
+ + + +
+ + + + +

Returns {{model.result.resultCount}} items in {{model.result.executionTime}} miliseconds

+ + + +
+{{model.result.queryExpression}}
+	    
+ +
+
\ No newline at end of file From f17aadccda1fc5f5f6de29d994d982fc892201ac Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Mon, 13 Jun 2016 15:49:00 +0200 Subject: [PATCH 020/841] adds setLayout to the editor --- .../src/views/templates/edit.controller.js | 55 +++++++++++++++++-- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 28244b1a7c..a08303e14d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -68,11 +68,41 @@ }; + + vm.setLayout = function(path){ + + var templateCode = vm.editor.getValue(); + var newValue = path; + var layoutDefRegex = new RegExp("(@{[\\s\\S]*?Layout\\s*?=\\s*?)(\"[^\"]*?\"|null)(;[\\s\\S]*?})", "gi"); + + if (newValue != undefined && newValue != "") { + if (layoutDefRegex.test(templateCode)) { + // Declaration exists, so just update it + templateCode = templateCode.replace(layoutDefRegex, "$1\"" + newValue + "\"$3"); + } else { + // Declaration doesn't exist, so prepend to start of doc + //TODO: Maybe insert at the cursor position, rather than just at the top of the doc? + templateCode = "@{\n\tLayout = \"" + newValue + "\";\n}\n" + templateCode; + } + } else { + if (layoutDefRegex.test(templateCode)) { + // Declaration exists, so just update it + templateCode = templateCode.replace(layoutDefRegex, "$1null$3"); + } + } + + vm.editor.setValue(templateCode); + vm.editor.clearSelection(); + vm.editor.navigateFileStart(); + }; + + vm.openPageFieldOverlay = openPageFieldOverlay; vm.openDictionaryItemOverlay = openDictionaryItemOverlay; vm.openQueryBuilderOverlay = openQueryBuilderOverlay; vm.openMacroOverlay = openMacroOverlay; + function openMacroOverlay() { vm.macroPickerOverlay = { @@ -87,7 +117,6 @@ vm.macroPickerOverlay = null; } }; - } @@ -105,13 +134,17 @@ }; } + function openDictionaryItemOverlay() { vm.dictionaryItemOverlay = { - view: "mediapicker", + view: "treepicker", + dialogOptions: {section: "settings", treeAlias: "dictionary"}, show: true, - submit: function(model) { + submit: function(model) { + console.log(model); }, + close: function(model) { vm.dictionaryItemOverlay.show = false; vm.dictionaryItemOverlay = null; @@ -119,13 +152,27 @@ }; } + function openQueryBuilderOverlay() { vm.queryBuilderOverlay = { - view: "mediapicker", + view: "querybuilder", show: true, + title: "Query for content", + submit: function(model) { + var code = "\n@{\n" + "\tvar selection = " + model.result.queryExpression + ";\n}\n"; + code += "
    \n" + + "\t@foreach(var item in selection){\n" + + "\t\t
  • \n" + + "\t\t\t@item.Name\n" + + "\t\t
  • \n" + + "\t}\n" + + "
\n\n"; + + vm.insert(code); }, + close: function(model) { vm.queryBuilderOverlay.show = false; vm.queryBuilderOverlay = null; From 746072a65dfba345f89d90ca52bd0ebfef957891 Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Mon, 13 Jun 2016 15:49:57 +0200 Subject: [PATCH 021/841] sample use of insert layout --- src/Umbraco.Web.UI.Client/src/views/templates/edit.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index eeab721902..21bb3009ea 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -24,14 +24,14 @@ From 44cde95b47eb877da8ea51a058dc9961d3529d1a Mon Sep 17 00:00:00 2001 From: Lars-Erik Aabech Date: Mon, 13 Jun 2016 16:00:33 +0200 Subject: [PATCH 022/841] organize controller added with list of templates for master selection --- .../dialogs/template/organize.controller.js | 22 +++++++++++++++++++ .../common/dialogs/template/organize.html | 21 ++++++++++++++++++ .../src/views/templates/edit.controller.js | 16 ++++++++++++++ .../src/views/templates/edit.html | 9 ++++++++ 4 files changed, 68 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.html diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.controller.js new file mode 100644 index 0000000000..f1ba776714 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.controller.js @@ -0,0 +1,22 @@ +(function() { + "use strict"; + + function OrganizeController(scope, umbRequestHelper, http) { + var allTemplatesUrl = umbRequestHelper.getApiUrl("templateApiBaseUrl", "GetAll"); + + http.get(allTemplatesUrl) + .then(function(result) { + scope.masterPages = result.data; + }); + } + + angular.module("umbraco") + .controller("Umbraco.Dialogs.Template.OrganizeController", + [ + "$scope", + "umbRequestHelper", + "$http", + OrganizeController + ]); + +}()); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.html new file mode 100644 index 0000000000..ad9f1b8d0e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.html @@ -0,0 +1,21 @@ +
+
+ + +
+ +
\ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 28244b1a7c..ea2eb2167d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -72,6 +72,7 @@ vm.openDictionaryItemOverlay = openDictionaryItemOverlay; vm.openQueryBuilderOverlay = openQueryBuilderOverlay; vm.openMacroOverlay = openMacroOverlay; + vm.openOrganizeOverlay = openOrganizeOverlay; function openMacroOverlay() { @@ -133,6 +134,21 @@ }; } + function openOrganizeOverlay() { + vm.organizeOverlay = { + view: "/umbraco/views/common/dialogs/template/organize.html", + show: true, + template: vm.template, + submit: function(model) { + vm.setLayout(model); + }, + close: function(model) { + vm.organizeOverlay.show = false; + vm.organizeOverlay = null; + } + } + } + vm.init(); } diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index eeab721902..0a9e2c5be4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -28,6 +28,8 @@ + +
@@ -93,4 +95,11 @@ view="vm.queryBuilderOverlay.view"> + + +
From 36aa166a952e4dd20baabf29a36ed10a456f469f Mon Sep 17 00:00:00 2001 From: Jeavon Leopold Date: Mon, 13 Jun 2016 16:16:12 +0200 Subject: [PATCH 023/841] Converters and models to support existing GetPropertyValue and GetPropertyValue code --- .../PublishedContentEnumerable.cs | 61 +++++++++++++++++++ .../PublishedContentExtended.cs | 8 ++- .../PublishedContentTypeConverter.cs | 40 ++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 2 + .../MultiNodeTreePickerPropertyConverter.cs | 5 +- .../MultipleMediaPickerPropertyConverter.cs | 3 +- 6 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 src/Umbraco.Core/Models/PublishedContent/PublishedContentEnumerable.cs create mode 100644 src/Umbraco.Core/PublishedContentTypeConverter.cs diff --git a/src/Umbraco.Core/Models/PublishedContent/PublishedContentEnumerable.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedContentEnumerable.cs new file mode 100644 index 0000000000..8d242cf299 --- /dev/null +++ b/src/Umbraco.Core/Models/PublishedContent/PublishedContentEnumerable.cs @@ -0,0 +1,61 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace Umbraco.Core.Models.PublishedContent +{ + /// + /// The published content enumerable, this model is to allow ToString to be overriden for value converters to support legacy requests for string values + /// + public class PublishedContentEnumerable : IEnumerable + { + /// + /// The items in the collection + /// + private readonly List _items = new List(); + + /// + /// Initializes a new instance of the class. + /// + /// + /// The published content items + /// + public PublishedContentEnumerable(IEnumerable publishedContent) + { + _items.AddRange(publishedContent); + } + + /// + /// The ToString method to convert the objects back to CSV + /// + /// + /// The . + /// + public override string ToString() + { + return string.Join(",", _items.Select(x => x.Id)); + } + + /// + /// The get enumerator. + /// + /// + /// The . + /// + public IEnumerator GetEnumerator() + { + return _items.GetEnumerator(); + } + + /// + /// The get enumerator. + /// + /// + /// The . + /// + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/src/Umbraco.Core/Models/PublishedContent/PublishedContentExtended.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedContentExtended.cs index fef066e0b1..56745ece66 100644 --- a/src/Umbraco.Core/Models/PublishedContent/PublishedContentExtended.cs +++ b/src/Umbraco.Core/Models/PublishedContent/PublishedContentExtended.cs @@ -1,11 +1,12 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; namespace Umbraco.Core.Models.PublishedContent { - + [TypeConverter(typeof(PublishedContentTypeConverter))] public class PublishedContentExtended : PublishedContentWrapped, IPublishedContentExtended { #region Constructor @@ -186,6 +187,11 @@ namespace Umbraco.Core.Models.PublishedContent } #endregion + + public override string ToString() + { + return Id.ToString(); + } } } diff --git a/src/Umbraco.Core/PublishedContentTypeConverter.cs b/src/Umbraco.Core/PublishedContentTypeConverter.cs new file mode 100644 index 0000000000..485ee40f7d --- /dev/null +++ b/src/Umbraco.Core/PublishedContentTypeConverter.cs @@ -0,0 +1,40 @@ +using System; +using System.ComponentModel; +using System.Globalization; +using System.Linq; +using Umbraco.Core.Models; + +namespace Umbraco.Core +{ + public class PublishedContentTypeConverter : TypeConverter + { + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + var convertableTypes = new[] + { + typeof(int) + }; + + return convertableTypes.Any(x => TypeHelper.IsTypeAssignableFrom(x, destinationType)) + || base.CanConvertFrom(context, destinationType); + } + + public override object ConvertTo( + ITypeDescriptorContext context, + CultureInfo culture, + object value, + Type destinationType) + { + var publishedContent = value as IPublishedContent; + if (publishedContent == null) + return null; + + if (TypeHelper.IsTypeAssignableFrom(destinationType)) + { + return publishedContent.Id; + } + + return base.ConvertTo(context, culture, value, destinationType); + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 141622687e..4b2b347924 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -379,6 +379,7 @@ + @@ -483,6 +484,7 @@ + diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs index af72de0cb2..508b3056a6 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs @@ -110,7 +110,10 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters } } - return multiNodeTreePicker.Yield().Where(x => x != null); + var multiNodeTreePickerEnumerable = multiNodeTreePicker.Yield().Where(x => x != null); + + // in v8 should return multiNodeTreePickerEnumerable but for v7 need to return as PublishedContentEnumerable so that string can be returned for legacy compatibility + return new PublishedContentEnumerable(multiNodeTreePickerEnumerable); } return null; diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs index a31e6e2ef4..1b501c31fd 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs @@ -132,7 +132,8 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters multiMediaPicker = umbHelper.TypedMedia(nodeIds).Where(x => x != null); } - return multiMediaPicker; + // in v8 should return multiNodeTreePickerEnumerable but for v7 need to return as PublishedContentEnumerable so that string can be returned for legacy compatibility + return new PublishedContentEnumerable(multiMediaPicker); } // single value picker From 646b3c6efb5cf0e12370cfde1c16bed1a1ab552f Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Mon, 13 Jun 2016 17:22:11 +0200 Subject: [PATCH 024/841] Insert dictionary item dialog Includes a way to override the tree picker as it currently thinks everything is an entity, which it isn't --- .../treepicker/treepicker.controller.js | 12 ++++++++---- .../src/views/templates/edit.controller.js | 17 +++++++++++++++-- .../src/views/templates/edit.html | 7 +++---- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/treepicker/treepicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/treepicker/treepicker.controller.js index e74bfd20a4..21687aafd3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/treepicker/treepicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/treepicker/treepicker.controller.js @@ -206,10 +206,14 @@ angular.module("umbraco").controller("Umbraco.Overlays.TreePickerController", //This is a tree node, so we don't have an entity to pass in, it will need to be looked up //from the server in this method. - select(args.node.name, args.node.id); - - //toggle checked state - args.node.selected = args.node.selected === true ? false : true; + if($scope.model.select){ + $scope.model.select(args.node) + }else{ + select(args.node.name, args.node.id); + //toggle checked state + args.node.selected = args.node.selected === true ? false : true; + } + } } diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index a08303e14d..8bdb755b01 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -138,11 +138,24 @@ function openDictionaryItemOverlay() { vm.dictionaryItemOverlay = { view: "treepicker", - dialogOptions: {section: "settings", treeAlias: "dictionary"}, + section: "settings", + treeAlias: "dictionary", + entityType: "dictionary", + multiPicker: false, + show: true, submit: function(model) { - console.log(model); + + }, + + select: function(node){ + //crappy hack due to dictionary items not in umbracoNode table + var code = "@Umbraco.GetDictionaryValue(\"" + node.name + "\")"; + vm.insert(code); + + vm.dictionaryItemOverlay.show = false; + vm.dictionaryItemOverlay = null; }, close: function(model) { diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index c73c8f20a6..d856c4efb0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -41,10 +41,9 @@
@@ -54,7 +53,7 @@ button-style="link" label="Query Builder" icon="icon-wand" - action="vm.openDictionaryItemOverlay()"> + action="vm.openQueryBuilderOverlay()"> Date: Mon, 13 Jun 2016 17:27:57 +0200 Subject: [PATCH 025/841] Organize dialog can now insert sections, rendersections, renderbody, and select master. Cursor stays where it was before editor was blurred. --- .../dialogs/template/organize.controller.js | 22 ---- .../common/dialogs/template/organize.html | 21 ---- .../overlays/organize/organize.controller.js | 40 ++++++ .../common/overlays/organize/organize.html | 51 ++++++++ .../src/views/templates/edit.controller.js | 116 +++++++++++------- .../src/views/templates/edit.html | 3 +- 6 files changed, 167 insertions(+), 86 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.controller.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.html create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.html diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.controller.js deleted file mode 100644 index f1ba776714..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.controller.js +++ /dev/null @@ -1,22 +0,0 @@ -(function() { - "use strict"; - - function OrganizeController(scope, umbRequestHelper, http) { - var allTemplatesUrl = umbRequestHelper.getApiUrl("templateApiBaseUrl", "GetAll"); - - http.get(allTemplatesUrl) - .then(function(result) { - scope.masterPages = result.data; - }); - } - - angular.module("umbraco") - .controller("Umbraco.Dialogs.Template.OrganizeController", - [ - "$scope", - "umbRequestHelper", - "$http", - OrganizeController - ]); - -}()); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.html deleted file mode 100644 index ad9f1b8d0e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/organize.html +++ /dev/null @@ -1,21 +0,0 @@ -
-
- - -
- -
\ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.controller.js new file mode 100644 index 0000000000..136399c172 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.controller.js @@ -0,0 +1,40 @@ +(function() { + "use strict"; + + function OrganizeController(scope, umbRequestHelper, http) { + var allTemplatesUrl = umbRequestHelper.getApiUrl("templateApiBaseUrl", "GetAll"); + + scope.model.addRenderBody = false; + scope.model.mandatoryRenderSection = false; + scope.masterPage = {}; + + http.get(allTemplatesUrl) + .then(function(result) { + scope.masterPages = result.data; + scope.masterPages.splice(0, + 0, + { + alias: null, + name: "None" + }); + scope.model.masterPage = $.grep(scope.masterPages, + function(mp) { + return mp.alias === scope.model.template.masterPageAlias; + })[0]; + }); + + scope.selectMasterPage = function(masterPage) { + scope.model.masterPage = masterPage; + } + } + + angular.module("umbraco") + .controller("Umbraco.Dialogs.Template.OrganizeController", + [ + "$scope", + "umbRequestHelper", + "$http", + OrganizeController + ]); + +}()); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.html new file mode 100644 index 0000000000..57df7e9556 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.html @@ -0,0 +1,51 @@ +
+ +
+

Master page

+
+ +
+
+ + + +
+
+
+

Child page

+
+ + +
+ +
+
\ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 5a67426e0d..efaa9983e8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -6,24 +6,27 @@ var vm = this; vm.page = {}; vm.page.loading = true; - + //menu vm.page.menu = {}; vm.page.menu.currentSection = appState.getSectionState("currentSection"); vm.page.menu.currentNode = null; - vm.insert = function(str){ + vm.insert = function (str) { + vm.editor.moveCursorToPosition(vm.currentPosition); vm.editor.insert(str); vm.editor.focus(); }; - vm.save = function(){ + vm.currentPosition = { col: 0, row: 0 }; + + vm.save = function () { vm.page.saveButtonState = "busy"; vm.template.content = vm.editor.getValue(); - templateResource.save(vm.template).then(function(saved){ - notificationsService.success("Template saved") + templateResource.save(vm.template).then(function (saved) { + notificationsService.success("Template saved"); vm.page.saveButtonState = "success"; vm.template = saved; @@ -34,42 +37,49 @@ }); - }, function(err){ - notificationsService.error("Template save failed") + }, function (err) { + notificationsService.error("Template save failed"); vm.page.saveButtonState = "error"; }); }; - vm.init = function(){ + function persistCurrentLocation() { + vm.currentPosition = vm.editor.getCursorPosition(); + } + + vm.init = function () { //we need to load this somewhere, for now its here. assetsService.loadCss("lib/ace-razor-mode/theme/razor_chrome.css"); - templateResource.getById($routeParams.id).then(function(template){ - - vm.page.loading = false; - vm.template = template; + templateResource.getById($routeParams.id).then(function (template) { - //sync state - editorState.set(vm.template); - navigationService.syncTree({ tree: "templates", path: vm.template.path, forceReload: true }).then(function (syncArgs) { - vm.page.menu.currentNode = syncArgs.node; - }); + vm.page.loading = false; + vm.template = template; - vm.aceOption = { - mode: "razor", - theme: "chrome", + //sync state + editorState.set(vm.template); + navigationService.syncTree({ tree: "templates", path: vm.template.path, forceReload: true }).then(function (syncArgs) { + vm.page.menu.currentNode = syncArgs.node; + }); - onLoad: function(_editor) { - vm.editor = _editor; + vm.aceOption = { + mode: "razor", + theme: "chrome", + + onLoad: function (_editor) { + vm.editor = _editor; + + vm.editor.on("blur", persistCurrentLocation); + vm.editor.on("focus", persistCurrentLocation); } }; }); }; - - - vm.setLayout = function(path){ + + + vm.setLayout = function (path) { var templateCode = vm.editor.getValue(); var newValue = path; @@ -105,12 +115,12 @@ function openMacroOverlay() { - + vm.macroPickerOverlay = { view: "macropicker", dialogData: {}, show: true, - submit: function(model) { + submit: function (model) { var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, "Mvc"); vm.insert(macroObject.syntax); @@ -120,15 +130,15 @@ }; } - + function openPageFieldOverlay() { vm.pageFieldOverlay = { view: "mediapicker", show: true, - submit: function(model) { + submit: function (model) { }, - close: function(model) { + close: function (model) { vm.pageFieldOverlay.show = false; vm.pageFieldOverlay = null; } @@ -139,28 +149,27 @@ function openDictionaryItemOverlay() { vm.dictionaryItemOverlay = { view: "treepicker", - dialogOptions: {section: "settings", treeAlias: "dictionary"}, + dialogOptions: { section: "settings", treeAlias: "dictionary" }, show: true, - submit: function(model) { + submit: function (model) { console.log(model); }, - close: function(model) { + close: function (model) { vm.dictionaryItemOverlay.show = false; vm.dictionaryItemOverlay = null; } }; } - function openQueryBuilderOverlay() { vm.queryBuilderOverlay = { view: "querybuilder", show: true, title: "Query for content", - - submit: function(model) { + + submit: function (model) { var code = "\n@{\n" + "\tvar selection = " + model.result.queryExpression + ";\n}\n"; code += "
    \n" + @@ -174,7 +183,7 @@ vm.insert(code); }, - close: function(model) { + close: function (model) { vm.queryBuilderOverlay.show = false; vm.queryBuilderOverlay = null; } @@ -183,13 +192,38 @@ function openOrganizeOverlay() { vm.organizeOverlay = { - view: "/umbraco/views/common/dialogs/template/organize.html", + view: "organize", show: true, template: vm.template, - submit: function(model) { - vm.setLayout(model); + submit: function (model) { + if (model.masterPage && model.masterPage.alias) { + vm.template.masterPageAlias = model.masterPage.alias; + vm.setLayout(model.masterPage.alias + ".cshtml"); + } else { + vm.template.masterPageAlias = null; + vm.setLayout(null); + } + + if (model.addRenderBody) { + vm.insert("@RenderBody()"); + } + + if (model.addRenderSection) { + vm.insert("@RenderSection(\"" + + model.renderSectionName + + "\", " + + model.mandatoryRenderSection + + ")"); + } + + if (model.addSection) { + vm.insert("@section " + model.sectionName + "\r\n{\r\n\r\n}\r\n"); + } + + vm.organizeOverlay.show = false; + vm.organizeOverlay = null; }, - close: function(model) { + close: function (model) { vm.organizeOverlay.show = false; vm.organizeOverlay = null; } diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 1a8e93f1eb..137ea8a354 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -45,7 +45,6 @@
  • Value
  • Dictionary
  • Partial
  • -
  • Organize
@@ -63,7 +62,7 @@ button-style="link" label="Organise" icon="icon-layout" - action="vm.openQueryBuilderOverlay()"> + action="vm.openOrganizeOverlay()">
From 1bbcf47d07aac7118461c2983d4eb8b44118c6fb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Jun 2016 18:48:26 +0200 Subject: [PATCH 026/841] add "insert overlay" with insert dictionary item and insert macro --- src/Umbraco.Web.UI.Client/src/less/belle.less | 1 + .../less/components/umb-insert-code-box.less | 28 +++++++ .../overlays/insert/insert.controller.js | 76 +++++++++++++++++++ .../views/common/overlays/insert/insert.html | 41 ++++++++++ .../src/views/templates/edit.controller.js | 41 +++++++++- .../src/views/templates/edit.html | 9 ++- 6 files changed, 192 insertions(+), 4 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html diff --git a/src/Umbraco.Web.UI.Client/src/less/belle.less b/src/Umbraco.Web.UI.Client/src/less/belle.less index 9d01cae4b9..bd4bd1861d 100644 --- a/src/Umbraco.Web.UI.Client/src/less/belle.less +++ b/src/Umbraco.Web.UI.Client/src/less/belle.less @@ -108,6 +108,7 @@ @import "components/umb-empty-state.less"; @import "components/umb-property-editor.less"; @import "components/umb-iconpicker.less"; +@import "components/umb-insert-code-box.less"; @import "components/buttons/umb-button.less"; @import "components/buttons/umb-button-group.less"; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less new file mode 100644 index 0000000000..7bb84dbb41 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less @@ -0,0 +1,28 @@ +.umb-insert-code-boxes { + display: flex; + flex-direction: column; +} + +.umb-insert-code-box { + border: 2px solid @grayLighter; + padding: 15px 20px; + margin-bottom: 10px; + border-radius: 3px; +} + +.umb-insert-code-box:hover, +.umb-insert-code-box.-selected { + border-color: @blue; + cursor: pointer; +} + +.umb-insert-code-box__title { + font-size: 15px; + margin-bottom: 5px; + font-weight: bold; + color: @black; +} + +.umb-insert-code-box__description { + font-size: 11px; +} diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js new file mode 100644 index 0000000000..f2e00fa76c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js @@ -0,0 +1,76 @@ +(function () { + "use strict"; + + function InsertOverlayController($scope) { + + var vm = this; + + if(!$scope.model.title) { + $scope.model.title = "Insert"; + } + + if(!$scope.model.subtitle) { + $scope.model.subtitle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; + } + + vm.openMacroPicker = openMacroPicker; + vm.openDictionaryItemOverlay = openDictionaryItemOverlay; + + + function openMacroPicker() { + + vm.macroPickerOverlay = { + view: "macropicker", + show: true, + dialogData: {}, + submit: function(model) { + + $scope.model.insert = { + "type": "macro", + "macroParams": model.macroParams, + "selectedMacro": model.selectedMacro + }; + + $scope.model.submit($scope.model); + + vm.macroPickerOverlay.show = false; + vm.macroPickerOverlay = null; + + } + }; + + } + + function openDictionaryItemOverlay() { + + vm.dictionaryItemOverlay = { + view: "treepicker", + section: "settings", + treeAlias: "dictionary", + entityType: "dictionary", + multiPicker: false, + show: true, + select: function(node){ + + $scope.model.insert = { + "type": "dictionary", + "node": node + }; + + $scope.model.submit($scope.model); + + vm.dictionaryItemOverlay.show = false; + vm.dictionaryItemOverlay = null; + }, + + close: function(model) { + vm.dictionaryItemOverlay.show = false; + vm.dictionaryItemOverlay = null; + } + }; + } + + } + + angular.module("umbraco").controller("Umbraco.Overlays.InsertOverlay", InsertOverlayController); +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html new file mode 100644 index 0000000000..fdc8368197 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html @@ -0,0 +1,41 @@ +
+ +
+ +
+
Macro
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
+
+ +
+
Value
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
+
+ +
+
Dictionary
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
+
+ +
+
Partial
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
+
+ +
+ + + + + + + +
diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 8bdb755b01..e27ba652ee 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -23,7 +23,7 @@ vm.template.content = vm.editor.getValue(); templateResource.save(vm.template).then(function(saved){ - notificationsService.success("Template saved") + notificationsService.success("Template saved"); vm.page.saveButtonState = "success"; vm.template = saved; @@ -35,7 +35,7 @@ }, function(err){ - notificationsService.error("Template save failed") + notificationsService.error("Template save failed"); vm.page.saveButtonState = "error"; }); }; @@ -75,7 +75,7 @@ var newValue = path; var layoutDefRegex = new RegExp("(@{[\\s\\S]*?Layout\\s*?=\\s*?)(\"[^\"]*?\"|null)(;[\\s\\S]*?})", "gi"); - if (newValue != undefined && newValue != "") { + if (newValue !== undefined && newValue !== "") { if (layoutDefRegex.test(templateCode)) { // Declaration exists, so just update it templateCode = templateCode.replace(layoutDefRegex, "$1\"" + newValue + "\"$3"); @@ -101,6 +101,41 @@ vm.openDictionaryItemOverlay = openDictionaryItemOverlay; vm.openQueryBuilderOverlay = openQueryBuilderOverlay; vm.openMacroOverlay = openMacroOverlay; + vm.openInsertOverlay = openInsertOverlay; + + function openInsertOverlay() { + + vm.insertOverlay = { + view: "insert", + hideSubmitButton: true, + show: true, + submit: function(model) { + + switch(model.insert.type) { + case "macro": + + var macroObject = macroService.collectValueData(model.insert.selectedMacro, model.insert.macroParams, "Mvc"); + vm.insert(macroObject.syntax); + break; + + case "dictionary": + //crappy hack due to dictionary items not in umbracoNode table + var code = "@Umbraco.GetDictionaryValue(\"" + model.insert.node.name + "\")"; + vm.insert(code); + break; + } + + vm.insertOverlay.show = false; + vm.insertOverlay = null; + + }, + close: function(oldModel) { + vm.insertOverlay.show = false; + vm.insertOverlay = null; + } + }; + + } function openMacroOverlay() { diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index d856c4efb0..888ff4c9a5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -33,7 +33,7 @@ button-style="link" label="Insert" icon="icon-add" - action="vm.openDocumentation()"> + action="vm.openInsertOverlay()"> @@ -97,6 +97,13 @@ + + + Date: Mon, 13 Jun 2016 19:02:28 +0200 Subject: [PATCH 027/841] create template tweaks --- .../src/views/templates/edit.controller.js | 49 ++++++++++++------- src/Umbraco.Web/Editors/TemplateController.cs | 12 ++++- .../umbraco/create/templateTasks.cs | 3 +- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index e27ba652ee..47d8177ca8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -45,29 +45,42 @@ //we need to load this somewhere, for now its here. assetsService.loadCss("lib/ace-razor-mode/theme/razor_chrome.css"); - templateResource.getById($routeParams.id).then(function(template){ - - vm.page.loading = false; - vm.template = template; + if($routeParams.create){ - //sync state - editorState.set(vm.template); - navigationService.syncTree({ tree: "templates", path: vm.template.path, forceReload: true }).then(function (syncArgs) { - vm.page.menu.currentNode = syncArgs.node; - }); + templateResource.getScaffold().then(function(template){ + vm.ready(template); + }); - vm.aceOption = { - mode: "razor", - theme: "chrome", + }else{ - onLoad: function(_editor) { - vm.editor = _editor; - } - }; - }); + templateResource.getById($routeParams.id).then(function(template){ + vm.ready(template); + }); + + } }; + vm.ready = function(template){ + vm.page.loading = false; + vm.template = template; + + //sync state + editorState.set(vm.template); + navigationService.syncTree({ tree: "templates", path: vm.template.path, forceReload: true }).then(function (syncArgs) { + vm.page.menu.currentNode = syncArgs.node; + }); + + vm.aceOption = { + mode: "razor", + theme: "chrome", + + onLoad: function(_editor) { + vm.editor = _editor; + } + } + }; + vm.setLayout = function(path){ @@ -188,7 +201,7 @@ //crappy hack due to dictionary items not in umbracoNode table var code = "@Umbraco.GetDictionaryValue(\"" + node.name + "\")"; vm.insert(code); - + vm.dictionaryItemOverlay.show = false; vm.dictionaryItemOverlay = null; }, diff --git a/src/Umbraco.Web/Editors/TemplateController.cs b/src/Umbraco.Web/Editors/TemplateController.cs index 27b7c67e11..d45000155c 100644 --- a/src/Umbraco.Web/Editors/TemplateController.cs +++ b/src/Umbraco.Web/Editors/TemplateController.cs @@ -77,7 +77,17 @@ namespace Umbraco.Web.Editors public TemplateDisplay GetEmpty() { var dt = new Template("", ""); - return Mapper.Map((ITemplate)dt); + var scaffold = Mapper.Map((ITemplate)dt); + scaffold.Path = "-1"; + scaffold.Content = @"@inherits Umbraco.Web.Mvc.UmbracoTemplatePage +@{ + Layout = null; +} + +@* The fun starts here *@ + +"; + return scaffold; } /// diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/create/templateTasks.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/create/templateTasks.cs index bbddcd9de8..8c1cab8e78 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/create/templateTasks.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/create/templateTasks.cs @@ -13,8 +13,7 @@ using umbraco.cms.businesslogic.member; namespace umbraco { public class templateTasks : LegacyDialogTask - { - + { public override bool PerformSave() { var masterId = ParentID; From 93891a6a71e0fe28871a495457ea7f736b2ef6f2 Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Mon, 13 Jun 2016 19:02:53 +0200 Subject: [PATCH 028/841] Make the template tree use the new view for create --- .../Trees/TemplatesTreeController.cs | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web/Trees/TemplatesTreeController.cs b/src/Umbraco.Web/Trees/TemplatesTreeController.cs index b99a9ebff3..04458cbc20 100644 --- a/src/Umbraco.Web/Trees/TemplatesTreeController.cs +++ b/src/Umbraco.Web/Trees/TemplatesTreeController.cs @@ -48,11 +48,13 @@ namespace Umbraco.Web.Trees nodes.AddRange(found.Select(template => CreateTreeNode( template.Id.ToString(CultureInfo.InvariantCulture), //TODO: Fix parent ID stuff for templates - "-1", + "-1", queryStrings, template.Name, template.IsMasterTemplate ? "icon-newspaper" : "icon-newspaper-alt", - template.IsMasterTemplate))); + template.IsMasterTemplate, + GetEditorPath(template, queryStrings) + ))); return nodes; } @@ -66,15 +68,14 @@ namespace Umbraco.Web.Trees protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings) { var menu = new MenuItemCollection(); + //Create the normal create action + var item = menu.Items.Add(ui.Text("actions", ActionNew.Instance.Alias)); + item.NavigateToRoute(string.Format("{0}/templates/edit/{1}?create=true", queryStrings.GetValue("application"), id)); + if (id == Constants.System.Root.ToInvariantString()) { - //Create the normal create action - menu.Items.Add(ui.Text("actions", ActionNew.Instance.Alias)) - //Since we haven't implemented anything for templates in angular, this needs to be converted to - //use the legacy format - .ConvertLegacyMenuItem(null, "inittemplates", queryStrings.GetValue("application")); - + //refresh action menu.Items.Add(ui.Text("actions", ActionRefresh.Instance.Alias), true); @@ -85,12 +86,6 @@ namespace Umbraco.Web.Trees if (template == null) return new MenuItemCollection(); var entity = FromTemplate(template); - //Create the create action for creating sub layouts - menu.Items.Add(ui.Text("actions", ActionNew.Instance.Alias)) - //Since we haven't implemented anything for templates in angular, this needs to be converted to - //use the legacy format - .ConvertLegacyMenuItem(entity, "templates", queryStrings.GetValue("application")); - //don't allow delete if it has child layouts if (template.IsMasterTemplate == false) { @@ -131,8 +126,7 @@ namespace Umbraco.Web.Trees return Services.FileService.DetermineTemplateRenderingEngine(template) == RenderingEngine.WebForms ? "/" + queryStrings.GetValue("application") + "/framed/" + Uri.EscapeDataString("settings/editTemplate.aspx?templateID=" + template.Id) - : "/" + queryStrings.GetValue("application") + "/framed/" + - Uri.EscapeDataString("settings/Views/EditView.aspx?treeType=" + Constants.Trees.Templates + "&templateID=" + template.Id); + : null; } } } From fba91b203c4bc3b57ce2e54467257e74ced323be Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Mon, 13 Jun 2016 19:04:22 +0200 Subject: [PATCH 029/841] merge --- src/Umbraco.Web.UI.Client/src/views/templates/edit.html | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 888ff4c9a5..d856c4efb0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -33,7 +33,7 @@ button-style="link" label="Insert" icon="icon-add" - action="vm.openInsertOverlay()"> + action="vm.openDocumentation()"> @@ -97,13 +97,6 @@ - - - Date: Mon, 13 Jun 2016 19:31:40 +0200 Subject: [PATCH 030/841] Add page field overlay --- .../insertfield/insertfield.controller.js | 176 +++++++++++++++++ .../overlays/insertfield/insertfield.html | 184 ++++++++++++++++++ .../src/views/templates/edit.controller.js | 18 +- .../src/views/templates/edit.html | 10 +- 4 files changed, 376 insertions(+), 12 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js new file mode 100644 index 0000000000..a2463434b9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js @@ -0,0 +1,176 @@ +(function () { + "use strict"; + + function InsertFieldController ($scope, $http, contentTypeResource) { + var vm = this; + + vm.field; + vm.altField; + vm.altText; + vm.insertPreviewTitle = "Modify output"; + vm.insertBefore; + vm.insertAfter; + vm.recursive = false; + vm.properties; + vm.date = false; + vm.dateTime = false; + vm.dateTimeSeparator = ""; + vm.casingUpper = false; + vm.casingLower = false; + vm.encodeHtml = false; + vm.encodeUrl = false; + vm.convertLinebreaks = false; + + vm.showAltField = false; + vm.showAltText = false; + + vm.showInsertPreview = showInsertPreview; + vm.updateInsertPreview = updateInsertPreview; + vm.hideInsertPreview = hideInsertPreview; + vm.updateDate = updateDate; + vm.updateDateTime = updateDateTime; + vm.updateUpper = updateUpper; + vm.updateLower = updateLower; + vm.updateEncodeHtml = updateEncodeHtml; + vm.updateEncodeUrl = updateEncodeUrl; + + contentTypeResource.getAllPropertyTypeAliases().then(function(array) { + vm.properties = array; + }); + + //hide preview by default + function hideInsertPreview () { + $scope.model.itemDetails = null; + } + + //Create preview + function showInsertPreview () { + var previewDetails = {}; + + previewDetails.title = vm.insertPreviewTitle; + + if (!vm.insertBefore && !vm.insertAfter) { + previewDetails.description = $scope.model.umbracoField + } else if (!vm.insertAfter) { + previewDetails.description = vm.insertBefore + ' ' + $scope.model.umbracoField; + } else { + previewDetails.description = vm.insertBefore + ' ' + $scope.model.umbracoField + ' ' + vm.insertAfter; + } + $scope.model.itemDetails = previewDetails; + } + + //Update preview + function updateInsertPreview () { + var previewDetails = $scope.model.itemDetails; + + previewDetails.title = vm.insertPreviewTitle; + + if (!vm.insertBefore && !vm.insertAfter) { + previewDetails.description = ' ' + $scope.model.umbracoField; + } else if (!vm.insertAfter) { + previewDetails.description = vm.insertBefore + ' ' + $scope.model.umbracoField; + } else { + previewDetails.description = vm.insertBefore + ' ' + $scope.model.umbracoField + ' ' + vm.insertAfter; + } + + $scope.model.itemDetails = previewDetails; + } + + // date formatting + function updateDate () { + if (vm.date) { + vm.date = false; + return; + }else { + vm.date = true; + if (vm.dateTime) { + vm.dateTime = false; + } + } + } + + function updateDateTime () { + if (vm.dateTime) { + vm.dateTime = false + } else { + vm.dateTime = true; + if (vm.date) { + vm.date = false; + } + } + } + + // casing + function updateUpper() { + if (vm.casingUpper) { + vm.casingUpper = false; + return; + }else { + vm.casingUpper = true; + if (vm.casingLower) { + vm.casingLower = false; + } + } + } + + function updateLower() { + if (vm.casingLower) { + vm.casingLower = false; + return; + }else { + vm.casingLower = true; + if (vm.casingUpper) { + vm.casingUpper = false; + } + } + } + + // encoding + function updateEncodeHtml() { + if (vm.encodeHtml) { + vm.encodeHtml = false; + return; + }else { + vm.encodeHtml = true; + if (vm.encodeUrl) { + vm.encodeUrl = false; + } + } + } + + function updateEncodeUrl() { + if (vm.encodeUrl) { + vm.encodeUrl = false; + return; + } else { + vm.encodeUrl = true; + if (vm.encodeHtml) { + vm.encodeHtml = false; + } + } + } + + $scope.updatePageField = function() { + var pageField = (vm.field !== undefined ? '@Umbraco.Field("' + vm.field + '"' : "") + + (vm.altField !== undefined ? ', altFieldAlias:"' + vm.altField + '"': "") + + (vm.altText !== undefined ? ', altText:"' + vm.altText + '"' : "") + + (vm.insertBefore !== undefined ? ', insertBefore:"' + vm.insertBefore + '"' : "") + + (vm.insertAfter !== undefined ? ', insertAfter:"' + vm.insertAfter + '"' : "") + + (vm.recursive !== false ? ', recursive: ' + vm.recursive : "") + + (vm.date !== false ? ', formatAsDate: ' + vm.date : "") + + (vm.dateTime !== false ? ', formatAsDateWithTimeSeparator:"' + vm.dateTimeSeparator + '"' : "") + + (vm.casingUpper !== false ? ', casing: ' + "RenderFieldCaseType.Upper" : "") + + (vm.casingLower !== false ? ', casing: ' + "RenderFieldCaseType.Lower" : "") + + (vm.encodeHtml !== false ? ', encoding: ' + "RenderFieldEncodingType.Html" : "") + + (vm.encodeUrl !== false ? ', encoding: ' + "RenderFieldEncodingType.Url" : "") + + (vm.convertLinebreaks !== false ? ', convertLineBreaks: ' + "true" : "") + + (vm.field ? ')' : ""); + $scope.model.umbracoField = pageField; + return pageField; + }; + + + } + + angular.module("umbraco").controller("Umbraco.Overlays.InsertFieldController", InsertFieldController); +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html new file mode 100644 index 0000000000..c96484e0c6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html @@ -0,0 +1,184 @@ + +
+ +
+
+ + + +
+ +
+
+
+ +
+
+ + +
Add alternative field
+ +
+
+ + +
+ + +
+
+
+ + + + + Add default value + + +
+ +
+ + +
+ + +
+
+ +
+ + +
+
+ +

+ + +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ +
+ +
+ + +
+ +
+
+ +
+ +
+
+ +
+ + Date only + Date and time + +
+
+
+ +
+
+ +
+ + Upper + lower +
+
+
+ +
+
+ +
+ + + HTML + + URL + +
+
+
+ + +
+
+ +

+ + +
+
+
+ +
+
+ +

+ +

{{updatePageField()}}

+
+
+
+ + +
+ + + +
diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 28244b1a7c..d59d19762a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -6,7 +6,7 @@ var vm = this; vm.page = {}; vm.page.loading = true; - + //menu vm.page.menu = {}; vm.page.menu.currentSection = appState.getSectionState("currentSection"); @@ -46,7 +46,7 @@ //we need to load this somewhere, for now its here. assetsService.loadCss("lib/ace-razor-mode/theme/razor_chrome.css"); templateResource.getById($routeParams.id).then(function(template){ - + vm.page.loading = false; vm.template = template; @@ -67,14 +67,14 @@ }); }; - + vm.openPageFieldOverlay = openPageFieldOverlay; vm.openDictionaryItemOverlay = openDictionaryItemOverlay; vm.openQueryBuilderOverlay = openQueryBuilderOverlay; vm.openMacroOverlay = openMacroOverlay; function openMacroOverlay() { - + vm.macroPickerOverlay = { view: "macropicker", dialogData: {}, @@ -90,13 +90,17 @@ } - + function openPageFieldOverlay() { vm.pageFieldOverlay = { - view: "mediapicker", + title: "Insert page field", + description: "Insert data in template", + submitButtonLabel: "Insert", + closeButtonlabel: "Cancel", + view: "insertfield", show: true, submit: function(model) { - + vm.insert(model.umbracoField); }, close: function(model) { vm.pageFieldOverlay.show = false; diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index eeab721902..122e615267 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -22,7 +22,7 @@
- + @@ -30,18 +30,18 @@
-
+
-
- +
+
- +
From a29de2f9108c95767b43fcb443c5316d617b71d7 Mon Sep 17 00:00:00 2001 From: hemraker Date: Mon, 13 Jun 2016 19:40:54 +0200 Subject: [PATCH 031/841] Close pageFieldOverlay on submit --- .../src/views/templates/edit.controller.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index e1117e601f..eb164387fd 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -56,7 +56,7 @@ templateResource.getScaffold().then(function(template){ vm.ready(template); - }); + }); }else{ @@ -68,7 +68,7 @@ }; - + vm.ready = function(template){ vm.page.loading = false; vm.template = template; @@ -89,7 +89,7 @@ } }; - + vm.setLayout = function(path){ var templateCode = vm.editor.getValue(); @@ -187,6 +187,8 @@ show: true, submit: function(model) { vm.insert(model.umbracoField); + vm.pageFieldOverlay.show = false; + vm.pageFieldOverlay = null; }, close: function (model) { vm.pageFieldOverlay.show = false; @@ -199,7 +201,7 @@ function openDictionaryItemOverlay() { vm.dictionaryItemOverlay = { view: "treepicker", - section: "settings", + section: "settings", treeAlias: "dictionary", entityType: "dictionary", multiPicker: false, From 221438c5fc9ede2d580222fb0815b725e2d09250 Mon Sep 17 00:00:00 2001 From: hemraker Date: Mon, 13 Jun 2016 19:44:05 +0200 Subject: [PATCH 032/841] Fixe merge confusion --- src/Umbraco.Web.UI.Client/src/views/templates/edit.html | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index d856c4efb0..888ff4c9a5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -33,7 +33,7 @@ button-style="link" label="Insert" icon="icon-add" - action="vm.openDocumentation()"> + action="vm.openInsertOverlay()"> @@ -97,6 +97,13 @@ + + + Date: Mon, 13 Jun 2016 19:58:02 +0200 Subject: [PATCH 033/841] Add page field to overview --- .../overlays/insert/insert.controller.js | 28 +++++++++++++++++++ .../views/common/overlays/insert/insert.html | 9 +++++- .../src/views/templates/edit.controller.js | 3 ++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js index f2e00fa76c..c73aa912a4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js @@ -14,6 +14,7 @@ } vm.openMacroPicker = openMacroPicker; + vm.openPageFieldOverlay = openPageFieldOverlay; vm.openDictionaryItemOverlay = openDictionaryItemOverlay; @@ -41,6 +42,33 @@ } + function openPageFieldOverlay() { + vm.pageFieldOverlay = { + title: "Insert page field", + description: "Insert data in template", + submitButtonLabel: "Insert", + closeButtonlabel: "Cancel", + view: "insertfield", + show: true, + submit: function(model) { + + $scope.model.insert = { + "type": "umbracoField", + "umbracoField": model.umbracoField + }; + + $scope.model.submit($scope.model); + + vm.pageFieldOverlay.show = false; + vm.pageFieldOverlay = null; + }, + close: function (model) { + vm.pageFieldOverlay.show = false; + vm.pageFieldOverlay = null; + } + }; + } + function openDictionaryItemOverlay() { vm.dictionaryItemOverlay = { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html index fdc8368197..a09bb1d41b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html @@ -7,7 +7,7 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
-
+
Value
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
@@ -31,6 +31,13 @@ position="right"> + + + Date: Mon, 13 Jun 2016 20:12:17 +0200 Subject: [PATCH 034/841] Adds partial view picker --- .../views/common/overlays/insert/insert.html | 2 +- .../src/views/templates/edit.controller.js | 43 +++++++++++++++++++ .../src/views/templates/edit.html | 19 +++++++- 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html index fdc8368197..a42f3c6d54 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html @@ -17,7 +17,7 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
-
+
Partial
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 0ef5de0311..2d4704f227 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -124,6 +124,7 @@ vm.openMacroOverlay = openMacroOverlay; vm.openInsertOverlay = openInsertOverlay; vm.openOrganizeOverlay = openOrganizeOverlay; + vm.openPartialOverlay = openPartialOverlay; function openInsertOverlay() { @@ -166,6 +167,8 @@ view: "macropicker", dialogData: {}, show: true, + title: "Insert macro", + submit: function (model) { var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, "Mvc"); @@ -181,6 +184,7 @@ vm.pageFieldOverlay = { view: "mediapicker", show: true, + submit: function (model) { }, @@ -200,6 +204,7 @@ entityType: "dictionary", multiPicker: false, show: true, + title: "Insert dictionary item", select: function(node){ //crappy hack due to dictionary items not in umbracoNode table @@ -221,6 +226,38 @@ }; } + function openPartialOverlay() { + vm.partialItemOverlay = { + view: "treepicker", + section: "settings", + treeAlias: "partialViews", + entityType: "partialView", + multiPicker: false, + show: true, + title: "Insert Partial view", + + select: function(node){ + //crappy hack due to dictionary items not in umbracoNode table + var code = "@Html.Partial(\"" + node.name + "\")"; + vm.insert(code); + + vm.partialItemOverlay.show = false; + vm.partialItemOverlay = null; + }, + + submit: function (model) { + console.log(model); + vm.partialItemOverlay.show = false; + vm.partialItemOverlay = null; + }, + + close: function (model) { + vm.partialItemOverlay.show = false; + vm.partialItemOverlay = null; + } + }; + } + function openQueryBuilderOverlay() { vm.queryBuilderOverlay = { view: "querybuilder", @@ -248,11 +285,15 @@ }; } + function openOrganizeOverlay() { vm.organizeOverlay = { + view: "organize", show: true, template: vm.template, + title: "Organise template", + submit: function (model) { if (model.masterPage && model.masterPage.alias) { vm.template.masterPageAlias = model.masterPage.alias; @@ -281,10 +322,12 @@ vm.organizeOverlay.show = false; vm.organizeOverlay = null; }, + close: function (model) { vm.organizeOverlay.show = false; vm.organizeOverlay = null; } + } } diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index d856c4efb0..32f653ac54 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -44,6 +44,7 @@
  • Value
  • Dictionary
  • Macro
  • +
  • Partial view
  • @@ -56,12 +57,13 @@ action="vm.openQueryBuilderOverlay()"> + + action="vm.openOrganizeOverlay()"> @@ -125,4 +127,19 @@ view="vm.queryBuilderOverlay.view"> + + + + + + + From 3d95c3a74427414104661b80f6b18826b67de6fa Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Mon, 13 Jun 2016 20:35:00 +0200 Subject: [PATCH 035/841] partial view dialog --- .../src/views/templates/edit.html | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 32f653ac54..0c9ce31c35 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -33,7 +33,7 @@ button-style="link" label="Insert" icon="icon-add" - action="vm.openDocumentation()"> + action="vm.openInsertOverlay()"> @@ -134,10 +134,17 @@ position="right"> + + + From 0558fbd7ff331a4668b89ffd6c101d4ff35e3a3a Mon Sep 17 00:00:00 2001 From: Lars-Erik Aabech Date: Mon, 13 Jun 2016 20:51:58 +0200 Subject: [PATCH 036/841] Unit test for template editor. Currently testing that masterpage and layout is set. --- .../template.editor.controller.tests.js | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/test/unit/app/templates/template.editor.controller.tests.js diff --git a/src/Umbraco.Web.UI.Client/test/unit/app/templates/template.editor.controller.tests.js b/src/Umbraco.Web.UI.Client/test/unit/app/templates/template.editor.controller.tests.js new file mode 100644 index 0000000000..a5657bf842 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/test/unit/app/templates/template.editor.controller.tests.js @@ -0,0 +1,127 @@ +/// +/// +/// +/// + +(function() { + "use strict"; + + describe("templates editor controller", + function() { + + + var scope, + controllerFactory, + q, + ace, + controller, + nada = function() {}; + + beforeEach(function() { + angular.module('umbraco.filters', []); + angular.module('umbraco.directives', []); + angular.module('umbraco.resources', []); + angular.module('umbraco.services', []); + angular.module('umbraco.packages', []); + angular.module('umbraco.views', []); + angular.module('ngCookies', []); + angular.module('ngSanitize', []); + angular.module('ngMobile', []); + angular.module('tmh.dynamicLocale', []); + angular.module('ngFileUpload', []); + angular.module('LocalStorageModule', []); + }); + + beforeEach(module("umbraco")); + + beforeEach(inject(function($controller, $rootScope, $q) { + + controllerFactory = $controller; + scope = $rootScope.$new(); + q = $q; + + ace = { + on: function(){} + } + + controller = createController(); + scope.$digest(); + controller.aceOption.onLoad(ace); + + })); + + function resolvedPromise(obj) { + return function() { + var def = q.defer(); + def.resolve(obj); + return def.promise; + } + } + + function createController() { + return controllerFactory("Umbraco.Editors.Templates.EditController", + { + $scope: scope, + $routeParams: {}, + templateResource: { + getById: resolvedPromise({}) + }, + assetsService: { + loadCss: function() {} + }, + notificationsService: { + }, + editorState: { + set: function(){} + }, + navigationService: { + syncTree: resolvedPromise({}) + }, + appState: { + getSectionState : function() { return {}; } + }, + macroService: {} + }); + } + + it("has ace editor", + function () { + expect(controller.editor).toBe(ace); + }); + + it("sets masterpage on template", + function () { + controller.setLayout = function() {}; + + controller.openOrganizeOverlay(); + controller.organizeOverlay.submit({ + masterPage: { + alias: "NewMasterPage" + } + }); + expect(controller.template.masterPageAlias).toBe("NewMasterPage"); + }); + + it("changes layout value when masterpage is selected", + function() { + var newTemplate; + ace.clearSelection = nada; + ace.navigateFileStart = nada; + ace.getValue = function () { + return "@{ Layout = null; }"; + } + ace.setValue = function (value) { + newTemplate = value; + } + + controller.openOrganizeOverlay(); + controller.organizeOverlay.submit({ + masterPage: { + alias: "NewMasterPage" + } + }); + expect(newTemplate).toBe("@{ Layout = \"NewMasterPage.cshtml\"; }"); + }); + }); + +}()); From b853b8e89fc18c440ed0b7f9bceb39040d8065f7 Mon Sep 17 00:00:00 2001 From: Lars-Erik Aabech Date: Tue, 14 Jun 2016 01:03:57 +0200 Subject: [PATCH 037/841] Tests pass with karma. Won't run with R# testrunner without uncommenting stub modules, but breaks running with karma. --- ....js => template-editor-controller.spec.js} | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) rename src/Umbraco.Web.UI.Client/test/unit/app/templates/{template.editor.controller.tests.js => template-editor-controller.spec.js} (82%) diff --git a/src/Umbraco.Web.UI.Client/test/unit/app/templates/template.editor.controller.tests.js b/src/Umbraco.Web.UI.Client/test/unit/app/templates/template-editor-controller.spec.js similarity index 82% rename from src/Umbraco.Web.UI.Client/test/unit/app/templates/template.editor.controller.tests.js rename to src/Umbraco.Web.UI.Client/test/unit/app/templates/template-editor-controller.spec.js index a5657bf842..cb70446bb1 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/app/templates/template.editor.controller.tests.js +++ b/src/Umbraco.Web.UI.Client/test/unit/app/templates/template-editor-controller.spec.js @@ -17,20 +17,21 @@ controller, nada = function() {}; - beforeEach(function() { - angular.module('umbraco.filters', []); - angular.module('umbraco.directives', []); - angular.module('umbraco.resources', []); - angular.module('umbraco.services', []); - angular.module('umbraco.packages', []); - angular.module('umbraco.views', []); - angular.module('ngCookies', []); - angular.module('ngSanitize', []); - angular.module('ngMobile', []); - angular.module('tmh.dynamicLocale', []); - angular.module('ngFileUpload', []); - angular.module('LocalStorageModule', []); - }); + // UNCOMMENT TO RUN WITH RESHARPERS TESTRUNNER FOR JS + //beforeEach(function() { + // angular.module('umbraco.filters', []); + // angular.module('umbraco.directives', []); + // angular.module('umbraco.resources', []); + // angular.module('umbraco.services', []); + // angular.module('umbraco.packages', []); + // angular.module('umbraco.views', []); + // angular.module('ngCookies', []); + // angular.module('ngSanitize', []); + // angular.module('ngMobile', []); + // angular.module('tmh.dynamicLocale', []); + // angular.module('ngFileUpload', []); + // angular.module('LocalStorageModule', []); + //}); beforeEach(module("umbraco")); From 2688e281a781ee80393c1880bbd4e448458b318e Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Tue, 14 Jun 2016 01:07:41 +0200 Subject: [PATCH 038/841] insert partial view dialog --- .../overlays/insert/insert.controller.js | 30 +++++++++++++++++++ .../views/common/overlays/insert/insert.html | 8 +++++ .../src/views/templates/edit.controller.js | 21 +++++++++++-- .../src/views/templates/edit.html | 7 ----- 4 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js index c73aa912a4..1bdc6b778e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js @@ -98,6 +98,36 @@ }; } + function openPartialOverlay() { + vm.partialItemOverlay = { + view: "treepicker", + section: "settings", + treeAlias: "partialViews", + entityType: "partialView", + multiPicker: false, + show: true, + title: "Insert Partial view", + + select: function(node){ + + $scope.model.insert = { + "type": "partial", + "node": node + }; + + $scope.model.submit($scope.model); + + vm.partialItemOverlay.show = false; + vm.partialItemOverlay = null; + }, + + close: function (model) { + vm.partialItemOverlay.show = false; + vm.partialItemOverlay = null; + } + }; + } + } angular.module("umbraco").controller("Umbraco.Overlays.InsertOverlay", InsertOverlayController); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html index cbeb5731c3..4d8fb4a4bd 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html @@ -24,6 +24,7 @@ + + + + diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 3769ce7abb..c60b456a4e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -18,7 +18,6 @@ vm.editor.focus(); }; - vm.currentPosition = { col: 0, row: 0 }; vm.save = function () { vm.page.saveButtonState = "busy"; @@ -85,6 +84,14 @@ onLoad: function(_editor) { vm.editor = _editor; + + //initial cursor placement + vm.editor.navigateFileEnd(); + persistCurrentLocation(); + + //change on blur, focus + vm.editor.on("blur", persistCurrentLocation); + vm.editor.on("focus", persistCurrentLocation); } } }; @@ -146,6 +153,13 @@ var code = "@Umbraco.GetDictionaryValue(\"" + model.insert.node.name + "\")"; vm.insert(code); break; + + case "partial": + //crappy hack due to dictionary items not in umbracoNode table + var code = "@Html.Partial(\"" + model.insert.node.name + "\")"; + vm.insert(code); + break; + case "umbracoField": vm.insert(model.insert.umbracoField); break; @@ -197,7 +211,7 @@ vm.pageFieldOverlay.show = false; vm.pageFieldOverlay = null; }, - + close: function (model) { vm.pageFieldOverlay.show = false; vm.pageFieldOverlay = null; @@ -286,6 +300,9 @@ "\n\n"; vm.insert(code); + + vm.queryBuilderOverlay.show = false; + vm.queryBuilderOverlay = null; }, close: function (model) { diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 2cdc8e6bae..a712f4220d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -141,13 +141,6 @@ position="right"> - - - Date: Tue, 21 Jun 2016 12:49:45 +0100 Subject: [PATCH 039/841] Adding Id to the Related Link model --- src/Umbraco.Web/Models/RelatedLink.cs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/Models/RelatedLink.cs b/src/Umbraco.Web/Models/RelatedLink.cs index 145ca6ea7d..c6f786e6fe 100644 --- a/src/Umbraco.Web/Models/RelatedLink.cs +++ b/src/Umbraco.Web/Models/RelatedLink.cs @@ -125,7 +125,7 @@ namespace Umbraco.Web.Models { if (Enum.TryParse(this._linkItem.Value("type"), true, out this._type)) { - return this._type; + return this._type; } return null; @@ -157,7 +157,7 @@ namespace Umbraco.Web.Models else { this._linkDeleted = false; - } + } } else { @@ -169,6 +169,22 @@ namespace Umbraco.Web.Models } } + /// + /// Gets the id of the umbraco node if the link type is internal + /// + public int? Id + { + get + { + if (this.IsInternal) + { + return this._linkItem.Value("internal"); + } + + return null; + } + } + /// /// Gets a value indicating whether deleted. /// From 3b31b92f1fbe56238b7e7217ba72ac74cb0a8c3e Mon Sep 17 00:00:00 2001 From: Jeavon Date: Tue, 21 Jun 2016 15:20:17 +0100 Subject: [PATCH 040/841] Adding a type converter for RelatedLinks so that implementations using JArray (from official docs) still work (e.g. Model.Content.GetPropertyValue("relatedLinks")) --- src/Umbraco.Web/Models/RelatedLinks.cs | 10 +++ src/Umbraco.Web/RelatedLinksTypeConverter.cs | 67 ++++++++++++++++++++ src/Umbraco.Web/Umbraco.Web.csproj | 1 + 3 files changed, 78 insertions(+) create mode 100644 src/Umbraco.Web/RelatedLinksTypeConverter.cs diff --git a/src/Umbraco.Web/Models/RelatedLinks.cs b/src/Umbraco.Web/Models/RelatedLinks.cs index 60d2ef03b5..67d888245d 100644 --- a/src/Umbraco.Web/Models/RelatedLinks.cs +++ b/src/Umbraco.Web/Models/RelatedLinks.cs @@ -9,6 +9,7 @@ using System.Collections; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -19,6 +20,7 @@ namespace Umbraco.Web.Models /// /// The related links model /// + [TypeConverter(typeof(RelatedLinksTypeConverter))] public class RelatedLinks : IEnumerable { // ReSharper disable InconsistentNaming @@ -106,5 +108,13 @@ namespace Umbraco.Web.Models { return this.GetEnumerator(); } + + /// + /// Ensure that json is returned if a string conversion is requested + /// + public override string ToString() + { + return _propertyData; + } } } diff --git a/src/Umbraco.Web/RelatedLinksTypeConverter.cs b/src/Umbraco.Web/RelatedLinksTypeConverter.cs new file mode 100644 index 0000000000..c3c765133a --- /dev/null +++ b/src/Umbraco.Web/RelatedLinksTypeConverter.cs @@ -0,0 +1,67 @@ +using System; +using System.ComponentModel; +using System.Globalization; +using System.Linq; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +using Umbraco.Core; +using Umbraco.Web.Models; + +namespace Umbraco.Web +{ + public class RelatedLinksTypeConverter : TypeConverter + { + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + var convertableTypes = new[] + { + typeof(JArray) + }; + + return convertableTypes.Any(x => TypeHelper.IsTypeAssignableFrom(x, destinationType)) + || base.CanConvertFrom(context, destinationType); + } + + public override object ConvertTo( + ITypeDescriptorContext context, + CultureInfo culture, + object value, + Type destinationType) + { + var relatedLinks = value as RelatedLinks; + if (relatedLinks == null) + return null; + + if (TypeHelper.IsTypeAssignableFrom(destinationType)) + { + // Conversion to JArray taken from old value converter + + var obj = JsonConvert.DeserializeObject(relatedLinks.PropertyData); + //update the internal links if we have a context + if (UmbracoContext.Current != null) + { + var helper = new UmbracoHelper(UmbracoContext.Current); + foreach (var a in obj) + { + var type = a.Value("type"); + if (type.IsNullOrWhiteSpace() == false) + { + if (type == "internal") + { + var linkId = a.Value("link"); + var link = helper.NiceUrl(linkId); + a["link"] = link; + } + } + } + } + return obj; + + } + + return base.ConvertTo(context, culture, value, destinationType); + } + } +} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 6d44805856..c2c8ec857d 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -365,6 +365,7 @@ + From 927f48985eaa85f6550b59006053dc17c802f58f Mon Sep 17 00:00:00 2001 From: Jeavon Date: Wed, 3 Aug 2016 20:45:01 +0100 Subject: [PATCH 041/841] Latest updates from Core Value Converters package including massive simplification of RelatedLinks and exclusion of special property aliases in MNTP --- src/Umbraco.Web/Models/RelatedLink.cs | 195 +----------------- src/Umbraco.Web/Models/RelatedLinkBase.cs | 27 +++ src/Umbraco.Web/Models/RelatedLinkData.cs | 25 +++ src/Umbraco.Web/Models/RelatedLinkType.cs | 2 +- src/Umbraco.Web/Models/RelatedLinks.cs | 82 +------- .../MultiNodeTreePickerPropertyConverter.cs | 52 +++-- .../RelatedLinksEditorValueConvertor.cs | 56 ++++- src/Umbraco.Web/Umbraco.Web.csproj | 2 + 8 files changed, 158 insertions(+), 283 deletions(-) create mode 100644 src/Umbraco.Web/Models/RelatedLinkBase.cs create mode 100644 src/Umbraco.Web/Models/RelatedLinkData.cs diff --git a/src/Umbraco.Web/Models/RelatedLink.cs b/src/Umbraco.Web/Models/RelatedLink.cs index c6f786e6fe..2c57fb3337 100644 --- a/src/Umbraco.Web/Models/RelatedLink.cs +++ b/src/Umbraco.Web/Models/RelatedLink.cs @@ -7,194 +7,11 @@ //
    // -------------------------------------------------------------------------------------------------------------------- -using System; -using Newtonsoft.Json.Linq; - -namespace Umbraco.Web.Models +namespace Umbraco.Web.Models { - /// - /// The related link model - /// - public class RelatedLink - { - // ReSharper disable InconsistentNaming - - /// - /// The _link item. - /// - private readonly JToken _linkItem; - - /// - /// The _caption. - /// - private string _caption; - - /// - /// The _new window. - /// - private bool? _newWindow; - - /// - /// The _is internal. - /// - private bool? _isInternal; - - /// - /// The _link. - /// - private string _link; - - /// - /// The _linkDeleted. - /// - private bool? _linkDeleted; - - /// - /// The _type. - /// - private RelatedLinkType _type; - - /// - /// Initializes a new instance of the class. - /// - /// - /// The link item. - /// - public RelatedLink(JToken linkItem) - { - this._linkItem = linkItem; - - // get the current Link to set the _linkDeleted is a internal link - var currentLink = this.Link; - } - - /// - /// Gets the caption. - /// - public string Caption - { - get - { - if (string.IsNullOrEmpty(this._caption)) - { - this._caption = this._linkItem.Value("caption"); - } - - return this._caption; - } - } - - /// - /// Gets a value indicating whether new window. - /// - public bool NewWindow - { - get - { - if (this._newWindow == null) - { - this._newWindow = this._linkItem.Value("newWindow"); - } - - return this._newWindow.GetValueOrDefault(); - } - } - - /// - /// Gets a value indicating whether the link is internal. - /// - public bool IsInternal - { - get - { - if (this._isInternal == null) - { - this._isInternal = this._linkItem.Value("isInternal"); - } - - return this._isInternal.GetValueOrDefault(); - } - } - - /// - /// Gets the type. - /// - public RelatedLinkType? Type - { - get - { - if (Enum.TryParse(this._linkItem.Value("type"), true, out this._type)) - { - return this._type; - } - - return null; - } - } - - /// - /// Gets the link. - /// - public string Link - { - get - { - if (string.IsNullOrEmpty(this._link)) - { - if (this.IsInternal) - { - if (UmbracoContext.Current == null) - { - return null; - } - - this._link = UmbracoContext.Current.UrlProvider.GetUrl(this._linkItem.Value("internal")); - if (this._link.Equals("#")) - { - this._linkDeleted = true; - this._link = this._linkItem.Value("internal"); - } - else - { - this._linkDeleted = false; - } - } - else - { - this._link = this._linkItem.Value("link"); - } - } - - return this._link; - } - } - - /// - /// Gets the id of the umbraco node if the link type is internal - /// - public int? Id - { - get - { - if (this.IsInternal) - { - return this._linkItem.Value("internal"); - } - - return null; - } - } - - /// - /// Gets a value indicating whether deleted. - /// - internal bool InternalLinkDeleted - { - get - { - var linkDeleted = this._linkDeleted; - return linkDeleted != null && (bool)linkDeleted; - } - } - } + public class RelatedLink : RelatedLinkBase + { + public int? Id { get; internal set; } + internal bool IsDeleted { get; set; } + } } diff --git a/src/Umbraco.Web/Models/RelatedLinkBase.cs b/src/Umbraco.Web/Models/RelatedLinkBase.cs new file mode 100644 index 0000000000..f40f2d939d --- /dev/null +++ b/src/Umbraco.Web/Models/RelatedLinkBase.cs @@ -0,0 +1,27 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Umbraco +// +// +// Defines the RelatedLink base type. +// +// -------------------------------------------------------------------------------------------------------------------- + +using Newtonsoft.Json; + +namespace Umbraco.Web.Models +{ + public class RelatedLinkBase + { + [JsonProperty("caption")] + public string Caption { get; set; } + [JsonProperty("link")] + public string Link { get; set; } + [JsonProperty("newWindow")] + public bool NewWindow { get; set; } + [JsonProperty("isInternal")] + public bool IsInternal { get; set; } + [JsonProperty("type")] + public RelatedLinkType Type { get; set; } + } +} diff --git a/src/Umbraco.Web/Models/RelatedLinkData.cs b/src/Umbraco.Web/Models/RelatedLinkData.cs new file mode 100644 index 0000000000..9bb341346c --- /dev/null +++ b/src/Umbraco.Web/Models/RelatedLinkData.cs @@ -0,0 +1,25 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Umbraco +// +// +// Defines the RelatedLink json data type. +// +// -------------------------------------------------------------------------------------------------------------------- + +using Newtonsoft.Json; + +namespace Umbraco.Web.Models +{ + public class RelatedLinkData : RelatedLinkBase + { + [JsonProperty("internal")] + public int? Internal { get; set; } + [JsonProperty("edit")] + public bool Edit { get; set; } + [JsonProperty("internalName")] + public string InternalName { get; set; } + [JsonProperty("title")] + public string Title { get; set; } + } +} diff --git a/src/Umbraco.Web/Models/RelatedLinkType.cs b/src/Umbraco.Web/Models/RelatedLinkType.cs index 8de88d5520..eec7817ab6 100644 --- a/src/Umbraco.Web/Models/RelatedLinkType.cs +++ b/src/Umbraco.Web/Models/RelatedLinkType.cs @@ -22,6 +22,6 @@ namespace Umbraco.Web.Models /// /// External link type /// - External + External } } diff --git a/src/Umbraco.Web/Models/RelatedLinks.cs b/src/Umbraco.Web/Models/RelatedLinks.cs index 67d888245d..4585f2f291 100644 --- a/src/Umbraco.Web/Models/RelatedLinks.cs +++ b/src/Umbraco.Web/Models/RelatedLinks.cs @@ -7,68 +7,30 @@ //
    // -------------------------------------------------------------------------------------------------------------------- -using System.Collections; +using System.Collections; using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Umbraco.Core.Logging; +using System.ComponentModel; +using System.Linq; namespace Umbraco.Web.Models { - /// - /// The related links model - /// [TypeConverter(typeof(RelatedLinksTypeConverter))] public class RelatedLinks : IEnumerable { - // ReSharper disable InconsistentNaming - - /// - /// The _property data. - /// private readonly string _propertyData; - /// - /// The _related links. - /// - private readonly List _relatedLinks = new List(); + private readonly List _relatedLinks; - /// - /// Initializes a new instance of the class. - /// - /// - /// The property data. - /// - public RelatedLinks(string propertyData) + public RelatedLinks(List relatedLinks, string propertyData) { - this._propertyData = propertyData; - - if (!string.IsNullOrEmpty(propertyData)) - { - var relatedLinks = JsonConvert.DeserializeObject(propertyData); - - foreach (var item in relatedLinks) - { - var relatedLink = new RelatedLink(item); - if (!relatedLink.InternalLinkDeleted) - { - this._relatedLinks.Add(relatedLink); - } - else - { - LogHelper.Warn( - string.Format("Related Links value converter skipped a link as the node has been unpublished/deleted (Internal Link NodeId: {0}, Link Caption: \"{1}\")", relatedLink.Link, relatedLink.Caption)); - } - } - } + _relatedLinks = relatedLinks; + _propertyData = propertyData; } /// /// Gets the property data. /// - public string PropertyData + internal string PropertyData { get { @@ -76,45 +38,19 @@ namespace Umbraco.Web.Models } } - /// - /// The any. - /// - /// - /// The . - /// public bool Any() { return Enumerable.Any(this); } - /// - /// The get enumerator. - /// - /// - /// The . - /// public IEnumerator GetEnumerator() { - return this._relatedLinks.GetEnumerator(); + return _relatedLinks.GetEnumerator(); } - /// - /// The get enumerator. - /// - /// - /// The . - /// IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } - - /// - /// Ensure that json is returned if a string conversion is requested - /// - public override string ToString() - { - return _propertyData; - } } } diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs index 508b3056a6..8ff03faf8c 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using Umbraco.Core; using Umbraco.Core.Models; @@ -23,6 +24,15 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters /// public class MultiNodeTreePickerPropertyConverter : PropertyValueConverterBase, IPropertyValueConverterMeta { + /// + /// The properties to exclude. + /// + private static readonly List PropertiesToExclude = new List() + { + Constants.Conventions.Content.InternalRedirectId.ToLower(CultureInfo.InvariantCulture), + Constants.Conventions.Content.Redirect.ToLower(CultureInfo.InvariantCulture) + }; + /// /// Checks if this converter can convert the property editor and registers if it can. /// @@ -85,38 +95,42 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters return null; } - var nodeIds = (int[])source; - - var multiNodeTreePicker = new List(); - if (UmbracoContext.Current != null) { - var umbHelper = new UmbracoHelper(UmbracoContext.Current); + var nodeIds = (int[])source; - if (nodeIds.Length > 0) + if ((propertyType.PropertyTypeAlias != null && PropertiesToExclude.InvariantContains(propertyType.PropertyTypeAlias)) == false) { - var objectType = UmbracoObjectTypes.Unknown; + var multiNodeTreePicker = new List(); - foreach (var nodeId in nodeIds) + var umbHelper = new UmbracoHelper(UmbracoContext.Current); + + if (nodeIds.Length > 0) { - var multiNodeTreePickerItem = GetPublishedContent(nodeId, ref objectType, UmbracoObjectTypes.Document, umbHelper.TypedContent) - ?? GetPublishedContent(nodeId, ref objectType, UmbracoObjectTypes.Media, umbHelper.TypedMedia) - ?? GetPublishedContent(nodeId, ref objectType, UmbracoObjectTypes.Member, umbHelper.TypedMember); + var objectType = UmbracoObjectTypes.Unknown; - if (multiNodeTreePickerItem != null) + foreach (var nodeId in nodeIds) { - multiNodeTreePicker.Add(multiNodeTreePickerItem); + var multiNodeTreePickerItem = GetPublishedContent(nodeId, ref objectType, UmbracoObjectTypes.Document, umbHelper.TypedContent) + ?? GetPublishedContent(nodeId, ref objectType, UmbracoObjectTypes.Media, umbHelper.TypedMedia) + ?? GetPublishedContent(nodeId, ref objectType, UmbracoObjectTypes.Member, umbHelper.TypedMember); + + if (multiNodeTreePickerItem != null) + { + multiNodeTreePicker.Add(multiNodeTreePickerItem); + } } } + return multiNodeTreePicker.Yield().Where(x => x != null); } - var multiNodeTreePickerEnumerable = multiNodeTreePicker.Yield().Where(x => x != null); - - // in v8 should return multiNodeTreePickerEnumerable but for v7 need to return as PublishedContentEnumerable so that string can be returned for legacy compatibility - return new PublishedContentEnumerable(multiNodeTreePickerEnumerable); + // return the first nodeId as this is one of the excluded properties that expects a single id + return nodeIds.FirstOrDefault(); + } + else + { + return null; } - - return null; } /// diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs index 5df37ebfb9..906dd95f2c 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs @@ -7,7 +7,10 @@ // // -------------------------------------------------------------------------------------------------------------------- +using System.Collections.Generic; +using Newtonsoft.Json; using Umbraco.Core; +using Umbraco.Core.Logging; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; using Umbraco.Web.Models; @@ -59,7 +62,58 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters var sourceString = source.ToString(); - return UmbracoContext.Current != null ? new RelatedLinks(sourceString) : null; + var relatedLinksData = JsonConvert.DeserializeObject>(sourceString); + var relatedLinks = new List(); + + foreach (var linkData in relatedLinksData) + { + var relatedLink = new RelatedLink() + { + Caption = linkData.Caption, + NewWindow = linkData.NewWindow, + IsInternal = linkData.IsInternal, + Type = linkData.Type, + Id = linkData.Internal, + Link = linkData.Link + }; + relatedLink = CreateLink(relatedLink); + + if (relatedLink.IsDeleted == false) + { + relatedLinks.Add(relatedLink); + } + else + { + LogHelper.Warn( + string.Format("Related Links value converter skipped a link as the node has been unpublished/deleted (Internal Link NodeId: {0}, Link Caption: \"{1}\")", relatedLink.Link, relatedLink.Caption)); + } + } + + return new RelatedLinks(relatedLinks, sourceString); + } + + private RelatedLink CreateLink(RelatedLink link) + { + if (link.IsInternal && link.Id != null) + { + if (UmbracoContext.Current == null) + { + return null; + } + + link.Link = UmbracoContext.Current.UrlProvider.GetUrl((int)link.Id); + if (link.Link.Equals("#")) + { + link.IsDeleted = true; + link.Link = link.Id.ToString(); + } + else + { + link.IsDeleted = false; + } + } + + return link; } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index c2c8ec857d..3cb0f26045 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -343,6 +343,8 @@ + + From bd6e2477b521ff16fde5fe9b50f6c74ad18c8850 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 18 Aug 2016 13:02:52 +0200 Subject: [PATCH 042/841] Post-merge --- .../FileUploadPropertyEditor.cs | 81 ++++++++----------- .../ImageCropperPropertyEditor.cs | 79 ++++++++---------- 2 files changed, 64 insertions(+), 96 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs index 543cf708ee..616c814731 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Drawing; -using System.IO; using System.Linq; using Newtonsoft.Json.Linq; using Umbraco.Core; @@ -16,7 +14,6 @@ namespace Umbraco.Web.PropertyEditors [PropertyEditor(Constants.PropertyEditors.UploadFieldAlias, "File upload", "fileupload", Icon = "icon-download-alt", Group = "media")] public class FileUploadPropertyEditor : PropertyEditor, IApplicationEventHandler { - /// /// Creates the corresponding property value editor. /// @@ -238,12 +235,9 @@ namespace Umbraco.Web.PropertyEditors } } } + #region Application event handler, used to bind to events on startup - // fixme - er? - - private readonly FileUploadPropertyEditorApplicationStartup _applicationStartup = new FileUploadPropertyEditorApplicationStartup(); - // The FileUploadPropertyEditor properties own files and as such must manage these files, // so we are binding to events in order to make sure that // - files are deleted when the owning content/media is @@ -264,56 +258,45 @@ namespace Umbraco.Web.PropertyEditors // - auto-fill properties are not supported for content items // - auto-fill runs on MediaService.Created which makes no sense (no properties yet) - /// - /// we're using a sub -class because this has the logic to prevent it from executing if the application is not configured - /// - private class FileUploadPropertyEditorApplicationStartup : ApplicationEventHandler - { - /// - /// We're going to bind to the MediaService Saving event so that we can populate the umbracoFile size, type, etc... label fields - /// if we find any attached to the current media item. - /// - protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) - { - MediaService.Created += MediaServiceCreated; // see above - makes no sense - MediaService.Saving += MediaServiceSaving; - //MediaService.Copied += MediaServiceCopied; // see above - missing - - ContentService.Copied += ContentServiceCopied; - //ContentService.Saving += ContentServiceSaving; // see above - missing - MediaService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( - GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); - - MediaService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( - GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); - - ContentService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( - GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); - - ContentService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( - GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); - - MemberService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( - GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); - } - } - public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { - //wrap - _applicationStartup.OnApplicationInitialized(umbracoApplication, applicationContext); + // nothing } + public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { - //wrap - _applicationStartup.OnApplicationStarting(umbracoApplication, applicationContext); + // nothing } + public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { - //wrap - _applicationStartup.OnApplicationStarted(umbracoApplication, applicationContext); - } - #endregion + // only if the app is configured + // see ApplicationEventHandler.ShouldExecute + if (applicationContext.IsConfigured == false || applicationContext.DatabaseContext.IsDatabaseConfigured == false) + return; + MediaService.Created += MediaServiceCreated; // see above - makes no sense + MediaService.Saving += MediaServiceSaving; + //MediaService.Copied += MediaServiceCopied; // see above - missing + + ContentService.Copied += ContentServiceCopied; + //ContentService.Saving += ContentServiceSaving; // see above - missing + MediaService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); + + MediaService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( + GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); + + ContentService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); + + ContentService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( + GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); + + MemberService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); + } + + #endregion } } diff --git a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs index fe6139978b..9b9974c705 100644 --- a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs @@ -2,7 +2,6 @@ using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; -using System.IO; using System.Linq; using Umbraco.Core; using Umbraco.Core.Logging; @@ -16,9 +15,9 @@ namespace Umbraco.Web.PropertyEditors [PropertyEditor(Constants.PropertyEditors.ImageCropperAlias, "Image Cropper", "imagecropper", ValueType = PropertyEditorValueTypes.Json, HideLabel = false, Group="media", Icon="icon-crop")] public class ImageCropperPropertyEditor : PropertyEditor, IApplicationEventHandler { - // preValues private IDictionary _internalPreValues; + public override IDictionary DefaultPreValues { get { return _internalPreValues; } @@ -233,10 +232,6 @@ namespace Umbraco.Web.PropertyEditors #region Application event handler, used to bind to events on startup - // fixme - er? - - private readonly FileUploadPropertyEditorApplicationStartup _applicationStartup = new FileUploadPropertyEditorApplicationStartup(); - // The ImageCropperPropertyEditor properties own files and as such must manage these files, // so we are binding to events in order to make sure that // - files are deleted when the owning content/media is @@ -257,56 +252,46 @@ namespace Umbraco.Web.PropertyEditors // - auto-fill properties are not supported for content items // - auto-fill runs on MediaService.Created which makes no sense (no properties yet) - /// - /// we're using a sub -class because this has the logic to prevent it from executing if the application is not configured - /// - private class FileUploadPropertyEditorApplicationStartup : ApplicationEventHandler - { - /// - /// We're going to bind to the MediaService Saving event so that we can populate the umbracoFile size, type, etc... label fields - /// if we find any attached to the current media item. - /// - protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) - { - MediaService.Created += MediaServiceCreated; // see above - makes no sense - MediaService.Saving += MediaServiceSaving; - //MediaService.Copied += MediaServiceCopied; // see above - missing - - ContentService.Copied += ContentServiceCopied; - //ContentService.Saving += ContentServiceSaving; // see above - missing - - MediaService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( - GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); - - MediaService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( - GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); - - ContentService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( - GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); - - ContentService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( - GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); - - MemberService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( - GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); - } - } - public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { - //wrap - _applicationStartup.OnApplicationInitialized(umbracoApplication, applicationContext); + // nothing } + public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { - //wrap - _applicationStartup.OnApplicationStarting(umbracoApplication, applicationContext); + // nothing } + public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { - //wrap - _applicationStartup.OnApplicationStarted(umbracoApplication, applicationContext); + // only if the app is configured + // see ApplicationEventHandler.ShouldExecute + if (applicationContext.IsConfigured == false || applicationContext.DatabaseContext.IsDatabaseConfigured == false) + return; + + MediaService.Created += MediaServiceCreated; // see above - makes no sense + MediaService.Saving += MediaServiceSaving; + //MediaService.Copied += MediaServiceCopied; // see above - missing + + ContentService.Copied += ContentServiceCopied; + //ContentService.Saving += ContentServiceSaving; // see above - missing + + MediaService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); + + MediaService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( + GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); + + ContentService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); + + ContentService.EmptiedRecycleBin += (sender, args) => args.Files.AddRange( + GetFilesToDelete(args.AllPropertyData.SelectMany(x => x.Value))); + + MemberService.Deleted += (sender, args) => args.MediaFilesToDelete.AddRange( + GetFilesToDelete(args.DeletedEntities.SelectMany(x => x.Properties))); } + #endregion } } From bb81298e841d59406c5a809e29b29fc965c26087 Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 23 Aug 2016 09:40:02 +0200 Subject: [PATCH 043/841] Temp - 7.6.0-alpha002 + internals visible to deploy --- src/SolutionInfo.cs | 4 ++-- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 4 ++-- src/Umbraco.Core/Properties/AssemblyInfo.cs | 5 ++++- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 4 ++-- src/Umbraco.Web/Properties/AssemblyInfo.cs | 5 ++++- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index caeb303f68..586daa3f3d 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -11,5 +11,5 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyFileVersion("7.5.0")] -[assembly: AssemblyInformationalVersion("7.5.0")] \ No newline at end of file +[assembly: AssemblyFileVersion("7.6.0")] +[assembly: AssemblyInformationalVersion("7.6.0-alpha002")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index 762d3da59c..cbf7f27339 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration { public class UmbracoVersion { - private static readonly Version Version = new Version("7.5.0"); + private static readonly Version Version = new Version("7.6.0"); /// /// Gets the current version of Umbraco. @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return ""; } } + public static string CurrentComment { get { return "alpha002"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx diff --git a/src/Umbraco.Core/Properties/AssemblyInfo.cs b/src/Umbraco.Core/Properties/AssemblyInfo.cs index d1ddadde37..5269c3ba56 100644 --- a/src/Umbraco.Core/Properties/AssemblyInfo.cs +++ b/src/Umbraco.Core/Properties/AssemblyInfo.cs @@ -44,4 +44,7 @@ using System.Security.Permissions; [assembly: InternalsVisibleTo("umbraco.providers")] //allow this to be mocked in our unit tests -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] \ No newline at end of file +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] + +// temp while we develop Deploy +[assembly: InternalsVisibleTo("Umbraco.Deploy")] \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 008fce3a35..1366195b69 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -2413,9 +2413,9 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\" True True - 7500 + 7600 / - http://localhost:7500 + http://localhost:7600 False False diff --git a/src/Umbraco.Web/Properties/AssemblyInfo.cs b/src/Umbraco.Web/Properties/AssemblyInfo.cs index 89499b833e..5acad4888e 100644 --- a/src/Umbraco.Web/Properties/AssemblyInfo.cs +++ b/src/Umbraco.Web/Properties/AssemblyInfo.cs @@ -37,4 +37,7 @@ using System.Security; [assembly: InternalsVisibleTo("Umbraco.VisualStudio")] [assembly: InternalsVisibleTo("Umbraco.ModelsBuilder")] [assembly: InternalsVisibleTo("Umbraco.ModelsBuilder.AspNet")] -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] \ No newline at end of file +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] + +// temp while we develop Deploy +[assembly: InternalsVisibleTo("Umbraco.Deploy")] \ No newline at end of file From 0789295701fac4d02444a9b5388021c374a7d38a Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 24 Aug 2016 10:11:38 +0200 Subject: [PATCH 044/841] Temp - 7.6.0-alpha003 - even with internals visible to, need IBackgroundTask to be public --- src/SolutionInfo.cs | 2 +- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- src/Umbraco.Web.UI/config/Dashboard.config | 10 ++++++++++ src/Umbraco.Web/Scheduling/IBackgroundTask.cs | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index 586daa3f3d..8225614a3a 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -12,4 +12,4 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("7.6.0")] -[assembly: AssemblyInformationalVersion("7.6.0-alpha002")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("7.6.0-alpha003")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index cbf7f27339..866c271f57 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "alpha002"; } } + public static string CurrentComment { get { return "alpha003"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx diff --git a/src/Umbraco.Web.UI/config/Dashboard.config b/src/Umbraco.Web.UI/config/Dashboard.config index 9eb808c67c..5e0b6926da 100644 --- a/src/Umbraco.Web.UI/config/Dashboard.config +++ b/src/Umbraco.Web.UI/config/Dashboard.config @@ -119,4 +119,14 @@ +
    + + developer + + + + /App_Plugins/Deploy/deploy.html + + +
    diff --git a/src/Umbraco.Web/Scheduling/IBackgroundTask.cs b/src/Umbraco.Web/Scheduling/IBackgroundTask.cs index 4e646c0623..2e67ed1790 100644 --- a/src/Umbraco.Web/Scheduling/IBackgroundTask.cs +++ b/src/Umbraco.Web/Scheduling/IBackgroundTask.cs @@ -7,7 +7,7 @@ namespace Umbraco.Web.Scheduling /// /// Represents a background task. /// - internal interface IBackgroundTask : IDisposable + public interface IBackgroundTask : IDisposable { /// /// Runs the background task. From 0e7ac68c241d665ce5010b4c5ef9bf62e0aac7ae Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 1 Sep 2016 16:52:12 +0200 Subject: [PATCH 045/841] Deploy - clear dashboard.config --- src/Umbraco.Web.UI/config/Dashboard.config | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/Umbraco.Web.UI/config/Dashboard.config b/src/Umbraco.Web.UI/config/Dashboard.config index 5e0b6926da..9eb808c67c 100644 --- a/src/Umbraco.Web.UI/config/Dashboard.config +++ b/src/Umbraco.Web.UI/config/Dashboard.config @@ -119,14 +119,4 @@ -
    - - developer - - - - /App_Plugins/Deploy/deploy.html - - -
    From 3fc76f61d0b8d919f0a2b61d2c590bb4bdeae258 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 5 Sep 2016 12:33:26 +0200 Subject: [PATCH 046/841] MainDom - fixing application identifier --- src/Umbraco.Core/MainDom.cs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Core/MainDom.cs b/src/Umbraco.Core/MainDom.cs index 6f4a539194..9ded022195 100644 --- a/src/Umbraco.Core/MainDom.cs +++ b/src/Umbraco.Core/MainDom.cs @@ -25,7 +25,7 @@ namespace Umbraco.Core private readonly AsyncLock _asyncLock; private IDisposable _asyncLocker; - // event wait handle used to notify current main domain that it should + // event wait handle used to notify current main domain that it should // release the lock because a new domain wants to be the main domain private readonly EventWaitHandle _signal; @@ -52,10 +52,22 @@ namespace Umbraco.Core if (HostingEnvironment.ApplicationID != null) appId = HostingEnvironment.ApplicationID.ReplaceNonAlphanumericChars(string.Empty); - var lockName = "UMBRACO-" + appId + "-MAINDOM-LCK"; + // combining with the physical path because if running on eg IIS Express, + // two sites could have the same appId even though they are different. + // + // now what could still collide is... two sites, running in two different processes + // and having the same appId, and running on the same app physical path + // + // we *cannot* use the process ID here because when an AppPool restarts it is + // a new process for the same application path + + var appPath = HostingEnvironment.ApplicationPhysicalPath; + var hash = (appId + ":::" + appPath).ToSHA1(); + + var lockName = "UMBRACO-" + hash + "-MAINDOM-LCK"; _asyncLock = new AsyncLock(lockName); - var eventName = "UMBRACO-" + appId + "-MAINDOM-EVT"; + var eventName = "UMBRACO-" + hash + "-MAINDOM-EVT"; _signal = new EventWaitHandle(false, EventResetMode.AutoReset, eventName); } @@ -109,7 +121,7 @@ namespace Umbraco.Core _logger.Error("Error while running callback, remaining callbacks will not run.", e); throw; } - + } _logger.Debug("Stopped."); } From 36188f00b0c824c72e933b6b2f8a6dd227dc7ad4 Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 7 Sep 2016 13:24:49 +0200 Subject: [PATCH 047/841] Fix exceptions (more explicit) --- src/Umbraco.Core/Cache/HttpRuntimeCacheProvider.cs | 2 +- src/Umbraco.Core/Services/EntityService.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Core/Cache/HttpRuntimeCacheProvider.cs b/src/Umbraco.Core/Cache/HttpRuntimeCacheProvider.cs index e7f5d17b83..0e98cd5318 100644 --- a/src/Umbraco.Core/Cache/HttpRuntimeCacheProvider.cs +++ b/src/Umbraco.Core/Cache/HttpRuntimeCacheProvider.cs @@ -154,7 +154,7 @@ namespace Umbraco.Core.Cache value = result.Value; // will not throw (safe lazy) var eh = value as ExceptionHolder; - if (eh != null) throw eh.Exception; // throw once! + if (eh != null) throw new Exception("Exception while creating a value.", eh.Exception); // throw once! return value; } diff --git a/src/Umbraco.Core/Services/EntityService.cs b/src/Umbraco.Core/Services/EntityService.cs index 257416d054..45873c3c74 100644 --- a/src/Umbraco.Core/Services/EntityService.cs +++ b/src/Umbraco.Core/Services/EntityService.cs @@ -132,7 +132,7 @@ namespace Umbraco.Core.Services case UmbracoObjectTypes.ROOT: case UmbracoObjectTypes.Unknown: default: - throw new NotSupportedException(); + throw new NotSupportedException("Unsupported object type (" + umbracoObjectType + ")."); } } }); From eb7a0cb85d377f9e9ea0758d69b4fd0d38c0f811 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 8 Sep 2016 10:24:37 +0200 Subject: [PATCH 048/841] U4-8954 - fix WhereIn issue with non-value-types --- .../Persistence/PetaPocoSqlExtensions.cs | 34 ++++++++++-------- .../Persistence/PetaPocoExpressionsTests.cs | 36 +++++++++++++++++++ .../Persistence/PetaPocoExtensionsTest.cs | 4 +++ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + 4 files changed, 61 insertions(+), 14 deletions(-) create mode 100644 src/Umbraco.Tests/Persistence/PetaPocoExpressionsTests.cs diff --git a/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs index 04f4147155..f5c0e0e616 100644 --- a/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs +++ b/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs @@ -34,11 +34,27 @@ namespace Umbraco.Core.Persistence return sql.Where(whereExpression, expresionist.GetSqlParameters()); } + private static string GetFieldName(Expression> fieldSelector, ISqlSyntaxProvider sqlSyntax) + { + var field = ExpressionHelper.FindProperty(fieldSelector) as PropertyInfo; + var fieldName = field.GetColumnName(); + + var type = typeof(T); + var tableName = type.GetTableName(); + + return sqlSyntax.GetQuotedTableName(tableName) + "." + sqlSyntax.GetQuotedColumnName(fieldName); + } + + [Obsolete("Use the overload specifying ISqlSyntaxProvider instead")] public static Sql WhereIn(this Sql sql, Expression> fieldSelector, IEnumerable values) { - var expresionist = new PocoToSqlExpressionHelper(); - var fieldExpression = expresionist.Visit(fieldSelector); - return sql.Where(fieldExpression + " IN (@values)", new {@values = values}); + return sql.WhereIn(fieldSelector, values, SqlSyntaxContext.SqlSyntaxProvider); + } + + public static Sql WhereIn(this Sql sql, Expression> fieldSelector, IEnumerable values, ISqlSyntaxProvider sqlSyntax) + { + var fieldName = GetFieldName(fieldSelector, sqlSyntax); + return sql.Where(fieldName + " IN (@values)", new { values }); } [Obsolete("Use the overload specifying ISqlSyntaxProvider instead")] @@ -49,17 +65,7 @@ namespace Umbraco.Core.Persistence public static Sql OrderBy(this Sql sql, Expression> columnMember, ISqlSyntaxProvider sqlSyntax) { - var column = ExpressionHelper.FindProperty(columnMember) as PropertyInfo; - var columnName = column.GetColumnName(); - - var type = typeof(TColumn); - var tableName = type.GetTableName(); - - //need to ensure the order by is in brackets, see: https://github.com/toptensoftware/PetaPoco/issues/177 - var syntax = string.Format("({0}.{1})", - sqlSyntax.GetQuotedTableName(tableName), - sqlSyntax.GetQuotedColumnName(columnName)); - + var syntax = "(" + GetFieldName(columnMember, sqlSyntax) + ")"; return sql.OrderBy(syntax); } diff --git a/src/Umbraco.Tests/Persistence/PetaPocoExpressionsTests.cs b/src/Umbraco.Tests/Persistence/PetaPocoExpressionsTests.cs new file mode 100644 index 0000000000..4412c25e5f --- /dev/null +++ b/src/Umbraco.Tests/Persistence/PetaPocoExpressionsTests.cs @@ -0,0 +1,36 @@ +using NUnit.Framework; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Tests.Persistence +{ + [TestFixture] + public class PetaPocoExpressionsTests + { + [Test] + public void WhereInValueFieldTest() + { + var syntax = SqlSyntaxContext.SqlSyntaxProvider = new SqlCeSyntaxProvider(); + var sql = new Sql() + .Select("*") + .From(syntax) + .WhereIn(x => x.NodeId, new[] { 1, 2, 3 }, syntax); + Assert.AreEqual("SELECT *\nFROM [umbracoNode]\nWHERE ([umbracoNode].[id] IN (@0,@1,@2))", sql.SQL); + } + + [Test] + public void WhereInObjectFieldTest() + { + // this test used to fail because x => x.Text was evaluated as a lambda + // and returned "[umbracoNode].[text] = @0"... had to fix WhereIn. + + var syntax = SqlSyntaxContext.SqlSyntaxProvider = new SqlCeSyntaxProvider(); + var sql = new Sql() + .Select("*") + .From(syntax) + .WhereIn(x => x.Text, new[] { "a", "b", "c" }, syntax); + Assert.AreEqual("SELECT *\nFROM [umbracoNode]\nWHERE ([umbracoNode].[text] IN (@0,@1,@2))", sql.SQL); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Persistence/PetaPocoExtensionsTest.cs b/src/Umbraco.Tests/Persistence/PetaPocoExtensionsTest.cs index 0a15994785..8ce94fa125 100644 --- a/src/Umbraco.Tests/Persistence/PetaPocoExtensionsTest.cs +++ b/src/Umbraco.Tests/Persistence/PetaPocoExtensionsTest.cs @@ -4,11 +4,15 @@ using System.Diagnostics; using System.Linq; using System.Text.RegularExpressions; using System.Threading; +using Moq; using NUnit.Framework; using Umbraco.Core; +using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.ObjectResolution; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Services; using Umbraco.Tests.Services; using Umbraco.Tests.TestHelpers; diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index a38e951434..c2c6e785ec 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -177,6 +177,7 @@ + From 37dc9989c45daaa71416c587aacf275a92005bcb Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 8 Sep 2016 15:23:28 +0200 Subject: [PATCH 049/841] Fix DefaultDatabaseFactory non-http instance --- .../Persistence/DefaultDatabaseFactory.cs | 98 +++++++++++++------ 1 file changed, 69 insertions(+), 29 deletions(-) diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs index 658b8ebabe..d7f8fa6488 100644 --- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.Remoting.Messaging; using System.Web; using Umbraco.Core.Configuration; using Umbraco.Core.Logging; @@ -20,12 +21,23 @@ namespace Umbraco.Core.Persistence public string ConnectionString { get; private set; } public string ProviderName { get; private set; } - //very important to have ThreadStatic: - // see: http://issues.umbraco.org/issue/U4-2172 - [ThreadStatic] - private static volatile UmbracoDatabase _nonHttpInstance; + // NO! see notes in v8 HybridAccessorBase + //[ThreadStatic] + //private static volatile UmbracoDatabase _nonHttpInstance; - private static readonly object Locker = new object(); + private const string ItemKey = "Umbraco.Core.Persistence.DefaultDatabaseFactory"; + + private static UmbracoDatabase NonContextValue + { + get { return (UmbracoDatabase) CallContext.LogicalGetData(ItemKey); } + set + { + if (value == null) CallContext.FreeNamedDataSlot(ItemKey); + else CallContext.LogicalSetData(ItemKey, value); + } + } + + private static readonly object Locker = new object(); /// /// Constructor accepting custom connection string @@ -58,29 +70,37 @@ namespace Umbraco.Core.Persistence public UmbracoDatabase CreateDatabase() { - //no http context, create the singleton global object + // no http context, create the call context object + // NOTHING is going to track the object and it is the responsibility of the caller to release it! + // using the ReleaseDatabase method. if (HttpContext.Current == null) { - if (_nonHttpInstance == null) + LogHelper.Debug("Get NON http [T" + Environment.CurrentManagedThreadId + "]"); + var value = NonContextValue; + if (value != null) return value; + lock (Locker) { - lock (Locker) - { - //double check - if (_nonHttpInstance == null) - { - _nonHttpInstance = string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false - ? new UmbracoDatabase(ConnectionString, ProviderName, _logger) - : new UmbracoDatabase(_connectionStringName, _logger); - } - } + value = NonContextValue; + if (value != null) return value; + + LogHelper.Debug("Create NON http [T" + Environment.CurrentManagedThreadId + "]"); + NonContextValue = value = string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false + ? new UmbracoDatabase(ConnectionString, ProviderName, _logger) + : new UmbracoDatabase(_connectionStringName, _logger); + + return value; } - return _nonHttpInstance; } - //we have an http context, so only create one per request - if (HttpContext.Current.Items.Contains(typeof(DefaultDatabaseFactory)) == false) + // we have an http context, so only create one per request. + // UmbracoDatabase is marked IDisposeOnRequestEnd and therefore will be disposed when + // UmbracoModule attempts to dispose the relevant HttpContext items. so we DO dispose + // connections at the end of each request. no need to call ReleaseDatabase. + LogHelper.Debug("Get http [T" + Environment.CurrentManagedThreadId + "]"); + if (HttpContext.Current.Items.Contains(typeof(DefaultDatabaseFactory)) == false) { - HttpContext.Current.Items.Add(typeof (DefaultDatabaseFactory), + LogHelper.Debug("Create http [T" + Environment.CurrentManagedThreadId + "]"); + HttpContext.Current.Items.Add(typeof (DefaultDatabaseFactory), string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false ? new UmbracoDatabase(ConnectionString, ProviderName, _logger) : new UmbracoDatabase(_connectionStringName, _logger)); @@ -88,11 +108,33 @@ namespace Umbraco.Core.Persistence return (UmbracoDatabase)HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; } + // releases the "context" database + public void ReleaseDatabase() + { + if (HttpContext.Current == null) + { + var value = NonContextValue; + if (value != null) value.Dispose(); + NonContextValue = null; + } + else + { + var db = (UmbracoDatabase) HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; + if (db != null) + { + db.Dispose(); + HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); + } + } + } + protected override void DisposeResources() { if (HttpContext.Current == null) { - _nonHttpInstance.Dispose(); + var value = NonContextValue; + if (value != null) value.Dispose(); + NonContextValue = null; } else { @@ -103,13 +145,11 @@ namespace Umbraco.Core.Persistence } } - // during tests, the thread static var can leak between tests - // this method provides a way to force-reset the variable internal void ResetForTests() { - if (_nonHttpInstance == null) return; - _nonHttpInstance.Dispose(); - _nonHttpInstance = null; - } - } + var value = NonContextValue; + if (value != null) value.Dispose(); + NonContextValue = null; + } + } } \ No newline at end of file From be3032192aaa6d04502b45572a30e6f168c68908 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 8 Sep 2016 15:23:48 +0200 Subject: [PATCH 050/841] Add WhereAnyIn sql extension --- .../Persistence/PetaPocoSqlExtensions.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs index f5c0e0e616..831a6330c6 100644 --- a/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs +++ b/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs @@ -1,8 +1,10 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; +using System.Text; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; @@ -57,6 +59,26 @@ namespace Umbraco.Core.Persistence return sql.Where(fieldName + " IN (@values)", new { values }); } + [Obsolete("Use the overload specifying ISqlSyntaxProvider instead")] + public static Sql WhereAnyIn(this Sql sql, Expression>[] fieldSelectors, IEnumerable values) + { + return sql.WhereAnyIn(fieldSelectors, values, SqlSyntaxContext.SqlSyntaxProvider); + } + + public static Sql WhereAnyIn(this Sql sql, Expression>[] fieldSelectors, IEnumerable values, ISqlSyntaxProvider sqlSyntax) + { + var fieldNames = fieldSelectors.Select(x => GetFieldName(x, sqlSyntax)).ToArray(); + var sb = new StringBuilder(); + sb.Append("("); + for (var i = 0; i < fieldNames.Length; i++) + { + if (i > 0) sb.Append(" OR "); + sb.Append(fieldNames[i] + " IN (@values)"); + } + sb.Append(")"); + return sql.Where(sb.ToString(), new { values }); + } + [Obsolete("Use the overload specifying ISqlSyntaxProvider instead")] public static Sql OrderBy(this Sql sql, Expression> columnMember) { From 7be76f10d6ffb090585009a5e03cc3a363047306 Mon Sep 17 00:00:00 2001 From: Claus Date: Fri, 9 Sep 2016 09:26:29 +0200 Subject: [PATCH 051/841] accessing file streams for ScriptRepository and StylesheetRepository. changed naming of existing file service methods to conform. --- .../Interfaces/IScriptRepository.cs | 5 ++- .../Interfaces/IStylesheetRepository.cs | 4 ++- .../Interfaces/ITemplateRepository.cs | 2 +- .../Repositories/ScriptRepository.cs | 20 +++++++++++ .../Repositories/StylesheetRepository.cs | 19 ++++++++++ .../Repositories/TemplateRepository.cs | 2 +- .../Persistence/RepositoryFactory.cs | 5 +++ src/Umbraco.Core/Services/FileService.cs | 36 +++++++++++++++++-- src/Umbraco.Core/Services/IFileService.cs | 31 +++++++++++++++- 9 files changed, 117 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IScriptRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IScriptRepository.cs index 9d7bfd2e36..eacb818faa 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IScriptRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IScriptRepository.cs @@ -1,9 +1,12 @@ -using Umbraco.Core.Models; +using System.IO; +using Umbraco.Core.Models; namespace Umbraco.Core.Persistence.Repositories { public interface IScriptRepository : IRepository { bool ValidateScript(Script script); + Stream GetFileContentStream(string filepath); + void SetFileContent(string filepath, Stream content); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IStylesheetRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IStylesheetRepository.cs index 1b2bcbe3eb..323f11d339 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IStylesheetRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IStylesheetRepository.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.IO; using Umbraco.Core.Models; namespace Umbraco.Core.Persistence.Repositories @@ -6,5 +6,7 @@ namespace Umbraco.Core.Persistence.Repositories public interface IStylesheetRepository : IRepository { bool ValidateStylesheet(Stylesheet stylesheet); + Stream GetFileContentStream(string filepath); + void SetFileContent(string filepath, Stream content); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs index 11ac404f5d..59845f53f0 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/ITemplateRepository.cs @@ -64,7 +64,7 @@ namespace Umbraco.Core.Persistence.Repositories /// /// The filesystem path to the template. /// The content of the template. - Stream GetFileContent(string filepath); + Stream GetFileContentStream(string filepath); /// /// Sets the content of a template. diff --git a/src/Umbraco.Core/Persistence/Repositories/ScriptRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ScriptRepository.cs index 13b2877c50..c7957bf9bd 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ScriptRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ScriptRepository.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; @@ -109,6 +110,25 @@ namespace Umbraco.Core.Persistence.Repositories return isValidPath && isValidExtension; } + public Stream GetFileContentStream(string filepath) + { + if (FileSystem.FileExists(filepath) == false) return null; + + try + { + return FileSystem.OpenFile(filepath); + } + catch + { + return null; // deal with race conds + } + } + + public void SetFileContent(string filepath, Stream content) + { + FileSystem.AddFile(filepath, content, true); + } + #endregion } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/StylesheetRepository.cs b/src/Umbraco.Core/Persistence/Repositories/StylesheetRepository.cs index 6f9138de9a..45fff2e43b 100644 --- a/src/Umbraco.Core/Persistence/Repositories/StylesheetRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/StylesheetRepository.cs @@ -125,6 +125,25 @@ namespace Umbraco.Core.Persistence.Repositories return isValidPath && isValidExtension; } + public Stream GetFileContentStream(string filepath) + { + if (FileSystem.FileExists(filepath) == false) return null; + + try + { + return FileSystem.OpenFile(filepath); + } + catch + { + return null; // deal with race conds + } + } + + public void SetFileContent(string filepath, Stream content) + { + FileSystem.AddFile(filepath, content, true); + } + #endregion } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index 5ee83a47a8..ebe3bf3b65 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -454,7 +454,7 @@ namespace Umbraco.Core.Persistence.Repositories } } - public Stream GetFileContent(string filepath) + public Stream GetFileContentStream(string filepath) { var fs = GetFileSystem(filepath); if (fs.FileExists(filepath) == false) return null; diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index 85eb00ea87..77e54de81b 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -342,5 +342,10 @@ namespace Umbraco.Core.Persistence _logger, _sqlSyntax); } + + internal IStylesheetRepository CreateStylesheetRepository(IDatabaseUnitOfWork uow) + { + return new StylesheetRepository(uow, new PhysicalFileSystem(SystemDirectories.Css)); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 06ab3c5229..9e84ace072 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -558,11 +558,11 @@ namespace Umbraco.Core.Services } } - public Stream GetTemplateFileContent(string filepath) + public Stream GetTemplateFileContentStream(string filepath) { using (var repository = RepositoryFactory.CreateTemplateRepository(UowProvider.GetUnitOfWork())) { - return repository.GetFileContent(filepath); + return repository.GetFileContentStream(filepath); } } @@ -574,6 +574,38 @@ namespace Umbraco.Core.Services } } + public Stream GetStylesheetFileContentStream(string filepath) + { + using (var repository = RepositoryFactory.CreateStylesheetRepository(UowProvider.GetUnitOfWork())) + { + return repository.GetFileContentStream(filepath); + } + } + + public void SetStylesheetFileContent(string filepath, Stream content) + { + using (var repository = RepositoryFactory.CreateStylesheetRepository(UowProvider.GetUnitOfWork())) + { + repository.SetFileContent(filepath, content); + } + } + + public Stream GetSriptFileContentStream(string filepath) + { + using (var repository = RepositoryFactory.CreateScriptRepository(UowProvider.GetUnitOfWork())) + { + return repository.GetFileContentStream(filepath); + } + } + + public void SetScriptFileContent(string filepath, Stream content) + { + using (var repository = RepositoryFactory.CreateScriptRepository(UowProvider.GetUnitOfWork())) + { + repository.SetFileContent(filepath, content); + } + } + #endregion #region Partial Views diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 010dd7067f..4caf16603d 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -242,7 +242,7 @@ namespace Umbraco.Core.Services /// /// The filesystem path to the template. /// The content of the template. - Stream GetTemplateFileContent(string filepath); + Stream GetTemplateFileContentStream(string filepath); /// /// Sets the content of a template. @@ -250,5 +250,34 @@ namespace Umbraco.Core.Services /// The filesystem path to the template. /// The content of the template. void SetTemplateFileContent(string filepath, Stream content); + + /// + /// Gets the content of a stylesheet as a stream. + /// + /// The filesystem path to the stylesheet. + /// The content of the stylesheet. + Stream GetStylesheetFileContentStream(string filepath); + + /// + /// Sets the content of a stylesheet. + /// + /// The filesystem path to the stylesheet. + /// The content of the stylesheet. + void SetStylesheetFileContent(string filepath, Stream content); + + /// + /// Gets the content of a script file as a stream. + /// + /// The filesystem path to the script. + /// The content of the script file. + Stream GetSriptFileContentStream(string filepath); + + /// + /// Sets the content of a script file. + /// + /// The filesystem path to the script. + /// The content of the script file. + void SetScriptFileContent(string filepath, Stream content); + } } \ No newline at end of file From 5d71df36bd613622f0f04316400e6d836cf2c8df Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 9 Sep 2016 09:28:25 +0200 Subject: [PATCH 052/841] Fix Entity to respect dates if forced --- src/Umbraco.Core/Models/EntityBase/Entity.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Core/Models/EntityBase/Entity.cs b/src/Umbraco.Core/Models/EntityBase/Entity.cs index 637255a1c8..d605759ed1 100644 --- a/src/Umbraco.Core/Models/EntityBase/Entity.cs +++ b/src/Umbraco.Core/Models/EntityBase/Entity.cs @@ -113,8 +113,10 @@ namespace Umbraco.Core.Models.EntityBase /// internal virtual void AddingEntity() { - CreateDate = DateTime.Now; - UpdateDate = DateTime.Now; + if (IsPropertyDirty("CreateDate") == false || _createDate == default(DateTime)) + CreateDate = DateTime.Now; + if (IsPropertyDirty("UpdateDate") == false || _updateDate == default(DateTime)) + UpdateDate = CreateDate; } /// @@ -122,7 +124,8 @@ namespace Umbraco.Core.Models.EntityBase /// internal virtual void UpdatingEntity() { - UpdateDate = DateTime.Now; + if (IsPropertyDirty("UpdateDate") == false || _updateDate == default(DateTime)) + UpdateDate = DateTime.Now; } /// From 7499c9a19c4e1cc3293c860fcc8943b791af4f0a Mon Sep 17 00:00:00 2001 From: Claus Date: Fri, 9 Sep 2016 11:09:42 +0200 Subject: [PATCH 053/841] fixing typos and a rename. --- src/Umbraco.Core/Services/FileService.cs | 2 +- src/Umbraco.Core/Services/IFileService.cs | 2 +- src/Umbraco.Core/Services/IMediaService.cs | 2 +- src/Umbraco.Core/Services/MediaService.cs | 7 +------ 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 9e84ace072..583d26294a 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -590,7 +590,7 @@ namespace Umbraco.Core.Services } } - public Stream GetSriptFileContentStream(string filepath) + public Stream GetScriptFileContentStream(string filepath) { using (var repository = RepositoryFactory.CreateScriptRepository(UowProvider.GetUnitOfWork())) { diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 4caf16603d..9521b47311 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -270,7 +270,7 @@ namespace Umbraco.Core.Services /// /// The filesystem path to the script. /// The content of the script file. - Stream GetSriptFileContentStream(string filepath); + Stream GetScriptFileContentStream(string filepath); /// /// Sets the content of a script file. diff --git a/src/Umbraco.Core/Services/IMediaService.cs b/src/Umbraco.Core/Services/IMediaService.cs index ae1e91a28d..1c07c86086 100644 --- a/src/Umbraco.Core/Services/IMediaService.cs +++ b/src/Umbraco.Core/Services/IMediaService.cs @@ -407,7 +407,7 @@ namespace Umbraco.Core.Services /// /// The filesystem path to the media. /// The content of the media. - Stream GetMediaFileContent(string filepath); + Stream GetMediaFileContentStream(string filepath); /// /// Sets the content of a media. diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index fc0a4821b7..8a86e59cc3 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -6,11 +6,8 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading; -using System.Xml.Linq; -using Umbraco.Core.Auditing; using Umbraco.Core.Configuration; using Umbraco.Core.Events; -using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Media; using Umbraco.Core.Models; @@ -19,9 +16,7 @@ using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Repositories; -using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Persistence.UnitOfWork; -using Umbraco.Core.Publishing; namespace Umbraco.Core.Services { @@ -1298,7 +1293,7 @@ namespace Umbraco.Core.Services } } - public Stream GetMediaFileContent(string filepath) + public Stream GetMediaFileContentStream(string filepath) { if (MediaHelper.FileSystem.FileExists(filepath) == false) return null; From 2eb050e6632146bfb84a2e3ec66a9eec20432372 Mon Sep 17 00:00:00 2001 From: Claus Date: Fri, 9 Sep 2016 12:49:08 +0200 Subject: [PATCH 054/841] removing a checkbox that didnt do anything at all. --- .../umbraco/developer/Xslt/editXslt.aspx | 3 --- .../umbraco/developer/Xslt/editXslt.aspx.cs | 18 ------------------ 2 files changed, 21 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/developer/Xslt/editXslt.aspx b/src/Umbraco.Web.UI/umbraco/developer/Xslt/editXslt.aspx index 8a58fd6589..ce19925ec0 100644 --- a/src/Umbraco.Web.UI/umbraco/developer/Xslt/editXslt.aspx +++ b/src/Umbraco.Web.UI/umbraco/developer/Xslt/editXslt.aspx @@ -61,9 +61,6 @@ - - - diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Xslt/editXslt.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Xslt/editXslt.aspx.cs index b88b0f1d4f..03ce088941 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Xslt/editXslt.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Xslt/editXslt.aspx.cs @@ -177,24 +177,6 @@ namespace umbraco.cms.presentation.developer /// protected global::System.Web.UI.WebControls.TextBox xsltFileName; - /// - /// pp_testing control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel pp_testing; - - /// - /// SkipTesting control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.CheckBox SkipTesting; - /// /// pp_errorMsg control. /// From ba09e945f09d7ad417db7d82cba9a631f9f0c497 Mon Sep 17 00:00:00 2001 From: Claus Date: Fri, 9 Sep 2016 13:28:30 +0200 Subject: [PATCH 055/841] changes to partialview repositories initialization. adding methods for getting/setting partialview macro files. --- src/Umbraco.Core/IO/SystemDirectories.cs | 18 +++++++++- .../Interfaces/IPartialViewRepository.cs | 5 ++- .../PartialViewMacroRepository.cs | 5 ++- .../Repositories/PartialViewRepository.cs | 24 ++++++++++++-- src/Umbraco.Core/Services/FileService.cs | 33 +++++++++++++++---- src/Umbraco.Core/Services/IFileService.cs | 14 ++++++++ 6 files changed, 84 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Core/IO/SystemDirectories.cs b/src/Umbraco.Core/IO/SystemDirectories.cs index 2dfad2d103..9c815504c7 100644 --- a/src/Umbraco.Core/IO/SystemDirectories.cs +++ b/src/Umbraco.Core/IO/SystemDirectories.cs @@ -96,7 +96,23 @@ namespace Umbraco.Core.IO } } - + public static string PartialViews + { + get + { + return MvcViews + "/Partials/"; + } + } + + public static string MacroPartials + { + get + { + return MvcViews + "/MacroPartials/"; + + } + } + public static string Media { get diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IPartialViewRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IPartialViewRepository.cs index 3fbcdd3283..7c8391a77a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IPartialViewRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IPartialViewRepository.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Models; +using System.IO; +using Umbraco.Core.Models; namespace Umbraco.Core.Persistence.Repositories { @@ -7,5 +8,7 @@ namespace Umbraco.Core.Persistence.Repositories void AddFolder(string folderPath); void DeleteFolder(string folderPath); bool ValidatePartialView(IPartialView partialView); + Stream GetFileContentStream(string filepath); + void SetFileContent(string filepath, Stream content); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs index e055c3dd93..277e0daf30 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs @@ -1,5 +1,4 @@ -using System.Threading; -using Umbraco.Core.IO; +using Umbraco.Core.IO; using Umbraco.Core.Models; using Umbraco.Core.Persistence.UnitOfWork; @@ -8,7 +7,7 @@ namespace Umbraco.Core.Persistence.Repositories internal class PartialViewMacroRepository : PartialViewRepository { public PartialViewMacroRepository(IUnitOfWork work) - : this(work, new PhysicalFileSystem(SystemDirectories.MvcViews + "/MacroPartials/")) + : this(work, new PhysicalFileSystem(SystemDirectories.MacroPartials)) { } diff --git a/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs index e9352a945f..6631adc13b 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; @@ -12,7 +11,7 @@ namespace Umbraco.Core.Persistence.Repositories internal class PartialViewRepository : FileRepository, IPartialViewRepository { public PartialViewRepository(IUnitOfWork work) - : this(work, new PhysicalFileSystem(SystemDirectories.MvcViews + "/Partials/")) + : this(work, new PhysicalFileSystem(SystemDirectories.PartialViews)) { } @@ -113,6 +112,25 @@ namespace Umbraco.Core.Persistence.Repositories return isValidPath && isValidExtension; } + public Stream GetFileContentStream(string filepath) + { + if (FileSystem.FileExists(filepath) == false) return null; + + try + { + return FileSystem.OpenFile(filepath); + } + catch + { + return null; // deal with race conds + } + } + + public void SetFileContent(string filepath, Stream content) + { + FileSystem.AddFile(filepath, content, true); + } + /// /// Gets a stream that is used to write to the file /// diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 583d26294a..326d450c93 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -3,12 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; -using System.Runtime.Remoting.Messaging; using System.Text.RegularExpressions; -using System.Web; -using Umbraco.Core.Auditing; -using Umbraco.Core.Configuration; -using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Events; using Umbraco.Core.IO; using Umbraco.Core.Logging; @@ -574,6 +569,8 @@ namespace Umbraco.Core.Services } } + #endregion + public Stream GetStylesheetFileContentStream(string filepath) { using (var repository = RepositoryFactory.CreateStylesheetRepository(UowProvider.GetUnitOfWork())) @@ -606,8 +603,6 @@ namespace Umbraco.Core.Services } } - #endregion - #region Partial Views public IEnumerable GetPartialViewSnippetNames(params string[] filterNames) @@ -662,6 +657,14 @@ namespace Umbraco.Core.Services } } + public IEnumerable GetPartialViewMacros(params string[] names) + { + using (var repository = RepositoryFactory.CreatePartialViewMacroRepository(_fileUowProvider.GetUnitOfWork())) + { + return repository.GetAll(names).OrderBy(x => x.Name); + } + } + public Attempt CreatePartialView(IPartialView partialView, string snippetName = null, int userId = 0) { return CreatePartialViewMacro(partialView, PartialViewType.PartialView, snippetName, userId); @@ -839,6 +842,22 @@ namespace Umbraco.Core.Services throw new ArgumentOutOfRangeException("partialViewType"); } + public Stream GetPartialViewMacroFileContentStream(string filepath) + { + using (var repository = GetPartialViewRepository(PartialViewType.PartialViewMacro, UowProvider.GetUnitOfWork())) + { + return repository.GetFileContentStream(filepath); + } + } + + public void SetPartialViewMacroFileContent(string filepath, Stream content) + { + using (var repository = GetPartialViewRepository(PartialViewType.PartialViewMacro, UowProvider.GetUnitOfWork())) + { + repository.SetFileContent(filepath, content); + } + } + #endregion private void Audit(AuditType type, string message, int userId, int objectId) diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 9521b47311..03ebdac029 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -15,6 +15,7 @@ namespace Umbraco.Core.Services void DeletePartialViewMacroFolder(string folderPath); IPartialView GetPartialView(string path); IPartialView GetPartialViewMacro(string path); + IEnumerable GetPartialViewMacros(params string[] names); Attempt CreatePartialView(IPartialView partialView, string snippetName = null, int userId = 0); Attempt CreatePartialViewMacro(IPartialView partialView, string snippetName = null, int userId = 0); bool DeletePartialView(string path, int userId = 0); @@ -279,5 +280,18 @@ namespace Umbraco.Core.Services /// The content of the script file. void SetScriptFileContent(string filepath, Stream content); + /// + /// Gets the content of a macro partial view as a stream. + /// + /// The filesystem path to the macro partial view. + /// The content of the macro partial view. + Stream GetPartialViewMacroFileContentStream(string filepath); + + /// + /// Sets the content of a macro partial view. + /// + /// The filesystem path to the macro partial view. + /// The content of the macro partial view. + void SetPartialViewMacroFileContent(string filepath, Stream content); } } \ No newline at end of file From 0299de4fdde9e7c2eb8a97b0346b494dc1da465d Mon Sep 17 00:00:00 2001 From: Claus Date: Fri, 9 Sep 2016 13:31:43 +0200 Subject: [PATCH 056/841] adding in stream methods for partial views. --- src/Umbraco.Core/Services/FileService.cs | 16 ++++++++++++++++ src/Umbraco.Core/Services/IFileService.cs | 14 ++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 326d450c93..af449d7cfa 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -858,6 +858,22 @@ namespace Umbraco.Core.Services } } + public Stream GetPartialViewFileContentStream(string filepath) + { + using (var repository = GetPartialViewRepository(PartialViewType.PartialView, UowProvider.GetUnitOfWork())) + { + return repository.GetFileContentStream(filepath); + } + } + + public void SetPartialViewFileContent(string filepath, Stream content) + { + using (var repository = GetPartialViewRepository(PartialViewType.PartialView, UowProvider.GetUnitOfWork())) + { + repository.SetFileContent(filepath, content); + } + } + #endregion private void Audit(AuditType type, string message, int userId, int objectId) diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 03ebdac029..5fa078e79b 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -293,5 +293,19 @@ namespace Umbraco.Core.Services /// The filesystem path to the macro partial view. /// The content of the macro partial view. void SetPartialViewMacroFileContent(string filepath, Stream content); + + /// + /// Gets the content of a partial view as a stream. + /// + /// The filesystem path to the partial view. + /// The content of the partial view. + Stream GetPartialViewFileContentStream(string filepath); + + /// + /// Sets the content of a partial view. + /// + /// The filesystem path to the partial view. + /// The content of the partial view. + void SetPartialViewFileContent(string filepath, Stream content); } } \ No newline at end of file From b67855b7a3ae750fea8445f7d01341ee6b204b4e Mon Sep 17 00:00:00 2001 From: Claus Date: Fri, 9 Sep 2016 13:33:14 +0200 Subject: [PATCH 057/841] xslt file repository and methods for getting xslt files in FileService. --- src/Umbraco.Core/Models/IXsltFile.cs | 7 + src/Umbraco.Core/Models/XsltFile.cs | 32 +++++ .../Interfaces/IXsltFileRepository.cs | 12 ++ .../Repositories/XsltFileRepository.cs | 135 ++++++++++++++++++ .../Persistence/RepositoryFactory.cs | 5 + src/Umbraco.Core/Services/FileService.cs | 16 +++ src/Umbraco.Core/Services/IFileService.cs | 2 + src/Umbraco.Core/Umbraco.Core.csproj | 4 + 8 files changed, 213 insertions(+) create mode 100644 src/Umbraco.Core/Models/IXsltFile.cs create mode 100644 src/Umbraco.Core/Models/XsltFile.cs create mode 100644 src/Umbraco.Core/Persistence/Repositories/Interfaces/IXsltFileRepository.cs create mode 100644 src/Umbraco.Core/Persistence/Repositories/XsltFileRepository.cs diff --git a/src/Umbraco.Core/Models/IXsltFile.cs b/src/Umbraco.Core/Models/IXsltFile.cs new file mode 100644 index 0000000000..f6d4418f88 --- /dev/null +++ b/src/Umbraco.Core/Models/IXsltFile.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Models +{ + public interface IXsltFile : IFile + { + + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/XsltFile.cs b/src/Umbraco.Core/Models/XsltFile.cs new file mode 100644 index 0000000000..07f4d00084 --- /dev/null +++ b/src/Umbraco.Core/Models/XsltFile.cs @@ -0,0 +1,32 @@ +using System; +using System.Runtime.Serialization; + +namespace Umbraco.Core.Models +{ + /// + /// Represents a XSLT file + /// + [Serializable] + [DataContract(IsReference = true)] + public class XsltFile : File, IXsltFile + { + public XsltFile(string path) + : this(path, (Func) null) + { } + + internal XsltFile(string path, Func getFileContent) + : base(path, getFileContent) + { } + + /// + /// Indicates whether the current entity has an identity, which in this case is a path/name. + /// + /// + /// Overrides the default Entity identity check. + /// + public override bool HasIdentity + { + get { return string.IsNullOrEmpty(Path) == false; } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IXsltFileRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IXsltFileRepository.cs new file mode 100644 index 0000000000..8bff985400 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IXsltFileRepository.cs @@ -0,0 +1,12 @@ +using System.IO; +using Umbraco.Core.Models; + +namespace Umbraco.Core.Persistence.Repositories +{ + public interface IXsltFileRepository : IRepository + { + bool ValidateXsltFile(XsltFile xsltFile); + Stream GetFileContentStream(string filepath); + void SetFileContent(string filepath, Stream content); + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/XsltFileRepository.cs b/src/Umbraco.Core/Persistence/Repositories/XsltFileRepository.cs new file mode 100644 index 0000000000..461efce6c3 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/XsltFileRepository.cs @@ -0,0 +1,135 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Umbraco.Core.IO; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Persistence.Repositories +{ + /// + /// Represents the XsltFile Repository + /// + internal class XsltFileRepository : FileRepository, IXsltFileRepository + { + public XsltFileRepository(IUnitOfWork work, IFileSystem fileSystem) + : base(work, fileSystem) + { + } + + public override XsltFile Get(string id) + { + var path = FileSystem.GetRelativePath(id); + + path = path.EnsureEndsWith(".xslt"); + + if (FileSystem.FileExists(path) == false) + return null; + + var created = FileSystem.GetCreated(path).UtcDateTime; + var updated = FileSystem.GetLastModified(path).UtcDateTime; + + var xsltFile = new XsltFile(path, file => GetFileContent(file.OriginalPath)) + { + Key = path.EncodeAsGuid(), + CreateDate = created, + UpdateDate = updated, + Id = path.GetHashCode(), + VirtualPath = FileSystem.GetUrl(path) + }; + + //on initial construction we don't want to have dirty properties tracked + // http://issues.umbraco.org/issue/U4-1946 + xsltFile.ResetDirtyProperties(false); + + return xsltFile; + } + + public override void AddOrUpdate(XsltFile entity) + { + base.AddOrUpdate(entity); + + // ensure that from now on, content is lazy-loaded + if (entity.GetFileContent == null) + entity.GetFileContent = file => GetFileContent(file.OriginalPath); + } + + public override IEnumerable GetAll(params string[] ids) + { + ids = ids + .Select(x => x.EnsureEndsWith(".xslt")) + .Distinct() + .ToArray(); + + if (ids.Any()) + { + foreach (var id in ids) + { + yield return Get(id); + } + } + else + { + var files = FindAllFiles("", "*.xslt"); + foreach (var file in files) + { + yield return Get(file); + } + } + } + + /// + /// Gets a list of all that exist at the relative path specified. + /// + /// + /// If null or not specified, will return the XSLT files at the root path relative to the IFileSystem + /// + /// + public IEnumerable GetXsltFilesAtPath(string rootPath = null) + { + return FileSystem.GetFiles(rootPath ?? string.Empty, "*.xslt").Select(Get); + } + + private static readonly List ValidExtensions = new List { "xslt" }; + + public bool ValidateXsltFile(XsltFile xsltFile) + { + // get full path + string fullPath; + try + { + // may throw for security reasons + fullPath = FileSystem.GetFullPath(xsltFile.Path); + } + catch + { + return false; + } + + // validate path and extension + var validDir = SystemDirectories.Xslt; + var isValidPath = IOHelper.VerifyEditPath(fullPath, validDir); + var isValidExtension = IOHelper.VerifyFileExtension(xsltFile.Path, ValidExtensions); + return isValidPath && isValidExtension; + } + + public Stream GetFileContentStream(string filepath) + { + if (FileSystem.FileExists(filepath) == false) return null; + + try + { + return FileSystem.OpenFile(filepath); + } + catch + { + return null; // deal with race conds + } + } + + public void SetFileContent(string filepath, Stream content) + { + FileSystem.AddFile(filepath, content, true); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index 77e54de81b..dbb36f2cf9 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -240,6 +240,11 @@ namespace Umbraco.Core.Persistence _settings.Templates); } + public virtual IXsltFileRepository CreateXsltFileRepository(IUnitOfWork uow) + { + return new XsltFileRepository(uow, new PhysicalFileSystem(SystemDirectories.Xslt)); + } + public virtual IMigrationEntryRepository CreateMigrationEntryRepository(IDatabaseUnitOfWork uow) { return new MigrationEntryRepository( diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index af449d7cfa..bdae4ce55d 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -665,6 +665,22 @@ namespace Umbraco.Core.Services } } + public IXsltFile GetXsltFile(string path) + { + using (var repository = RepositoryFactory.CreateXsltFileRepository(_fileUowProvider.GetUnitOfWork())) + { + return repository.Get(path); + } + } + + public IEnumerable GetXsltFiles(params string[] names) + { + using (var repository = RepositoryFactory.CreateXsltFileRepository(_fileUowProvider.GetUnitOfWork())) + { + return repository.GetAll(names).OrderBy(x => x.Name); + } + } + public Attempt CreatePartialView(IPartialView partialView, string snippetName = null, int userId = 0) { return CreatePartialViewMacro(partialView, PartialViewType.PartialView, snippetName, userId); diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 5fa078e79b..3e1cbdd5ff 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -16,6 +16,8 @@ namespace Umbraco.Core.Services IPartialView GetPartialView(string path); IPartialView GetPartialViewMacro(string path); IEnumerable GetPartialViewMacros(params string[] names); + IXsltFile GetXsltFile(string path); + IEnumerable GetXsltFiles(params string[] names); Attempt CreatePartialView(IPartialView partialView, string snippetName = null, int userId = 0); Attempt CreatePartialViewMacro(IPartialView partialView, string snippetName = null, int userId = 0); bool DeletePartialView(string path, int userId = 0); diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 41366110e7..c357074fb8 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -386,6 +386,7 @@ + @@ -414,6 +415,7 @@ + @@ -490,11 +492,13 @@ + + From 3f65ec3318c2b5ded6e389897ae02abb128da52e Mon Sep 17 00:00:00 2001 From: Claus Date: Fri, 9 Sep 2016 13:36:34 +0200 Subject: [PATCH 058/841] fileservice getting and setting xslt file content. --- src/Umbraco.Core/Services/FileService.cs | 16 ++++++++++++++++ src/Umbraco.Core/Services/IFileService.cs | 14 ++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index bdae4ce55d..aa722e0133 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -603,6 +603,22 @@ namespace Umbraco.Core.Services } } + public Stream GetXsltFileContentStream(string filepath) + { + using (var repository = RepositoryFactory.CreateXsltFileRepository(UowProvider.GetUnitOfWork())) + { + return repository.GetFileContentStream(filepath); + } + } + + public void SetXsltFileContent(string filepath, Stream content) + { + using (var repository = RepositoryFactory.CreateXsltFileRepository(UowProvider.GetUnitOfWork())) + { + repository.SetFileContent(filepath, content); + } + } + #region Partial Views public IEnumerable GetPartialViewSnippetNames(params string[] filterNames) diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 3e1cbdd5ff..7d266ba64c 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -282,6 +282,20 @@ namespace Umbraco.Core.Services /// The content of the script file. void SetScriptFileContent(string filepath, Stream content); + /// + /// Gets the content of a XSLT file as a stream. + /// + /// The filesystem path to the XSLT file. + /// The content of the XSLT file. + Stream GetXsltFileContentStream(string filepath); + + /// + /// Sets the content of a XSLT file. + /// + /// The filesystem path to the XSLT file. + /// The content of the XSLT file. + void SetXsltFileContent(string filepath, Stream content); + /// /// Gets the content of a macro partial view as a stream. /// From b40a1fa6132ad4dda8411036fdbf23df851696c0 Mon Sep 17 00:00:00 2001 From: Claus Date: Mon, 12 Sep 2016 12:47:12 +0200 Subject: [PATCH 059/841] U4-8963 Updates for ImageProcessor parameters to support background color --- .../PropertyEditors/ImageCropperTest.cs | 12 +++++++ src/Umbraco.Web/HtmlHelperRenderExtensions.cs | 10 +++--- .../ImageCropperTemplateExtensions.cs | 32 +++++++++++++------ src/Umbraco.Web/UrlHelperRenderExtensions.cs | 18 +++++++---- 4 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Tests/PropertyEditors/ImageCropperTest.cs b/src/Umbraco.Tests/PropertyEditors/ImageCropperTest.cs index 450c69abb4..d3d6bf156d 100644 --- a/src/Umbraco.Tests/PropertyEditors/ImageCropperTest.cs +++ b/src/Umbraco.Tests/PropertyEditors/ImageCropperTest.cs @@ -358,5 +358,17 @@ namespace Umbraco.Tests.PropertyEditors var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson, height: 200); Assert.AreEqual(mediaPath + "?anchor=center&mode=crop&height=200", urlString); } + + /// + /// Test to check result when using a background color with padding + /// + [Test] + public void GetCropUrl_BackgroundColorParameter() + { + var cropperJson = "{\"focalPoint\": {\"left\": 0.5,\"top\": 0.5},\"src\": \"" + mediaPath + "\",\"crops\": [{\"alias\": \"home\",\"width\": 270,\"height\": 161}]}"; + + var urlString = mediaPath.GetCropUrl(400, 400, cropperJson, imageCropMode: ImageCropMode.Pad, backgroundColor: "fff"); + Assert.AreEqual(mediaPath + "?mode=pad&width=400&height=400&bgcolor=fff", urlString); + } } } \ No newline at end of file diff --git a/src/Umbraco.Web/HtmlHelperRenderExtensions.cs b/src/Umbraco.Web/HtmlHelperRenderExtensions.cs index 3062613b6b..2802e4fe80 100644 --- a/src/Umbraco.Web/HtmlHelperRenderExtensions.cs +++ b/src/Umbraco.Web/HtmlHelperRenderExtensions.cs @@ -228,12 +228,13 @@ namespace Umbraco.Web bool cacheBuster = true, string furtherOptions = null, ImageCropRatioMode? ratioMode = null, - bool upScale = true) + bool upScale = true, + string backgroundColor = null) { return new HtmlString(mediaItem.GetCropUrl(width, height, propertyAlias, cropAlias, quality, imageCropMode, imageCropAnchor, preferFocalPoint, useCropDimensions, cacheBuster, furtherOptions, ratioMode, - upScale)); + upScale, backgroundColor)); } [Obsolete("Use the UrlHelper.GetCropUrl extension instead")] @@ -252,12 +253,13 @@ namespace Umbraco.Web string cacheBusterValue = null, string furtherOptions = null, ImageCropRatioMode? ratioMode = null, - bool upScale = true) + bool upScale = true, + string backgroundColor = null) { return new HtmlString(imageUrl.GetCropUrl(width, height, imageCropperValue, cropAlias, quality, imageCropMode, imageCropAnchor, preferFocalPoint, useCropDimensions, cacheBusterValue, furtherOptions, ratioMode, - upScale)); + upScale, backgroundColor)); } #endregion diff --git a/src/Umbraco.Web/ImageCropperTemplateExtensions.cs b/src/Umbraco.Web/ImageCropperTemplateExtensions.cs index e518c5e246..a9b0140d20 100644 --- a/src/Umbraco.Web/ImageCropperTemplateExtensions.cs +++ b/src/Umbraco.Web/ImageCropperTemplateExtensions.cs @@ -91,10 +91,13 @@ namespace Umbraco.Web /// /// /// Use a dimension as a ratio - /// + /// /// /// If the image should be upscaled to requested dimensions - /// + /// + /// + /// Changes the background color of the image. Used when adding a background when resizing image formats without an alpha channel. + /// /// /// The . /// @@ -112,7 +115,8 @@ namespace Umbraco.Web bool cacheBuster = true, string furtherOptions = null, ImageCropRatioMode? ratioMode = null, - bool upScale = true) + bool upScale = true, + string backgroundColor = null) { if (mediaItem == null) throw new ArgumentNullException("mediaItem"); @@ -132,7 +136,7 @@ namespace Umbraco.Web mediaItemUrl = stronglyTyped.Src; return GetCropUrl( mediaItemUrl, stronglyTyped, width, height, cropAlias, quality, imageCropMode, imageCropAnchor, preferFocalPoint, useCropDimensions, - cacheBusterValue, furtherOptions, ratioMode, upScale); + cacheBusterValue, furtherOptions, ratioMode, upScale, backgroundColor); } //this shouldn't be the case but we'll check @@ -143,14 +147,14 @@ namespace Umbraco.Web mediaItemUrl = stronglyTyped.Src; return GetCropUrl( mediaItemUrl, stronglyTyped, width, height, cropAlias, quality, imageCropMode, imageCropAnchor, preferFocalPoint, useCropDimensions, - cacheBusterValue, furtherOptions, ratioMode, upScale); + cacheBusterValue, furtherOptions, ratioMode, upScale, backgroundColor); } //it's a single string mediaItemUrl = cropperValue.ToString(); return GetCropUrl( mediaItemUrl, width, height, mediaItemUrl, cropAlias, quality, imageCropMode, imageCropAnchor, preferFocalPoint, useCropDimensions, - cacheBusterValue, furtherOptions, ratioMode, upScale); + cacheBusterValue, furtherOptions, ratioMode, upScale, backgroundColor); } /// @@ -198,6 +202,9 @@ namespace Umbraco.Web /// /// If the image should be upscaled to requested dimensions /// + /// + /// Changes the background color of the image. Used when adding a background when resizing image formats without an alpha channel. + /// /// /// The . /// @@ -215,7 +222,8 @@ namespace Umbraco.Web string cacheBusterValue = null, string furtherOptions = null, ImageCropRatioMode? ratioMode = null, - bool upScale = true) + bool upScale = true, + string backgroundColor = null) { if (string.IsNullOrEmpty(imageUrl)) return string.Empty; @@ -226,7 +234,7 @@ namespace Umbraco.Web } return GetCropUrl( imageUrl, cropDataSet, width, height, cropAlias, quality, imageCropMode, - imageCropAnchor, preferFocalPoint, useCropDimensions, cacheBusterValue, furtherOptions, ratioMode, upScale); + imageCropAnchor, preferFocalPoint, useCropDimensions, cacheBusterValue, furtherOptions, ratioMode, upScale, backgroundColor); } public static string GetCropUrl( @@ -243,7 +251,8 @@ namespace Umbraco.Web string cacheBusterValue = null, string furtherOptions = null, ImageCropRatioMode? ratioMode = null, - bool upScale = true) + bool upScale = true, + string backgroundColor = null) { if (string.IsNullOrEmpty(imageUrl) == false) { @@ -350,6 +359,11 @@ namespace Umbraco.Web imageProcessorUrl.Append("&upscale=false"); } + if (backgroundColor != null) + { + imageProcessorUrl.Append("&bgcolor=" + backgroundColor); + } + if (furtherOptions != null) { imageProcessorUrl.Append(furtherOptions); diff --git a/src/Umbraco.Web/UrlHelperRenderExtensions.cs b/src/Umbraco.Web/UrlHelperRenderExtensions.cs index 629d69ed4a..76a000aded 100644 --- a/src/Umbraco.Web/UrlHelperRenderExtensions.cs +++ b/src/Umbraco.Web/UrlHelperRenderExtensions.cs @@ -114,6 +114,9 @@ namespace Umbraco.Web /// Whether to HTML encode this URL - default is true - w3c standards require html attributes to be html encoded but this can be /// set to false if using the result of this method for CSS. /// + /// + /// Changes the background color of the image. Used when adding a background when resizing image formats without an alpha channel. + /// /// /// The . /// @@ -132,11 +135,12 @@ namespace Umbraco.Web string furtherOptions = null, ImageCropRatioMode? ratioMode = null, bool upScale = true, - bool htmlEncode = true) + bool htmlEncode = true, + string backgroundColor = null) { var url = mediaItem.GetCropUrl(width, height, propertyAlias, cropAlias, quality, imageCropMode, imageCropAnchor, preferFocalPoint, useCropDimensions, cacheBuster, furtherOptions, ratioMode, - upScale); + upScale, backgroundColor); return htmlEncode ? new HtmlString(HttpUtility.HtmlEncode(url)) : new HtmlString(url); } @@ -190,6 +194,9 @@ namespace Umbraco.Web /// Whether to HTML encode this URL - default is true - w3c standards require html attributes to be html encoded but this can be /// set to false if using the result of this method for CSS. /// + /// + /// Changes the background color of the image. Used when adding a background when resizing image formats without an alpha channel. + /// /// /// The . /// @@ -208,11 +215,12 @@ namespace Umbraco.Web string furtherOptions = null, ImageCropRatioMode? ratioMode = null, bool upScale = true, - bool htmlEncode = true) + bool htmlEncode = true, + string backgroundColor = null) { var url = imageUrl.GetCropUrl(width, height, imageCropperValue, cropAlias, quality, imageCropMode, imageCropAnchor, preferFocalPoint, useCropDimensions, cacheBusterValue, furtherOptions, ratioMode, - upScale); + upScale, backgroundColor); return htmlEncode ? new HtmlString(HttpUtility.HtmlEncode(url)) : new HtmlString(url); } @@ -333,7 +341,5 @@ namespace Umbraco.Web { return url.SurfaceAction(action, typeof (T), additionalRouteVals); } - - } } \ No newline at end of file From 597b9bbfcb5a0d7b7cce9a336fcb07800efc3f9b Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 12 Sep 2016 18:36:08 +0200 Subject: [PATCH 060/841] Introduce SafeCallContext to fix breaking test (wondering if using logical call context a breaking change) --- .../Packaging/PackageBinaryInspector.cs | 38 ++++---- .../Persistence/DefaultDatabaseFactory.cs | 87 ++++++++++++++----- .../Persistence/UmbracoDatabase.cs | 2 - src/Umbraco.Core/SafeCallContext.cs | 68 +++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + src/Umbraco.Tests/CallContextTests.cs | 44 ++++++++++ .../Persistence/DatabaseContextTests.cs | 5 +- .../TestHelpers/BaseDatabaseFactoryTest.cs | 5 ++ .../BaseUmbracoConfigurationTest.cs | 19 ++-- src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + 10 files changed, 217 insertions(+), 53 deletions(-) create mode 100644 src/Umbraco.Core/SafeCallContext.cs create mode 100644 src/Umbraco.Tests/CallContextTests.cs diff --git a/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs b/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs index 8852475543..6f048bbf2c 100644 --- a/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs +++ b/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs @@ -29,20 +29,24 @@ namespace Umbraco.Core.Packaging /// public static IEnumerable ScanAssembliesForTypeReference(IEnumerable assemblys, out string[] errorReport) { - var appDomain = GetTempAppDomain(); - var type = typeof(PackageBinaryInspector); - try + // beware! when toying with domains, use a safe call context! + using (new SafeCallContext()) { - var value = (PackageBinaryInspector)appDomain.CreateInstanceAndUnwrap( - type.Assembly.FullName, - type.FullName); - // do NOT turn PerformScan into static (even if ReSharper says so)! - var result = value.PerformScan(assemblys.ToArray(), out errorReport); - return result; - } - finally - { - AppDomain.Unload(appDomain); + var appDomain = GetTempAppDomain(); + var type = typeof(PackageBinaryInspector); + try + { + var value = (PackageBinaryInspector) appDomain.CreateInstanceAndUnwrap( + type.Assembly.FullName, + type.FullName); + // do NOT turn PerformScan into static (even if ReSharper says so)! + var result = value.PerformScan(assemblys.ToArray(), out errorReport); + return result; + } + finally + { + AppDomain.Unload(appDomain); + } } } @@ -281,12 +285,8 @@ namespace Umbraco.Core.Packaging PrivateBinPathProbe = AppDomain.CurrentDomain.SetupInformation.PrivateBinPathProbe }; - //create new domain with full trust - return AppDomain.CreateDomain( - appName, - AppDomain.CurrentDomain.Evidence, - domainSetup, - new PermissionSet(PermissionState.Unrestricted)); + // create new domain with full trust + return AppDomain.CreateDomain(appName, AppDomain.CurrentDomain.Evidence, domainSetup, new PermissionSet(PermissionState.Unrestricted)); } } } diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs index d7f8fa6488..c0aa9e1253 100644 --- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs @@ -1,7 +1,6 @@ using System; using System.Runtime.Remoting.Messaging; using System.Web; -using Umbraco.Core.Configuration; using Umbraco.Core.Logging; namespace Umbraco.Core.Persistence @@ -46,9 +45,12 @@ namespace Umbraco.Core.Persistence /// public DefaultDatabaseFactory(string connectionStringName, ILogger logger) { - if (logger == null) throw new ArgumentNullException("logger"); + if (logger == null) throw new ArgumentNullException("logger"); Mandate.ParameterNotNullOrEmpty(connectionStringName, "connectionStringName"); - _connectionStringName = connectionStringName; + + //if (NonContextValue != null) throw new Exception("NonContextValue is not null."); + + _connectionStringName = connectionStringName; _logger = logger; } @@ -60,10 +62,13 @@ namespace Umbraco.Core.Persistence /// public DefaultDatabaseFactory(string connectionString, string providerName, ILogger logger) { - if (logger == null) throw new ArgumentNullException("logger"); + if (logger == null) throw new ArgumentNullException("logger"); Mandate.ParameterNotNullOrEmpty(connectionString, "connectionString"); Mandate.ParameterNotNullOrEmpty(providerName, "providerName"); - ConnectionString = connectionString; + + //if (NonContextValue != null) throw new Exception("NonContextValue is not null."); + + ConnectionString = connectionString; ProviderName = providerName; _logger = logger; } @@ -120,29 +125,14 @@ namespace Umbraco.Core.Persistence else { var db = (UmbracoDatabase) HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; - if (db != null) - { - db.Dispose(); - HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); - } + if (db != null) db.Dispose(); + HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); } } protected override void DisposeResources() { - if (HttpContext.Current == null) - { - var value = NonContextValue; - if (value != null) value.Dispose(); - NonContextValue = null; - } - else - { - if (HttpContext.Current.Items.Contains(typeof(DefaultDatabaseFactory))) - { - ((UmbracoDatabase)HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]).Dispose(); - } - } + ReleaseDatabase(); } internal void ResetForTests() @@ -151,5 +141,56 @@ namespace Umbraco.Core.Persistence if (value != null) value.Dispose(); NonContextValue = null; } + + #region SafeCallContext + + // see notes in SafeCallContext - need to do this since we are using + // the logical call context... + + static DefaultDatabaseFactory() + { + SafeCallContext.Register(DetachDatabase, AttachDatabase); + } + + // detaches the current database + // ie returns the database and remove it from whatever is "context" + private static UmbracoDatabase DetachDatabase() + { + if (HttpContext.Current == null) + { + var db = NonContextValue; + NonContextValue = null; + return db; + } + else + { + var db = (UmbracoDatabase) HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; + HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); + return db; + } + } + + // attach a current database + // ie assign it to whatever is "context" + // throws if there already is a database + private static void AttachDatabase(object o) + { + if (o == null) return; + var database = o as UmbracoDatabase; + if (database == null) throw new ArgumentException("Not an UmbracoDatabase.", "o"); + + if (HttpContext.Current == null) + { + if (NonContextValue != null) throw new InvalidOperationException(); + NonContextValue = database; + } + else + { + if (HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] != null) throw new InvalidOperationException(); + HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] = database; + } + } + + #endregion } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs index 5ca30f2860..7ff9cabe84 100644 --- a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs @@ -1,8 +1,6 @@ using System; -using System.Collections.Generic; using System.Data; using System.Data.Common; -using System.Linq; using System.Text; using StackExchange.Profiling; using Umbraco.Core.Logging; diff --git a/src/Umbraco.Core/SafeCallContext.cs b/src/Umbraco.Core/SafeCallContext.cs new file mode 100644 index 0000000000..16b12ebd1d --- /dev/null +++ b/src/Umbraco.Core/SafeCallContext.cs @@ -0,0 +1,68 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Threading; +using Umbraco.Core.Persistence; + +namespace Umbraco.Core +{ + internal class SafeCallContext : IDisposable + { + private static readonly List> EnterFuncs = new List>(); + private static readonly List> ExitActions = new List>(); + private static int _count; + private readonly List _objects; + private bool _disposed; + + public static void Register(Func enterFunc, Action exitAction) + { + if (enterFunc == null) throw new ArgumentNullException("enterFunc"); + if (exitAction == null) throw new ArgumentNullException("exitAction"); + + lock (EnterFuncs) + { + if (_count > 0) throw new Exception("Busy."); + EnterFuncs.Add(enterFunc); + ExitActions.Add(exitAction); + } + } + + public static void ClearCallContext() + { + lock (EnterFuncs) + { + var ignore = EnterFuncs.Select(x => x()).ToList(); + } + } + + // tried to make the UmbracoDatabase serializable but then it leaks to weird places + // in ReSharper and so on, where Umbraco.Core is not available. Tried to serialize + // as an object instead but then it comes *back* deserialized into the original context + // as an object and of course it breaks everything. Cannot prevent this from flowing, + // and ExecutionContext.SuppressFlow() works for threads but not domains. and we'll + // have the same issue with anything that toys with logical call context... so this + // class let them register & deal with the situation (removing themselves) + + public SafeCallContext() + { + Interlocked.Increment(ref _count); + lock (EnterFuncs) + { + _count++; + _objects = EnterFuncs.Select(x => x()).ToList(); + } + } + + public void Dispose() + { + if (_disposed) throw new ObjectDisposedException("this"); + _disposed = true; + lock (EnterFuncs) + { + for (var i = 0; i < ExitActions.Count; i++) + ExitActions[i](_objects[i]); + _count--; + } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index c357074fb8..96e87d67f3 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -420,6 +420,7 @@ + diff --git a/src/Umbraco.Tests/CallContextTests.cs b/src/Umbraco.Tests/CallContextTests.cs new file mode 100644 index 0000000000..fe55717c41 --- /dev/null +++ b/src/Umbraco.Tests/CallContextTests.cs @@ -0,0 +1,44 @@ +using System.Runtime.Remoting.Messaging; +using NUnit.Framework; + +namespace Umbraco.Tests +{ + [TestFixture] + public class CallContextTests + { + [SetUp] + public void Setup() + { + ClearCallContext(); + } + + [TearDown] + public void TearDown() + { + ClearCallContext(); + } + + private static void ClearCallContext() + { + // logical call context leaks between tests + // cleanup things before/after we've run else one of + // the two tests will fail + CallContext.FreeNamedDataSlot("test1"); + CallContext.FreeNamedDataSlot("test2"); + } + + [Test] + public void Test1() + { + CallContext.LogicalSetData("test1", "test1"); + Assert.IsNull(CallContext.LogicalGetData("test2")); + } + + [Test] + public void Test2() + { + CallContext.LogicalSetData("test2", "test2"); + Assert.IsNull(CallContext.LogicalGetData("test1")); + } + } +} diff --git a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs index 94f0010201..a97ea14535 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs @@ -23,6 +23,9 @@ namespace Umbraco.Tests.Persistence [SetUp] public void Setup() { + // bah + SafeCallContext.ClearCallContext(); + _dbContext = new DatabaseContext( new DefaultDatabaseFactory(Core.Configuration.GlobalSettings.UmbracoConnectionName, Mock.Of()), Mock.Of(), new SqlCeSyntaxProvider(), Constants.DatabaseProviders.SqlCe); @@ -98,7 +101,7 @@ namespace Umbraco.Tests.Persistence var schemaHelper = new DatabaseSchemaHelper(_dbContext.Database, Mock.Of(), new SqlCeSyntaxProvider()); var appCtx = new ApplicationContext( - new DatabaseContext(Mock.Of(), Mock.Of(), Mock.Of(), "test"), + _dbContext, new ServiceContext(migrationEntryService: Mock.Of()), CacheHelper.CreateDisabledCacheHelper(), new ProfilingLogger(Mock.Of(), Mock.Of())); diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index 28649457dd..d159e055a5 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -61,6 +61,11 @@ namespace Umbraco.Tests.TestHelpers var path = TestHelper.CurrentAssemblyDirectory; AppDomain.CurrentDomain.SetData("DataDirectory", path); + // fixme - in theory we should not need this + // it's done in base.Initialize() and no idea why we do things + // in this order here... not going to change it now though... + SafeCallContext.ClearCallContext(); + _dbFactory = new DefaultDatabaseFactory( GetDbConnectionString(), GetDbProviderName(), diff --git a/src/Umbraco.Tests/TestHelpers/BaseUmbracoConfigurationTest.cs b/src/Umbraco.Tests/TestHelpers/BaseUmbracoConfigurationTest.cs index 7f59c3e0b5..62548aecb6 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseUmbracoConfigurationTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseUmbracoConfigurationTest.cs @@ -1,6 +1,5 @@ using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Configuration.UmbracoSettings; namespace Umbraco.Tests.TestHelpers { @@ -10,21 +9,25 @@ namespace Umbraco.Tests.TestHelpers [TestFixture] public abstract class BaseUmbracoConfigurationTest { - - [SetUp] public virtual void Initialize() { - SettingsForTests.Reset(); - + Reset(); } [TearDown] public virtual void TearDown() { - //reset settings - SettingsForTests.Reset(); - + Reset(); + } + + private static void Reset() + { + // reset settings + SettingsForTests.Reset(); + + // clear the logical call context + SafeCallContext.ClearCallContext(); } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index c2c6e785ec..23f8b74d8d 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -175,6 +175,7 @@ + From 1589f9105c3d37ceb2f2fe3e3b18487b2adea3ca Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 13 Sep 2016 08:33:04 +0200 Subject: [PATCH 061/841] Bugfix SafeCallContext --- src/Umbraco.Core/SafeCallContext.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Core/SafeCallContext.cs b/src/Umbraco.Core/SafeCallContext.cs index 16b12ebd1d..eae926d46c 100644 --- a/src/Umbraco.Core/SafeCallContext.cs +++ b/src/Umbraco.Core/SafeCallContext.cs @@ -45,7 +45,6 @@ namespace Umbraco.Core public SafeCallContext() { - Interlocked.Increment(ref _count); lock (EnterFuncs) { _count++; From 6b0377bb719ae949231d13497e5c4a242d8d264a Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 13 Sep 2016 09:38:16 +0200 Subject: [PATCH 062/841] Cleanup SafeCallContext --- src/Umbraco.Core/SafeCallContext.cs | 53 ++++++++++---- src/Umbraco.Tests/CallContextTests.cs | 70 +++++++++++++++---- .../Persistence/DatabaseContextTests.cs | 2 +- .../TestHelpers/BaseDatabaseFactoryTest.cs | 2 +- .../BaseUmbracoConfigurationTest.cs | 2 +- 5 files changed, 98 insertions(+), 31 deletions(-) diff --git a/src/Umbraco.Core/SafeCallContext.cs b/src/Umbraco.Core/SafeCallContext.cs index eae926d46c..5ed41d389f 100644 --- a/src/Umbraco.Core/SafeCallContext.cs +++ b/src/Umbraco.Core/SafeCallContext.cs @@ -1,8 +1,6 @@ using System; using System.Linq; using System.Collections.Generic; -using System.Threading; -using Umbraco.Core.Persistence; namespace Umbraco.Core { @@ -21,27 +19,45 @@ namespace Umbraco.Core lock (EnterFuncs) { - if (_count > 0) throw new Exception("Busy."); + if (_count > 0) throw new InvalidOperationException("Cannot register while some SafeCallContext instances exist."); EnterFuncs.Add(enterFunc); ExitActions.Add(exitAction); } } - public static void ClearCallContext() - { - lock (EnterFuncs) - { - var ignore = EnterFuncs.Select(x => x()).ToList(); - } - } - // tried to make the UmbracoDatabase serializable but then it leaks to weird places // in ReSharper and so on, where Umbraco.Core is not available. Tried to serialize // as an object instead but then it comes *back* deserialized into the original context // as an object and of course it breaks everything. Cannot prevent this from flowing, // and ExecutionContext.SuppressFlow() works for threads but not domains. and we'll - // have the same issue with anything that toys with logical call context... so this - // class let them register & deal with the situation (removing themselves) + // have the same issue with anything that toys with logical call context... + // + // so this class lets anything that uses the logical call context register itself, + // providing two methods: + // - an enter func that removes and returns whatever is in the logical call context + // - an exit action that restores the value into the logical call context + // whenever a SafeCallContext instance is created, it uses these methods to capture + // and clear the logical call context, and restore it when disposed. + // + // in addition, a static Clear method is provided - which uses the enter funcs to + // remove everything from logical call context - not to be used when the app runs, + // but can be useful during tests + // + // note + // see System.Transactions + // they are using a conditional weak table to store the data, and what they store in + // LLC is the key - which is just an empty MarshalByRefObject that is created with + // the transaction scope - that way, they can "clear current data" provided that + // they have the key - but they need to hold onto a ref to the scope... not ok for us + + public static void Clear() + { + lock (EnterFuncs) + { + foreach (var enter in EnterFuncs) + enter(); + } + } public SafeCallContext() { @@ -63,5 +79,16 @@ namespace Umbraco.Core _count--; } } + + // for unit tests ONLY + internal static void Reset() + { + lock (EnterFuncs) + { + if (_count > 0) throw new InvalidOperationException("Cannot reset while some SafeCallContext instances exist."); + EnterFuncs.Clear(); + ExitActions.Clear(); + } + } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/CallContextTests.cs b/src/Umbraco.Tests/CallContextTests.cs index fe55717c41..0c2c6dd203 100644 --- a/src/Umbraco.Tests/CallContextTests.cs +++ b/src/Umbraco.Tests/CallContextTests.cs @@ -1,37 +1,62 @@ using System.Runtime.Remoting.Messaging; using NUnit.Framework; +using Umbraco.Core; namespace Umbraco.Tests { [TestFixture] public class CallContextTests { + private static bool _first; + + static CallContextTests() + { + SafeCallContext.Register(() => + { + CallContext.FreeNamedDataSlot("test1"); + CallContext.FreeNamedDataSlot("test2"); + return null; + }, o => {}); + } + + [TestFixtureSetUp] + public void SetUpFixture() + { + _first = true; + } + + // logical call context leaks between tests + // is is required to clear it before tests begin + // (don't trust other tests properly tearing down) + [SetUp] public void Setup() { - ClearCallContext(); + SafeCallContext.Clear(); } - [TearDown] - public void TearDown() - { - ClearCallContext(); - } - - private static void ClearCallContext() - { - // logical call context leaks between tests - // cleanup things before/after we've run else one of - // the two tests will fail - CallContext.FreeNamedDataSlot("test1"); - CallContext.FreeNamedDataSlot("test2"); - } + //[TearDown] + //public void TearDown() + //{ + // SafeCallContext.Clear(); + //} [Test] public void Test1() { CallContext.LogicalSetData("test1", "test1"); Assert.IsNull(CallContext.LogicalGetData("test2")); + + CallContext.LogicalSetData("test3b", "test3b"); + + if (_first) + { + _first = false; + } + else + { + Assert.IsNotNull(CallContext.LogicalGetData("test3a")); // leak! + } } [Test] @@ -40,5 +65,20 @@ namespace Umbraco.Tests CallContext.LogicalSetData("test2", "test2"); Assert.IsNull(CallContext.LogicalGetData("test1")); } + + [Test] + public void Test3() + { + CallContext.LogicalSetData("test3a", "test3a"); + + if (_first) + { + _first = false; + } + else + { + Assert.IsNotNull(CallContext.LogicalGetData("test3b")); // leak! + } + } } } diff --git a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs index a97ea14535..5919d23acc 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs @@ -24,7 +24,7 @@ namespace Umbraco.Tests.Persistence public void Setup() { // bah - SafeCallContext.ClearCallContext(); + SafeCallContext.Clear(); _dbContext = new DatabaseContext( new DefaultDatabaseFactory(Core.Configuration.GlobalSettings.UmbracoConnectionName, Mock.Of()), diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index d159e055a5..c34620432f 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -64,7 +64,7 @@ namespace Umbraco.Tests.TestHelpers // fixme - in theory we should not need this // it's done in base.Initialize() and no idea why we do things // in this order here... not going to change it now though... - SafeCallContext.ClearCallContext(); + SafeCallContext.Clear(); _dbFactory = new DefaultDatabaseFactory( GetDbConnectionString(), diff --git a/src/Umbraco.Tests/TestHelpers/BaseUmbracoConfigurationTest.cs b/src/Umbraco.Tests/TestHelpers/BaseUmbracoConfigurationTest.cs index 62548aecb6..ceb8d84727 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseUmbracoConfigurationTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseUmbracoConfigurationTest.cs @@ -27,7 +27,7 @@ namespace Umbraco.Tests.TestHelpers SettingsForTests.Reset(); // clear the logical call context - SafeCallContext.ClearCallContext(); + SafeCallContext.Clear(); } } } \ No newline at end of file From 5cd7cba4fbced8ef453f7f52e0d48f1244932565 Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 13 Sep 2016 19:48:38 +0200 Subject: [PATCH 063/841] Fix content repo to respect dates if forced --- src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 9222769247..00c723684c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -486,7 +486,8 @@ namespace Umbraco.Core.Persistence.Repositories } else { - entity.UpdateDate = DateTime.Now; + if (entity.IsPropertyDirty("UpdateDate") == false || entity.UpdateDate == default(DateTime)) + entity.UpdateDate = DateTime.Now; } //Ensure unique name on the same level From ab3b04c1659006006f781a7b72e483b18981d5d2 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 15 Sep 2016 12:14:25 +0200 Subject: [PATCH 064/841] Fix SqlHelper so it uses to current db connection --- src/SQLCE4Umbraco/SqlCEHelper.cs | 35 ++- src/SQLCE4Umbraco/SqlCeApplicationBlock.cs | 264 ++++++++++++------ src/SolutionInfo.cs | 2 +- .../Configuration/UmbracoVersion.cs | 2 +- .../Persistence/DefaultDatabaseFactory.cs | 8 +- src/Umbraco.Web.UI/config/Dashboard.config | 10 + .../Properties/AssemblyInfo.cs | 2 + src/umbraco.datalayer/SqlHelper.cs | 107 +++++++ .../SqlHelpers/MySql/MySqlHelper.cs | 69 ++++- .../SqlHelpers/SqlServer/SqlServerHelper.cs | 32 ++- 10 files changed, 412 insertions(+), 119 deletions(-) diff --git a/src/SQLCE4Umbraco/SqlCEHelper.cs b/src/SQLCE4Umbraco/SqlCEHelper.cs index ab6f686c21..a8567abd67 100644 --- a/src/SQLCE4Umbraco/SqlCEHelper.cs +++ b/src/SQLCE4Umbraco/SqlCEHelper.cs @@ -180,12 +180,16 @@ namespace SqlCE4Umbraco /// The return value of the command. protected override object ExecuteScalar(string commandText, SqlCeParameter[] parameters) { - #if DEBUG && DebugDataLayer +#if DEBUG && DebugDataLayer // Log Query Execution Trace.TraceInformation(GetType().Name + " SQL ExecuteScalar: " + commandText); - #endif - - return SqlCeApplicationBlock.ExecuteScalar(ConnectionString, CommandType.Text, commandText, parameters); +#endif + using (var cc = UseCurrentConnection) + { + return SqlCeApplicationBlock.ExecuteScalar( + (SqlCeConnection) cc.Connection, (SqlCeTransaction) cc.Transaction, + CommandType.Text, commandText, parameters); + } } /// @@ -198,12 +202,17 @@ namespace SqlCE4Umbraco /// protected override int ExecuteNonQuery(string commandText, SqlCeParameter[] parameters) { - #if DEBUG && DebugDataLayer +#if DEBUG && DebugDataLayer // Log Query Execution Trace.TraceInformation(GetType().Name + " SQL ExecuteNonQuery: " + commandText); - #endif +#endif - return SqlCeApplicationBlock.ExecuteNonQuery(ConnectionString, CommandType.Text, commandText, parameters); + using (var cc = UseCurrentConnection) + { + return SqlCeApplicationBlock.ExecuteNonQuery( + (SqlCeConnection) cc.Connection, (SqlCeTransaction) cc.Transaction, + CommandType.Text, commandText, parameters); + } } /// @@ -216,13 +225,17 @@ namespace SqlCE4Umbraco /// protected override IRecordsReader ExecuteReader(string commandText, SqlCeParameter[] parameters) { - #if DEBUG && DebugDataLayer +#if DEBUG && DebugDataLayer // Log Query Execution Trace.TraceInformation(GetType().Name + " SQL ExecuteReader: " + commandText); - #endif +#endif - return new SqlCeDataReaderHelper(SqlCeApplicationBlock.ExecuteReader(ConnectionString, CommandType.Text, - commandText, parameters)); + using (var cc = UseCurrentConnection) + { + return new SqlCeDataReaderHelper(SqlCeApplicationBlock.ExecuteReader( + (SqlCeConnection) cc.Connection, (SqlCeTransaction) cc.Transaction, + CommandType.Text, commandText, parameters)); + } } diff --git a/src/SQLCE4Umbraco/SqlCeApplicationBlock.cs b/src/SQLCE4Umbraco/SqlCeApplicationBlock.cs index 5cd9bc2140..fd778bbfb3 100644 --- a/src/SQLCE4Umbraco/SqlCeApplicationBlock.cs +++ b/src/SQLCE4Umbraco/SqlCeApplicationBlock.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Data.SqlServerCe; using System.Data; using System.Diagnostics; @@ -26,30 +24,61 @@ namespace SqlCE4Umbraco params SqlCeParameter[] commandParameters ) { - object retVal; - try { - using (SqlCeConnection conn = SqlCeContextGuardian.Open(connectionString)) + using (var conn = SqlCeContextGuardian.Open(connectionString)) { - using (SqlCeCommand cmd = new SqlCeCommand(commandText, conn)) - { - AttachParameters(cmd, commandParameters); - Debug.WriteLine("---------------------------------SCALAR-------------------------------------"); - Debug.WriteLine(commandText); - Debug.WriteLine("----------------------------------------------------------------------------"); - retVal = cmd.ExecuteScalar(); - } + return ExecuteScalarTry(conn, null, commandText, commandParameters); } - - return retVal; } catch (Exception ee) { - throw new SqlCeProviderException("Error running Scalar: \nSQL Statement:\n" + commandText + "\n\nException:\n" + ee.ToString()); + throw new SqlCeProviderException("Error running Scalar: \nSQL Statement:\n" + commandText + "\n\nException:\n" + ee); } } + public static object ExecuteScalar( + SqlCeConnection conn, SqlCeTransaction trx, + CommandType commandType, + string commandText, + params SqlCeParameter[] commandParameters) + { + try + { + return ExecuteScalarTry(conn, trx, commandText, commandParameters); + } + catch (Exception ee) + { + throw new SqlCeProviderException("Error running Scalar: \nSQL Statement:\n" + commandText + "\n\nException:\n" + ee); + } + } + + public static object ExecuteScalar( + SqlCeConnection conn, + CommandType commandType, + string commandText, + params SqlCeParameter[] commandParameters) + { + return ExecuteScalar(conn, null, commandType, commandText, commandParameters); + } + + private static object ExecuteScalarTry( + SqlCeConnection conn, SqlCeTransaction trx, + string commandText, + params SqlCeParameter[] commandParameters) + { + object retVal; + using (var cmd = trx == null ? new SqlCeCommand(commandText, conn) : new SqlCeCommand(commandText, conn, trx)) + { + AttachParameters(cmd, commandParameters); + Debug.WriteLine("---------------------------------SCALAR-------------------------------------"); + Debug.WriteLine(commandText); + Debug.WriteLine("----------------------------------------------------------------------------"); + retVal = cmd.ExecuteScalar(); + } + return retVal; + } + /// /// /// @@ -66,49 +95,10 @@ namespace SqlCE4Umbraco { try { - int rowsAffected; - using (SqlCeConnection conn = SqlCeContextGuardian.Open(connectionString)) + using (var conn = SqlCeContextGuardian.Open(connectionString)) { - // this is for multiple queries in the installer - if (commandText.Trim().StartsWith("!!!")) - { - commandText = commandText.Trim().Trim('!'); - string[] commands = commandText.Split('|'); - string currentCmd = String.Empty; - - foreach (string cmd in commands) - { - try - { - currentCmd = cmd; - if (!String.IsNullOrWhiteSpace(cmd)) - { - SqlCeCommand c = new SqlCeCommand(cmd, conn); - c.ExecuteNonQuery(); - } - } - catch (Exception e) - { - Debug.WriteLine("*******************************************************************"); - Debug.WriteLine(currentCmd); - Debug.WriteLine(e); - Debug.WriteLine("*******************************************************************"); - } - } - return 1; - } - else - { - Debug.WriteLine("----------------------------------------------------------------------------"); - Debug.WriteLine(commandText); - Debug.WriteLine("----------------------------------------------------------------------------"); - SqlCeCommand cmd = new SqlCeCommand(commandText, conn); - AttachParameters(cmd, commandParameters); - rowsAffected = cmd.ExecuteNonQuery(); - } + return ExecuteNonQueryTry(conn, null, commandText, commandParameters); } - - return rowsAffected; } catch (Exception ee) { @@ -116,6 +106,74 @@ namespace SqlCE4Umbraco } } + public static int ExecuteNonQuery( + SqlCeConnection conn, + CommandType commandType, + string commandText, + params SqlCeParameter[] commandParameters + ) + { + return ExecuteNonQuery(conn, null, commandType, commandText, commandParameters); + } + + public static int ExecuteNonQuery( + SqlCeConnection conn, SqlCeTransaction trx, + CommandType commandType, + string commandText, + params SqlCeParameter[] commandParameters + ) + { + try + { + return ExecuteNonQueryTry(conn, trx, commandText, commandParameters); + } + catch (Exception ee) + { + throw new SqlCeProviderException("Error running NonQuery: \nSQL Statement:\n" + commandText + "\n\nException:\n" + ee.ToString()); + } + } + + private static int ExecuteNonQueryTry( + SqlCeConnection conn, SqlCeTransaction trx, + string commandText, + params SqlCeParameter[] commandParameters) + { + // this is for multiple queries in the installer + if (commandText.Trim().StartsWith("!!!")) + { + commandText = commandText.Trim().Trim('!'); + var commands = commandText.Split('|'); + var currentCmd = string.Empty; + + foreach (var command in commands) + { + try + { + currentCmd = command; + if (string.IsNullOrWhiteSpace(command)) continue; + var c = trx == null ? new SqlCeCommand(command, conn) : new SqlCeCommand(command, conn, trx); + c.ExecuteNonQuery(); + } + catch (Exception e) + { + Debug.WriteLine("*******************************************************************"); + Debug.WriteLine(currentCmd); + Debug.WriteLine(e); + Debug.WriteLine("*******************************************************************"); + } + } + return 1; + } + + Debug.WriteLine("----------------------------------------------------------------------------"); + Debug.WriteLine(commandText); + Debug.WriteLine("----------------------------------------------------------------------------"); + var cmd = new SqlCeCommand(commandText, conn); + AttachParameters(cmd, commandParameters); + var rowsAffected = cmd.ExecuteNonQuery(); + return rowsAffected; + } + /// /// /// @@ -133,25 +191,8 @@ namespace SqlCE4Umbraco { try { - Debug.WriteLine("---------------------------------READER-------------------------------------"); - Debug.WriteLine(commandText); - Debug.WriteLine("----------------------------------------------------------------------------"); - SqlCeDataReader reader; - SqlCeConnection conn = SqlCeContextGuardian.Open(connectionString); - - try - { - SqlCeCommand cmd = new SqlCeCommand(commandText, conn); - AttachParameters(cmd, commandParameters); - reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); - } - catch - { - conn.Close(); - throw; - } - - return reader; + var conn = SqlCeContextGuardian.Open(connectionString); + return ExecuteReaderTry(conn, null, commandText, commandParameters); } catch (Exception ee) { @@ -159,30 +200,71 @@ namespace SqlCE4Umbraco } } - public static bool VerifyConnection(string connectionString) + public static SqlCeDataReader ExecuteReader( + SqlCeConnection conn, + CommandType commandType, + string commandText, + params SqlCeParameter[] commandParameters + ) { - bool isConnected = false; - using (SqlCeConnection conn = SqlCeContextGuardian.Open(connectionString)) - { - isConnected = conn.State == ConnectionState.Open; - } - - return isConnected; + return ExecuteReader(conn, commandType, commandText, commandParameters); } - private static void AttachParameters(SqlCeCommand command, SqlCeParameter[] commandParameters) + public static SqlCeDataReader ExecuteReader( + SqlCeConnection conn, SqlCeTransaction trx, + CommandType commandType, + string commandText, + params SqlCeParameter[] commandParameters + ) { - foreach (SqlCeParameter parameter in commandParameters) + try + { + return ExecuteReaderTry(conn, trx, commandText, commandParameters); + } + catch (Exception ee) + { + throw new SqlCeProviderException("Error running Reader: \nSQL Statement:\n" + commandText + "\n\nException:\n" + ee.ToString()); + } + } + + private static SqlCeDataReader ExecuteReaderTry( + SqlCeConnection conn, SqlCeTransaction trx, + string commandText, + params SqlCeParameter[] commandParameters) + { + Debug.WriteLine("---------------------------------READER-------------------------------------"); + Debug.WriteLine(commandText); + Debug.WriteLine("----------------------------------------------------------------------------"); + + try + { + var cmd = trx == null ? new SqlCeCommand(commandText, conn) : new SqlCeCommand(commandText, conn, trx); + AttachParameters(cmd, commandParameters); + return cmd.ExecuteReader(CommandBehavior.CloseConnection); + } + catch + { + conn.Close(); + throw; + } + } + + public static bool VerifyConnection(string connectionString) + { + using (var conn = SqlCeContextGuardian.Open(connectionString)) + { + return conn.State == ConnectionState.Open; + } + } + + private static void AttachParameters(SqlCeCommand command, IEnumerable commandParameters) + { + foreach (var parameter in commandParameters) { if ((parameter.Direction == ParameterDirection.InputOutput) && (parameter.Value == null)) - { parameter.Value = DBNull.Value; - } command.Parameters.Add(parameter); } } - - - } } diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index 52ddd99a97..56ba43794a 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -12,4 +12,4 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("7.6.0")] -[assembly: AssemblyInformationalVersion("7.6.0-alpha004")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("7.6.0-alpha008")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index aaf0ec0619..b30782cdb0 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "alpha004"; } } + public static string CurrentComment { get { return "alpha008"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs index c0aa9e1253..d461801aa4 100644 --- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs @@ -175,9 +175,8 @@ namespace Umbraco.Core.Persistence // throws if there already is a database private static void AttachDatabase(object o) { - if (o == null) return; var database = o as UmbracoDatabase; - if (database == null) throw new ArgumentException("Not an UmbracoDatabase.", "o"); + if (o != null && database == null) throw new ArgumentException("Not an UmbracoDatabase.", "o"); if (HttpContext.Current == null) { @@ -187,7 +186,10 @@ namespace Umbraco.Core.Persistence else { if (HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] != null) throw new InvalidOperationException(); - HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] = database; + if (database == null) + HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); + else + HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] = database; } } diff --git a/src/Umbraco.Web.UI/config/Dashboard.config b/src/Umbraco.Web.UI/config/Dashboard.config index 81bd9be6e8..b72bfa9f84 100644 --- a/src/Umbraco.Web.UI/config/Dashboard.config +++ b/src/Umbraco.Web.UI/config/Dashboard.config @@ -119,4 +119,14 @@ +
    + + content + + + + /App_Plugins/Deploy/views/dashboards/dashboard.html + + +
    diff --git a/src/umbraco.datalayer/Properties/AssemblyInfo.cs b/src/umbraco.datalayer/Properties/AssemblyInfo.cs index 7f5caaee39..2062f36415 100644 --- a/src/umbraco.datalayer/Properties/AssemblyInfo.cs +++ b/src/umbraco.datalayer/Properties/AssemblyInfo.cs @@ -25,3 +25,5 @@ using System.Runtime.InteropServices; // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("6210756f-436d-4536-bad3-d7b000e1694f")] + +[assembly: InternalsVisibleTo("SqlCE4Umbraco")] \ No newline at end of file diff --git a/src/umbraco.datalayer/SqlHelper.cs b/src/umbraco.datalayer/SqlHelper.cs index db850e6832..4420e8bde0 100644 --- a/src/umbraco.datalayer/SqlHelper.cs +++ b/src/umbraco.datalayer/SqlHelper.cs @@ -10,6 +10,7 @@ using System; using System.Data; using System.Diagnostics; using System.IO; +using System.Reflection; using System.Xml; using umbraco.DataLayer.Utility; using Umbraco.Core.Logging; @@ -343,5 +344,111 @@ namespace umbraco.DataLayer { } #endregion + + #region Evil Reflection + + internal CurrentConnectionUsing UseCurrentConnection + { + get { return new CurrentConnectionUsing(); } + } + + #endregion } + + #region Evil Reflection + + internal class CurrentConnectionUsing : IDisposable + { + public static MethodInfo OpenMethod { get; private set; } + public static MethodInfo CloseMethod { get; private set; } + + private static readonly object Factory; + private static readonly MethodInfo CreateMethod; + private static readonly PropertyInfo ConnectionProperty; + private static readonly FieldInfo TransactionField; + private static readonly PropertyInfo InnerConnectionProperty; + private static readonly PropertyInfo InnerTransactionProperty; + private static readonly object[] NoArgs = new object[0]; + + private readonly object _database; + + static CurrentConnectionUsing() + { + var coreAssembly = Assembly.Load("Umbraco.Core"); + + var applicationContextType = coreAssembly.GetType("Umbraco.Core.ApplicationContext"); + var databaseContextType = coreAssembly.GetType("Umbraco.Core.DatabaseContext"); + var defaultDatabaseFactoryType = coreAssembly.GetType("Umbraco.Core.Persistence.DefaultDatabaseFactory"); + var umbracoDatabaseType = coreAssembly.GetType("Umbraco.Core.Persistence.UmbracoDatabase"); + var databaseType = coreAssembly.GetType("Umbraco.Core.Persistence.Database"); + + var currentProperty = applicationContextType.GetProperty("Current", BindingFlags.Static | BindingFlags.Public); + var applicationContext = currentProperty.GetValue(null, NoArgs); + + var databaseContextProperty = applicationContextType.GetProperty("DatabaseContext", BindingFlags.Instance | BindingFlags.Public); + var databaseContext = databaseContextProperty.GetValue(applicationContext, NoArgs); + + var factoryField = databaseContextType.GetField("_factory", BindingFlags.Instance | BindingFlags.NonPublic); + Factory = factoryField.GetValue(databaseContext); + + CreateMethod = defaultDatabaseFactoryType.GetMethod("CreateDatabase", BindingFlags.Instance | BindingFlags.Public); + + OpenMethod = databaseType.GetMethod("OpenSharedConnection", BindingFlags.Instance | BindingFlags.Public); + CloseMethod = databaseType.GetMethod("CloseSharedConnection", BindingFlags.Instance | BindingFlags.Public); + + ConnectionProperty = umbracoDatabaseType.GetProperty("Connection", BindingFlags.Instance | BindingFlags.Public); + TransactionField = databaseType.GetField("_transaction", BindingFlags.Instance | BindingFlags.NonPublic); + + var profilerAssembly = Assembly.Load("MiniProfiler"); + var profiledDbConnectionType = profilerAssembly.GetType("StackExchange.Profiling.Data.ProfiledDbConnection"); + InnerConnectionProperty = profiledDbConnectionType.GetProperty("InnerConnection", BindingFlags.Instance | BindingFlags.Public); + var profiledDbTransactionType = profilerAssembly.GetType("StackExchange.Profiling.Data.ProfiledDbTransaction"); + InnerTransactionProperty = profiledDbTransactionType.GetProperty("WrappedTransaction", BindingFlags.Instance | BindingFlags.Public); + } + + public CurrentConnectionUsing() + { + _database = CreateMethod.Invoke(Factory, NoArgs); + + var connection = ConnectionProperty.GetValue(_database, NoArgs); + // we have to open to make sure that we *do* have a connection + if (connection == null) + OpenMethod.Invoke(_database, NoArgs); + } + + public IDbConnection Connection + { + get + { + var connection = ConnectionProperty.GetValue(_database, NoArgs); + if (connection == null) return null; + var inner = InnerConnectionProperty.GetValue(connection, NoArgs); + return inner as IDbConnection; + } + } + + public IDbTransaction Transaction + { + get + { + var transaction = TransactionField.GetValue(_database); + if (transaction == null) return null; + var inner = InnerTransactionProperty.GetValue(transaction, NoArgs); + return inner as IDbTransaction; + } + } + + public void Dispose() + { + // this was required when we *always* opened the connection + // but now we open it only if it's not opened already and then, + // we assume that Core will dispose of it somehow - since it + // hasn't been opened twice. + + // we have to close since we have opened + //CloseMethod.Invoke(_database, NoArgs); + } + } + + #endregion } diff --git a/src/umbraco.datalayer/SqlHelpers/MySql/MySqlHelper.cs b/src/umbraco.datalayer/SqlHelpers/MySql/MySqlHelper.cs index 8cd36255cb..2e76941c21 100644 --- a/src/umbraco.datalayer/SqlHelpers/MySql/MySqlHelper.cs +++ b/src/umbraco.datalayer/SqlHelpers/MySql/MySqlHelper.cs @@ -56,7 +56,28 @@ namespace umbraco.DataLayer.SqlHelpers.MySql /// The return value of the command. protected override object ExecuteScalar(string commandText, MSC.MySqlParameter[] parameters) { - return MSC.MySqlHelper.ExecuteScalar(ConnectionString, commandText, parameters); + using (var cc = UseCurrentConnection) + { + return ExecuteScalar((MSC.MySqlConnection) cc.Connection, (MSC.MySqlTransaction) cc.Transaction, commandText, parameters); + } + } + + // copied & adapted from MySqlHelper + private static object ExecuteScalar(MSC.MySqlConnection connection, MSC.MySqlTransaction trx, string commandText, params MSC.MySqlParameter[] commandParameters) + { + var mySqlCommand = new MSC.MySqlCommand(); + mySqlCommand.Connection = connection; + if (trx != null) mySqlCommand.Transaction = trx; + mySqlCommand.CommandText = commandText; + mySqlCommand.CommandType = CommandType.Text; + if (commandParameters != null) + { + foreach (var commandParameter in commandParameters) + mySqlCommand.Parameters.Add(commandParameter); + } + var obj = mySqlCommand.ExecuteScalar(); + mySqlCommand.Parameters.Clear(); + return obj; } /// Executes a command and returns the number of rows affected. @@ -67,7 +88,28 @@ namespace umbraco.DataLayer.SqlHelpers.MySql /// protected override int ExecuteNonQuery(string commandText, MSC.MySqlParameter[] parameters) { - return MSC.MySqlHelper.ExecuteNonQuery(ConnectionString, commandText, parameters); + using (var cc = UseCurrentConnection) + { + return ExecuteNonQuery((MSC.MySqlConnection) cc.Connection, (MSC.MySqlTransaction)cc.Transaction, commandText, parameters); + } + } + + // copied & adapted from MySqlHelper + public static int ExecuteNonQuery(MSC.MySqlConnection connection, MSC.MySqlTransaction trx, string commandText, params MSC.MySqlParameter[] commandParameters) + { + var mySqlCommand = new MSC.MySqlCommand(); + mySqlCommand.Connection = connection; + if (trx != null) mySqlCommand.Transaction = trx; + mySqlCommand.CommandText = commandText; + mySqlCommand.CommandType = CommandType.Text; + if (commandParameters != null) + { + foreach (var commandParameter in commandParameters) + mySqlCommand.Parameters.Add(commandParameter); + } + var num = mySqlCommand.ExecuteNonQuery(); + mySqlCommand.Parameters.Clear(); + return num; } /// Executes a command and returns a records reader containing the results. @@ -78,7 +120,28 @@ namespace umbraco.DataLayer.SqlHelpers.MySql /// protected override IRecordsReader ExecuteReader(string commandText, MSC.MySqlParameter[] parameters) { - return new MySqlDataReader(MSC.MySqlHelper.ExecuteReader(ConnectionString, commandText, parameters)); + using (var cc = UseCurrentConnection) + { + return new MySqlDataReader(ExecuteReader((MSC.MySqlConnection) cc.Connection, (MSC.MySqlTransaction) cc.Transaction, commandText, parameters, true)); + } + } + + // copied & adapted from MySqlHelper + private static MSC.MySqlDataReader ExecuteReader(MSC.MySqlConnection connection, MSC.MySqlTransaction trx, string commandText, MSC.MySqlParameter[] commandParameters, bool externalConn) + { + MSC.MySqlCommand mySqlCommand = new MSC.MySqlCommand(); + mySqlCommand.Connection = connection; + if (trx != null) mySqlCommand.Transaction = trx; + mySqlCommand.CommandText = commandText; + mySqlCommand.CommandType = CommandType.Text; + if (commandParameters != null) + { + foreach (var commandParameter in commandParameters) + mySqlCommand.Parameters.Add(commandParameter); + } + MSC.MySqlDataReader mySqlDataReader = !externalConn ? mySqlCommand.ExecuteReader(CommandBehavior.CloseConnection) : mySqlCommand.ExecuteReader(); + mySqlCommand.Parameters.Clear(); + return mySqlDataReader; } /// Converts the scalar value to the given type. diff --git a/src/umbraco.datalayer/SqlHelpers/SqlServer/SqlServerHelper.cs b/src/umbraco.datalayer/SqlHelpers/SqlServer/SqlServerHelper.cs index 3eb298a7f5..23239aea49 100644 --- a/src/umbraco.datalayer/SqlHelpers/SqlServer/SqlServerHelper.cs +++ b/src/umbraco.datalayer/SqlHelpers/SqlServer/SqlServerHelper.cs @@ -52,9 +52,14 @@ namespace umbraco.DataLayer.SqlHelpers.SqlServer #if DEBUG && DebugDataLayer // Log Query Execution Trace.TraceInformation(GetType().Name + " SQL ExecuteScalar: " + commandText); - #endif +#endif - return SH.ExecuteScalar(ConnectionString, CommandType.Text, commandText, parameters); + using (var cc = UseCurrentConnection) + { + return cc.Transaction == null + ? SH.ExecuteScalar((SqlConnection) cc.Connection, CommandType.Text, commandText, parameters) + : SH.ExecuteScalar((SqlTransaction) cc.Transaction, CommandType.Text, commandText, parameters); + } } /// @@ -65,14 +70,19 @@ namespace umbraco.DataLayer.SqlHelpers.SqlServer /// /// The number of rows affected by the command. /// - protected override int ExecuteNonQuery(string commandText, SqlParameter[] parameters) + protected override int ExecuteNonQuery(string commandText, params SqlParameter[] parameters) { #if DEBUG && DebugDataLayer // Log Query Execution Trace.TraceInformation(GetType().Name + " SQL ExecuteNonQuery: " + commandText); - #endif +#endif - return SH.ExecuteNonQuery(ConnectionString, CommandType.Text, commandText, parameters); + using (var cc = UseCurrentConnection) + { + return cc.Transaction == null + ? SH.ExecuteNonQuery((SqlConnection) cc.Connection, CommandType.Text, commandText, parameters) + : SH.ExecuteNonQuery((SqlTransaction) cc.Transaction, CommandType.Text, commandText, parameters); + } } /// @@ -83,15 +93,19 @@ namespace umbraco.DataLayer.SqlHelpers.SqlServer /// /// A data reader containing the results of the command. /// - protected override IRecordsReader ExecuteReader(string commandText, SqlParameter[] parameters) + protected override IRecordsReader ExecuteReader(string commandText, params SqlParameter[] parameters) { #if DEBUG && DebugDataLayer // Log Query Execution Trace.TraceInformation(GetType().Name + " SQL ExecuteReader: " + commandText); - #endif +#endif - return new SqlServerDataReader(SH.ExecuteReader(ConnectionString, CommandType.Text, - commandText, parameters)); + using (var cc = UseCurrentConnection) + { + return cc.Transaction == null + ? new SqlServerDataReader(SH.ExecuteReader((SqlConnection) cc.Connection, CommandType.Text, commandText, parameters)) + : new SqlServerDataReader(SH.ExecuteReader((SqlTransaction) cc.Transaction, CommandType.Text, commandText, parameters)); + } } } } \ No newline at end of file From e868a57979ed5a523a042e776ac3b7a04ad95ae0 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 16 Sep 2016 13:31:34 +0200 Subject: [PATCH 065/841] Fix TemplateRepository so it initializes VirtualPath --- .../Repositories/TemplateRepository.cs | 58 +++++++++++++++---- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index ebe3bf3b65..2e93c7c678 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -280,6 +280,8 @@ namespace Umbraco.Core.Persistence.Repositories if (dto.Design == content) return; dto.Design = content; Database.Update(dto); // though... we don't care about the db value really??!! + + SetVirtualPath(template); } protected override void PersistDeletedItem(ITemplate entity) @@ -377,6 +379,50 @@ namespace Umbraco.Core.Persistence.Repositories return template; } + private void SetVirtualPath(ITemplate template) + { + var path = template.OriginalPath; + if (string.IsNullOrWhiteSpace(path)) + { + // we need to discover the path + path = string.Concat(template.Alias, ".cshtml"); + if (_viewsFileSystem.FileExists(path)) + { + template.VirtualPath = _viewsFileSystem.GetUrl(path); + return; + } + path = string.Concat(template.Alias, ".vbhtml"); + if (_viewsFileSystem.FileExists(path)) + { + template.VirtualPath = _viewsFileSystem.GetUrl(path); + return; + } + path = string.Concat(template.Alias, ".master"); + if (_masterpagesFileSystem.FileExists(path)) + { + template.VirtualPath = _masterpagesFileSystem.GetUrl(path); + return; + } + } + else + { + // we know the path already + var ext = Path.GetExtension(path); + switch (ext) + { + case ".cshtml": + case ".vbhtml": + template.VirtualPath = _viewsFileSystem.GetUrl(path); + return; + case ".master": + template.VirtualPath = _masterpagesFileSystem.GetUrl(path); + return; + } + } + + template.VirtualPath = string.Empty; // file not found... + } + private string GetFileContent(ITemplate template, bool init) { var path = template.OriginalPath; @@ -404,21 +450,9 @@ namespace Umbraco.Core.Persistence.Repositories return GetFileContent(template, _viewsFileSystem, path, init); case ".master": return GetFileContent(template, _masterpagesFileSystem, path, init); - default: - return string.Empty; } } - var fsname = string.Concat(template.Alias, ".cshtml"); - if (_viewsFileSystem.FileExists(fsname)) - return GetFileContent(template, _viewsFileSystem, fsname, init); - fsname = string.Concat(template.Alias, ".vbhtml"); - if (_viewsFileSystem.FileExists(fsname)) - return GetFileContent(template, _viewsFileSystem, fsname, init); - fsname = string.Concat(template.Alias, ".master"); - if (_masterpagesFileSystem.FileExists(fsname)) - return GetFileContent(template, _masterpagesFileSystem, fsname, init); - template.VirtualPath = string.Empty; // file not found... return string.Empty; } From 367ad70be78aa3851593c6ace1231e373ec9049f Mon Sep 17 00:00:00 2001 From: Claus Date: Wed, 21 Sep 2016 12:27:32 +0200 Subject: [PATCH 066/841] adding signalr to core. --- src/Umbraco.Web/Umbraco.Web.csproj | 5 +++++ src/Umbraco.Web/UmbracoDefaultOwinStartup.cs | 4 ++++ src/Umbraco.Web/packages.config | 1 + 3 files changed, 10 insertions(+) diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index e74975bcff..400b6d65e0 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -146,6 +146,10 @@ False ..\packages\Microsoft.AspNet.Identity.Owin.2.2.1\lib\net45\Microsoft.AspNet.Identity.Owin.dll + + ..\packages\Microsoft.AspNet.SignalR.Core.2.2.1\lib\net45\Microsoft.AspNet.SignalR.Core.dll + True + False @@ -2244,6 +2248,7 @@ umbraco_org_umbraco_update_CheckForUpgrade + 11.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v11.0 diff --git a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs index 046b2167d5..32dc4df8bf 100644 --- a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs +++ b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs @@ -1,7 +1,9 @@ using System; using System.Web; +using Microsoft.AspNet.SignalR; using Microsoft.Owin; using Microsoft.Owin.Extensions; +using Microsoft.Owin.Infrastructure; using Microsoft.Owin.Logging; using Owin; using Umbraco.Core; @@ -9,6 +11,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Security; using Umbraco.Web; using Umbraco.Web.Security.Identity; +using Umbraco.Web.SignalR; [assembly: OwinStartup("UmbracoDefaultOwinStartup", typeof(UmbracoDefaultOwinStartup))] @@ -61,6 +64,7 @@ namespace Umbraco.Web .UseUmbracoBackOfficeCookieAuthentication(ApplicationContext, PipelineStage.Authenticate) .UseUmbracoBackOfficeExternalCookieAuthentication(ApplicationContext, PipelineStage.Authenticate) .UseUmbracoPreviewAuthentication(ApplicationContext, PipelineStage.Authorize) + .MapSignalR("/umbraco/signalr", new HubConfiguration {EnableDetailedErrors = true}) .FinalizeMiddlewareConfiguration(); } diff --git a/src/Umbraco.Web/packages.config b/src/Umbraco.Web/packages.config index d485791d8c..b0668a9210 100644 --- a/src/Umbraco.Web/packages.config +++ b/src/Umbraco.Web/packages.config @@ -11,6 +11,7 @@ + From d9e608329dce890d4672ac43475fd6bea48efcb8 Mon Sep 17 00:00:00 2001 From: Claus Date: Wed, 21 Sep 2016 12:30:33 +0200 Subject: [PATCH 067/841] removing a using statement. --- src/Umbraco.Web/UmbracoDefaultOwinStartup.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs index 32dc4df8bf..152a6c25a3 100644 --- a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs +++ b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs @@ -11,7 +11,6 @@ using Umbraco.Core.Logging; using Umbraco.Core.Security; using Umbraco.Web; using Umbraco.Web.Security.Identity; -using Umbraco.Web.SignalR; [assembly: OwinStartup("UmbracoDefaultOwinStartup", typeof(UmbracoDefaultOwinStartup))] From 3ab01a2164991264b580ff7b9440d0c992e7284b Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 16 Sep 2016 16:18:59 +0200 Subject: [PATCH 068/841] Implement shadow filesystems, IFileSystem2.GetSize --- src/Umbraco.Core/IO/FileSystemExtensions.cs | 17 +- .../IO/FileSystemProviderManager.cs | 328 ++++++++++++--- src/Umbraco.Core/IO/FileSystemWrapper.cs | 54 ++- src/Umbraco.Core/IO/IFileSystem.cs | 6 + src/Umbraco.Core/IO/MediaFileSystem.cs | 7 +- src/Umbraco.Core/IO/PhysicalFileSystem.cs | 2 +- src/Umbraco.Core/IO/ShadowFileSystem.cs | 265 ++++++++++++ .../PartialViewMacroRepository.cs | 2 +- .../Repositories/PartialViewRepository.cs | 2 +- .../Persistence/RepositoryFactory.cs | 12 +- src/Umbraco.Core/Umbraco.Core.csproj | 1 + src/Umbraco.Tests/IO/ShadowFileSystemTests.cs | 395 ++++++++++++++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + .../umbraco/Trees/loadTemplates.cs | 2 +- .../businesslogic/template/Template.cs | 4 +- 15 files changed, 994 insertions(+), 104 deletions(-) create mode 100644 src/Umbraco.Core/IO/ShadowFileSystem.cs create mode 100644 src/Umbraco.Tests/IO/ShadowFileSystemTests.cs diff --git a/src/Umbraco.Core/IO/FileSystemExtensions.cs b/src/Umbraco.Core/IO/FileSystemExtensions.cs index baa8c1d6d4..4b55510ee0 100644 --- a/src/Umbraco.Core/IO/FileSystemExtensions.cs +++ b/src/Umbraco.Core/IO/FileSystemExtensions.cs @@ -37,21 +37,14 @@ namespace Umbraco.Core.IO throw new ArgumentException("Retries must be greater than zero"); } + // GetSize has been added to IFileSystem2 but not IFileSystem + // this is implementing GetSize for IFileSystem, the old way public static long GetSize(this IFileSystem fs, string path) { - // unwrap, eg MediaFileSystem is wrapping an IFileSystem - FileSystemWrapper w; - while ((w = fs as FileSystemWrapper) != null) - fs = w.Wrapped; + // if we reach this point, fs is *not* IFileSystem2 + // so it's not FileSystemWrapper nor shadow nor anything we know + // so... fall back to the old & inefficient method - // no idea why GetSize is not part of IFileSystem, but - // for physical file system we have way better & faster ways - // to get the size, than to read the entire thing in memory! - var physical = fs as PhysicalFileSystem; - if (physical != null) - return physical.GetSize(path); - - // other filesystems... bah... using (var file = fs.OpenFile(path)) using (var sr = new StreamReader(file)) { diff --git a/src/Umbraco.Core/IO/FileSystemProviderManager.cs b/src/Umbraco.Core/IO/FileSystemProviderManager.cs index b2bcaee61f..63828fc1c3 100644 --- a/src/Umbraco.Core/IO/FileSystemProviderManager.cs +++ b/src/Umbraco.Core/IO/FileSystemProviderManager.cs @@ -2,19 +2,43 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Configuration; +using System.IO; using System.Linq; using System.Reflection; -using System.Text; -using Umbraco.Core.CodeAnnotations; +using System.Web.Hosting; using Umbraco.Core.Configuration; +using Umbraco.Core.Logging; namespace Umbraco.Core.IO { public class FileSystemProviderManager { private readonly FileSystemProvidersSection _config; + private readonly object _shadowLocker = new object(); + private readonly WeakSet _fs = new WeakSet(); + private readonly bool _shadowEnabled; + private Guid _shadow = Guid.Empty; + private FileSystemWrapper[] _shadowFs; - #region Singleton + // actual well-known filesystems returned by properties + private readonly IFileSystem2 _macroPartialFileSystem; + private readonly IFileSystem2 _partialViewsFileSystem; + private readonly IFileSystem2 _stylesheetsFileSystem; + private readonly IFileSystem2 _scriptsFileSystem; + private readonly IFileSystem2 _xsltFileSystem; + private readonly IFileSystem2 _masterPagesFileSystem; + private readonly IFileSystem2 _mvcViewsFileSystem; + + // when shadowing is enabled, above filesystems, as wrappers + private readonly FileSystemWrapper2 _macroPartialFileSystemWrapper; + private readonly FileSystemWrapper2 _partialViewsFileSystemWrapper; + private readonly FileSystemWrapper2 _stylesheetsFileSystemWrapper; + private readonly FileSystemWrapper2 _scriptsFileSystemWrapper; + private readonly FileSystemWrapper2 _xsltFileSystemWrapper; + private readonly FileSystemWrapper2 _masterPagesFileSystemWrapper; + private readonly FileSystemWrapper2 _mvcViewsFileSystemWrapper; + + #region Singleton & Constructor private static readonly FileSystemProviderManager Instance = new FileSystemProviderManager(); @@ -23,109 +47,305 @@ namespace Umbraco.Core.IO get { return Instance; } } - #endregion - - #region Constructors - internal FileSystemProviderManager() { - _config = (FileSystemProvidersSection)ConfigurationManager.GetSection("umbracoConfiguration/FileSystemProviders"); + _config = (FileSystemProvidersSection) ConfigurationManager.GetSection("umbracoConfiguration/FileSystemProviders"); + + _macroPartialFileSystem = new PhysicalFileSystem(SystemDirectories.MacroPartials); + _partialViewsFileSystem = new PhysicalFileSystem(SystemDirectories.PartialViews); + _stylesheetsFileSystem = new PhysicalFileSystem(SystemDirectories.Css); + _scriptsFileSystem = new PhysicalFileSystem(SystemDirectories.Scripts); + _xsltFileSystem = new PhysicalFileSystem(SystemDirectories.Xslt); + _masterPagesFileSystem = new PhysicalFileSystem(SystemDirectories.Masterpages); + _mvcViewsFileSystem = new PhysicalFileSystem(SystemDirectories.MvcViews); + + // if shadow is enable we need a mean to replace the filesystem by a shadowed filesystem, however we cannot + // replace the actual filesystem as we don't know if anything is not holding an app-long reference to them, + // so we have to force-wrap each of them and work with the wrapped filesystem. if shadow is not enabled, + // no need to wrap (small perfs improvement). + + // fixme - irks! + // but cannot be enabled by deploy from an application event handler, because by the time an app event handler + // is instanciated it is already too late and some filesystems have been referenced by Core. here we force + // enable for deploy... but maybe it should be some sort of config option? + _shadowEnabled = AppDomain.CurrentDomain.GetAssemblies().Any(x => x.GetName().Name == "Umbraco.Deploy"); + + if (_shadowEnabled) + { + _macroPartialFileSystem = _macroPartialFileSystemWrapper = new FileSystemWrapper2(_macroPartialFileSystem); + _partialViewsFileSystem = _partialViewsFileSystemWrapper = new FileSystemWrapper2(_partialViewsFileSystem); + _stylesheetsFileSystem = _stylesheetsFileSystemWrapper = new FileSystemWrapper2(_stylesheetsFileSystem); + _scriptsFileSystem = _scriptsFileSystemWrapper = new FileSystemWrapper2(_scriptsFileSystem); + _xsltFileSystem = _xsltFileSystemWrapper = new FileSystemWrapper2(_xsltFileSystem); + _masterPagesFileSystem = _masterPagesFileSystemWrapper = new FileSystemWrapper2(_masterPagesFileSystem); + _mvcViewsFileSystem = _mvcViewsFileSystemWrapper = new FileSystemWrapper2(_mvcViewsFileSystem); + } + + // filesystems obtained from GetFileSystemProvider are already wrapped and do not need to be wrapped again, + // whether shadow is enabled or not + + MediaFileSystem = GetFileSystemProvider(); } #endregion - /// - /// used to cache the lookup of how to construct this object so we don't have to reflect each time. - /// - private class ProviderConstructionInfo + #region Well-Known FileSystems + + public IFileSystem2 MacroPartialsFileSystem { get { return _macroPartialFileSystem; } } + public IFileSystem2 PartialViewsFileSystem { get { return _partialViewsFileSystem; } } + public IFileSystem2 StylesheetsFileSystem { get { return _stylesheetsFileSystem; } } + public IFileSystem2 ScriptsFileSystem { get { return _scriptsFileSystem; } } + public IFileSystem2 XsltFileSystem { get { return _xsltFileSystem; } } + public IFileSystem2 MasterPagesFileSystem { get { return _masterPagesFileSystem; } } + public IFileSystem2 MvcViewsFileSystem { get { return _mvcViewsFileSystem; } } + public MediaFileSystem MediaFileSystem { get; private set; } + + #endregion + + #region Providers + + /// + /// used to cache the lookup of how to construct this object so we don't have to reflect each time. + /// + private class ProviderConstructionInfo { public object[] Parameters { get; set; } public ConstructorInfo Constructor { get; set; } - public string ProviderAlias { get; set; } + //public string ProviderAlias { get; set; } } private readonly ConcurrentDictionary _providerLookup = new ConcurrentDictionary(); - private readonly ConcurrentDictionary _wrappedProviderLookup = new ConcurrentDictionary(); + private readonly ConcurrentDictionary _aliases = new ConcurrentDictionary(); /// - /// Returns the underlying (non-typed) file system provider for the alias specified + /// Gets an underlying (non-typed) filesystem supporting a strongly-typed filesystem. /// - /// - /// - /// - /// It is recommended to use the typed GetFileSystemProvider method instead to get a strongly typed provider instance. - /// + /// The alias of the strongly-typed filesystem. + /// The non-typed filesystem supporting the strongly-typed filesystem with the specified alias. + /// This method should not be used directly, used instead. public IFileSystem GetUnderlyingFileSystemProvider(string alias) { - //either get the constructor info from cache or create it and add to cache + // either get the constructor info from cache or create it and add to cache var ctorInfo = _providerLookup.GetOrAdd(alias, s => { + // get config var providerConfig = _config.Providers[s]; if (providerConfig == null) - throw new ArgumentException(string.Format("No provider found with the alias '{0}'", s)); + throw new ArgumentException(string.Format("No provider found with alias {0}.", s)); + // get the filesystem type var providerType = Type.GetType(providerConfig.Type); if (providerType == null) - throw new InvalidOperationException(string.Format("Could not find type '{0}'", providerConfig.Type)); + throw new InvalidOperationException(string.Format("Could not find type {0}.", providerConfig.Type)); + // ensure it implements IFileSystem if (providerType.IsAssignableFrom(typeof (IFileSystem))) - throw new InvalidOperationException(string.Format("The type '{0}' does not implement IFileSystem", providerConfig.Type)); + throw new InvalidOperationException(string.Format("Type {0} does not implement IFileSystem.", providerType.FullName)); + // find a ctor matching the config parameters var paramCount = providerConfig.Parameters != null ? providerConfig.Parameters.Count : 0; - var constructor = providerType.GetConstructors() - .SingleOrDefault(x => x.GetParameters().Count() == paramCount - && x.GetParameters().All(y => providerConfig.Parameters.AllKeys.Contains(y.Name))); + var constructor = providerType.GetConstructors().SingleOrDefault(x + => x.GetParameters().Length == paramCount && x.GetParameters().All(y => providerConfig.Parameters.AllKeys.Contains(y.Name))); if (constructor == null) - throw new InvalidOperationException(string.Format("Could not find constructor for type '{0}' which accepts {1} parameters", providerConfig.Type, paramCount)); + throw new InvalidOperationException(string.Format("Type {0} has no ctor matching the {1} configuration parameter(s).", providerType.FullName, paramCount)); var parameters = new object[paramCount]; - for (var i = 0; i < paramCount; i++) - parameters[i] = providerConfig.Parameters[providerConfig.Parameters.AllKeys[i]].Value; + if (providerConfig.Parameters != null) // keeps ReSharper happy + for (var i = 0; i < paramCount; i++) + parameters[i] = providerConfig.Parameters[providerConfig.Parameters.AllKeys[i]].Value; - //return the new constructor info class to cache so we don't have to do this again. - return new ProviderConstructionInfo() + return new ProviderConstructionInfo { Constructor = constructor, Parameters = parameters, - ProviderAlias = s + //ProviderAlias = s }; }); - var fs = (IFileSystem)ctorInfo.Constructor.Invoke(ctorInfo.Parameters); - return fs; + // create the fs and return + return (IFileSystem) ctorInfo.Constructor.Invoke(ctorInfo.Parameters); } /// - /// Returns the strongly typed file system provider + /// Gets a strongly-typed filesystem. /// - /// - /// - public TProviderTypeFilter GetFileSystemProvider() - where TProviderTypeFilter : FileSystemWrapper + /// The type of the filesystem. + /// A strongly-typed filesystem of the specified type. + public TFileSystem GetFileSystemProvider() + where TFileSystem : FileSystemWrapper { - //get the alias for the type from cache or look it up and add it to the cache, then we don't have to reflect each time - var alias = _wrappedProviderLookup.GetOrAdd(typeof (TProviderTypeFilter), fsType => + // deal with known types - avoid infinite loops! + if (typeof(TFileSystem) == typeof(MediaFileSystem) && MediaFileSystem != null) + return MediaFileSystem as TFileSystem; // else create and return + + // get/cache the alias for the filesystem type + var alias = _aliases.GetOrAdd(typeof (TFileSystem), fsType => { - //validate the ctor - var constructor = fsType.GetConstructors() - .SingleOrDefault(x => - x.GetParameters().Count() == 1 && TypeHelper.IsTypeAssignableFrom(x.GetParameters().Single().ParameterType)); + // validate the ctor + var constructor = fsType.GetConstructors().SingleOrDefault(x + => x.GetParameters().Length == 1 && TypeHelper.IsTypeAssignableFrom(x.GetParameters().Single().ParameterType)); if (constructor == null) - throw new InvalidOperationException("The type of " + fsType + " must inherit from FileSystemWrapper and must have a constructor that accepts one parameter of type " + typeof(IFileSystem)); - - var attr = - (FileSystemProviderAttribute)fsType.GetCustomAttributes(typeof(FileSystemProviderAttribute), false). - SingleOrDefault(); + throw new InvalidOperationException("Type " + fsType.FullName + " must inherit from FileSystemWrapper and have a constructor that accepts one parameter of type " + typeof(IFileSystem).FullName + "."); + // find the attribute and get the alias + var attr = (FileSystemProviderAttribute) fsType.GetCustomAttributes(typeof(FileSystemProviderAttribute), false).SingleOrDefault(); if (attr == null) - throw new InvalidOperationException(string.Format("The provider type filter '{0}' is missing the required FileSystemProviderAttribute", typeof(FileSystemProviderAttribute).FullName)); + throw new InvalidOperationException("Type " + fsType.FullName + "is missing the required FileSystemProviderAttribute."); return attr.Alias; }); + // gets the inner fs, create the strongly-typed fs wrapping the inner fs, register & return var innerFs = GetUnderlyingFileSystemProvider(alias); - var outputFs = Activator.CreateInstance(typeof (TProviderTypeFilter), innerFs); - return (TProviderTypeFilter)outputFs; + var fs = (TFileSystem) Activator.CreateInstance(typeof (TFileSystem), innerFs); + if (_shadowEnabled) + _fs.Add(fs); + return fs; + } + + #endregion + + #region Shadow + + // note + // shadowing is thread-safe, but entering and exiting shadow mode is not, and there is only one + // global shadow for the entire application, so great care should be taken to ensure that the + // application is *not* doing anything else when using a shadow. + // shadow applies to well-known filesystems *only* - at the moment, any other filesystem that would + // be created directly (via ctor) or via GetFileSystemProvider is *not* shadowed. + + // shadow must be enabled in an app event handler before anything else ie before any filesystem + // is actually created and used - after, it is too late - enabling shadow has a neglictible perfs + // impact. + // NO! by the time an app event handler is instanciated it is already too late, see note in ctor. + //internal void EnableShadow() + //{ + // if (_mvcViewsFileSystem != null) // test one of the fs... + // throw new InvalidOperationException("Cannot enable shadow once filesystems have been created."); + // _shadowEnabled = true; + //} + + internal void Shadow(Guid id) + { + lock (_shadowLocker) + { + if (_shadowEnabled == false) throw new InvalidOperationException("Shadowing is not enabled."); + if (_shadow != Guid.Empty) throw new InvalidOperationException("Already shadowing (" + _shadow + ")."); + _shadow = id; + + LogHelper.Debug("Shadow " + id + "."); + + ShadowFs(id, _macroPartialFileSystemWrapper, "Views/MacroPartials"); + ShadowFs(id, _partialViewsFileSystemWrapper, "Views/Partials"); + ShadowFs(id, _stylesheetsFileSystemWrapper, "css"); + ShadowFs(id, _scriptsFileSystemWrapper, "scripts"); + ShadowFs(id, _xsltFileSystemWrapper, "xslt"); + ShadowFs(id, _masterPagesFileSystemWrapper, "masterpages"); + ShadowFs(id, _mvcViewsFileSystemWrapper, "Views"); + + _shadowFs = _fs.ToArray(); + foreach (var fs in _shadowFs) + ShadowFs(id, fs, "stfs/" + fs.GetType().FullName); + } + } + + private static void ShadowFs(Guid id, FileSystemWrapper filesystem, string path) + { + var virt = "~/App_Data/Shadow/" + id + "/" + path; + var dir = HostingEnvironment.MapPath(virt); + if (dir == null) throw new InvalidOperationException("Could not map path."); + Directory.CreateDirectory(dir); + + // shadow filesystem pretends to be IFileSystem2 even though the inner filesystem + // is not, by invoking the GetSize extension method when needed. + var shadowFs = new ShadowFileSystem(filesystem.Wrapped, new PhysicalFileSystem(virt)); + filesystem.Wrapped = shadowFs; + } + + internal void UnShadow(bool complete) + { + lock (_shadowLocker) + { + if (_shadow == Guid.Empty) return; + + // copy and null before anything else + var shadow = _shadow; + var shadowFs = _shadowFs; + _shadow = Guid.Empty; + _shadowFs = null; + + LogHelper.Debug("UnShadow " + shadow + (complete?" (complete)":" (abort)") + "."); + + if (complete) + { + ((ShadowFileSystem) _macroPartialFileSystemWrapper.Wrapped).Complete(); + ((ShadowFileSystem) _partialViewsFileSystemWrapper.Wrapped).Complete(); + ((ShadowFileSystem) _stylesheetsFileSystemWrapper.Wrapped).Complete(); + ((ShadowFileSystem) _scriptsFileSystemWrapper.Wrapped).Complete(); + ((ShadowFileSystem) _xsltFileSystemWrapper.Wrapped).Complete(); + ((ShadowFileSystem) _masterPagesFileSystemWrapper.Wrapped).Complete(); + ((ShadowFileSystem) _mvcViewsFileSystemWrapper.Wrapped).Complete(); + + foreach (var fs in shadowFs) + ((ShadowFileSystem) fs.Wrapped).Complete(); + } + + UnShadowFs(_macroPartialFileSystemWrapper); + UnShadowFs(_partialViewsFileSystemWrapper); + UnShadowFs(_stylesheetsFileSystemWrapper); + UnShadowFs(_scriptsFileSystemWrapper); + UnShadowFs(_xsltFileSystemWrapper); + UnShadowFs(_masterPagesFileSystemWrapper); + UnShadowFs(_mvcViewsFileSystemWrapper); + + foreach (var fs in shadowFs) + UnShadowFs(fs); + } + } + + private static void UnShadowFs(FileSystemWrapper filesystem) + { + var inner = ((ShadowFileSystem) filesystem.Wrapped).Inner; + filesystem.Wrapped = inner; + } + + #endregion + + private class WeakSet + where T : class + { + private readonly HashSet> _set = new HashSet>(); + + public void Add(T item) + { + lock (_set) + { + _set.Add(new WeakReference(item)); + CollectLocked(); + } + } + + public T[] ToArray() + { + lock (_set) + { + CollectLocked(); + return _set.Select(x => + { + T target; + return x.TryGetTarget(out target) ? target : null; + }).WhereNotNull().ToArray(); + } + } + + private void CollectLocked() + { + _set.RemoveWhere(x => + { + T target; + return x.TryGetTarget(out target) == false; + }); + } } } } diff --git a/src/Umbraco.Core/IO/FileSystemWrapper.cs b/src/Umbraco.Core/IO/FileSystemWrapper.cs index db4ab115f6..5bac2afa6b 100644 --- a/src/Umbraco.Core/IO/FileSystemWrapper.cs +++ b/src/Umbraco.Core/IO/FileSystemWrapper.cs @@ -16,93 +16,103 @@ namespace Umbraco.Core.IO /// public abstract class FileSystemWrapper : IFileSystem { - private readonly IFileSystem _wrapped; - - protected FileSystemWrapper(IFileSystem wrapped) + protected FileSystemWrapper(IFileSystem wrapped) { - _wrapped = wrapped; + Wrapped = wrapped; } - internal IFileSystem Wrapped { get { return _wrapped; } } + internal IFileSystem Wrapped { get; set; } - public IEnumerable GetDirectories(string path) + public IEnumerable GetDirectories(string path) { - return _wrapped.GetDirectories(path); + return Wrapped.GetDirectories(path); } public void DeleteDirectory(string path) { - _wrapped.DeleteDirectory(path); + Wrapped.DeleteDirectory(path); } public void DeleteDirectory(string path, bool recursive) { - _wrapped.DeleteDirectory(path, recursive); + Wrapped.DeleteDirectory(path, recursive); } public bool DirectoryExists(string path) { - return _wrapped.DirectoryExists(path); + return Wrapped.DirectoryExists(path); } public void AddFile(string path, Stream stream) { - _wrapped.AddFile(path, stream); + Wrapped.AddFile(path, stream); } public void AddFile(string path, Stream stream, bool overrideExisting) { - _wrapped.AddFile(path, stream, overrideExisting); + Wrapped.AddFile(path, stream, overrideExisting); } public IEnumerable GetFiles(string path) { - return _wrapped.GetFiles(path); + return Wrapped.GetFiles(path); } public IEnumerable GetFiles(string path, string filter) { - return _wrapped.GetFiles(path, filter); + return Wrapped.GetFiles(path, filter); } public Stream OpenFile(string path) { - return _wrapped.OpenFile(path); + return Wrapped.OpenFile(path); } public void DeleteFile(string path) { - _wrapped.DeleteFile(path); + Wrapped.DeleteFile(path); } public bool FileExists(string path) { - return _wrapped.FileExists(path); + return Wrapped.FileExists(path); } public string GetRelativePath(string fullPathOrUrl) { - return _wrapped.GetRelativePath(fullPathOrUrl); + return Wrapped.GetRelativePath(fullPathOrUrl); } public string GetFullPath(string path) { - return _wrapped.GetFullPath(path); + return Wrapped.GetFullPath(path); } public string GetUrl(string path) { - return _wrapped.GetUrl(path); + return Wrapped.GetUrl(path); } public DateTimeOffset GetLastModified(string path) { - return _wrapped.GetLastModified(path); + return Wrapped.GetLastModified(path); } public DateTimeOffset GetCreated(string path) { - return _wrapped.GetCreated(path); + return Wrapped.GetCreated(path); } } + + public class FileSystemWrapper2 : FileSystemWrapper, IFileSystem2 + { + public FileSystemWrapper2(IFileSystem2 fs) + : base(fs) + { } + + public long GetSize(string path) + { + return ((IFileSystem2) Wrapped).GetSize(path); + } + } } \ No newline at end of file diff --git a/src/Umbraco.Core/IO/IFileSystem.cs b/src/Umbraco.Core/IO/IFileSystem.cs index 3e1c1e3527..063f63c437 100644 --- a/src/Umbraco.Core/IO/IFileSystem.cs +++ b/src/Umbraco.Core/IO/IFileSystem.cs @@ -41,4 +41,10 @@ namespace Umbraco.Core.IO DateTimeOffset GetCreated(string path); } + + // this should be part of IFileSystem but we don't want to change the interface + public interface IFileSystem2 : IFileSystem + { + long GetSize(string path); + } } diff --git a/src/Umbraco.Core/IO/MediaFileSystem.cs b/src/Umbraco.Core/IO/MediaFileSystem.cs index 9dd0a8fda1..63fcbbc82e 100644 --- a/src/Umbraco.Core/IO/MediaFileSystem.cs +++ b/src/Umbraco.Core/IO/MediaFileSystem.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Linq; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Media; @@ -13,16 +12,16 @@ namespace Umbraco.Core.IO /// A custom file system provider for media /// [FileSystemProvider("media")] - public class MediaFileSystem : FileSystemWrapper + public class MediaFileSystem : FileSystemWrapper2 { private readonly IContentSection _contentConfig; - public MediaFileSystem(IFileSystem wrapped) + public MediaFileSystem(IFileSystem2 wrapped) : this(wrapped, UmbracoConfig.For.UmbracoSettings().Content) { } - public MediaFileSystem(IFileSystem wrapped, IContentSection contentConfig) : base(wrapped) + public MediaFileSystem(IFileSystem2 wrapped, IContentSection contentConfig) : base(wrapped) { _contentConfig = contentConfig; } diff --git a/src/Umbraco.Core/IO/PhysicalFileSystem.cs b/src/Umbraco.Core/IO/PhysicalFileSystem.cs index 6b07ff21f8..33e4dc71e3 100644 --- a/src/Umbraco.Core/IO/PhysicalFileSystem.cs +++ b/src/Umbraco.Core/IO/PhysicalFileSystem.cs @@ -6,7 +6,7 @@ using Umbraco.Core.Logging; namespace Umbraco.Core.IO { - public class PhysicalFileSystem : IFileSystem + public class PhysicalFileSystem : IFileSystem2 { // the rooted, filesystem path, using directory separator chars, NOT ending with a separator // eg "c:" or "c:\path\to\site" or "\\server\path" diff --git a/src/Umbraco.Core/IO/ShadowFileSystem.cs b/src/Umbraco.Core/IO/ShadowFileSystem.cs new file mode 100644 index 0000000000..db537ba2ca --- /dev/null +++ b/src/Umbraco.Core/IO/ShadowFileSystem.cs @@ -0,0 +1,265 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace Umbraco.Core.IO +{ + // at the moment this is just a wrapper + + public class ShadowFileSystem : IFileSystem2 + { + private readonly IFileSystem _fs; + private readonly IFileSystem2 _sfs; + + public ShadowFileSystem(IFileSystem fs, IFileSystem2 sfs) + { + _fs = fs; + _sfs = sfs; + } + + public IFileSystem Inner { get { return _fs; } } + + public void Complete() + { + if (_nodes == null) return; + foreach (var kvp in _nodes) + { + if (kvp.Value.IsExist) + { + if (kvp.Value.IsFile) + { + using (var stream = _sfs.OpenFile(kvp.Key)) + _fs.AddFile(kvp.Key, stream, true); + } + } + else + { + if (kvp.Value.IsDir) + _fs.DeleteDirectory(kvp.Key, true); + else + _fs.DeleteFile(kvp.Key); + } + } + _nodes.Clear(); + } + + private Dictionary _nodes; + + private Dictionary Nodes { get { return _nodes ?? (_nodes = new Dictionary()); } } + + private class ShadowNode + { + public ShadowNode(bool isDelete, bool isdir) + { + IsDelete = isDelete; + IsDir = isdir; + } + + public bool IsDelete { get; private set; } + public bool IsDir { get; private set; } + + public bool IsExist { get { return IsDelete == false; } } + public bool IsFile { get { return IsDir == false; } } + } + + private static string NormPath(string path) + { + return path.ToLowerInvariant().Replace("\\", "/"); + } + + // values can be "" (root), "foo", "foo/bar"... + private static bool IsChild(string path, string input) + { + if (input.StartsWith(path) == false || input.Length < path.Length + 2) + return false; + if (path.Length > 0 && input[path.Length] != '/') return false; + var pos = input.IndexOf("/", path.Length + 1, StringComparison.OrdinalIgnoreCase); + return pos < 0; + } + + private static bool IsDescendant(string path, string input) + { + if (input.StartsWith(path) == false || input.Length < path.Length + 2) + return false; + return path.Length == 0 || input[path.Length] == '/'; + } + + public IEnumerable GetDirectories(string path) + { + var normPath = NormPath(path); + var shadows = Nodes.Where(kvp => IsChild(normPath, kvp.Key)).ToArray(); + var directories = _fs.GetDirectories(path); + return directories + .Except(shadows.Where(kvp => (kvp.Value.IsDir && kvp.Value.IsDelete) || (kvp.Value.IsFile && kvp.Value.IsExist)) + .Select(kvp => kvp.Key)) + .Union(shadows.Where(kvp => kvp.Value.IsDir && kvp.Value.IsExist).Select(kvp => kvp.Key)) + .Distinct(); + } + + public void DeleteDirectory(string path) + { + DeleteDirectory(path, false); + } + + public void DeleteDirectory(string path, bool recursive) + { + if (DirectoryExists(path) == false) return; + var normPath = NormPath(path); + if (recursive) + { + Nodes[normPath] = new ShadowNode(true, true); + var remove = Nodes.Where(x => IsDescendant(normPath, x.Key)).ToList(); + foreach (var kvp in remove) Nodes.Remove(kvp.Key); + Delete(path, true); + } + else + { + if (Nodes.Any(x => IsChild(normPath, x.Key) && x.Value.IsExist) // shadow content + || _fs.GetDirectories(path).Any() || _fs.GetFiles(path).Any()) // actual content + throw new InvalidOperationException("Directory is not empty."); + Nodes[path] = new ShadowNode(true, true); + var remove = Nodes.Where(x => IsChild(normPath, x.Key)).ToList(); + foreach (var kvp in remove) Nodes.Remove(kvp.Key); + Delete(path, false); + } + } + + private void Delete(string path, bool recurse) + { + foreach (var file in _fs.GetFiles(path)) + { + Nodes[NormPath(file)] = new ShadowNode(true, false); + } + foreach (var dir in _fs.GetDirectories(path)) + { + Nodes[NormPath(dir)] = new ShadowNode(true, true); + if (recurse) Delete(dir, true); + } + } + + public bool DirectoryExists(string path) + { + ShadowNode sf; + if (Nodes.TryGetValue(NormPath(path), out sf)) + return sf.IsDir && sf.IsExist; + return _fs.DirectoryExists(path); + } + + public void AddFile(string path, Stream stream) + { + AddFile(path, stream, true); + } + + public void AddFile(string path, Stream stream, bool overrideIfExists) + { + ShadowNode sf; + var normPath = NormPath(path); + if (Nodes.TryGetValue(normPath, out sf) && sf.IsExist && (sf.IsDir || overrideIfExists == false)) + throw new InvalidOperationException(string.Format("A file at path '{0}' already exists", path)); + + var parts = normPath.Split('/'); + for (var i = 0; i < parts.Length - 1; i++) + { + var dirPath = string.Join("/", parts.Take(i + 1)); + ShadowNode sd; + if (Nodes.TryGetValue(dirPath, out sd)) + { + if (sd.IsFile) throw new InvalidOperationException("Invalid path."); + if (sd.IsDelete) Nodes[dirPath] = new ShadowNode(false, true); + } + else + { + if (_fs.DirectoryExists(dirPath)) continue; + if (_fs.FileExists(dirPath)) throw new InvalidOperationException("Invalid path."); + Nodes[dirPath] = new ShadowNode(false, true); + } + } + + _sfs.AddFile(path, stream, overrideIfExists); + Nodes[normPath] = new ShadowNode(false, false); + } + + public IEnumerable GetFiles(string path) + { + var normPath = NormPath(path); + var shadows = Nodes.Where(kvp => IsChild(normPath, kvp.Key)).ToArray(); + var files = _fs.GetFiles(path); + return files + .Except(shadows.Where(kvp => (kvp.Value.IsFile && kvp.Value.IsDelete) || kvp.Value.IsDir) + .Select(kvp => kvp.Key)) + .Union(shadows.Where(kvp => kvp.Value.IsFile && kvp.Value.IsExist).Select(kvp => kvp.Key)) + .Distinct(); + } + + public IEnumerable GetFiles(string path, string filter) + { + return _fs.GetFiles(path, filter); + } + + public Stream OpenFile(string path) + { + ShadowNode sf; + if (Nodes.TryGetValue(NormPath(path), out sf)) + return sf.IsDir || sf.IsDelete ? null : _sfs.OpenFile(path); + return _fs.OpenFile(path); + } + + public void DeleteFile(string path) + { + if (FileExists(path) == false) return; + Nodes[NormPath(path)] = new ShadowNode(true, false); + } + + public bool FileExists(string path) + { + ShadowNode sf; + if (Nodes.TryGetValue(NormPath(path), out sf)) + return sf.IsFile && sf.IsExist; + return _fs.FileExists(path); + } + + public string GetRelativePath(string fullPathOrUrl) + { + return _fs.GetRelativePath(fullPathOrUrl); + } + + public string GetFullPath(string path) + { + return _fs.GetFullPath(path); + } + + public string GetUrl(string path) + { + return _fs.GetUrl(path); + } + + public DateTimeOffset GetLastModified(string path) + { + ShadowNode sf; + if (Nodes.TryGetValue(NormPath(path), out sf) == false) return _fs.GetLastModified(path); + if (sf.IsDelete) throw new InvalidOperationException("Invalid path."); + return _sfs.GetLastModified(path); + } + + public DateTimeOffset GetCreated(string path) + { + ShadowNode sf; + if (Nodes.TryGetValue(NormPath(path), out sf) == false) return _fs.GetCreated(path); + if (sf.IsDelete) throw new InvalidOperationException("Invalid path."); + return _sfs.GetCreated(path); + } + + public long GetSize(string path) + { + ShadowNode sf; + if (Nodes.TryGetValue(NormPath(path), out sf) == false) + { + var fs2 = _fs as IFileSystem2; + return fs2 == null ? _fs.GetSize(path) : fs2.GetSize(path); + } + if (sf.IsDelete || sf.IsDir) throw new InvalidOperationException("Invalid path."); + return _sfs.GetSize(path); + } + } +} diff --git a/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs index 277e0daf30..827bee68ef 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs @@ -7,7 +7,7 @@ namespace Umbraco.Core.Persistence.Repositories internal class PartialViewMacroRepository : PartialViewRepository { public PartialViewMacroRepository(IUnitOfWork work) - : this(work, new PhysicalFileSystem(SystemDirectories.MacroPartials)) + : this(work, FileSystemProviderManager.Current.MacroPartialsFileSystem) { } diff --git a/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs index 6631adc13b..199adb51ba 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs @@ -11,7 +11,7 @@ namespace Umbraco.Core.Persistence.Repositories internal class PartialViewRepository : FileRepository, IPartialViewRepository { public PartialViewRepository(IUnitOfWork work) - : this(work, new PhysicalFileSystem(SystemDirectories.PartialViews)) + : this(work, FileSystemProviderManager.Current.PartialViewsFileSystem) { } diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index dbb36f2cf9..d67139c713 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -212,7 +212,7 @@ namespace Umbraco.Core.Persistence public virtual IScriptRepository CreateScriptRepository(IUnitOfWork uow) { - return new ScriptRepository(uow, new PhysicalFileSystem(SystemDirectories.Scripts), _settings.Content); + return new ScriptRepository(uow, FileSystemProviderManager.Current.ScriptsFileSystem, _settings.Content); } internal virtual IPartialViewRepository CreatePartialViewRepository(IUnitOfWork uow) @@ -227,7 +227,7 @@ namespace Umbraco.Core.Persistence public virtual IStylesheetRepository CreateStylesheetRepository(IUnitOfWork uow, IDatabaseUnitOfWork db) { - return new StylesheetRepository(uow, new PhysicalFileSystem(SystemDirectories.Css)); + return new StylesheetRepository(uow, FileSystemProviderManager.Current.StylesheetsFileSystem); } public virtual ITemplateRepository CreateTemplateRepository(IDatabaseUnitOfWork uow) @@ -235,14 +235,14 @@ namespace Umbraco.Core.Persistence return new TemplateRepository(uow, _cacheHelper, _logger, _sqlSyntax, - new PhysicalFileSystem(SystemDirectories.Masterpages), - new PhysicalFileSystem(SystemDirectories.MvcViews), + FileSystemProviderManager.Current.MasterPagesFileSystem, + FileSystemProviderManager.Current.MvcViewsFileSystem, _settings.Templates); } public virtual IXsltFileRepository CreateXsltFileRepository(IUnitOfWork uow) { - return new XsltFileRepository(uow, new PhysicalFileSystem(SystemDirectories.Xslt)); + return new XsltFileRepository(uow, FileSystemProviderManager.Current.XsltFileSystem); } public virtual IMigrationEntryRepository CreateMigrationEntryRepository(IDatabaseUnitOfWork uow) @@ -350,7 +350,7 @@ namespace Umbraco.Core.Persistence internal IStylesheetRepository CreateStylesheetRepository(IDatabaseUnitOfWork uow) { - return new StylesheetRepository(uow, new PhysicalFileSystem(SystemDirectories.Css)); + return new StylesheetRepository(uow, FileSystemProviderManager.Current.StylesheetsFileSystem); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 96e87d67f3..57ed4dcaec 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -357,6 +357,7 @@ + diff --git a/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs b/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs new file mode 100644 index 0000000000..ff1d3bf1d7 --- /dev/null +++ b/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs @@ -0,0 +1,395 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; +using Umbraco.Core.IO; + +namespace Umbraco.Tests.IO +{ + [TestFixture] + public class ShadowFileSystemTests + { + [SetUp] + public void SetUp() + { } + + [TearDown] + public void TearDown() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + if (Directory.Exists(path) == false) return; + Directory.Delete(path, true); + } + + private static string NormPath(string path) + { + return path.ToLowerInvariant().Replace("\\", "/"); + } + + [Test] + public void ShadowDeleteDirectory() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + Directory.CreateDirectory(path); + Directory.CreateDirectory(path + "/ShadowTests"); + Directory.CreateDirectory(path + "/ShadowSystem"); + + var fs = new PhysicalFileSystem(path + "/ShadowTests/", "ignore"); + var sfs = new PhysicalFileSystem(path + "/ShadowSystem/", "ignore"); + var ss = new ShadowFileSystem(fs, sfs); + + Directory.CreateDirectory(path + "/ShadowTests/d1"); + Directory.CreateDirectory(path + "/ShadowTests/d2"); + + var files = fs.GetFiles(""); + Assert.AreEqual(0, files.Count()); + + var dirs = fs.GetDirectories(""); + Assert.AreEqual(2, dirs.Count()); + Assert.IsTrue(dirs.Contains("d1")); + Assert.IsTrue(dirs.Contains("d2")); + + ss.DeleteDirectory("d1"); + + Assert.IsTrue(Directory.Exists(path + "/ShadowTests/d1")); + Assert.IsTrue(fs.DirectoryExists("d1")); + Assert.IsFalse(ss.DirectoryExists("d1")); + + dirs = ss.GetDirectories(""); + Assert.AreEqual(1, dirs.Count()); + Assert.IsTrue(dirs.Contains("d2")); + } + + [Test] + public void ShadowDeleteDirectoryInDir() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + Directory.CreateDirectory(path); + Directory.CreateDirectory(path + "/ShadowTests"); + Directory.CreateDirectory(path + "/ShadowSystem"); + + var fs = new PhysicalFileSystem(path + "/ShadowTests/", "ignore"); + var sfs = new PhysicalFileSystem(path + "/ShadowSystem/", "ignore"); + var ss = new ShadowFileSystem(fs, sfs); + + Directory.CreateDirectory(path + "/ShadowTests/sub"); + Directory.CreateDirectory(path + "/ShadowTests/sub/d1"); + Directory.CreateDirectory(path + "/ShadowTests/sub/d2"); + + var files = fs.GetFiles(""); + Assert.AreEqual(0, files.Count()); + + var dirs = ss.GetDirectories(""); + Assert.AreEqual(1, dirs.Count()); + Assert.IsTrue(dirs.Contains("sub")); + + dirs = fs.GetDirectories("sub"); + Assert.AreEqual(2, dirs.Count()); + Assert.IsTrue(dirs.Contains("sub/d1")); + Assert.IsTrue(dirs.Contains("sub/d2")); + + dirs = ss.GetDirectories("sub"); + Assert.AreEqual(2, dirs.Count()); + Assert.IsTrue(dirs.Contains("sub/d1")); + Assert.IsTrue(dirs.Contains("sub/d2")); + + ss.DeleteDirectory("sub/d1"); + + Assert.IsTrue(Directory.Exists(path + "/ShadowTests/sub/d1")); + Assert.IsTrue(fs.DirectoryExists("sub/d1")); + Assert.IsFalse(ss.DirectoryExists("sub/d1")); + + dirs = fs.GetDirectories("sub"); + Assert.AreEqual(2, dirs.Count()); + Assert.IsTrue(dirs.Contains("sub/d1")); + Assert.IsTrue(dirs.Contains("sub/d2")); + + dirs = ss.GetDirectories("sub"); + Assert.AreEqual(1, dirs.Count()); + Assert.IsTrue(dirs.Contains("sub/d2")); + } + + [Test] + public void ShadowDeleteFile() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + Directory.CreateDirectory(path); + Directory.CreateDirectory(path + "/ShadowTests"); + Directory.CreateDirectory(path + "/ShadowSystem"); + + var fs = new PhysicalFileSystem(path + "/ShadowTests/", "ignore"); + var sfs = new PhysicalFileSystem(path + "/ShadowSystem/", "ignore"); + var ss = new ShadowFileSystem(fs, sfs); + + File.WriteAllText(path + "/ShadowTests/f1.txt", "foo"); + File.WriteAllText(path + "/ShadowTests/f2.txt", "foo"); + + var files = fs.GetFiles(""); + Assert.AreEqual(2, files.Count()); + Assert.IsTrue(files.Contains("f1.txt")); + Assert.IsTrue(files.Contains("f2.txt")); + + files = ss.GetFiles(""); + Assert.AreEqual(2, files.Count()); + Assert.IsTrue(files.Contains("f1.txt")); + Assert.IsTrue(files.Contains("f2.txt")); + + var dirs = ss.GetDirectories(""); + Assert.AreEqual(0, dirs.Count()); + + ss.DeleteFile("f1.txt"); + + Assert.IsTrue(File.Exists(path + "/ShadowTests/f1.txt")); + Assert.IsTrue(fs.FileExists("f1.txt")); + Assert.IsFalse(ss.FileExists("f1.txt")); + + files = ss.GetFiles(""); + Assert.AreEqual(1, files.Count()); + Assert.IsTrue(files.Contains("f2.txt")); + } + + [Test] + public void ShadowDeleteFileInDir() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + Directory.CreateDirectory(path); + Directory.CreateDirectory(path + "/ShadowTests"); + Directory.CreateDirectory(path + "/ShadowSystem"); + + var fs = new PhysicalFileSystem(path + "/ShadowTests/", "ignore"); + var sfs = new PhysicalFileSystem(path + "/ShadowSystem/", "ignore"); + var ss = new ShadowFileSystem(fs, sfs); + + Directory.CreateDirectory(path + "/ShadowTests/sub"); + File.WriteAllText(path + "/ShadowTests/sub/f1.txt", "foo"); + File.WriteAllText(path + "/ShadowTests/sub/f2.txt", "foo"); + + var files = fs.GetFiles(""); + Assert.AreEqual(0, files.Count()); + + files = fs.GetFiles("sub"); + Assert.AreEqual(2, files.Count()); + Assert.IsTrue(files.Contains("sub/f1.txt")); + Assert.IsTrue(files.Contains("sub/f2.txt")); + + files = ss.GetFiles(""); + Assert.AreEqual(0, files.Count()); + + var dirs = ss.GetDirectories(""); + Assert.AreEqual(1, dirs.Count()); + Assert.IsTrue(dirs.Contains("sub")); + + files = ss.GetFiles("sub"); + Assert.AreEqual(2, files.Count()); + Assert.IsTrue(files.Contains("sub/f1.txt")); + Assert.IsTrue(files.Contains("sub/f2.txt")); + + dirs = ss.GetDirectories("sub"); + Assert.AreEqual(0, dirs.Count()); + + ss.DeleteFile("sub/f1.txt"); + + Assert.IsTrue(File.Exists(path + "/ShadowTests/sub/f1.txt")); + Assert.IsTrue(fs.FileExists("sub/f1.txt")); + Assert.IsFalse(ss.FileExists("sub/f1.txt")); + + files = fs.GetFiles("sub"); + Assert.AreEqual(2, files.Count()); + Assert.IsTrue(files.Contains("sub/f1.txt")); + Assert.IsTrue(files.Contains("sub/f2.txt")); + + files = ss.GetFiles("sub"); + Assert.AreEqual(1, files.Count()); + Assert.IsTrue(files.Contains("sub/f2.txt")); + } + + [Test] + public void ShadowCantCreateFile() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + Directory.CreateDirectory(path); + Directory.CreateDirectory(path + "/ShadowTests"); + Directory.CreateDirectory(path + "/ShadowSystem"); + + var fs = new PhysicalFileSystem(path + "/ShadowTests/", "ignore"); + var sfs = new PhysicalFileSystem(path + "/ShadowSystem/", "ignore"); + var ss = new ShadowFileSystem(fs, sfs); + + Assert.Throws(() => + { + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + ss.AddFile("../../f1.txt", ms); + }); + } + + [Test] + public void ShadowCreateFile() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + Directory.CreateDirectory(path); + Directory.CreateDirectory(path + "/ShadowTests"); + Directory.CreateDirectory(path + "/ShadowSystem"); + + var fs = new PhysicalFileSystem(path + "/ShadowTests/", "ignore"); + var sfs = new PhysicalFileSystem(path + "/ShadowSystem/", "ignore"); + var ss = new ShadowFileSystem(fs, sfs); + + File.WriteAllText(path + "/ShadowTests/f2.txt", "foo"); + + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + ss.AddFile("f1.txt", ms); + + Assert.IsTrue(File.Exists(path + "/ShadowTests/f2.txt")); + Assert.IsFalse(File.Exists(path + "/ShadowSystem/f2.txt")); + Assert.IsTrue(fs.FileExists("f2.txt")); + Assert.IsTrue(ss.FileExists("f2.txt")); + + Assert.IsFalse(File.Exists(path + "/ShadowTests/f1.txt")); + Assert.IsTrue(File.Exists(path + "/ShadowSystem/f1.txt")); + Assert.IsFalse(fs.FileExists("f1.txt")); + Assert.IsTrue(ss.FileExists("f1.txt")); + + var files = ss.GetFiles(""); + Assert.AreEqual(2, files.Count()); + Assert.IsTrue(files.Contains("f1.txt")); + Assert.IsTrue(files.Contains("f2.txt")); + + string content; + using (var stream = ss.OpenFile("f1.txt")) + content = new StreamReader(stream).ReadToEnd(); + + Assert.AreEqual("foo", content); + } + + [Test] + public void ShadowCreateFileInDir() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + Directory.CreateDirectory(path); + Directory.CreateDirectory(path + "/ShadowTests"); + Directory.CreateDirectory(path + "/ShadowSystem"); + + var fs = new PhysicalFileSystem(path + "/ShadowTests/", "ignore"); + var sfs = new PhysicalFileSystem(path + "/ShadowSystem/", "ignore"); + var ss = new ShadowFileSystem(fs, sfs); + + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + ss.AddFile("sub/f1.txt", ms); + + Assert.IsFalse(File.Exists(path + "/ShadowTests/sub/f1.txt")); + Assert.IsTrue(File.Exists(path + "/ShadowSystem/sub/f1.txt")); + Assert.IsFalse(fs.FileExists("sub/f1.txt")); + Assert.IsTrue(ss.FileExists("sub/f1.txt")); + + Assert.IsFalse(fs.DirectoryExists("sub")); + Assert.IsTrue(ss.DirectoryExists("sub")); + + var dirs = fs.GetDirectories(""); + Assert.AreEqual(0, dirs.Count()); + + dirs = ss.GetDirectories(""); + Assert.AreEqual(1, dirs.Count()); + Assert.IsTrue(dirs.Contains("sub")); + + var files = ss.GetFiles("sub"); + Assert.AreEqual(1, files.Count()); + + string content; + using (var stream = ss.OpenFile("sub/f1.txt")) + content = new StreamReader(stream).ReadToEnd(); + + Assert.AreEqual("foo", content); + } + + [Test] + public void ShadowAbort() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + Directory.CreateDirectory(path); + Directory.CreateDirectory(path + "/ShadowTests"); + Directory.CreateDirectory(path + "/ShadowSystem"); + + var fs = new PhysicalFileSystem(path + "/ShadowTests/", "ignore"); + var sfs = new PhysicalFileSystem(path + "/ShadowSystem/", "ignore"); + var ss = new ShadowFileSystem(fs, sfs); + + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + ss.AddFile("path/to/some/dir/f1.txt", ms); + + Assert.IsTrue(File.Exists(path + "/ShadowSystem/path/to/some/dir/f1.txt")); + + // kill everything and let the shadow fs die + Directory.Delete(path + "/ShadowSystem", true); + } + + [Test] + public void ShadowComplete() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + Directory.CreateDirectory(path); + Directory.CreateDirectory(path + "/ShadowTests"); + Directory.CreateDirectory(path + "/ShadowSystem"); + + var fs = new PhysicalFileSystem(path + "/ShadowTests/", "ignore"); + var sfs = new PhysicalFileSystem(path + "/ShadowSystem/", "ignore"); + var ss = new ShadowFileSystem(fs, sfs); + + Directory.CreateDirectory(path + "/ShadowTests/sub/sub"); + File.WriteAllText(path + "/ShadowTests/sub/sub/f2.txt", "foo"); + + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + ss.AddFile("path/to/some/dir/f1.txt", ms); + ss.DeleteFile("sub/sub/f2.txt"); + + Assert.IsTrue(File.Exists(path + "/ShadowSystem/path/to/some/dir/f1.txt")); + + ss.Complete(); + + Assert.IsTrue(File.Exists(path + "/ShadowSystem/path/to/some/dir/f1.txt")); // *not* cleaning + Assert.IsTrue(File.Exists(path + "/ShadowTests/path/to/some/dir/f1.txt")); + Assert.IsFalse(File.Exists(path + "/ShadowTests/sub/sub/f2.txt")); + } + + [Test] + public void GetFilesReturnsChildrenOnly() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + Directory.CreateDirectory(path); + File.WriteAllText(path + "/f1.txt", "foo"); + Directory.CreateDirectory(path + "/test"); + File.WriteAllText(path + "/test/f2.txt", "foo"); + Directory.CreateDirectory(path + "/test/inner"); + File.WriteAllText(path + "/test/inner/f3.txt", "foo"); + + path = NormPath(path); + var files = Directory.GetFiles(path); + Assert.AreEqual(1, files.Length); + files = Directory.GetFiles(path, "*", SearchOption.AllDirectories); + Assert.AreEqual(3, files.Length); + var efiles = Directory.EnumerateFiles(path); + Assert.AreEqual(1, efiles.Count()); + efiles = Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories); + Assert.AreEqual(3, efiles.Count()); + } + + [Test] + public void DeleteDirectoryAndFiles() + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + Directory.CreateDirectory(path); + File.WriteAllText(path + "/f1.txt", "foo"); + Directory.CreateDirectory(path + "/test"); + File.WriteAllText(path + "/test/f2.txt", "foo"); + Directory.CreateDirectory(path + "/test/inner"); + File.WriteAllText(path + "/test/inner/f3.txt", "foo"); + + path = NormPath(path); + Directory.Delete(path, true); + + Assert.IsFalse(File.Exists(path + "/test/inner/f3.txt")); + } + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 23f8b74d8d..d5f33151f4 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -176,6 +176,7 @@ + diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadTemplates.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadTemplates.cs index bf7c04bb27..ad03d99223 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadTemplates.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadTemplates.cs @@ -39,7 +39,7 @@ namespace umbraco { public loadTemplates(string application) : base(application) {} - private ViewHelper _viewHelper = new ViewHelper(new PhysicalFileSystem(SystemDirectories.MvcViews)); + private ViewHelper _viewHelper = new ViewHelper(FileSystemProviderManager.Current.MvcViewsFileSystem); protected override void CreateRootNode(ref XmlTreeNode rootNode) { diff --git a/src/umbraco.cms/businesslogic/template/Template.cs b/src/umbraco.cms/businesslogic/template/Template.cs index e78925bd60..823f6c873f 100644 --- a/src/umbraco.cms/businesslogic/template/Template.cs +++ b/src/umbraco.cms/businesslogic/template/Template.cs @@ -29,8 +29,8 @@ namespace umbraco.cms.businesslogic.template #region Private members - private readonly ViewHelper _viewHelper = new ViewHelper(new PhysicalFileSystem(SystemDirectories.MvcViews)); - private readonly MasterPageHelper _masterPageHelper = new MasterPageHelper(new PhysicalFileSystem(SystemDirectories.Masterpages)); + private readonly ViewHelper _viewHelper = new ViewHelper(FileSystemProviderManager.Current.MvcViewsFileSystem); + private readonly MasterPageHelper _masterPageHelper = new MasterPageHelper(FileSystemProviderManager.Current.MasterPagesFileSystem); internal ITemplate TemplateEntity; private int? _mastertemplate; From 30c32da5e654e0fb1ede8a9f205dec00e14ce908 Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 21 Sep 2016 16:02:32 +0200 Subject: [PATCH 069/841] Version 7.6.0-alpha014 --- src/SolutionInfo.cs | 2 +- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index 56ba43794a..2e73972598 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -12,4 +12,4 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("7.6.0")] -[assembly: AssemblyInformationalVersion("7.6.0-alpha008")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("7.6.0-alpha014")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index b30782cdb0..d1922db5bb 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "alpha008"; } } + public static string CurrentComment { get { return "alpha014"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx From 111a3ca6ac74bb70353d3b51c4ec65fe4cf3da40 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 22 Sep 2016 08:33:11 +0200 Subject: [PATCH 070/841] Refactor Shadow FileSystems --- .../IO/FileSystemProviderManager.cs | 156 +++--------- src/Umbraco.Core/IO/FileSystemWrapper.cs | 19 +- src/Umbraco.Core/IO/MediaFileSystem.cs | 2 +- src/Umbraco.Core/IO/ShadowFileSystem.cs | 39 ++- src/Umbraco.Core/IO/ShadowFileSystemsScope.cs | 114 +++++++++ src/Umbraco.Core/IO/ShadowWrapper.cs | 159 +++++++++++++ src/Umbraco.Core/IO/UmbracoMediaFile.cs | 1 - .../Persistence/DefaultDatabaseFactory.cs | 7 +- src/Umbraco.Core/Umbraco.Core.csproj | 2 + src/Umbraco.Tests/IO/ShadowFileSystemTests.cs | 225 ++++++++++++++++-- 10 files changed, 557 insertions(+), 167 deletions(-) create mode 100644 src/Umbraco.Core/IO/ShadowFileSystemsScope.cs create mode 100644 src/Umbraco.Core/IO/ShadowWrapper.cs diff --git a/src/Umbraco.Core/IO/FileSystemProviderManager.cs b/src/Umbraco.Core/IO/FileSystemProviderManager.cs index 63828fc1c3..1e076bb979 100644 --- a/src/Umbraco.Core/IO/FileSystemProviderManager.cs +++ b/src/Umbraco.Core/IO/FileSystemProviderManager.cs @@ -2,23 +2,16 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Configuration; -using System.IO; using System.Linq; using System.Reflection; -using System.Web.Hosting; using Umbraco.Core.Configuration; -using Umbraco.Core.Logging; namespace Umbraco.Core.IO { public class FileSystemProviderManager { private readonly FileSystemProvidersSection _config; - private readonly object _shadowLocker = new object(); - private readonly WeakSet _fs = new WeakSet(); - private readonly bool _shadowEnabled; - private Guid _shadow = Guid.Empty; - private FileSystemWrapper[] _shadowFs; + private readonly WeakSet _wrappers = new WeakSet(); // actual well-known filesystems returned by properties private readonly IFileSystem2 _macroPartialFileSystem; @@ -30,13 +23,13 @@ namespace Umbraco.Core.IO private readonly IFileSystem2 _mvcViewsFileSystem; // when shadowing is enabled, above filesystems, as wrappers - private readonly FileSystemWrapper2 _macroPartialFileSystemWrapper; - private readonly FileSystemWrapper2 _partialViewsFileSystemWrapper; - private readonly FileSystemWrapper2 _stylesheetsFileSystemWrapper; - private readonly FileSystemWrapper2 _scriptsFileSystemWrapper; - private readonly FileSystemWrapper2 _xsltFileSystemWrapper; - private readonly FileSystemWrapper2 _masterPagesFileSystemWrapper; - private readonly FileSystemWrapper2 _mvcViewsFileSystemWrapper; + private readonly ShadowWrapper _macroPartialFileSystemWrapper; + private readonly ShadowWrapper _partialViewsFileSystemWrapper; + private readonly ShadowWrapper _stylesheetsFileSystemWrapper; + private readonly ShadowWrapper _scriptsFileSystemWrapper; + private readonly ShadowWrapper _xsltFileSystemWrapper; + private readonly ShadowWrapper _masterPagesFileSystemWrapper; + private readonly ShadowWrapper _mvcViewsFileSystemWrapper; #region Singleton & Constructor @@ -59,31 +52,15 @@ namespace Umbraco.Core.IO _masterPagesFileSystem = new PhysicalFileSystem(SystemDirectories.Masterpages); _mvcViewsFileSystem = new PhysicalFileSystem(SystemDirectories.MvcViews); - // if shadow is enable we need a mean to replace the filesystem by a shadowed filesystem, however we cannot - // replace the actual filesystem as we don't know if anything is not holding an app-long reference to them, - // so we have to force-wrap each of them and work with the wrapped filesystem. if shadow is not enabled, - // no need to wrap (small perfs improvement). - - // fixme - irks! - // but cannot be enabled by deploy from an application event handler, because by the time an app event handler - // is instanciated it is already too late and some filesystems have been referenced by Core. here we force - // enable for deploy... but maybe it should be some sort of config option? - _shadowEnabled = AppDomain.CurrentDomain.GetAssemblies().Any(x => x.GetName().Name == "Umbraco.Deploy"); - - if (_shadowEnabled) - { - _macroPartialFileSystem = _macroPartialFileSystemWrapper = new FileSystemWrapper2(_macroPartialFileSystem); - _partialViewsFileSystem = _partialViewsFileSystemWrapper = new FileSystemWrapper2(_partialViewsFileSystem); - _stylesheetsFileSystem = _stylesheetsFileSystemWrapper = new FileSystemWrapper2(_stylesheetsFileSystem); - _scriptsFileSystem = _scriptsFileSystemWrapper = new FileSystemWrapper2(_scriptsFileSystem); - _xsltFileSystem = _xsltFileSystemWrapper = new FileSystemWrapper2(_xsltFileSystem); - _masterPagesFileSystem = _masterPagesFileSystemWrapper = new FileSystemWrapper2(_masterPagesFileSystem); - _mvcViewsFileSystem = _mvcViewsFileSystemWrapper = new FileSystemWrapper2(_mvcViewsFileSystem); - } - - // filesystems obtained from GetFileSystemProvider are already wrapped and do not need to be wrapped again, - // whether shadow is enabled or not + _macroPartialFileSystem = _macroPartialFileSystemWrapper = new ShadowWrapper(_macroPartialFileSystem, "Views/MacroPartials"); + _partialViewsFileSystem = _partialViewsFileSystemWrapper = new ShadowWrapper(_partialViewsFileSystem, "Views/Partials"); + _stylesheetsFileSystem = _stylesheetsFileSystemWrapper = new ShadowWrapper(_stylesheetsFileSystem, "css"); + _scriptsFileSystem = _scriptsFileSystemWrapper = new ShadowWrapper(_scriptsFileSystem, "scripts"); + _xsltFileSystem = _xsltFileSystemWrapper = new ShadowWrapper(_xsltFileSystem, "xslt"); + _masterPagesFileSystem = _masterPagesFileSystemWrapper = new ShadowWrapper(_masterPagesFileSystem, "masterpages"); + _mvcViewsFileSystem = _mvcViewsFileSystemWrapper = new ShadowWrapper(_mvcViewsFileSystem, "Views"); + // filesystems obtained from GetFileSystemProvider are already wrapped and do not need to be wrapped again MediaFileSystem = GetFileSystemProvider(); } @@ -194,12 +171,14 @@ namespace Umbraco.Core.IO return attr.Alias; }); - + // gets the inner fs, create the strongly-typed fs wrapping the inner fs, register & return + // so we are double-wrapping here + // could be optimized by having FileSystemWrapper inherit from ShadowWrapper, maybe var innerFs = GetUnderlyingFileSystemProvider(alias); + var shadowWrapper = new ShadowWrapper(innerFs, "typed/" + alias); var fs = (TFileSystem) Activator.CreateInstance(typeof (TFileSystem), innerFs); - if (_shadowEnabled) - _fs.Add(fs); + _wrappers.Add(shadowWrapper); // keeping a weak reference to the wrapper return fs; } @@ -225,88 +204,21 @@ namespace Umbraco.Core.IO // _shadowEnabled = true; //} - internal void Shadow(Guid id) + public ShadowFileSystemsScope Shadow(Guid id) { - lock (_shadowLocker) - { - if (_shadowEnabled == false) throw new InvalidOperationException("Shadowing is not enabled."); - if (_shadow != Guid.Empty) throw new InvalidOperationException("Already shadowing (" + _shadow + ")."); - _shadow = id; + var typed = _wrappers.ToArray(); + var wrappers = new ShadowWrapper[typed.Length + 7]; + var i = 0; + while (i < typed.Length) wrappers[i] = typed[i++]; + wrappers[i++] = _macroPartialFileSystemWrapper; + wrappers[i++] = _partialViewsFileSystemWrapper; + wrappers[i++] = _stylesheetsFileSystemWrapper; + wrappers[i++] = _scriptsFileSystemWrapper; + wrappers[i++] = _xsltFileSystemWrapper; + wrappers[i++] = _masterPagesFileSystemWrapper; + wrappers[i] = _mvcViewsFileSystemWrapper; - LogHelper.Debug("Shadow " + id + "."); - - ShadowFs(id, _macroPartialFileSystemWrapper, "Views/MacroPartials"); - ShadowFs(id, _partialViewsFileSystemWrapper, "Views/Partials"); - ShadowFs(id, _stylesheetsFileSystemWrapper, "css"); - ShadowFs(id, _scriptsFileSystemWrapper, "scripts"); - ShadowFs(id, _xsltFileSystemWrapper, "xslt"); - ShadowFs(id, _masterPagesFileSystemWrapper, "masterpages"); - ShadowFs(id, _mvcViewsFileSystemWrapper, "Views"); - - _shadowFs = _fs.ToArray(); - foreach (var fs in _shadowFs) - ShadowFs(id, fs, "stfs/" + fs.GetType().FullName); - } - } - - private static void ShadowFs(Guid id, FileSystemWrapper filesystem, string path) - { - var virt = "~/App_Data/Shadow/" + id + "/" + path; - var dir = HostingEnvironment.MapPath(virt); - if (dir == null) throw new InvalidOperationException("Could not map path."); - Directory.CreateDirectory(dir); - - // shadow filesystem pretends to be IFileSystem2 even though the inner filesystem - // is not, by invoking the GetSize extension method when needed. - var shadowFs = new ShadowFileSystem(filesystem.Wrapped, new PhysicalFileSystem(virt)); - filesystem.Wrapped = shadowFs; - } - - internal void UnShadow(bool complete) - { - lock (_shadowLocker) - { - if (_shadow == Guid.Empty) return; - - // copy and null before anything else - var shadow = _shadow; - var shadowFs = _shadowFs; - _shadow = Guid.Empty; - _shadowFs = null; - - LogHelper.Debug("UnShadow " + shadow + (complete?" (complete)":" (abort)") + "."); - - if (complete) - { - ((ShadowFileSystem) _macroPartialFileSystemWrapper.Wrapped).Complete(); - ((ShadowFileSystem) _partialViewsFileSystemWrapper.Wrapped).Complete(); - ((ShadowFileSystem) _stylesheetsFileSystemWrapper.Wrapped).Complete(); - ((ShadowFileSystem) _scriptsFileSystemWrapper.Wrapped).Complete(); - ((ShadowFileSystem) _xsltFileSystemWrapper.Wrapped).Complete(); - ((ShadowFileSystem) _masterPagesFileSystemWrapper.Wrapped).Complete(); - ((ShadowFileSystem) _mvcViewsFileSystemWrapper.Wrapped).Complete(); - - foreach (var fs in shadowFs) - ((ShadowFileSystem) fs.Wrapped).Complete(); - } - - UnShadowFs(_macroPartialFileSystemWrapper); - UnShadowFs(_partialViewsFileSystemWrapper); - UnShadowFs(_stylesheetsFileSystemWrapper); - UnShadowFs(_scriptsFileSystemWrapper); - UnShadowFs(_xsltFileSystemWrapper); - UnShadowFs(_masterPagesFileSystemWrapper); - UnShadowFs(_mvcViewsFileSystemWrapper); - - foreach (var fs in shadowFs) - UnShadowFs(fs); - } - } - - private static void UnShadowFs(FileSystemWrapper filesystem) - { - var inner = ((ShadowFileSystem) filesystem.Wrapped).Inner; - filesystem.Wrapped = inner; + return ShadowFileSystemsScope.CreateScope(id, wrappers); } #endregion diff --git a/src/Umbraco.Core/IO/FileSystemWrapper.cs b/src/Umbraco.Core/IO/FileSystemWrapper.cs index 5bac2afa6b..27e08330ed 100644 --- a/src/Umbraco.Core/IO/FileSystemWrapper.cs +++ b/src/Umbraco.Core/IO/FileSystemWrapper.cs @@ -14,7 +14,7 @@ namespace Umbraco.Core.IO /// /// This abstract class just wraps the 'real' IFileSystem object passed in to its constructor. /// - public abstract class FileSystemWrapper : IFileSystem + public abstract class FileSystemWrapper : IFileSystem2 { protected FileSystemWrapper(IFileSystem wrapped) { @@ -102,17 +102,12 @@ namespace Umbraco.Core.IO { return Wrapped.GetCreated(path); } - } - public class FileSystemWrapper2 : FileSystemWrapper, IFileSystem2 - { - public FileSystemWrapper2(IFileSystem2 fs) - : base(fs) - { } - - public long GetSize(string path) - { - return ((IFileSystem2) Wrapped).GetSize(path); - } + // explicitely implementing - not breaking + long IFileSystem2.GetSize(string path) + { + var wrapped2 = Wrapped as IFileSystem2; + return wrapped2 == null ? Wrapped.GetSize(path) : wrapped2.GetSize(path); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/IO/MediaFileSystem.cs b/src/Umbraco.Core/IO/MediaFileSystem.cs index 63fcbbc82e..d0e1bbee53 100644 --- a/src/Umbraco.Core/IO/MediaFileSystem.cs +++ b/src/Umbraco.Core/IO/MediaFileSystem.cs @@ -12,7 +12,7 @@ namespace Umbraco.Core.IO /// A custom file system provider for media ///
    [FileSystemProvider("media")] - public class MediaFileSystem : FileSystemWrapper2 + public class MediaFileSystem : FileSystemWrapper { private readonly IContentSection _contentConfig; diff --git a/src/Umbraco.Core/IO/ShadowFileSystem.cs b/src/Umbraco.Core/IO/ShadowFileSystem.cs index db537ba2ca..276e058bcc 100644 --- a/src/Umbraco.Core/IO/ShadowFileSystem.cs +++ b/src/Umbraco.Core/IO/ShadowFileSystem.cs @@ -5,8 +5,6 @@ using System.Linq; namespace Umbraco.Core.IO { - // at the moment this is just a wrapper - public class ShadowFileSystem : IFileSystem2 { private readonly IFileSystem _fs; @@ -18,30 +16,51 @@ namespace Umbraco.Core.IO _sfs = sfs; } - public IFileSystem Inner { get { return _fs; } } + public IFileSystem Inner + { + get { return _fs; } + } public void Complete() { if (_nodes == null) return; + var exceptions = new List(); foreach (var kvp in _nodes) { if (kvp.Value.IsExist) { if (kvp.Value.IsFile) { - using (var stream = _sfs.OpenFile(kvp.Key)) - _fs.AddFile(kvp.Key, stream, true); + try + { + using (var stream = _sfs.OpenFile(kvp.Key)) + _fs.AddFile(kvp.Key, stream, true); + } + catch (Exception e) + { + exceptions.Add(new Exception("Could not save file \"" + kvp.Key + "\".", e)); + } } } else { - if (kvp.Value.IsDir) - _fs.DeleteDirectory(kvp.Key, true); - else - _fs.DeleteFile(kvp.Key); + try + { + if (kvp.Value.IsDir) + _fs.DeleteDirectory(kvp.Key, true); + else + _fs.DeleteFile(kvp.Key); + } + catch (Exception e) + { + exceptions.Add(new Exception("Could not delete " + (kvp.Value.IsDir ? "directory": "file") + " \"" + kvp.Key + "\".", e)); + } } } _nodes.Clear(); + + if (exceptions.Count == 0) return; + throw new AggregateException("Failed to apply all changes (see exceptions).", exceptions); } private Dictionary _nodes; @@ -255,6 +274,8 @@ namespace Umbraco.Core.IO ShadowNode sf; if (Nodes.TryGetValue(NormPath(path), out sf) == false) { + // the inner filesystem (_fs) can be IFileSystem2... or just IFileSystem + // figure it out and use the most effective GetSize method var fs2 = _fs as IFileSystem2; return fs2 == null ? _fs.GetSize(path) : fs2.GetSize(path); } diff --git a/src/Umbraco.Core/IO/ShadowFileSystemsScope.cs b/src/Umbraco.Core/IO/ShadowFileSystemsScope.cs new file mode 100644 index 0000000000..5e0280ddca --- /dev/null +++ b/src/Umbraco.Core/IO/ShadowFileSystemsScope.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Runtime.Remoting.Messaging; +using Umbraco.Core.Logging; + +namespace Umbraco.Core.IO +{ + public class ShadowFileSystemsScope : IDisposable + { + // note: taking a reference to the _manager instead of using manager.Current + // to avoid using Current everywhere but really, we support only 1 scope at + // a time, not multiple scopes in case of multiple managers (not supported) + + private const string ItemKey = "Umbraco.Core.IO.ShadowFileSystemsScope"; + private static readonly object Locker = new object(); + private readonly Guid _id; + private readonly ShadowWrapper[] _wrappers; + + static ShadowFileSystemsScope() + { + SafeCallContext.Register( + () => + { + var scope = CallContext.LogicalGetData(ItemKey); + CallContext.FreeNamedDataSlot(ItemKey); + return scope; + }, + o => + { + if (CallContext.LogicalGetData(ItemKey) != null) throw new InvalidOperationException(); + if (o != null) CallContext.LogicalSetData(ItemKey, o); + }); + } + + private ShadowFileSystemsScope(Guid id, ShadowWrapper[] wrappers) + { + LogHelper.Debug("Shadow " + id + "."); + _id = id; + _wrappers = wrappers; + foreach (var wrapper in _wrappers) + wrapper.Shadow(id); + } + + // internal for tests + FileSystemProviderManager + // do NOT use otherwise + internal static ShadowFileSystemsScope CreateScope(Guid id, ShadowWrapper[] wrappers) + { + lock (Locker) + { + if (CallContext.LogicalGetData(ItemKey) != null) throw new InvalidOperationException("Already shadowing."); + CallContext.LogicalSetData(ItemKey, ItemKey); // value does not matter + } + return new ShadowFileSystemsScope(id, wrappers); + } + + internal static bool InScope + { + get { return NoScope == false; } + } + + internal static bool NoScope + { + get { return CallContext.LogicalGetData(ItemKey) == null; } + } + + public void Complete() + { + lock (Locker) + { + LogHelper.Debug("UnShadow " + _id + " (complete)."); + + var exceptions = new List(); + foreach (var wrapper in _wrappers) + { + try + { + // this may throw an AggregateException if some of the changes could not be applied + wrapper.UnShadow(true); + } + catch (AggregateException ae) + { + exceptions.Add(ae); + } + } + + if (exceptions.Count > 0) + throw new AggregateException("Failed to apply all changes (see exceptions).", exceptions); + + // last, & *only* if successful (otherwise we'll unshadow & cleanup as best as we can) + CallContext.FreeNamedDataSlot(ItemKey); + } + } + + public void Dispose() + { + lock (Locker) + { + if (CallContext.LogicalGetData(ItemKey) == null) return; + + try + { + LogHelper.Debug("UnShadow " + _id + " (abort)"); + foreach (var wrapper in _wrappers) + wrapper.UnShadow(false); // should not throw + } + finally + { + // last, & always + CallContext.FreeNamedDataSlot(ItemKey); + } + } + } + } +} diff --git a/src/Umbraco.Core/IO/ShadowWrapper.cs b/src/Umbraco.Core/IO/ShadowWrapper.cs new file mode 100644 index 0000000000..7f9bc61a66 --- /dev/null +++ b/src/Umbraco.Core/IO/ShadowWrapper.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Web.Hosting; + +namespace Umbraco.Core.IO +{ + public class ShadowWrapper : IFileSystem2 + { + private readonly IFileSystem _innerFileSystem; + private readonly string _shadowPath; + private ShadowFileSystem _shadowFileSystem; + private string _shadowDir; + + public ShadowWrapper(IFileSystem innerFileSystem, string shadowPath) + { + _innerFileSystem = innerFileSystem; + _shadowPath = shadowPath; + } + + internal void Shadow(Guid id) + { + // note: no thread-safety here, because ShadowFs is thread-safe due to the check + // on ShadowFileSystemsScope.None - and if None is false then we should be running + // in a single thread anyways + + var virt = "~/App_Data/Shadow/" + id + "/" + _shadowPath; + _shadowDir = IOHelper.MapPath(virt); + Directory.CreateDirectory(_shadowDir); + var tempfs = new PhysicalFileSystem(virt); + _shadowFileSystem = new ShadowFileSystem(_innerFileSystem, tempfs); + } + + internal void UnShadow(bool complete) + { + var shadowFileSystem = _shadowFileSystem; + var dir = _shadowDir; + _shadowFileSystem = null; + _shadowDir = null; + + try + { + // this may throw an AggregateException if some of the changes could not be applied + if (complete) shadowFileSystem.Complete(); + } + finally + { + // in any case, cleanup + try + { + Directory.Delete(dir, true); + dir = dir.Substring(0, dir.Length - _shadowPath.Length - 1); + if (Directory.EnumerateFileSystemEntries(dir).Any() == false) + Directory.Delete(dir, true); + } + catch + { + // ugly, isn't it? but if we cannot cleanup, bah, just leave it there + } + } + } + + private IFileSystem FileSystem + { + get { return ShadowFileSystemsScope.NoScope ? _innerFileSystem : _shadowFileSystem; } + } + + public IEnumerable GetDirectories(string path) + { + return FileSystem.GetDirectories(path); + } + + public void DeleteDirectory(string path) + { + FileSystem.DeleteDirectory(path); + } + + public void DeleteDirectory(string path, bool recursive) + { + FileSystem.DeleteDirectory(path, recursive); + } + + public bool DirectoryExists(string path) + { + return FileSystem.DirectoryExists(path); + } + + public void AddFile(string path, Stream stream) + { + FileSystem.AddFile(path, stream); + } + + public void AddFile(string path, Stream stream, bool overrideExisting) + { + FileSystem.AddFile(path, stream, overrideExisting); + } + + public IEnumerable GetFiles(string path) + { + return FileSystem.GetFiles(path); + } + + public IEnumerable GetFiles(string path, string filter) + { + return FileSystem.GetFiles(path, filter); + } + + public Stream OpenFile(string path) + { + return FileSystem.OpenFile(path); + } + + public void DeleteFile(string path) + { + FileSystem.DeleteFile(path); + } + + public bool FileExists(string path) + { + return FileSystem.FileExists(path); + } + + public string GetRelativePath(string fullPathOrUrl) + { + return FileSystem.GetRelativePath(fullPathOrUrl); + } + + public string GetFullPath(string path) + { + return FileSystem.GetFullPath(path); + } + + public string GetUrl(string path) + { + return FileSystem.GetUrl(path); + } + + public DateTimeOffset GetLastModified(string path) + { + return FileSystem.GetLastModified(path); + } + + public DateTimeOffset GetCreated(string path) + { + return FileSystem.GetCreated(path); + } + + public long GetSize(string path) + { + var filesystem = FileSystem; // will be either a ShadowFileSystem OR the actual underlying IFileSystem + + // and the underlying filesystem can be IFileSystem2... or just IFileSystem + // figure it out and use the most effective GetSize method + var filesystem2 = filesystem as IFileSystem2; + return filesystem2 == null ? filesystem.GetSize(path) : filesystem2.GetSize(path); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/IO/UmbracoMediaFile.cs b/src/Umbraco.Core/IO/UmbracoMediaFile.cs index 27699baef4..b168ce89b4 100644 --- a/src/Umbraco.Core/IO/UmbracoMediaFile.cs +++ b/src/Umbraco.Core/IO/UmbracoMediaFile.cs @@ -2,7 +2,6 @@ using System.Drawing; using System.IO; using System.Web; -using Umbraco.Core.Configuration; using Umbraco.Core.Logging; using Umbraco.Core.Media; diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs index d461801aa4..a9c7a976a3 100644 --- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs @@ -181,15 +181,12 @@ namespace Umbraco.Core.Persistence if (HttpContext.Current == null) { if (NonContextValue != null) throw new InvalidOperationException(); - NonContextValue = database; + if (database != null) NonContextValue = database; } else { if (HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] != null) throw new InvalidOperationException(); - if (database == null) - HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); - else - HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] = database; + if (database != null) HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] = database; } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 57ed4dcaec..78e0cdc632 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -358,6 +358,8 @@ + + diff --git a/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs b/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs index ff1d3bf1d7..326e5e1369 100644 --- a/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs +++ b/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs @@ -1,10 +1,10 @@ using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; -using System.Threading.Tasks; +using System.Threading; using NUnit.Framework; +using Umbraco.Core; using Umbraco.Core.IO; namespace Umbraco.Tests.IO @@ -14,14 +14,32 @@ namespace Umbraco.Tests.IO { [SetUp] public void SetUp() - { } + { + ClearFiles(); + } [TearDown] public void TearDown() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); - if (Directory.Exists(path) == false) return; - Directory.Delete(path, true); + ClearFiles(); + } + + private static void ClearFiles() + { + var path = IOHelper.MapPath("FileSysTests"); + if (Directory.Exists(path)) + { + foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) + File.Delete(file); + Directory.Delete(path, true); + } + path = IOHelper.MapPath("App_Data"); + if (Directory.Exists(path)) + { + foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) + File.Delete(file); + Directory.Delete(path, true); + } } private static string NormPath(string path) @@ -32,7 +50,7 @@ namespace Umbraco.Tests.IO [Test] public void ShadowDeleteDirectory() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + var path = IOHelper.MapPath("FileSysTests"); Directory.CreateDirectory(path); Directory.CreateDirectory(path + "/ShadowTests"); Directory.CreateDirectory(path + "/ShadowSystem"); @@ -66,7 +84,7 @@ namespace Umbraco.Tests.IO [Test] public void ShadowDeleteDirectoryInDir() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + var path = IOHelper.MapPath("FileSysTests"); Directory.CreateDirectory(path); Directory.CreateDirectory(path + "/ShadowTests"); Directory.CreateDirectory(path + "/ShadowSystem"); @@ -115,7 +133,7 @@ namespace Umbraco.Tests.IO [Test] public void ShadowDeleteFile() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + var path = IOHelper.MapPath("FileSysTests"); Directory.CreateDirectory(path); Directory.CreateDirectory(path + "/ShadowTests"); Directory.CreateDirectory(path + "/ShadowSystem"); @@ -154,7 +172,7 @@ namespace Umbraco.Tests.IO [Test] public void ShadowDeleteFileInDir() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + var path = IOHelper.MapPath("FileSysTests"); Directory.CreateDirectory(path); Directory.CreateDirectory(path + "/ShadowTests"); Directory.CreateDirectory(path + "/ShadowSystem"); @@ -209,7 +227,7 @@ namespace Umbraco.Tests.IO [Test] public void ShadowCantCreateFile() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + var path = IOHelper.MapPath("FileSysTests"); Directory.CreateDirectory(path); Directory.CreateDirectory(path + "/ShadowTests"); Directory.CreateDirectory(path + "/ShadowSystem"); @@ -228,7 +246,7 @@ namespace Umbraco.Tests.IO [Test] public void ShadowCreateFile() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + var path = IOHelper.MapPath("FileSysTests"); Directory.CreateDirectory(path); Directory.CreateDirectory(path + "/ShadowTests"); Directory.CreateDirectory(path + "/ShadowSystem"); @@ -267,7 +285,7 @@ namespace Umbraco.Tests.IO [Test] public void ShadowCreateFileInDir() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + var path = IOHelper.MapPath("FileSysTests"); Directory.CreateDirectory(path); Directory.CreateDirectory(path + "/ShadowTests"); Directory.CreateDirectory(path + "/ShadowSystem"); @@ -307,7 +325,7 @@ namespace Umbraco.Tests.IO [Test] public void ShadowAbort() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + var path = IOHelper.MapPath("FileSysTests"); Directory.CreateDirectory(path); Directory.CreateDirectory(path + "/ShadowTests"); Directory.CreateDirectory(path + "/ShadowSystem"); @@ -328,7 +346,7 @@ namespace Umbraco.Tests.IO [Test] public void ShadowComplete() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + var path = IOHelper.MapPath("FileSysTests"); Directory.CreateDirectory(path); Directory.CreateDirectory(path + "/ShadowTests"); Directory.CreateDirectory(path + "/ShadowSystem"); @@ -353,10 +371,183 @@ namespace Umbraco.Tests.IO Assert.IsFalse(File.Exists(path + "/ShadowTests/sub/sub/f2.txt")); } + [Test] + public void ShadowScopeComplete() + { + var path = IOHelper.MapPath("FileSysTests"); + var appdata = IOHelper.MapPath("App_Data"); + Directory.CreateDirectory(path); + + var fs = new PhysicalFileSystem(path, "ignore"); + var sw = new ShadowWrapper(fs, "shadow"); + var swa = new[] { sw }; + + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + sw.AddFile("sub/f1.txt", ms); + Assert.IsTrue(fs.FileExists("sub/f1.txt")); + + Guid id; + + // explicit shadow without scope does not work + sw.Shadow(id = Guid.NewGuid()); + Assert.IsTrue(Directory.Exists(appdata + "/Shadow/" + id)); + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + sw.AddFile("sub/f2.txt", ms); + Assert.IsTrue(fs.FileExists("sub/f2.txt")); + sw.UnShadow(true); + Assert.IsTrue(fs.FileExists("sub/f2.txt")); + Assert.IsFalse(Directory.Exists(appdata + "/Shadow/" + id)); + + // shadow with scope but no complete does not complete + var scope = ShadowFileSystemsScope.CreateScope(id = Guid.NewGuid(), swa); + Assert.IsTrue(Directory.Exists(appdata + "/Shadow/" + id)); + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + sw.AddFile("sub/f3.txt", ms); + Assert.IsFalse(fs.FileExists("sub/f3.txt")); + Assert.AreEqual(1, Directory.GetDirectories(appdata + "/Shadow").Length); + scope.Dispose(); + Assert.IsFalse(fs.FileExists("sub/f3.txt")); + Assert.IsFalse(Directory.Exists(appdata + "/Shadow/" + id)); + + // shadow with scope and complete does complete + scope = ShadowFileSystemsScope.CreateScope(id = Guid.NewGuid(), swa); + Assert.IsTrue(Directory.Exists(appdata + "/Shadow/" + id)); + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + sw.AddFile("sub/f4.txt", ms); + Assert.IsFalse(fs.FileExists("sub/f4.txt")); + Assert.AreEqual(1, Directory.GetDirectories(appdata + "/Shadow").Length); + scope.Complete(); + Assert.IsTrue(fs.FileExists("sub/f4.txt")); + Assert.AreEqual(0, Directory.GetDirectories(appdata + "/Shadow").Length); + scope.Dispose(); + Assert.IsTrue(fs.FileExists("sub/f4.txt")); + Assert.IsFalse(Directory.Exists(appdata + "/Shadow/" + id)); + + // test scope for "another thread" + + scope = ShadowFileSystemsScope.CreateScope(id = Guid.NewGuid(), swa); + Assert.IsTrue(Directory.Exists(appdata + "/Shadow/" + id)); + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + sw.AddFile("sub/f5.txt", ms); + Assert.IsFalse(fs.FileExists("sub/f5.txt")); + using (new SafeCallContext()) // pretend we're another thread w/out scope + { + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + sw.AddFile("sub/f6.txt", ms); + } + Assert.IsTrue(fs.FileExists("sub/f6.txt")); // other thread has written out to fs + scope.Complete(); + Assert.IsTrue(fs.FileExists("sub/f5.txt")); + scope.Dispose(); + Assert.IsTrue(fs.FileExists("sub/f5.txt")); + Assert.IsFalse(Directory.Exists(appdata + "/Shadow/" + id)); + } + + [Test] + public void ShadowScopeCompleteWithFileConflict() + { + var path = IOHelper.MapPath("FileSysTests"); + var appdata = IOHelper.MapPath("App_Data"); + Directory.CreateDirectory(path); + + var fs = new PhysicalFileSystem(path, "ignore"); + var sw = new ShadowWrapper(fs, "shadow"); + var swa = new[] { sw }; + + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + sw.AddFile("sub/f1.txt", ms); + Assert.IsTrue(fs.FileExists("sub/f1.txt")); + + Guid id; + + var scope = ShadowFileSystemsScope.CreateScope(id = Guid.NewGuid(), swa); + Assert.IsTrue(Directory.Exists(appdata + "/Shadow/" + id)); + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + sw.AddFile("sub/f2.txt", ms); + Assert.IsFalse(fs.FileExists("sub/f2.txt")); + using (new SafeCallContext()) // pretend we're another thread w/out scope + { + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("bar"))) + sw.AddFile("sub/f2.txt", ms); + } + Assert.IsTrue(fs.FileExists("sub/f2.txt")); // other thread has written out to fs + scope.Complete(); + Assert.IsTrue(fs.FileExists("sub/f2.txt")); + scope.Dispose(); + Assert.IsTrue(fs.FileExists("sub/f2.txt")); + Assert.IsFalse(Directory.Exists(appdata + "/Shadow/" + id)); + + string text; + using (var s = fs.OpenFile("sub/f2.txt")) + using (var r = new StreamReader(s)) + text = r.ReadToEnd(); + + // the shadow filesystem will happily overwrite anything it can + Assert.AreEqual("foo", text); + } + + [Test] + public void ShadowScopeCompleteWithDirectoryConflict() + { + var path = IOHelper.MapPath("FileSysTests"); + var appdata = IOHelper.MapPath("App_Data"); + Directory.CreateDirectory(path); + + var fs = new PhysicalFileSystem(path, "ignore"); + var sw = new ShadowWrapper(fs, "shadow"); + var swa = new[] { sw }; + + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + sw.AddFile("sub/f1.txt", ms); + Assert.IsTrue(fs.FileExists("sub/f1.txt")); + + Guid id; + + var scope = ShadowFileSystemsScope.CreateScope(id = Guid.NewGuid(), swa); + Assert.IsTrue(Directory.Exists(appdata + "/Shadow/" + id)); + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + sw.AddFile("sub/f2.txt", ms); + Assert.IsFalse(fs.FileExists("sub/f2.txt")); + using (new SafeCallContext()) // pretend we're another thread w/out scope + { + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("bar"))) + sw.AddFile("sub/f2.txt/f2.txt", ms); + } + Assert.IsTrue(fs.FileExists("sub/f2.txt/f2.txt")); // other thread has written out to fs + + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("foo"))) + sw.AddFile("sub/f3.txt", ms); + Assert.IsFalse(fs.FileExists("sub/f3.txt")); + + try + { + // no way this can work since we're trying to write a file + // but there's now a directory with the same name on the real fs + scope.Complete(); + Assert.Fail("Expected AggregateException."); + } + catch (AggregateException ae) + { + Assert.AreEqual(1, ae.InnerExceptions.Count); + var e = ae.InnerExceptions[0]; + Assert.IsNotNull(e.InnerException); + Assert.IsInstanceOf(e); + ae = (AggregateException) e; + + Assert.AreEqual(1, ae.InnerExceptions.Count); + e = ae.InnerExceptions[0]; + Assert.IsNotNull(e.InnerException); + Assert.IsInstanceOf(e.InnerException); + } + + // still, the rest of the changes has been applied ok + Assert.IsTrue(fs.FileExists("sub/f3.txt")); + } + [Test] public void GetFilesReturnsChildrenOnly() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + var path = IOHelper.MapPath("FileSysTests"); Directory.CreateDirectory(path); File.WriteAllText(path + "/f1.txt", "foo"); Directory.CreateDirectory(path + "/test"); @@ -378,7 +569,7 @@ namespace Umbraco.Tests.IO [Test] public void DeleteDirectoryAndFiles() { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileSysTests"); + var path = IOHelper.MapPath("FileSysTests"); Directory.CreateDirectory(path); File.WriteAllText(path + "/f1.txt", "foo"); Directory.CreateDirectory(path + "/test"); From b063928732859caca68f437910967677e155d4a3 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 22 Sep 2016 21:46:23 +0200 Subject: [PATCH 071/841] Version 7.6.0-alpha0016 --- src/SolutionInfo.cs | 2 +- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index 2e73972598..b322fb5290 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -12,4 +12,4 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("7.6.0")] -[assembly: AssemblyInformationalVersion("7.6.0-alpha014")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("7.6.0-alpha016")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index d1922db5bb..09f6cd8b84 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "alpha014"; } } + public static string CurrentComment { get { return "alpha016"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx From 37e12cd0beab833aa4c08fbbaf7d42d98b220d45 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 22 Sep 2016 22:18:05 +0200 Subject: [PATCH 072/841] Fix unit tests interferences --- src/Umbraco.Tests/IO/ShadowFileSystemTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs b/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs index 326e5e1369..94ce25cc98 100644 --- a/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs +++ b/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs @@ -15,12 +15,14 @@ namespace Umbraco.Tests.IO [SetUp] public void SetUp() { + SafeCallContext.Clear(); ClearFiles(); } [TearDown] public void TearDown() { + SafeCallContext.Clear(); ClearFiles(); } From c606314c0f3f5772d8f4d61779206ddbb9ed6fdf Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 23 Sep 2016 13:55:27 +0200 Subject: [PATCH 073/841] Remove InternalsVisibleTo Umbraco.Deploy --- src/Umbraco.Core/Properties/AssemblyInfo.cs | 5 +---- src/Umbraco.Web/Properties/AssemblyInfo.cs | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Core/Properties/AssemblyInfo.cs b/src/Umbraco.Core/Properties/AssemblyInfo.cs index 5269c3ba56..d1ddadde37 100644 --- a/src/Umbraco.Core/Properties/AssemblyInfo.cs +++ b/src/Umbraco.Core/Properties/AssemblyInfo.cs @@ -44,7 +44,4 @@ using System.Security.Permissions; [assembly: InternalsVisibleTo("umbraco.providers")] //allow this to be mocked in our unit tests -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] - -// temp while we develop Deploy -[assembly: InternalsVisibleTo("Umbraco.Deploy")] \ No newline at end of file +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] \ No newline at end of file diff --git a/src/Umbraco.Web/Properties/AssemblyInfo.cs b/src/Umbraco.Web/Properties/AssemblyInfo.cs index 5acad4888e..89499b833e 100644 --- a/src/Umbraco.Web/Properties/AssemblyInfo.cs +++ b/src/Umbraco.Web/Properties/AssemblyInfo.cs @@ -37,7 +37,4 @@ using System.Security; [assembly: InternalsVisibleTo("Umbraco.VisualStudio")] [assembly: InternalsVisibleTo("Umbraco.ModelsBuilder")] [assembly: InternalsVisibleTo("Umbraco.ModelsBuilder.AspNet")] -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] - -// temp while we develop Deploy -[assembly: InternalsVisibleTo("Umbraco.Deploy")] \ No newline at end of file +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] \ No newline at end of file From 3f22e727f6e83ca59a72092c58c62523577f00b4 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 23 Sep 2016 16:42:42 +0200 Subject: [PATCH 074/841] Some things need to be public/adjusted for Deploy --- src/SolutionInfo.cs | 2 +- .../Configuration/UmbracoVersion.cs | 2 +- .../Logging/DebugDiagnosticsLogger.cs | 6 +- src/Umbraco.Core/MainDom.cs | 47 ++++++++++++--- .../Scheduling/BackgroundTaskRunner.cs | 57 +++++++++++++------ .../Scheduling/BackgroundTaskRunnerOptions.cs | 2 +- src/Umbraco.Web/Scheduling/TaskEventArgs.cs | 28 +++++++-- .../Scheduling/ThreadingTaskImmutable.cs | 4 +- 8 files changed, 112 insertions(+), 36 deletions(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index b322fb5290..6e4b94ca44 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -12,4 +12,4 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("7.6.0")] -[assembly: AssemblyInformationalVersion("7.6.0-alpha016")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("7.6.0-alpha019")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index 09f6cd8b84..adde8ca8cd 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "alpha016"; } } + public static string CurrentComment { get { return "alpha019"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx diff --git a/src/Umbraco.Core/Logging/DebugDiagnosticsLogger.cs b/src/Umbraco.Core/Logging/DebugDiagnosticsLogger.cs index c1b3306129..f5ae689da9 100644 --- a/src/Umbraco.Core/Logging/DebugDiagnosticsLogger.cs +++ b/src/Umbraco.Core/Logging/DebugDiagnosticsLogger.cs @@ -3,7 +3,11 @@ using System.Linq; namespace Umbraco.Core.Logging { - internal class DebugDiagnosticsLogger : ILogger + /// + /// Implements on top of System.Diagnostics.Debug. + /// + /// Useful for tests. + public class DebugDiagnosticsLogger : ILogger { public void Error(Type callingType, string message, Exception exception) { diff --git a/src/Umbraco.Core/MainDom.cs b/src/Umbraco.Core/MainDom.cs index 9ded022195..52dbb21f21 100644 --- a/src/Umbraco.Core/MainDom.cs +++ b/src/Umbraco.Core/MainDom.cs @@ -11,8 +11,16 @@ using Umbraco.Core.ObjectResolution; namespace Umbraco.Core { - // represents the main domain - class MainDom : IRegisteredObject + /// + /// Represents the main AppDomain running for a given application. + /// + /// + /// There can be only one "main" AppDomain running for a given application at a time. + /// When an AppDomain starts, it tries to acquire the main domain status. + /// When an AppDomain stops (eg the application is restarting) it should release the main domain status. + /// It is possible to register against the MainDom and be notified when it is released. + /// + internal class MainDom : IRegisteredObject { #region Vars @@ -34,16 +42,26 @@ namespace Umbraco.Core private volatile bool _signaled; // we have been signaled // actions to run before releasing the main domain - private readonly SortedList _callbacks = new SortedList(); + private readonly SortedList _callbacks = new SortedList(new WeightComparer()); private const int LockTimeoutMilliseconds = 90000; // (1.5 * 60 * 1000) == 1 min 30 seconds + private class WeightComparer : IComparer + { + public int Compare(int x, int y) + { + var result = x.CompareTo(y); + // return "equal" as "greater than" + return result == 0 ? 1 : result; + } + } + #endregion #region Ctor // initializes a new instance of MainDom - public MainDom(ILogger logger) + internal MainDom(ILogger logger) { _logger = logger; @@ -73,13 +91,26 @@ namespace Umbraco.Core #endregion - // register a main domain consumer + /// + /// Registers a resource that requires the current AppDomain to be the main domain to function. + /// + /// An action to execute before the AppDomain releases the main domain status. + /// An optional weight (lower goes first). + /// A value indicating whether it was possible to register. public bool Register(Action release, int weight = 100) { return Register(null, release, weight); } - // register a main domain consumer + /// + /// Registers a resource that requires the current AppDomain to be the main domain to function. + /// + /// An action to execute when registering. + /// An action to execute before the AppDomain releases the main domain status. + /// An optional weight (lower goes first). + /// A value indicating whether it was possible to register. + /// If registering is successful, then the action + /// is guaranteed to execute before the AppDomain releases the main domain status. public bool Register(Action install, Action release, int weight = 100) { lock (_locko) @@ -135,7 +166,7 @@ namespace Umbraco.Core } // acquires the main domain - public bool Acquire() + internal bool Acquire() { lock (_locko) // we don't want the hosting environment to interfere by signaling { @@ -186,7 +217,7 @@ namespace Umbraco.Core } // IRegisteredObject - public void Stop(bool immediate) + void IRegisteredObject.Stop(bool immediate) { try { diff --git a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs index d63fbb4606..b67c2c08ac 100644 --- a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs +++ b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs @@ -3,13 +3,17 @@ using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; using System.Web.Hosting; +using Umbraco.Core; using Umbraco.Core.Events; using Umbraco.Core.Logging; namespace Umbraco.Web.Scheduling { - // exists for logging purposes - internal class BackgroundTaskRunner + /// + /// Manages a queue of tasks and runs them in the background. + /// + /// This class exists for logging purposes - the one you want to use is BackgroundTaskRunner{T}. + public abstract class BackgroundTaskRunner { } /// @@ -18,7 +22,7 @@ namespace Umbraco.Web.Scheduling /// The type of the managed tasks. /// The task runner is web-aware and will ensure that it shuts down correctly when the AppDomain /// shuts down (ie is unloaded). - internal class BackgroundTaskRunner : BackgroundTaskRunner, IBackgroundTaskRunner + public class BackgroundTaskRunner : BackgroundTaskRunner, IBackgroundTaskRunner where T : class, IBackgroundTask { private readonly string _logPrefix; @@ -43,10 +47,10 @@ namespace Umbraco.Web.Scheduling private bool _terminated; // remember we've terminated private TaskCompletionSource _terminatedSource; // awaitable source - internal event TypedEventHandler, TaskEventArgs> TaskError; - internal event TypedEventHandler, TaskEventArgs> TaskStarting; - internal event TypedEventHandler, TaskEventArgs> TaskCompleted; - internal event TypedEventHandler, TaskEventArgs> TaskCancelled; + public event TypedEventHandler, TaskEventArgs> TaskError; + public event TypedEventHandler, TaskEventArgs> TaskStarting; + public event TypedEventHandler, TaskEventArgs> TaskCompleted; + public event TypedEventHandler, TaskEventArgs> TaskCancelled; // triggers when the runner stops (but could start again if a task is added to it) internal event TypedEventHandler, EventArgs> Stopped; @@ -60,26 +64,33 @@ namespace Umbraco.Web.Scheduling /// /// Initializes a new instance of the class. /// - public BackgroundTaskRunner(ILogger logger) - : this(typeof (T).FullName, new BackgroundTaskRunnerOptions(), logger) + /// A logger. + /// An optional action to execute when the main domain status is aquired. + /// An optional action to execute when the main domain status is released. + public BackgroundTaskRunner(ILogger logger, Action mainDomInstall = null, Action mainDomRelease = null) + : this(typeof (T).FullName, new BackgroundTaskRunnerOptions(), logger, mainDomInstall, mainDomRelease) { } /// /// Initializes a new instance of the class. /// /// The name of the runner. - /// - public BackgroundTaskRunner(string name, ILogger logger) - : this(name, new BackgroundTaskRunnerOptions(), logger) + /// A logger. + /// An optional action to execute when the main domain status is aquired. + /// An optional action to execute when the main domain status is released. + public BackgroundTaskRunner(string name, ILogger logger, Action mainDomInstall = null, Action mainDomRelease = null) + : this(name, new BackgroundTaskRunnerOptions(), logger, mainDomInstall, mainDomRelease) { } /// /// Initializes a new instance of the class with a set of options. /// /// The set of options. - /// - public BackgroundTaskRunner(BackgroundTaskRunnerOptions options, ILogger logger) - : this(typeof (T).FullName, options, logger) + /// A logger. + /// An optional action to execute when the main domain status is aquired. + /// An optional action to execute when the main domain status is released. + public BackgroundTaskRunner(BackgroundTaskRunnerOptions options, ILogger logger, Action mainDomInstall = null, Action mainDomRelease = null) + : this(typeof (T).FullName, options, logger, mainDomInstall, mainDomRelease) { } /// @@ -87,8 +98,10 @@ namespace Umbraco.Web.Scheduling /// /// The name of the runner. /// The set of options. - /// - public BackgroundTaskRunner(string name, BackgroundTaskRunnerOptions options, ILogger logger) + /// A logger. + /// An optional action to execute when the main domain status is aquired. + /// An optional action to execute when the main domain status is released. + public BackgroundTaskRunner(string name, BackgroundTaskRunnerOptions options, ILogger logger, Action mainDomInstall = null, Action mainDomRelease = null) { if (options == null) throw new ArgumentNullException("options"); if (logger == null) throw new ArgumentNullException("logger"); @@ -99,7 +112,15 @@ namespace Umbraco.Web.Scheduling if (options.Hosted) HostingEnvironment.RegisterObject(this); - if (options.AutoStart) + if (mainDomRelease != null) + { + var mainDom = ApplicationContext.Current.MainDom; + var reg = mainDom == null || ApplicationContext.Current.MainDom.Register(mainDomInstall, mainDomRelease); + if (reg == false) + _isCompleted = _terminated = true; + } + + if (options.AutoStart && _terminated == false) StartUp(); } diff --git a/src/Umbraco.Web/Scheduling/BackgroundTaskRunnerOptions.cs b/src/Umbraco.Web/Scheduling/BackgroundTaskRunnerOptions.cs index 55df42d3b7..28c814db24 100644 --- a/src/Umbraco.Web/Scheduling/BackgroundTaskRunnerOptions.cs +++ b/src/Umbraco.Web/Scheduling/BackgroundTaskRunnerOptions.cs @@ -3,7 +3,7 @@ namespace Umbraco.Web.Scheduling /// /// Provides options to the class. /// - internal class BackgroundTaskRunnerOptions + public class BackgroundTaskRunnerOptions { //TODO: Could add options for using a stack vs queue if required diff --git a/src/Umbraco.Web/Scheduling/TaskEventArgs.cs b/src/Umbraco.Web/Scheduling/TaskEventArgs.cs index 27e5174616..5e83b14231 100644 --- a/src/Umbraco.Web/Scheduling/TaskEventArgs.cs +++ b/src/Umbraco.Web/Scheduling/TaskEventArgs.cs @@ -2,21 +2,41 @@ namespace Umbraco.Web.Scheduling { - internal class TaskEventArgs : EventArgs + /// + /// Provides arguments for task runner events. + /// + /// The type of the task. + public class TaskEventArgs : EventArgs where T : IBackgroundTask { - public T Task { get; private set; } - public Exception Exception { get; private set; } - + /// + /// Initializes a new instance of the class with a task. + /// + /// The task. public TaskEventArgs(T task) { Task = task; } + /// + /// Initializes a new instance of the class with a task and an exception. + /// + /// The task. + /// An exception. public TaskEventArgs(T task, Exception exception) { Task = task; Exception = exception; } + + /// + /// Gets or sets the task. + /// + public T Task { get; private set; } + + /// + /// Gets or sets the exception. + /// + public Exception Exception { get; private set; } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Scheduling/ThreadingTaskImmutable.cs b/src/Umbraco.Web/Scheduling/ThreadingTaskImmutable.cs index e8ccbeac0e..1bb5fcbf41 100644 --- a/src/Umbraco.Web/Scheduling/ThreadingTaskImmutable.cs +++ b/src/Umbraco.Web/Scheduling/ThreadingTaskImmutable.cs @@ -5,10 +5,10 @@ using System.Threading.Tasks; namespace Umbraco.Web.Scheduling { /// - /// Wraps a Task within an object that gives access to its GetAwaiter method and Status + /// Wraps a within an object that gives access to its GetAwaiter method and Status /// property while ensuring that it cannot be modified in any way. /// - internal class ThreadingTaskImmutable + public class ThreadingTaskImmutable { private readonly Task _task; From 76461e866b651898939d540a3d9eb478eb7b2a2a Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 23 Sep 2016 17:25:53 +0200 Subject: [PATCH 075/841] Version 7.6.0-alpha020 --- src/SolutionInfo.cs | 2 +- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index 6e4b94ca44..fbf3d6a3a4 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -12,4 +12,4 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("7.6.0")] -[assembly: AssemblyInformationalVersion("7.6.0-alpha019")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("7.6.0-alpha020")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index adde8ca8cd..8aeed0bc46 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "alpha019"; } } + public static string CurrentComment { get { return "alpha020"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx From 81f44024f7c6f249749f44f19e24c36a9c4df5f0 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 29 Sep 2016 09:06:47 +0200 Subject: [PATCH 076/841] Publicize ImageHelper --- src/Umbraco.Core/Media/ImageHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Media/ImageHelper.cs b/src/Umbraco.Core/Media/ImageHelper.cs index 61d786a1fa..f3cab2d3b0 100644 --- a/src/Umbraco.Core/Media/ImageHelper.cs +++ b/src/Umbraco.Core/Media/ImageHelper.cs @@ -15,7 +15,7 @@ namespace Umbraco.Core.Media /// /// Provides helper methods for managing images. /// - internal static class ImageHelper + public static class ImageHelper { private static readonly Dictionary DefaultSizes = new Dictionary { From 37d8b71d5d6280b6e3f6fb7934b58723d501de69 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 29 Sep 2016 11:13:42 +0200 Subject: [PATCH 077/841] Version 7.6.0-alpha021 --- src/SolutionInfo.cs | 2 +- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index fbf3d6a3a4..2419804768 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -12,4 +12,4 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("7.6.0")] -[assembly: AssemblyInformationalVersion("7.6.0-alpha020")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("7.6.0-alpha021")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index 8aeed0bc46..9b1b341b68 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "alpha020"; } } + public static string CurrentComment { get { return "alpha021"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx From d34dcb0b271dde92802c7b19e92718d72c773e04 Mon Sep 17 00:00:00 2001 From: Per Ploug Date: Thu, 29 Sep 2016 13:26:25 +0200 Subject: [PATCH 078/841] Load template editor correct without massive ace deps --- .../directives/components/umbaceeditor.directive.js | 9 ++++++++- .../src/views/templates/edit.controller.js | 5 +++++ src/Umbraco.Web/Editors/TemplateQueryController.cs | 4 ++-- src/Umbraco.Web/UI/JavaScript/JsInitialize.js | 1 - 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js index 331354491a..6e66e75dd6 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js @@ -1,7 +1,7 @@ (function() { 'use strict'; - function AceEditorDirective(umbAceEditorConfig) { + function AceEditorDirective(umbAceEditorConfig, assetsService) { if (angular.isUndefined(window.ace)) { throw new Error('ui-ace need ace to work... (o rly?)'); @@ -32,12 +32,14 @@ var config = window.ace.require('ace/config'); config.set('workerPath', opts.workerPath); } + // ace requires loading if (angular.isDefined(opts.require)) { opts.require.forEach(function(n) { window.ace.require(n); }); } + // Boolean options if (angular.isDefined(opts.showGutter)) { acee.renderer.setShowGutter(opts.showGutter); @@ -126,6 +128,7 @@ function link(scope, el, attr, ngModel) { + /** * Corresponds the umbAceEditorConfig ACE configuration. * @type object @@ -138,11 +141,15 @@ */ var opts = angular.extend({}, options, scope.$eval(attr.umbAceEditor)); + + //load ace libraries here... + /** * ACE editor * @type object */ var acee = window.ace.edit(el[0]); + acee.$blockScrolling = Infinity; /** * ACE editor session. diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index c60b456a4e..195fc87b91 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -81,6 +81,11 @@ vm.aceOption = { mode: "razor", theme: "chrome", + showPrintMargin: false, + + advanced: { + fontSize: '16px' + }, onLoad: function(_editor) { vm.editor = _editor; diff --git a/src/Umbraco.Web/Editors/TemplateQueryController.cs b/src/Umbraco.Web/Editors/TemplateQueryController.cs index 2eaf63f159..a68c3bb9e0 100644 --- a/src/Umbraco.Web/Editors/TemplateQueryController.cs +++ b/src/Umbraco.Web/Editors/TemplateQueryController.cs @@ -65,7 +65,7 @@ namespace Umbraco.Web.Editors var sb = new StringBuilder(); - sb.Append("CurrentPage.Site()"); + sb.Append("Model.Content.Site()"); var timer = new Stopwatch(); @@ -217,7 +217,7 @@ namespace Umbraco.Web.Editors }); - return queryResult; + return queryResult; } private object GetConstraintValue(QueryCondition condition) diff --git a/src/Umbraco.Web/UI/JavaScript/JsInitialize.js b/src/Umbraco.Web/UI/JavaScript/JsInitialize.js index 899c313a7d..44a1ae75c7 100644 --- a/src/Umbraco.Web/UI/JavaScript/JsInitialize.js +++ b/src/Umbraco.Web/UI/JavaScript/JsInitialize.js @@ -17,7 +17,6 @@ 'lib/angular-local-storage/angular-local-storage.min.js', "lib/ace-builds/src-min-noconflict/ace.js", - "lib/ace-builds/src-min-noconflict/mode-razor.js", 'lib/bootstrap/js/bootstrap.2.3.2.min.js', 'lib/bootstrap-tabdrop/bootstrap-tabdrop.js', From 79623a8a6754c62107989b6d0db71cc2f3e651f4 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 29 Sep 2016 13:53:35 +0200 Subject: [PATCH 079/841] Fix BackgroundTaskRunner for tests without an app context --- src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs index b67c2c08ac..81487034e1 100644 --- a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs +++ b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs @@ -112,12 +112,15 @@ namespace Umbraco.Web.Scheduling if (options.Hosted) HostingEnvironment.RegisterObject(this); - if (mainDomRelease != null) + if (mainDomInstall != null || mainDomRelease != null) { - var mainDom = ApplicationContext.Current.MainDom; + var appContext = ApplicationContext.Current; + var mainDom = appContext == null ? null : appContext.MainDom; var reg = mainDom == null || ApplicationContext.Current.MainDom.Register(mainDomInstall, mainDomRelease); if (reg == false) - _isCompleted = _terminated = true; + _isCompleted = _terminated = true; + if (reg && mainDom == null && mainDomInstall != null) + mainDomInstall(); } if (options.AutoStart && _terminated == false) From 35c7fb60fd2b3ee4b0435775ff809b08b8fd6e34 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 3 Oct 2016 15:08:14 +0200 Subject: [PATCH 080/841] Refactor BackgroundTaskRunner, support cancellation of current task --- .../Scheduling/BackgroundTaskRunnerTests.cs | 100 ++++- .../Scheduling/BackgroundTaskRunner.cs | 352 +++++++++--------- 2 files changed, 256 insertions(+), 196 deletions(-) diff --git a/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs b/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs index be681c9e72..db060ddc79 100644 --- a/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs +++ b/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs @@ -7,7 +7,6 @@ using System.Threading.Tasks; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Logging; -using Umbraco.Tests.TestHelpers; using Umbraco.Web.Scheduling; namespace Umbraco.Tests.Scheduling @@ -16,7 +15,7 @@ namespace Umbraco.Tests.Scheduling [Timeout(30000)] public class BackgroundTaskRunnerTests { - ILogger _logger; + private ILogger _logger; [TestFixtureSetUp] public void InitializeFixture() @@ -552,29 +551,29 @@ namespace Umbraco.Tests.Scheduling } [Test] - public async void DelayedTaskRuns() + public async void LatchedTaskRuns() { using (var runner = new BackgroundTaskRunner(new BackgroundTaskRunnerOptions(), _logger)) { - var task = new MyDelayedTask(200, false); + var task = new MyLatchedTask(200, false); runner.Add(task); Assert.IsTrue(runner.IsRunning); - Thread.Sleep(5000); + Thread.Sleep(1000); Assert.IsTrue(runner.IsRunning); // still waiting for the task to release Assert.IsFalse(task.HasRun); task.Release(); - await runner.CurrentThreadingTask; //wait for current task to complete + await runner.CurrentThreadingTask; // wait for current task to complete Assert.IsTrue(task.HasRun); await runner.StoppedAwaitable; // wait for the entire runner operation to complete } } [Test] - public async void DelayedTaskStops() + public async void LatchedTaskStops() { using (var runner = new BackgroundTaskRunner(new BackgroundTaskRunnerOptions(), _logger)) { - var task = new MyDelayedTask(200, true); + var task = new MyLatchedTask(200, true); runner.Add(task); Assert.IsTrue(runner.IsRunning); Thread.Sleep(5000); @@ -588,7 +587,7 @@ namespace Umbraco.Tests.Scheduling [Test] - public void DelayedRecurring() + public void LatchedRecurring() { var runCount = 0; var waitHandle = new ManualResetEvent(false); @@ -662,7 +661,6 @@ namespace Umbraco.Tests.Scheduling runner.Add(task); Assert.IsTrue(runner.IsRunning); await runner.StoppedAwaitable; // wait for the entire runner operation to complete - Assert.AreEqual(1, exceptions.Count); // traced and reported } } @@ -684,6 +682,38 @@ namespace Umbraco.Tests.Scheduling } } + [Test] + public async void CancelAsyncTask() + { + using (var runner = new BackgroundTaskRunner(new BackgroundTaskRunnerOptions(), _logger)) + { + var task = new MyAsyncTask(4000); + runner.Add(task); + Assert.IsTrue(runner.IsRunning); + await Task.Delay(1000); // ensure the task *has* started else cannot cancel + runner.CancelCurrentBackgroundTask(); + + await runner.StoppedAwaitable; // wait for the entire runner operation to complete + Assert.AreEqual(default(DateTime), task.Ended); + } + } + + [Test] + public async void CancelLatchedTask() + { + using (var runner = new BackgroundTaskRunner(new BackgroundTaskRunnerOptions(), _logger)) + { + var task = new MyLatchedTask(4000, false); + runner.Add(task); + Assert.IsTrue(runner.IsRunning); + await Task.Delay(1000); // ensure the task *has* started else cannot cancel + runner.CancelCurrentBackgroundTask(); + + await runner.StoppedAwaitable; // wait for the entire runner operation to complete + Assert.IsFalse(task.HasRun); + } + } + private class MyFailingTask : IBackgroundTask { private readonly bool _isAsync; @@ -706,7 +736,7 @@ namespace Umbraco.Tests.Scheduling public async Task RunAsync(CancellationToken token) { - await Task.Delay(1000); + await Task.Delay(1000, token); if (_running) throw new Exception("Task has thrown."); } @@ -750,28 +780,28 @@ namespace Umbraco.Tests.Scheduling public override bool RunsOnShutdown { get { return true; } } } - private class MyDelayedTask : ILatchedBackgroundTask + private class MyLatchedTask : ILatchedBackgroundTask { private readonly int _runMilliseconds; - private readonly ManualResetEventSlim _gate; + private readonly ManualResetEventSlim _latch; public bool HasRun { get; private set; } - public MyDelayedTask(int runMilliseconds, bool runsOnShutdown) + public MyLatchedTask(int runMilliseconds, bool runsOnShutdown) { _runMilliseconds = runMilliseconds; - _gate = new ManualResetEventSlim(false); + _latch = new ManualResetEventSlim(false); RunsOnShutdown = runsOnShutdown; } public WaitHandle Latch { - get { return _gate.WaitHandle; } + get { return _latch.WaitHandle; } } public bool IsLatched { - get { return _gate.IsSet == false; } + get { return _latch.IsSet == false; } } public bool RunsOnShutdown { get; private set; } @@ -784,7 +814,7 @@ namespace Umbraco.Tests.Scheduling public void Release() { - _gate.Set(); + _latch.Set(); } public Task RunAsync(CancellationToken token) @@ -849,6 +879,36 @@ namespace Umbraco.Tests.Scheduling } } + private class MyAsyncTask : BaseTask + { + private readonly int _milliseconds; + + public MyAsyncTask() + : this(500) + { } + + public MyAsyncTask(int milliseconds) + { + _milliseconds = milliseconds; + } + + public override void PerformRun() + { + throw new NotImplementedException(); + } + + public override async Task RunAsync(CancellationToken token) + { + await Task.Delay(_milliseconds, token); + Ended = DateTime.Now; + } + + public override bool IsAsync + { + get { return true; } + } + } + public abstract class BaseTask : IBackgroundTask { public bool WasCancelled { get; set; } @@ -863,13 +923,13 @@ namespace Umbraco.Tests.Scheduling Ended = DateTime.Now; } - public Task RunAsync(CancellationToken token) + public virtual Task RunAsync(CancellationToken token) { throw new NotImplementedException(); //return Task.Delay(500); } - public bool IsAsync + public virtual bool IsAsync { get { return false; } } diff --git a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs index 81487034e1..fa878c3f79 100644 --- a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs +++ b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using System.Web.Hosting; @@ -28,9 +30,11 @@ namespace Umbraco.Web.Scheduling private readonly string _logPrefix; private readonly BackgroundTaskRunnerOptions _options; private readonly ILogger _logger; - private readonly BlockingCollection _tasks = new BlockingCollection(); private readonly object _locker = new object(); + private readonly BlockingCollection _tasks = new BlockingCollection(); + private IEnumerator _enumerator; + // that event is used to stop the pump when it is alive and waiting // on a latched task - so it waits on the latch, the cancellation token, // and the completed event @@ -38,28 +42,16 @@ namespace Umbraco.Web.Scheduling // in various places we are testing these vars outside a lock, so make them volatile private volatile bool _isRunning; // is running - private volatile bool _isCompleted; // does not accept tasks anymore, may still be running + private volatile bool _completed; // does not accept tasks anymore, may still be running - private Task _runningTask; - private CancellationTokenSource _tokenSource; + private Task _runningTask; // the threading task that is currently executing background tasks + private CancellationTokenSource _shutdownTokenSource; // used to cancel everything and shutdown + private CancellationTokenSource _cancelTokenSource; // used to cancel the current task + private CancellationToken _shutdownToken; private bool _terminating; // ensures we raise that event only once private bool _terminated; // remember we've terminated - private TaskCompletionSource _terminatedSource; // awaitable source - - public event TypedEventHandler, TaskEventArgs> TaskError; - public event TypedEventHandler, TaskEventArgs> TaskStarting; - public event TypedEventHandler, TaskEventArgs> TaskCompleted; - public event TypedEventHandler, TaskEventArgs> TaskCancelled; - - // triggers when the runner stops (but could start again if a task is added to it) - internal event TypedEventHandler, EventArgs> Stopped; - - // triggers when the hosting environment requests that the runner terminates - internal event TypedEventHandler, EventArgs> Terminating; - - // triggers when the runner terminates (no task can be added, no task is running) - internal event TypedEventHandler, EventArgs> Terminated; + private TaskCompletionSource _terminatedSource; // enable awaiting termination /// /// Initializes a new instance of the class. @@ -118,7 +110,7 @@ namespace Umbraco.Web.Scheduling var mainDom = appContext == null ? null : appContext.MainDom; var reg = mainDom == null || ApplicationContext.Current.MainDom.Register(mainDomInstall, mainDomRelease); if (reg == false) - _isCompleted = _terminated = true; + _completed = _terminated = true; if (reg && mainDom == null && mainDomInstall != null) mainDomInstall(); } @@ -136,7 +128,7 @@ namespace Umbraco.Web.Scheduling } /// - /// Gets a value indicating whether a task is currently running. + /// Gets a value indicating whether a threading task is currently running. /// public bool IsRunning { @@ -148,38 +140,40 @@ namespace Umbraco.Web.Scheduling /// public bool IsCompleted { - get { return _isCompleted; } + get { return _completed; } } /// - /// Gets the running task as an immutable object. + /// Gets the running threading task as an immutable awaitable. /// /// There is no running task. /// - /// Unless the AutoStart option is true, there will be no running task until - /// a background task is added to the queue. Unless the KeepAlive option is true, there - /// will be no running task when the queue is empty. + /// Unless the AutoStart option is true, there will be no current threading task until + /// a background task is added to the queue, and there will be no current threading task + /// when the queue is empty. In which case this method returns null. + /// The returned value can be awaited and that is all (eg no continuation). /// - public ThreadingTaskImmutable CurrentThreadingTask + internal ThreadingTaskImmutable CurrentThreadingTask { get { lock (_locker) { - if (_runningTask == null) - throw new InvalidOperationException("There is no current Threading.Task."); - return new ThreadingTaskImmutable(_runningTask); + return _runningTask == null ? null : new ThreadingTaskImmutable(_runningTask); } } } + // fixme should the above throw, return null, a completed task? + + // fixme what's the diff?! /// /// Gets an awaitable used to await the runner running operation. /// /// An awaitable instance. /// Used to wait until the runner is no longer running (IsRunning == false), /// though the runner could be started again afterwards by adding tasks to it. - public ThreadingTaskImmutable StoppedAwaitable + internal ThreadingTaskImmutable StoppedAwaitable { get { @@ -192,20 +186,25 @@ namespace Umbraco.Web.Scheduling } /// - /// Gets an awaitable used to await the runner. + /// Gets an awaitable object that can be used to await for the runner to terminate. /// - /// An awaitable instance. - /// Used to wait until the runner is terminated. - public ThreadingTaskImmutable TerminatedAwaitable + /// An awaitable object. + /// + /// Used to wait until the runner has terminated. + /// This is for unit tests and should not be used otherwise. In most cases when the runner + /// has terminated, the application domain is going down and it is not the right time to do things. + /// + internal ThreadingTaskImmutable TerminatedAwaitable { get { lock (_locker) { - if (_terminatedSource == null && _terminated == false) + if (_terminatedSource == null) _terminatedSource = new TaskCompletionSource(); - var task = _terminatedSource == null ? Task.FromResult(0) : _terminatedSource.Task; - return new ThreadingTaskImmutable(task); + if (_terminated) + _terminatedSource.SetResult(0); + return new ThreadingTaskImmutable(_terminatedSource.Task); } } } @@ -219,7 +218,7 @@ namespace Umbraco.Web.Scheduling { lock (_locker) { - if (_isCompleted) + if (_completed) throw new InvalidOperationException("The task runner has completed."); // add task @@ -241,9 +240,9 @@ namespace Umbraco.Web.Scheduling { lock (_locker) { - if (_isCompleted) + if (_completed) { - _logger.Debug(_logPrefix + "Task cannot be added {0}, the task runner is already shutdown", task.GetType); + _logger.Debug(_logPrefix + "Task cannot be added {0}, the task runner has already shutdown", task.GetType); return false; } @@ -258,18 +257,33 @@ namespace Umbraco.Web.Scheduling } } + /// + /// Cancels to current task, if any. + /// + /// Has no effect if the task runs synchronously, or does not want to cancel. + public void CancelCurrentBackgroundTask() + { + lock (_locker) + { + if (_completed) + throw new InvalidOperationException("The task runner has completed."); + if (_cancelTokenSource != null) + _cancelTokenSource.Cancel(); + } + } + /// /// Starts the tasks runner, if not already running. /// /// Is invoked each time a task is added, to ensure it is going to be processed. /// The task runner has completed. - public void StartUp() + internal void StartUp() { if (_isRunning) return; lock (_locker) { - if (_isCompleted) + if (_completed) throw new InvalidOperationException("The task runner has completed."); StartUpLocked(); @@ -287,8 +301,12 @@ namespace Umbraco.Web.Scheduling _isRunning = true; // create a new token source since this is a new process - _tokenSource = new CancellationTokenSource(); - _runningTask = PumpIBackgroundTasks(Task.Factory, _tokenSource.Token); + _shutdownTokenSource = new CancellationTokenSource(); + _shutdownToken = _shutdownTokenSource.Token; + + _enumerator = _options.KeepAlive ? _tasks.GetConsumingEnumerable(_shutdownToken).GetEnumerator() : null; + _runningTask = Task.Run(async () => await Pump(), _shutdownToken); + _logger.Debug(_logPrefix + "Starting"); } @@ -303,7 +321,7 @@ namespace Umbraco.Web.Scheduling { lock (_locker) { - _isCompleted = true; // do not accept new tasks + _completed = true; // do not accept new tasks if (_isRunning == false) return; // done already } @@ -324,7 +342,7 @@ namespace Umbraco.Web.Scheduling // try to cancel running async tasks (cannot do much about sync tasks) // break delayed tasks delay // truncate running queues - _tokenSource.Cancel(false); // false is the default + _shutdownTokenSource.Cancel(false); // false is the default } // tasks in the queue will be executed... @@ -334,145 +352,104 @@ namespace Umbraco.Web.Scheduling _runningTask.Wait(); // wait for whatever is running to end... } - /// - /// Runs background tasks for as long as there are background tasks in the queue, with an asynchronous operation. - /// - /// The supporting . - /// A cancellation token. - /// The asynchronous operation. - private Task PumpIBackgroundTasks(TaskFactory factory, CancellationToken token) + private async Task Pump() { - var taskSource = new TaskCompletionSource(factory.CreationOptions); - var enumerator = _options.KeepAlive ? _tasks.GetConsumingEnumerable(token).GetEnumerator() : null; - - // ReSharper disable once MethodSupportsCancellation // always run - var taskSourceContinuing = taskSource.Task.ContinueWith(t => + while (true) { - // because the pump does not lock, there's a race condition, - // the pump may stop and then we still have tasks to process, - // and then we must restart the pump - lock to avoid race cond - var onStopped = false; + var bgTask = GetNextBackgroundTask(); + if (bgTask == null) + return; + lock (_locker) { - if (token.IsCancellationRequested || _tasks.Count == 0) - { - _logger.Debug(_logPrefix + "Stopping"); - - if (_options.PreserveRunningTask == false) - _runningTask = null; - - // stopped - _isRunning = false; - onStopped = true; - } + // set another one - for the next task + _cancelTokenSource = CancellationTokenSource.CreateLinkedTokenSource(_shutdownToken); } - if (onStopped) + bgTask = WaitForLatch(bgTask, _cancelTokenSource.Token); + if (bgTask == null) return; + + try { - OnEvent(Stopped, "Stopped"); - return; + await RunAsync(bgTask, _cancelTokenSource.Token).ConfigureAwait(false); } - - // if _runningTask is taskSource.Task then we must keep continuing it, - // not starting a new taskSource, else _runningTask would complete and - // something may be waiting on it - //PumpIBackgroundTasks(factory, token); // restart - // ReSharper disable MethodSupportsCancellation // always run - t.ContinueWithTask(_ => PumpIBackgroundTasks(factory, token)); // restart - // ReSharper restore MethodSupportsCancellation - }); - - Action pump = null; - pump = task => - { - // RunIBackgroundTaskAsync does NOT throw exceptions, just raises event - // so if we have an exception here, really, wtf? - must read the exception - // anyways so it does not bubble up and kill everything - if (task != null && task.IsFaulted) + catch (Exception e) { - var exception = task.Exception; - _logger.Error(_logPrefix + "Task runner exception.", exception); + // RunAsync should NOT throw exception - just raise an event + // this is here for safety and to ensure we don't kill everything, ever + _logger.Error(_logPrefix + "Task runner exception.", e); } - // is it ok to run? - if (TaskSourceCanceled(taskSource, token)) return; - - // try to get a task - // the blocking MoveNext will end if token is cancelled or collection is completed - T bgTask; - var hasBgTask = _options.KeepAlive - // ReSharper disable once PossibleNullReferenceException - ? (bgTask = enumerator.MoveNext() ? enumerator.Current : null) != null // blocking - : _tasks.TryTake(out bgTask); // non-blocking - - // no task, signal the runner we're done - if (hasBgTask == false) - { - TaskSourceCompleted(taskSource, token); - return; - } - - // wait for latched task, supporting cancellation - var dbgTask = bgTask as ILatchedBackgroundTask; - if (dbgTask != null && dbgTask.IsLatched) - { - WaitHandle.WaitAny(new[] { dbgTask.Latch, token.WaitHandle, _completedEvent.WaitHandle }); - if (TaskSourceCanceled(taskSource, token)) return; - // else run now, either because latch ok or runner is completed - // still latched & not running on shutdown = stop here - if (dbgTask.IsLatched && dbgTask.RunsOnShutdown == false) - { - dbgTask.Dispose(); // will not run - TaskSourceCompleted(taskSource, token); - return; - } - } - - // run the task as first task, or a continuation - task = task == null - ? RunIBackgroundTaskAsync(bgTask, token) - // ReSharper disable once MethodSupportsCancellation // always run - : task.ContinueWithTask(_ => RunIBackgroundTaskAsync(bgTask, token)); - - // and pump - // ReSharper disable once MethodSupportsCancellation // always run - task.ContinueWith(t => pump(t)); - }; - - // start it all - factory.StartNew(() => pump(null), - token, - _options.LongRunning ? TaskCreationOptions.LongRunning : TaskCreationOptions.None, - TaskScheduler.Default); - - return taskSourceContinuing; - } - - private static bool TaskSourceCanceled(TaskCompletionSource taskSource, CancellationToken token) - { - if (token.IsCancellationRequested) - { - taskSource.SetCanceled(); - return true; + _cancelTokenSource = null; } - return false; } - private static void TaskSourceCompleted(TaskCompletionSource taskSource, CancellationToken token) + private T GetNextBackgroundTask() { - if (token.IsCancellationRequested) - taskSource.SetCanceled(); - else - taskSource.SetResult(null); + while (true) + { + // exit if cancelling + if (_shutdownToken.IsCancellationRequested == false) + { + // try to get a task + // the blocking MoveNext will end if token is cancelled or collection is completed + T bgTask; + var hasBgTask = _options.KeepAlive + ? (bgTask = _enumerator.MoveNext() ? _enumerator.Current : null) != null // blocking + : _tasks.TryTake(out bgTask); // non-blocking + + // exit if cancelling + if (_shutdownToken.IsCancellationRequested == false && hasBgTask) + return bgTask; + } + + lock (_locker) + { + if (_shutdownToken.IsCancellationRequested == false && _tasks.Count > 0) continue; + + _logger.Debug(_logPrefix + "Stopping"); + + if (_options.PreserveRunningTask == false) + _runningTask = null; + + _isRunning = false; + + _shutdownToken = CancellationToken.None; + _enumerator = null; + } + + OnEvent(Stopped, "Stopped"); + return null; + } } - /// - /// Runs a background task asynchronously. - /// - /// The background task. - /// A cancellation token. - /// The asynchronous operation. - internal async Task RunIBackgroundTaskAsync(T bgTask, CancellationToken token) + private T WaitForLatch(T bgTask, CancellationToken token) + { + var latched = bgTask as ILatchedBackgroundTask; + if (latched == null || latched.IsLatched == false) return bgTask; + + // returns the array index of the object that satisfied the wait + var i = WaitHandle.WaitAny(new[] { latched.Latch, token.WaitHandle, _completedEvent.WaitHandle }); + + switch (i) + { + case 0: + // ok to run now + return bgTask; + case 1: + // cancellation + return null; + case 2: + // termination + if (latched.RunsOnShutdown) return bgTask; + latched.Dispose(); + return null; + default: + throw new Exception("panic."); + } + } + + private async Task RunAsync(T bgTask, CancellationToken token) { try { @@ -488,7 +465,7 @@ namespace Umbraco.Web.Scheduling else bgTask.Run(); } - finally // ensure we disposed - unless latched (again) + finally // ensure we disposed - unless latched again ie wants to re-run { var lbgTask = bgTask as ILatchedBackgroundTask; if (lbgTask == null || lbgTask.IsLatched == false) @@ -506,11 +483,32 @@ namespace Umbraco.Web.Scheduling catch (Exception ex) { _logger.Error(_logPrefix + "Task has failed", ex); - } + } } #region Events + // triggers when a background task starts + public event TypedEventHandler, TaskEventArgs> TaskStarting; + + // triggers when a background task has completed + public event TypedEventHandler, TaskEventArgs> TaskCompleted; + + // triggers when a background task throws + public event TypedEventHandler, TaskEventArgs> TaskError; + + // triggers when a background task is cancelled + public event TypedEventHandler, TaskEventArgs> TaskCancelled; + + // triggers when the runner stops (but could start again if a task is added to it) + internal event TypedEventHandler, EventArgs> Stopped; + + // triggers when the hosting environment requests that the runner terminates + internal event TypedEventHandler, EventArgs> Terminating; + + // triggers when the runner has terminated (no task can be added, no task is running) + internal event TypedEventHandler, EventArgs> Terminated; + private void OnEvent(TypedEventHandler, EventArgs> handler, string name) { if (handler == null) return; @@ -632,9 +630,7 @@ namespace Umbraco.Web.Scheduling _logger.Info(_logPrefix + "Waiting for tasks to complete"); Shutdown(false, false); // do not accept any more tasks, flush the queue, do not wait - // raise the completed event only after the running task has completed - // and there's no more task running - + // raise the completed event only after the running threading task has completed lock (_locker) { if (_runningTask != null) @@ -656,6 +652,7 @@ namespace Umbraco.Web.Scheduling } } + // called by Stop either immediately or eventually private void Terminate(bool immediate) { // signal the environment we have terminated @@ -664,8 +661,6 @@ namespace Umbraco.Web.Scheduling // complete the awaitable completion source, if any HostingEnvironment.UnregisterObject(this); - _logger.Info(_logPrefix + "Tasks " + (immediate ? "cancelled" : "completed") + ", terminated"); - OnEvent(Terminated, "Terminated"); TaskCompletionSource terminatedSource; lock (_locker) @@ -673,6 +668,11 @@ namespace Umbraco.Web.Scheduling _terminated = true; terminatedSource = _terminatedSource; } + + _logger.Info(_logPrefix + "Tasks " + (immediate ? "cancelled" : "completed") + ", terminated"); + + OnEvent(Terminated, "Terminated"); + if (terminatedSource != null) terminatedSource.SetResult(0); } From 3fd918d3813dff9909078f1480e941a878ee100e Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 4 Oct 2016 14:10:20 +0200 Subject: [PATCH 081/841] Refacetor BackgroundTaskRunner, fix async issues --- build/NuSpecs/UmbracoCms.Core.nuspec | 3 +- src/Umbraco.Tests/Logging/ConsoleLogger.cs | 48 +++++ .../Scheduling/BackgroundTaskRunnerTests.cs | 62 +++++- src/Umbraco.Tests/Scheduling/DeployTest.cs | 73 +++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 3 + .../Scheduling/BackgroundTaskRunner.cs | 200 +++++++++++------- .../Scheduling/ILatchedBackgroundTask.cs | 5 +- .../Scheduling/LatchedBackgroundTaskBase.cs | 18 +- src/Umbraco.Web/Umbraco.Web.csproj | 4 + src/Umbraco.Web/packages.config | 1 + src/umbraco.sln.DotSettings | 15 +- 11 files changed, 324 insertions(+), 108 deletions(-) create mode 100644 src/Umbraco.Tests/Logging/ConsoleLogger.cs create mode 100644 src/Umbraco.Tests/Scheduling/DeployTest.cs diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec index 450aec09b6..cb7092fe80 100644 --- a/build/NuSpecs/UmbracoCms.Core.nuspec +++ b/build/NuSpecs/UmbracoCms.Core.nuspec @@ -38,7 +38,8 @@ - + + diff --git a/src/Umbraco.Tests/Logging/ConsoleLogger.cs b/src/Umbraco.Tests/Logging/ConsoleLogger.cs new file mode 100644 index 0000000000..ba3981841d --- /dev/null +++ b/src/Umbraco.Tests/Logging/ConsoleLogger.cs @@ -0,0 +1,48 @@ +using System; +using System.Linq; +using Umbraco.Core.Logging; + +namespace Umbraco.Tests.Logging +{ + // FIXME how come some C# 6 features are working here ?! + + public class ConsoleLogger : ILogger + { + public void Error(Type callingType, string message, Exception exception) + { + Console.WriteLine("INFO {0} - {1}", callingType.Name, message); + Console.WriteLine(exception); + } + + public void Warn(Type callingType, string message, params Func[] formatItems) + { + Console.WriteLine("WARN {0} - {1}", callingType.Name, string.Format(message, formatItems.Select(x => x()).ToArray())); + } + + public void WarnWithException(Type callingType, string message, Exception e, params Func[] formatItems) + { + Console.WriteLine("WARN {0} - {1}", callingType.Name, string.Format(message, formatItems.Select(x => x()).ToArray())); + Console.WriteLine(e); + } + + public void Info(Type callingType, Func generateMessage) + { + Console.WriteLine("INFO {0} - {1}", callingType.Name, generateMessage()); + } + + public void Info(Type type, string generateMessageFormat, params Func[] formatItems) + { + Console.WriteLine("INFO {0} - {1}", type.Name, string.Format(generateMessageFormat, formatItems.Select(x => x()).ToArray())); + } + + public void Debug(Type callingType, Func generateMessage) + { + Console.WriteLine("DEBUG {0} - {1}", callingType.Name, generateMessage()); + } + + public void Debug(Type type, string generateMessageFormat, params Func[] formatItems) + { + Console.WriteLine("DEBUG {0} - {1}", type.Name, string.Format(generateMessageFormat, formatItems.Select(x => x()).ToArray())); + } + } +} diff --git a/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs b/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs index db060ddc79..aacb056346 100644 --- a/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs +++ b/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs @@ -783,25 +783,25 @@ namespace Umbraco.Tests.Scheduling private class MyLatchedTask : ILatchedBackgroundTask { private readonly int _runMilliseconds; - private readonly ManualResetEventSlim _latch; + private readonly TaskCompletionSource _latch; public bool HasRun { get; private set; } public MyLatchedTask(int runMilliseconds, bool runsOnShutdown) { _runMilliseconds = runMilliseconds; - _latch = new ManualResetEventSlim(false); + _latch = new TaskCompletionSource(); RunsOnShutdown = runsOnShutdown; } - public WaitHandle Latch + public Task Latch { - get { return _latch.WaitHandle; } + get { return _latch.Task; } } public bool IsLatched { - get { return _latch.IsSet == false; } + get { return _latch.Task.IsCompleted == false; } } public bool RunsOnShutdown { get; private set; } @@ -814,7 +814,7 @@ namespace Umbraco.Tests.Scheduling public void Release() { - _latch.Set(); + _latch.SetResult(true); } public Task RunAsync(CancellationToken token) @@ -909,6 +909,56 @@ namespace Umbraco.Tests.Scheduling } } + [Test] + public void SourceTaskTest() + { + var runner = new BackgroundTaskRunner(new BackgroundTaskRunnerOptions { KeepAlive = true, LongRunning = true }, _logger); + + var task = new SourceTask(); + runner.Add(task); + Assert.IsTrue(runner.IsRunning); + Console.WriteLine("completing"); + task.Complete(); // in Deploy this does not return ffs - no point until I cannot repro + Console.WriteLine("completed"); + Console.WriteLine("done"); + } + + private class SourceTask : IBackgroundTask + { + private readonly SemaphoreSlim _timeout = new SemaphoreSlim(0, 1); + private readonly TaskCompletionSource _source = new TaskCompletionSource(); + + public void Complete() + { + _source.SetResult(null); + } + + public void Dispose() + { } + + public void Run() + { + throw new NotImplementedException(); + } + + private int i; + + public async Task RunAsync(CancellationToken token) + { + Console.WriteLine("boom"); + var timeout = _timeout.WaitAsync(token); + var task = WorkItemRunAsync(); + var anyTask = await Task.WhenAny(task, timeout).ConfigureAwait(false); + } + + private async Task WorkItemRunAsync() + { + await _source.Task.ConfigureAwait(false); + } + + public bool IsAsync { get { return true; } } + } + public abstract class BaseTask : IBackgroundTask { public bool WasCancelled { get; set; } diff --git a/src/Umbraco.Tests/Scheduling/DeployTest.cs b/src/Umbraco.Tests/Scheduling/DeployTest.cs new file mode 100644 index 0000000000..60322ce7b7 --- /dev/null +++ b/src/Umbraco.Tests/Scheduling/DeployTest.cs @@ -0,0 +1,73 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Umbraco.Tests.Logging; +using Umbraco.Web.Scheduling; + +namespace Umbraco.Tests.Scheduling +{ + // THIS REPRODUCES THE DEPLOY ISSUE IN CORE + // + // the exact same thing also reproduces in playground + // so it's not a framework version issue - but something we're doing here + + [TestFixture] + [Timeout(4000)] + public class Repro + { + [Test] + public async Task ReproduceDeployIssue() + { + var logger = new ConsoleLogger(); + var runner = new BackgroundTaskRunner(new BackgroundTaskRunnerOptions { KeepAlive = true, LongRunning = true }, logger); + var work = new SimpleWorkItem(); + runner.Add(work); + + Console.WriteLine("running"); + await Task.Delay(1000); // don't complete too soon + + Console.WriteLine("completing"); + + // this never returns, never reached "completed" because the same thread + // resumes executing the waiting on queue operation in the runner + work.Complete(); + Console.WriteLine("completed"); + + Console.WriteLine("done"); + } + + public class SimpleWorkItem : IBackgroundTask + { + private TaskCompletionSource _completionSource; + + public async Task RunAsync(CancellationToken token) + { + _completionSource = new TaskCompletionSource(); + token.Register(() => _completionSource.TrySetCanceled()); // propagate + Console.WriteLine("item running..."); + await _completionSource.Task.ConfigureAwait(false); + Console.WriteLine("item returning"); + } + + public bool Complete(bool success = true) + { + Console.WriteLine("item completing"); + // this never returns, see test + _completionSource.SetResult(0); + Console.WriteLine("item returning from completing"); + return true; + } + + public void Run() + { + throw new NotImplementedException(); + } + + public bool IsAsync { get { return true; } } + + public void Dispose() + {} + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 041a11836c..2395a03fd0 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -40,6 +40,7 @@ prompt 4 false + 5 pdbonly @@ -177,10 +178,12 @@ + + diff --git a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs index fa878c3f79..acbbdbf710 100644 --- a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs +++ b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs @@ -1,9 +1,7 @@ using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; +using System.Threading.Tasks.Dataflow; using System.Web.Hosting; using Umbraco.Core; using Umbraco.Core.Events; @@ -27,18 +25,21 @@ namespace Umbraco.Web.Scheduling public class BackgroundTaskRunner : BackgroundTaskRunner, IBackgroundTaskRunner where T : class, IBackgroundTask { + // do not remove this comment! + // + // if you plan to do anything on this class, first go and read + // http://blog.stephencleary.com/2012/12/dont-block-in-asynchronous-code.html + // http://stackoverflow.com/questions/19481964/calling-taskcompletionsource-setresult-in-a-non-blocking-manner + // http://stackoverflow.com/questions/21225361/is-there-anything-like-asynchronous-blockingcollectiont + // and more, and more, and more + // and remember: async is hard + private readonly string _logPrefix; private readonly BackgroundTaskRunnerOptions _options; private readonly ILogger _logger; private readonly object _locker = new object(); - private readonly BlockingCollection _tasks = new BlockingCollection(); - private IEnumerator _enumerator; - - // that event is used to stop the pump when it is alive and waiting - // on a latched task - so it waits on the latch, the cancellation token, - // and the completed event - private readonly ManualResetEventSlim _completedEvent = new ManualResetEventSlim(false); + private readonly BufferBlock _tasks = new BufferBlock(new DataflowBlockOptions { }); // in various places we are testing these vars outside a lock, so make them volatile private volatile bool _isRunning; // is running @@ -60,7 +61,7 @@ namespace Umbraco.Web.Scheduling /// An optional action to execute when the main domain status is aquired. /// An optional action to execute when the main domain status is released. public BackgroundTaskRunner(ILogger logger, Action mainDomInstall = null, Action mainDomRelease = null) - : this(typeof (T).FullName, new BackgroundTaskRunnerOptions(), logger, mainDomInstall, mainDomRelease) + : this(typeof(T).FullName, new BackgroundTaskRunnerOptions(), logger, mainDomInstall, mainDomRelease) { } /// @@ -82,7 +83,7 @@ namespace Umbraco.Web.Scheduling /// An optional action to execute when the main domain status is aquired. /// An optional action to execute when the main domain status is released. public BackgroundTaskRunner(BackgroundTaskRunnerOptions options, ILogger logger, Action mainDomInstall = null, Action mainDomRelease = null) - : this(typeof (T).FullName, options, logger, mainDomInstall, mainDomRelease) + : this(typeof(T).FullName, options, logger, mainDomInstall, mainDomRelease) { } /// @@ -173,7 +174,7 @@ namespace Umbraco.Web.Scheduling /// An awaitable instance. /// Used to wait until the runner is no longer running (IsRunning == false), /// though the runner could be started again afterwards by adding tasks to it. - internal ThreadingTaskImmutable StoppedAwaitable + public ThreadingTaskImmutable StoppedAwaitable { get { @@ -222,8 +223,8 @@ namespace Umbraco.Web.Scheduling throw new InvalidOperationException("The task runner has completed."); // add task - _logger.Debug(_logPrefix + "Task added {0}", task.GetType); - _tasks.Add(task); + _logger.Debug(_logPrefix + "Task added {0}", () => task.GetType().FullName); + _tasks.Post(task); // start StartUpLocked(); @@ -242,13 +243,13 @@ namespace Umbraco.Web.Scheduling { if (_completed) { - _logger.Debug(_logPrefix + "Task cannot be added {0}, the task runner has already shutdown", task.GetType); + _logger.Debug(_logPrefix + "Task cannot be added {0}, the task runner has already shutdown", () => task.GetType().FullName); return false; } // add task - _logger.Debug(_logPrefix + "Task added {0}", task.GetType); - _tasks.Add(task); + _logger.Debug(_logPrefix + "Task added {0}", () => task.GetType().FullName); + _tasks.Post(task); // start StartUpLocked(); @@ -303,9 +304,7 @@ namespace Umbraco.Web.Scheduling // create a new token source since this is a new process _shutdownTokenSource = new CancellationTokenSource(); _shutdownToken = _shutdownTokenSource.Token; - - _enumerator = _options.KeepAlive ? _tasks.GetConsumingEnumerable(_shutdownToken).GetEnumerator() : null; - _runningTask = Task.Run(async () => await Pump(), _shutdownToken); + _runningTask = Task.Run(async () => await Pump().ConfigureAwait(false), _shutdownToken); _logger.Debug(_logPrefix + "Starting"); } @@ -325,23 +324,22 @@ namespace Umbraco.Web.Scheduling if (_isRunning == false) return; // done already } - // try to be nice - // assuming multiple threads can do these without problems - _completedEvent.Set(); - _tasks.CompleteAdding(); + // complete the queue + // will stop waiting on the queue or on a latch + _tasks.Complete(); if (force) { // we must bring everything down, now - Thread.Sleep(100); // give time to CompleteAdding() + Thread.Sleep(100); // give time to Complete() lock (_locker) { - // was CompleteAdding() enough? + // was Complete() enough? if (_isRunning == false) return; } // try to cancel running async tasks (cannot do much about sync tasks) - // break delayed tasks delay - // truncate running queues + // break latched tasks + // stop processing the queue _shutdownTokenSource.Cancel(false); // false is the default } @@ -356,66 +354,64 @@ namespace Umbraco.Web.Scheduling { while (true) { - var bgTask = GetNextBackgroundTask(); - if (bgTask == null) - return; + // get the next task + // if it returns null the runner is going down, stop + var bgTask = await GetNextBackgroundTask(_shutdownToken); + if (bgTask == null) return; + // set a cancellation source so that the current task can be cancelled + // link from _shutdownToken so that we can use _cancelTokenSource for both lock (_locker) { - // set another one - for the next task _cancelTokenSource = CancellationTokenSource.CreateLinkedTokenSource(_shutdownToken); } - bgTask = WaitForLatch(bgTask, _cancelTokenSource.Token); - if (bgTask == null) return; + // wait for latch should return the task + // if it returns null it's either that the task has been cancelled + // or the whole runner is going down - in both cases, continue, + // and GetNextBackgroundTask will take care of shutdowns + bgTask = await WaitForLatch(bgTask, _cancelTokenSource.Token); + if (bgTask == null) continue; + // executes & be safe - RunAsync should NOT throw but only raise an event, + // but... just make sure we never ever take everything down try { await RunAsync(bgTask, _cancelTokenSource.Token).ConfigureAwait(false); } catch (Exception e) { - // RunAsync should NOT throw exception - just raise an event - // this is here for safety and to ensure we don't kill everything, ever _logger.Error(_logPrefix + "Task runner exception.", e); } - _cancelTokenSource = null; + // done + lock (_locker) + { + _cancelTokenSource = null; + } } } - private T GetNextBackgroundTask() + // gets the next background task from the buffer + private async Task GetNextBackgroundTask(CancellationToken token) { while (true) { - // exit if cancelling - if (_shutdownToken.IsCancellationRequested == false) - { - // try to get a task - // the blocking MoveNext will end if token is cancelled or collection is completed - T bgTask; - var hasBgTask = _options.KeepAlive - ? (bgTask = _enumerator.MoveNext() ? _enumerator.Current : null) != null // blocking - : _tasks.TryTake(out bgTask); // non-blocking - - // exit if cancelling - if (_shutdownToken.IsCancellationRequested == false && hasBgTask) - return bgTask; - } + var task = await GetNextBackgroundTask2(token); + if (task != null) return task; lock (_locker) { + // deal with race condition if (_shutdownToken.IsCancellationRequested == false && _tasks.Count > 0) continue; + // if we really have nothing to do, stop _logger.Debug(_logPrefix + "Stopping"); if (_options.PreserveRunningTask == false) _runningTask = null; - _isRunning = false; - _shutdownToken = CancellationToken.None; - _enumerator = null; } OnEvent(Stopped, "Stopped"); @@ -423,32 +419,82 @@ namespace Umbraco.Web.Scheduling } } - private T WaitForLatch(T bgTask, CancellationToken token) + private async Task GetNextBackgroundTask2(CancellationToken shutdownToken) + { + // exit if cancelling + if (shutdownToken.IsCancellationRequested) + return null; + + // if keepalive is false then don't block, exit if there is + // no task in the buffer - yes, there is a race cond, which + // we'll take care of + if (_options.KeepAlive == false && _tasks.Count == 0) + return null; + + try + { + // A Task that informs of whether and when more output is available. If, when the + // task completes, its Result is true, more output is available in the source (though another + // consumer of the source may retrieve the data). If it returns false, more output is not + // and will never be available, due to the source completing prior to output being available. + + var output = await _tasks.OutputAvailableAsync(shutdownToken); // block until output or cancelled + if (output == false) return null; + } + catch (TaskCanceledException) + { + return null; + } + + try + { + // A task that represents the asynchronous receive operation. When an item value is successfully + // received from the source, the returned task is completed and its Result returns the received + // value. If an item value cannot be retrieved because the source is empty and completed, an + // InvalidOperationException exception is thrown in the returned task. + + // the source cannot be empty *and* completed here - we know we have output + return await _tasks.ReceiveAsync(shutdownToken); + } + catch (TaskCanceledException) + { + return null; + } + } + + // if bgTask is not a latched background task, or if it is not latched, returns immediately + // else waits for the latch, taking care of completion and shutdown and whatnot + private async Task WaitForLatch(T bgTask, CancellationToken token) { var latched = bgTask as ILatchedBackgroundTask; if (latched == null || latched.IsLatched == false) return bgTask; - // returns the array index of the object that satisfied the wait - var i = WaitHandle.WaitAny(new[] { latched.Latch, token.WaitHandle, _completedEvent.WaitHandle }); + // support cancelling awaiting + // read https://github.com/dotnet/corefx/issues/2704 + // read http://stackoverflow.com/questions/27238232/how-can-i-cancel-task-whenall + var tokenTaskSource = new TaskCompletionSource(); + token.Register(s => ((TaskCompletionSource)s).SetResult(true), tokenTaskSource); - switch (i) - { - case 0: - // ok to run now - return bgTask; - case 1: - // cancellation - return null; - case 2: - // termination - if (latched.RunsOnShutdown) return bgTask; - latched.Dispose(); - return null; - default: - throw new Exception("panic."); - } + // returns the task that completed + // - latched.Latch completes when the latch releases + // - _tasks.Completion completes when the runner completes + // - tokenTaskSource.Task completes when this task, or the whole runner, is cancelled + var task = await Task.WhenAny(latched.Latch, _tasks.Completion, tokenTaskSource.Task); + + // ok to run now + if (task == latched.Latch) + return bgTask; + + // if shutting down, return the task only if it runs on shutdown + if (_shutdownToken.IsCancellationRequested == false && latched.RunsOnShutdown) return bgTask; + + // else, either it does not run on shutdown or it's been cancelled, dispose + latched.Dispose(); + return null; } + // runs the background task, taking care of shutdown (as far as possible - cannot abort + // a non-async Run for example, so we'll do our best) private async Task RunAsync(T bgTask, CancellationToken token) { try @@ -483,7 +529,7 @@ namespace Umbraco.Web.Scheduling catch (Exception ex) { _logger.Error(_logPrefix + "Task has failed", ex); - } + } } #region Events @@ -548,7 +594,7 @@ namespace Umbraco.Web.Scheduling { OnEvent(TaskCancelled, "TaskCancelled", e); - //dispose it + // dispose it e.Task.Dispose(); } diff --git a/src/Umbraco.Web/Scheduling/ILatchedBackgroundTask.cs b/src/Umbraco.Web/Scheduling/ILatchedBackgroundTask.cs index 79379cb966..c761e5f4de 100644 --- a/src/Umbraco.Web/Scheduling/ILatchedBackgroundTask.cs +++ b/src/Umbraco.Web/Scheduling/ILatchedBackgroundTask.cs @@ -1,5 +1,6 @@ using System; using System.Threading; +using System.Threading.Tasks; namespace Umbraco.Web.Scheduling { @@ -13,10 +14,10 @@ namespace Umbraco.Web.Scheduling internal interface ILatchedBackgroundTask : IBackgroundTask { /// - /// Gets a wait handle on the task condition. + /// Gets a task on latch. /// /// The task is not latched. - WaitHandle Latch { get; } + Task Latch { get; } /// /// Gets a value indicating whether the task is latched. diff --git a/src/Umbraco.Web/Scheduling/LatchedBackgroundTaskBase.cs b/src/Umbraco.Web/Scheduling/LatchedBackgroundTaskBase.cs index 3315fa7c34..cde9986483 100644 --- a/src/Umbraco.Web/Scheduling/LatchedBackgroundTaskBase.cs +++ b/src/Umbraco.Web/Scheduling/LatchedBackgroundTaskBase.cs @@ -7,11 +7,11 @@ namespace Umbraco.Web.Scheduling { internal abstract class LatchedBackgroundTaskBase : DisposableObject, ILatchedBackgroundTask { - private readonly ManualResetEventSlim _latch; + private TaskCompletionSource _latch; protected LatchedBackgroundTaskBase() { - _latch = new ManualResetEventSlim(false); + _latch = new TaskCompletionSource(); } /// @@ -29,24 +29,24 @@ namespace Umbraco.Web.Scheduling /// public abstract bool IsAsync { get; } - public WaitHandle Latch + public Task Latch { - get { return _latch.WaitHandle; } + get { return _latch.Task; } } public bool IsLatched { - get { return _latch.IsSet == false; } + get { return _latch.Task.IsCompleted == false; } } protected void Release() { - _latch.Set(); + _latch.SetResult(true); } protected void Reset() { - _latch.Reset(); + _latch = new TaskCompletionSource(); } public abstract bool RunsOnShutdown { get; } @@ -56,8 +56,6 @@ namespace Umbraco.Web.Scheduling // remain active protected override void DisposeResources() - { - _latch.Dispose(); - } + { } } } diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index c89e60a399..9eb0b0ef4f 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -213,6 +213,10 @@ + + ..\packages\System.Threading.Tasks.Dataflow.4.6.0\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + True + 3.5 diff --git a/src/Umbraco.Web/packages.config b/src/Umbraco.Web/packages.config index 9106e59fe0..8c743ba07c 100644 --- a/src/Umbraco.Web/packages.config +++ b/src/Umbraco.Web/packages.config @@ -28,6 +28,7 @@ + \ No newline at end of file diff --git a/src/umbraco.sln.DotSettings b/src/umbraco.sln.DotSettings index 19aedb76e3..dd168f105b 100644 --- a/src/umbraco.sln.DotSettings +++ b/src/umbraco.sln.DotSettings @@ -1,4 +1,4 @@ - + <data><IncludeFilters /><ExcludeFilters /></data> <data /> True @@ -16,14 +16,5 @@ Disposable construction HINT False - - - - - - - - - - - \ No newline at end of file + CSharp50 + \ No newline at end of file From 198fff508d0b280efdec778e4c1f3930cb8e7b5b Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 5 Oct 2016 09:57:45 +0200 Subject: [PATCH 082/841] Version 7.6.0-alpha027 --- src/SolutionInfo.cs | 2 +- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index 2419804768..0ee18c0aba 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -12,4 +12,4 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("7.6.0")] -[assembly: AssemblyInformationalVersion("7.6.0-alpha021")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("7.6.0-alpha027")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index 9b1b341b68..ba754ef3d2 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "alpha021"; } } + public static string CurrentComment { get { return "alpha027"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx From a279be1b4726c31595c93512775702d32f71377a Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 5 Oct 2016 13:53:19 +0200 Subject: [PATCH 083/841] Build TLC --- .gitignore | 2 + appveyor.yml | 29 +++---- build/Build.bat | 126 +++++++++++++++++++++++++------ build/Build.proj | 38 +++++----- build/InstallGit.cmd | 6 +- src/.nuget/NuGet.exe | Bin 1664512 -> 4267224 bytes src/packages/repositories.config | 15 ---- 7 files changed, 141 insertions(+), 75 deletions(-) delete mode 100644 src/packages/repositories.config diff --git a/.gitignore b/.gitignore index 5b5e7660c5..f644044430 100644 --- a/.gitignore +++ b/.gitignore @@ -141,3 +141,5 @@ build/docs.zip build/ui-docs.zip build/csharp-docs.zip build/msbuild.log + +src/packages/ \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 3044444730..dc6e22edbf 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,21 +2,23 @@ version: '{build}' shallow_clone: true build_script: - cmd: >- - cd build + SET SLN=%CD% + + SET SRC=%SLN%\src + + SET PACKAGES=%SRC%\packages + + CD build SET "release=" FOR /F "skip=1 delims=" %%i IN (UmbracoVersion.txt) DO IF NOT DEFINED release SET "release=%%i" - SET nuGetFolder=C:\Users\appveyor\.nuget\packages - - ..\src\.nuget\NuGet.exe sources Add -Name MyGetUmbracoCore -Source https://www.myget.org/F/umbracocore/api/v2/ >NUL - - ..\src\.nuget\NuGet.exe install ..\src\Umbraco.Web.UI\packages.config -OutputDirectory %nuGetFolder% -Verbosity quiet - - IF EXIST ..\src\umbraco.businesslogic\packages.config ..\src\.nuget\NuGet.exe install ..\src\umbraco.businesslogic\packages.config -OutputDirectory %nuGetFolder% -Verbosity quiet - - ..\src\.nuget\NuGet.exe install ..\src\Umbraco.Core\packages.config -OutputDirectory %nuGetFolder% -Verbosity quiet + ECHO "Restoring NuGet into %PACKAGES%" + + %SRC%\.nuget\NuGet.exe sources Add -Name MyGetUmbracoCore -Source https://www.myget.org/F/umbracocore/api/v2/ >NUL + + %SRC%\.nuget\NuGet.exe restore %SRC%\umbraco.sln -Verbosity Quiet -NonInteractive -PackagesDirectory %PACKAGES% ECHO Building Release %release% build%APPVEYOR_BUILD_NUMBER% @@ -24,13 +26,12 @@ build_script: SET MSBUILD="C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe" - XCOPY "..\src\Umbraco.Tests\unit-test-log4net.CI.config" "..\src\Umbraco.Tests\unit-test-log4net.config" /Y + XCOPY "%SRC%\Umbraco.Tests\unit-test-log4net.CI.config" "%SRC%\Umbraco.Tests\unit-test-log4net.config" /Y - %MSBUILD% "..\src\Umbraco.Tests\Umbraco.Tests.csproj" /consoleloggerparameters:Summary;ErrorsOnly + %MSBUILD% "%SLN%/src/Umbraco.Tests/Umbraco.Tests.csproj" /consoleloggerparameters:Summary;ErrorsOnly;WarningsOnly /p:NugetPackagesDirectory=%PACKAGES% - build.bat nopause %release% build%APPVEYOR_BUILD_NUMBER% + build.bat -integration -release:%release% -comment:build%APPVEYOR_BUILD_NUMBER% -nugetfolder:%PACKAGES% - ECHO %PATH% test: assemblies: src\Umbraco.Tests\bin\Debug\Umbraco.Tests.dll artifacts: diff --git a/build/Build.bat b/build/Build.bat index fc0d8a69ea..04f13b1085 100644 --- a/build/Build.bat +++ b/build/Build.bat @@ -1,31 +1,96 @@ @ECHO OFF + +:: UMBRACO BUILD FILE + +ECHO. + +:: ensure we have UmbracoVersion.txt IF NOT EXIST UmbracoVersion.txt ( - ECHO UmbracoVersion.txt missing! - GOTO :showerror + ECHO UmbracoVersion.txt is missing! + GOTO error ) REM Get the version and comment from UmbracoVersion.txt lines 2 and 3 -SET "release=" -SET "comment=" -FOR /F "skip=1 delims=" %%i IN (UmbracoVersion.txt) DO IF NOT DEFINED release SET "release=%%i" -FOR /F "skip=2 delims=" %%i IN (UmbracoVersion.txt) DO IF NOT DEFINED comment SET "comment=%%i" +SET RELEASE= +SET COMMENT= +FOR /F "skip=1 delims=" %%i IN (UmbracoVersion.txt) DO IF NOT DEFINED RELEASE SET RELEASE=%%i +FOR /F "skip=2 delims=" %%i IN (UmbracoVersion.txt) DO IF NOT DEFINED COMMENT SET COMMENT=%%i -REM If there's arguments on the command line overrule UmbracoVersion.txt and use that as the version -IF [%2] NEQ [] (SET release=%2) -IF [%3] NEQ [] (SET comment=%3) ELSE (IF [%2] NEQ [] (SET "comment=")) +REM process args -REM Get the "is continuous integration" from the parameters -SET "isci=0" -IF [%1] NEQ [] (SET isci=1) +SET INTEGRATION=0 +SET nuGetFolder=%CD%\..\src\packages\ +SET SKIPNUGET=0 -SET version=%release% -IF [%comment%] EQU [] (SET version=%release%) ELSE (SET version=%release%-%comment%) +:processArgs + +:: grab the first parameter as a whole eg "/action:start" +:: end if no more parameter +SET SWITCHPARSE=%1 +IF [%SWITCHPARSE%] == [] goto endProcessArgs + +:: get switch and value +SET SWITCH= +SET VALUE= +FOR /F "tokens=1,* delims=: " %%a IN ("%SWITCHPARSE%") DO SET SWITCH=%%a& SET VALUE=%%b + +:: route arg +IF '%SWITCH%'=='/release' GOTO argRelease +IF '%SWITCH%'=='-release' GOTO argRelease +IF '%SWITCH%'=='/comment' GOTO argComment +IF '%SWITCH%'=='-comment' GOTO argComment +IF '%SWITCH%'=='/integration' GOTO argIntegration +IF '%SWITCH%'=='-integration' GOTO argIntegration +IF '%SWITCH%'=='/nugetfolder' GOTO argNugetFolder +IF '%SWITCH%'=='-nugetfolder' GOTO argNugetFolder +IF '%SWITCH%'=='/skipnuget' GOTO argSkipNuget +IF '%SWITCH%'=='-skipnuget' GOTO argSkipNuget +ECHO "Invalid switch %SWITCH%" +GOTO error + +:: handle each arg + +:argRelease +set RELEASE=%VALUE% +SHIFT +goto processArgs + +:argComment +SET COMMENT=%VALUE% +SHIFT +GOTO processArgs + +:argIntegration +SET INTEGRATION=1 +SHIFT +GOTO processArgs + +:argNugetFolder +SET nuGetFolder=%VALUE% +SHIFT +GOTO processArgs + +:argSkipNuget +SET SKIPNUGET=1 +SHIFT +GOTO processArgs + +:endProcessArgs + +REM run + +SET VERSION=%RELEASE% +IF [%COMMENT%] EQU [] (SET VERSION=%RELEASE%) ELSE (SET VERSION=%RELEASE%-%COMMENT%) ECHO. -ECHO Building Umbraco %version% +ECHO Building Umbraco %VERSION% ECHO. -ReplaceIISExpressPortNumber.exe ..\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj %release% +SET MSBUILDPATH=C:\Program Files (x86)\MSBuild\14.0\Bin +SET MSBUILD="%MSBUILDPATH%\MsBuild.exe" +SET PATH="%MSBUILDPATH%";%PATH% + +ReplaceIISExpressPortNumber.exe ..\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj %RELEASE% ECHO. ECHO Removing the belle build folder and bower_components folder to make sure everything is clean as a whistle @@ -47,12 +112,22 @@ CALL InstallGit.cmd REM Adding the default Git path so that if it's installed it can actually be found REM This is necessary because SETLOCAL is on in InstallGit.cmd so that one might find Git, REM but the path setting is lost due to SETLOCAL -path=C:\Program Files (x86)\Git\cmd;C:\Program Files\Git\cmd;%PATH% +SET PATH="C:\Program Files (x86)\Git\cmd";"C:\Program Files\Git\cmd";%PATH% ECHO. ECHO Making sure we have a web.config IF NOT EXIST %CD%\..\src\Umbraco.Web.UI\web.config COPY %CD%\..\src\Umbraco.Web.UI\web.Template.config %CD%\..\src\Umbraco.Web.UI\web.config +ECHO. +ECHO Reporting NuGet version +%CD%\..\src\.nuget\NuGet.exe help | findstr "^NuGet Version:" + +ECHO. +ECHO Restoring NuGet packages +ECHO Into %nuGetFolder% +%CD%\..\src\.nuget\NuGet.exe restore %CD%\..\src\umbraco.sln -Verbosity Quiet -NonInteractive -PackagesDirectory %nuGetFolder% +IF ERRORLEVEL 1 GOTO :error + ECHO. ECHO. ECHO Performing MSBuild and producing Umbraco binaries zip files @@ -60,13 +135,15 @@ ECHO This takes a few minutes and logging is set to report warnings ECHO and errors only so it might seems like nothing is happening for a while. ECHO You can check the msbuild.log file for progress. ECHO. -%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "Build.proj" /p:BUILD_RELEASE=%release% /p:BUILD_COMMENT=%comment% /p:NugetPackagesDirectory=%nuGetFolder% /consoleloggerparameters:Summary;ErrorsOnly;WarningsOnly /fileLogger -IF ERRORLEVEL 1 GOTO :error +%MSBUILD% "Build.proj" /p:BUILD_RELEASE=%RELEASE% /p:BUILD_COMMENT=%COMMENT% /p:NugetPackagesDirectory=%nuGetFolder% /consoleloggerparameters:Summary;ErrorsOnly;WarningsOnly /fileLogger +IF ERRORLEVEL 1 GOTO error ECHO. ECHO Setting node_modules folder to hidden to prevent VS13 from crashing on it while loading the websites project attrib +h ..\src\Umbraco.Web.UI.Client\node_modules +IF %SKIPNUGET% EQU 1 GOTO success + ECHO. ECHO Adding Web.config transform files to the NuGet package REN .\_BuildOutput\WebApp\Views\Web.config Web.config.transform @@ -74,22 +151,25 @@ REN .\_BuildOutput\WebApp\Xslt\Web.config Web.config.transform ECHO. ECHO Packing the NuGet release files -..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.Core.nuspec -Version %version% -Symbols -Verbosity quiet -..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.nuspec -Version %version% -Verbosity quiet -IF ERRORLEVEL 1 GOTO :error +..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.Core.nuspec -Version %VERSION% -Symbols -Verbosity quiet +..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.nuspec -Version %VERSION% -Verbosity quiet +IF ERRORLEVEL 1 GOTO error :success ECHO. ECHO No errors were detected! ECHO There may still be some in the output, which you would need to investigate. ECHO Warnings are usually normal. +ECHO. +ECHO. GOTO :EOF :error ECHO. ECHO Errors were detected! +ECHO. REM don't pause if continuous integration else the build server waits forever REM before cancelling the build (and, there is noone to read the output anyways) -IF isci NEQ 1 PAUSE +IF %INTEGRATION% NEQ 1 PAUSE diff --git a/build/Build.proj b/build/Build.proj index 9413b49d15..1f57ca5915 100644 --- a/build/Build.proj +++ b/build/Build.proj @@ -1,8 +1,8 @@ - @@ -35,9 +35,9 @@ { using (var cryptoProvider = new SHA1CryptoServiceProvider()) { - + var fileHash = cryptoProvider.ComputeHash(stream); - + using (TextWriter w = new StreamWriter(OutputFile, false)) { w.WriteLine(string.Join("", fileHash.Select(b => b.ToString("x2")))); @@ -52,9 +52,9 @@ - @@ -102,9 +102,9 @@ - @@ -155,7 +155,7 @@ - + @@ -231,7 +231,7 @@ DestinationFiles="@(CustomLanguageFiles->'$(ConfigsFolder)Lang\%(RecursiveDir)%(Filename)%(Extension)')" OverwriteReadOnlyFiles="true" SkipUnchangedFiles="false" /> - + - - + - $(BUILD_RELEASE) @@ -307,34 +305,34 @@ ReplacementText="AssemblyFileVersion("$(BUILD_RELEASE)")"/> - - - - - - + - diff --git a/build/InstallGit.cmd b/build/InstallGit.cmd index e009e2594e..4daa2f45d9 100644 --- a/build/InstallGit.cmd +++ b/build/InstallGit.cmd @@ -1,18 +1,18 @@ @ECHO OFF SETLOCAL - :: SETLOCAL is on, so changes to the path not persist to the actual user's path +REM SETLOCAL is on, so changes to the path not persist to the actual user's path git.exe --version IF %ERRORLEVEL%==9009 GOTO :trydefaultpath +REM OK, DONE GOTO :EOF - :: Git is installed, no need to to anything else :trydefaultpath PATH=C:\Program Files (x86)\Git\cmd;C:\Program Files\Git\cmd;%PATH% git.exe --version IF %ERRORLEVEL%==9009 GOTO :showerror +REM OK, DONE GOTO :EOF - :: Git is installed, no need to to anything else :showerror ECHO Git is not in your path and could not be found in C:\Program Files (x86)\Git\cmd nor in C:\Program Files\Git\cmd diff --git a/src/.nuget/NuGet.exe b/src/.nuget/NuGet.exe index 9ca66594f912a1fe7aec510819006fb1a80bc1a9..6804fb7da73756ab34931853a0d43a3e74e4a0fb 100644 GIT binary patch literal 4267224 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

    %eiZ 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

  • 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%0ADJ6~E)TZ2ayQVJ=~!p=}u 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

    Fh!U&_~nZyi)Nis&6={#v}d>9WTnY>3&;qQ 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�S&OI_?3&sO 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

    6IFE++im@xa*{^_V+k9_Jo6KLgW%-^*XU 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�a$H)Un#2WVvH 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

    tZa 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

    S6uwZS%4_Gv5GCgQLJw( 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

    ^zycBz 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 z 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 Kc_W&UVX{A@<8i$?0s+AC4yuDo?i1+s6 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

    ;Z*>V0Moic3zkBzw$4)?g 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

    !Z&qzgw7WYgi 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
    (WE= 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%0AhxW!VO~2mLwOZDi3#@q`WJ6t|gW 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%0DfnIYaiR;OTuV*~Sdd8z0%xg7yIPdQ9e8}?Y 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�G*9oTfKvH4zi2$4$-;D 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 literal 1664512 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
  • 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

    w}k|O3;Ng3Ak`gW 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 z zpXaYP$LY5z1M|9koI^Wb&i8|`rw{U5jJ=4k&lj`{6Xuug{g?JUF!$rIxDof|kO^sz z2XI~=VCSi9e)YP8A?A1lx>Qks^vVAHc{XmhoPQ33`mM+5TNIOTS_6vu+q#bHW839? z0(R_s5*}A~pZD3iAGRO#=f}Ana{J+s>w)jzb8x=rn=mY1F=0eBA%8s`e-Fpm4)<@# zoPJXjcH5x;#H_>WUe07Yw!hTvH8H=zxNf;?$gXa`Y&U3!$AR3>|7h|-zo3Tv{BOtE z5Bs(6S15<)=<7TM?^|eFoPOUXKwLN1FD??;%sY@dE4iF~@t> zaX-h`0jIO=EiC#4{02Fv4|3ao(JvgD^BnfZRfiaRA#dHz5fs<&ACG|_9v=;dt{9x_ zg|;t&WH6!E3EOJ*j{)3IJg=0 zYr~Le+iIM~qyLgeM4xl*^}i3o?4*!>R|oMC2z$y8=kH4Bf+3FswiWX8DnEbQ_sL;# z73a&0&uJ~bdCwfi{f~Zc51iYRjr;HIIe+Z`PS~@d9lz^-kkfNG)#yT4w@2#=kdBWB z!#nW)+pag@>oy|(VtA^UZ^9IB+!0LA=Y8uT{hAEY2ahx7FnFBfTz($^@w_*WgILFQ zIBZ4#!N-%s?&C5p7vFDYZ=>E=&;9fwGY`z`DMKRLjQePwEQ#}RKeX$4LgE$p<8f

    >2--I}aFCqV3hWqn}_Ps+y^e(pjbMW|1 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 RGHFl)S5g03{{M}@-vCWeV3Gg; diff --git a/src/packages/repositories.config b/src/packages/repositories.config deleted file mode 100644 index f2902f1e46..0000000000 --- a/src/packages/repositories.config +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file From ca60b1e24d4c99b45979a8e6fc1458de2e1d76c0 Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 5 Oct 2016 15:07:47 +0200 Subject: [PATCH 084/841] More BackgroundTaskRunner troubleshooting --- src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs index acbbdbf710..67c342ee2f 100644 --- a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs +++ b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs @@ -52,7 +52,7 @@ namespace Umbraco.Web.Scheduling private bool _terminating; // ensures we raise that event only once private bool _terminated; // remember we've terminated - private TaskCompletionSource _terminatedSource; // enable awaiting termination + private readonly TaskCompletionSource _terminatedSource = new TaskCompletionSource(); // enable awaiting termination ///

    /// Initializes a new instance of the class. @@ -201,10 +201,6 @@ namespace Umbraco.Web.Scheduling { lock (_locker) { - if (_terminatedSource == null) - _terminatedSource = new TaskCompletionSource(); - if (_terminated) - _terminatedSource.SetResult(0); return new ThreadingTaskImmutable(_terminatedSource.Task); } } @@ -719,8 +715,7 @@ namespace Umbraco.Web.Scheduling OnEvent(Terminated, "Terminated"); - if (terminatedSource != null) - terminatedSource.SetResult(0); + terminatedSource.SetResult(0); } } } From ac42c8ae26162a46fcd5a6727bd356a4669fe966 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 17 Oct 2016 14:06:08 +0200 Subject: [PATCH 085/841] Fix 2eb050e, broke Xslt edit --- .../umbraco/developer/Xslt/editXslt.aspx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/developer/Xslt/editXslt.aspx b/src/Umbraco.Web.UI/umbraco/developer/Xslt/editXslt.aspx index ce19925ec0..f1ad582627 100644 --- a/src/Umbraco.Web.UI/umbraco/developer/Xslt/editXslt.aspx +++ b/src/Umbraco.Web.UI/umbraco/developer/Xslt/editXslt.aspx @@ -9,7 +9,7 @@ - + @@ -21,8 +21,7 @@ nameTxtBox: $('#<%= xsltFileName.ClientID %>'), originalFileName: '<%= xsltFileName.Text %>', saveButton: $("#<%= ((Control)SaveButton).ClientID %>"), - editorSourceElement: $('#<%= editorSource.ClientID %>'), - skipTestingCheckBox: $("#<%= SkipTesting.ClientID %>"), + editorSourceElement: $('#<%= editorSource.ClientID %>') }); editor.init(); @@ -32,7 +31,7 @@ })(jQuery); //TODO: Move these to EditXslt.js one day - var xsltSnippet = ""; + var xsltSnippet = ""; function xsltVisualize() { xsltSnippet = UmbEditor.IsSimpleEditor @@ -46,7 +45,7 @@ } UmbClientMgr.openModalWindow('<%= Umbraco.Core.IO.IOHelper.ResolveUrl(Umbraco.Core.IO.SystemDirectories.Umbraco) %>/developer/xslt/xsltVisualize.aspx', 'Visualize XSLT', true, 550, 650); - } + } @@ -56,7 +55,7 @@ - + From 20fc78419e7f14c89ef4af41defc3b6a776a51f5 Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 19 Oct 2016 15:07:48 +0200 Subject: [PATCH 086/841] Refactor / fix SignalR integration, add nuspec dependency --- build/NuSpecs/UmbracoCms.nuspec | 1 + .../Security/Identity/AppBuilderExtensions.cs | 9 ++++++++- src/Umbraco.Web/UmbracoDefaultOwinStartup.cs | 11 +++-------- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/build/NuSpecs/UmbracoCms.nuspec b/build/NuSpecs/UmbracoCms.nuspec index 54d12f6844..fbd64c922e 100644 --- a/build/NuSpecs/UmbracoCms.nuspec +++ b/build/NuSpecs/UmbracoCms.nuspec @@ -18,6 +18,7 @@ + diff --git a/src/Umbraco.Web/Security/Identity/AppBuilderExtensions.cs b/src/Umbraco.Web/Security/Identity/AppBuilderExtensions.cs index c69b483a3a..80903dff90 100644 --- a/src/Umbraco.Web/Security/Identity/AppBuilderExtensions.cs +++ b/src/Umbraco.Web/Security/Identity/AppBuilderExtensions.cs @@ -6,6 +6,7 @@ using System.Threading; using System.Web; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; +using Microsoft.AspNet.SignalR; using Microsoft.Owin; using Microsoft.Owin.Extensions; using Microsoft.Owin.Logging; @@ -53,7 +54,13 @@ namespace Umbraco.Web.Security.Identity { app.SetLoggerFactory(new OwinLoggerFactory()); } - + + // TODO: Move this method in v8, it doesn't belong in this namespace/extension class + public static void ConfigureSignalR(this IAppBuilder app) + { + app.MapSignalR("/umbraco/signalr", new HubConfiguration { EnableDetailedErrors = true }); + } + /// /// Configure Default Identity User Manager for Umbraco /// diff --git a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs index 152a6c25a3..01745ef8f0 100644 --- a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs +++ b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs @@ -1,13 +1,7 @@ using System; -using System.Web; -using Microsoft.AspNet.SignalR; using Microsoft.Owin; -using Microsoft.Owin.Extensions; -using Microsoft.Owin.Infrastructure; -using Microsoft.Owin.Logging; using Owin; using Umbraco.Core; -using Umbraco.Core.Logging; using Umbraco.Core.Security; using Umbraco.Web; using Umbraco.Web.Security.Identity; @@ -44,11 +38,13 @@ namespace Umbraco.Web { app.SetUmbracoLoggerFactory(); - //Configure the Identity user manager for use with Umbraco Back office + //Configure the Identity user manager for use with Umbraco Back office // (EXPERT: an overload accepts a custom BackOfficeUserStore implementation) app.ConfigureUserManagerForUmbracoBackOffice( ApplicationContext, Core.Security.MembershipProviderExtensions.GetUsersMembershipProvider().AsUmbracoMembershipProvider()); + + app.ConfigureSignalR(); } /// @@ -63,7 +59,6 @@ namespace Umbraco.Web .UseUmbracoBackOfficeCookieAuthentication(ApplicationContext, PipelineStage.Authenticate) .UseUmbracoBackOfficeExternalCookieAuthentication(ApplicationContext, PipelineStage.Authenticate) .UseUmbracoPreviewAuthentication(ApplicationContext, PipelineStage.Authorize) - .MapSignalR("/umbraco/signalr", new HubConfiguration {EnableDetailedErrors = true}) .FinalizeMiddlewareConfiguration(); } From 65ef97d9ba7330f74dada8fb39357bc0650cf936 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 20 Oct 2016 12:04:30 +0200 Subject: [PATCH 087/841] deploy-91 - make MediaExtensions public (why not) --- src/Umbraco.Core/Models/MediaExtensions.cs | 84 +++++++++------------- 1 file changed, 33 insertions(+), 51 deletions(-) diff --git a/src/Umbraco.Core/Models/MediaExtensions.cs b/src/Umbraco.Core/Models/MediaExtensions.cs index 1f2e1b62b2..a006548773 100644 --- a/src/Umbraco.Core/Models/MediaExtensions.cs +++ b/src/Umbraco.Core/Models/MediaExtensions.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -9,73 +8,56 @@ using Umbraco.Core.PropertyEditors.ValueConverters; namespace Umbraco.Core.Models { - internal static class MediaExtensions + public static class MediaExtensions { /// - /// Hack: we need to put this in a real place, this is currently just used to render the urls for a media item in the back office + /// Gets the url of a media item. /// - /// public static string GetUrl(this IMedia media, string propertyAlias, ILogger logger) { var propertyType = media.PropertyTypes.FirstOrDefault(x => x.Alias.InvariantEquals(propertyAlias)); - if (propertyType != null) + if (propertyType == null) return string.Empty; + + var val = media.Properties[propertyType]; + if (val == null) return string.Empty; + + var jsonString = val.Value as string; + if (jsonString == null) return string.Empty; + + if (propertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias) + return jsonString; + + if (propertyType.PropertyEditorAlias == Constants.PropertyEditors.ImageCropperAlias) { - var val = media.Properties[propertyType]; - if (val != null) + if (jsonString.DetectIsJson() == false) + return jsonString; + + try { - var jsonString = val.Value as string; - if (jsonString != null) - { - if (propertyType.PropertyEditorAlias == Constants.PropertyEditors.ImageCropperAlias) - { - if (jsonString.DetectIsJson()) - { - try - { - var json = JsonConvert.DeserializeObject(jsonString); - if (json["src"] != null) - { - return json["src"].Value(); - } - } - catch (Exception ex) - { - logger.Error("Could not parse the string " + jsonString + " to a json object", ex); - return string.Empty; - } - } - else - { - return jsonString; - } - } - else if (propertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias) - { - return jsonString; - } - //hrm, without knowing what it is, just adding a string here might not be very nice - } + var json = JsonConvert.DeserializeObject(jsonString); + if (json["src"] != null) + return json["src"].Value(); + } + catch (Exception ex) + { + logger.Error("Could not parse the string " + jsonString + " to a json object", ex); + return string.Empty; } } + + // hrm, without knowing what it is, just adding a string here might not be very nice return string.Empty; } /// - /// Hack: we need to put this in a real place, this is currently just used to render the urls for a media item in the back office + /// Gets the urls of a media item. /// - /// public static string[] GetUrls(this IMedia media, IContentSection contentSection, ILogger logger) { - var links = new List(); - var autoFillProperties = contentSection.ImageAutoFillProperties.ToArray(); - if (autoFillProperties.Any()) - { - links.AddRange( - autoFillProperties - .Select(field => media.GetUrl(field.Alias, logger)) - .Where(link => link.IsNullOrWhiteSpace() == false)); - } - return links.ToArray(); + return contentSection.ImageAutoFillProperties + .Select(field => media.GetUrl(field.Alias, logger)) + .Where(link => string.IsNullOrWhiteSpace(link) == false) + .ToArray(); } } } \ No newline at end of file From 1aade7c27c4ca347d75c54e91dae7b063746f8fd Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 20 Oct 2016 13:30:52 +0200 Subject: [PATCH 088/841] Version 7.6.0-alpha028 --- src/SolutionInfo.cs | 2 +- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index 0ee18c0aba..8a38c089c9 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -12,4 +12,4 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("7.6.0")] -[assembly: AssemblyInformationalVersion("7.6.0-alpha027")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("7.6.0-alpha028")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index ba754ef3d2..17d9c95e0a 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "alpha027"; } } + public static string CurrentComment { get { return "alpha028"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx From 95af144ae9517bb3389406b660487e732cde2c67 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 24 Oct 2016 13:08:35 +0200 Subject: [PATCH 089/841] Migrate locks to their own umbracoLocks table --- src/Umbraco.Core/Constants-System.cs | 3 -- src/Umbraco.Core/Models/Rdbms/LockDto.cs | 29 ++++++++++++++ .../Persistence/Constants-Locks.cs | 11 ++++++ .../Persistence/DatabasenodeLockExtensions.cs | 4 +- .../Migrations/Initial/BaseDataCreation.cs | 12 +++++- .../Initial/DatabaseSchemaCreation.cs | 3 +- .../AddLockObjects.cs | 39 +++++++++++++++++++ .../AddLockTable.cs | 32 +++++++++++++++ .../EnsureServersLockObject.cs | 2 +- .../AddServerRegistrationColumnsAndLock.cs | 2 +- .../Services/ServerRegistrationService.cs | 2 +- src/Umbraco.Core/Umbraco.Core.csproj | 4 ++ 12 files changed, 132 insertions(+), 11 deletions(-) create mode 100644 src/Umbraco.Core/Models/Rdbms/LockDto.cs create mode 100644 src/Umbraco.Core/Persistence/Constants-Locks.cs create mode 100644 src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockObjects.cs create mode 100644 src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockTable.cs diff --git a/src/Umbraco.Core/Constants-System.cs b/src/Umbraco.Core/Constants-System.cs index 4a30db9cd8..bc86d1717f 100644 --- a/src/Umbraco.Core/Constants-System.cs +++ b/src/Umbraco.Core/Constants-System.cs @@ -25,9 +25,6 @@ public const int DefaultContentListViewDataTypeId = -95; public const int DefaultMediaListViewDataTypeId = -96; public const int DefaultMembersListViewDataTypeId = -97; - - // identifiers for lock objects - public const int ServersLock = -331; } public static class DatabaseProviders diff --git a/src/Umbraco.Core/Models/Rdbms/LockDto.cs b/src/Umbraco.Core/Models/Rdbms/LockDto.cs new file mode 100644 index 0000000000..b543ce4241 --- /dev/null +++ b/src/Umbraco.Core/Models/Rdbms/LockDto.cs @@ -0,0 +1,29 @@ +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; + +namespace Umbraco.Core.Models.Rdbms +{ + [TableName("umbracoLock")] + [PrimaryKey("id")] + [ExplicitColumns] + internal class LockDto + { + public LockDto() + { + Value = 1; + } + + [Column("id")] + [PrimaryKeyColumn(Name = "PK_umbracoLock")] + public int Id { get; set; } + + [Column("value")] + [NullSetting(NullSetting = NullSettings.NotNull)] + public int Value { get; set; } + + [Column("name")] + [NullSetting(NullSetting = NullSettings.NotNull)] + [Length(64)] + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Constants-Locks.cs b/src/Umbraco.Core/Persistence/Constants-Locks.cs new file mode 100644 index 0000000000..49c6f933fb --- /dev/null +++ b/src/Umbraco.Core/Persistence/Constants-Locks.cs @@ -0,0 +1,11 @@ +// ReSharper disable once CheckNamespace +namespace Umbraco.Core +{ + static partial class Constants + { + public static class Locks + { + public const int Servers = -331; + } + } +} diff --git a/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs b/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs index 3e6d245416..5ef29aa951 100644 --- a/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs +++ b/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Persistence { ValidateDatabase(database); - database.Execute("UPDATE umbracoNode SET sortOrder = (CASE WHEN (sortOrder=1) THEN -1 ELSE 1 END) WHERE id=@id", + database.Execute("UPDATE umbracoLock SET value = (CASE WHEN (value=1) THEN -1 ELSE 1 END) WHERE id=@id", new { @id = nodeId }); } @@ -36,7 +36,7 @@ namespace Umbraco.Core.Persistence { ValidateDatabase(database); - database.ExecuteScalar("SELECT sortOrder FROM umbracoNode WHERE id=@id", + database.ExecuteScalar("SELECT value FROM umbracoLock WHERE id=@id", new { @id = nodeId }); } } diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs index 9570024b09..60fd37a357 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs @@ -33,7 +33,12 @@ namespace Umbraco.Core.Persistence.Migrations.Initial CreateUmbracNodeData(); } - if(tableName.Equals("cmsContentType")) + if (tableName.Equals("umbracoLock")) + { + CreateUmbracoLockData(); + } + + if (tableName.Equals("cmsContentType")) { CreateCmsContentTypeData(); } @@ -141,9 +146,12 @@ namespace Umbraco.Core.Persistence.Migrations.Initial //_database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1038, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1038", SortOrder = 2, UniqueId = new Guid("1251c96c-185c-4e9b-93f4-b48205573cbd"), Text = "Simple Editor", NodeObjectType = new Guid(Constants.ObjectTypes.DataType), CreateDate = DateTime.Now }); //_database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1042, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1042", SortOrder = 2, UniqueId = new Guid("0a452bd5-83f9-4bc3-8403-1286e13fb77e"), Text = "Macro Container", NodeObjectType = new Guid(Constants.ObjectTypes.DataType), CreateDate = DateTime.Now }); + } + private void CreateUmbracoLockData() + { // all lock objects - _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = Constants.System.ServersLock, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1," + Constants.System.ServersLock, SortOrder = 1, UniqueId = new Guid("0AF5E610-A310-4B6F-925F-E928D5416AF7"), Text = "LOCK: Servers", NodeObjectType = Constants.ObjectTypes.LockObjectGuid, CreateDate = DateTime.Now }); + _database.Insert("umbracoLock", "id", false, new LockDto { Id = Constants.Locks.Servers, Name = "Servers" }); } private void CreateCmsContentTypeData() diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs index 423c847c47..edac819474 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs @@ -84,7 +84,8 @@ namespace Umbraco.Core.Persistence.Migrations.Initial {45, typeof (MigrationDto)}, {46, typeof (UmbracoDeployChecksumDto)}, {47, typeof (UmbracoDeployDependencyDto)}, - {48, typeof (RedirectUrlDto) } + {48, typeof (RedirectUrlDto) }, + {49, typeof (LockDto) } }; #endregion diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockObjects.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockObjects.cs new file mode 100644 index 0000000000..d5c377fba1 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockObjects.cs @@ -0,0 +1,39 @@ +using Umbraco.Core.Configuration; +using Umbraco.Core.Logging; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveFive +{ + [Migration("7.5.5", 101, GlobalSettings.UmbracoMigrationName)] + public class AddLockObjects : MigrationBase + { + public AddLockObjects(ISqlSyntaxProvider sqlSyntax, ILogger logger) + : base(sqlSyntax, logger) + { } + + public override void Up() + { + EnsureLockObject(Constants.Locks.Servers, "Servers"); + } + + public override void Down() + { + // not implemented + } + + private void EnsureLockObject(int id, string name) + { + Execute.Code(db => + { + var exists = db.Exists(id); + if (exists) return string.Empty; + // be safe: delete old umbracoNode lock objects if any + db.Execute("DELETE FROM umbracoNode WHERE id=@id;", new { id }); + // then create umbracoLock object + db.Execute("INSERT umbracoLock (id, name, value) VALUES (@id, '@name', 1);", new { id, name }); + return string.Empty; + }); + } + } +} diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockTable.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockTable.cs new file mode 100644 index 0000000000..5dc1720a2a --- /dev/null +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockTable.cs @@ -0,0 +1,32 @@ +using System.Linq; +using Umbraco.Core.Configuration; +using Umbraco.Core.Logging; +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveFive +{ + [Migration("7.5.5", 100, GlobalSettings.UmbracoMigrationName)] + public class AddLockTable : MigrationBase + { + public AddLockTable(ISqlSyntaxProvider sqlSyntax, ILogger logger) + : base(sqlSyntax, logger) + { } + + public override void Up() + { + var tables = SqlSyntax.GetTablesInSchema(Context.Database).ToArray(); + if (tables.InvariantContains("umbracoLock") == false) + { + Create.Table("umbracoLock") + .WithColumn("id").AsInt32().PrimaryKey("PK_umbracoLock") + .WithColumn("value").AsInt32().NotNullable() + .WithColumn("name").AsString(64).NotNullable(); + } + } + + public override void Down() + { + // not implemented + } + } +} diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/EnsureServersLockObject.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/EnsureServersLockObject.cs index 6f9d74e5db..1bfef5ef6d 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/EnsureServersLockObject.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/EnsureServersLockObject.cs @@ -22,7 +22,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZer // for some reason it was not, so it was created during migrations but not during // new installs, so for ppl that upgrade, make sure they have it - EnsureLockObject(Constants.System.ServersLock, "0AF5E610-A310-4B6F-925F-E928D5416AF7", "LOCK: Servers"); + EnsureLockObject(Constants.Locks.Servers, "0AF5E610-A310-4B6F-925F-E928D5416AF7", "LOCK: Servers"); } public override void Down() diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenThreeZero/AddServerRegistrationColumnsAndLock.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenThreeZero/AddServerRegistrationColumnsAndLock.cs index 118dc1fc06..6a14e408a9 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenThreeZero/AddServerRegistrationColumnsAndLock.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenThreeZero/AddServerRegistrationColumnsAndLock.cs @@ -23,7 +23,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenThreeZe Create.Column("isMaster").OnTable("umbracoServer").AsBoolean().NotNullable().WithDefaultValue(0); } - EnsureLockObject(Constants.System.ServersLock, "0AF5E610-A310-4B6F-925F-E928D5416AF7", "LOCK: Servers"); + EnsureLockObject(Constants.Locks.Servers, "0AF5E610-A310-4B6F-925F-E928D5416AF7", "LOCK: Servers"); } public override void Down() diff --git a/src/Umbraco.Core/Services/ServerRegistrationService.cs b/src/Umbraco.Core/Services/ServerRegistrationService.cs index 5a4a48b7aa..b2d5ca855e 100644 --- a/src/Umbraco.Core/Services/ServerRegistrationService.cs +++ b/src/Umbraco.Core/Services/ServerRegistrationService.cs @@ -20,7 +20,7 @@ namespace Umbraco.Core.Services private readonly static string CurrentServerIdentityValue = NetworkHelper.MachineName // eg DOMAIN\SERVER + "/" + HttpRuntime.AppDomainAppId; // eg /LM/S3SVC/11/ROOT - private static readonly int[] LockingRepositoryIds = { Constants.System.ServersLock }; + private static readonly int[] LockingRepositoryIds = { Constants.Locks.Servers }; private ServerRole _currentServerRole = ServerRole.Unknown; private readonly LockingRepository _lrepo; diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 3dd960db06..7efbe99296 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -406,6 +406,7 @@ + @@ -415,6 +416,7 @@ + @@ -428,6 +430,8 @@ + + From c58cffe4a2dc32b99a1394776bd0c7e4b0d810fa Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 24 Oct 2016 14:46:04 +0200 Subject: [PATCH 090/841] Add tests for locks --- src/Umbraco.Tests/Persistence/LocksTests.cs | 300 ++++++++++++++++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + 2 files changed, 301 insertions(+) create mode 100644 src/Umbraco.Tests/Persistence/LocksTests.cs diff --git a/src/Umbraco.Tests/Persistence/LocksTests.cs b/src/Umbraco.Tests/Persistence/LocksTests.cs new file mode 100644 index 0000000000..e973b14614 --- /dev/null +++ b/src/Umbraco.Tests/Persistence/LocksTests.cs @@ -0,0 +1,300 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlServerCe; +using System.Threading; +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.Events; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.SqlSyntax; +using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.Publishing; +using Umbraco.Core.Services; +using Umbraco.Tests.Services; +using Umbraco.Tests.TestHelpers; +using Ignore = NUnit.Framework.IgnoreAttribute; + +namespace Umbraco.Tests.Persistence +{ + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] + [TestFixture] + [Ignore("Takes too much time.")] + public class LocksTests : BaseDatabaseFactoryTest + { + private ThreadSafetyServiceTest.PerThreadPetaPocoUnitOfWorkProvider _uowProvider; + private ThreadSafetyServiceTest.PerThreadDatabaseFactory _dbFactory; + + [SetUp] + public override void Initialize() + { + base.Initialize(); + + //we need to use our own custom IDatabaseFactory for the DatabaseContext because we MUST ensure that + //a Database instance is created per thread, whereas the default implementation which will work in an HttpContext + //threading environment, or a single apartment threading environment will not work for this test because + //it is multi-threaded. + _dbFactory = new ThreadSafetyServiceTest.PerThreadDatabaseFactory(Logger); + //overwrite the local object + ApplicationContext.DatabaseContext = new DatabaseContext(_dbFactory, Logger, new SqlCeSyntaxProvider(), Constants.DatabaseProviders.SqlCe); + + //disable cache + var cacheHelper = CacheHelper.CreateDisabledCacheHelper(); + + //here we are going to override the ServiceContext because normally with our test cases we use a + //global Database object but this is NOT how it should work in the web world or in any multi threaded scenario. + //we need a new Database object for each thread. + var repositoryFactory = new RepositoryFactory(cacheHelper, Logger, SqlSyntax, SettingsForTests.GenerateMockSettings()); + _uowProvider = new ThreadSafetyServiceTest.PerThreadPetaPocoUnitOfWorkProvider(_dbFactory); + var evtMsgs = new TransientMessagesFactory(); + ApplicationContext.Services = new ServiceContext( + repositoryFactory, + _uowProvider, + new FileUnitOfWorkProvider(), + new PublishingStrategy(evtMsgs, Logger), + cacheHelper, + Logger, + evtMsgs); + + // create a few lock objects + var database = DatabaseContext.Database; + database.BeginTransaction(IsolationLevel.RepeatableRead); + try + { + database.Execute("SET IDENTITY_INSERT umbracoLock ON"); + database.Insert("umbracoLock", "id", false, new LockDto { Id = 1, Name = "Lock.1" }); + database.Insert("umbracoLock", "id", false, new LockDto { Id = 2, Name = "Lock.2" }); + database.Insert("umbracoLock", "id", false, new LockDto { Id = 3, Name = "Lock.3" }); + database.Execute("SET IDENTITY_INSERT umbracoLock OFF"); + database.CompleteTransaction(); + } + catch + { + database.AbortTransaction(); + } + } + + [TearDown] + public override void TearDown() + { + //dispose! + _dbFactory.Dispose(); + _uowProvider.Dispose(); + + base.TearDown(); + } + + [Test] + public void Test() + { + var database = DatabaseContext.Database; + database.BeginTransaction(IsolationLevel.RepeatableRead); + try + { + database.AcquireLockNodeReadLock(Constants.Locks.Servers); + } + finally + { + database.CompleteTransaction(); + } + } + + [Test] + public void ConcurrentReadersTest() + { + var threads = new List(); + var locker = new object(); + var acquired = 0; + var maxAcquired = 0; + for (var i = 0; i < 5; i++) + { + threads.Add(new Thread(() => + { + var database = DatabaseContext.Database; + database.BeginTransaction(IsolationLevel.RepeatableRead); + try + { + database.AcquireLockNodeReadLock(Constants.Locks.Servers); + lock (locker) + { + acquired++; + } + Thread.Sleep(500); + lock (locker) + { + if (maxAcquired < acquired) maxAcquired = acquired; + } + Thread.Sleep(500); + lock (locker) + { + acquired--; + } + } + finally + { + database.CompleteTransaction(); + } + })); + } + foreach (var thread in threads) thread.Start(); + foreach (var thread in threads) thread.Join(); + Assert.AreEqual(5, maxAcquired); + } + + [Test] + public void ConcurrentWritersTest() + { + var threads = new List(); + var locker = new object(); + var acquired = 0; + var maxAcquired = 0; + for (var i = 0; i < 5; i++) + { + threads.Add(new Thread(() => + { + var database = DatabaseContext.Database; + database.BeginTransaction(IsolationLevel.RepeatableRead); + try + { + database.AcquireLockNodeWriteLock(Constants.Locks.Servers); + lock (locker) + { + acquired++; + } + Thread.Sleep(500); + lock (locker) + { + if (maxAcquired < acquired) maxAcquired = acquired; + } + Thread.Sleep(500); + lock (locker) + { + acquired--; + } + } + finally + { + database.CompleteTransaction(); + } + })); + } + foreach (var thread in threads) thread.Start(); + foreach (var thread in threads) thread.Join(); + Assert.AreEqual(1, maxAcquired); + } + + [Test] + public void DeadLockTest() + { + Exception e1 = null, e2 = null; + + var thread1 = new Thread(() => + { + var database = DatabaseContext.Database; + database.BeginTransaction(IsolationLevel.RepeatableRead); + try + { + database.AcquireLockNodeWriteLock(1); + Thread.Sleep(1000); + database.AcquireLockNodeWriteLock(2); + Thread.Sleep(1000); + } + catch (Exception e) + { + e1 = e; + } + finally + { + database.CompleteTransaction(); + } + }); + var thread2 = new Thread(() => + { + var database = DatabaseContext.Database; + database.BeginTransaction(IsolationLevel.RepeatableRead); + try + { + database.AcquireLockNodeWriteLock(2); + Thread.Sleep(1000); + database.AcquireLockNodeWriteLock(1); + Thread.Sleep(1000); + } + catch (Exception e) + { + e2 = e; + } + finally + { + database.CompleteTransaction(); + } + }); + thread1.Start(); + thread2.Start(); + thread1.Join(); + thread2.Join(); + Assert.IsNotNull(e1); + Assert.IsNotNull(e2); + Assert.IsInstanceOf(e1); + Assert.IsInstanceOf(e2); + } + + [Test] + public void NoDeadLockTest() + { + Exception e1 = null, e2 = null; + + var thread1 = new Thread(() => + { + var database = DatabaseContext.Database; + database.BeginTransaction(IsolationLevel.RepeatableRead); + try + { + database.AcquireLockNodeWriteLock(1); + var info = database.Query("SELECT * FROM sys.lock_information;"); + Console.WriteLine("LOCKS:"); + foreach (var row in info) + Console.WriteLine($"> {row.request_spid} {row.resource_type} {row.resource_description} {row.request_mode} {row.resource_table} {row.resource_table_id} {row.request_status}"); + Thread.Sleep(6000); + } + catch (Exception e) + { + e1 = e; + } + finally + { + database.CompleteTransaction(); + } + }); + var thread2 = new Thread(() => + { + var database = DatabaseContext.Database; + database.BeginTransaction(IsolationLevel.RepeatableRead); + try + { + Thread.Sleep(1000); + database.AcquireLockNodeWriteLock(2); + var info = database.Query("SELECT * FROM sys.lock_information;"); + Console.WriteLine("LOCKS:"); + foreach (var row in info) + Console.WriteLine($"> {row.request_spid} {row.resource_type} {row.resource_description} {row.request_mode} {row.resource_table} {row.resource_table_id} {row.request_status}"); + Thread.Sleep(1000); + } + catch (Exception e) + { + e2 = e; + } + finally + { + database.CompleteTransaction(); + } + }); + thread1.Start(); + thread2.Start(); + thread1.Join(); + thread2.Join(); + Assert.IsNull(e1); + Assert.IsNull(e2); + } + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 042fd6ff6f..25ed563e2d 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -176,6 +176,7 @@ + From f66b456d7c6b9e82190a3c561bc3fb0313603d92 Mon Sep 17 00:00:00 2001 From: Lars-Erik Aabech Date: Sat, 29 Oct 2016 09:44:45 +0200 Subject: [PATCH 091/841] Added converter for upload field --- .../UploadPropertyConverter.cs | 96 +++++++++++++++++++ src/Umbraco.Web/Umbraco.Web.csproj | 1 + 2 files changed, 97 insertions(+) create mode 100644 src/Umbraco.Web/PropertyEditors/ValueConverters/UploadPropertyConverter.cs diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/UploadPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/UploadPropertyConverter.cs new file mode 100644 index 0000000000..f3ca52d7ee --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/UploadPropertyConverter.cs @@ -0,0 +1,96 @@ +using System; +using Umbraco.Core; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.PropertyEditors; + +namespace Umbraco.Web.PropertyEditors.ValueConverters +{ + /// + /// The upload property value converter. + /// + public class UploadPropertyConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + /// + /// Checks if this converter can convert the property editor and registers if it can. + /// + /// + /// The published property type. + /// + /// + /// The . + /// + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.UploadFieldAlias); + } + + /// + /// The CLR type that the value converter returns. + /// + /// + /// The property type. + /// + /// + /// The . + /// + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(string); + } + + /// + /// Convert the source object to a string + /// + /// + /// The published property type. + /// + /// + /// The value of the property + /// + /// + /// The preview. + /// + /// + /// The . + /// + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + return (source ?? "").ToString(); + } + + /// + /// The get property cache level. + /// + /// + /// The property type. + /// + /// + /// The cache value. + /// + /// + /// The . + /// + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) + { + PropertyCacheLevel returnLevel; + switch (cacheValue) + { + case PropertyCacheValue.Object: + returnLevel = PropertyCacheLevel.ContentCache; + break; + case PropertyCacheValue.Source: + returnLevel = PropertyCacheLevel.Content; + break; + case PropertyCacheValue.XPath: + returnLevel = PropertyCacheLevel.Content; + break; + default: + returnLevel = PropertyCacheLevel.None; + break; + } + + return returnLevel; + } + + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index a70a00ffb4..b0d5ac49e2 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -400,6 +400,7 @@ + From c9af13df78bd832905b801077d34b1061992194e Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Sat, 29 Oct 2016 22:45:48 +0100 Subject: [PATCH 092/841] Added email address converter --- .../EmailAddressValueConverter.cs | 29 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + 2 files changed, 30 insertions(+) create mode 100644 src/Umbraco.Core/PropertyEditors/ValueConverters/EmailAddressValueConverter.cs diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/EmailAddressValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/EmailAddressValueConverter.cs new file mode 100644 index 0000000000..e9b0f7357f --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/EmailAddressValueConverter.cs @@ -0,0 +1,29 @@ +using System; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Core.PropertyEditors.ValueConverters +{ + public class EmailAddressValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.EmailAddressAlias); + } + + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + return source.ToString(); + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(string); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, + PropertyCacheValue cacheValue) + { + return PropertyCacheLevel.Content; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 4ee880a1e4..9a616ed85c 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -497,6 +497,7 @@ + From f9f48753de8f105bacf410810fee7c270ad3bf95 Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Sat, 29 Oct 2016 22:51:36 +0100 Subject: [PATCH 093/841] Updated colour picker converter to return string --- .../ValueConverters/ColorPickerValueConverter.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/ColorPickerValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/ColorPickerValueConverter.cs index bc943b7da0..3766f78b8f 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/ColorPickerValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/ColorPickerValueConverter.cs @@ -1,8 +1,9 @@ -using Umbraco.Core.Models.PublishedContent; +using System; +using Umbraco.Core.Models.PublishedContent; namespace Umbraco.Core.PropertyEditors.ValueConverters { - public class ColorPickerValueConverter : PropertyValueConverterBase + public class ColorPickerValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta { public override bool IsConverter(PublishedPropertyType propertyType) { @@ -14,5 +15,15 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters // make sure it's a string return source.ToString(); } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(string); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) + { + return PropertyCacheLevel.Content; + } } } From a34a8e180df08abbe95025cda04a5c1c43fa02b7 Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Sat, 29 Oct 2016 23:32:56 +0100 Subject: [PATCH 094/841] Added checkbox list converter --- .../CheckboxListValueConverter.cs | 39 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + .../PropertyEditorValueConverterTests.cs | 18 +++++++-- 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/Umbraco.Core/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs new file mode 100644 index 0000000000..c705197dd1 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Core.PropertyEditors.ValueConverters +{ + public class CheckboxListValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.CheckBoxListAlias); + } + + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + var sourceString = (source ?? "").ToString(); + + if (string.IsNullOrEmpty(sourceString)) + return Enumerable.Empty(); + + var values = + sourceString.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(v => v.Trim()); + + return values; + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(IEnumerable); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, + PropertyCacheValue cacheValue) + { + return PropertyCacheLevel.Content; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 9a616ed85c..71dda8db23 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -497,6 +497,7 @@ + diff --git a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs index f9bbc04087..a0c54b4f8b 100644 --- a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs +++ b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs @@ -1,8 +1,7 @@ using System; +using System.Collections.Generic; using NUnit.Framework; -using Umbraco.Core.PropertyEditors; using Umbraco.Core.PropertyEditors.ValueConverters; -using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.PropertyEditors { @@ -58,5 +57,18 @@ namespace Umbraco.Tests.PropertyEditors Assert.AreEqual(expected, result); } - } + + [TestCase("apples", new[] { "apples" })] + [TestCase("apples,oranges", new[] { "apples", "oranges" })] + [TestCase(" apples, oranges, pears ", new[] { "apples", "oranges", "pears" })] + [TestCase("", new string[] { })] + [TestCase(null, new string[] { })] + public void CanConvertCheckboxListPropertyEditor(object value, IEnumerable expected) + { + var converter = new CheckboxListValueConverter(); + var result = converter.ConvertSourceToObject(null, value, false); + + Assert.AreEqual(expected, result); + } + } } From cee92518ea0b6d61d4b449073ae02a9c31ad1350 Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Tue, 1 Nov 2016 21:44:17 +0000 Subject: [PATCH 095/841] Added dropdown list multiple value converter --- .../DropdownListMultipleValueConverter.cs | 39 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + .../PropertyEditorValueConverterTests.cs | 13 +++++++ 3 files changed, 53 insertions(+) create mode 100644 src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleValueConverter.cs diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleValueConverter.cs new file mode 100644 index 0000000000..4e9686b947 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleValueConverter.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Core.PropertyEditors.ValueConverters +{ + public class DropdownListMultipleValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.DropDownListMultipleAlias); + } + + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + var sourceString = (source ?? "").ToString(); + + if (string.IsNullOrEmpty(sourceString)) + return Enumerable.Empty(); + + var values = + sourceString.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(v => v.Trim()); + + return values; + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(IEnumerable); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, + PropertyCacheValue cacheValue) + { + return PropertyCacheLevel.Content; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 71dda8db23..defd2b15ec 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -498,6 +498,7 @@ + diff --git a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs index a0c54b4f8b..3bd03a60ab 100644 --- a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs +++ b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs @@ -70,5 +70,18 @@ namespace Umbraco.Tests.PropertyEditors Assert.AreEqual(expected, result); } + + [TestCase("apples", new[] {"apples"})] + [TestCase("apples,oranges", new[] {"apples", "oranges"})] + [TestCase("apples , oranges, pears ", new[] {"apples", "oranges", "pears"})] + [TestCase("", new string[] {})] + [TestCase(null, new string[] {})] + public void CanConvertDropdownListMultiplePropertyEditor(object value, IEnumerable expected) + { + var converter = new DropdownListMultipleValueConverter(); + var result = converter.ConvertSourceToObject(null, value, false); + + Assert.AreEqual(expected, result); + } } } From 0becdccb689e922615ea6c729095b604128a4ba4 Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Tue, 1 Nov 2016 23:38:05 +0000 Subject: [PATCH 096/841] Added dropdown list multiple with keys value converter --- ...pdownListMultipleWithKeysValueConverter.cs | 42 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + .../PropertyEditorValueConverterTests.cs | 13 ++++++ 3 files changed, 56 insertions(+) create mode 100644 src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleWithKeysValueConverter.cs diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleWithKeysValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleWithKeysValueConverter.cs new file mode 100644 index 0000000000..bea9f94287 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleWithKeysValueConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Core.PropertyEditors.ValueConverters +{ + public class DropdownListMultipleWithKeysValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.InvariantEquals( + Constants.PropertyEditors + .DropdownlistMultiplePublishKeysAlias); + } + + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + if (source == null) + return new int[] { }; + + var prevalueIds = source.ToString() + .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Select(p => p.Trim()) + .Select(int.Parse) + .ToArray(); + + return prevalueIds; + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(IEnumerable); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, + PropertyCacheValue cacheValue) + { + return PropertyCacheLevel.Content; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index defd2b15ec..c1e9b44cc9 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -499,6 +499,7 @@ + diff --git a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs index 3bd03a60ab..8134924c61 100644 --- a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs +++ b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs @@ -83,5 +83,18 @@ namespace Umbraco.Tests.PropertyEditors Assert.AreEqual(expected, result); } + + [TestCase("100", new[] {100})] + [TestCase("100,200", new[] {100, 200})] + [TestCase("100 , 200, 300 ", new[] {100, 200, 300})] + [TestCase("", new int[] {})] + [TestCase(null, new int[] {})] + public void CanConvertDropdownListMultipleWithKeysPropertyEditor(object value, IEnumerable expected) + { + var converter = new DropdownListMultipleWithKeysValueConverter(); + var result = converter.ConvertDataToSource(null, value, false); + + Assert.AreEqual(expected, result); + } } } From bc61054931eb792667fbe4c1dc0ecbab2ebb7fad Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Tue, 1 Nov 2016 23:46:32 +0000 Subject: [PATCH 097/841] Added dropdown list value converter --- .../DropdownListValueConverter.cs | 29 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + 2 files changed, 30 insertions(+) create mode 100644 src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListValueConverter.cs diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListValueConverter.cs new file mode 100644 index 0000000000..d22466d6d7 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListValueConverter.cs @@ -0,0 +1,29 @@ +using System; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Core.PropertyEditors.ValueConverters +{ + public class DropdownListValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.DropDownListAlias); + } + + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + return source == null ? string.Empty : source.ToString(); + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(string); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, + PropertyCacheValue cacheValue) + { + return PropertyCacheLevel.Content; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index c1e9b44cc9..2b481c137c 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -500,6 +500,7 @@ + From a10214d82b6b0e41c7c6d37025f68995c568feeb Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Tue, 1 Nov 2016 23:53:55 +0000 Subject: [PATCH 098/841] Added dropdown with keys value converter --- .../DropdownListWithKeysValueConverter.cs | 35 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + 2 files changed, 36 insertions(+) create mode 100644 src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListWithKeysValueConverter.cs diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListWithKeysValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListWithKeysValueConverter.cs new file mode 100644 index 0000000000..7560340f8c --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListWithKeysValueConverter.cs @@ -0,0 +1,35 @@ +using System; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Core.PropertyEditors.ValueConverters +{ + public class DropdownListWithKeysValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + return + propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors + .DropdownlistPublishingKeysAlias); + } + + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + var intAttempt = source.TryConvertTo(); + if (intAttempt.Success) + return intAttempt.Result; + + return null; + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(int); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, + PropertyCacheValue cacheValue) + { + return PropertyCacheLevel.Content; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 2b481c137c..4ce9018204 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -501,6 +501,7 @@ + From db02c3b73c8d3b86524ddf01d8cf02e9de08089d Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Wed, 2 Nov 2016 21:26:41 +0000 Subject: [PATCH 099/841] Added member group picker value converter --- .../MemberGroupPickerValueConverter.cs | 29 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + 2 files changed, 30 insertions(+) create mode 100644 src/Umbraco.Core/PropertyEditors/ValueConverters/MemberGroupPickerValueConverter.cs diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/MemberGroupPickerValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/MemberGroupPickerValueConverter.cs new file mode 100644 index 0000000000..a962fb55aa --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/MemberGroupPickerValueConverter.cs @@ -0,0 +1,29 @@ +using System; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Core.PropertyEditors.ValueConverters +{ + public class MemberGroupPickerValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.MemberGroupPickerAlias); + } + + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + return source == null ? string.Empty : source.ToString(); + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(string); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, + PropertyCacheValue cacheValue) + { + return PropertyCacheLevel.Content; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 4ce9018204..d47b7b6e05 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -507,6 +507,7 @@ + From d787cb6ad99ba55fd85e9c815173c9b4d406d443 Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Wed, 2 Nov 2016 21:35:42 +0000 Subject: [PATCH 100/841] Added radio button list converter --- .../RadioButtonListValueConverter.cs | 33 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + 2 files changed, 34 insertions(+) create mode 100644 src/Umbraco.Core/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs new file mode 100644 index 0000000000..6ea35ba1c2 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs @@ -0,0 +1,33 @@ +using System; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Core.PropertyEditors.ValueConverters +{ + public class RadioButtonListValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.RadioButtonListAlias); + } + + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + var intAttempt = source.TryConvertTo(); + if (intAttempt.Success) + return intAttempt.Result; + + return null; + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(int); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, + PropertyCacheValue cacheValue) + { + return PropertyCacheLevel.Content; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index d47b7b6e05..882bce2cb7 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -508,6 +508,7 @@ + From 12f9392db9411a9b0f57ae69cdec671427a3a644 Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Wed, 2 Nov 2016 21:52:27 +0000 Subject: [PATCH 101/841] Added user picker value converter --- .../UserPickerValueConverter.cs | 85 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + 2 files changed, 86 insertions(+) create mode 100644 src/Umbraco.Core/PropertyEditors/ValueConverters/UserPickerValueConverter.cs diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/UserPickerValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/UserPickerValueConverter.cs new file mode 100644 index 0000000000..668b250142 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/UserPickerValueConverter.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Services; + +namespace Umbraco.Core.PropertyEditors.ValueConverters +{ + public class UserPickerValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + private readonly IUserService _userService; + + public UserPickerValueConverter() + { + _userService = ApplicationContext.Current.Services.UserService; + } + + public UserPickerValueConverter(IUserService userService) + { + Mandate.That(userService != null); + _userService = userService; + } + + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.UserPickerAlias); + } + + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + var intAttempt = source.TryConvertTo(); + if (intAttempt.Success) + return intAttempt.Result; + + return null; + } + + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + if (source == null) + { + return null; + } + + var userId = (int) source; + var user = _userService.GetUserById(userId); + if (user != null) + { + return user; + } + + return userId; + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(IUser); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) + { + PropertyCacheLevel returnLevel; + switch (cacheValue) + { + case PropertyCacheValue.Object: + returnLevel = PropertyCacheLevel.ContentCache; + break; + case PropertyCacheValue.Source: + returnLevel = PropertyCacheLevel.Content; + break; + case PropertyCacheValue.XPath: + returnLevel = PropertyCacheLevel.Content; + break; + default: + returnLevel = PropertyCacheLevel.None; + break; + } + + return returnLevel; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 882bce2cb7..34a8046183 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -509,6 +509,7 @@ + From 3c43f4f3c5c7f99a10c574aa6b39d503acec7fdb Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Wed, 2 Nov 2016 23:37:32 +0000 Subject: [PATCH 102/841] Added member picker value converter --- .../MemberPickerPropertyConverter.cs | 68 +++++++++++++++++++ src/Umbraco.Web/Umbraco.Web.csproj | 1 + 2 files changed, 69 insertions(+) create mode 100644 src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs new file mode 100644 index 0000000000..607424cb66 --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs @@ -0,0 +1,68 @@ +using System; +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Security; + +namespace Umbraco.Web.PropertyEditors.ValueConverters +{ + public class MemberPickerPropertyConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.MemberPickerAlias); + } + + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + var intAttempt = source.TryConvertTo(); + if (intAttempt.Success) + return intAttempt.Result; + + return null; + } + + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + if (source == null) + return null; + + if (UmbracoContext.Current != null) + { + var membershipHelper = new MembershipHelper(UmbracoContext.Current); + return membershipHelper.GetById((int) source); + } + + return null; + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(IPublishedContent); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, + PropertyCacheValue cacheValue) + { + PropertyCacheLevel returnLevel; + switch (cacheValue) + { + case PropertyCacheValue.Object: + returnLevel = PropertyCacheLevel.ContentCache; + break; + case PropertyCacheValue.Source: + returnLevel = PropertyCacheLevel.Content; + break; + case PropertyCacheValue.XPath: + returnLevel = PropertyCacheLevel.Content; + break; + default: + returnLevel = PropertyCacheLevel.None; + break; + } + + return returnLevel; + } + } +} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index a70a00ffb4..ad40c1a764 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -398,6 +398,7 @@ + From be8632db1c3b8b2885b3c1d03c9be9ce41e29299 Mon Sep 17 00:00:00 2001 From: Jeavon Date: Thu, 3 Nov 2016 13:30:41 +0000 Subject: [PATCH 103/841] Adding EnablePropertyValueConverters setting to umbracoSettings.config so that all the new converters can be disabled. Readded existing JArray converter for RelatedLinks but renamed to LegacyRelatedLinksEditorValueConvertor --- .../UmbracoSettings/ContentElement.cs | 16 + .../UmbracoSettings/IContentSection.cs | 3 + .../config/umbracoSettings.config | 4 +- .../ContentPickerPropertyConverter.cs | 7 +- .../LegacyRelatedLinksEditorValueConvertor.cs | 111 + .../MultiNodeTreePickerPropertyConverter.cs | 7 +- .../MultipleMediaPickerPropertyConverter.cs | 7 +- .../RelatedLinksEditorValueConvertor.cs | 7 +- src/Umbraco.Web/Umbraco.Web.csproj | 4553 +++++++++-------- 9 files changed, 2434 insertions(+), 2281 deletions(-) create mode 100644 src/Umbraco.Web/PropertyEditors/ValueConverters/LegacyRelatedLinksEditorValueConvertor.cs diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings/ContentElement.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/ContentElement.cs index d743daca6a..7169a3a80b 100644 --- a/src/Umbraco.Core/Configuration/UmbracoSettings/ContentElement.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings/ContentElement.cs @@ -304,6 +304,18 @@ namespace Umbraco.Core.Configuration.UmbracoSettings } } + [ConfigurationProperty("EnablePropertyValueConverters")] + internal InnerTextConfigurationElement EnablePropertyValueConverters + { + get + { + return new OptionalInnerTextConfigurationElement( + (InnerTextConfigurationElement)this["EnablePropertyValueConverters"], + //set the default + false); + } + } + string IContentSection.NotificationEmailAddress { get { return Notifications.NotificationEmailAddress; } @@ -448,5 +460,9 @@ namespace Umbraco.Core.Configuration.UmbracoSettings { get { return EnableInheritedMediaTypes; } } + bool IContentSection.EnablePropertyValueConverters + { + get { return EnablePropertyValueConverters; } + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings/IContentSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IContentSection.cs index 3d5e4435b6..4b9c0304ce 100644 --- a/src/Umbraco.Core/Configuration/UmbracoSettings/IContentSection.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings/IContentSection.cs @@ -63,5 +63,8 @@ namespace Umbraco.Core.Configuration.UmbracoSettings bool EnableInheritedDocumentTypes { get; } bool EnableInheritedMediaTypes { get; } + + bool EnablePropertyValueConverters { get; } + } } \ No newline at end of file diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.config b/src/Umbraco.Web.UI/config/umbracoSettings.config index 9eb3f135e9..517a187f4b 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.config @@ -104,7 +104,9 @@ Textstring - + + + false diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs index 643e936c06..2ea058eca2 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerPropertyConverter.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Globalization; using Umbraco.Core; +using Umbraco.Core.Configuration; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; @@ -43,7 +44,11 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters /// public override bool IsConverter(PublishedPropertyType propertyType) { - return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.ContentPickerAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.ContentPickerAlias); + } + return false; } /// diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/LegacyRelatedLinksEditorValueConvertor.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/LegacyRelatedLinksEditorValueConvertor.cs new file mode 100644 index 0000000000..28a20cfd00 --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/LegacyRelatedLinksEditorValueConvertor.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Umbraco.Core; +using Umbraco.Core.Configuration; +using Umbraco.Core.Logging; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.PropertyEditors; +using Umbraco.Core.PropertyEditors.ValueConverters; + +namespace Umbraco.Web.PropertyEditors.ValueConverters +{ + [PropertyValueType(typeof(JArray))] + [PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.Content)] + [DefaultPropertyValueConverter(typeof(JsonValueConverter))] //this shadows the JsonValueConverter + public class LegacyRelatedLinksEditorValueConvertor : PropertyValueConverterBase + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters == false) + { + return Constants.PropertyEditors.RelatedLinksAlias.Equals(propertyType.PropertyEditorAlias); + } + return false; + } + + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + if (source == null) return null; + var sourceString = source.ToString(); + + if (sourceString.DetectIsJson()) + { + try + { + var obj = JsonConvert.DeserializeObject(sourceString); + //update the internal links if we have a context + if (UmbracoContext.Current != null) + { + var helper = new UmbracoHelper(UmbracoContext.Current); + foreach (var a in obj) + { + var type = a.Value("type"); + if (type.IsNullOrWhiteSpace() == false) + { + if (type == "internal") + { + var linkId = a.Value("link"); + var link = helper.NiceUrl(linkId); + a["link"] = link; + } + } + } + } + return obj; + } + catch (Exception ex) + { + LogHelper.Error("Could not parse the string " + sourceString + " to a json object", ex); + } + } + + //it's not json, just return the string + return sourceString; + } + + public override object ConvertSourceToXPath(PublishedPropertyType propertyType, object source, bool preview) + { + if (source == null) return null; + var sourceString = source.ToString(); + + if (sourceString.DetectIsJson()) + { + try + { + var obj = JsonConvert.DeserializeObject(sourceString); + + var d = new XmlDocument(); + var e = d.CreateElement("links"); + d.AppendChild(e); + + var values = (IEnumerable)source; + foreach (dynamic link in obj) + { + var ee = d.CreateElement("link"); + ee.SetAttribute("title", link.title); + ee.SetAttribute("link", link.link); + ee.SetAttribute("type", link.type); + ee.SetAttribute("newwindow", link.newWindow); + + e.AppendChild(ee); + } + + return d.CreateNavigator(); + } + catch (Exception ex) + { + LogHelper.Error("Could not parse the string " + sourceString + " to a json object", ex); + } + } + + //it's not json, just return the string + return sourceString; + } + } +} diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs index 8ff03faf8c..9a18c0948a 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerPropertyConverter.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using Umbraco.Core; +using Umbraco.Core.Configuration; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; @@ -44,7 +45,11 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters /// public override bool IsConverter(PublishedPropertyType propertyType) { - return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.MultiNodeTreePickerAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.MultiNodeTreePickerAlias); + } + return false; } /// diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs index 1b501c31fd..2b9ee988bb 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core; +using Umbraco.Core.Configuration; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; @@ -35,7 +36,11 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters /// public override bool IsConverter(PublishedPropertyType propertyType) { - return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.MultipleMediaPickerAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.MultipleMediaPickerAlias); + } + return false; } /// diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs index 906dd95f2c..3940d3b850 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/RelatedLinksEditorValueConvertor.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using Newtonsoft.Json; using Umbraco.Core; +using Umbraco.Core.Configuration; using Umbraco.Core.Logging; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; @@ -35,7 +36,11 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters /// public override bool IsConverter(PublishedPropertyType propertyType) { - return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.RelatedLinksAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditors.RelatedLinksAlias); + } + return false; } /// diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 56441f29f2..ace135d0a8 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -1,2278 +1,2279 @@ - - - - - 9.0.30729 - 2.0 - {651E1350-91B6-44B7-BD60-7207006D7003} - Debug - AnyCPU - - - - - umbraco - - - JScript - Grid - IE50 - false - Library - Umbraco.Web - OnBuildSuccess - - - - - - - - - - - - - - - 4.0 - v4.5 - - ..\ - true - - - bin\Debug\ - false - 285212672 - false - - - DEBUG;TRACE - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - false - Off - - - bin\Release\ - false - 285212672 - false - - - TRACE - bin\Release\umbraco.xml - true - 4096 - false - - - true - false - false - false - 4 - pdbonly - prompt - AllRules.ruleset - false - Off - - - - {07fbc26b-2927-4a22-8d96-d644c667fecc} - UmbracoExamine - - - ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll - True - - - ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll - True - - - ..\packages\ClientDependency.1.9.1\lib\net45\ClientDependency.Core.dll - True - - - False - ..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll - - - ..\packages\dotless.1.4.1.0\lib\dotless.Core.dll - - - ..\packages\Examine.0.1.70.0\lib\Examine.dll - True - - - False - ..\packages\HtmlAgilityPack.1.4.9\lib\Net45\HtmlAgilityPack.dll - - - False - ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll - - - False - ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll - - - ..\packages\Markdown.1.14.7\lib\net45\MarkdownSharp.dll - True - - - False - ..\packages\Microsoft.AspNet.Identity.Core.2.2.1\lib\net45\Microsoft.AspNet.Identity.Core.dll - - - False - ..\packages\Microsoft.AspNet.Identity.Owin.2.2.1\lib\net45\Microsoft.AspNet.Identity.Owin.dll - - - - False - ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll - - - False - ..\packages\Microsoft.Owin.Host.SystemWeb.3.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll - - - False - ..\packages\Microsoft.Owin.Security.3.0.1\lib\net45\Microsoft.Owin.Security.dll - - - False - ..\packages\Microsoft.Owin.Security.Cookies.3.0.1\lib\net45\Microsoft.Owin.Security.Cookies.dll - - - False - ..\packages\Microsoft.Owin.Security.OAuth.3.0.1\lib\net45\Microsoft.Owin.Security.OAuth.dll - - - ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll - False - True - - - False - ..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll - - - ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll - False - True - - - False - ..\packages\Owin.1.0\lib\net40\Owin.dll - - - False - ..\packages\semver.1.1.2\lib\net45\Semver.dll - - - System - - - - - System.Data - - - - - System.Drawing - - - - - - False - ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll - - - - - - 3.5 - - - - - - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll - False - True - - - ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll - True - - - False - ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll - - - ..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll - True - - - ..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll - False - True - - - System.Web.Services - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll - False - True - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll - False - True - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll - False - True - - - - System.XML - - - - {5BA5425F-27A7-4677-865E-82246498AA2E} - SqlCE4Umbraco - - - {31785BC3-256C-4613-B2F5-A1B0BDDED8C1} - Umbraco.Core - - - {6EDD2061-82F2-461B-BB6E-879245A832DE} - umbraco.controls - - - umbraco.businesslogic - {E469A9CE-1BEC-423F-AC44-713CD72457EA} - {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - {CCD75EC3-63DB-4184-B49D-51C1DD337230} - umbraco.cms - - - {C7CB79F0-1C97-4B33-BFA7-00731B579AE2} - umbraco.datalayer - - - umbraco.interfaces - {511F6D8D-7717-440A-9A57-A507E9A8B27F} - {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - {D7636876-0756-43CB-A192-138C6F0D5E42} - umbraco.providers - - - ..\packages\UrlRewritingNet.UrlRewriter.2.0.7\lib\UrlRewritingNet.UrlRewriter.dll - False - False - - - - - Properties\SolutionInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + 9.0.30729 + 2.0 + {651E1350-91B6-44B7-BD60-7207006D7003} + Debug + AnyCPU + + + + + umbraco + + + JScript + Grid + IE50 + false + Library + Umbraco.Web + OnBuildSuccess + + + + + + + + + + + + + + + 4.0 + v4.5 + + ..\ + true + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + AllRules.ruleset + false + Off + + + bin\Release\ + false + 285212672 + false + + + TRACE + bin\Release\umbraco.xml + true + 4096 + false + + + true + false + false + false + 4 + pdbonly + prompt + AllRules.ruleset + false + Off + + + + {07fbc26b-2927-4a22-8d96-d644c667fecc} + UmbracoExamine + + + ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll + True + + + ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll + True + + + ..\packages\ClientDependency.1.9.1\lib\net45\ClientDependency.Core.dll + True + + + False + ..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll + + + ..\packages\dotless.1.4.1.0\lib\dotless.Core.dll + + + ..\packages\Examine.0.1.70.0\lib\Examine.dll + True + + + False + ..\packages\HtmlAgilityPack.1.4.9\lib\Net45\HtmlAgilityPack.dll + + + False + ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll + + + False + ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll + + + ..\packages\Markdown.1.14.7\lib\net45\MarkdownSharp.dll + True + + + False + ..\packages\Microsoft.AspNet.Identity.Core.2.2.1\lib\net45\Microsoft.AspNet.Identity.Core.dll + + + False + ..\packages\Microsoft.AspNet.Identity.Owin.2.2.1\lib\net45\Microsoft.AspNet.Identity.Owin.dll + + + + False + ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll + + + False + ..\packages\Microsoft.Owin.Host.SystemWeb.3.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll + + + False + ..\packages\Microsoft.Owin.Security.3.0.1\lib\net45\Microsoft.Owin.Security.dll + + + False + ..\packages\Microsoft.Owin.Security.Cookies.3.0.1\lib\net45\Microsoft.Owin.Security.Cookies.dll + + + False + ..\packages\Microsoft.Owin.Security.OAuth.3.0.1\lib\net45\Microsoft.Owin.Security.OAuth.dll + + + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + False + True + + + False + ..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll + + + ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll + False + True + + + False + ..\packages\Owin.1.0\lib\net40\Owin.dll + + + False + ..\packages\semver.1.1.2\lib\net45\Semver.dll + + + System + + + + + System.Data + + + + + System.Drawing + + + + + + False + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + + + + + + 3.5 + + + + + + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll + False + True + + + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll + True + + + False + ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll + + + ..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll + True + + + ..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll + False + True + + + System.Web.Services + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll + False + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll + False + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll + False + True + + + + System.XML + + + + {5BA5425F-27A7-4677-865E-82246498AA2E} + SqlCE4Umbraco + + + {31785BC3-256C-4613-B2F5-A1B0BDDED8C1} + Umbraco.Core + + + {6EDD2061-82F2-461B-BB6E-879245A832DE} + umbraco.controls + + + umbraco.businesslogic + {E469A9CE-1BEC-423F-AC44-713CD72457EA} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + {CCD75EC3-63DB-4184-B49D-51C1DD337230} + umbraco.cms + + + {C7CB79F0-1C97-4B33-BFA7-00731B579AE2} + umbraco.datalayer + + + umbraco.interfaces + {511F6D8D-7717-440A-9A57-A507E9A8B27F} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + {D7636876-0756-43CB-A192-138C6F0D5E42} + umbraco.providers + + + ..\packages\UrlRewritingNet.UrlRewriter.2.0.7\lib\UrlRewritingNet.UrlRewriter.dll + False + False + + + + + Properties\SolutionInfo.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - - - True - True - Reference.map - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - - - - - - - - - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - AssignDomain2.aspx - ASPXCodeBehind - - - AssignDomain2.aspx - - - ASPXCodeBehind - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ASPXCodeBehind - - - - - - - - - - - - - - - - - - - - - True - True - Strings.resx - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - ASPXCodeBehind - - - - - ASPXCodeBehind - - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ASPXCodeBehind - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Code - - - - Code - - - Code - - - Code - - - Code - - - Code - - - - Code - - - True - True - Settings.settings - - - Code - - - - - Code - - - Code - - - Code - - - Code - - - - ASPXCodeBehind - - - Code - - - Code - - - Code - - - - delete.aspx - ASPXCodeBehind - - - delete.aspx - - - editContent.aspx - ASPXCodeBehind - - - editContent.aspx - - - preview.aspx - ASPXCodeBehind - - - preview.aspx - - - publish.aspx - ASPXCodeBehind - - - publish.aspx - - - - - - - - - - - - - - ASPXCodeBehind - - - ImageViewerUpdater.asmx - Component - - - UploadMediaImage.ascx - ASPXCodeBehind - - - UploadMediaImage.ascx - - - - - - - ProgressBar.ascx - ASPXCodeBehind - - - ProgressBar.ascx - - - - ASPXCodeBehind - - - Component - - - - - Code - - - - - - - - - - - - - - FeedProxy.aspx - ASPXCodeBehind - - - FeedProxy.aspx - - - EditRelationType.aspx - ASPXCodeBehind - - - EditRelationType.aspx - - - NewRelationType.aspx - ASPXCodeBehind - - - NewRelationType.aspx - - - - RelationTypesWebService.asmx - Component - - - - - Preview.aspx - ASPXCodeBehind - - - Preview.aspx - - - MemberSearch.ascx - ASPXCodeBehind - - - MemberSearch.ascx - - - - - - xsltVisualize.aspx - ASPXCodeBehind - - - xsltVisualize.aspx - - - insertMasterpageContent.aspx - ASPXCodeBehind - - - insertMasterpageContent.aspx - - - insertMasterpagePlaceholder.aspx - ASPXCodeBehind - - - insertMasterpagePlaceholder.aspx - - - mediaPicker.aspx - ASPXCodeBehind - - - mediaPicker.aspx - - - republish.aspx - ASPXCodeBehind - - - republish.aspx - - - search.aspx - ASPXCodeBehind - - - search.aspx - - - SendPublish.aspx - ASPXCodeBehind - - - SendPublish.aspx - - - Code - - - Code - - - LatestEdits.ascx - ASPXCodeBehind - - - LatestEdits.ascx - - - assemblyBrowser.aspx - ASPXCodeBehind - - - assemblyBrowser.aspx - - - autoDoc.aspx - ASPXCodeBehind - - - autoDoc.aspx - - - BrowseRepository.aspx - ASPXCodeBehind - - - BrowseRepository.aspx - - - editPackage.aspx - ASPXCodeBehind - - - editPackage.aspx - - - installedPackage.aspx - ASPXCodeBehind - - - installedPackage.aspx - - - LoadNitros.ascx - ASPXCodeBehind - - - LoadNitros.ascx - - - SubmitPackage.aspx - ASPXCodeBehind - - - SubmitPackage.aspx - - - getXsltStatus.asmx - Component - - - xsltChooseExtension.aspx - ASPXCodeBehind - - - xsltChooseExtension.aspx - - - xsltInsertValueOf.aspx - ASPXCodeBehind - - - xsltInsertValueOf.aspx - - - about.aspx - ASPXCodeBehind - - - about.aspx - - - exportDocumenttype.aspx - ASPXCodeBehind - - - imageViewer.aspx - ASPXCodeBehind - - - imageViewer.aspx - - - importDocumenttype.aspx - ASPXCodeBehind - - - insertMacro.aspx - ASPXCodeBehind - - - insertMacro.aspx - - - insertTable.aspx - ASPXCodeBehind - - - insertTable.aspx - - - notifications.aspx - ASPXCodeBehind - - - notifications.aspx - - - RegexWs.aspx - ASPXCodeBehind - - - RegexWs.aspx - - - rollBack.aspx - ASPXCodeBehind - - - rollBack.aspx - - - sendToTranslation.aspx - ASPXCodeBehind - - - sendToTranslation.aspx - - - uploadImage.aspx - ASPXCodeBehind - - - uploadImage.aspx - - - viewAuditTrail.aspx - ASPXCodeBehind - - - viewAuditTrail.aspx - - - language.aspx - ASPXCodeBehind - - - language.aspx - - - EditMemberGroup.aspx - ASPXCodeBehind - - - EditMemberGroup.aspx - - - search.aspx - ASPXCodeBehind - - - search.aspx - - - ViewMembers.aspx - ASPXCodeBehind - - - ViewMembers.aspx - - - Code - - - - - - - InsertAnchor.aspx - ASPXCodeBehind - - - InsertAnchor.aspx - - - insertChar.aspx - ASPXCodeBehind - - - insertChar.aspx - - - insertImage.aspx - ASPXCodeBehind - - - insertImage.aspx - - - insertLink.aspx - ASPXCodeBehind - - - insertLink.aspx - - - insertMacro.aspx - ASPXCodeBehind - - - insertMacro.aspx - - - - - - tinymce3tinymceCompress.aspx - ASPXCodeBehind - - - tinymce3tinymceCompress.aspx - - - QuickSearchHandler.ashx - - - DictionaryItemList.aspx - ASPXCodeBehind - - - DictionaryItemList.aspx - - - EditDictionaryItem.aspx - ASPXCodeBehind - - - EditDictionaryItem.aspx - - - editLanguage.aspx - ASPXCodeBehind - - - editLanguage.aspx - - - editScript.aspx - ASPXCodeBehind - - - - - - Code - - - - - - - - - - - - - - - - - MacroContainerService.asmx - Component - - - MediaUploader.ashx - - - TagsAutoCompleteHandler.ashx - - - TreeClientService.asmx - Component - - - - - - - - True - True - Resources.resx - - - default.aspx - ASPXCodeBehind - - - default.aspx - - - details.aspx - ASPXCodeBehind - - - details.aspx - - - preview.aspx - ASPXCodeBehind - - - preview.aspx - - - xml.aspx - ASPXCodeBehind - - - xml.aspx - - - ASPXCodeBehind - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TreeDataService.ashx - - - - - - - - - XmlTree.xsd - - - - EditUserType.aspx - ASPXCodeBehind - - - EditUserType.aspx - - - NodePermissions.ascx - ASPXCodeBehind - - - NodePermissions.ascx - - - PermissionEditor.aspx - ASPXCodeBehind - - - PermissionEditor.aspx - - - PermissionsHandler.asmx - Component - - - - - - CacheRefresher.asmx - Component - - - CheckForUpgrade.asmx - Component - - - CMSNode.asmx - Component - - - codeEditorSave.asmx - Component - - - Developer.asmx - Component - - - legacyAjaxCalls.asmx - Component - - - nodeSorter.asmx - Component - - - progressStatus.asmx - Component - - - publication.asmx - Component - - - - Settings.asmx - Component - - - templates.asmx - Component - - - trashcan.asmx - Component - - - UltimatePickerAutoCompleteHandler.ashx - - - ASPXCodeBehind - - - - uQuery.cs - - - uQuery.cs - - - uQuery.cs - - - uQuery.cs - - - uQuery.cs - - - uQuery.cs - - - uQuery.cs - - - uQuery.cs - - - uQuery.cs - - - - - - - - - - - True - True - Reference.map - - - - - - - - - - - - - Component - - - - Component - - - - - Mvc\web.config - - - MSDiscoCodeGenerator - Reference.cs - - - - - - - - - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - ASPXCodeBehind - - - - ASPXCodeBehind - - - - - - ASPXCodeBehind - - - - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - - - - - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - - ASPXCodeBehind - - - - - - ASPXCodeBehind - - - - ASPXCodeBehind - - - - ASPXCodeBehind - - - - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - - Designer - - - - Reference.map - - - Reference.map - - - SettingsSingleFileGenerator - Settings1.Designer.cs - - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - - ASPXCodeBehind - - - ASPXCodeBehind - - - - - - ASPXCodeBehind - - - - - - - - ASPXCodeBehind - - - Form - - - Designer - - - ASPXCodeBehind - - - - ASPXCodeBehind - - - - Form - - - - - - - - Form - - - - Form - - - - - - - - - - - XmlTree.xsd - - - - - - - - MSDiscoCodeGenerator - Reference.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - ResXFileCodeGenerator - Strings.Designer.cs - - - language.aspx.cs - Designer - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - - - - - package.xsd - - - umbraco.xsd - - - umbraco.xsd - - - umbraco.xsd - - - - - - - - Dynamic - Web References\org.umbraco.our\ - http://our.umbraco.org/umbraco/webservices/api/repository.asmx - - - - - Settings - umbraco_org_umbraco_our_Repository - - - Dynamic - Web References\org.umbraco.update\ - http://update.umbraco.org/checkforupgrade.asmx - - - - - Settings - umbraco_org_umbraco_update_CheckForUpgrade - - - - 11.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v11.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0 - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + + + True + True + Reference.map + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + + + + + + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + AssignDomain2.aspx + ASPXCodeBehind + + + AssignDomain2.aspx + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ASPXCodeBehind + + + + + + + + + + + + + + + + + + + + + True + True + Strings.resx + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + + + ASPXCodeBehind + + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ASPXCodeBehind + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Code + + + + Code + + + Code + + + Code + + + Code + + + Code + + + + Code + + + True + True + Settings.settings + + + Code + + + + + Code + + + Code + + + Code + + + Code + + + + ASPXCodeBehind + + + Code + + + Code + + + Code + + + + delete.aspx + ASPXCodeBehind + + + delete.aspx + + + editContent.aspx + ASPXCodeBehind + + + editContent.aspx + + + preview.aspx + ASPXCodeBehind + + + preview.aspx + + + publish.aspx + ASPXCodeBehind + + + publish.aspx + + + + + + + + + + + + + + ASPXCodeBehind + + + ImageViewerUpdater.asmx + Component + + + UploadMediaImage.ascx + ASPXCodeBehind + + + UploadMediaImage.ascx + + + + + + + ProgressBar.ascx + ASPXCodeBehind + + + ProgressBar.ascx + + + + ASPXCodeBehind + + + Component + + + + + Code + + + + + + + + + + + + + + FeedProxy.aspx + ASPXCodeBehind + + + FeedProxy.aspx + + + EditRelationType.aspx + ASPXCodeBehind + + + EditRelationType.aspx + + + NewRelationType.aspx + ASPXCodeBehind + + + NewRelationType.aspx + + + + RelationTypesWebService.asmx + Component + + + + + Preview.aspx + ASPXCodeBehind + + + Preview.aspx + + + MemberSearch.ascx + ASPXCodeBehind + + + MemberSearch.ascx + + + + + + xsltVisualize.aspx + ASPXCodeBehind + + + xsltVisualize.aspx + + + insertMasterpageContent.aspx + ASPXCodeBehind + + + insertMasterpageContent.aspx + + + insertMasterpagePlaceholder.aspx + ASPXCodeBehind + + + insertMasterpagePlaceholder.aspx + + + mediaPicker.aspx + ASPXCodeBehind + + + mediaPicker.aspx + + + republish.aspx + ASPXCodeBehind + + + republish.aspx + + + search.aspx + ASPXCodeBehind + + + search.aspx + + + SendPublish.aspx + ASPXCodeBehind + + + SendPublish.aspx + + + Code + + + Code + + + LatestEdits.ascx + ASPXCodeBehind + + + LatestEdits.ascx + + + assemblyBrowser.aspx + ASPXCodeBehind + + + assemblyBrowser.aspx + + + autoDoc.aspx + ASPXCodeBehind + + + autoDoc.aspx + + + BrowseRepository.aspx + ASPXCodeBehind + + + BrowseRepository.aspx + + + editPackage.aspx + ASPXCodeBehind + + + editPackage.aspx + + + installedPackage.aspx + ASPXCodeBehind + + + installedPackage.aspx + + + LoadNitros.ascx + ASPXCodeBehind + + + LoadNitros.ascx + + + SubmitPackage.aspx + ASPXCodeBehind + + + SubmitPackage.aspx + + + getXsltStatus.asmx + Component + + + xsltChooseExtension.aspx + ASPXCodeBehind + + + xsltChooseExtension.aspx + + + xsltInsertValueOf.aspx + ASPXCodeBehind + + + xsltInsertValueOf.aspx + + + about.aspx + ASPXCodeBehind + + + about.aspx + + + exportDocumenttype.aspx + ASPXCodeBehind + + + imageViewer.aspx + ASPXCodeBehind + + + imageViewer.aspx + + + importDocumenttype.aspx + ASPXCodeBehind + + + insertMacro.aspx + ASPXCodeBehind + + + insertMacro.aspx + + + insertTable.aspx + ASPXCodeBehind + + + insertTable.aspx + + + notifications.aspx + ASPXCodeBehind + + + notifications.aspx + + + RegexWs.aspx + ASPXCodeBehind + + + RegexWs.aspx + + + rollBack.aspx + ASPXCodeBehind + + + rollBack.aspx + + + sendToTranslation.aspx + ASPXCodeBehind + + + sendToTranslation.aspx + + + uploadImage.aspx + ASPXCodeBehind + + + uploadImage.aspx + + + viewAuditTrail.aspx + ASPXCodeBehind + + + viewAuditTrail.aspx + + + language.aspx + ASPXCodeBehind + + + language.aspx + + + EditMemberGroup.aspx + ASPXCodeBehind + + + EditMemberGroup.aspx + + + search.aspx + ASPXCodeBehind + + + search.aspx + + + ViewMembers.aspx + ASPXCodeBehind + + + ViewMembers.aspx + + + Code + + + + + + + InsertAnchor.aspx + ASPXCodeBehind + + + InsertAnchor.aspx + + + insertChar.aspx + ASPXCodeBehind + + + insertChar.aspx + + + insertImage.aspx + ASPXCodeBehind + + + insertImage.aspx + + + insertLink.aspx + ASPXCodeBehind + + + insertLink.aspx + + + insertMacro.aspx + ASPXCodeBehind + + + insertMacro.aspx + + + + + + tinymce3tinymceCompress.aspx + ASPXCodeBehind + + + tinymce3tinymceCompress.aspx + + + QuickSearchHandler.ashx + + + DictionaryItemList.aspx + ASPXCodeBehind + + + DictionaryItemList.aspx + + + EditDictionaryItem.aspx + ASPXCodeBehind + + + EditDictionaryItem.aspx + + + editLanguage.aspx + ASPXCodeBehind + + + editLanguage.aspx + + + editScript.aspx + ASPXCodeBehind + + + + + + Code + + + + + + + + + + + + + + + + + MacroContainerService.asmx + Component + + + MediaUploader.ashx + + + TagsAutoCompleteHandler.ashx + + + TreeClientService.asmx + Component + + + + + + + + True + True + Resources.resx + + + default.aspx + ASPXCodeBehind + + + default.aspx + + + details.aspx + ASPXCodeBehind + + + details.aspx + + + preview.aspx + ASPXCodeBehind + + + preview.aspx + + + xml.aspx + ASPXCodeBehind + + + xml.aspx + + + ASPXCodeBehind + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TreeDataService.ashx + + + + + + + + + XmlTree.xsd + + + + EditUserType.aspx + ASPXCodeBehind + + + EditUserType.aspx + + + NodePermissions.ascx + ASPXCodeBehind + + + NodePermissions.ascx + + + PermissionEditor.aspx + ASPXCodeBehind + + + PermissionEditor.aspx + + + PermissionsHandler.asmx + Component + + + + + + CacheRefresher.asmx + Component + + + CheckForUpgrade.asmx + Component + + + CMSNode.asmx + Component + + + codeEditorSave.asmx + Component + + + Developer.asmx + Component + + + legacyAjaxCalls.asmx + Component + + + nodeSorter.asmx + Component + + + progressStatus.asmx + Component + + + publication.asmx + Component + + + + Settings.asmx + Component + + + templates.asmx + Component + + + trashcan.asmx + Component + + + UltimatePickerAutoCompleteHandler.ashx + + + ASPXCodeBehind + + + + uQuery.cs + + + uQuery.cs + + + uQuery.cs + + + uQuery.cs + + + uQuery.cs + + + uQuery.cs + + + uQuery.cs + + + uQuery.cs + + + uQuery.cs + + + + + + + + + + + True + True + Reference.map + + + + + + + + + + + + + Component + + + + Component + + + + + Mvc\web.config + + + MSDiscoCodeGenerator + Reference.cs + + + + + + + + + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + + + + ASPXCodeBehind + + + + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + + + + + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + + ASPXCodeBehind + + + + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + + Designer + + + + Reference.map + + + Reference.map + + + SettingsSingleFileGenerator + Settings1.Designer.cs + + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + + ASPXCodeBehind + + + ASPXCodeBehind + + + + + + ASPXCodeBehind + + + + + + + + ASPXCodeBehind + + + Form + + + Designer + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + + Form + + + + + + + + Form + + + + Form + + + + + + + + + + + XmlTree.xsd + + + + + + + + MSDiscoCodeGenerator + Reference.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + ResXFileCodeGenerator + Strings.Designer.cs + + + language.aspx.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + + + + + package.xsd + + + umbraco.xsd + + + umbraco.xsd + + + umbraco.xsd + + + + + + + + Dynamic + Web References\org.umbraco.our\ + http://our.umbraco.org/umbraco/webservices/api/repository.asmx + + + + + Settings + umbraco_org_umbraco_our_Repository + + + Dynamic + Web References\org.umbraco.update\ + http://update.umbraco.org/checkforupgrade.asmx + + + + + Settings + umbraco_org_umbraco_update_CheckForUpgrade + + + + 11.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v11.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0 + + + + + + + + + + + + + + + + \ No newline at end of file From 392319d26c3acff87e0c314265a6991d29ddf6f6 Mon Sep 17 00:00:00 2001 From: Jeavon Date: Thu, 3 Nov 2016 16:43:23 +0000 Subject: [PATCH 104/841] Adding check for converter enablement to James's converters that need it --- .../ValueConverters/CheckboxListValueConverter.cs | 7 ++++++- .../ValueConverters/ColorPickerValueConverter.cs | 7 ++++++- .../DropdownListMultipleValueConverter.cs | 7 ++++++- .../DropdownListMultipleWithKeysValueConverter.cs | 9 ++++++--- .../ValueConverters/DropdownListValueConverter.cs | 3 +-- .../DropdownListWithKeysValueConverter.cs | 9 ++++++--- .../ValueConverters/RadioButtonListValueConverter.cs | 10 +++++++--- .../ValueConverters/UserPickerValueConverter.cs | 7 ++++++- src/Umbraco.Web.UI/config/umbracoSettings.config | 2 +- .../ValueConverters/MemberPickerPropertyConverter.cs | 7 ++++++- 10 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs index c705197dd1..851518b8ea 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Umbraco.Core.Configuration; using Umbraco.Core.Models.PublishedContent; namespace Umbraco.Core.PropertyEditors.ValueConverters @@ -9,7 +10,11 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters { public override bool IsConverter(PublishedPropertyType propertyType) { - return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.CheckBoxListAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.CheckBoxListAlias); + } + return false; } public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/ColorPickerValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/ColorPickerValueConverter.cs index 3766f78b8f..5cac747818 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/ColorPickerValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/ColorPickerValueConverter.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Core.Configuration; using Umbraco.Core.Models.PublishedContent; namespace Umbraco.Core.PropertyEditors.ValueConverters @@ -7,7 +8,11 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters { public override bool IsConverter(PublishedPropertyType propertyType) { - return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.ColorPickerAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.ColorPickerAlias); + } + return false; } public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleValueConverter.cs index 4e9686b947..f6692028ed 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleValueConverter.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Umbraco.Core.Configuration; using Umbraco.Core.Models.PublishedContent; namespace Umbraco.Core.PropertyEditors.ValueConverters @@ -9,7 +10,11 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters { public override bool IsConverter(PublishedPropertyType propertyType) { - return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.DropDownListMultipleAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.DropDownListMultipleAlias); + } + return false; } public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleWithKeysValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleWithKeysValueConverter.cs index bea9f94287..539de12d0d 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleWithKeysValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListMultipleWithKeysValueConverter.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Umbraco.Core.Configuration; using Umbraco.Core.Models.PublishedContent; namespace Umbraco.Core.PropertyEditors.ValueConverters @@ -9,9 +10,11 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters { public override bool IsConverter(PublishedPropertyType propertyType) { - return propertyType.PropertyEditorAlias.InvariantEquals( - Constants.PropertyEditors - .DropdownlistMultiplePublishKeysAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.DropdownlistMultiplePublishKeysAlias); + } + return false; } public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListValueConverter.cs index d22466d6d7..b5ffcbf93e 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListValueConverter.cs @@ -20,8 +20,7 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters return typeof(string); } - public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, - PropertyCacheValue cacheValue) + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) { return PropertyCacheLevel.Content; } diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListWithKeysValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListWithKeysValueConverter.cs index 7560340f8c..848c3ba402 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListWithKeysValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/DropdownListWithKeysValueConverter.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Core.Configuration; using Umbraco.Core.Models.PublishedContent; namespace Umbraco.Core.PropertyEditors.ValueConverters @@ -7,9 +8,11 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters { public override bool IsConverter(PublishedPropertyType propertyType) { - return - propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors - .DropdownlistPublishingKeysAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.DropdownlistPublishingKeysAlias); + } + return false; } public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs index 6ea35ba1c2..7e58c721d5 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Core.Configuration; using Umbraco.Core.Models.PublishedContent; namespace Umbraco.Core.PropertyEditors.ValueConverters @@ -7,7 +8,11 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters { public override bool IsConverter(PublishedPropertyType propertyType) { - return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.RadioButtonListAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.RadioButtonListAlias); + } + return false; } public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) @@ -24,8 +29,7 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters return typeof(int); } - public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, - PropertyCacheValue cacheValue) + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) { return PropertyCacheLevel.Content; } diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/UserPickerValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/UserPickerValueConverter.cs index 668b250142..1ca94990d9 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/UserPickerValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/UserPickerValueConverter.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Umbraco.Core.Configuration; using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Services; @@ -26,7 +27,11 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters public override bool IsConverter(PublishedPropertyType propertyType) { - return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.UserPickerAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.UserPickerAlias); + } + return false; } public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.config b/src/Umbraco.Web.UI/config/umbracoSettings.config index 517a187f4b..12aeb207fe 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.config @@ -106,7 +106,7 @@ Textstring - false + true diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs index 607424cb66..d9355ad3d7 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerPropertyConverter.cs @@ -1,5 +1,6 @@ using System; using Umbraco.Core; +using Umbraco.Core.Configuration; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; @@ -11,7 +12,11 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters { public override bool IsConverter(PublishedPropertyType propertyType) { - return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.MemberPickerAlias); + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.MemberPickerAlias); + } + return false; } public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) From c053adc9b25f0da74b3bf33874c2cc2d36a5c7a1 Mon Sep 17 00:00:00 2001 From: Jeavon Date: Thu, 3 Nov 2016 17:06:26 +0000 Subject: [PATCH 105/841] Move the Upload editor value converter from Lars to Core from Web --- .../UploadPropertyConverter.cs | 21 ++----------------- src/Umbraco.Core/Umbraco.Core.csproj | 1 + src/Umbraco.Web/Umbraco.Web.csproj | 1 - 3 files changed, 3 insertions(+), 20 deletions(-) rename src/{Umbraco.Web => Umbraco.Core}/PropertyEditors/ValueConverters/UploadPropertyConverter.cs (76%) diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/UploadPropertyConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/UploadPropertyConverter.cs similarity index 76% rename from src/Umbraco.Web/PropertyEditors/ValueConverters/UploadPropertyConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/UploadPropertyConverter.cs index f3ca52d7ee..f41667b83d 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/UploadPropertyConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/UploadPropertyConverter.cs @@ -3,7 +3,7 @@ using Umbraco.Core; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; -namespace Umbraco.Web.PropertyEditors.ValueConverters +namespace Umbraco.Core.PropertyEditors.ValueConverters { /// /// The upload property value converter. @@ -72,24 +72,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters /// public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) { - PropertyCacheLevel returnLevel; - switch (cacheValue) - { - case PropertyCacheValue.Object: - returnLevel = PropertyCacheLevel.ContentCache; - break; - case PropertyCacheValue.Source: - returnLevel = PropertyCacheLevel.Content; - break; - case PropertyCacheValue.XPath: - returnLevel = PropertyCacheLevel.Content; - break; - default: - returnLevel = PropertyCacheLevel.None; - break; - } - - return returnLevel; + return PropertyCacheLevel.Content; } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 278615a377..e49512325c 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -511,6 +511,7 @@ + diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index bf409a8faf..b3feb8f1c2 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -401,7 +401,6 @@ - From 74e0a4d9996738c5c621664c580f769ebf44126e Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 31 Oct 2016 11:08:28 +0100 Subject: [PATCH 106/841] 7.6 merge review fixes --- src/Umbraco.Core/ByteArrayExtensions.cs | 39 ++ src/Umbraco.Core/ICompletable.cs | 9 + .../IO/FileSystemProviderManager.cs | 2 +- src/Umbraco.Core/IO/IFileSystem.cs | 10 +- src/Umbraco.Core/IO/MediaFileSystem.cs | 657 +++++++++++++++++- src/Umbraco.Core/IO/ShadowFileSystem.cs | 2 +- src/Umbraco.Core/IO/ShadowFileSystemsScope.cs | 2 +- src/Umbraco.Core/IO/ShadowWrapper.cs | 3 +- src/Umbraco.Core/IO/UmbracoMediaFile.cs | 6 +- src/Umbraco.Core/MainDom.cs | 7 +- src/Umbraco.Core/Media/ImageExtensions.cs | 21 + src/Umbraco.Core/Media/ImageHelper.cs | 383 ---------- src/Umbraco.Core/Media/MediaHelper.cs | 281 -------- .../Media/UploadAutoFillProperties.cs | 38 +- src/Umbraco.Core/Models/ContentExtensions.cs | 6 +- src/Umbraco.Core/Models/PublicAccessEntry.cs | 5 +- .../Packaging/PackageBinaryInspector.cs | 20 +- .../Persistence/DefaultDatabaseFactory.cs | 2 +- .../Repositories/VersionableRepositoryBase.cs | 4 +- src/Umbraco.Core/Services/MediaService.cs | 14 +- src/Umbraco.Core/Umbraco.Core.csproj | 5 +- src/Umbraco.Tests/IO/ShadowFileSystemTests.cs | 34 +- src/Umbraco.Tests/TestHelpers/TestHelper.cs | 45 ++ src/Umbraco.Web/Editors/ImagesController.cs | 4 +- .../FileUploadPropertyEditor.cs | 28 +- .../FileUploadPropertyValueEditor.cs | 35 +- .../ImageCropperPropertyEditor.cs | 29 +- .../ImageCropperPropertyValueEditor.cs | 35 +- src/umbraco.cms/businesslogic/Content.cs | 2 +- .../businesslogic/datatype/FileHandlerData.cs | 2 +- 30 files changed, 895 insertions(+), 835 deletions(-) create mode 100644 src/Umbraco.Core/ByteArrayExtensions.cs create mode 100644 src/Umbraco.Core/ICompletable.cs create mode 100644 src/Umbraco.Core/Media/ImageExtensions.cs delete mode 100644 src/Umbraco.Core/Media/ImageHelper.cs delete mode 100644 src/Umbraco.Core/Media/MediaHelper.cs diff --git a/src/Umbraco.Core/ByteArrayExtensions.cs b/src/Umbraco.Core/ByteArrayExtensions.cs new file mode 100644 index 0000000000..dacdd509ca --- /dev/null +++ b/src/Umbraco.Core/ByteArrayExtensions.cs @@ -0,0 +1,39 @@ +namespace Umbraco.Core +{ + public static class ByteArrayExtensions + { + private static readonly char[] BytesToHexStringLookup = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + + public static string ToHexString(this byte[] bytes) + { + int i = 0, p = 0, bytesLength = bytes.Length; + var chars = new char[bytesLength * 2]; + while (i < bytesLength) + { + var b = bytes[i++]; + chars[p++] = BytesToHexStringLookup[b / 0x10]; + chars[p++] = BytesToHexStringLookup[b % 0x10]; + } + return new string(chars, 0, chars.Length); + } + + public static string ToHexString(this byte[] bytes, char separator, int blockSize, int blockCount) + { + int p = 0, bytesLength = bytes.Length, count = 0, size = 0; + var chars = new char[bytesLength * 2 + blockCount]; + for (var i = 0; i < bytesLength; i++) + { + var b = bytes[i++]; + chars[p++] = BytesToHexStringLookup[b / 0x10]; + chars[p++] = BytesToHexStringLookup[b % 0x10]; + if (count == blockCount) continue; + if (++size < blockSize) continue; + + chars[p++] = '/'; + size = 0; + count++; + } + return new string(chars, 0, chars.Length); + } + } +} diff --git a/src/Umbraco.Core/ICompletable.cs b/src/Umbraco.Core/ICompletable.cs new file mode 100644 index 0000000000..594d82b0ae --- /dev/null +++ b/src/Umbraco.Core/ICompletable.cs @@ -0,0 +1,9 @@ +using System; + +namespace Umbraco.Core +{ + public interface ICompletable : IDisposable + { + void Complete(); + } +} diff --git a/src/Umbraco.Core/IO/FileSystemProviderManager.cs b/src/Umbraco.Core/IO/FileSystemProviderManager.cs index 1e076bb979..d807832bcb 100644 --- a/src/Umbraco.Core/IO/FileSystemProviderManager.cs +++ b/src/Umbraco.Core/IO/FileSystemProviderManager.cs @@ -204,7 +204,7 @@ namespace Umbraco.Core.IO // _shadowEnabled = true; //} - public ShadowFileSystemsScope Shadow(Guid id) + public ICompletable Shadow(Guid id) { var typed = _wrappers.ToArray(); var wrappers = new ShadowWrapper[typed.Length + 7]; diff --git a/src/Umbraco.Core/IO/IFileSystem.cs b/src/Umbraco.Core/IO/IFileSystem.cs index 063f63c437..003b4891f5 100644 --- a/src/Umbraco.Core/IO/IFileSystem.cs +++ b/src/Umbraco.Core/IO/IFileSystem.cs @@ -4,9 +4,6 @@ using System.IO; namespace Umbraco.Core.IO { - //TODO: There is no way to create a directory here without creating a file in a directory and then deleting it - //TODO: Should probably implement a rename? - public interface IFileSystem { IEnumerable GetDirectories(string path); @@ -46,5 +43,12 @@ namespace Umbraco.Core.IO public interface IFileSystem2 : IFileSystem { long GetSize(string path); + + // TODO: implement these + // + //void CreateDirectory(string path); + // + //// move or rename, directory or file + //void Move(string source, string target); } } diff --git a/src/Umbraco.Core/IO/MediaFileSystem.cs b/src/Umbraco.Core/IO/MediaFileSystem.cs index d0e1bbee53..6f32ef6da0 100644 --- a/src/Umbraco.Core/IO/MediaFileSystem.cs +++ b/src/Umbraco.Core/IO/MediaFileSystem.cs @@ -1,10 +1,18 @@ using System; using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; using System.Globalization; using System.IO; +using System.Linq; +using System.Threading; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Logging; using Umbraco.Core.Media; +using Umbraco.Core.Media.Exif; +using Umbraco.Core.Models; namespace Umbraco.Core.IO { @@ -15,17 +23,35 @@ namespace Umbraco.Core.IO public class MediaFileSystem : FileSystemWrapper { private readonly IContentSection _contentConfig; + private readonly UploadAutoFillProperties _uploadAutoFillProperties; - public MediaFileSystem(IFileSystem2 wrapped) - : this(wrapped, UmbracoConfig.For.UmbracoSettings().Content) - { - } + private readonly object _folderCounterLock = new object(); + private long _folderCounter; + private bool _folderCounterInitialized; - public MediaFileSystem(IFileSystem2 wrapped, IContentSection contentConfig) : base(wrapped) + private static readonly Dictionary DefaultSizes = new Dictionary + { + { 100, "thumb" }, + { 500, "big-thumb" } + }; + + public MediaFileSystem(IFileSystem wrapped) + : this(wrapped, UmbracoConfig.For.UmbracoSettings().Content, ApplicationContext.Current.ProfilingLogger.Logger) + { } + + public MediaFileSystem(IFileSystem wrapped, IContentSection contentConfig, ILogger logger) + : base(wrapped) { _contentConfig = contentConfig; + _uploadAutoFillProperties = new UploadAutoFillProperties(this, logger, contentConfig); } + internal UploadAutoFillProperties UploadAutoFillProperties { get { return _uploadAutoFillProperties; } } + + // note - this is currently experimental / being developed + //public static bool UseTheNewMediaPathScheme { get; set; } + public const bool UseTheNewMediaPathScheme = false; + // none of the methods below are used in Core anymore [Obsolete("This low-level method should NOT exist.")] @@ -48,28 +74,611 @@ namespace Umbraco.Core.IO return subfolder + sep + fileName; } - [Obsolete("Use ImageHelper.GetThumbnails instead.", false)] - public IEnumerable GetThumbnails(string path) + #region Media Path + + /// + /// Gets the file path of a media file. + /// + /// The file name. + /// The unique identifier of the content/media owning the file. + /// The unique identifier of the property type owning the file. + /// The filesystem-relative path to the media file. + /// With the old media path scheme, this CREATES a new media path each time it is invoked. + public string GetMediaPath(string filename, Guid cuid, Guid puid) { - return ImageHelper.GetThumbnails(this, path); - } + filename = Path.GetFileName(filename); + if (filename == null) throw new ArgumentException("Cannot become a safe filename.", "filename"); + filename = IOHelper.SafeFileName(filename.ToLowerInvariant()); - [Obsolete("Use ImageHelper.DeleteFile instead.", false)] - public void DeleteFile(string path, bool deleteThumbnails) - { - ImageHelper.DeleteFile(this, path, deleteThumbnails); - } + string folder; + if (UseTheNewMediaPathScheme == false) + { + // old scheme: filepath is "/" OR "-" + // default media filesystem maps to "~/media/" + folder = GetNextFolder(); + } + else + { + // new scheme: path is "-/" OR "--" + // default media filesystem maps to "~/media/" + // assumes that cuid and puid keys can be trusted - and that a single property type + // for a single content cannot store two different files with the same name + folder = Combine(cuid, puid).ToHexString(/*'/', 2, 4*/); // could use ext to fragment path eg 12/e4/f2/... + } - [Obsolete("Use ImageHelper.DeleteThumbnails instead.", false)] - public void DeleteThumbnails(string path) - { - ImageHelper.DeleteThumbnails(this, path); - } + var filepath = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories + ? Path.Combine(folder, filename) + : folder + "-" + filename; - [Obsolete("Use ImageHelper.CopyThumbnails instead.", false)] - public void CopyThumbnails(string sourcePath, string targetPath) - { - ImageHelper.CopyThumbnails(this, sourcePath, targetPath); + return filepath; } - } + + private static byte[] Combine(Guid guid1, Guid guid2) + { + var bytes1 = guid1.ToByteArray(); + var bytes2 = guid2.ToByteArray(); + var bytes = new byte[bytes1.Length]; + for (var i = 0; i < bytes1.Length; i++) + bytes[i] = (byte)(bytes1[i] ^ bytes2[i]); + return bytes; + } + + /// + /// Gets the file path of a media file. + /// + /// The file name. + /// A previous file path. + /// The unique identifier of the content/media owning the file. + /// The unique identifier of the property type owning the file. + /// The filesystem-relative path to the media file. + /// In the old, legacy, number-based scheme, we try to re-use the media folder + /// specified by . Else, we CREATE a new one. Each time we are invoked. + public string GetMediaPath(string filename, string prevpath, Guid cuid, Guid puid) + { + if (UseTheNewMediaPathScheme || string.IsNullOrWhiteSpace(prevpath)) + return GetMediaPath(filename, cuid, puid); + + filename = Path.GetFileName(filename); + if (filename == null) throw new ArgumentException("Cannot become a safe filename.", "filename"); + filename = IOHelper.SafeFileName(filename.ToLowerInvariant()); + + // old scheme, with a previous path + // prevpath should be "/" OR "-" + // and we want to reuse the "" part, so try to find it + + var sep = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories ? "/" : "-"; + var pos = prevpath.IndexOf(sep, StringComparison.Ordinal); + var s = pos > 0 ? prevpath.Substring(0, pos) : null; + int ignored; + + var folder = (pos > 0 && int.TryParse(s, out ignored)) ? s : GetNextFolder(); + + // ReSharper disable once AssignNullToNotNullAttribute + var filepath = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories + ? Path.Combine(folder, filename) + : folder + "-" + filename; + + return filepath; + } + + /// + /// Gets the next media folder in the original number-based scheme. + /// + /// + /// Should be private, is internal for legacy FileHandlerData which is obsolete. + internal string GetNextFolder() + { + EnsureFolderCounterIsInitialized(); + return Interlocked.Increment(ref _folderCounter).ToString(CultureInfo.InvariantCulture); + } + + private void EnsureFolderCounterIsInitialized() + { + lock (_folderCounterLock) + { + if (_folderCounterInitialized) return; + + _folderCounter = 1000; // seed + var directories = GetDirectories(""); + foreach (var directory in directories) + { + long folderNumber; + if (long.TryParse(directory, out folderNumber) && folderNumber > _folderCounter) + _folderCounter = folderNumber; + } + + // note: not multi-domains ie LB safe as another domain could create directories + // while we read and parse them - don't fix, move to new scheme eventually + + _folderCounterInitialized = true; + } + } + + #endregion + + #region Associated Media Files + + /// + /// Stores a media file. + /// + /// The content item owning the media file. + /// The property type owning the media file. + /// The media file name. + /// A stream containing the media bytes. + /// An optional filesystem-relative filepath to the previous media file. + /// The filesystem-relative filepath to the media file. + /// + /// The file is considered "owned" by the content/propertyType. + /// If an is provided then that file (and thumbnails) is deleted + /// before the new file is saved, and depending on the media path scheme, the folder + /// may be reused for the new file. + /// + public string StoreFile(IContentBase content, PropertyType propertyType, string filename, Stream filestream, string oldpath) + { + if (content == null) throw new ArgumentNullException("content"); + if (propertyType == null) throw new ArgumentNullException("propertyType"); + if (string.IsNullOrWhiteSpace(filename)) throw new ArgumentException("Null or empty.", "filename"); + if (filestream == null) throw new ArgumentNullException("filestream"); + + // clear the old file, if any + if (string.IsNullOrWhiteSpace(oldpath) == false) + DeleteFile(oldpath, true); + + // get the filepath, store the data + // use oldpath as "prevpath" to try and reuse the folder, in original number-based scheme + var filepath = GetMediaPath(filename, oldpath, content.Key, propertyType.Key); + AddFile(filepath, filestream); + return filepath; + } + + /// + /// Clears a media file. + /// + /// The filesystem-relative path to the media file. + public new void DeleteFile(string filepath) + { + DeleteFile(filepath, true); + } + + /// + /// Copies a media file. + /// + /// The content item owning the copy of the media file. + /// The property type owning the copy of the media file. + /// The filesystem-relative path to the source media file. + /// The filesystem-relative path to the copy of the media file. + public string CopyFile(IContentBase content, PropertyType propertyType, string sourcepath) + { + if (content == null) throw new ArgumentNullException("content"); + if (propertyType == null) throw new ArgumentNullException("propertyType"); + if (string.IsNullOrWhiteSpace(sourcepath)) throw new ArgumentException("Null or empty.", "sourcepath"); + + // ensure we have a file to copy + if (FileExists(sourcepath) == false) return null; + + // get the filepath + var filename = Path.GetFileName(sourcepath); + var filepath = GetMediaPath(filename, content.Key, propertyType.Key); + this.CopyFile(sourcepath, filepath); + CopyThumbnails(sourcepath, filepath); + return filepath; + } + + /// + /// Gets or creates a property for a content item. + /// + /// The content item. + /// The property type alias. + /// The property. + private static Property GetProperty(IContentBase content, string propertyTypeAlias) + { + var property = content.Properties.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); + if (property != null) return property; + + var propertyType = content.GetContentType().CompositionPropertyTypes + .FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); + if (propertyType == null) + throw new Exception("No property type exists with alias " + propertyTypeAlias + "."); + + property = new Property(propertyType); + content.Properties.Add(property); + return property; + } + + public void SetUploadFile(IContentBase content, string propertyTypeAlias, string filename, Stream filestream) + { + var property = GetProperty(content, propertyTypeAlias); + var svalue = property.Value as string; + var oldpath = svalue == null ? null : GetRelativePath(svalue); + var filepath = StoreFile(content, property.PropertyType, filename, filestream, oldpath); + property.Value = GetUrl(filepath); + SetUploadFile(content, property, filepath, filestream); + } + + public void SetUploadFile(IContentBase content, string propertyTypeAlias, string filepath) + { + var property = GetProperty(content, propertyTypeAlias); + var svalue = property.Value as string; + var oldpath = svalue == null ? null : GetRelativePath(svalue); // FIXME DELETE? + if (string.IsNullOrWhiteSpace(oldpath) == false && oldpath != filepath) + DeleteFile(oldpath, true); + property.Value = GetUrl(filepath); + using (var filestream = OpenFile(filepath)) + { + SetUploadFile(content, property, filepath, filestream); + } + } + + // sets a file for the FileUpload property editor + // ie generates thumbnails and populates autofill properties + private void SetUploadFile(IContentBase content, Property property, string filepath, Stream filestream) + { + // check if file is an image (and supports resizing and thumbnails etc) + var extension = Path.GetExtension(filepath); + var isImage = IsImageFile(extension); + + // specific stuff for images (thumbnails etc) + if (isImage) + { + using (var image = Image.FromStream(filestream)) + { + // use one image for all + GenerateThumbnails(image, filepath, property.PropertyType); + _uploadAutoFillProperties.Populate(content, property.Alias, filepath, filestream, image); + } + } + else + { + // will use filepath for extension, and filestream for length + _uploadAutoFillProperties.Populate(content, property.Alias, filepath, filestream); + } + } + + #endregion + + #region Image + + /// + /// Gets a value indicating whether the file extension corresponds to an image. + /// + /// The file extension. + /// A value indicating whether the file extension corresponds to an image. + public bool IsImageFile(string extension) + { + if (extension == null) return false; + extension = extension.TrimStart('.'); + return UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes.InvariantContains(extension); + } + + /// + /// Gets the dimensions of an image. + /// + /// A stream containing the image bytes. + /// The dimension of the image. + /// First try with EXIF as it is faster and does not load the entire image + /// in memory. Fallback to GDI which means loading the image in memory and thus + /// use potentially large amounts of memory. + public Size GetDimensions(Stream stream) + { + //Try to load with exif + try + { + var jpgInfo = ImageFile.FromStream(stream); + + if (jpgInfo.Format != ImageFileFormat.Unknown + && jpgInfo.Properties.ContainsKey(ExifTag.PixelYDimension) + && jpgInfo.Properties.ContainsKey(ExifTag.PixelXDimension)) + { + var height = Convert.ToInt32(jpgInfo.Properties[ExifTag.PixelYDimension].Value); + var width = Convert.ToInt32(jpgInfo.Properties[ExifTag.PixelXDimension].Value); + if (height > 0 && width > 0) + { + return new Size(width, height); + } + } + } + catch (Exception) + { + //We will just swallow, just means we can't read exif data, we don't want to log an error either + } + + //we have no choice but to try to read in via GDI + using (var image = Image.FromStream(stream)) + { + + var fileWidth = image.Width; + var fileHeight = image.Height; + return new Size(fileWidth, fileHeight); + } + } + + #endregion + + #region Manage thumbnails + + // note: this does not find 'custom' thumbnails? + // will find _thumb and _big-thumb but NOT _custom? + public IEnumerable GetThumbnails(string path) + { + var parentDirectory = Path.GetDirectoryName(path); + var extension = Path.GetExtension(path); + + return GetFiles(parentDirectory) + .Where(x => x.StartsWith(path.TrimEnd(extension) + "_thumb") || x.StartsWith(path.TrimEnd(extension) + "_big-thumb")) + .ToList(); + } + + public void DeleteFile(string path, bool deleteThumbnails) + { + base.DeleteFile(path); + + if (deleteThumbnails == false) + return; + + DeleteThumbnails(path); + } + + public void DeleteThumbnails(string path) + { + GetThumbnails(path) + .ForEach(x => base.DeleteFile(x)); + } + + public void CopyThumbnails(string sourcePath, string targetPath) + { + var targetPathBase = Path.GetDirectoryName(targetPath) ?? ""; + foreach (var sourceThumbPath in GetThumbnails(sourcePath)) + { + var sourceThumbFilename = Path.GetFileName(sourceThumbPath) ?? ""; + var targetThumbPath = Path.Combine(targetPathBase, sourceThumbFilename); + this.CopyFile(sourceThumbPath, targetThumbPath); + } + } + + #endregion + + #region GenerateThumbnails + + public IEnumerable GenerateThumbnails( + Image image, + string filepath, + string preValue) + { + if (string.IsNullOrWhiteSpace(preValue)) + return GenerateThumbnails(image, filepath); + + var additionalSizes = new List(); + var sep = preValue.Contains(",") ? "," : ";"; + var values = preValue.Split(new[] { sep }, StringSplitOptions.RemoveEmptyEntries); + foreach (var value in values) + { + int size; + if (int.TryParse(value, out size)) + additionalSizes.Add(size); + } + + return GenerateThumbnails(image, filepath, additionalSizes); + } + + public IEnumerable GenerateThumbnails( + Image image, + string filepath, + IEnumerable additionalSizes = null) + { + var w = image.Width; + var h = image.Height; + + var sizes = additionalSizes == null ? DefaultSizes.Keys : DefaultSizes.Keys.Concat(additionalSizes); + + // start with default sizes, + // add additional sizes, + // filter out duplicates, + // filter out those that would be larger that the original image + // and create the thumbnail + return sizes + .Distinct() + .Where(x => w >= x && h >= x) + .Select(x => GenerateResized(image, filepath, DefaultSizes.ContainsKey(x) ? DefaultSizes[x] : "", x)) + .ToList(); // now + } + + public IEnumerable GenerateThumbnails( + Stream filestream, + string filepath, + PropertyType propertyType) + { + // get the original image from the original stream + if (filestream.CanSeek) filestream.Seek(0, 0); // fixme - what if we cannot seek? + using (var image = Image.FromStream(filestream)) + { + return GenerateThumbnails(image, filepath, propertyType); + } + } + + public IEnumerable GenerateThumbnails( + Image image, + string filepath, + PropertyType propertyType) + { + // if the editor is an upload field, check for additional thumbnail sizes + // that can be defined in the prevalue for the property data type. otherwise, + // just use the default sizes. + var sizes = propertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias + ? ApplicationContext.Current.Services.DataTypeService + .GetPreValuesByDataTypeId(propertyType.DataTypeDefinitionId) + .FirstOrDefault() + : string.Empty; + + return GenerateThumbnails(image, filepath, sizes); + } + + #endregion + + #region GenerateResized - Generate at resized filepath derived from origin filepath + + public ResizedImage GenerateResized(Image originImage, string originFilepath, string sizeName, int maxWidthHeight) + { + return GenerateResized(originImage, originFilepath, sizeName, maxWidthHeight, -1, -1); + } + + public ResizedImage GenerateResized(Image originImage, string originFilepath, string sizeName, int fixedWidth, int fixedHeight) + { + return GenerateResized(originImage, originFilepath, sizeName, -1, fixedWidth, fixedHeight); + } + + public ResizedImage GenerateResized(Image originImage, string originFilepath, string sizeName, int maxWidthHeight, int fixedWidth, int fixedHeight) + { + if (string.IsNullOrWhiteSpace(sizeName)) + sizeName = "UMBRACOSYSTHUMBNAIL"; + var extension = Path.GetExtension(originFilepath) ?? string.Empty; + var filebase = originFilepath.TrimEnd(extension); + var resizedFilepath = filebase + "_" + sizeName + extension; + + return GenerateResizedAt(originImage, resizedFilepath, maxWidthHeight, fixedWidth, fixedHeight); + } + + #endregion + + #region GenerateResizedAt - Generate at specified resized filepath + + public ResizedImage GenerateResizedAt(Image originImage, string resizedFilepath, int maxWidthHeight) + { + return GenerateResizedAt(originImage, resizedFilepath, maxWidthHeight, -1, -1); + } + + public ResizedImage GenerateResizedAt(Image originImage, int fixedWidth, int fixedHeight, string resizedFilepath) + { + return GenerateResizedAt(originImage, resizedFilepath, -1, fixedWidth, fixedHeight); + } + + public ResizedImage GenerateResizedAt(Image originImage, string resizedFilepath, int maxWidthHeight, int fixedWidth, int fixedHeight) + { + // target dimensions + int width, height; + + // if maxWidthHeight then get ratio + if (maxWidthHeight > 0) + { + var fx = (float)originImage.Size.Width / maxWidthHeight; + var fy = (float)originImage.Size.Height / maxWidthHeight; + var f = Math.Max(fx, fy); // fit in thumbnail size + width = (int)Math.Round(originImage.Size.Width / f); + height = (int)Math.Round(originImage.Size.Height / f); + if (width == 0) width = 1; + if (height == 0) height = 1; + } + else if (fixedWidth > 0 && fixedHeight > 0) + { + width = fixedWidth; + height = fixedHeight; + } + else + { + width = height = 1; + } + + // create new image with best quality settings + using (var bitmap = new Bitmap(width, height)) + using (var graphics = Graphics.FromImage(bitmap)) + { + // if the image size is rather large we cannot use the best quality interpolation mode + // because we'll get out of mem exceptions. So we detect how big the image is and use + // the mid quality interpolation mode when the image size exceeds our max limit. + graphics.InterpolationMode = originImage.Width > 5000 || originImage.Height > 5000 + ? InterpolationMode.Bilinear // mid quality + : InterpolationMode.HighQualityBicubic; // best quality + + // everything else is best-quality + graphics.SmoothingMode = SmoothingMode.HighQuality; + graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + graphics.CompositingQuality = CompositingQuality.HighQuality; + + // copy the old image to the new and resize + var rect = new Rectangle(0, 0, width, height); + graphics.DrawImage(originImage, rect, 0, 0, originImage.Width, originImage.Height, GraphicsUnit.Pixel); + + // copy metadata + // fixme - er... no? + + // get an encoder - based upon the file type + var extension = (Path.GetExtension(resizedFilepath) ?? "").TrimStart('.').ToLowerInvariant(); + var encoders = ImageCodecInfo.GetImageEncoders(); + ImageCodecInfo encoder; + switch (extension) + { + case "png": + encoder = encoders.Single(t => t.MimeType.Equals("image/png")); + break; + case "gif": + encoder = encoders.Single(t => t.MimeType.Equals("image/gif")); + break; + case "tif": + case "tiff": + encoder = encoders.Single(t => t.MimeType.Equals("image/tiff")); + break; + case "bmp": + encoder = encoders.Single(t => t.MimeType.Equals("image/bmp")); + break; + // TODO: this is dirty, defaulting to jpg but the return value of this thing is used all over the + // place so left it here, but it needs to not set a codec if it doesn't know which one to pick + // Note: when fixing this: both .jpg and .jpeg should be handled as extensions + default: + encoder = encoders.Single(t => t.MimeType.Equals("image/jpeg")); + break; + } + + // set compresion ratio to 90% + var encoderParams = new EncoderParameters(); + encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 90L); + + // save the new image + using (var stream = new MemoryStream()) + { + bitmap.Save(stream, encoder, encoderParams); + stream.Seek(0, 0); + if (resizedFilepath.Contains("UMBRACOSYSTHUMBNAIL")) + { + var filepath = resizedFilepath.Replace("UMBRACOSYSTHUMBNAIL", maxWidthHeight.ToInvariantString()); + AddFile(filepath, stream); + if (extension != "jpg") + { + filepath = filepath.TrimEnd(extension) + "jpg"; + stream.Seek(0, 0); + AddFile(filepath, stream); + } + // TODO: Remove this, this is ONLY here for backwards compatibility but it is essentially completely unusable see U4-5385 + stream.Seek(0, 0); + resizedFilepath = resizedFilepath.Replace("UMBRACOSYSTHUMBNAIL", width + "x" + height); + } + + AddFile(resizedFilepath, stream); + } + + return new ResizedImage(resizedFilepath, width, height); + } + } + + #endregion + + #region Inner classes + + public class ResizedImage + { + public ResizedImage() + { } + + public ResizedImage(string filepath, int width, int height) + { + Filepath = filepath; + Width = width; + Height = height; + } + + public string Filepath { get; set; } + public int Width { get; set; } + public int Height { get; set; } + } + + #endregion + } } diff --git a/src/Umbraco.Core/IO/ShadowFileSystem.cs b/src/Umbraco.Core/IO/ShadowFileSystem.cs index 276e058bcc..1e5da10bdc 100644 --- a/src/Umbraco.Core/IO/ShadowFileSystem.cs +++ b/src/Umbraco.Core/IO/ShadowFileSystem.cs @@ -5,7 +5,7 @@ using System.Linq; namespace Umbraco.Core.IO { - public class ShadowFileSystem : IFileSystem2 + internal class ShadowFileSystem : IFileSystem2 { private readonly IFileSystem _fs; private readonly IFileSystem2 _sfs; diff --git a/src/Umbraco.Core/IO/ShadowFileSystemsScope.cs b/src/Umbraco.Core/IO/ShadowFileSystemsScope.cs index 5e0280ddca..0793946b62 100644 --- a/src/Umbraco.Core/IO/ShadowFileSystemsScope.cs +++ b/src/Umbraco.Core/IO/ShadowFileSystemsScope.cs @@ -5,7 +5,7 @@ using Umbraco.Core.Logging; namespace Umbraco.Core.IO { - public class ShadowFileSystemsScope : IDisposable + internal class ShadowFileSystemsScope : ICompletable { // note: taking a reference to the _manager instead of using manager.Current // to avoid using Current everywhere but really, we support only 1 scope at diff --git a/src/Umbraco.Core/IO/ShadowWrapper.cs b/src/Umbraco.Core/IO/ShadowWrapper.cs index 7f9bc61a66..87d2b8db9f 100644 --- a/src/Umbraco.Core/IO/ShadowWrapper.cs +++ b/src/Umbraco.Core/IO/ShadowWrapper.cs @@ -2,11 +2,10 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Web.Hosting; namespace Umbraco.Core.IO { - public class ShadowWrapper : IFileSystem2 + internal class ShadowWrapper : IFileSystem2 { private readonly IFileSystem _innerFileSystem; private readonly string _shadowPath; diff --git a/src/Umbraco.Core/IO/UmbracoMediaFile.cs b/src/Umbraco.Core/IO/UmbracoMediaFile.cs index 8e1d8c0987..18438831e2 100644 --- a/src/Umbraco.Core/IO/UmbracoMediaFile.cs +++ b/src/Umbraco.Core/IO/UmbracoMediaFile.cs @@ -119,7 +119,7 @@ namespace Umbraco.Core.IO public bool SupportsResizing { - get { return ImageHelper.IsImageFile(Extension); } + get { return _fs.IsImageFile(Extension); } } public string GetFriendlyName() @@ -137,7 +137,7 @@ namespace Umbraco.Core.IO using (var fs = _fs.OpenFile(Path)) { - _size = ImageHelper.GetDimensions(fs); + _size = _fs.GetDimensions(fs); } } else @@ -171,7 +171,7 @@ namespace Umbraco.Core.IO using (var filestream = _fs.OpenFile(Path)) using (var image = Image.FromStream(filestream)) { - return ImageHelper.GenerateResized(_fs, image, Path, sizeName, maxWidthHeight, width, height).Filepath; + return _fs.GenerateResized(image, Path, sizeName, maxWidthHeight, width, height).Filepath; } } diff --git a/src/Umbraco.Core/MainDom.cs b/src/Umbraco.Core/MainDom.cs index 52dbb21f21..e5d63cb6c9 100644 --- a/src/Umbraco.Core/MainDom.cs +++ b/src/Umbraco.Core/MainDom.cs @@ -1,13 +1,8 @@ using System; using System.Collections.Generic; -using System.Diagnostics; -using System.IO.MemoryMappedFiles; -using System.Text; using System.Threading; -using System.Threading.Tasks; using System.Web.Hosting; using Umbraco.Core.Logging; -using Umbraco.Core.ObjectResolution; namespace Umbraco.Core { @@ -109,7 +104,7 @@ namespace Umbraco.Core /// An action to execute before the AppDomain releases the main domain status. /// An optional weight (lower goes first). /// A value indicating whether it was possible to register. - /// If registering is successful, then the action + /// If registering is successful, then the action /// is guaranteed to execute before the AppDomain releases the main domain status. public bool Register(Action install, Action release, int weight = 100) { diff --git a/src/Umbraco.Core/Media/ImageExtensions.cs b/src/Umbraco.Core/Media/ImageExtensions.cs new file mode 100644 index 0000000000..c20be13d31 --- /dev/null +++ b/src/Umbraco.Core/Media/ImageExtensions.cs @@ -0,0 +1,21 @@ +using System.Drawing; +using System.Drawing.Imaging; +using System.Linq; + +namespace Umbraco.Core.Media +{ + public static class ImageExtensions + { + /// + /// Gets the MIME type of an image. + /// + /// The image. + /// The MIME type of the image. + public static string GetMimeType(this Image image) + { + var format = image.RawFormat; + var codec = ImageCodecInfo.GetImageDecoders().First(c => c.FormatID == format.Guid); + return codec.MimeType; + } + } +} diff --git a/src/Umbraco.Core/Media/ImageHelper.cs b/src/Umbraco.Core/Media/ImageHelper.cs deleted file mode 100644 index f3cab2d3b0..0000000000 --- a/src/Umbraco.Core/Media/ImageHelper.cs +++ /dev/null @@ -1,383 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.IO; -using System.Linq; -using Umbraco.Core.Configuration; -using Umbraco.Core.IO; -using Umbraco.Core.Media.Exif; -using Umbraco.Core.Models; - -namespace Umbraco.Core.Media -{ - /// - /// Provides helper methods for managing images. - /// - public static class ImageHelper - { - private static readonly Dictionary DefaultSizes = new Dictionary - { - { 100, "thumb" }, - { 500, "big-thumb" } - }; - - /// - /// Gets a value indicating whether the file extension corresponds to an image. - /// - /// The file extension. - /// A value indicating whether the file extension corresponds to an image. - public static bool IsImageFile(string extension) - { - if (extension == null) return false; - extension = extension.TrimStart('.'); - return UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes.InvariantContains(extension); - } - - /// - /// Gets the dimensions of an image. - /// - /// A stream containing the image bytes. - /// The dimension of the image. - /// First try with EXIF as it is faster and does not load the entire image - /// in memory. Fallback to GDI which means loading the image in memory and thus - /// use potentially large amounts of memory. - public static Size GetDimensions(Stream stream) - { - //Try to load with exif - try - { - var jpgInfo = ImageFile.FromStream(stream); - - if (jpgInfo.Format != ImageFileFormat.Unknown - && jpgInfo.Properties.ContainsKey(ExifTag.PixelYDimension) - && jpgInfo.Properties.ContainsKey(ExifTag.PixelXDimension)) - { - var height = Convert.ToInt32(jpgInfo.Properties[ExifTag.PixelYDimension].Value); - var width = Convert.ToInt32(jpgInfo.Properties[ExifTag.PixelXDimension].Value); - if (height > 0 && width > 0) - { - return new Size(width, height); - } - } - } - catch (Exception) - { - //We will just swallow, just means we can't read exif data, we don't want to log an error either - } - - //we have no choice but to try to read in via GDI - using (var image = Image.FromStream(stream)) - { - - var fileWidth = image.Width; - var fileHeight = image.Height; - return new Size(fileWidth, fileHeight); - } - } - - /// - /// Gets the MIME type of an image. - /// - /// The image. - /// The MIME type of the image. - public static string GetMimeType(this Image image) - { - var format = image.RawFormat; - var codec = ImageCodecInfo.GetImageDecoders().First(c => c.FormatID == format.Guid); - return codec.MimeType; - } - - #region Manage thumbnails - - // note: this does not find 'custom' thumbnails? - // will find _thumb and _big-thumb but NOT _custom? - public static IEnumerable GetThumbnails(IFileSystem fs, string path) - { - var parentDirectory = Path.GetDirectoryName(path); - var extension = Path.GetExtension(path); - - return fs.GetFiles(parentDirectory) - .Where(x => x.StartsWith(path.TrimEnd(extension) + "_thumb") || x.StartsWith(path.TrimEnd(extension) + "_big-thumb")) - .ToList(); - } - - public static void DeleteFile(IFileSystem fs, string path, bool deleteThumbnails) - { - fs.DeleteFile(path); - - if (deleteThumbnails == false) - return; - - DeleteThumbnails(fs, path); - } - - public static void DeleteThumbnails(IFileSystem fs, string path) - { - GetThumbnails(fs, path) - .ForEach(fs.DeleteFile); - } - - public static void CopyThumbnails(IFileSystem fs, string sourcePath, string targetPath) - { - var targetPathBase = Path.GetDirectoryName(targetPath) ?? ""; - foreach (var sourceThumbPath in GetThumbnails(fs, sourcePath)) - { - var sourceThumbFilename = Path.GetFileName(sourceThumbPath) ?? ""; - var targetThumbPath = Path.Combine(targetPathBase, sourceThumbFilename); - fs.CopyFile(sourceThumbPath, targetThumbPath); - } - } - - #endregion - - #region GenerateThumbnails - - public static IEnumerable GenerateThumbnails( - IFileSystem fs, - Image image, - string filepath, - string preValue) - { - if (string.IsNullOrWhiteSpace(preValue)) - return GenerateThumbnails(fs, image, filepath); - - var additionalSizes = new List(); - var sep = preValue.Contains(",") ? "," : ";"; - var values = preValue.Split(new[] { sep }, StringSplitOptions.RemoveEmptyEntries); - foreach (var value in values) - { - int size; - if (int.TryParse(value, out size)) - additionalSizes.Add(size); - } - - return GenerateThumbnails(fs, image, filepath, additionalSizes); - } - - public static IEnumerable GenerateThumbnails( - IFileSystem fs, - Image image, - string filepath, - IEnumerable additionalSizes = null) - { - var w = image.Width; - var h = image.Height; - - var sizes = additionalSizes == null ? DefaultSizes.Keys : DefaultSizes.Keys.Concat(additionalSizes); - - // start with default sizes, - // add additional sizes, - // filter out duplicates, - // filter out those that would be larger that the original image - // and create the thumbnail - return sizes - .Distinct() - .Where(x => w >= x && h >= x) - .Select(x => GenerateResized(fs, image, filepath, DefaultSizes.ContainsKey(x) ? DefaultSizes[x] : "", x)) - .ToList(); // now - } - - public static IEnumerable GenerateThumbnails( - IFileSystem fs, - Stream filestream, - string filepath, - PropertyType propertyType) - { - // get the original image from the original stream - if (filestream.CanSeek) filestream.Seek(0, 0); // fixme - what if we cannot seek? - using (var image = Image.FromStream(filestream)) - { - return GenerateThumbnails(fs, image, filepath, propertyType); - } - } - - public static IEnumerable GenerateThumbnails( - IFileSystem fs, - Image image, - string filepath, - PropertyType propertyType) - { - // if the editor is an upload field, check for additional thumbnail sizes - // that can be defined in the prevalue for the property data type. otherwise, - // just use the default sizes. - var sizes = propertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias - ? ApplicationContext.Current.Services.DataTypeService - .GetPreValuesByDataTypeId(propertyType.DataTypeDefinitionId) - .FirstOrDefault() - : string.Empty; - - return GenerateThumbnails(fs, image, filepath, sizes); - } - - #endregion - - #region GenerateResized - Generate at resized filepath derived from origin filepath - - public static ResizedImage GenerateResized(IFileSystem fs, Image originImage, string originFilepath, string sizeName, int maxWidthHeight) - { - return GenerateResized(fs, originImage, originFilepath, sizeName, maxWidthHeight, -1, -1); - } - - public static ResizedImage GenerateResized(IFileSystem fs, Image originImage, string originFilepath, string sizeName, int fixedWidth, int fixedHeight) - { - return GenerateResized(fs, originImage, originFilepath, sizeName, -1, fixedWidth, fixedHeight); - } - - public static ResizedImage GenerateResized(IFileSystem fs, Image originImage, string originFilepath, string sizeName, int maxWidthHeight, int fixedWidth, int fixedHeight) - { - if (string.IsNullOrWhiteSpace(sizeName)) - sizeName = "UMBRACOSYSTHUMBNAIL"; - var extension = Path.GetExtension(originFilepath) ?? string.Empty; - var filebase = originFilepath.TrimEnd(extension); - var resizedFilepath = filebase + "_" + sizeName + extension; - - return GenerateResizedAt(fs, originImage, resizedFilepath, maxWidthHeight, fixedWidth, fixedHeight); - } - - #endregion - - #region GenerateResizedAt - Generate at specified resized filepath - - public static ResizedImage GenerateResizedAt(IFileSystem fs, Image originImage, string resizedFilepath, int maxWidthHeight) - { - return GenerateResizedAt(fs, originImage, resizedFilepath, maxWidthHeight, -1, -1); - } - - public static ResizedImage GenerateResizedAt(IFileSystem fs, Image originImage, int fixedWidth, int fixedHeight, string resizedFilepath) - { - return GenerateResizedAt(fs, originImage, resizedFilepath, -1, fixedWidth, fixedHeight); - } - - public static ResizedImage GenerateResizedAt(IFileSystem fs, Image originImage, string resizedFilepath, int maxWidthHeight, int fixedWidth, int fixedHeight) - { - // target dimensions - int width, height; - - // if maxWidthHeight then get ratio - if (maxWidthHeight > 0) - { - var fx = (float) originImage.Size.Width / maxWidthHeight; - var fy = (float) originImage.Size.Height / maxWidthHeight; - var f = Math.Max(fx, fy); // fit in thumbnail size - width = (int) Math.Round(originImage.Size.Width / f); - height = (int) Math.Round(originImage.Size.Height / f); - if (width == 0) width = 1; - if (height == 0) height = 1; - } - else if (fixedWidth > 0 && fixedHeight > 0) - { - width = fixedWidth; - height = fixedHeight; - } - else - { - width = height = 1; - } - - // create new image with best quality settings - using (var bitmap = new Bitmap(width, height)) - using (var graphics = Graphics.FromImage(bitmap)) - { - // if the image size is rather large we cannot use the best quality interpolation mode - // because we'll get out of mem exceptions. So we detect how big the image is and use - // the mid quality interpolation mode when the image size exceeds our max limit. - graphics.InterpolationMode = originImage.Width > 5000 || originImage.Height > 5000 - ? InterpolationMode.Bilinear // mid quality - : InterpolationMode.HighQualityBicubic; // best quality - - // everything else is best-quality - graphics.SmoothingMode = SmoothingMode.HighQuality; - graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; - graphics.CompositingQuality = CompositingQuality.HighQuality; - - // copy the old image to the new and resize - var rect = new Rectangle(0, 0, width, height); - graphics.DrawImage(originImage, rect, 0, 0, originImage.Width, originImage.Height, GraphicsUnit.Pixel); - - // copy metadata - // fixme - er... no? - - // get an encoder - based upon the file type - var extension = (Path.GetExtension(resizedFilepath) ?? "").TrimStart('.').ToLowerInvariant(); - var encoders = ImageCodecInfo.GetImageEncoders(); - ImageCodecInfo encoder; - switch (extension) - { - case "png": - encoder = encoders.Single(t => t.MimeType.Equals("image/png")); - break; - case "gif": - encoder = encoders.Single(t => t.MimeType.Equals("image/gif")); - break; - case "tif": - case "tiff": - encoder = encoders.Single(t => t.MimeType.Equals("image/tiff")); - break; - case "bmp": - encoder = encoders.Single(t => t.MimeType.Equals("image/bmp")); - break; - // TODO: this is dirty, defaulting to jpg but the return value of this thing is used all over the - // place so left it here, but it needs to not set a codec if it doesn't know which one to pick - // Note: when fixing this: both .jpg and .jpeg should be handled as extensions - default: - encoder = encoders.Single(t => t.MimeType.Equals("image/jpeg")); - break; - } - - // set compresion ratio to 90% - var encoderParams = new EncoderParameters(); - encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 90L); - - // save the new image - using (var stream = new MemoryStream()) - { - bitmap.Save(stream, encoder, encoderParams); - stream.Seek(0, 0); - if (resizedFilepath.Contains("UMBRACOSYSTHUMBNAIL")) - { - var filepath = resizedFilepath.Replace("UMBRACOSYSTHUMBNAIL", maxWidthHeight.ToInvariantString()); - fs.AddFile(filepath, stream); - if (extension != "jpg") - { - filepath = filepath.TrimEnd(extension) + "jpg"; - stream.Seek(0, 0); - fs.AddFile(filepath, stream); - } - // TODO: Remove this, this is ONLY here for backwards compatibility but it is essentially completely unusable see U4-5385 - stream.Seek(0, 0); - resizedFilepath = resizedFilepath.Replace("UMBRACOSYSTHUMBNAIL", width + "x" + height); - } - - fs.AddFile(resizedFilepath, stream); - } - - return new ResizedImage(resizedFilepath, width, height); - } - } - - #endregion - - #region Inner classes - - public class ResizedImage - { - public ResizedImage() - { } - - public ResizedImage(string filepath, int width, int height) - { - Filepath = filepath; - Width = width; - Height = height; - } - - public string Filepath { get; set; } - public int Width { get; set; } - public int Height { get; set; } - } - - #endregion - } -} diff --git a/src/Umbraco.Core/Media/MediaHelper.cs b/src/Umbraco.Core/Media/MediaHelper.cs deleted file mode 100644 index 040cfd5d7d..0000000000 --- a/src/Umbraco.Core/Media/MediaHelper.cs +++ /dev/null @@ -1,281 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Umbraco.Core.Configuration; -using Umbraco.Core.IO; -using Umbraco.Core.Models; - -namespace Umbraco.Core.Media -{ - /// - /// Provides helper methods for managing medias. - /// - /// Medias can be anything that can be uploaded via an upload - /// property, including but not limited to, images. See ImageHelper for - /// image-specific methods. - internal static class MediaHelper - { - private static long _folderCounter; - private static bool _folderCounterInitialized; - private static readonly object FolderCounterLock = new object(); - - // fixme - should be a config option of some sort! - //public static bool UseTheNewMediaPathScheme { get; set; } - public const bool UseTheNewMediaPathScheme = false; - - public static MediaFileSystem FileSystem { get { return FileSystemProviderManager.Current.GetFileSystemProvider(); } } - - #region Media Path - - /// - /// Gets the file path of a media file. - /// - /// The file name. - /// The unique identifier of the content/media owning the file. - /// The unique identifier of the property type owning the file. - /// The filesystem-relative path to the media file. - /// With the old media path scheme, this CREATES a new media path each time it is invoked. - public static string GetMediaPath(string filename, Guid cuid, Guid puid) - { - filename = Path.GetFileName(filename); - if (filename == null) throw new ArgumentException("Cannot become a safe filename.", "filename"); - filename = IOHelper.SafeFileName(filename.ToLowerInvariant()); - - string folder; - if (UseTheNewMediaPathScheme == false) - { - // old scheme: filepath is "/" OR "-" - // default media filesystem maps to "~/media/" - folder = GetNextFolder(); - } - else - { - // new scheme: path is "-/" OR "--" - // default media filesystem maps to "~/media/" - // fixme - this assumes that the keys exists and won't change (even when creating a new content) - // fixme - this is going to create looooong filepaths, any chance we can shorten them? - folder = cuid.ToString("N") + "-" + puid.ToString("N"); - } - - var filepath = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories - ? Path.Combine(folder, filename) - : folder + "-" + filename; - - return filepath; - } - - /// - /// Gets the file path of a media file. - /// - /// The file name. - /// A previous file path. - /// The unique identifier of the content/media owning the file. - /// The unique identifier of the property type owning the file. - /// The filesystem-relative path to the media file. - /// In the old, legacy, number-based scheme, we try to re-use the media folder - /// specified by . Else, we CREATE a new one. Each time we are invoked. - public static string GetMediaPath(string filename, string prevpath, Guid cuid, Guid puid) - { - if (UseTheNewMediaPathScheme || string.IsNullOrWhiteSpace(prevpath)) - return GetMediaPath(filename, cuid, puid); - - filename = Path.GetFileName(filename); - if (filename == null) throw new ArgumentException("Cannot become a safe filename.", "filename"); - filename = IOHelper.SafeFileName(filename.ToLowerInvariant()); - - // old scheme, with a previous path - // prevpath should be "/" OR "-" - // and we want to reuse the "" part, so try to find it - - var sep = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories ? "/" : "-"; - var pos = prevpath.IndexOf(sep, StringComparison.Ordinal); - var s = pos > 0 ? prevpath.Substring(0, pos) : null; - int ignored; - - var folder = (pos > 0 && int.TryParse(s, out ignored)) ? s : GetNextFolder(); - - // ReSharper disable once AssignNullToNotNullAttribute - var filepath = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories - ? Path.Combine(folder, filename) - : folder + "-" + filename; - - return filepath; - } - - /// - /// Gets the next media folder in the original number-based scheme. - /// - /// - /// Should be private, is internal for legacy FileHandlerData which is obsolete. - internal static string GetNextFolder() - { - lock (FolderCounterLock) - { - if (_folderCounterInitialized == false) - { - _folderCounter = 1000; // seed - was not respected in MediaSubfolderCounter? - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - var directories = fs.GetDirectories(""); - foreach (var directory in directories) - { - long folderNumber; - if (long.TryParse(directory, out folderNumber) && folderNumber > _folderCounter) - _folderCounter = folderNumber; - } - - _folderCounterInitialized = true; - } - } - - return Interlocked.Increment(ref _folderCounter).ToString(CultureInfo.InvariantCulture); - } - - #endregion - - /// - /// Stores a media file. - /// - /// The content item owning the media file. - /// The property type owning the media file. - /// The media file name. - /// A stream containing the media bytes. - /// An optional filesystem-relative filepath to the previous media file. - /// The filesystem-relative filepath to the media file. - /// - /// The file is considered "owned" by the content/propertyType. - /// If an is provided then that file (and thumbnails) is deleted - /// before the new file is saved, and depending on the media path scheme, the folder - /// may be reused for the new file. - /// - public static string StoreFile(IContentBase content, PropertyType propertyType, string filename, Stream filestream, string oldpath) - { - if (content == null) throw new ArgumentNullException("content"); - if (propertyType == null) throw new ArgumentNullException("propertyType"); - if (string.IsNullOrWhiteSpace(filename)) throw new ArgumentException("Null or empty.", "filename"); - if (filestream == null) throw new ArgumentNullException("filestream"); - - // clear the old file, if any - var fs = FileSystem; - if (string.IsNullOrWhiteSpace(oldpath) == false) - ImageHelper.DeleteFile(fs, oldpath, true); - - // get the filepath, store the data - // use oldpath as "prevpath" to try and reuse the folder, in original number-based scheme - var filepath = GetMediaPath(filename, oldpath, content.Key, propertyType.Key); - fs.AddFile(filepath, filestream); - return filepath; - } - - /// - /// Clears a media file. - /// - /// The filesystem-relative path to the media file. - public static void DeleteFile(string filepath) - { - ImageHelper.DeleteFile(FileSystem, filepath, true); - } - - /// - /// Copies a media file. - /// - /// The content item owning the copy of the media file. - /// The property type owning the copy of the media file. - /// The filesystem-relative path to the source media file. - /// The filesystem-relative path to the copy of the media file. - public static string CopyFile(IContentBase content, PropertyType propertyType, string sourcepath) - { - if (content == null) throw new ArgumentNullException("content"); - if (propertyType == null) throw new ArgumentNullException("propertyType"); - if (string.IsNullOrWhiteSpace(sourcepath)) throw new ArgumentException("Null or empty.", "sourcepath"); - - // ensure we have a file to copy - var fs = FileSystem; - if (fs.FileExists(sourcepath) == false) return null; - - // get the filepath - var filename = Path.GetFileName(sourcepath); - var filepath = GetMediaPath(filename, content.Key, propertyType.Key); - fs.CopyFile(sourcepath, filepath); - ImageHelper.CopyThumbnails(fs, sourcepath, filepath); - return filepath; - } - - /// - /// Gets or creates a property for a content item. - /// - /// The content item. - /// The property type alias. - /// The property. - private static Property GetProperty(IContentBase content, string propertyTypeAlias) - { - var property = content.Properties.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); - if (property != null) return property; - - var propertyType = content.GetContentType().CompositionPropertyTypes - .FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); - if (propertyType == null) - throw new Exception("No property type exists with alias " + propertyTypeAlias + "."); - - property = new Property(propertyType); - content.Properties.Add(property); - return property; - } - - public static void SetUploadFile(IContentBase content, string propertyTypeAlias, string filename, Stream filestream) - { - var property = GetProperty(content, propertyTypeAlias); - var svalue = property.Value as string; - var oldpath = svalue == null ? null : FileSystem.GetRelativePath(svalue); - var filepath = StoreFile(content, property.PropertyType, filename, filestream, oldpath); - property.Value = FileSystem.GetUrl(filepath); - SetUploadFile(content, property, FileSystem, filepath, filestream); - } - - public static void SetUploadFile(IContentBase content, string propertyTypeAlias, string filepath) - { - var property = GetProperty(content, propertyTypeAlias); - var svalue = property.Value as string; - var oldpath = svalue == null ? null : FileSystem.GetRelativePath(svalue); // FIXME DELETE? - if (string.IsNullOrWhiteSpace(oldpath) == false && oldpath != filepath) - FileSystem.DeleteFile(oldpath); - property.Value = FileSystem.GetUrl(filepath); - var fs = FileSystem; - using (var filestream = fs.OpenFile(filepath)) - { - SetUploadFile(content, property, fs, filepath, filestream); - } - } - - // sets a file for the FileUpload property editor - // ie generates thumbnails and populates autofill properties - private static void SetUploadFile(IContentBase content, Property property, IFileSystem fs, string filepath, Stream filestream) - { - // check if file is an image (and supports resizing and thumbnails etc) - var extension = Path.GetExtension(filepath); - var isImage = ImageHelper.IsImageFile(extension); - - // specific stuff for images (thumbnails etc) - if (isImage) - { - using (var image = Image.FromStream(filestream)) - { - // use one image for all - ImageHelper.GenerateThumbnails(fs, image, filepath, property.PropertyType); - UploadAutoFillProperties.Populate(content, property.Alias, filepath, filestream, image); - } - } - else - { - // will use filepath for extension, and filestream for length - UploadAutoFillProperties.Populate(content, property.Alias, filepath, filestream); - } - } - } -} diff --git a/src/Umbraco.Core/Media/UploadAutoFillProperties.cs b/src/Umbraco.Core/Media/UploadAutoFillProperties.cs index 625bdc4e47..d0e7347848 100644 --- a/src/Umbraco.Core/Media/UploadAutoFillProperties.cs +++ b/src/Umbraco.Core/Media/UploadAutoFillProperties.cs @@ -2,7 +2,6 @@ using System.Drawing; using System.IO; using System.Linq; -using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Logging; @@ -13,16 +12,27 @@ namespace Umbraco.Core.Media /// /// Provides methods to manage auto-fill properties for upload fields. /// - internal static class UploadAutoFillProperties + internal class UploadAutoFillProperties { + private readonly ILogger _logger; + private readonly MediaFileSystem _mediaFileSystem; + private readonly IContentSection _contentSettings; + + public UploadAutoFillProperties(MediaFileSystem mediaFileSystem, ILogger logger, IContentSection contentSettings) + { + _mediaFileSystem = mediaFileSystem; + _logger = logger; + _contentSettings = contentSettings; + } + /// /// Gets the auto-fill configuration for a specified property alias. /// /// The property type alias. /// The auto-fill configuration for the specified property alias, or null. - public static IImagingAutoFillUploadField GetConfig(string propertyTypeAlias) + public IImagingAutoFillUploadField GetConfig(string propertyTypeAlias) { - var autoFillConfigs = UmbracoConfig.For.UmbracoSettings().Content.ImageAutoFillProperties; + var autoFillConfigs = _contentSettings.ImageAutoFillProperties; return autoFillConfigs == null ? null : autoFillConfigs.FirstOrDefault(x => x.Alias == propertyTypeAlias); } @@ -31,7 +41,7 @@ namespace Umbraco.Core.Media /// /// The content item. /// The property type alias. - public static void Reset(IContentBase content, string propertyTypeAlias) + public void Reset(IContentBase content, string propertyTypeAlias) { if (content == null) throw new ArgumentNullException("content"); if (propertyTypeAlias == null) throw new ArgumentNullException("propertyTypeAlias"); @@ -49,7 +59,7 @@ namespace Umbraco.Core.Media /// /// The content item. /// The auto-fill configuration. - public static void Reset(IContentBase content, IImagingAutoFillUploadField autoFillConfig) + public void Reset(IContentBase content, IImagingAutoFillUploadField autoFillConfig) { if (content == null) throw new ArgumentNullException("content"); if (autoFillConfig == null) throw new ArgumentNullException("autoFillConfig"); @@ -63,7 +73,7 @@ namespace Umbraco.Core.Media /// The content item. /// The property type alias. /// The filesystem-relative filepath, or null to clear properties. - public static void Populate(IContentBase content, string propertyTypeAlias, string filepath) + public void Populate(IContentBase content, string propertyTypeAlias, string filepath) { if (content == null) throw new ArgumentNullException("content"); if (propertyTypeAlias == null) throw new ArgumentNullException("propertyTypeAlias"); @@ -87,7 +97,7 @@ namespace Umbraco.Core.Media /// The filesystem-relative filepath, or null to clear properties. /// The stream containing the file data. /// The file data as an image object. - public static void Populate(IContentBase content, string propertyTypeAlias, string filepath, Stream filestream, Image image = null) + public void Populate(IContentBase content, string propertyTypeAlias, string filepath, Stream filestream, Image image = null) { if (content == null) throw new ArgumentNullException("content"); if (propertyTypeAlias == null) throw new ArgumentNullException("propertyTypeAlias"); @@ -110,7 +120,7 @@ namespace Umbraco.Core.Media /// The auto-fill configuration. /// The filesystem path to the uploaded file. /// The parameter is the path relative to the filesystem. - public static void Populate(IContentBase content, IImagingAutoFillUploadField autoFillConfig, string filepath) + public void Populate(IContentBase content, IImagingAutoFillUploadField autoFillConfig, string filepath) { if (content == null) throw new ArgumentNullException("content"); if (autoFillConfig == null) throw new ArgumentNullException("autoFillConfig"); @@ -125,16 +135,16 @@ namespace Umbraco.Core.Media // if anything goes wrong, just reset the properties try { - using (var filestream = MediaHelper.FileSystem.OpenFile(filepath)) + using (var filestream = _mediaFileSystem.OpenFile(filepath)) { var extension = (Path.GetExtension(filepath) ?? "").TrimStart('.'); - var size = ImageHelper.IsImageFile(extension) ? (Size?)ImageHelper.GetDimensions(filestream) : null; + var size = _mediaFileSystem.IsImageFile(extension) ? (Size?) _mediaFileSystem.GetDimensions(filestream) : null; SetProperties(content, autoFillConfig, size, filestream.Length, extension); } } catch (Exception ex) { - LogHelper.Error(typeof(UploadAutoFillProperties), "Could not populate upload auto-fill properties for file \"" + _logger.Error(typeof(UploadAutoFillProperties), "Could not populate upload auto-fill properties for file \"" + filepath + "\".", ex); ResetProperties(content, autoFillConfig); } @@ -149,7 +159,7 @@ namespace Umbraco.Core.Media /// The filesystem-relative filepath, or null to clear properties. /// The stream containing the file data. /// The file data as an image object. - public static void Populate(IContentBase content, IImagingAutoFillUploadField autoFillConfig, string filepath, Stream filestream, Image image = null) + public void Populate(IContentBase content, IImagingAutoFillUploadField autoFillConfig, string filepath, Stream filestream, Image image = null) { if (content == null) throw new ArgumentNullException("content"); if (autoFillConfig == null) throw new ArgumentNullException("autoFillConfig"); @@ -164,7 +174,7 @@ namespace Umbraco.Core.Media var extension = (Path.GetExtension(filepath) ?? "").TrimStart('.'); Size? size; if (image == null) - size = ImageHelper.IsImageFile(extension) ? (Size?) ImageHelper.GetDimensions(filestream) : null; + size = _mediaFileSystem.IsImageFile(extension) ? (Size?) _mediaFileSystem.GetDimensions(filestream) : null; else size = new Size(image.Width, image.Height); SetProperties(content, autoFillConfig, size, filestream.Length, extension); diff --git a/src/Umbraco.Core/Models/ContentExtensions.cs b/src/Umbraco.Core/Models/ContentExtensions.cs index e54653ea29..49a6e89226 100644 --- a/src/Umbraco.Core/Models/ContentExtensions.cs +++ b/src/Umbraco.Core/Models/ContentExtensions.cs @@ -474,7 +474,7 @@ namespace Umbraco.Core.Models if (string.IsNullOrWhiteSpace(filename)) return; filename = filename.ToLower(); // fixme - er... why? - MediaHelper.SetUploadFile(content, propertyTypeAlias, filename, value.InputStream); + FileSystemProviderManager.Current.MediaFileSystem.SetUploadFile(content, propertyTypeAlias, filename, value.InputStream); } /// @@ -519,7 +519,7 @@ namespace Umbraco.Core.Models if (string.IsNullOrWhiteSpace(filename)) return; filename = filename.ToLower(); // fixme - er... why? - MediaHelper.SetUploadFile(content, propertyTypeAlias, filename, filestream); + FileSystemProviderManager.Current.MediaFileSystem.SetUploadFile(content, propertyTypeAlias, filename, filestream); } /// @@ -543,7 +543,7 @@ namespace Umbraco.Core.Models var propertyType = content.GetContentType() .CompositionPropertyTypes.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); if (propertyType == null) throw new ArgumentException("Invalid property type alias " + propertyTypeAlias + "."); - return MediaHelper.StoreFile(content, propertyType, filename, filestream, filepath); + return FileSystemProviderManager.Current.MediaFileSystem.StoreFile(content, propertyType, filename, filestream, filepath); } #endregion diff --git a/src/Umbraco.Core/Models/PublicAccessEntry.cs b/src/Umbraco.Core/Models/PublicAccessEntry.cs index 4af6f9536a..969e853f05 100644 --- a/src/Umbraco.Core/Models/PublicAccessEntry.cs +++ b/src/Umbraco.Core/Models/PublicAccessEntry.cs @@ -107,10 +107,7 @@ namespace Umbraco.Core.Models public void ClearRules() { - for (var i = _ruleCollection.Count - 1; i >= 0; i--) - { - RemoveRule(_ruleCollection[i]); - } + _ruleCollection.Clear(); } [DataMember] diff --git a/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs b/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs index 6f048bbf2c..57664b8a83 100644 --- a/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs +++ b/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs @@ -82,7 +82,7 @@ namespace Umbraco.Core.Packaging /// /// Performs the assembly scanning /// - /// + /// /// /// /// @@ -111,7 +111,7 @@ namespace Umbraco.Core.Packaging /// /// Performs the assembly scanning /// - /// + /// /// /// /// @@ -158,7 +158,7 @@ namespace Umbraco.Core.Packaging //get the list of assembly names to compare below var loadedNames = loaded.Select(x => x.GetName().Name).ToArray(); - + //Then load each referenced assembly into the context foreach (var a in loaded) { @@ -174,7 +174,7 @@ namespace Umbraco.Core.Packaging } catch (FileNotFoundException) { - //if an exception occurs it means that a referenced assembly could not be found + //if an exception occurs it means that a referenced assembly could not be found errors.Add( string.Concat("This package references the assembly '", assemblyName.Name, @@ -183,7 +183,7 @@ namespace Umbraco.Core.Packaging } catch (Exception ex) { - //if an exception occurs it means that a referenced assembly could not be found + //if an exception occurs it means that a referenced assembly could not be found errors.Add( string.Concat("This package could not be verified for compatibility. An error occurred while loading a referenced assembly '", assemblyName.Name, @@ -201,7 +201,7 @@ namespace Umbraco.Core.Packaging { //now we need to see if they contain any type 'T' var reflectedAssembly = a; - + try { var found = reflectedAssembly.GetExportedTypes() @@ -214,8 +214,8 @@ namespace Umbraco.Core.Packaging } catch (Exception ex) { - //This is a hack that nobody can seem to get around, I've read everything and it seems that - // this is quite a common thing when loading types into reflection only load context, so + //This is a hack that nobody can seem to get around, I've read everything and it seems that + // this is quite a common thing when loading types into reflection only load context, so // we're just going to ignore this specific one for now var typeLoadEx = ex as TypeLoadException; if (typeLoadEx != null) @@ -236,7 +236,7 @@ namespace Umbraco.Core.Packaging LogHelper.Error("An error occurred scanning package assemblies", ex); } } - + } errorReport = errors.ToArray(); @@ -256,7 +256,7 @@ namespace Umbraco.Core.Packaging var contractType = contractAssemblyLoadFrom.GetExportedTypes() .FirstOrDefault(x => x.FullName == typeof(T).FullName && x.Assembly.FullName == typeof(T).Assembly.FullName); - + if (contractType == null) { throw new InvalidOperationException("Could not find type " + typeof(T) + " in the LoadFrom assemblies"); diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs index a9c7a976a3..781d496a33 100644 --- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs @@ -19,7 +19,7 @@ namespace Umbraco.Core.Persistence private readonly ILogger _logger; public string ConnectionString { get; private set; } public string ProviderName { get; private set; } - + // NO! see notes in v8 HybridAccessorBase //[ThreadStatic] //private static volatile UmbracoDatabase _nonHttpInstance; diff --git a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs index 4d48652c0b..ded026bbec 100644 --- a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs @@ -657,7 +657,7 @@ WHERE EXISTS( var allsuccess = true; - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + var fs = FileSystemProviderManager.Current.MediaFileSystem; Parallel.ForEach(files, file => { try @@ -677,7 +677,7 @@ WHERE EXISTS( } else { - ImageHelper.DeleteFile(fs, file, true); + fs.DeleteFile(file, true); } } catch (Exception e) diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 8a86e59cc3..b9026eb6c4 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -8,6 +8,7 @@ using System.Text.RegularExpressions; using System.Threading; using Umbraco.Core.Configuration; using Umbraco.Core.Events; +using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Media; using Umbraco.Core.Models; @@ -33,6 +34,7 @@ namespace Umbraco.Core.Services private readonly EntityXmlSerializer _entitySerializer = new EntityXmlSerializer(); private readonly IDataTypeService _dataTypeService; private readonly IUserService _userService; + private readonly MediaFileSystem _mediaFileSystem = FileSystemProviderManager.Current.MediaFileSystem; public MediaService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory, IDataTypeService dataTypeService, IUserService userService) : base(provider, repositoryFactory, logger, eventMessagesFactory) @@ -1295,11 +1297,11 @@ namespace Umbraco.Core.Services public Stream GetMediaFileContentStream(string filepath) { - if (MediaHelper.FileSystem.FileExists(filepath) == false) + if (_mediaFileSystem.FileExists(filepath) == false) return null; try { - return MediaHelper.FileSystem.OpenFile(filepath); + return _mediaFileSystem.OpenFile(filepath); } catch { @@ -1309,19 +1311,19 @@ namespace Umbraco.Core.Services public void SetMediaFileContent(string filepath, Stream stream) { - MediaHelper.FileSystem.AddFile(filepath, stream, true); + _mediaFileSystem.AddFile(filepath, stream, true); } public void DeleteMediaFile(string filepath) { - ImageHelper.DeleteFile(MediaHelper.FileSystem, filepath, true); + _mediaFileSystem.DeleteFile(filepath, true); } public void GenerateThumbnails(string filepath, PropertyType propertyType) { - using (var filestream = MediaHelper.FileSystem.OpenFile(filepath)) + using (var filestream = _mediaFileSystem.OpenFile(filepath)) { - ImageHelper.GenerateThumbnails(MediaHelper.FileSystem, filestream, filepath, propertyType); + _mediaFileSystem.GenerateThumbnails(filestream, filepath, propertyType); } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 6715f89c29..c9b86c4c8e 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -146,6 +146,7 @@ + @@ -356,6 +357,7 @@ + @@ -371,7 +373,7 @@ - + @@ -581,7 +583,6 @@ - diff --git a/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs b/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs index 94ce25cc98..540070df31 100644 --- a/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs +++ b/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs @@ -6,12 +6,18 @@ using System.Threading; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.IO; +using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.IO { [TestFixture] public class ShadowFileSystemTests { + // tested: + // only 1 instance of this class is created + // SetUp and TearDown run before/after each test + // SetUp does not start before the previous TearDown returns + [SetUp] public void SetUp() { @@ -28,20 +34,8 @@ namespace Umbraco.Tests.IO private static void ClearFiles() { - var path = IOHelper.MapPath("FileSysTests"); - if (Directory.Exists(path)) - { - foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) - File.Delete(file); - Directory.Delete(path, true); - } - path = IOHelper.MapPath("App_Data"); - if (Directory.Exists(path)) - { - foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) - File.Delete(file); - Directory.Delete(path, true); - } + TestHelper.DeleteDirectory(IOHelper.MapPath("FileSysTests")); + TestHelper.DeleteDirectory(IOHelper.MapPath("App_Data")); } private static string NormPath(string path) @@ -341,8 +335,7 @@ namespace Umbraco.Tests.IO Assert.IsTrue(File.Exists(path + "/ShadowSystem/path/to/some/dir/f1.txt")); - // kill everything and let the shadow fs die - Directory.Delete(path + "/ShadowSystem", true); + // let the shadow fs die } [Test] @@ -420,7 +413,7 @@ namespace Umbraco.Tests.IO Assert.AreEqual(1, Directory.GetDirectories(appdata + "/Shadow").Length); scope.Complete(); Assert.IsTrue(fs.FileExists("sub/f4.txt")); - Assert.AreEqual(0, Directory.GetDirectories(appdata + "/Shadow").Length); + TestHelper.TryAssert(() => Assert.AreEqual(0, Directory.GetDirectories(appdata + "/Shadow").Length)); scope.Dispose(); Assert.IsTrue(fs.FileExists("sub/f4.txt")); Assert.IsFalse(Directory.Exists(appdata + "/Shadow/" + id)); @@ -477,7 +470,7 @@ namespace Umbraco.Tests.IO Assert.IsTrue(fs.FileExists("sub/f2.txt")); scope.Dispose(); Assert.IsTrue(fs.FileExists("sub/f2.txt")); - Assert.IsFalse(Directory.Exists(appdata + "/Shadow/" + id)); + TestHelper.TryAssert(() => Assert.IsFalse(Directory.Exists(appdata + "/Shadow/" + id))); string text; using (var s = fs.OpenFile("sub/f2.txt")) @@ -580,9 +573,8 @@ namespace Umbraco.Tests.IO File.WriteAllText(path + "/test/inner/f3.txt", "foo"); path = NormPath(path); - Directory.Delete(path, true); - - Assert.IsFalse(File.Exists(path + "/test/inner/f3.txt")); + TestHelper.Try(() => Directory.Delete(path, true)); + TestHelper.TryAssert(() => Assert.IsFalse(File.Exists(path + "/test/inner/f3.txt"))); } } } diff --git a/src/Umbraco.Tests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests/TestHelpers/TestHelper.cs index 6c8fc9308d..de62bff271 100644 --- a/src/Umbraco.Tests/TestHelpers/TestHelper.cs +++ b/src/Umbraco.Tests/TestHelpers/TestHelper.cs @@ -6,6 +6,7 @@ using System.Configuration; using System.IO; using System.Linq; using System.Reflection; +using System.Threading; using NUnit.Framework; using SqlCE4Umbraco; using Umbraco.Core; @@ -203,6 +204,50 @@ namespace Umbraco.Tests.TestHelpers } } + public static void DeleteDirectory(string path) + { + Try(() => + { + if (Directory.Exists(path) == false) return; + foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) + File.Delete(file); + }); + Try(() => + { + if (Directory.Exists(path) == false) return; + Directory.Delete(path, true); + }); + } + + public static void TryAssert(Action action, int maxTries = 5, int waitMilliseconds = 200) + { + Try(action, maxTries, waitMilliseconds); + } + + public static void Try(Action action, int maxTries = 5, int waitMilliseconds = 200) + { + Try(action, maxTries, waitMilliseconds); + } + + public static void Try(Action action, int maxTries = 5, int waitMilliseconds = 200) + where T : Exception + { + var tries = 0; + while (true) + { + try + { + action(); + break; + } + catch (T) + { + if (tries++ > maxTries) + throw; + Thread.Sleep(waitMilliseconds); + } + } + } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Editors/ImagesController.cs b/src/Umbraco.Web/Editors/ImagesController.cs index eae620e745..fa84ff345f 100644 --- a/src/Umbraco.Web/Editors/ImagesController.cs +++ b/src/Umbraco.Web/Editors/ImagesController.cs @@ -104,11 +104,11 @@ namespace Umbraco.Web.Editors /// private HttpResponseMessage GetResized(string imagePath, int width, string sizeName) { - var fs = FileSystemProviderManager.Current.GetFileSystemProvider(); + var fs = FileSystemProviderManager.Current.MediaFileSystem; var ext = Path.GetExtension(imagePath); // we need to check if it is an image by extension - if (ImageHelper.IsImageFile(ext) == false) + if (fs.IsImageFile(ext) == false) return Request.CreateResponse(HttpStatusCode.NotFound); //redirect to ImageProcessor thumbnail with rnd generated from last modified time of original media file diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs index 616c814731..7cef6fc1cc 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs @@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using Newtonsoft.Json.Linq; using Umbraco.Core; -using Umbraco.Core.Media; +using Umbraco.Core.IO; using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; @@ -14,6 +14,12 @@ namespace Umbraco.Web.PropertyEditors [PropertyEditor(Constants.PropertyEditors.UploadFieldAlias, "File upload", "fileupload", Icon = "icon-download-alt", Group = "media")] public class FileUploadPropertyEditor : PropertyEditor, IApplicationEventHandler { + private static MediaFileSystem MediaFileSystem + { + // v8 will get rid of singletons + get { return FileSystemProviderManager.Current.MediaFileSystem; } + } + /// /// Creates the corresponding property value editor. /// @@ -22,7 +28,7 @@ namespace Umbraco.Web.PropertyEditors { var baseEditor = base.CreateValueEditor(); baseEditor.Validators.Add(new UploadFileTypeValidator()); - return new FileUploadPropertyValueEditor(baseEditor); + return new FileUploadPropertyValueEditor(baseEditor, MediaFileSystem); } /// @@ -55,11 +61,9 @@ namespace Umbraco.Web.PropertyEditors /// The properties that were deleted. static IEnumerable GetFilesToDelete(IEnumerable properties) { - var fs = MediaHelper.FileSystem; - return properties .Where(x => IsUploadField(x, true)) - .Select(x => fs.GetRelativePath((string) x.Value)) + .Select(x => MediaFileSystem.GetRelativePath((string) x.Value)) .ToList(); } @@ -75,12 +79,11 @@ namespace Umbraco.Web.PropertyEditors // copy files var isUpdated = false; - var fs = MediaHelper.FileSystem; foreach (var property in properties) { - var sourcePath = fs.GetRelativePath((string) property.Value); - var copyPath = MediaHelper.CopyFile(args.Copy, property.PropertyType, sourcePath); - args.Copy.SetValue(property.Alias, fs.GetUrl(copyPath)); + var sourcePath = MediaFileSystem.GetRelativePath((string) property.Value); + var copyPath = MediaFileSystem.CopyFile(args.Copy, property.PropertyType, sourcePath); + args.Copy.SetValue(property.Alias, MediaFileSystem.GetUrl(copyPath)); isUpdated = true; } @@ -128,18 +131,17 @@ namespace Umbraco.Web.PropertyEditors static void AutoFillProperties(IContentBase content) { var properties = content.Properties.Where(x => IsUploadField(x, false)); - var fs = MediaHelper.FileSystem; foreach (var property in properties) { - var autoFillConfig = UploadAutoFillProperties.GetConfig(property.Alias); + var autoFillConfig = MediaFileSystem.UploadAutoFillProperties.GetConfig(property.Alias); if (autoFillConfig == null) continue; var svalue = property.Value as string; if (string.IsNullOrWhiteSpace(svalue)) - UploadAutoFillProperties.Reset(content, autoFillConfig); + MediaFileSystem.UploadAutoFillProperties.Reset(content, autoFillConfig); else - UploadAutoFillProperties.Populate(content, autoFillConfig, fs.GetRelativePath(svalue)); + MediaFileSystem.UploadAutoFillProperties.Populate(content, autoFillConfig, MediaFileSystem.GetRelativePath(svalue)); } } diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs index 1bba10c7a3..777a14b768 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs @@ -1,21 +1,13 @@ using System; using System.Collections.Generic; using System.Drawing; -using System.Globalization; using System.IO; using System.Linq; -using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using Umbraco.Core.Configuration; using Umbraco.Core.IO; -using Umbraco.Core.Logging; -using Umbraco.Core.Media; using Umbraco.Core.Models.Editors; using Umbraco.Core.PropertyEditors; using Umbraco.Web.Models.ContentEditing; -using umbraco; -using umbraco.cms.businesslogic.Files; -using Umbraco.Core; namespace Umbraco.Web.PropertyEditors { @@ -24,9 +16,13 @@ namespace Umbraco.Web.PropertyEditors /// internal class FileUploadPropertyValueEditor : PropertyValueEditorWrapper { - public FileUploadPropertyValueEditor(PropertyValueEditor wrapped) + private readonly MediaFileSystem _mediaFileSystem; + + public FileUploadPropertyValueEditor(PropertyValueEditor wrapped, MediaFileSystem mediaFileSystem) : base(wrapped) - { } + { + _mediaFileSystem = mediaFileSystem; + } /// /// Converts the value received from the editor into the value can be stored in the database. @@ -65,17 +61,16 @@ namespace Umbraco.Web.PropertyEditors return currentValue; // get the current file paths - var fs = MediaHelper.FileSystem; var currentPaths = currentValue.ToString() .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) - .Select(x => fs.GetRelativePath(x)) // get the fs-relative path + .Select(x => _mediaFileSystem.GetRelativePath(x)) // get the fs-relative path .ToArray(); // if clearing, remove these files and return if (clears) { foreach (var pathToRemove in currentPaths) - ImageHelper.DeleteFile(fs, pathToRemove, true); + _mediaFileSystem.DeleteFile(pathToRemove, true); return string.Empty; // no more files } @@ -108,19 +103,19 @@ namespace Umbraco.Web.PropertyEditors // get the filepath // in case we are using the old path scheme, try to re-use numbers (bah...) var reuse = i < currentPaths.Length ? currentPaths[i] : null; // this would be WRONG with many files - var filepath = MediaHelper.GetMediaPath(file.FileName, reuse, cuid, puid); // fs-relative path + var filepath = _mediaFileSystem.GetMediaPath(file.FileName, reuse, cuid, puid); // fs-relative path using (var filestream = File.OpenRead(file.TempFilePath)) { - fs.AddFile(filepath, filestream, true); // must overwrite! + _mediaFileSystem.AddFile(filepath, filestream, true); // must overwrite! - var ext = fs.GetExtension(filepath); - if (ImageHelper.IsImageFile(ext)) + var ext = _mediaFileSystem.GetExtension(filepath); + if (_mediaFileSystem.IsImageFile(ext)) { var preValues = editorValue.PreValues.FormatAsDictionary(); var sizes = preValues.Any() ? preValues.First().Value.Value : string.Empty; using (var image = Image.FromStream(filestream)) - ImageHelper.GenerateThumbnails(fs, image, filepath, sizes); + _mediaFileSystem.GenerateThumbnails(image, filepath, sizes); } // all related properties (auto-fill) are managed by FileUploadPropertyEditor @@ -136,10 +131,10 @@ namespace Umbraco.Web.PropertyEditors // remove files that are not there anymore foreach (var pathToRemove in currentPaths.Except(newPaths)) - ImageHelper.DeleteFile(fs, pathToRemove, true); + _mediaFileSystem.DeleteFile(pathToRemove, true); - return string.Join(",", newPaths.Select(x => fs.GetUrl(x))); + return string.Join(",", newPaths.Select(x => _mediaFileSystem.GetUrl(x))); } } } \ No newline at end of file diff --git a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs index 9b9974c705..a7669b0c9c 100644 --- a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; using Umbraco.Core; +using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Media; using Umbraco.Core.Models; @@ -36,6 +37,12 @@ namespace Umbraco.Web.PropertyEditors }; } + private static MediaFileSystem MediaFileSystem + { + // v8 will get rid of singletons + get { return FileSystemProviderManager.Current.MediaFileSystem; } + } + /// /// Creates the corresponding property value editor. /// @@ -43,7 +50,7 @@ namespace Umbraco.Web.PropertyEditors protected override PropertyValueEditor CreateValueEditor() { var baseEditor = base.CreateValueEditor(); - return new ImageCropperPropertyValueEditor(baseEditor); + return new ImageCropperPropertyValueEditor(baseEditor, MediaFileSystem); } /// @@ -100,14 +107,12 @@ namespace Umbraco.Web.PropertyEditors /// The properties that were deleted. static IEnumerable GetFilesToDelete(IEnumerable properties) { - var fs = MediaHelper.FileSystem; - return properties.Where(x => IsCropperField(x, true)).Select(x => { var jo = GetJObject((string) x.Value, true); if (jo == null || jo["src"] == null) return null; var src = jo["src"].Value(); - return string.IsNullOrWhiteSpace(src) ? null : fs.GetRelativePath(src); + return string.IsNullOrWhiteSpace(src) ? null : MediaFileSystem.GetRelativePath(src); }).WhereNotNull(); } @@ -123,7 +128,6 @@ namespace Umbraco.Web.PropertyEditors // copy files var isUpdated = false; - var fs = MediaHelper.FileSystem; foreach (var property in properties) { var jo = GetJObject((string) property.Value, true); @@ -132,9 +136,9 @@ namespace Umbraco.Web.PropertyEditors var src = jo["src"].Value(); if (string.IsNullOrWhiteSpace(src)) continue; - var sourcePath = fs.GetRelativePath(src); - var copyPath = MediaHelper.CopyFile(args.Copy, property.PropertyType, sourcePath); - jo["src"] = fs.GetUrl(copyPath); + var sourcePath = MediaFileSystem.GetRelativePath(src); + var copyPath = MediaFileSystem.CopyFile(args.Copy, property.PropertyType, sourcePath); + jo["src"] = MediaFileSystem.GetUrl(copyPath); args.Copy.SetValue(property.Alias, jo.ToString()); isUpdated = true; } @@ -183,17 +187,16 @@ namespace Umbraco.Web.PropertyEditors static void AutoFillProperties(IContentBase content) { var properties = content.Properties.Where(x => IsCropperField(x, false)); - var fs = MediaHelper.FileSystem; foreach (var property in properties) { - var autoFillConfig = UploadAutoFillProperties.GetConfig(property.Alias); + var autoFillConfig = MediaFileSystem.UploadAutoFillProperties.GetConfig(property.Alias); if (autoFillConfig == null) continue; var svalue = property.Value as string; if (string.IsNullOrWhiteSpace(svalue)) { - UploadAutoFillProperties.Reset(content, autoFillConfig); + MediaFileSystem.UploadAutoFillProperties.Reset(content, autoFillConfig); continue; } @@ -218,9 +221,9 @@ namespace Umbraco.Web.PropertyEditors } if (src == null) - UploadAutoFillProperties.Reset(content, autoFillConfig); + MediaFileSystem.UploadAutoFillProperties.Reset(content, autoFillConfig); else - UploadAutoFillProperties.Populate(content, autoFillConfig, fs.GetRelativePath(src)); + MediaFileSystem.UploadAutoFillProperties.Populate(content, autoFillConfig, MediaFileSystem.GetRelativePath(src)); } } diff --git a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs index f1f26f003b..f717711bac 100644 --- a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs @@ -28,8 +28,13 @@ namespace Umbraco.Web.PropertyEditors /// internal class ImageCropperPropertyValueEditor : PropertyValueEditorWrapper { - public ImageCropperPropertyValueEditor(PropertyValueEditor wrapped) : base(wrapped) - { } + private MediaFileSystem _mediaFileSystem; + + public ImageCropperPropertyValueEditor(PropertyValueEditor wrapped, MediaFileSystem mediaFileSystem) + : base(wrapped) + { + _mediaFileSystem = mediaFileSystem; + } /// /// This is called to merge in the prevalue crops with the value that is saved - similar to the property value converter for the front-end @@ -65,8 +70,6 @@ namespace Umbraco.Web.PropertyEditors /// public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue) { - var fs = MediaHelper.FileSystem; - // get the current path var currentPath = string.Empty; try @@ -82,7 +85,7 @@ namespace Umbraco.Web.PropertyEditors LogHelper.WarnWithException("Could not parse current db value to a JObject.", ex); } if (string.IsNullOrWhiteSpace(currentPath) == false) - currentPath = fs.GetRelativePath(currentPath); + currentPath = _mediaFileSystem.GetRelativePath(currentPath); // get the new json and path JObject editorJson = null; @@ -122,7 +125,7 @@ namespace Umbraco.Web.PropertyEditors // value is unchanged. if (string.IsNullOrWhiteSpace(editorFile) && string.IsNullOrWhiteSpace(currentPath) == false) { - ImageHelper.DeleteFile(fs, currentPath, true); + _mediaFileSystem.DeleteFile(currentPath, true); return null; // clear } @@ -130,7 +133,7 @@ namespace Umbraco.Web.PropertyEditors } // process the file - var filepath = editorJson == null ? null : ProcessFile(editorValue, file, fs, currentPath, cuid, puid); + var filepath = editorJson == null ? null : ProcessFile(editorValue, file, currentPath, cuid, puid); // remove all temp files foreach (var f in files) @@ -138,15 +141,15 @@ namespace Umbraco.Web.PropertyEditors // remove current file if replaced if (currentPath != filepath && string.IsNullOrWhiteSpace(currentPath) == false) - ImageHelper.DeleteFile(fs, currentPath, true); + _mediaFileSystem.DeleteFile(currentPath, true); // update json and return if (editorJson == null) return null; - editorJson["src"] = filepath == null ? string.Empty : fs.GetUrl(filepath); + editorJson["src"] = filepath == null ? string.Empty : _mediaFileSystem.GetUrl(filepath); return editorJson.ToString(); } - private string ProcessFile(ContentPropertyData editorValue, ContentItemFile file, IFileSystem fs, string currentPath, Guid cuid, Guid puid) + private string ProcessFile(ContentPropertyData editorValue, ContentItemFile file, string currentPath, Guid cuid, Guid puid) { // process the file // no file, invalid file, reject change @@ -155,19 +158,19 @@ namespace Umbraco.Web.PropertyEditors // get the filepath // in case we are using the old path scheme, try to re-use numbers (bah...) - var filepath = MediaHelper.GetMediaPath(file.FileName, currentPath, cuid, puid); // fs-relative path + var filepath = _mediaFileSystem.GetMediaPath(file.FileName, currentPath, cuid, puid); // fs-relative path using (var filestream = File.OpenRead(file.TempFilePath)) { - fs.AddFile(filepath, filestream, true); // must overwrite! + _mediaFileSystem.AddFile(filepath, filestream, true); // must overwrite! - var ext = fs.GetExtension(filepath); - if (ImageHelper.IsImageFile(ext)) + var ext = _mediaFileSystem.GetExtension(filepath); + if (_mediaFileSystem.IsImageFile(ext)) { var preValues = editorValue.PreValues.FormatAsDictionary(); var sizes = preValues.Any() ? preValues.First().Value.Value : string.Empty; using (var image = Image.FromStream(filestream)) - ImageHelper.GenerateThumbnails(fs, image, filepath, sizes); + _mediaFileSystem.GenerateThumbnails(image, filepath, sizes); } // all related properties (auto-fill) are managed by ImageCropperPropertyEditor @@ -194,6 +197,4 @@ namespace Umbraco.Web.PropertyEditors return newVal; } } - - } diff --git a/src/umbraco.cms/businesslogic/Content.cs b/src/umbraco.cms/businesslogic/Content.cs index e7b9d7fe66..c55204fe8e 100644 --- a/src/umbraco.cms/businesslogic/Content.cs +++ b/src/umbraco.cms/businesslogic/Content.cs @@ -632,7 +632,7 @@ namespace umbraco.cms.businesslogic } else { - ImageHelper.DeleteFile(fs, relativeFilePath, true); + fs.DeleteFile(relativeFilePath, true); } } } diff --git a/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs b/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs index b80b2892a4..5eecd607b5 100644 --- a/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs +++ b/src/umbraco.cms/businesslogic/datatype/FileHandlerData.cs @@ -73,7 +73,7 @@ namespace umbraco.cms.businesslogic.datatype int subfolderId; var numberedFolder = int.TryParse(subfolder, out subfolderId) ? subfolderId.ToString(CultureInfo.InvariantCulture) - : MediaHelper.GetNextFolder(); + : fs.GetNextFolder(); var fileName = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories ? Path.Combine(numberedFolder, name) From d7aeae3d26233406f3a392d148ccde68503f3bd8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 14 Nov 2016 11:16:53 +0100 Subject: [PATCH 107/841] bind open partial view overlay function to view model --- .../src/views/common/overlays/insert/insert.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js index 1bdc6b778e..f633e3997f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js @@ -16,7 +16,7 @@ vm.openMacroPicker = openMacroPicker; vm.openPageFieldOverlay = openPageFieldOverlay; vm.openDictionaryItemOverlay = openDictionaryItemOverlay; - + vm.openPartialOverlay = openPartialOverlay; function openMacroPicker() { From b3e9617aff634d8421d40ce59064203da379c9c1 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 14 Nov 2016 13:06:45 +0100 Subject: [PATCH 108/841] query builder overlay first refactor: use controllerAs syntax + move css to .less file instead of inline + fix indention --- src/Umbraco.Web.UI.Client/src/less/belle.less | 1 + .../src/less/components/umb-querybuilder.less | 14 ++ .../querybuilder/querybuilder.controller.js | 179 ++++++++------ .../overlays/querybuilder/querybuilder.html | 224 ++++++++---------- 4 files changed, 220 insertions(+), 198 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less diff --git a/src/Umbraco.Web.UI.Client/src/less/belle.less b/src/Umbraco.Web.UI.Client/src/less/belle.less index 861391f230..d6a967733f 100644 --- a/src/Umbraco.Web.UI.Client/src/less/belle.less +++ b/src/Umbraco.Web.UI.Client/src/less/belle.less @@ -117,6 +117,7 @@ @import "components/umb-lightbox.less"; @import "components/umb-avatar.less"; @import "components/umb-progress-bar.less"; +@import "components/umb-querybuilder.less"; @import "components/buttons/umb-button.less"; @import "components/buttons/umb-button-group.less"; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less new file mode 100644 index 0000000000..2c6a089eeb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less @@ -0,0 +1,14 @@ +.umb-querybuilder .row { + font-size: 12px; + line-height: 12px +} + +.umb-querybuilder .row a.btn { + font-size: 12px; + background: lightyellow +} + +.umb-querybuilder .row > div { + padding: 20px 0; + border-bottom: 1px solid @grayLighter; +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js index 1680c4f9d1..b31949598b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js @@ -1,101 +1,122 @@ -angular.module("umbraco").controller('Umbraco.Overlays.QueryBuilderController', - function($scope, $http, dialogService){ - - $http.get("backoffice/UmbracoApi/TemplateQuery/GetAllowedProperties").then(function(response) { - $scope.properties = response.data; +(function () { + "use strict"; + + function QueryBuilderOverlayController($scope, $http, dialogService) { + + var vm = this; + + vm.properties = []; + vm.contentTypes = []; + vm.conditions = []; + + vm.query = { + contentType: { + name: "Everything" + }, + source: { + name: "My website" + }, + filters: [ + { + property: undefined, + operator: undefined + } + ], + sort: { + property: { + alias: "", + name: "", + }, + direction: "ascending" + } + }; + + vm.chooseSource = chooseSource; + vm.getPropertyOperators = getPropertyOperators; + vm.addFilter = addFilter; + vm.trashFilter = trashFilter; + vm.changeSortOrder = changeSortOrder; + vm.setSortProperty = setSortProperty; + + function onInit() { + + $http.get("backoffice/UmbracoApi/TemplateQuery/GetAllowedProperties").then(function (response) { + vm.properties = response.data; }); $http.get("backoffice/UmbracoApi/TemplateQuery/GetContentTypes").then(function (response) { - $scope.contentTypes = response.data; + vm.contentTypes = response.data; }); $http.get("backoffice/UmbracoApi/TemplateQuery/GetFilterConditions").then(function (response) { - $scope.conditions = response.data; + vm.conditions = response.data; }); + } - $scope.query = { - contentType: { - name: "Everything" - }, - source:{ - name: "My website" - }, - filters:[ - { - property:undefined, - operator: undefined - } - ], - sort:{ - property:{ - alias: "", - name: "", - }, - direction: "ascending" - } - }; + function chooseSource(query) { + dialogService.contentPicker({ + callback: function (data) { + if (data.id > 0) { + query.source = { id: data.id, name: data.name }; + } else { + query.source.name = "My website"; + delete query.source.id; + } + } + }); + } + function getPropertyOperators(property) { + var conditions = _.filter(vm.conditions, function (condition) { + var index = condition.appliesTo.indexOf(property.type); + return index >= 0; + }); + return conditions; + } - $scope.chooseSource = function(query){ - dialogService.contentPicker({ - callback: function (data) { + function addFilter(query) { + query.filters.push({}); + } - if (data.id > 0) { - query.source = { id: data.id, name: data.name }; - } else { - query.source.name = "My website"; - delete query.source.id; - } - } - }); - }; + function trashFilter(query) { + query.filters.splice(query, 1); + } - var throttledFunc = _.throttle(function() { + function changeSortOrder(query) { + if (query.sort.direction === "ascending") { + query.sort.direction = "descending"; + } else { + query.sort.direction = "ascending"; + } + } - $http.post("backoffice/UmbracoApi/TemplateQuery/PostTemplateQuery", $scope.query).then(function (response) { - $scope.model.result = response.data; - }); + function setSortProperty(query, property) { + query.sort.property = property; + if (property.type === "datetime") { + query.sort.direction = "descending"; + } else { + query.sort.direction = "ascending"; + } + } - }, 200); + var throttledFunc = _.throttle(function () { - $scope.$watch("query", function(value) { - throttledFunc(); - }, true); + $http.post("backoffice/UmbracoApi/TemplateQuery/PostTemplateQuery", vm.query).then(function (response) { + $scope.model.result = response.data; + }); - $scope.getPropertyOperators = function (property) { + }, 200); - var conditions = _.filter($scope.conditions, function(condition) { - var index = condition.appliesTo.indexOf(property.type); - return index >= 0; - }); - return conditions; - }; + $scope.$watch("vm.query", function (value) { + throttledFunc(); + }, true); - - $scope.addFilter = function(query){ - query.filters.push({}); - }; + onInit(); + + } - $scope.trashFilter = function (query) { - query.filters.splice(query,1); - }; + angular.module("umbraco").controller("Umbraco.Overlays.QueryBuilderController", QueryBuilderOverlayController); - $scope.changeSortOrder = function(query){ - if(query.sort.direction === "ascending"){ - query.sort.direction = "descending"; - }else{ - query.sort.direction = "ascending"; - } - }; - - $scope.setSortProperty = function(query, property){ - query.sort.property = property; - if(property.type === "datetime"){ - query.sort.direction = "descending"; - }else{ - query.sort.direction = "ascending"; - } - }; - }); \ No newline at end of file +})(); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html index d18cb3a412..9cf3dc5d55 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html @@ -1,136 +1,122 @@ -
    - - +
    +
    + +
    Returns {{model.result.resultCount}} items in {{model.result.executionTime}} miliseconds
    + + + +
    +{{model.result.queryExpression}}
    +		
    + +
    \ No newline at end of file From 91b925f95c0c102df8d5e943d10d70a701c3439d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 14 Nov 2016 13:07:26 +0100 Subject: [PATCH 109/841] change white-space on pre elements so line wraps --- src/Umbraco.Web.UI.Client/src/less/hacks.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/hacks.less b/src/Umbraco.Web.UI.Client/src/less/hacks.less index 716cb40256..dc1212f33d 100644 --- a/src/Umbraco.Web.UI.Client/src/less/hacks.less +++ b/src/Umbraco.Web.UI.Client/src/less/hacks.less @@ -197,7 +197,7 @@ pre { font-size: @baseFontSize - 1; // 14px to 13px color: @grayDark; line-height: @baseLineHeight; - white-space: pre; // 1 + white-space: pre-line; // 1 overflow-x: auto; // 1 background-color: #f5f5f5; border: 1px solid #ccc; // fallback for IE7-8 From 94708921182db00411fbd3a6060954e7b306d934 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 14 Nov 2016 13:21:42 +0100 Subject: [PATCH 110/841] query builder overlay: use overlay directive instead of dialogservice to open contentPicker --- .../querybuilder/querybuilder.controller.js | 24 ++++++++++++++----- .../overlays/querybuilder/querybuilder.html | 8 +++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js index b31949598b..48eb1b4c5c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js @@ -55,17 +55,29 @@ } function chooseSource(query) { - dialogService.contentPicker({ - callback: function (data) { + vm.contentPickerOverlay = { + view: "contentpicker", + show: true, + submit: function(model) { - if (data.id > 0) { - query.source = { id: data.id, name: data.name }; + var selectedNodeId = model.selection[0].id; + var selectedNodeName = model.selection[0].name; + + if (selectedNodeId > 0) { + query.source = { id: selectedNodeId, name: selectedNodeName }; } else { query.source.name = "My website"; delete query.source.id; } + + vm.contentPickerOverlay.show = false; + vm.contentPickerOverlay = null; + }, + close: function(oldModel) { + vm.contentPickerOverlay.show = false; + vm.contentPickerOverlay = null; } - }); + }; } function getPropertyOperators(property) { @@ -114,7 +126,7 @@ }, true); onInit(); - + } angular.module("umbraco").controller("Umbraco.Overlays.QueryBuilderController", QueryBuilderOverlayController); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html index 9cf3dc5d55..a6369f8d73 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html @@ -119,4 +119,12 @@ + + + + \ No newline at end of file From df12f19c53b7e4bf0ae1df89e212579a4bfdde24 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 14 Nov 2016 16:08:21 +0100 Subject: [PATCH 111/841] U4-9115 - fix issue --- .../Upgrades/TargetVersionSevenFiveFive/AddLockObjects.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockObjects.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockObjects.cs index d5c377fba1..c56ae0e2f1 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockObjects.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveFive/AddLockObjects.cs @@ -31,7 +31,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveFiv // be safe: delete old umbracoNode lock objects if any db.Execute("DELETE FROM umbracoNode WHERE id=@id;", new { id }); // then create umbracoLock object - db.Execute("INSERT umbracoLock (id, name, value) VALUES (@id, '@name', 1);", new { id, name }); + db.Execute("INSERT umbracoLock (id, name, value) VALUES (@id, @name, 1);", new { id, name }); return string.Empty; }); } From 740abb14265541891bf7f89f629b1c5cb7199821 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Mon, 14 Nov 2016 16:17:58 +0100 Subject: [PATCH 112/841] We don't support C# 6 yet --- src/Umbraco.Tests/Persistence/LocksTests.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Tests/Persistence/LocksTests.cs b/src/Umbraco.Tests/Persistence/LocksTests.cs index e973b14614..624a94f39f 100644 --- a/src/Umbraco.Tests/Persistence/LocksTests.cs +++ b/src/Umbraco.Tests/Persistence/LocksTests.cs @@ -254,7 +254,9 @@ namespace Umbraco.Tests.Persistence var info = database.Query("SELECT * FROM sys.lock_information;"); Console.WriteLine("LOCKS:"); foreach (var row in info) - Console.WriteLine($"> {row.request_spid} {row.resource_type} {row.resource_description} {row.request_mode} {row.resource_table} {row.resource_table_id} {row.request_status}"); + Console.WriteLine(string.Format("> {0} {1} {2} {3} {4} {5} {6}", row.request_spid, + row.resource_type, row.resource_description, row.request_mode, row.resource_table, + row.resource_table_id, row.request_status)); Thread.Sleep(6000); } catch (Exception e) @@ -277,7 +279,9 @@ namespace Umbraco.Tests.Persistence var info = database.Query("SELECT * FROM sys.lock_information;"); Console.WriteLine("LOCKS:"); foreach (var row in info) - Console.WriteLine($"> {row.request_spid} {row.resource_type} {row.resource_description} {row.request_mode} {row.resource_table} {row.resource_table_id} {row.request_status}"); + Console.WriteLine(string.Format("> {0} {1} {2} {3} {4} {5} {6}", row.request_spid, + row.resource_type, row.resource_description, row.request_mode, row.resource_table, + row.resource_table_id, row.request_status)); Thread.Sleep(1000); } catch (Exception e) From 9d2fb0dd03317332c7282f74762ee9da11b29d5b Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 14 Nov 2016 19:01:44 +0100 Subject: [PATCH 113/841] Fix after merges --- src/Umbraco.Core/Services/MediaService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 8bb22bc77f..0e3078979d 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading; +using System.Xml.Linq; using Umbraco.Core.Configuration; using Umbraco.Core.Events; using Umbraco.Core.IO; From 22204a62d4339a0bf018b28e9ce280f0a6f7242d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 14 Nov 2016 19:22:49 +0100 Subject: [PATCH 114/841] move http requests to resource file --- .../resources/templatequery.resource.js | 151 ++++++++++++++++++ .../querybuilder/querybuilder.controller.js | 30 ++-- .../Editors/BackOfficeController.cs | 4 + 3 files changed, 172 insertions(+), 13 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/common/resources/templatequery.resource.js diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/templatequery.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/templatequery.resource.js new file mode 100644 index 0000000000..a776aef32e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/resources/templatequery.resource.js @@ -0,0 +1,151 @@ +/** + * @ngdoc service + * @name umbraco.resources.templateQueryResource + * @function + * + * @description + * Used by the query builder + */ +(function () { + 'use strict'; + + function templateQueryResource($http, umbRequestHelper) { + + /** + * @ngdoc function + * @name umbraco.resources.templateQueryResource#getAllowedProperties + * @methodOf umbraco.resources.templateQueryResource + * @function + * + * @description + * Called to get allowed properties + * ##usage + *
    +         * templateQueryResource.getAllowedProperties()
    +         *    .then(function(response) {
    +         *
    +         *    });
    +         * 
    + */ + function getAllowedProperties() { + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "templateQueryApiBaseUrl", + "GetAllowedProperties")), + 'Failed to retrieve properties'); + } + + /** + * @ngdoc function + * @name umbraco.resources.templateQueryResource#getContentTypes + * @methodOf umbraco.resources.templateQueryResource + * @function + * + * @description + * Called to get content types + * ##usage + *
    +         * templateQueryResource.getContentTypes()
    +         *    .then(function(response) {
    +         *
    +         *    });
    +         * 
    + */ + function getContentTypes() { + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "templateQueryApiBaseUrl", + "GetContentTypes")), + 'Failed to retrieve content types'); + } + + /** + * @ngdoc function + * @name umbraco.resources.templateQueryResource#getFilterConditions + * @methodOf umbraco.resources.templateQueryResource + * @function + * + * @description + * Called to the filter conditions + * ##usage + *
    +         * templateQueryResource.getFilterConditions()
    +         *    .then(function(response) {
    +         *
    +         *    });
    +         * 
    + */ + function getFilterConditions() { + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "templateQueryApiBaseUrl", + "GetFilterConditions")), + 'Failed to retrieve filter conditions'); + } + + /** + * @ngdoc function + * @name umbraco.resources.templateQueryResource#postTemplateQuery + * @methodOf umbraco.resources.templateQueryResource + * @function + * + * @description + * Called to get content types + * ##usage + *
    +         * var query = {
    +         *     contentType: {
    +         *         name: "Everything"
    +         *      },
    +         *      source: {
    +         *          name: "My website"
    +         *      },
    +         *      filters: [
    +         *          {
    +         *              property: undefined,
    +         *              operator: undefined
    +         *          }
    +         *      ],
    +         *      sort: {
    +         *          property: {
    +         *              alias: "",
    +         *              name: "",
    +         *          },
    +         *          direction: "ascending"
    +         *      }
    +         *  };
    +         * 
    +         * templateQueryResource.postTemplateQuery(query)
    +         *    .then(function(response) {
    +         *
    +         *    });
    +         * 
    + * @param {object} query Query to build result + */ + function postTemplateQuery(query) { + return umbRequestHelper.resourcePromise( + $http.post( + umbRequestHelper.getApiUrl( + "templateQueryApiBaseUrl", + "PostTemplateQuery", + query)), + 'Failed to retrieve result'); + } + + var resource = { + getAllowedProperties: getAllowedProperties, + getContentTypes: getContentTypes, + getFilterConditions: getFilterConditions, + postTemplateQuery: postTemplateQuery + }; + + return resource; + + } + + angular.module('umbraco.resources').factory('templateQueryResource', templateQueryResource); + +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js index 48eb1b4c5c..c4149f0e14 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js @@ -1,7 +1,7 @@ (function () { "use strict"; - function QueryBuilderOverlayController($scope, $http, dialogService) { + function QueryBuilderOverlayController($scope, templateQueryResource) { var vm = this; @@ -40,17 +40,20 @@ function onInit() { - $http.get("backoffice/UmbracoApi/TemplateQuery/GetAllowedProperties").then(function (response) { - vm.properties = response.data; - }); + templateQueryResource.getAllowedProperties() + .then(function (properties) { + vm.properties = properties; + }); - $http.get("backoffice/UmbracoApi/TemplateQuery/GetContentTypes").then(function (response) { - vm.contentTypes = response.data; - }); + templateQueryResource.getContentTypes() + .then(function (contentTypes) { + vm.contentTypes = contentTypes; + }); - $http.get("backoffice/UmbracoApi/TemplateQuery/GetFilterConditions").then(function (response) { - vm.conditions = response.data; - }); + templateQueryResource.getFilterConditions() + .then(function (conditions) { + vm.conditions = conditions; + }); } @@ -115,9 +118,10 @@ var throttledFunc = _.throttle(function () { - $http.post("backoffice/UmbracoApi/TemplateQuery/PostTemplateQuery", vm.query).then(function (response) { - $scope.model.result = response.data; - }); + templateQueryResource.postTemplateQuery(vm.query) + .then(function (response) { + $scope.model.result = response; + }); }, 200); diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs index 0f6be5d37f..c092811a08 100644 --- a/src/Umbraco.Web/Editors/BackOfficeController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeController.cs @@ -363,6 +363,10 @@ namespace Umbraco.Web.Editors { "healthCheckBaseUrl", Url.GetUmbracoApiServiceBaseUrl( controller => controller.GetAllHealthChecks()) + }, + { + "templateQueryApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl( + controller => controller.PostTemplateQuery(null)) } } }, From addad5b7dc7d2f01c955f02bd2f8c7184c561375 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 14 Nov 2016 19:57:55 +0100 Subject: [PATCH 115/841] fix http request --- .../src/common/resources/templatequery.resource.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/templatequery.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/templatequery.resource.js index a776aef32e..04569fccff 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/templatequery.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/templatequery.resource.js @@ -130,9 +130,9 @@ $http.post( umbRequestHelper.getApiUrl( "templateQueryApiBaseUrl", - "PostTemplateQuery", - query)), - 'Failed to retrieve result'); + "PostTemplateQuery"), + query), + 'Failed to retrieve query'); } var resource = { From 1f3d305a55ab1704124d8a91544f100a46a4735a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 14 Nov 2016 20:20:03 +0100 Subject: [PATCH 116/841] remove $scope watch --- .../querybuilder/querybuilder.controller.js | 37 ++++++++++++++++--- .../overlays/querybuilder/querybuilder.html | 8 ++-- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js index c4149f0e14..bc5bc10e13 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js @@ -37,6 +37,10 @@ vm.trashFilter = trashFilter; vm.changeSortOrder = changeSortOrder; vm.setSortProperty = setSortProperty; + vm.setContentType = setContentType; + vm.setFilterProperty = setFilterProperty; + vm.setFilterTerm = setFilterTerm; + vm.changeConstraintValue = changeConstraintValue; function onInit() { @@ -54,6 +58,8 @@ .then(function (conditions) { vm.conditions = conditions; }); + + throttledFunc(); } @@ -61,6 +67,7 @@ vm.contentPickerOverlay = { view: "contentpicker", show: true, + submitButtonLabel: "Insert", submit: function(model) { var selectedNodeId = model.selection[0].id; @@ -73,6 +80,8 @@ delete query.source.id; } + throttledFunc(); + vm.contentPickerOverlay.show = false; vm.contentPickerOverlay = null; }, @@ -105,6 +114,7 @@ } else { query.sort.direction = "ascending"; } + throttledFunc(); } function setSortProperty(query, property) { @@ -114,20 +124,37 @@ } else { query.sort.direction = "ascending"; } + throttledFunc(); + } + + function setContentType(contentType) { + vm.query.contentType = contentType; + throttledFunc(); + } + + function setFilterProperty(filter, property) { + filter.property = property; + throttledFunc(); + } + + function setFilterTerm(filter, term) { + filter.term = term; + throttledFunc(); + } + + function changeConstraintValue() { + throttledFunc(); } var throttledFunc = _.throttle(function () { - + templateQueryResource.postTemplateQuery(vm.query) .then(function (response) { $scope.model.result = response; }); }, 200); - - $scope.$watch("vm.query", function (value) { - throttledFunc(); - }, true); + onInit(); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html index a6369f8d73..40fb909390 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html @@ -15,7 +15,7 @@ @@ -44,7 +44,7 @@
    internal class RequestLifespanMessagesFactory : IEventMessagesFactory { + private const string ContextKey = "Umbraco.Web.RequestLifespanMessagesFactory"; private readonly IHttpContextAccessor _httpAccessor; public RequestLifespanMessagesFactory(IHttpContextAccessor httpAccessor) @@ -18,11 +20,43 @@ namespace Umbraco.Web public EventMessages Get() { - if (_httpAccessor.Value.Items[typeof (RequestLifespanMessagesFactory).Name] == null) + var httpContext = _httpAccessor.Value; + if (httpContext != null) { - _httpAccessor.Value.Items[typeof(RequestLifespanMessagesFactory).Name] = new EventMessages(); + var eventMessages = httpContext.Items[ContextKey] as EventMessages; + if (eventMessages == null) httpContext.Items[ContextKey] = eventMessages = new EventMessages(); + return eventMessages; } - return (EventMessages)_httpAccessor.Value.Items[typeof (RequestLifespanMessagesFactory).Name]; + + var lccContext = CallContext.LogicalGetData(ContextKey) as EventMessages; + if (lccContext != null) return lccContext; + + throw new Exception("Could not get messages."); + } + + public EventMessages TryGet() + { + var httpContext = _httpAccessor.Value; + return httpContext != null + ? httpContext.Items[ContextKey] as EventMessages + : CallContext.LogicalGetData(ContextKey) as EventMessages; + } + + // Deploy wants to execute things outside of a request, where this factory would fail, + // so the factory is extended so that Deploy can Set/Clear event messages in the logical + // call context (which flows with async) - it needs to be set and cleared because, contrary + // to http context, it's not being cleared at the end of anything. + // + // to be refactored in v8! the whole IEventMessagesFactory is borked anyways + + public void SetLlc() + { + CallContext.LogicalSetData(ContextKey, new EventMessages()); + } + + public void ClearLlc() + { + CallContext.FreeNamedDataSlot(ContextKey); } } } \ No newline at end of file diff --git a/src/Umbraco.Web/SingletonHttpContextAccessor.cs b/src/Umbraco.Web/SingletonHttpContextAccessor.cs index cdeafa48e1..3d6ac159fb 100644 --- a/src/Umbraco.Web/SingletonHttpContextAccessor.cs +++ b/src/Umbraco.Web/SingletonHttpContextAccessor.cs @@ -6,7 +6,11 @@ namespace Umbraco.Web { public HttpContextBase Value { - get { return new HttpContextWrapper(HttpContext.Current); } + get + { + var httpContext = HttpContext.Current; + return httpContext == null ? null : new HttpContextWrapper(httpContext); + } } } } \ No newline at end of file diff --git a/src/Umbraco.Web/UmbracoContextExtensions.cs b/src/Umbraco.Web/UmbracoContextExtensions.cs index 8cd38df6d1..53ef92690e 100644 --- a/src/Umbraco.Web/UmbracoContextExtensions.cs +++ b/src/Umbraco.Web/UmbracoContextExtensions.cs @@ -53,9 +53,8 @@ namespace Umbraco.Web /// public static EventMessages GetCurrentEventMessages(this UmbracoContext umbracoContext) { - var msgs = umbracoContext.HttpContext.Items[typeof (RequestLifespanMessagesFactory).Name]; - if (msgs == null) return null; - return (EventMessages) msgs; + var eventMessagesFactory = umbracoContext.Application.Services.EventMessagesFactory as RequestLifespanMessagesFactory; + return eventMessagesFactory == null ? null : eventMessagesFactory.TryGet(); } } From 2596043a94d8f3e477b4f3e180b1eb2a6493ad74 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 16 Nov 2016 11:19:57 +0100 Subject: [PATCH 123/841] restructure organize overlay so master template picker is available in the editor and sections are in their own dialog --- .../less/components/umb-insert-code-box.less | 19 ++ .../templatesections.controller.js | 39 ++++ .../templatesections/templatesections.html | 62 +++++ .../src/views/templates/edit.controller.js | 217 +++++++++++------- .../src/views/templates/edit.html | 31 ++- 5 files changed, 281 insertions(+), 87 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.html diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less index 7bb84dbb41..9d722f82bf 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-insert-code-box.less @@ -26,3 +26,22 @@ .umb-insert-code-box__description { font-size: 11px; } + +.umb-insert-code-box__check { + width: 18px; + height: 18px; + background: @grayLighter; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + float: left; + margin-right: 5px; + margin-top: 1px; +} + +.umb-insert-code-box__check--checked { + background: @green; + color: @white; +} diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.controller.js new file mode 100644 index 0000000000..31eeab0008 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.controller.js @@ -0,0 +1,39 @@ +(function () { + "use strict"; + + function TemplateSectionsOverlayController($scope) { + + var vm = this; + + $scope.model.mandatoryRenderSection = false; + + if(!$scope.model.title) { + $scope.model.title = "Sections"; + } + + if(!$scope.model.subtitle) { + $scope.model.subtitle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; + } + + vm.select = select; + + function onInit() { + + if($scope.model.isMasterTemplate) { + $scope.model.insertType = 'renderBody'; + } else { + $scope.model.insertType = 'addSection'; + } + + } + + function select(type) { + $scope.model.insertType = type; + } + + onInit(); + + } + + angular.module("umbraco").controller("Umbraco.Overlays.TemplateSectionsOverlay", TemplateSectionsOverlayController); +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.html new file mode 100644 index 0000000000..31caeeb831 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.html @@ -0,0 +1,62 @@ +
    + + +
    + +
    +
    +
    Render child template
    +
    Lorem ipsum dolor sit amet, RenderBody() consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
    +
    + +
    + +
    +
    Render section
    +
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit.
    + +
    +
    + + + +
    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    +
    + +
    + +
    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    Define section
    +
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit.
    + +
    +
    + + + + +
    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    + +
    +
    + +
    +
    + + +
    \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 5bac99c1a6..7602f89278 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -6,18 +6,13 @@ var vm = this; vm.page = {}; vm.page.loading = true; + vm.templates = []; //menu vm.page.menu = {}; vm.page.menu.currentSection = appState.getSectionState("currentSection"); vm.page.menu.currentNode = null; - vm.insert = function (str) { - vm.editor.moveCursorToPosition(vm.currentPosition); - vm.editor.insert(str); - vm.editor.focus(); - }; - vm.save = function () { vm.page.saveButtonState = "busy"; @@ -42,15 +37,17 @@ }); }; - function persistCurrentLocation() { - vm.currentPosition = vm.editor.getCursorPosition(); - } - vm.init = function () { //we need to load this somewhere, for now its here. assetsService.loadCss("lib/ace-razor-mode/theme/razor_chrome.css"); + //load templates - used in the master template picker + templateResource.getAll() + .then(function(templates) { + vm.templates = templates; + }); + if($routeParams.create){ templateResource.getScaffold().then(function(template){ @@ -99,42 +96,16 @@ } }; - - vm.setLayout = function(path){ - - var templateCode = vm.editor.getValue(); - var newValue = path; - var layoutDefRegex = new RegExp("(@{[\\s\\S]*?Layout\\s*?=\\s*?)(\"[^\"]*?\"|null)(;[\\s\\S]*?})", "gi"); - - if (newValue !== undefined && newValue !== "") { - if (layoutDefRegex.test(templateCode)) { - // Declaration exists, so just update it - templateCode = templateCode.replace(layoutDefRegex, "$1\"" + newValue + "\"$3"); - } else { - // Declaration doesn't exist, so prepend to start of doc - //TODO: Maybe insert at the cursor position, rather than just at the top of the doc? - templateCode = "@{\n\tLayout = \"" + newValue + "\";\n}\n" + templateCode; - } - } else { - if (layoutDefRegex.test(templateCode)) { - // Declaration exists, so just update it - templateCode = templateCode.replace(layoutDefRegex, "$1null$3"); - } - } - - vm.editor.setValue(templateCode); - vm.editor.clearSelection(); - vm.editor.navigateFileStart(); - }; - - vm.openPageFieldOverlay = openPageFieldOverlay; vm.openDictionaryItemOverlay = openDictionaryItemOverlay; vm.openQueryBuilderOverlay = openQueryBuilderOverlay; vm.openMacroOverlay = openMacroOverlay; vm.openInsertOverlay = openInsertOverlay; - vm.openOrganizeOverlay = openOrganizeOverlay; + vm.openSectionsOverlay = openSectionsOverlay; vm.openPartialOverlay = openPartialOverlay; + vm.openMasterTemplateOverlay = openMasterTemplateOverlay; + vm.selectMasterTemplate = selectMasterTemplate; + vm.getMasterTemplateName = getMasterTemplateName; function openInsertOverlay() { @@ -148,23 +119,23 @@ case "macro": var macroObject = macroService.collectValueData(model.insert.selectedMacro, model.insert.macroParams, "Mvc"); - vm.insert(macroObject.syntax); + insert(macroObject.syntax); break; case "dictionary": //crappy hack due to dictionary items not in umbracoNode table var code = "@Umbraco.GetDictionaryValue(\"" + model.insert.node.name + "\")"; - vm.insert(code); + insert(code); break; case "partial": //crappy hack due to dictionary items not in umbracoNode table var code = "@Html.Partial(\"" + model.insert.node.name + "\")"; - vm.insert(code); + insert(code); break; case "umbracoField": - vm.insert(model.insert.umbracoField); + insert(model.insert.umbracoField); break; } @@ -188,13 +159,14 @@ dialogData: {}, show: true, title: "Insert macro", - submit: function (model) { var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, "Mvc"); - vm.insert(macroObject.syntax); + insert(macroObject.syntax); + vm.macroPickerOverlay.show = false; vm.macroPickerOverlay = null; + } }; } @@ -210,7 +182,7 @@ show: true, submit: function (model) { - vm.insert(model.umbracoField); + insert(model.umbracoField); vm.pageFieldOverlay.show = false; vm.pageFieldOverlay = null; }, @@ -236,7 +208,7 @@ select: function(node){ //crappy hack due to dictionary items not in umbracoNode table var code = "@Umbraco.GetDictionaryValue(\"" + node.name + "\")"; - vm.insert(code); + insert(code); vm.dictionaryItemOverlay.show = false; vm.dictionaryItemOverlay = null; @@ -266,7 +238,7 @@ select: function(node){ //crappy hack due to dictionary items not in umbracoNode table var code = "@Html.Partial(\"" + node.name + "\")"; - vm.insert(code); + insert(code); vm.partialItemOverlay.show = false; vm.partialItemOverlay = null; @@ -302,7 +274,7 @@ "\t}\n" + "\n\n"; - vm.insert(code); + insert(code); vm.queryBuilderOverlay.show = false; vm.queryBuilderOverlay = null; @@ -316,51 +288,138 @@ } - function openOrganizeOverlay() { - vm.organizeOverlay = { + function openSectionsOverlay() { - view: "organize", + vm.sectionsOverlay = { + view: "templatesections", show: true, - template: vm.template, - title: "Organise template", + isMasterTemplate: true, + submit: function(model) { - submit: function (model) { - if (model.masterPage && model.masterPage.alias) { - vm.template.masterPageAlias = model.masterPage.alias; - vm.setLayout(model.masterPage.alias + ".cshtml"); - } else { - vm.template.masterPageAlias = null; - vm.setLayout(null); + if (model.insertType === 'renderBody') { + insert("@RenderBody()"); } - if (model.addRenderBody) { - vm.insert("@RenderBody()"); + if (model.insertType === 'renderSection') { + insert("@RenderSection(\"" + model.renderSectionName + "\", " + model.mandatoryRenderSection + ")"); } - if (model.addRenderSection) { - vm.insert("@RenderSection(\"" + - model.renderSectionName + - "\", " + - model.mandatoryRenderSection + - ")"); + if (model.insertType === 'addSection') { + insert("@section " + model.sectionName + "\r\n{\r\n\r\n}\r\n"); } - if (model.addSection) { - vm.insert("@section " + model.sectionName + "\r\n{\r\n\r\n}\r\n"); - } + vm.sectionsOverlay.show = false; + vm.sectionsOverlay = null; - vm.organizeOverlay.show = false; - vm.organizeOverlay = null; }, + close: function(model) { + + vm.sectionsOverlay.show = false; + vm.sectionsOverlay = null; - close: function (model) { - vm.organizeOverlay.show = false; - vm.organizeOverlay = null; } - } } + function openMasterTemplateOverlay() { + + vm.masterTemplateOverlay = { + view: "itempicker", + title: "Choose master template", + availableItems: vm.templates, + show: true, + submit: function(model) { + + var template = model.selectedItem; + + if (template && template.alias) { + vm.template.masterTemplateAlias = template.alias; + setLayout(template.alias + ".cshtml"); + } else { + vm.template.masterTemplateAlias = null; + setLayout(null); + } + + vm.masterTemplateOverlay.show = false; + vm.masterTemplateOverlay = null; + }, + close: function(oldModel) { + vm.masterTemplateOverlay.show = false; + vm.masterTemplateOverlay = null; + } + }; + + } + + function selectMasterTemplate(template) { + + if (template && template.alias) { + vm.template.masterTemplateAlias = template.alias; + setLayout(template.alias + ".cshtml"); + } else { + vm.template.masterTemplateAlias = null; + setLayout(null); + } + + } + + function getMasterTemplateName(masterTemplateAlias, templates) { + + if(masterTemplateAlias) { + + var templateName = ""; + + angular.forEach(templates, function(template){ + if(template.alias === masterTemplateAlias) { + templateName = template.name; + } + }); + + return templateName; + + } else { + return "No template"; + } + + } + + function setLayout(templatePath){ + + var templateCode = vm.editor.getValue(); + var newValue = templatePath; + var layoutDefRegex = new RegExp("(@{[\\s\\S]*?Layout\\s*?=\\s*?)(\"[^\"]*?\"|null)(;[\\s\\S]*?})", "gi"); + + if (newValue !== undefined && newValue !== "") { + if (layoutDefRegex.test(templateCode)) { + // Declaration exists, so just update it + templateCode = templateCode.replace(layoutDefRegex, "$1\"" + newValue + "\"$3"); + } else { + // Declaration doesn't exist, so prepend to start of doc + //TODO: Maybe insert at the cursor position, rather than just at the top of the doc? + templateCode = "@{\n\tLayout = \"" + newValue + "\";\n}\n" + templateCode; + } + } else { + if (layoutDefRegex.test(templateCode)) { + // Declaration exists, so just update it + templateCode = templateCode.replace(layoutDefRegex, "$1null$3"); + } + } + + vm.editor.setValue(templateCode); + vm.editor.clearSelection(); + vm.editor.navigateFileStart(); + } + + function insert(str) { + vm.editor.moveCursorToPosition(vm.currentPosition); + vm.editor.insert(str); + vm.editor.focus(); + } + + function persistCurrentLocation() { + vm.currentPosition = vm.editor.getCursorPosition(); + } + vm.init(); } diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index a712f4220d..67f409f8d3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -27,7 +27,6 @@
  • Partial view
  • - + label="Sections" + icon="icon-indent" + action="vm.openSectionsOverlay()"> + + + + + Master template: + {{ vm.getMasterTemplateName(vm.template.masterTemplateAlias, vm.templates) }} + + + +
    @@ -147,6 +155,13 @@ view="vm.partialItemOverlay.view" position="right"> + + +
    From c3fc21a2b3b11fde6ff1854d985fbbea145b8f2d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 16 Nov 2016 12:21:52 +0100 Subject: [PATCH 124/841] remove organise overlay --- .../overlays/organize/organize.controller.js | 40 --------------- .../common/overlays/organize/organize.html | 51 ------------------- 2 files changed, 91 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.controller.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.html diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.controller.js deleted file mode 100644 index 136399c172..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.controller.js +++ /dev/null @@ -1,40 +0,0 @@ -(function() { - "use strict"; - - function OrganizeController(scope, umbRequestHelper, http) { - var allTemplatesUrl = umbRequestHelper.getApiUrl("templateApiBaseUrl", "GetAll"); - - scope.model.addRenderBody = false; - scope.model.mandatoryRenderSection = false; - scope.masterPage = {}; - - http.get(allTemplatesUrl) - .then(function(result) { - scope.masterPages = result.data; - scope.masterPages.splice(0, - 0, - { - alias: null, - name: "None" - }); - scope.model.masterPage = $.grep(scope.masterPages, - function(mp) { - return mp.alias === scope.model.template.masterPageAlias; - })[0]; - }); - - scope.selectMasterPage = function(masterPage) { - scope.model.masterPage = masterPage; - } - } - - angular.module("umbraco") - .controller("Umbraco.Dialogs.Template.OrganizeController", - [ - "$scope", - "umbRequestHelper", - "$http", - OrganizeController - ]); - -}()); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.html deleted file mode 100644 index 57df7e9556..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/organize/organize.html +++ /dev/null @@ -1,51 +0,0 @@ -
    - -
    -

    Master page

    -
    - -
    -
    - - - -
    -
    -
    -

    Child page

    -
    - - -
    - -
    -
    \ No newline at end of file From 6c5d2c805719e1c68f85092621f3daf966aa823b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 16 Nov 2016 12:22:03 +0100 Subject: [PATCH 125/841] fix header --- .../src/views/components/editor/umb-editor-header.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html index 4f3b316356..c274892c65 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html @@ -4,7 +4,7 @@
    -
    +
    From 27eaa8d4afe98671b6560db9aa83bcb1b8b72ea0 Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 16 Nov 2016 15:19:15 +0100 Subject: [PATCH 126/841] Inject filesystems into partial repositories --- .../Repositories/PartialViewMacroRepository.cs | 8 +------- .../Persistence/Repositories/PartialViewRepository.cs | 11 +++-------- src/Umbraco.Core/Persistence/RepositoryFactory.cs | 4 ++-- 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs index 827bee68ef..ea79ff6b82 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs @@ -6,15 +6,9 @@ namespace Umbraco.Core.Persistence.Repositories { internal class PartialViewMacroRepository : PartialViewRepository { - public PartialViewMacroRepository(IUnitOfWork work) - : this(work, FileSystemProviderManager.Current.MacroPartialsFileSystem) - { - } - public PartialViewMacroRepository(IUnitOfWork work, IFileSystem fileSystem) : base(work, fileSystem) - { - } + { } protected override PartialViewType ViewType { get { return PartialViewType.PartialViewMacro; } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs index 199adb51ba..63cfd53833 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs @@ -10,14 +10,9 @@ namespace Umbraco.Core.Persistence.Repositories { internal class PartialViewRepository : FileRepository, IPartialViewRepository { - public PartialViewRepository(IUnitOfWork work) - : this(work, FileSystemProviderManager.Current.PartialViewsFileSystem) - { - } - - public PartialViewRepository(IUnitOfWork work, IFileSystem fileSystem) : base(work, fileSystem) - { - } + public PartialViewRepository(IUnitOfWork work, IFileSystem fileSystem) + : base(work, fileSystem) + { } protected virtual PartialViewType ViewType { get { return PartialViewType.PartialView; } } diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index 71e0f57dfe..e04c898015 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -217,12 +217,12 @@ namespace Umbraco.Core.Persistence internal virtual IPartialViewRepository CreatePartialViewRepository(IUnitOfWork uow) { - return new PartialViewRepository(uow); + return new PartialViewRepository(uow, FileSystemProviderManager.Current.PartialViewsFileSystem); } internal virtual IPartialViewRepository CreatePartialViewMacroRepository(IUnitOfWork uow) { - return new PartialViewMacroRepository(uow); + return new PartialViewMacroRepository(uow, FileSystemProviderManager.Current.MacroPartialsFileSystem); } public virtual IStylesheetRepository CreateStylesheetRepository(IUnitOfWork uow, IDatabaseUnitOfWork db) From 1a80e94bca9c6a07a9174e670cd5735132137433 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 17 Nov 2016 09:31:35 +0100 Subject: [PATCH 127/841] clean up insert field overlay --- .../insertfield/insertfield.controller.js | 269 ++++++-------- .../overlays/insertfield/insertfield.html | 351 +++++++++--------- .../src/views/templates/edit.controller.js | 10 +- 3 files changed, 300 insertions(+), 330 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js index a2463434b9..06de14963e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js @@ -1,173 +1,144 @@ (function () { "use strict"; - function InsertFieldController ($scope, $http, contentTypeResource) { - var vm = this; + function InsertFieldController($scope, $http, contentTypeResource) { + + var vm = this; - vm.field; - vm.altField; - vm.altText; - vm.insertPreviewTitle = "Modify output"; - vm.insertBefore; - vm.insertAfter; - vm.recursive = false; - vm.properties; - vm.date = false; - vm.dateTime = false; - vm.dateTimeSeparator = ""; - vm.casingUpper = false; - vm.casingLower = false; - vm.encodeHtml = false; - vm.encodeUrl = false; - vm.convertLinebreaks = false; + vm.field; + vm.altField; + vm.altText; + vm.insertBefore; + vm.insertAfter; + vm.recursive = false; + vm.properties = []; + vm.date = false; + vm.dateTime = false; + vm.dateTimeSeparator = ""; + vm.casingUpper = false; + vm.casingLower = false; + vm.encodeHtml = false; + vm.encodeUrl = false; + vm.convertLinebreaks = false; + vm.removeParagraphTags = false; - vm.showAltField = false; - vm.showAltText = false; + vm.showAltField = false; + vm.showAltText = false; - vm.showInsertPreview = showInsertPreview; - vm.updateInsertPreview = updateInsertPreview; - vm.hideInsertPreview = hideInsertPreview; - vm.updateDate = updateDate; - vm.updateDateTime = updateDateTime; - vm.updateUpper = updateUpper; - vm.updateLower = updateLower; - vm.updateEncodeHtml = updateEncodeHtml; - vm.updateEncodeUrl = updateEncodeUrl; + vm.setDateOption = setDateOption; + vm.setCasingOption = setCasingOption; + vm.setEncodingOption = setEncodingOption; + vm.generateOutputSample = generateOutputSample; - contentTypeResource.getAllPropertyTypeAliases().then(function(array) { - vm.properties = array; - }); + function onInit() { - //hide preview by default - function hideInsertPreview () { - $scope.model.itemDetails = null; - } + // set default title + if(!$scope.model.title) { + $scope.model.title = "Insert value"; + } - //Create preview - function showInsertPreview () { - var previewDetails = {}; + // set default subtitle + if(!$scope.model.subtitle) { + $scope.model.subtitle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; + } - previewDetails.title = vm.insertPreviewTitle; - - if (!vm.insertBefore && !vm.insertAfter) { - previewDetails.description = $scope.model.umbracoField - } else if (!vm.insertAfter) { - previewDetails.description = vm.insertBefore + ' ' + $scope.model.umbracoField; - } else { - previewDetails.description = vm.insertBefore + ' ' + $scope.model.umbracoField + ' ' + vm.insertAfter; - } - $scope.model.itemDetails = previewDetails; - } - - //Update preview - function updateInsertPreview () { - var previewDetails = $scope.model.itemDetails; - - previewDetails.title = vm.insertPreviewTitle; - - if (!vm.insertBefore && !vm.insertAfter) { - previewDetails.description = ' ' + $scope.model.umbracoField; - } else if (!vm.insertAfter) { - previewDetails.description = vm.insertBefore + ' ' + $scope.model.umbracoField; - } else { - previewDetails.description = vm.insertBefore + ' ' + $scope.model.umbracoField + ' ' + vm.insertAfter; + // Load all fields + contentTypeResource.getAllPropertyTypeAliases().then(function (array) { + vm.properties = array; + }); + } - $scope.model.itemDetails = previewDetails; - } + // date formatting + function setDateOption(option) { + + if (option === 'date') { + if(vm.date) { + vm.date = false; + } else { + vm.date = true; + vm.dateTime = false; + } + } + + if (option === 'dateWithTime') { + if(vm.dateTime) { + vm.dateTime = false; + } else { + vm.date = false; + vm.dateTime = true; + } + } - // date formatting - function updateDate () { - if (vm.date) { - vm.date = false; - return; - }else { - vm.date = true; - if (vm.dateTime) { - vm.dateTime = false; - } } - } - function updateDateTime () { - if (vm.dateTime) { - vm.dateTime = false - } else { - vm.dateTime = true; - if (vm.date) { - vm.date = false; - } + // casing formatting + function setCasingOption(option) { + if (option === 'uppercase') { + if(vm.casingUpper) { + vm.casingUpper = false; + } else { + vm.casingUpper = true; + vm.casingLower = false; + } + } + + if (option === 'lowercase') { + if(vm.casingLower) { + vm.casingLower = false; + } else { + vm.casingUpper = false; + vm.casingLower = true; + } + } } - } - // casing - function updateUpper() { - if (vm.casingUpper) { - vm.casingUpper = false; - return; - }else { - vm.casingUpper = true; - if (vm.casingLower) { - vm.casingLower = false; - } + // encoding formatting + function setEncodingOption(option) { + if (option === 'html') { + if(vm.encodeHtml) { + vm.encodeHtml = false; + } else { + vm.encodeHtml = true; + vm.encodeUrl = false; + } + } + + if (option === 'url') { + if (vm.encodeUrl) { + vm.encodeUrl = false; + } else { + vm.encodeHtml = false; + vm.encodeUrl = true; + } + } } - } - function updateLower() { - if (vm.casingLower) { - vm.casingLower = false; - return; - }else { - vm.casingLower = true; - if (vm.casingUpper) { - vm.casingUpper = false; - } + function generateOutputSample() { + + var pageField = (vm.field !== undefined ? '@Umbraco.Field("' + vm.field + '"' : "") + + (vm.altField !== undefined ? ', altFieldAlias:"' + vm.altField + '"' : "") + + (vm.altText !== undefined ? ', altText:"' + vm.altText + '"' : "") + + (vm.insertBefore !== undefined ? ', insertBefore:"' + vm.insertBefore + '"' : "") + + (vm.insertAfter !== undefined ? ', insertAfter:"' + vm.insertAfter + '"' : "") + + (vm.recursive !== false ? ', recursive: ' + vm.recursive : "") + + (vm.date !== false ? ', formatAsDate: ' + vm.date : "") + + (vm.dateTime !== false ? ', formatAsDateWithTimeSeparator:"' + vm.dateTimeSeparator + '"' : "") + + (vm.casingUpper !== false ? ', casing: ' + "RenderFieldCaseType.Upper" : "") + + (vm.casingLower !== false ? ', casing: ' + "RenderFieldCaseType.Lower" : "") + + (vm.encodeHtml !== false ? ', encoding: ' + "RenderFieldEncodingType.Html" : "") + + (vm.encodeUrl !== false ? ', encoding: ' + "RenderFieldEncodingType.Url" : "") + + (vm.convertLinebreaks !== false ? ', convertLineBreaks: ' + "true" : "") + + (vm.removeParagraphTags !== false ? ', removeParagraphTags: ' + "true": "") + + (vm.field ? ')' : ""); + + $scope.model.umbracoField = pageField; + + return pageField; + } - } - // encoding - function updateEncodeHtml() { - if (vm.encodeHtml) { - vm.encodeHtml = false; - return; - }else { - vm.encodeHtml = true; - if (vm.encodeUrl) { - vm.encodeUrl = false; - } - } - } - - function updateEncodeUrl() { - if (vm.encodeUrl) { - vm.encodeUrl = false; - return; - } else { - vm.encodeUrl = true; - if (vm.encodeHtml) { - vm.encodeHtml = false; - } - } - } - - $scope.updatePageField = function() { - var pageField = (vm.field !== undefined ? '@Umbraco.Field("' + vm.field + '"' : "") - + (vm.altField !== undefined ? ', altFieldAlias:"' + vm.altField + '"': "") - + (vm.altText !== undefined ? ', altText:"' + vm.altText + '"' : "") - + (vm.insertBefore !== undefined ? ', insertBefore:"' + vm.insertBefore + '"' : "") - + (vm.insertAfter !== undefined ? ', insertAfter:"' + vm.insertAfter + '"' : "") - + (vm.recursive !== false ? ', recursive: ' + vm.recursive : "") - + (vm.date !== false ? ', formatAsDate: ' + vm.date : "") - + (vm.dateTime !== false ? ', formatAsDateWithTimeSeparator:"' + vm.dateTimeSeparator + '"' : "") - + (vm.casingUpper !== false ? ', casing: ' + "RenderFieldCaseType.Upper" : "") - + (vm.casingLower !== false ? ', casing: ' + "RenderFieldCaseType.Lower" : "") - + (vm.encodeHtml !== false ? ', encoding: ' + "RenderFieldEncodingType.Html" : "") - + (vm.encodeUrl !== false ? ', encoding: ' + "RenderFieldEncodingType.Url" : "") - + (vm.convertLinebreaks !== false ? ', convertLineBreaks: ' + "true" : "") - + (vm.field ? ')' : ""); - $scope.model.umbracoField = pageField; - return pageField; - }; + onInit(); } diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html index c96484e0c6..773aebd364 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html @@ -1,184 +1,187 @@ -
    -
    -
    - - - -
    - -
    -
    -
    - -
    -
    - - - Add alternative field
    - -
    -
    - - -
    - - -
    -
    -
    - - - - - Add default value - - -
    - -
    - - -
    - - -
    -
    - -
    - - -
    -
    - -

    - - -
    -
    -
    - -
    - -
    - - -
    - -
    -
    - -
    - -
    - -
    - - -
    - -
    -
    - -
    - -
    -
    - -
    - - Date only - Date and time - -
    -
    -
    - -
    -
    - -
    - - Upper - lower -
    -
    -
    - -
    -
    - -
    - - - HTML - - URL - -
    -
    -
    - - -
    -
    - -

    - - -
    -
    -
    - +
    -
    - -

    - -

    {{updatePageField()}}

    +
    + +
    + +
    -
    +
    + + +
    -
    + +
    + + Add fallback field +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    + + + Yes, make it recursive +
    +
    +
    + +
    Format and encoding
    + + +
    +
    +
    +
    + +
    + Date only + Date and time + +
    +
    +
    + + +
    +
    +
    +
    + +
    + Uppercase + Lowercase +
    +
    +
    + + +
    +
    +
    +
    + +
    + HTML + URL +
    +
    +
    + +
    Modify output
    + + +
    +
    + +
    + +
    +
    +
    + + +
    +
    + +
    + +
    +
    +
    + + +
    +
    +
    +
    + +
    + + Yes, convert line breaks +
    +
    +
    + + +
    +
    +
    +
    + +
    + + Yes, remove paragraph tags +
    +
    +
    + + +
    +
    +
    + +
    {{ vm.generateOutputSample() }}
    +
    +
    +
    + +
    + +
    \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 7602f89278..0986975a02 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -174,19 +174,15 @@ function openPageFieldOverlay() { vm.pageFieldOverlay = { - title: "Insert page field", - description: "Insert data in template", submitButtonLabel: "Insert", closeButtonlabel: "Cancel", view: "insertfield", show: true, - submit: function (model) { - insert(model.umbracoField); - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; + insert(model.umbracoField); + vm.pageFieldOverlay.show = false; + vm.pageFieldOverlay = null; }, - close: function (model) { vm.pageFieldOverlay.show = false; vm.pageFieldOverlay = null; From 597a10fc5de7395b82cf789755b4dd67103bf8ea Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 17 Nov 2016 10:33:15 +0100 Subject: [PATCH 128/841] small fixes to overlay buttons + insert order --- .../overlays/insert/insert.controller.js | 2 +- .../views/common/overlays/insert/insert.html | 18 +++++++++--------- .../src/views/templates/edit.controller.js | 19 +++---------------- .../src/views/templates/edit.html | 2 +- 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js index 65b34d5432..b6366bca74 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.controller.js @@ -22,9 +22,9 @@ vm.macroPickerOverlay = { view: "macropicker", - show: true, title: "Insert macro", dialogData: {}, + show: true, submit: function(model) { $scope.model.insert = { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html index 4d8fb4a4bd..c49c045853 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/insert/insert.html @@ -2,23 +2,23 @@
    -
    -
    Macro
    -
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
    -
    -
    Value
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
    -
    -
    Dictionary
    +
    +
    Partial view
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
    -
    -
    Partial
    +
    +
    Macro
    +
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
    +
    + +
    +
    Dictionary
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pellentesque gravida hendrerit. Nunc lacinia ipsum sed urna volutpat finibus.
    diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 0986975a02..81f04015ea 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -200,7 +200,6 @@ multiPicker: false, show: true, title: "Insert dictionary item", - select: function(node){ //crappy hack due to dictionary items not in umbracoNode table var code = "@Umbraco.GetDictionaryValue(\"" + node.name + "\")"; @@ -209,11 +208,6 @@ vm.dictionaryItemOverlay.show = false; vm.dictionaryItemOverlay = null; }, - - submit: function (model) { - console.log(model); - }, - close: function (model) { vm.dictionaryItemOverlay.show = false; vm.dictionaryItemOverlay = null; @@ -230,7 +224,6 @@ multiPicker: false, show: true, title: "Insert Partial view", - select: function(node){ //crappy hack due to dictionary items not in umbracoNode table var code = "@Html.Partial(\"" + node.name + "\")"; @@ -239,13 +232,6 @@ vm.partialItemOverlay.show = false; vm.partialItemOverlay = null; }, - - submit: function (model) { - console.log(model); - vm.partialItemOverlay.show = false; - vm.partialItemOverlay = null; - }, - close: function (model) { vm.partialItemOverlay.show = false; vm.partialItemOverlay = null; @@ -288,8 +274,9 @@ vm.sectionsOverlay = { view: "templatesections", - show: true, isMasterTemplate: true, + submitButtonLabel: "Insert", + show: true, submit: function(model) { if (model.insertType === 'renderBody') { @@ -374,7 +361,7 @@ return templateName; } else { - return "No template"; + return "No master"; } } diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 67f409f8d3..e09a6be4c4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -41,9 +41,9 @@
    From d0862448202128c8f6ca7b5a5100727d720502f0 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 18 Nov 2016 09:28:58 +0100 Subject: [PATCH 129/841] U4-9201 - expose PetaPoco Database type + dispose --- src/Umbraco.Core/Persistence/PetaPoco.cs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Core/Persistence/PetaPoco.cs b/src/Umbraco.Core/Persistence/PetaPoco.cs index 63278889a2..c016276116 100644 --- a/src/Umbraco.Core/Persistence/PetaPoco.cs +++ b/src/Umbraco.Core/Persistence/PetaPoco.cs @@ -181,7 +181,7 @@ namespace Umbraco.Core.Persistence CommonConstruct(); } - internal enum DBType + public enum DBType { SqlServer, SqlServerCE, @@ -190,7 +190,9 @@ namespace Umbraco.Core.Persistence Oracle, SQLite } - DBType _dbType = DBType.SqlServer; + private DBType _dbType = DBType.SqlServer; + + public DBType DatabaseType { get { return _dbType; } } // Common initialization private void CommonConstruct() @@ -224,13 +226,18 @@ namespace Umbraco.Core.Persistence // Automatically close one open shared connection public void Dispose() { - // Automatically close one open connection reference - // (Works with KeepConnectionAlive and manually opening a shared connection) - CloseSharedConnection(); + Dispose(true); } - // Set to true to keep the first opened connection alive until this object is disposed - public bool KeepConnectionAlive { get; set; } + protected virtual void Dispose(bool disposing) + { + // Automatically close one open connection reference + // (Works with KeepConnectionAlive and manually opening a shared connection) + CloseSharedConnection(); + } + + // Set to true to keep the first opened connection alive until this object is disposed + public bool KeepConnectionAlive { get; set; } // Open a connection (can be nested) public void OpenSharedConnection() From 13ed3757da4b15d76d3a2316b8a08e0997cc8949 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 18 Nov 2016 09:42:07 +0100 Subject: [PATCH 130/841] U4-9201 - properly manage database instances --- src/Umbraco.Core/DatabaseContext.cs | 140 +++++++---- .../Persistence/DefaultDatabaseFactory.cs | 218 +++++++++++++----- .../Persistence/UmbracoDatabase.cs | 69 +++++- src/Umbraco.Core/UmbracoApplicationBase.cs | 13 +- 4 files changed, 337 insertions(+), 103 deletions(-) diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index 585f1d51cf..f8f31ee695 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -1,10 +1,10 @@ using System; +using System.Collections.Generic; using System.Configuration; using System.Data.SqlServerCe; using System.IO; using System.Linq; using System.Web; -using System.Web.Configuration; using System.Xml.Linq; using Semver; using Umbraco.Core.Configuration; @@ -30,7 +30,6 @@ namespace Umbraco.Core private readonly ILogger _logger; private readonly SqlSyntaxProviders _syntaxProviders; private bool _configured; - private readonly object _locker = new object(); private string _connectionString; private string _providerName; private DatabaseSchemaResult _result; @@ -40,7 +39,7 @@ namespace Umbraco.Core : this(factory, LoggerResolver.Current.Logger, new SqlSyntaxProviders(new ISqlSyntaxProvider[] { new MySqlSyntaxProvider(LoggerResolver.Current.Logger), - new SqlCeSyntaxProvider(), + new SqlCeSyntaxProvider(), new SqlServerSyntaxProvider() })) { @@ -80,21 +79,55 @@ namespace Umbraco.Core _configured = true; } +#if DEBUG_DATABASES + public List Databases + { + get + { + var factory = _factory as DefaultDatabaseFactory; + if (factory == null) throw new NotSupportedException(); + return factory.Databases; + } + } +#endif + public ISqlSyntaxProvider SqlSyntax { get; private set; } /// - /// Gets the object for doing CRUD operations - /// against custom tables that resides in the Umbraco database. + /// Gets the object for doing CRUD operations against custom tables that resides in the Umbraco database. /// /// - /// This should not be used for CRUD operations or queries against the - /// standard Umbraco tables! Use the Public services for that. + /// Should not be used for operation against standard Umbraco tables; as services should be used instead. + /// Gets or creates an "ambient" database that is either stored in http context + available for the whole + /// request + auto-disposed at the end of the request, or in call context if there is no http context - in which + /// case it needs to be explicitely disposed so it is removed from call context. /// public virtual UmbracoDatabase Database { get { return _factory.CreateDatabase(); } } + /// + /// Replaces the "ambient" database (if any) and installs a new object. + /// + /// + /// The returned IDisposable *must* be diposed in order to properly disposed the safe database and + /// restore the original "ambient" database (if any). + /// This is to be used in background tasks to ensure that they have an "ambient" database which + /// will be properly removed from call context and does not interfere with anything else. In most case + /// it is not replacing anything, just temporarily installing a database in context. + /// + public virtual IDisposable UsingSafeDatabase + { + get + { + var factory = _factory as DefaultDatabaseFactory; + if (factory == null) throw new NotSupportedException(); + var database = factory.CreateDatabaseInstance(DefaultDatabaseFactory.ContextOwner.None); + return new UsedDatabase(database, _logger); + } + } + /// /// Boolean indicating whether the database has been configured /// @@ -189,7 +222,7 @@ namespace Umbraco.Core // since it's been like this for quite some time //using (var engine = new SqlCeEngine(connectionString)) //{ - // engine.CreateDatabase(); + // engine.CreateDatabase(); //} } @@ -230,14 +263,14 @@ namespace Umbraco.Core /// Database Password /// Type of the provider to be used (Sql, Sql Azure, Sql Ce, MySql) public void ConfigureDatabaseConnection(string server, string databaseName, string user, string password, string databaseProvider) - { + { string providerName; var connectionString = GetDatabaseConnectionString(server, databaseName, user, password, databaseProvider, out providerName); SaveConnectionString(connectionString, providerName); Initialize(providerName); } - + public string GetDatabaseConnectionString(string server, string databaseName, string user, string password, string databaseProvider, out string providerName) { providerName = Constants.DatabaseProviders.SqlServer; @@ -268,18 +301,18 @@ namespace Umbraco.Core public string GetIntegratedSecurityDatabaseConnectionString(string server, string databaseName) { - return String.Format("Server={0};Database={1};Integrated Security=true", server, databaseName); + return String.Format("Server={0};Database={1};Integrated Security=true", server, databaseName); } internal string BuildAzureConnectionString(string server, string databaseName, string user, string password) { if (server.Contains(".") && ServerStartsWithTcp(server) == false) server = string.Format("tcp:{0}", server); - + if (server.Contains(".") == false && ServerStartsWithTcp(server)) { - string serverName = server.Contains(",") - ? server.Substring(0, server.IndexOf(",", StringComparison.Ordinal)) + string serverName = server.Contains(",") + ? server.Substring(0, server.IndexOf(",", StringComparison.Ordinal)) : server; var portAddition = string.Empty; @@ -289,10 +322,10 @@ namespace Umbraco.Core server = string.Format("{0}.database.windows.net{1}", serverName, portAddition); } - + if (ServerStartsWithTcp(server) == false) server = string.Format("tcp:{0}.database.windows.net", server); - + if (server.Contains(",") == false) server = string.Format("{0},1433", server); @@ -336,7 +369,7 @@ namespace Umbraco.Core _connectionString = connectionString; _providerName = providerName; - + var fileName = IOHelper.MapPath(string.Format("{0}/web.config", SystemDirectories.Root)); var xml = XDocument.Load(fileName, LoadOptions.PreserveWhitespace); var connectionstrings = xml.Root.DescendantsAndSelf("connectionStrings").Single(); @@ -381,7 +414,7 @@ namespace Umbraco.Core connString = ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName].ConnectionString; } Initialize(providerName, connString); - + } else if (ConfigurationManager.AppSettings.ContainsKey(GlobalSettings.UmbracoConnectionName) && string.IsNullOrEmpty(ConfigurationManager.AppSettings[GlobalSettings.UmbracoConnectionName]) == false) { @@ -418,7 +451,7 @@ namespace Umbraco.Core //Remove the legacy connection string, so we don't end up in a loop if something goes wrong. GlobalSettings.RemoveSetting(GlobalSettings.UmbracoConnectionName); - + } else { @@ -437,15 +470,15 @@ namespace Umbraco.Core { if (_syntaxProviders != null) { - SqlSyntax = _syntaxProviders.GetByProviderNameOrDefault(providerName); + SqlSyntax = _syntaxProviders.GetByProviderNameOrDefault(providerName); } else if (SqlSyntax == null) { throw new InvalidOperationException("No " + typeof(ISqlSyntaxProvider) + " specified or no " + typeof(SqlSyntaxProviders) + " instance specified"); } - + SqlSyntaxContext.SqlSyntaxProvider = SqlSyntax; - + _configured = true; } catch (Exception e) @@ -485,7 +518,7 @@ namespace Umbraco.Core } internal Result CreateDatabaseSchemaAndData(ApplicationContext applicationContext) - { + { try { var readyForInstall = CheckReadyForInstall(); @@ -503,7 +536,7 @@ namespace Umbraco.Core // If MySQL, we're going to ensure that database calls are maintaining proper casing as to remove the necessity for checks // for case insensitive queries. In an ideal situation (which is what we're striving for), all calls would be case sensitive. - /* + /* var supportsCaseInsensitiveQueries = SqlSyntax.SupportsCaseInsensitiveQueries(database); if (supportsCaseInsensitiveQueries == false) { @@ -521,9 +554,9 @@ namespace Umbraco.Core message = GetResultMessageForMySql(); var schemaResult = ValidateDatabaseSchema(); - + var installedSchemaVersion = schemaResult.DetermineInstalledVersion(); - + //If Configuration Status is empty and the determined version is "empty" its a new install - otherwise upgrade the existing if (string.IsNullOrEmpty(GlobalSettings.ConfigurationStatus) && installedSchemaVersion.Equals(new Version(0, 0, 0))) { @@ -542,9 +575,9 @@ namespace Umbraco.Core message = "

    Upgrading database, this may take some time...

    "; return new Result { - RequiresUpgrade = true, - Message = message, - Success = true, + RequiresUpgrade = true, + Message = message, + Success = true, Percentage = "30" }; } @@ -572,7 +605,7 @@ namespace Umbraco.Core _logger.Info("Database upgrade started"); var database = new UmbracoDatabase(_connectionString, ProviderName, _logger); - //var supportsCaseInsensitiveQueries = SqlSyntax.SupportsCaseInsensitiveQueries(database); + //var supportsCaseInsensitiveQueries = SqlSyntax.SupportsCaseInsensitiveQueries(database); var message = GetResultMessageForMySql(); @@ -580,32 +613,32 @@ namespace Umbraco.Core var installedSchemaVersion = new SemVersion(schemaResult.DetermineInstalledVersion()); - var installedMigrationVersion = schemaResult.DetermineInstalledVersionByMigrations(migrationEntryService); - + var installedMigrationVersion = schemaResult.DetermineInstalledVersionByMigrations(migrationEntryService); + var targetVersion = UmbracoVersion.Current; - + //In some cases - like upgrading from 7.2.6 -> 7.3, there will be no migration information in the database and therefore it will - // return a version of 0.0.0 and we don't necessarily want to run all migrations from 0 -> 7.3, so we'll just ensure that the + // return a version of 0.0.0 and we don't necessarily want to run all migrations from 0 -> 7.3, so we'll just ensure that the // migrations are run for the target version if (installedMigrationVersion == new SemVersion(new Version(0, 0, 0)) && installedSchemaVersion > new SemVersion(new Version(0, 0, 0))) { //set the installedMigrationVersion to be one less than the target so the latest migrations are guaranteed to execute installedMigrationVersion = new SemVersion(targetVersion.SubtractRevision()); } - + //Figure out what our current installed version is. If the web.config doesn't have a version listed, then we'll use the minimum - // version detected between the schema installed and the migrations listed in the migration table. + // version detected between the schema installed and the migrations listed in the migration table. // If there is a version in the web.config, we'll take the minimum between the listed migration in the db and what // is declared in the web.config. - + var currentInstalledVersion = string.IsNullOrEmpty(GlobalSettings.ConfigurationStatus) //Take the minimum version between the detected schema version and the installed migration version ? new[] {installedSchemaVersion, installedMigrationVersion}.Min() //Take the minimum version between the installed migration version and the version specified in the config : new[] { SemVersion.Parse(GlobalSettings.ConfigurationStatus), installedMigrationVersion }.Min(); - //Ok, another edge case here. If the current version is a pre-release, - // then we want to ensure all migrations for the current release are executed. + //Ok, another edge case here. If the current version is a pre-release, + // then we want to ensure all migrations for the current release are executed. if (currentInstalledVersion.Prerelease.IsNullOrWhiteSpace() == false) { currentInstalledVersion = new SemVersion(currentInstalledVersion.GetVersion().SubtractRevision()); @@ -740,7 +773,7 @@ namespace Umbraco.Core { var datasource = dataSourcePart.Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory").ToString()); var filePath = datasource.Replace("Data Source=", string.Empty); - sqlCeDatabaseExists = File.Exists(filePath); + sqlCeDatabaseExists = File.Exists(filePath); } } @@ -754,5 +787,32 @@ namespace Umbraco.Core return true; } + + private class UsedDatabase : IDisposable + { + private readonly UmbracoDatabase _database; + private readonly ILogger _logger; + + public UsedDatabase(UmbracoDatabase database, ILogger logger) + { + _logger = logger; + + // replace with ours + _database = DefaultDatabaseFactory.DetachDatabase(); + _logger.Debug("Detached db " + (_database == null ? "x" : _database.InstanceSid) + "."); + DefaultDatabaseFactory.AttachDatabase(database); + _logger.Debug("Attached db " + database.InstanceSid + "."); + } + + public void Dispose() + { + // restore the original DB + var db = DefaultDatabaseFactory.DetachDatabase(); + _logger.Debug("Detached db " + db.InstanceSid + "."); + db.Dispose(); + DefaultDatabaseFactory.AttachDatabase(_database); + _logger.Debug("Attached db " + (_database == null ? "x" : _database.InstanceSid) + "."); + } + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs index 4ad425d9c9..5139da20d8 100644 --- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs @@ -75,69 +75,168 @@ namespace Umbraco.Core.Persistence public UmbracoDatabase CreateDatabase() { - // no http context, create the call context object - // NOTHING is going to track the object and it is the responsibility of the caller to release it! - // using the ReleaseDatabase method. + UmbracoDatabase database; + + // gets or creates a database, using either the call context (if no http context) or + // the current request context (http context) to store it. once done using the database, + // it should be disposed - which will remove it from whatever context it is currently + // stored in. this is automatic with http context because UmbracoDatabase implements + // IDisposeOnRequestEnd, but NOT with call context. + if (HttpContext.Current == null) { - LogHelper.Debug("Get NON http [T" + Environment.CurrentManagedThreadId + "]"); - var value = NonContextValue; - if (value != null) return value; - lock (Locker) + database = NonContextValue; + if (database == null) { - value = NonContextValue; - if (value != null) return value; - - LogHelper.Debug("Create NON http [T" + Environment.CurrentManagedThreadId + "]"); - NonContextValue = value = string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false - ? new UmbracoDatabase(ConnectionString, ProviderName, _logger) - : new UmbracoDatabase(_connectionStringName, _logger); - - return value; + lock (Locker) + { + database = NonContextValue; + if (database == null) + { + database = CreateDatabaseInstance(ContextOwner.CallContext); + NonContextValue = database; + } +#if DEBUG_DATABASES + else + { + Log("Get lcc", database); + } +#endif + } } +#if DEBUG_DATABASES + else + { + Log("Get lcc", database); + } +#endif + return database; } - // we have an http context, so only create one per request. - // UmbracoDatabase is marked IDisposeOnRequestEnd and therefore will be disposed when - // UmbracoModule attempts to dispose the relevant HttpContext items. so we DO dispose - // connections at the end of each request. no need to call ReleaseDatabase. - LogHelper.Debug("Get http [T" + Environment.CurrentManagedThreadId + "]"); - if (HttpContext.Current.Items.Contains(typeof(DefaultDatabaseFactory)) == false) - { - LogHelper.Debug("Create http [T" + Environment.CurrentManagedThreadId + "]"); - HttpContext.Current.Items.Add(typeof(DefaultDatabaseFactory), - string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false - ? new UmbracoDatabase(ConnectionString, ProviderName, _logger) - : new UmbracoDatabase(_connectionStringName, _logger)); + if (HttpContext.Current.Items.Contains(typeof (DefaultDatabaseFactory)) == false) + { + database = CreateDatabaseInstance(ContextOwner.HttpContext); + HttpContext.Current.Items.Add(typeof (DefaultDatabaseFactory), database); + } + else + { + database = (UmbracoDatabase) HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; +#if DEBUG_DATABASES + Log("Get ctx", database); +#endif } - return (UmbracoDatabase)HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; + + return database; + } + + // called by UmbracoDatabase when disposed, so that the factory can de-list it from context + internal void OnDispose(UmbracoDatabase disposing) + { + var value = disposing; + switch (disposing.ContextOwner) + { + case ContextOwner.CallContext: + value = NonContextValue; + break; + case ContextOwner.HttpContext: + value = (UmbracoDatabase) HttpContext.Current.Items[typeof (DefaultDatabaseFactory)]; + break; + } + + if (value != null && value.InstanceId != disposing.InstanceId) throw new Exception("panic: wrong db."); + + switch (disposing.ContextOwner) + { + case ContextOwner.CallContext: + NonContextValue = null; + break; + case ContextOwner.HttpContext: + HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); + break; + } + + disposing.ContextOwner = ContextOwner.None; + +#if DEBUG_DATABASES + _databases.Remove(value); +#endif } - // releases the "context" database - public void ReleaseDatabase() +#if DEBUG_DATABASES + // helps identifying when non-httpContext databases are created by logging the stack trace + private void LogCallContextStack() { - if (HttpContext.Current == null) - { - var value = NonContextValue; - if (value != null) value.Dispose(); - NonContextValue = null; - } + var trace = Environment.StackTrace; + if (trace.IndexOf("ScheduledPublishing") > 0) + LogHelper.Debug("CallContext: Scheduled Publishing"); + else if (trace.IndexOf("TouchServerTask") > 0) + LogHelper.Debug("CallContext: Server Registration"); + else if (trace.IndexOf("LogScrubber") > 0) + LogHelper.Debug("CallContext: Log Scrubber"); else - { - var db = (UmbracoDatabase)HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; - if (db != null) db.Dispose(); - HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); - } + LogHelper.Debug("CallContext: " + Environment.StackTrace); } + private readonly List _databases = new List(); + + // helps identifying database leaks by keeping track of all instances + public List Databases { get { return _databases; } } + + private static void Log(string message, UmbracoDatabase database) + { + LogHelper.Debug(message + " (" + (database == null ? "" : database.InstanceSid) + ")."); + } +#endif + + internal enum ContextOwner + { + None, + HttpContext, + CallContext + } + + internal UmbracoDatabase CreateDatabaseInstance(ContextOwner contextOwner) + { + var database = string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false + ? new UmbracoDatabase(ConnectionString, ProviderName, _logger) + : new UmbracoDatabase(_connectionStringName, _logger); + database.ContextOwner = contextOwner; + database.DatabaseFactory = this; + //database.EnableSqlTrace = true; +#if DEBUG_DATABASES + Log("Create " + contextOwner, database); + if (contextOwner == ContextOwner.CallContext) + LogCallContextStack(); + _databases.Add(database); +#endif + return database; + } + protected override void DisposeResources() { - ReleaseDatabase(); - } + UmbracoDatabase database; + + if (HttpContext.Current == null) + { + database = NonContextValue; +#if DEBUG_DATABASES + Log("Release lcc", database); +#endif + } + else + { + database = (UmbracoDatabase) HttpContext.Current.Items[typeof (DefaultDatabaseFactory)]; +#if DEBUG_DATABASES + Log("Release ctx", database); +#endif + } + + if (database != null) database.Dispose(); // removes it from call context + } // during tests, the thread static var can leak between tests // this method provides a way to force-reset the variable - internal void ResetForTests() + internal void ResetForTests() { var value = NonContextValue; if (value != null) value.Dispose(); @@ -156,26 +255,29 @@ namespace Umbraco.Core.Persistence // detaches the current database // ie returns the database and remove it from whatever is "context" - private static UmbracoDatabase DetachDatabase() + internal static UmbracoDatabase DetachDatabase() { + UmbracoDatabase database; + if (HttpContext.Current == null) { - var db = NonContextValue; + database = NonContextValue; NonContextValue = null; - return db; } else { - var db = (UmbracoDatabase)HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; - HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); - return db; + database = (UmbracoDatabase) HttpContext.Current.Items[typeof (DefaultDatabaseFactory)]; + HttpContext.Current.Items.Remove(typeof (DefaultDatabaseFactory)); } + + if (database != null) database.ContextOwner = ContextOwner.None; + return database; } // attach a current database // ie assign it to whatever is "context" // throws if there already is a database - private static void AttachDatabase(object o) + internal static void AttachDatabase(object o) { var database = o as UmbracoDatabase; if (o != null && database == null) throw new ArgumentException("Not an UmbracoDatabase.", "o"); @@ -183,12 +285,18 @@ namespace Umbraco.Core.Persistence if (HttpContext.Current == null) { if (NonContextValue != null) throw new InvalidOperationException(); - if (database != null) NonContextValue = database; + if (database == null) return; + + NonContextValue = database; + database.ContextOwner = ContextOwner.CallContext; } else { - if (HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] != null) throw new InvalidOperationException(); - if (database != null) HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] = database; + if (HttpContext.Current.Items[typeof (DefaultDatabaseFactory)] != null) throw new InvalidOperationException(); + if (database == null) return; + + HttpContext.Current.Items[typeof (DefaultDatabaseFactory)] = database; + database.ContextOwner = ContextOwner.HttpContext; } } diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs index 7ff9cabe84..62cbfa78c4 100644 --- a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs @@ -1,7 +1,9 @@ using System; using System.Data; using System.Data.Common; +using System.Data.SqlClient; using System.Text; +using MySql.Data.MySqlClient; using StackExchange.Profiling; using Umbraco.Core.Logging; using Umbraco.Core.Persistence.SqlSyntax; @@ -21,6 +23,12 @@ namespace Umbraco.Core.Persistence private readonly ILogger _logger; private readonly Guid _instanceId = Guid.NewGuid(); private bool _enableCount; +#if DEBUG_DATABASES + private int _spid = -1; +#endif + + internal DefaultDatabaseFactory.ContextOwner ContextOwner = DefaultDatabaseFactory.ContextOwner.None; + internal DefaultDatabaseFactory DatabaseFactory = null; /// /// Used for testing @@ -30,6 +38,18 @@ namespace Umbraco.Core.Persistence get { return _instanceId; } } + public string InstanceSid + { + get + { +#if DEBUG_DATABASES + return _instanceId.ToString("N").Substring(0, 8) + ":" + _spid; +#else + return _instanceId.ToString("N").Substring(0, 8); +#endif + } + } + /// /// Generally used for testing, will output all SQL statements executed to the logger /// @@ -113,13 +133,44 @@ namespace Umbraco.Core.Persistence { // propagate timeout if none yet +#if DEBUG_DATABASES + if (DatabaseType == DBType.MySql) + { + using (var command = connection.CreateCommand()) + { + command.CommandText = "SELECT CONNECTION_ID()"; + _spid = Convert.ToInt32(command.ExecuteScalar()); + } + } + else if (DatabaseType == DBType.SqlServer) + { + using (var command = connection.CreateCommand()) + { + command.CommandText = "SELECT @@SPID"; + _spid = Convert.ToInt32(command.ExecuteScalar()); + } + } + else + { + // includes SqlCE + _spid = 0; + } +#endif + // wrap the connection with a profiling connection that tracks timings return new StackExchange.Profiling.Data.ProfiledDbConnection(connection as DbConnection, MiniProfiler.Current); } +#if DEBUG_DATABASES + public override void OnConnectionClosing(IDbConnection conn) + { + _spid = -1; + } +#endif + public override void OnException(Exception x) { - _logger.Error("Database exception occurred", x); + _logger.Error("Exception (" + InstanceSid + ").", x); base.OnException(x); } @@ -132,14 +183,18 @@ namespace Umbraco.Core.Persistence if (EnableSqlTrace) { var sb = new StringBuilder(); +#if DEBUG_DATABASES + sb.Append(InstanceSid); + sb.Append(": "); +#endif sb.Append(cmd.CommandText); foreach (DbParameter p in cmd.Parameters) { sb.Append(" - "); sb.Append(p.Value); } - - _logger.Debug(sb.ToString()); + + _logger.Debug(sb.ToString().Replace("{", "{{").Replace("}", "}}")); } base.OnExecutingCommand(cmd); @@ -185,9 +240,15 @@ namespace Umbraco.Core.Persistence } } } - + //use the defaults base.BuildSqlDbSpecificPagingQuery(databaseType, skip, take, sql, sqlSelectRemoved, sqlOrderBy, ref args, out sqlPage); } + + protected override void Dispose(bool disposing) + { + LogHelper.Debug("Dispose (" + InstanceSid + ")."); + if (DatabaseFactory != null) DatabaseFactory.OnDispose(this); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/UmbracoApplicationBase.cs b/src/Umbraco.Core/UmbracoApplicationBase.cs index e4574a7972..c6cdfb072a 100644 --- a/src/Umbraco.Core/UmbracoApplicationBase.cs +++ b/src/Umbraco.Core/UmbracoApplicationBase.cs @@ -16,7 +16,7 @@ namespace Umbraco.Core /// The abstract class for the Umbraco HttpApplication /// /// - /// This is exposed in the core so that we can have the IApplicationEventHandler in the core project so that + /// This is exposed in the core so that we can have the IApplicationEventHandler in the core project so that /// IApplicationEventHandler's can fire/execute outside of the web contenxt (i.e. in console applications) /// public abstract class UmbracoApplicationBase : System.Web.HttpApplication @@ -35,7 +35,7 @@ namespace Umbraco.Core ///

    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

    X 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%0D>w;h*{=|t3`GjEq1wlQ=4+U_9A_x<~=OqiL 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 z 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 z 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

  • internal void StartApplication(object sender, EventArgs e) { - //take care of unhandled exceptions - there is nothing we can do to + //take care of unhandled exceptions - there is nothing we can do to // prevent the entire w3wp process to go down but at least we can try // and log the exception AppDomain.CurrentDomain.UnhandledException += (_, args) => @@ -59,6 +59,11 @@ namespace Umbraco.Core //And now we can dispose of our startup handlers - save some memory ApplicationEventsResolver.Current.Dispose(); + + // after Umbraco has started there is a database in "context" and that context is + // going to stay there and never get destroyed nor reused, so we have to ensure that + // the database is disposed (which will auto-remove it from context). + ApplicationContext.Current.DatabaseContext.Database.Dispose(); } /// @@ -121,7 +126,7 @@ namespace Umbraco.Core throw; } } - + } /// @@ -188,7 +193,7 @@ namespace Umbraco.Core { return; } - + Logger.Error("An unhandled exception occurred", exc); OnApplicationError(sender, e); From 6101b4eddebdd2d07a4f9ff217ddb919a2260eb9 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 18 Nov 2016 09:27:17 +0100 Subject: [PATCH 131/841] U4-9201 - use UsingSafeDatabase where appropriate --- src/Umbraco.Web/Scheduling/LogScrubber.cs | 4 +- .../Scheduling/ScheduledPublishing.cs | 22 ++++--- .../ServerRegistrationEventHandler.cs | 14 +++-- .../DataServices/UmbracoContentService.cs | 60 +++++++++---------- 4 files changed, 55 insertions(+), 45 deletions(-) diff --git a/src/Umbraco.Web/Scheduling/LogScrubber.cs b/src/Umbraco.Web/Scheduling/LogScrubber.cs index b3a5f303e3..da49404b4d 100644 --- a/src/Umbraco.Web/Scheduling/LogScrubber.cs +++ b/src/Umbraco.Web/Scheduling/LogScrubber.cs @@ -16,7 +16,7 @@ namespace Umbraco.Web.Scheduling private readonly ApplicationContext _appContext; private readonly IUmbracoSettingsSection _settings; - public LogScrubber(IBackgroundTaskRunner runner, int delayMilliseconds, int periodMilliseconds, + public LogScrubber(IBackgroundTaskRunner runner, int delayMilliseconds, int periodMilliseconds, ApplicationContext appContext, IUmbracoSettingsSection settings) : base(runner, delayMilliseconds, periodMilliseconds) { @@ -77,6 +77,8 @@ namespace Umbraco.Web.Scheduling return false; // do NOT repeat, going down } + // running on a background task, requires a safe database (see UsingSafeDatabase doc) + using (ApplicationContext.Current.DatabaseContext.UsingSafeDatabase) using (DisposableTimer.DebugDuration("Log scrubbing executing", "Log scrubbing complete")) { Log.CleanLogs(GetLogScrubbingMaximumAge(_settings)); diff --git a/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs b/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs index 6649c3c474..dc6c27959d 100644 --- a/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs +++ b/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs @@ -29,7 +29,7 @@ namespace Umbraco.Web.Scheduling } public override async Task PerformRunAsync(CancellationToken token) - { + { if (_appContext == null) return true; // repeat... switch (_appContext.GetCurrentServerRole()) @@ -70,19 +70,27 @@ namespace Umbraco.Web.Scheduling var url = umbracoAppUrl + "/RestServices/ScheduledPublish/Index"; using (DisposableTimer.DebugDuration( - () => string.Format("Scheduled publishing executing @ {0}", url), + () => string.Format("Scheduled publishing executing @ {0}", url), () => "Scheduled publishing complete")) - { + { try - { + { using (var wc = new HttpClient()) { var request = new HttpRequestMessage(HttpMethod.Post, url) { Content = new StringContent(string.Empty) }; - //pass custom the authorization header - request.Headers.Authorization = AdminTokenAuthorizeAttribute.GetAuthenticationHeaderValue(_appContext); + + // running on a background task, requires a safe database (see UsingSafeDatabase doc) + // + // this is because GetAuthenticationHeaderValue uses UserService to load the current user, hence requires a database + // + using (ApplicationContext.Current.DatabaseContext.UsingSafeDatabase) + { + //pass custom the authorization header + request.Headers.Authorization = AdminTokenAuthorizeAttribute.GetAuthenticationHeaderValue(_appContext); + } var result = await wc.SendAsync(request, token); } @@ -100,7 +108,7 @@ namespace Umbraco.Web.Scheduling { get { return true; } } - + public override bool RunsOnShutdown { get { return false; } diff --git a/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs b/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs index a6dfa07be1..84b3e220ff 100644 --- a/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs +++ b/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs @@ -35,7 +35,7 @@ namespace Umbraco.Web.Strategies protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { _registrar = ServerRegistrarResolver.Current.Registrar as DatabaseServerRegistrar; - + // only for the DatabaseServerRegistrar if (_registrar == null) return; @@ -65,10 +65,10 @@ namespace Umbraco.Web.Strategies case EnsureRoutableOutcome.IsRoutable: case EnsureRoutableOutcome.NotDocumentRequest: RegisterBackgroundTasks(e); - break; + break; } } - + private void RegisterBackgroundTasks(UmbracoRequestEventArgs e) { //remove handler, we're done @@ -84,7 +84,7 @@ namespace Umbraco.Web.Strategies 15000, //delay before first execution _registrar.Options.RecurringSeconds*1000, //amount of ms between executions svc, _registrar, serverAddress); - + //Perform the rest async, we don't want to block the startup sequence // this will just reoccur on a background thread _backgroundTaskRunner.TryAdd(task); @@ -137,7 +137,11 @@ namespace Umbraco.Web.Strategies { try { - _svc.TouchServer(_serverAddress, _svc.CurrentServerIdentity, _registrar.Options.StaleServerTimeout); + // running on a background task, requires a safe database (see UsingSafeDatabase doc) + using (ApplicationContext.Current.DatabaseContext.UsingSafeDatabase) + { + _svc.TouchServer(_serverAddress, _svc.CurrentServerIdentity, _registrar.Options.StaleServerTimeout); + } return true; // repeat } diff --git a/src/UmbracoExamine/DataServices/UmbracoContentService.cs b/src/UmbracoExamine/DataServices/UmbracoContentService.cs index 8f995a125e..4d2ea5bd9a 100644 --- a/src/UmbracoExamine/DataServices/UmbracoContentService.cs +++ b/src/UmbracoExamine/DataServices/UmbracoContentService.cs @@ -1,26 +1,13 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Security; -using System.Text; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.UnitOfWork; -using Umbraco.Core.Services; -using umbraco; using System.Xml.Linq; -using System.Xml; -using umbraco.cms.businesslogic.web; using System.Collections; using System.Xml.XPath; -using umbraco.DataLayer; -using umbraco.BusinessLogic; -using UmbracoExamine.Config; using Examine.LuceneEngine; -using System.Data.SqlClient; -using System.Diagnostics; namespace UmbracoExamine.DataServices { @@ -31,9 +18,7 @@ namespace UmbracoExamine.DataServices public UmbracoContentService() : this(ApplicationContext.Current) - { - - } + { } public UmbracoContentService(ApplicationContext applicationContext) { @@ -73,13 +58,18 @@ namespace UmbracoExamine.DataServices [Obsolete("This should no longer be used, latest content will be indexed by using the IContentService directly")] public XDocument GetLatestContentByXPath(string xpath) { - var xmlContent = XDocument.Parse(""); - foreach (var c in _applicationContext.Services.ContentService.GetRootContent()) + using (_applicationContext.DatabaseContext.UsingSafeDatabase) { - xmlContent.Root.Add(c.ToDeepXml(_applicationContext.Services.PackagingService)); + var xmlContent = XDocument.Parse(""); + var rootContent = _applicationContext.Services.ContentService.GetRootContent(); + foreach (var c in rootContent) + { + // not sure this uses the database, but better be save + xmlContent.Root.Add(c.ToDeepXml(_applicationContext.Services.PackagingService)); + } + var result = ((IEnumerable)xmlContent.XPathEvaluate(xpath)).Cast(); + return result.ToXDocument(); } - var result = ((IEnumerable)xmlContent.XPathEvaluate(xpath)).Cast(); - return result.ToXDocument(); } /// @@ -90,7 +80,10 @@ namespace UmbracoExamine.DataServices /// public bool IsProtected(int nodeId, string path) { - return _applicationContext.Services.PublicAccessService.IsProtected(path.EnsureEndsWith("," + nodeId)); + using (_applicationContext.DatabaseContext.UsingSafeDatabase) + { + return _applicationContext.Services.PublicAccessService.IsProtected(path.EnsureEndsWith("," + nodeId)); + } } /// @@ -100,16 +93,19 @@ namespace UmbracoExamine.DataServices public IEnumerable GetAllUserPropertyNames() { - try - { - var result = _applicationContext.DatabaseContext.Database.Fetch("select distinct alias from cmsPropertyType order by alias"); - return result; - } - catch (Exception ex) - { - LogHelper.Error("EXCEPTION OCCURRED reading GetAllUserPropertyNames", ex); - return Enumerable.Empty(); - } + using (_applicationContext.DatabaseContext.UsingSafeDatabase) + { + try + { + var result = _applicationContext.DatabaseContext.Database.Fetch("select distinct alias from cmsPropertyType order by alias"); + return result; + } + catch (Exception ex) + { + LogHelper.Error("EXCEPTION OCCURRED reading GetAllUserPropertyNames", ex); + return Enumerable.Empty(); + } + } } /// From bad0d15c1c780ee50890613862dabd40c9691be7 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 18 Nov 2016 13:32:56 +0100 Subject: [PATCH 132/841] U4-9201 - troubleshoot --- src/Umbraco.Core/Persistence/UmbracoDatabase.cs | 1 + src/Umbraco.Core/UmbracoApplicationBase.cs | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs index 62cbfa78c4..4c7ba0b4c6 100644 --- a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs @@ -247,6 +247,7 @@ namespace Umbraco.Core.Persistence protected override void Dispose(bool disposing) { + base.Dispose(disposing); LogHelper.Debug("Dispose (" + InstanceSid + ")."); if (DatabaseFactory != null) DatabaseFactory.OnDispose(this); } diff --git a/src/Umbraco.Core/UmbracoApplicationBase.cs b/src/Umbraco.Core/UmbracoApplicationBase.cs index c6cdfb072a..1bf90fb154 100644 --- a/src/Umbraco.Core/UmbracoApplicationBase.cs +++ b/src/Umbraco.Core/UmbracoApplicationBase.cs @@ -63,7 +63,9 @@ namespace Umbraco.Core // after Umbraco has started there is a database in "context" and that context is // going to stay there and never get destroyed nor reused, so we have to ensure that // the database is disposed (which will auto-remove it from context). - ApplicationContext.Current.DatabaseContext.Database.Dispose(); + var database = ApplicationContext.Current.DatabaseContext.Database; + if (database != null) // never to happen... unless in weird tests + ApplicationContext.Current.DatabaseContext.Database.Dispose(); } /// From 5784ea96e751f78af7c405cfdb477829f7feca7c Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 23 Nov 2016 11:26:30 +0100 Subject: [PATCH 133/841] UnRevert "Backport SafeCallContext, DefaultDatabaseFactory fixes from 7.6" This reverts commit 8ba6cb3abf6c5fe1ce965b35788c03ab1f60067b. --- .../Packaging/PackageBinaryInspector.cs | 50 ++--- .../Persistence/DefaultDatabaseFactory.cs | 186 +++++++++++++----- src/Umbraco.Core/SafeCallContext.cs | 94 +++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + .../Persistence/DatabaseContextTests.cs | 4 +- .../DataServices/UmbracoContentService.cs | 1 - 6 files changed, 258 insertions(+), 78 deletions(-) create mode 100644 src/Umbraco.Core/SafeCallContext.cs diff --git a/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs b/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs index 9307e74f21..57664b8a83 100644 --- a/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs +++ b/src/Umbraco.Core/Packaging/PackageBinaryInspector.cs @@ -29,20 +29,24 @@ namespace Umbraco.Core.Packaging /// public static IEnumerable ScanAssembliesForTypeReference(IEnumerable assemblys, out string[] errorReport) { - var appDomain = GetTempAppDomain(); - var type = typeof(PackageBinaryInspector); - try + // beware! when toying with domains, use a safe call context! + using (new SafeCallContext()) { - var value = (PackageBinaryInspector)appDomain.CreateInstanceAndUnwrap( - type.Assembly.FullName, - type.FullName); - // do NOT turn PerformScan into static (even if ReSharper says so)! - var result = value.PerformScan(assemblys.ToArray(), out errorReport); - return result; - } - finally - { - AppDomain.Unload(appDomain); + var appDomain = GetTempAppDomain(); + var type = typeof(PackageBinaryInspector); + try + { + var value = (PackageBinaryInspector) appDomain.CreateInstanceAndUnwrap( + type.Assembly.FullName, + type.FullName); + // do NOT turn PerformScan into static (even if ReSharper says so)! + var result = value.PerformScan(assemblys.ToArray(), out errorReport); + return result; + } + finally + { + AppDomain.Unload(appDomain); + } } } @@ -78,7 +82,7 @@ namespace Umbraco.Core.Packaging /// /// Performs the assembly scanning /// - /// + /// /// /// /// @@ -107,7 +111,7 @@ namespace Umbraco.Core.Packaging /// /// Performs the assembly scanning /// - /// + /// /// /// /// @@ -154,7 +158,7 @@ namespace Umbraco.Core.Packaging //get the list of assembly names to compare below var loadedNames = loaded.Select(x => x.GetName().Name).ToArray(); - + //Then load each referenced assembly into the context foreach (var a in loaded) { @@ -170,7 +174,7 @@ namespace Umbraco.Core.Packaging } catch (FileNotFoundException) { - //if an exception occurs it means that a referenced assembly could not be found + //if an exception occurs it means that a referenced assembly could not be found errors.Add( string.Concat("This package references the assembly '", assemblyName.Name, @@ -179,7 +183,7 @@ namespace Umbraco.Core.Packaging } catch (Exception ex) { - //if an exception occurs it means that a referenced assembly could not be found + //if an exception occurs it means that a referenced assembly could not be found errors.Add( string.Concat("This package could not be verified for compatibility. An error occurred while loading a referenced assembly '", assemblyName.Name, @@ -197,7 +201,7 @@ namespace Umbraco.Core.Packaging { //now we need to see if they contain any type 'T' var reflectedAssembly = a; - + try { var found = reflectedAssembly.GetExportedTypes() @@ -210,8 +214,8 @@ namespace Umbraco.Core.Packaging } catch (Exception ex) { - //This is a hack that nobody can seem to get around, I've read everything and it seems that - // this is quite a common thing when loading types into reflection only load context, so + //This is a hack that nobody can seem to get around, I've read everything and it seems that + // this is quite a common thing when loading types into reflection only load context, so // we're just going to ignore this specific one for now var typeLoadEx = ex as TypeLoadException; if (typeLoadEx != null) @@ -232,7 +236,7 @@ namespace Umbraco.Core.Packaging LogHelper.Error("An error occurred scanning package assemblies", ex); } } - + } errorReport = errors.ToArray(); @@ -252,7 +256,7 @@ namespace Umbraco.Core.Packaging var contractType = contractAssemblyLoadFrom.GetExportedTypes() .FirstOrDefault(x => x.FullName == typeof(T).FullName && x.Assembly.FullName == typeof(T).Assembly.FullName); - + if (contractType == null) { throw new InvalidOperationException("Could not find type " + typeof(T) + " in the LoadFrom assemblies"); diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs index 8b78f290b3..4ad425d9c9 100644 --- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs @@ -1,6 +1,6 @@ using System; +using System.Runtime.Remoting.Messaging; using System.Web; -using Umbraco.Core.Configuration; using Umbraco.Core.Logging; namespace Umbraco.Core.Persistence @@ -19,13 +19,24 @@ namespace Umbraco.Core.Persistence private readonly ILogger _logger; public string ConnectionString { get; private set; } public string ProviderName { get; private set; } - - //very important to have ThreadStatic: - // see: http://issues.umbraco.org/issue/U4-2172 - [ThreadStatic] - private static volatile UmbracoDatabase _nonHttpInstance; - private static readonly object Locker = new object(); + // NO! see notes in v8 HybridAccessorBase + //[ThreadStatic] + //private static volatile UmbracoDatabase _nonHttpInstance; + + private const string ItemKey = "Umbraco.Core.Persistence.DefaultDatabaseFactory"; + + private static UmbracoDatabase NonContextValue + { + get { return (UmbracoDatabase) CallContext.LogicalGetData(ItemKey); } + set + { + if (value == null) CallContext.FreeNamedDataSlot(ItemKey); + else CallContext.LogicalSetData(ItemKey, value); + } + } + + private static readonly object Locker = new object(); /// /// Constructor accepting custom connection string @@ -36,7 +47,10 @@ namespace Umbraco.Core.Persistence { if (logger == null) throw new ArgumentNullException("logger"); Mandate.ParameterNotNullOrEmpty(connectionStringName, "connectionStringName"); - _connectionStringName = connectionStringName; + + //if (NonContextValue != null) throw new Exception("NonContextValue is not null."); + + _connectionStringName = connectionStringName; _logger = logger; } @@ -51,65 +65,133 @@ namespace Umbraco.Core.Persistence if (logger == null) throw new ArgumentNullException("logger"); Mandate.ParameterNotNullOrEmpty(connectionString, "connectionString"); Mandate.ParameterNotNullOrEmpty(providerName, "providerName"); - ConnectionString = connectionString; + + //if (NonContextValue != null) throw new Exception("NonContextValue is not null."); + + ConnectionString = connectionString; ProviderName = providerName; _logger = logger; } public UmbracoDatabase CreateDatabase() { - //no http context, create the singleton global object - if (HttpContext.Current == null) - { - if (_nonHttpInstance == null) - { - lock (Locker) - { - //double check - if (_nonHttpInstance == null) - { - _nonHttpInstance = string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false - ? new UmbracoDatabase(ConnectionString, ProviderName, _logger) - : new UmbracoDatabase(_connectionStringName, _logger); - } - } - } - return _nonHttpInstance; - } + // no http context, create the call context object + // NOTHING is going to track the object and it is the responsibility of the caller to release it! + // using the ReleaseDatabase method. + if (HttpContext.Current == null) + { + LogHelper.Debug("Get NON http [T" + Environment.CurrentManagedThreadId + "]"); + var value = NonContextValue; + if (value != null) return value; + lock (Locker) + { + value = NonContextValue; + if (value != null) return value; - //we have an http context, so only create one per request - if (HttpContext.Current.Items.Contains(typeof(DefaultDatabaseFactory)) == false) - { - HttpContext.Current.Items.Add(typeof (DefaultDatabaseFactory), - string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false + LogHelper.Debug("Create NON http [T" + Environment.CurrentManagedThreadId + "]"); + NonContextValue = value = string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false + ? new UmbracoDatabase(ConnectionString, ProviderName, _logger) + : new UmbracoDatabase(_connectionStringName, _logger); + + return value; + } + } + + // we have an http context, so only create one per request. + // UmbracoDatabase is marked IDisposeOnRequestEnd and therefore will be disposed when + // UmbracoModule attempts to dispose the relevant HttpContext items. so we DO dispose + // connections at the end of each request. no need to call ReleaseDatabase. + LogHelper.Debug("Get http [T" + Environment.CurrentManagedThreadId + "]"); + if (HttpContext.Current.Items.Contains(typeof(DefaultDatabaseFactory)) == false) + { + LogHelper.Debug("Create http [T" + Environment.CurrentManagedThreadId + "]"); + HttpContext.Current.Items.Add(typeof(DefaultDatabaseFactory), + string.IsNullOrEmpty(ConnectionString) == false && string.IsNullOrEmpty(ProviderName) == false ? new UmbracoDatabase(ConnectionString, ProviderName, _logger) : new UmbracoDatabase(_connectionStringName, _logger)); - } - return (UmbracoDatabase)HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; - } + } + return (UmbracoDatabase)HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; + } - protected override void DisposeResources() + // releases the "context" database + public void ReleaseDatabase() + { + if (HttpContext.Current == null) + { + var value = NonContextValue; + if (value != null) value.Dispose(); + NonContextValue = null; + } + else + { + var db = (UmbracoDatabase)HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; + if (db != null) db.Dispose(); + HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); + } + } + + protected override void DisposeResources() { - if (HttpContext.Current == null) - { - _nonHttpInstance.Dispose(); - } - else - { - if (HttpContext.Current.Items.Contains(typeof(DefaultDatabaseFactory))) - { - ((UmbracoDatabase)HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]).Dispose(); - } - } + ReleaseDatabase(); } // during tests, the thread static var can leak between tests // this method provides a way to force-reset the variable internal void ResetForTests() { - if (_nonHttpInstance == null) return; - _nonHttpInstance.Dispose(); - _nonHttpInstance = null; - } - } + var value = NonContextValue; + if (value != null) value.Dispose(); + NonContextValue = null; + } + + #region SafeCallContext + + // see notes in SafeCallContext - need to do this since we are using + // the logical call context... + + static DefaultDatabaseFactory() + { + SafeCallContext.Register(DetachDatabase, AttachDatabase); + } + + // detaches the current database + // ie returns the database and remove it from whatever is "context" + private static UmbracoDatabase DetachDatabase() + { + if (HttpContext.Current == null) + { + var db = NonContextValue; + NonContextValue = null; + return db; + } + else + { + var db = (UmbracoDatabase)HttpContext.Current.Items[typeof(DefaultDatabaseFactory)]; + HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); + return db; + } + } + + // attach a current database + // ie assign it to whatever is "context" + // throws if there already is a database + private static void AttachDatabase(object o) + { + var database = o as UmbracoDatabase; + if (o != null && database == null) throw new ArgumentException("Not an UmbracoDatabase.", "o"); + + if (HttpContext.Current == null) + { + if (NonContextValue != null) throw new InvalidOperationException(); + if (database != null) NonContextValue = database; + } + else + { + if (HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] != null) throw new InvalidOperationException(); + if (database != null) HttpContext.Current.Items[typeof(DefaultDatabaseFactory)] = database; + } + } + + #endregion + } } \ No newline at end of file diff --git a/src/Umbraco.Core/SafeCallContext.cs b/src/Umbraco.Core/SafeCallContext.cs new file mode 100644 index 0000000000..5ed41d389f --- /dev/null +++ b/src/Umbraco.Core/SafeCallContext.cs @@ -0,0 +1,94 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +namespace Umbraco.Core +{ + internal class SafeCallContext : IDisposable + { + private static readonly List> EnterFuncs = new List>(); + private static readonly List> ExitActions = new List>(); + private static int _count; + private readonly List _objects; + private bool _disposed; + + public static void Register(Func enterFunc, Action exitAction) + { + if (enterFunc == null) throw new ArgumentNullException("enterFunc"); + if (exitAction == null) throw new ArgumentNullException("exitAction"); + + lock (EnterFuncs) + { + if (_count > 0) throw new InvalidOperationException("Cannot register while some SafeCallContext instances exist."); + EnterFuncs.Add(enterFunc); + ExitActions.Add(exitAction); + } + } + + // tried to make the UmbracoDatabase serializable but then it leaks to weird places + // in ReSharper and so on, where Umbraco.Core is not available. Tried to serialize + // as an object instead but then it comes *back* deserialized into the original context + // as an object and of course it breaks everything. Cannot prevent this from flowing, + // and ExecutionContext.SuppressFlow() works for threads but not domains. and we'll + // have the same issue with anything that toys with logical call context... + // + // so this class lets anything that uses the logical call context register itself, + // providing two methods: + // - an enter func that removes and returns whatever is in the logical call context + // - an exit action that restores the value into the logical call context + // whenever a SafeCallContext instance is created, it uses these methods to capture + // and clear the logical call context, and restore it when disposed. + // + // in addition, a static Clear method is provided - which uses the enter funcs to + // remove everything from logical call context - not to be used when the app runs, + // but can be useful during tests + // + // note + // see System.Transactions + // they are using a conditional weak table to store the data, and what they store in + // LLC is the key - which is just an empty MarshalByRefObject that is created with + // the transaction scope - that way, they can "clear current data" provided that + // they have the key - but they need to hold onto a ref to the scope... not ok for us + + public static void Clear() + { + lock (EnterFuncs) + { + foreach (var enter in EnterFuncs) + enter(); + } + } + + public SafeCallContext() + { + lock (EnterFuncs) + { + _count++; + _objects = EnterFuncs.Select(x => x()).ToList(); + } + } + + public void Dispose() + { + if (_disposed) throw new ObjectDisposedException("this"); + _disposed = true; + lock (EnterFuncs) + { + for (var i = 0; i < ExitActions.Count; i++) + ExitActions[i](_objects[i]); + _count--; + } + } + + // for unit tests ONLY + internal static void Reset() + { + lock (EnterFuncs) + { + if (_count > 0) throw new InvalidOperationException("Cannot reset while some SafeCallContext instances exist."); + EnterFuncs.Clear(); + ExitActions.Clear(); + } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index e180ed7efc..6da7f4519b 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -523,6 +523,7 @@ + diff --git a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs index 5919d23acc..1b42daa47c 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs @@ -37,7 +37,7 @@ namespace Umbraco.Tests.Persistence { DatabaseContext = _dbContext, IsReady = true - }; + }; } [TearDown] @@ -102,7 +102,7 @@ namespace Umbraco.Tests.Persistence var appCtx = new ApplicationContext( _dbContext, - new ServiceContext(migrationEntryService: Mock.Of()), + new ServiceContext(migrationEntryService: Mock.Of()), CacheHelper.CreateDisabledCacheHelper(), new ProfilingLogger(Mock.Of(), Mock.Of())); diff --git a/src/UmbracoExamine/DataServices/UmbracoContentService.cs b/src/UmbracoExamine/DataServices/UmbracoContentService.cs index 3cd94751ae..8f995a125e 100644 --- a/src/UmbracoExamine/DataServices/UmbracoContentService.cs +++ b/src/UmbracoExamine/DataServices/UmbracoContentService.cs @@ -102,7 +102,6 @@ namespace UmbracoExamine.DataServices { try { - var result = _applicationContext.DatabaseContext.Database.Fetch("select distinct alias from cmsPropertyType order by alias"); return result; } From 0689bf4f311cf44d374701d2a493a2dee2b3bfbc Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 23 Nov 2016 15:26:41 +0100 Subject: [PATCH 134/841] U4-9201 - fix it all --- src/Umbraco.Core/DatabaseContext.cs | 60 ++++++++++--------- .../Persistence/DefaultDatabaseFactory.cs | 18 +++++- src/Umbraco.Core/Umbraco.Core.csproj | 2 +- src/Umbraco.Web/Scheduling/LogScrubber.cs | 2 +- .../Scheduling/ScheduledPublishing.cs | 6 +- .../ServerRegistrationEventHandler.cs | 2 +- .../DataServices/UmbracoContentService.cs | 9 ++- 7 files changed, 56 insertions(+), 43 deletions(-) diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index f8f31ee695..27013d8ecd 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -94,13 +94,13 @@ namespace Umbraco.Core public ISqlSyntaxProvider SqlSyntax { get; private set; } /// - /// Gets the object for doing CRUD operations against custom tables that resides in the Umbraco database. + /// Gets an "ambient" database for doing CRUD operations against custom tables that resides in the Umbraco database. /// /// /// Should not be used for operation against standard Umbraco tables; as services should be used instead. /// Gets or creates an "ambient" database that is either stored in http context + available for the whole - /// request + auto-disposed at the end of the request, or in call context if there is no http context - in which - /// case it needs to be explicitely disposed so it is removed from call context. + /// request + auto-disposed at the end of the request, or stored in call context if there is no http context - in which + /// case it *must* be explicitely disposed (which will remove it from call context). /// public virtual UmbracoDatabase Database { @@ -108,24 +108,32 @@ namespace Umbraco.Core } /// - /// Replaces the "ambient" database (if any) and installs a new object. + /// Replaces the "ambient" database (if any) and by a new temp database. /// /// - /// The returned IDisposable *must* be diposed in order to properly disposed the safe database and + /// The returned IDisposable *must* be diposed in order to properly dispose the temp database and /// restore the original "ambient" database (if any). /// This is to be used in background tasks to ensure that they have an "ambient" database which /// will be properly removed from call context and does not interfere with anything else. In most case /// it is not replacing anything, just temporarily installing a database in context. /// - public virtual IDisposable UsingSafeDatabase + public virtual IDisposable UseSafeDatabase(bool force = false) { - get + var factory = _factory as DefaultDatabaseFactory; + if (factory == null) throw new NotSupportedException(); + if (DefaultDatabaseFactory.HasAmbientDatabase) { - var factory = _factory as DefaultDatabaseFactory; - if (factory == null) throw new NotSupportedException(); - var database = factory.CreateDatabaseInstance(DefaultDatabaseFactory.ContextOwner.None); - return new UsedDatabase(database, _logger); + // has ambient, + // if forcing, detach it and replace it with a new, temp, database + // when the UsingDatabase is disposed, the temp database is disposed and the original one is re-instated + // else do nothing (and nothing will be disposed) + return force + ? new UsingDatabase(DefaultDatabaseFactory.DetachAmbientDatabase(), factory.CreateDatabase()) + : new UsingDatabase(null, null); } + + // create a new, temp, database (will be disposed with UsingDatabase) + return new UsingDatabase(null, factory.CreateDatabase()); } /// @@ -788,30 +796,26 @@ namespace Umbraco.Core return true; } - private class UsedDatabase : IDisposable + private class UsingDatabase : IDisposable { - private readonly UmbracoDatabase _database; - private readonly ILogger _logger; + private readonly UmbracoDatabase _orig; + private readonly UmbracoDatabase _temp; - public UsedDatabase(UmbracoDatabase database, ILogger logger) + public UsingDatabase(UmbracoDatabase orig, UmbracoDatabase temp) { - _logger = logger; - - // replace with ours - _database = DefaultDatabaseFactory.DetachDatabase(); - _logger.Debug("Detached db " + (_database == null ? "x" : _database.InstanceSid) + "."); - DefaultDatabaseFactory.AttachDatabase(database); - _logger.Debug("Attached db " + database.InstanceSid + "."); + _orig = orig; + _temp = temp; } public void Dispose() { - // restore the original DB - var db = DefaultDatabaseFactory.DetachDatabase(); - _logger.Debug("Detached db " + db.InstanceSid + "."); - db.Dispose(); - DefaultDatabaseFactory.AttachDatabase(_database); - _logger.Debug("Attached db " + (_database == null ? "x" : _database.InstanceSid) + "."); + if (_temp != null) + { + _temp.Dispose(); + if (_orig != null) + DefaultDatabaseFactory.AttachAmbientDatabase(_orig); + } + GC.SuppressFinalize(this); } } } diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs index 5139da20d8..2ffee29490 100644 --- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Runtime.Remoting.Messaging; using System.Web; using Umbraco.Core.Logging; @@ -250,12 +251,23 @@ namespace Umbraco.Core.Persistence static DefaultDatabaseFactory() { - SafeCallContext.Register(DetachDatabase, AttachDatabase); + SafeCallContext.Register(DetachAmbientDatabase, AttachAmbientDatabase); } + // gets a value indicating whether there is an ambient database + internal static bool HasAmbientDatabase + { + get + { + return HttpContext.Current == null + ? NonContextValue != null + : HttpContext.Current.Items[typeof (DefaultDatabaseFactory)] != null; + } + } + // detaches the current database // ie returns the database and remove it from whatever is "context" - internal static UmbracoDatabase DetachDatabase() + internal static UmbracoDatabase DetachAmbientDatabase() { UmbracoDatabase database; @@ -277,7 +289,7 @@ namespace Umbraco.Core.Persistence // attach a current database // ie assign it to whatever is "context" // throws if there already is a database - internal static void AttachDatabase(object o) + internal static void AttachAmbientDatabase(object o) { var database = o as UmbracoDatabase; if (o != null && database == null) throw new ArgumentException("Not an UmbracoDatabase.", "o"); diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 6da7f4519b..24d889a06f 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -21,7 +21,7 @@ full false bin\Debug\ - DEBUG;TRACE + TRACE;DEBUG;DEBUG_DATABASES prompt 4 false diff --git a/src/Umbraco.Web/Scheduling/LogScrubber.cs b/src/Umbraco.Web/Scheduling/LogScrubber.cs index da49404b4d..7737101961 100644 --- a/src/Umbraco.Web/Scheduling/LogScrubber.cs +++ b/src/Umbraco.Web/Scheduling/LogScrubber.cs @@ -78,7 +78,7 @@ namespace Umbraco.Web.Scheduling } // running on a background task, requires a safe database (see UsingSafeDatabase doc) - using (ApplicationContext.Current.DatabaseContext.UsingSafeDatabase) + using (ApplicationContext.Current.DatabaseContext.UseSafeDatabase(true)) using (DisposableTimer.DebugDuration("Log scrubbing executing", "Log scrubbing complete")) { Log.CleanLogs(GetLogScrubbingMaximumAge(_settings)); diff --git a/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs b/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs index dc6c27959d..ba4fdddba5 100644 --- a/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs +++ b/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs @@ -83,10 +83,8 @@ namespace Umbraco.Web.Scheduling }; // running on a background task, requires a safe database (see UsingSafeDatabase doc) - // - // this is because GetAuthenticationHeaderValue uses UserService to load the current user, hence requires a database - // - using (ApplicationContext.Current.DatabaseContext.UsingSafeDatabase) + // (GetAuthenticationHeaderValue uses UserService to load the current user, hence requires a database) + using (ApplicationContext.Current.DatabaseContext.UseSafeDatabase(true)) { //pass custom the authorization header request.Headers.Authorization = AdminTokenAuthorizeAttribute.GetAuthenticationHeaderValue(_appContext); diff --git a/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs b/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs index 84b3e220ff..15ab8f244b 100644 --- a/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs +++ b/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs @@ -138,7 +138,7 @@ namespace Umbraco.Web.Strategies try { // running on a background task, requires a safe database (see UsingSafeDatabase doc) - using (ApplicationContext.Current.DatabaseContext.UsingSafeDatabase) + using (ApplicationContext.Current.DatabaseContext.UseSafeDatabase(true)) { _svc.TouchServer(_serverAddress, _svc.CurrentServerIdentity, _registrar.Options.StaleServerTimeout); } diff --git a/src/UmbracoExamine/DataServices/UmbracoContentService.cs b/src/UmbracoExamine/DataServices/UmbracoContentService.cs index 4d2ea5bd9a..df0562f49c 100644 --- a/src/UmbracoExamine/DataServices/UmbracoContentService.cs +++ b/src/UmbracoExamine/DataServices/UmbracoContentService.cs @@ -13,7 +13,6 @@ namespace UmbracoExamine.DataServices { public class UmbracoContentService : IContentService { - private readonly ApplicationContext _applicationContext; public UmbracoContentService() @@ -58,7 +57,7 @@ namespace UmbracoExamine.DataServices [Obsolete("This should no longer be used, latest content will be indexed by using the IContentService directly")] public XDocument GetLatestContentByXPath(string xpath) { - using (_applicationContext.DatabaseContext.UsingSafeDatabase) + using (_applicationContext.DatabaseContext.UseSafeDatabase()) // reuse current db if any else use & dispose one { var xmlContent = XDocument.Parse(""); var rootContent = _applicationContext.Services.ContentService.GetRootContent(); @@ -80,7 +79,7 @@ namespace UmbracoExamine.DataServices /// public bool IsProtected(int nodeId, string path) { - using (_applicationContext.DatabaseContext.UsingSafeDatabase) + using (_applicationContext.DatabaseContext.UseSafeDatabase()) // reuse current db if any else use & dispose one { return _applicationContext.Services.PublicAccessService.IsProtected(path.EnsureEndsWith("," + nodeId)); } @@ -93,8 +92,8 @@ namespace UmbracoExamine.DataServices public IEnumerable GetAllUserPropertyNames() { - using (_applicationContext.DatabaseContext.UsingSafeDatabase) - { + using (_applicationContext.DatabaseContext.UseSafeDatabase()) // reuse current db if any else use & dispose one + { try { var result = _applicationContext.DatabaseContext.Database.Fetch("select distinct alias from cmsPropertyType order by alias"); From 184a01b64dcd35f6964f96a0587db1767888456f Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 28 Nov 2016 10:08:57 +0100 Subject: [PATCH 135/841] U4-9201 - fixes --- src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs | 6 ++++++ src/Umbraco.Core/Umbraco.Core.csproj | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs index 2ffee29490..140540ed4c 100644 --- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs @@ -150,9 +150,15 @@ namespace Umbraco.Core.Persistence { case ContextOwner.CallContext: NonContextValue = null; +#if DEBUG_DATABASES + Log("Clr lcc", disposing); +#endif break; case ContextOwner.HttpContext: HttpContext.Current.Items.Remove(typeof(DefaultDatabaseFactory)); +#if DEBUG_DATABASES + Log("Clr ctx", disposing); +#endif break; } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 24d889a06f..7cee18e5f0 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -21,7 +21,7 @@ full false bin\Debug\ - TRACE;DEBUG;DEBUG_DATABASES + TRACE;DEBUG prompt 4 false From 48dbd5c57050245ea9b51b31f13a6a89cfee642c Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 24 Nov 2016 17:37:20 +0100 Subject: [PATCH 136/841] Ensure CacheRefresherEventHandler triggers first --- src/Umbraco.Core/Events/EventExtensions.cs | 33 ++++++++++++- .../Cache/CacheRefresherEventHandler.cs | 49 ++++++++++--------- 2 files changed, 58 insertions(+), 24 deletions(-) diff --git a/src/Umbraco.Core/Events/EventExtensions.cs b/src/Umbraco.Core/Events/EventExtensions.cs index 700a02457a..bd66b605fd 100644 --- a/src/Umbraco.Core/Events/EventExtensions.cs +++ b/src/Umbraco.Core/Events/EventExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; namespace Umbraco.Core.Events { @@ -47,5 +48,35 @@ namespace Umbraco.Core.Events if (eventHandler != null) eventHandler(sender, args); } - } + + // moves the last handler that was added to an instance event, to first position + public static void PromoteLastHandler(object sender, string eventName) + { + var fieldInfo = sender.GetType().GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic); + if (fieldInfo == null) throw new InvalidOperationException("No event named " + eventName + "."); + PromoteLastHandler(sender, fieldInfo); + } + + // moves the last handler that was added to a static event, to first position + public static void PromoteLastHandler(string eventName) + { + var fieldInfo = typeof(TSender).GetField(eventName, BindingFlags.Static | BindingFlags.NonPublic); + if (fieldInfo == null) throw new InvalidOperationException("No event named " + eventName + "."); + PromoteLastHandler(null, fieldInfo); + } + + private static void PromoteLastHandler(object sender, FieldInfo fieldInfo) + { + var d = fieldInfo.GetValue(sender) as Delegate; + if (d == null) return; + + var l = d.GetInvocationList(); + var x = l[l.Length - 1]; + for (var i = l.Length - 1; i > 0; i--) + l[i] = l[i - 1]; + l[0] = x; + + fieldInfo.SetValue(sender, Delegate.Combine(l)); + } + } } \ No newline at end of file diff --git a/src/Umbraco.Web/Cache/CacheRefresherEventHandler.cs b/src/Umbraco.Web/Cache/CacheRefresherEventHandler.cs index 791318d8ab..b41afebb74 100644 --- a/src/Umbraco.Web/Cache/CacheRefresherEventHandler.cs +++ b/src/Umbraco.Web/Cache/CacheRefresherEventHandler.cs @@ -9,8 +9,10 @@ using Umbraco.Core.Services; using umbraco.BusinessLogic; using umbraco.cms.businesslogic; using System.Linq; +using System.Reflection; using umbraco.cms.businesslogic.web; using Umbraco.Core.Logging; +using Umbraco.Core.ObjectResolution; using Umbraco.Core.Publishing; using Content = Umbraco.Core.Models.Content; using ApplicationTree = Umbraco.Core.Models.ApplicationTree; @@ -21,6 +23,7 @@ namespace Umbraco.Web.Cache /// /// Class which listens to events on business level objects in order to invalidate the cache amongst servers when data changes /// + [WeightedPlugin(int.MinValue)] public class CacheRefresherEventHandler : ApplicationEventHandler { protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) @@ -104,14 +107,14 @@ namespace Umbraco.Web.Cache //Bind to media events - MediaService.Saved += MediaServiceSaved; + MediaService.Saved += MediaServiceSaved; MediaService.Deleted += MediaServiceDeleted; MediaService.Moved += MediaServiceMoved; MediaService.Trashed += MediaServiceTrashed; MediaService.EmptiedRecycleBin += MediaServiceEmptiedRecycleBin; //Bind to content events - this is for unpublished content syncing across servers (primarily for examine) - + ContentService.Saved += ContentServiceSaved; ContentService.Deleted += ContentServiceDeleted; ContentService.Copied += ContentServiceCopied; @@ -231,7 +234,7 @@ namespace Umbraco.Web.Cache DistributedCache.Instance.RemoveUnpublishedCachePermanently(e.Ids.ToArray()); } } - + /// /// Handles cache refreshing for when content is trashed /// @@ -253,7 +256,7 @@ namespace Umbraco.Web.Cache /// /// /// - /// When an entity is copied new permissions may be assigned to it based on it's parent, if that is the + /// When an entity is copied new permissions may be assigned to it based on it's parent, if that is the /// case then we need to clear all user permissions cache. /// static void ContentServiceCopied(IContentService sender, CopyEventArgs e) @@ -285,10 +288,10 @@ namespace Umbraco.Web.Cache /// /// /// - /// When an entity is saved we need to notify other servers about the change in order for the Examine indexes to + /// When an entity is saved we need to notify other servers about the change in order for the Examine indexes to /// stay up-to-date for unpublished content. - /// - /// When an entity is created new permissions may be assigned to it based on it's parent, if that is the + /// + /// When an entity is created new permissions may be assigned to it based on it's parent, if that is the /// case then we need to clear all user permissions cache. /// static void ContentServiceSaved(IContentService sender, SaveEventArgs e) @@ -303,8 +306,8 @@ namespace Umbraco.Web.Cache var permissionsChanged = ((Content)x).WasPropertyDirty("PermissionsChanged"); if (permissionsChanged) { - clearUserPermissions = true; - } + clearUserPermissions = true; + } } }); @@ -337,7 +340,7 @@ namespace Umbraco.Web.Cache static void ApplicationTreeDeleted(ApplicationTree sender, EventArgs e) { DistributedCache.Instance.RefreshAllApplicationTreeCache(); - } + } #endregion #region Application event handlers @@ -349,7 +352,7 @@ namespace Umbraco.Web.Cache static void ApplicationDeleted(Section sender, EventArgs e) { DistributedCache.Instance.RefreshAllApplicationCache(); - } + } #endregion #region UserType event handlers @@ -362,9 +365,9 @@ namespace Umbraco.Web.Cache { e.SavedEntities.ForEach(x => DistributedCache.Instance.RefreshUserTypeCache(x.Id)); } - + #endregion - + #region Dictionary event handlers static void LocalizationServiceSavedDictionaryItem(ILocalizationService sender, SaveEventArgs e) @@ -390,11 +393,11 @@ namespace Umbraco.Web.Cache e.DeletedEntities.ForEach(x => DistributedCache.Instance.RemoveDataTypeCache(x)); } - + #endregion #region Stylesheet and stylesheet property event handlers - + static void FileServiceDeletedStylesheet(IFileService sender, DeleteEventArgs e) { e.DeletedEntities.ForEach(x => DistributedCache.Instance.RemoveStylesheetCache(x)); @@ -441,7 +444,7 @@ namespace Umbraco.Web.Cache { e.SavedEntities.ForEach(x => DistributedCache.Instance.RefreshLanguageCache(x)); } - + #endregion #region Content/media/member Type event handlers @@ -505,9 +508,9 @@ namespace Umbraco.Web.Cache e.SavedEntities.ForEach(x => DistributedCache.Instance.RefreshMemberTypeCache(x)); } - + #endregion - + #region User/permissions event handlers static void CacheRefresherEventHandler_AssignedPermissions(PermissionRepository sender, SaveEventArgs e) @@ -540,7 +543,7 @@ namespace Umbraco.Web.Cache { e.DeletedEntities.ForEach(x => DistributedCache.Instance.RemoveUserCache(x.Id)); } - + private static void InvalidateCacheForPermissionsChange(UserPermission sender) { if (sender.User != null) @@ -580,7 +583,7 @@ namespace Umbraco.Web.Cache { e.SavedEntities.ForEach(x => DistributedCache.Instance.RefreshTemplateCache(x.Id)); } - + #endregion #region Macro event handlers @@ -600,7 +603,7 @@ namespace Umbraco.Web.Cache DistributedCache.Instance.RefreshMacroCache(entity); } } - + #endregion #region Media event handlers @@ -631,14 +634,14 @@ namespace Umbraco.Web.Cache static void MediaServiceSaved(IMediaService sender, SaveEventArgs e) { DistributedCache.Instance.RefreshMediaCache(e.SavedEntities.ToArray()); - } + } #endregion #region Member event handlers static void MemberServiceDeleted(IMemberService sender, DeleteEventArgs e) { - DistributedCache.Instance.RemoveMemberCache(e.DeletedEntities.ToArray()); + DistributedCache.Instance.RemoveMemberCache(e.DeletedEntities.ToArray()); } static void MemberServiceSaved(IMemberService sender, SaveEventArgs e) From f7aee1c12f6144b5aede2ea5a77d36cb5de17240 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 28 Nov 2016 12:49:55 +0100 Subject: [PATCH 137/841] Version 7.6.0-alpha031 --- src/SolutionInfo.cs | 2 +- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index 8a38c089c9..80382c52aa 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -12,4 +12,4 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("7.6.0")] -[assembly: AssemblyInformationalVersion("7.6.0-alpha028")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("7.6.0-alpha031")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index 17d9c95e0a..d534ba314a 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "alpha028"; } } + public static string CurrentComment { get { return "alpha031"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx From daaa2bf911a449e23735a3016ec90810557d4696 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 29 Nov 2016 15:24:02 +0100 Subject: [PATCH 138/841] replace yellow buttons in query builder with blue --- .../src/less/components/umb-querybuilder.less | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less index 2c6a089eeb..0e6ad29e29 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less @@ -4,8 +4,14 @@ } .umb-querybuilder .row a.btn { - font-size: 12px; - background: lightyellow + padding: 5px 8px; + margin: 0 5px; + font-weight: bold; + background-color: #f3f9ff; + border: 1px solid #bfdff9; + border-radius: 3px; + text-align: center; + display: inline-block; } .umb-querybuilder .row > div { From bd0c1cd9324e92583597d59c98053e144212aecd Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 30 Nov 2016 10:38:04 +0100 Subject: [PATCH 139/841] clean up umb-era-button + add button style to template editor buttons --- src/Umbraco.Web.UI.Client/src/less/belle.less | 1 + .../components/buttons/umb-button-group.less | 22 ++++ .../components/buttons/umb-era-button.less | 104 +++++++++++++++++ .../src/less/components/umb-packages.less | 89 --------------- .../src/less/components/umb-querybuilder.less | 6 + .../src/less/healthcheck.less | 105 ------------------ .../src/views/templates/edit.html | 65 +++++------ 7 files changed, 163 insertions(+), 229 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-era-button.less diff --git a/src/Umbraco.Web.UI.Client/src/less/belle.less b/src/Umbraco.Web.UI.Client/src/less/belle.less index d6a967733f..c988f9edbb 100644 --- a/src/Umbraco.Web.UI.Client/src/less/belle.less +++ b/src/Umbraco.Web.UI.Client/src/less/belle.less @@ -121,6 +121,7 @@ @import "components/buttons/umb-button.less"; @import "components/buttons/umb-button-group.less"; +@import "components/buttons/umb-era-button.less"; @import "components/notifications/umb-notifications.less"; @import "components/umb-file-dropzone.less"; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less index 0b063d094d..119077d52b 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less @@ -8,3 +8,25 @@ right: 0; left: auto; } + +// hack for umb-era-button +.umb-button-group { + + display: flex; + + .umb-era-button:first-child { + padding-right: 15px; + border-radius: 3px 0 0 3px; + } + + .umb-era-button.umb-button-group__toggle { + padding-right: 10px; + padding-left: 10px; + border-radius: 0 3px 3px 0; + } + + .umb-era-button.umb-button-group__toggle .caret { + margin: 0; + } + +} diff --git a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-era-button.less b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-era-button.less new file mode 100644 index 0000000000..8087a601bb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-era-button.less @@ -0,0 +1,104 @@ +.umb-era-button { + display: flex; + justify-content: center; + align-items: center; + font-size: 14px; + //font-weight: bold; + height: 38px; + line-height: 1; + max-width: 100%; + padding: 0 18px; + color: #202129; + background-color: #edeeee; + text-decoration: none !important; + user-select: none; + white-space: nowrap; + overflow: hidden; + border-radius: 3px; + border: 0 none; + box-sizing: border-box; + cursor: pointer; + transition: background-color 80ms ease, color 80ms ease; +} + + +.umb-era-button:hover, +.umb-era-button:active { + color: #484848; + background-color: #e1e2e2; + outline: none; + text-decoration: none; +} + + +.umb-era-button:focus { + outline: none; +} + +.umb-era-button.-blue { + background: @blue; + color: white; +} + +.umb-era-button.-blue:hover { + background-color: @blueDark; +} + +.umb-era-button.-red { + background: @btnDangerBackground; + color: white; +} + +.umb-era-button.-red:hover { + background-color: darken(@btnDangerBackground, 5%); +} + +.umb-era-button.-link { + padding: 0; + background: transparent; +} + +.umb-era-button.-link:hover { + background-color: transparent; + opacity: .6; +} + +.umb-era-button.-inactive { + cursor: not-allowed; + color: #BBB; + background: #EAE7E7; +} + +.umb-era-button.-inactive:hover { + color: #BBB; + background: #EAE7E7; +} + + +.umb-era-button.-full-width { + display: block; + width: 100%; +} + +.umb-era-button.umb-button--s { + height: 30px; + font-size: 13px; +} + +.umb-era-button.-white { + background-color: @white; + + &:hover { + opacity: .9; + } +} + +.umb-era-button.-text-black { + color: @black; +} + +/* icons */ + +.umb-era-button i { + margin-right: 5px; +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less index f14df918c0..a043cd5571 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less @@ -248,95 +248,6 @@ color: black; } -/* umb-buttons-era */ -.umb-era-button { - display: flex; - justify-content: center; - align-items: center; - - font-size: 14px; - font-weight: bold; - - height: 38px; - line-height: 1; - - max-width: 100%; - padding: 0 18px; - - color: #484848; - background-color: #e0e0e0; - - text-decoration: none !important; - user-select: none; - - white-space: nowrap; - overflow: hidden; - - border-radius: 3px; - border: 0 none; - box-sizing: border-box; - - cursor: pointer; - - transition: background-color 80ms ease, color 80ms ease; -} - - -.umb-era-button:hover, -.umb-era-button:active { - color: #484848; - background-color: #d3d3d3; - outline: none; - text-decoration: none; -} - - -.umb-era-button:focus { - outline: none; -} - -.umb-era-button.-blue { - background: @blue; - color: white; -} - -.umb-era-button.-blue:hover { - background-color: @blueDark; -} - -.umb-era-button.-link { - padding: 0; - background: transparent; -} - -.umb-era-button.-link:hover { - background-color: transparent; - opacity: .6; -} - -.umb-era-button.-inactive { - cursor: not-allowed; - color: #BBB; - background: #EAE7E7; -} - -.umb-era-button.-inactive:hover { - color: #BBB; - background: #EAE7E7; -} - - -.umb-era-button.-full-width { - display: block; - width: 100%; -} - -.umb-era-button.umb-button--s { - height: 30px; - font-size: 13px; -} - - /* CATEGORIES */ .umb-packages-categories { diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less index 0e6ad29e29..fb6279608e 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less @@ -12,6 +12,12 @@ border-radius: 3px; text-align: center; display: inline-block; + +} + +.umb-querybuilder .row a.btn:hover { + background: #e8f1fb; + text-decoration: none; } .umb-querybuilder .row > div { diff --git a/src/Umbraco.Web.UI.Client/src/less/healthcheck.less b/src/Umbraco.Web.UI.Client/src/less/healthcheck.less index 6e82d424bb..d0427d96f7 100644 --- a/src/Umbraco.Web.UI.Client/src/less/healthcheck.less +++ b/src/Umbraco.Web.UI.Client/src/less/healthcheck.less @@ -95,111 +95,6 @@ } -/* umb-buttons-era */ -.umb-era-button { - display: flex; - justify-content: center; - align-items: center; - - font-size: 14px; - font-weight: bold; - - height: 40px; - line-height: 1; - - max-width: 100%; - padding: 0 15px; - - color: #484848; - background-color: #e0e0e0; - - text-decoration: none !important; - user-select: none; - - white-space: nowrap; - overflow: hidden; - - border-radius: 3px; - border: 0 none; - box-sizing: border-box; - - cursor: pointer; - - transition: background-color 80ms ease, color 80ms ease, opacity 80ms ease; -} - - -.umb-era-button:hover, -.umb-era-button:active { - color: #484848; - background-color: #d3d3d3; - outline: none; - text-decoration: none; -} - - -.umb-era-button:focus { - outline: none; -} - -.umb-era-button.-blue { - background: @blue; - color: white; -} - -.umb-era-button.-blue:hover { - background-color: @blueDark; -} - -.umb-era-button.-red { - background: @btnDangerBackground; - color: white; -} - -.umb-era-button.-red:hover { - background-color: darken(@btnDangerBackground, 5%); -} - -.umb-era-button.-link { - padding: 0; - background: transparent; -} - -.umb-era-button.-link:hover { - background-color: transparent; - opacity: .6; -} - -.umb-era-button.-inactive { - cursor: not-allowed; - color: #BBB; - background: #EAE7E7; -} - -.umb-era-button.-inactive:hover { - color: #BBB; - background: #EAE7E7; -} - - -.umb-era-button.-full-width { - display: block; - width: 100%; -} - -.umb-era-button.-white { - background-color: @white; - - &:hover { - opacity: .9; - } -} - -.umb-era-button.-text-black { - color: @black; -} - - /* Spacing for boxes */ .umb-air { flex: 0 0 auto; diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index e09a6be4c4..83f3d3954d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -22,20 +22,26 @@ - +
    - + - - - - - - Master template: - {{ vm.getMasterTemplateName(vm.template.masterTemplateAlias, vm.templates) }} - - - - - +
    Date: Wed, 30 Nov 2016 12:13:04 +0100 Subject: [PATCH 140/841] fix unit tests --- .../template-editor-controller.spec.js | 79 ++++++++++--------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/test/unit/app/templates/template-editor-controller.spec.js b/src/Umbraco.Web.UI.Client/test/unit/app/templates/template-editor-controller.spec.js index cb70446bb1..55d91c35a6 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/app/templates/template-editor-controller.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/app/templates/template-editor-controller.spec.js @@ -42,8 +42,14 @@ q = $q; ace = { - on: function(){} - } + on: function(){}, + navigateFileEnd: function() {}, + getCursorPosition: function() {}, + getValue: function() {}, + setValue: function() {}, + clearSelection: function() {}, + navigateFileStart: function() {} + }; controller = createController(); scope.$digest(); @@ -65,7 +71,8 @@ $scope: scope, $routeParams: {}, templateResource: { - getById: resolvedPromise({}) + getById: resolvedPromise({}), + getAll: resolvedPromise({}) }, assetsService: { loadCss: function() {} @@ -85,44 +92,42 @@ }); } - it("has ace editor", - function () { - expect(controller.editor).toBe(ace); - }); + it("has ace editor", function () { + expect(controller.editor).toBe(ace); + }); - it("sets masterpage on template", - function () { - controller.setLayout = function() {}; + it("sets masterpage on template", function () { + controller.setLayout = function() {}; - controller.openOrganizeOverlay(); - controller.organizeOverlay.submit({ - masterPage: { - alias: "NewMasterPage" - } - }); - expect(controller.template.masterPageAlias).toBe("NewMasterPage"); - }); - - it("changes layout value when masterpage is selected", - function() { - var newTemplate; - ace.clearSelection = nada; - ace.navigateFileStart = nada; - ace.getValue = function () { - return "@{ Layout = null; }"; + controller.openMasterTemplateOverlay(); + controller.masterTemplateOverlay.submit({ + selectedItem: { + alias: "NewMasterPage" } - ace.setValue = function (value) { - newTemplate = value; - } - - controller.openOrganizeOverlay(); - controller.organizeOverlay.submit({ - masterPage: { - alias: "NewMasterPage" - } - }); - expect(newTemplate).toBe("@{ Layout = \"NewMasterPage.cshtml\"; }"); }); + expect(controller.template.masterTemplateAlias).toBe("NewMasterPage"); + }); + + it("changes layout value when masterpage is selected", function() { + var newTemplate; + ace.clearSelection = nada; + ace.navigateFileStart = nada; + ace.getValue = function () { + return "@{ Layout = null; }"; + } + ace.setValue = function (value) { + newTemplate = value; + } + + controller.openMasterTemplateOverlay(); + controller.masterTemplateOverlay.submit({ + selectedItem: { + alias: "NewMasterPage" + } + }); + expect(newTemplate).toBe("@{ Layout = \"NewMasterPage.cshtml\"; }"); + }); + }); }()); From b0aae7248c92b26fcdf8808ab940be436f8562af Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 2 Dec 2016 17:04:51 +0100 Subject: [PATCH 141/841] Import DatabaseDebugHelper (disabled) --- .../Persistence/DatabaseDebugHelper.cs | 169 ++++++++++++++++++ .../Persistence/UmbracoDatabase.cs | 28 ++- src/Umbraco.Core/Umbraco.Core.csproj | 1 + 3 files changed, 192 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Core/Persistence/DatabaseDebugHelper.cs diff --git a/src/Umbraco.Core/Persistence/DatabaseDebugHelper.cs b/src/Umbraco.Core/Persistence/DatabaseDebugHelper.cs new file mode 100644 index 0000000000..06512c2d68 --- /dev/null +++ b/src/Umbraco.Core/Persistence/DatabaseDebugHelper.cs @@ -0,0 +1,169 @@ +#if DEBUG_DATABASES +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace Umbraco.Core.Persistence +{ + internal static class DatabaseDebugHelper + { + private const int CommandsSize = 100; + private static readonly Queue>> Commands = new Queue>>(); + + public static void SetCommand(IDbCommand command, string context) + { + var prof = command as StackExchange.Profiling.Data.ProfiledDbCommand; + if (prof != null) command = prof.InternalCommand; + lock (Commands) + { + Commands.Enqueue(Tuple.Create(context, new WeakReference(command))); + while (Commands.Count > CommandsSize) Commands.Dequeue(); + } + } + + public static string GetCommandContext(IDbCommand command) + { + lock (Commands) + { + var tuple = Commands.FirstOrDefault(x => + { + IDbCommand c; + return x.Item2.TryGetTarget(out c) && c == command; + }); + return tuple == null ? "?" : tuple.Item1; + } + } + + public static string GetReferencedObjects(IDbConnection con) + { + var prof = con as StackExchange.Profiling.Data.ProfiledDbConnection; + if (prof != null) con = prof.InnerConnection; + var dbCon = con as DbConnection; + return dbCon == null + ? "NotSupported: " + con.GetType() + : GetReferencedObjects(dbCon); + } + + public static string GetReferencedObjects(DbConnection con) + { + var t = con.GetType(); + + var field = t.GetField("_innerConnection", BindingFlags.Instance | BindingFlags.NonPublic); + if (field == null) throw new Exception("panic: _innerConnection (" + t + ")."); + var innerConnection = field.GetValue(con); + + var tin = innerConnection.GetType(); + + var fi = con is System.Data.SqlClient.SqlConnection + ? tin.BaseType.BaseType.GetField("_referenceCollection", BindingFlags.Instance | BindingFlags.NonPublic) + : tin.BaseType.GetField("_referenceCollection", BindingFlags.Instance | BindingFlags.NonPublic); + if (fi == null) + //return ""; + throw new Exception("panic: referenceCollection."); + + var rc = fi.GetValue(innerConnection); + if (rc == null) + //return ""; + throw new Exception("panic: innerCollection."); + + field = rc.GetType().BaseType.GetField("_items", BindingFlags.Instance | BindingFlags.NonPublic); + if (field == null) throw new Exception("panic: items."); + var items = field.GetValue(rc); + var prop = items.GetType().GetProperty("Length", BindingFlags.Instance | BindingFlags.Public); + if (prop == null) throw new Exception("panic: Length."); + var count = Convert.ToInt32(prop.GetValue(items, null)); + var miGetValue = items.GetType().GetMethod("GetValue", new[] { typeof(int) }); + if (miGetValue == null) throw new Exception("panic: GetValue."); + + if (count == 0) return null; + + StringBuilder result = null; + var hasb = false; + + for (var i = 0; i < count; i++) + { + var referencedObj = miGetValue.Invoke(items, new object[] { i }); + + var hasTargetProp = referencedObj.GetType().GetProperty("HasTarget"); + if (hasTargetProp == null) throw new Exception("panic: HasTarget"); + var hasTarget = Convert.ToBoolean(hasTargetProp.GetValue(referencedObj, null)); + if (hasTarget == false) continue; + + if (hasb == false) + { + result = new StringBuilder(); + result.AppendLine("ReferencedItems"); + hasb = true; + } + + //var inUseProp = referencedObj.GetType().GetProperty("InUse"); + //if (inUseProp == null) throw new Exception("panic: InUse."); + //var inUse = Convert.ToBoolean(inUseProp.GetValue(referencedObj, null)); + var inUse = "?"; + + var targetProp = referencedObj.GetType().GetProperty("Target"); + if (targetProp == null) throw new Exception("panic: Target."); + var objTarget = targetProp.GetValue(referencedObj, null); + + result.AppendFormat("\tDiff.Item id=\"{0}\" inUse=\"{1}\" type=\"{2}\" hashCode=\"{3}\"" + Environment.NewLine, + i, inUse, objTarget.GetType(), objTarget.GetHashCode()); + + DbCommand cmd = null; + if (objTarget is DbDataReader) + { + //var rdr = objTarget as DbDataReader; + try + { + cmd = objTarget.GetType().GetProperty("Command", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(objTarget, null) as DbCommand; + } + catch (Exception e) + { + result.AppendFormat("\t\tObjTarget: DbDataReader, Exception: {0}" + Environment.NewLine, e); + } + } + else if (objTarget is DbCommand) + { + cmd = objTarget as DbCommand; + } + if (cmd == null) + { + result.AppendFormat("\t\tObjTarget: {0}" + Environment.NewLine, objTarget.GetType()); + continue; + } + + result.AppendFormat("\t\tCommand type=\"{0}\" hashCode=\"{1}\"" + Environment.NewLine, + cmd.GetType(), cmd.GetHashCode()); + + var context = GetCommandContext(cmd); + result.AppendFormat("\t\t\tContext: {0}" + Environment.NewLine, context); + + var properties = cmd.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); + foreach (var pi in properties) + { + if (pi.PropertyType.IsPrimitive || pi.PropertyType == typeof(string)) + result.AppendFormat("\t\t\t{0}: {1}" + Environment.NewLine, pi.Name, pi.GetValue(cmd, null)); + + if (pi.PropertyType != typeof (DbConnection) || pi.Name != "Connection") continue; + + var con1 = pi.GetValue(cmd, null) as DbConnection; + result.AppendFormat("\t\t\tConnection type=\"{0}\" state=\"{1}\" hashCode=\"{2}\"" + Environment.NewLine, + con1.GetType(), con1.State, con1.GetHashCode()); + + var propertiesCon = con1.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); + foreach (var picon in propertiesCon) + { + if (picon.PropertyType.IsPrimitive || picon.PropertyType == typeof(string)) + result.AppendFormat("\t\t\t\t{0}: {1}" + Environment.NewLine, picon.Name, picon.GetValue(con1, null)); + } + } + } + + return result == null ? null : result.ToString(); + } + } +} +#endif diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs index 4c7ba0b4c6..0b370c9978 100644 --- a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs @@ -1,13 +1,15 @@ using System; using System.Data; using System.Data.Common; -using System.Data.SqlClient; using System.Text; -using MySql.Data.MySqlClient; using StackExchange.Profiling; using Umbraco.Core.Logging; using Umbraco.Core.Persistence.SqlSyntax; +#if DEBUG_DATABASES +using System.Threading; +#endif + namespace Umbraco.Core.Persistence { /// @@ -55,6 +57,12 @@ namespace Umbraco.Core.Persistence /// internal bool EnableSqlTrace { get; set; } +#if DEBUG_DATABASES + private const bool EnableSqlTraceDefault = true; +#else + private const bool EnableSqlTraceDefault = false; +#endif + /// /// Used for testing /// @@ -105,28 +113,28 @@ namespace Umbraco.Core.Persistence : base(connection) { _logger = logger; - EnableSqlTrace = false; + EnableSqlTrace = EnableSqlTraceDefault; } public UmbracoDatabase(string connectionString, string providerName, ILogger logger) : base(connectionString, providerName) { _logger = logger; - EnableSqlTrace = false; + EnableSqlTrace = EnableSqlTraceDefault; } public UmbracoDatabase(string connectionString, DbProviderFactory provider, ILogger logger) : base(connectionString, provider) { _logger = logger; - EnableSqlTrace = false; + EnableSqlTrace = EnableSqlTraceDefault; } public UmbracoDatabase(string connectionStringName, ILogger logger) : base(connectionStringName) { _logger = logger; - EnableSqlTrace = false; + EnableSqlTrace = EnableSqlTraceDefault; } public override IDbConnection OnConnectionOpened(IDbConnection connection) @@ -197,6 +205,12 @@ namespace Umbraco.Core.Persistence _logger.Debug(sb.ToString().Replace("{", "{{").Replace("}", "}}")); } +#if DEBUG_DATABASES + DatabaseDebugHelper.SetCommand(cmd, InstanceSid + " [T" + Thread.CurrentThread.ManagedThreadId + "]"); + var refsobj = DatabaseDebugHelper.GetReferencedObjects(cmd.Connection); + if (refsobj != null) _logger.Debug("Oops!" + Environment.NewLine + refsobj); +#endif + base.OnExecutingCommand(cmd); } @@ -248,7 +262,9 @@ namespace Umbraco.Core.Persistence protected override void Dispose(bool disposing) { base.Dispose(disposing); +#if DEBUG_DATABASES LogHelper.Debug("Dispose (" + InstanceSid + ")."); +#endif if (DatabaseFactory != null) DatabaseFactory.OnDispose(this); } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index e4df147807..11f113ab1e 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -429,6 +429,7 @@ + From f79e63a13b0048408773fa479e6b741650d18566 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 2 Dec 2016 17:45:15 +0100 Subject: [PATCH 142/841] Fix background-thread-safe database usage --- src/Umbraco.Core/DatabaseContext.cs | 5 +- src/Umbraco.Web/Scheduling/LogScrubber.cs | 2 +- .../Scheduling/ScheduledPublishing.cs | 2 +- .../ServerRegistrationEventHandler.cs | 2 +- src/UmbracoExamine/BaseUmbracoIndexer.cs | 57 ++++++++++++------- .../DataServices/UmbracoContentService.cs | 6 +- 6 files changed, 45 insertions(+), 29 deletions(-) diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index 27013d8ecd..1c8b3dabee 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -121,12 +121,9 @@ namespace Umbraco.Core { var factory = _factory as DefaultDatabaseFactory; if (factory == null) throw new NotSupportedException(); + if (DefaultDatabaseFactory.HasAmbientDatabase) { - // has ambient, - // if forcing, detach it and replace it with a new, temp, database - // when the UsingDatabase is disposed, the temp database is disposed and the original one is re-instated - // else do nothing (and nothing will be disposed) return force ? new UsingDatabase(DefaultDatabaseFactory.DetachAmbientDatabase(), factory.CreateDatabase()) : new UsingDatabase(null, null); diff --git a/src/Umbraco.Web/Scheduling/LogScrubber.cs b/src/Umbraco.Web/Scheduling/LogScrubber.cs index 7737101961..794c927f97 100644 --- a/src/Umbraco.Web/Scheduling/LogScrubber.cs +++ b/src/Umbraco.Web/Scheduling/LogScrubber.cs @@ -78,7 +78,7 @@ namespace Umbraco.Web.Scheduling } // running on a background task, requires a safe database (see UsingSafeDatabase doc) - using (ApplicationContext.Current.DatabaseContext.UseSafeDatabase(true)) + using (ApplicationContext.Current.DatabaseContext.UseSafeDatabase()) using (DisposableTimer.DebugDuration("Log scrubbing executing", "Log scrubbing complete")) { Log.CleanLogs(GetLogScrubbingMaximumAge(_settings)); diff --git a/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs b/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs index ba4fdddba5..5288f2630a 100644 --- a/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs +++ b/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs @@ -84,7 +84,7 @@ namespace Umbraco.Web.Scheduling // running on a background task, requires a safe database (see UsingSafeDatabase doc) // (GetAuthenticationHeaderValue uses UserService to load the current user, hence requires a database) - using (ApplicationContext.Current.DatabaseContext.UseSafeDatabase(true)) + using (ApplicationContext.Current.DatabaseContext.UseSafeDatabase()) { //pass custom the authorization header request.Headers.Authorization = AdminTokenAuthorizeAttribute.GetAuthenticationHeaderValue(_appContext); diff --git a/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs b/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs index 15ab8f244b..93d3aa2f87 100644 --- a/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs +++ b/src/Umbraco.Web/Strategies/ServerRegistrationEventHandler.cs @@ -138,7 +138,7 @@ namespace Umbraco.Web.Strategies try { // running on a background task, requires a safe database (see UsingSafeDatabase doc) - using (ApplicationContext.Current.DatabaseContext.UseSafeDatabase(true)) + using (ApplicationContext.Current.DatabaseContext.UseSafeDatabase()) { _svc.TouchServer(_serverAddress, _svc.CurrentServerIdentity, _registrar.Options.StaleServerTimeout); } diff --git a/src/UmbracoExamine/BaseUmbracoIndexer.cs b/src/UmbracoExamine/BaseUmbracoIndexer.cs index 26763bd7cd..88be199c88 100644 --- a/src/UmbracoExamine/BaseUmbracoIndexer.cs +++ b/src/UmbracoExamine/BaseUmbracoIndexer.cs @@ -32,6 +32,12 @@ namespace UmbracoExamine /// public abstract class BaseUmbracoIndexer : LuceneIndexer { + // note + // wrapping all operations that end up calling base.SafelyProcessQueueItems in a safe call + // context because they will fork a thread/task/whatever which should *not* capture our + // call context (and the database it can contain)! ideally we should be able to override + // SafelyProcessQueueItems but that's not possible in the current version of Examine. + #region Constructors /// @@ -263,7 +269,10 @@ namespace UmbracoExamine { if (CanInitialize()) { - base.RebuildIndex(); + using (new SafeCallContext()) + { + base.RebuildIndex(); + } } } @@ -277,7 +286,10 @@ namespace UmbracoExamine { if (CanInitialize()) { - base.IndexAll(type); + using (new SafeCallContext()) + { + base.IndexAll(type); + } } } @@ -288,7 +300,10 @@ namespace UmbracoExamine if (!SupportedTypes.Contains(type)) return; - base.ReIndexNode(node, type); + using (new SafeCallContext()) + { + base.ReIndexNode(node, type); + } } } @@ -302,7 +317,10 @@ namespace UmbracoExamine { if (CanInitialize()) { - base.DeleteFromIndex(nodeId); + using (new SafeCallContext()) + { + base.DeleteFromIndex(nodeId); + } } } @@ -444,31 +462,32 @@ namespace UmbracoExamine } #endregion - [Obsolete("This method is not be used, it will be removed in future versions")] [EditorBrowsable(EditorBrowsableState.Never)] private void AddNodesToIndex(string xPath, string type) { - // Get all the nodes of nodeTypeAlias == nodeTypeAlias - XDocument xDoc = GetXDocument(xPath, type); - if (xDoc != null) + using (new SafeCallContext()) { - var rootNode = xDoc.Root; - if (rootNode != null) + // Get all the nodes of nodeTypeAlias == nodeTypeAlias + XDocument xDoc = GetXDocument(xPath, type); + if (xDoc != null) { - //the result will either be a single doc with an id as the root, or it will - // be multiple docs with a wrapper, we need to check for this - if (rootNode.HasAttributes) + var rootNode = xDoc.Root; + if (rootNode != null) { - AddNodesToIndex(new[] {rootNode}, type); - } - else - { - AddNodesToIndex(rootNode.Elements(), type); + //the result will either be a single doc with an id as the root, or it will + // be multiple docs with a wrapper, we need to check for this + if (rootNode.HasAttributes) + { + AddNodesToIndex(new[] { rootNode }, type); + } + else + { + AddNodesToIndex(rootNode.Elements(), type); + } } } } - } } } diff --git a/src/UmbracoExamine/DataServices/UmbracoContentService.cs b/src/UmbracoExamine/DataServices/UmbracoContentService.cs index df0562f49c..4d265bf127 100644 --- a/src/UmbracoExamine/DataServices/UmbracoContentService.cs +++ b/src/UmbracoExamine/DataServices/UmbracoContentService.cs @@ -57,7 +57,7 @@ namespace UmbracoExamine.DataServices [Obsolete("This should no longer be used, latest content will be indexed by using the IContentService directly")] public XDocument GetLatestContentByXPath(string xpath) { - using (_applicationContext.DatabaseContext.UseSafeDatabase()) // reuse current db if any else use & dispose one + using (_applicationContext.DatabaseContext.UseSafeDatabase()) { var xmlContent = XDocument.Parse(""); var rootContent = _applicationContext.Services.ContentService.GetRootContent(); @@ -79,7 +79,7 @@ namespace UmbracoExamine.DataServices /// public bool IsProtected(int nodeId, string path) { - using (_applicationContext.DatabaseContext.UseSafeDatabase()) // reuse current db if any else use & dispose one + using (_applicationContext.DatabaseContext.UseSafeDatabase()) { return _applicationContext.Services.PublicAccessService.IsProtected(path.EnsureEndsWith("," + nodeId)); } @@ -92,7 +92,7 @@ namespace UmbracoExamine.DataServices public IEnumerable GetAllUserPropertyNames() { - using (_applicationContext.DatabaseContext.UseSafeDatabase()) // reuse current db if any else use & dispose one + using (_applicationContext.DatabaseContext.UseSafeDatabase()) { try { From f91d5b53c1d887180957782c11aca55c0b270458 Mon Sep 17 00:00:00 2001 From: Jeavon Date: Mon, 5 Dec 2016 10:58:09 +0000 Subject: [PATCH 143/841] Added a basic value converter for the tags property editor --- .../ValueConverters/TagsValueConverter.cs | 83 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + 2 files changed, 84 insertions(+) create mode 100644 src/Umbraco.Core/PropertyEditors/ValueConverters/TagsValueConverter.cs diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/TagsValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/TagsValueConverter.cs new file mode 100644 index 0000000000..8ae10325f9 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/TagsValueConverter.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Umbraco.Core.Configuration; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Core.PropertyEditors.ValueConverters +{ + public class TagsValueConverter: PropertyValueConverterBase, IPropertyValueConverterMeta + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.TagsAlias); + } + return false; + } + + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + // if Json storage type deserialzie and return as string array + if (JsonStorageType(propertyType.DataTypeId)) + { + var jArray = JsonConvert.DeserializeObject(source.ToString()); + return jArray.ToObject(); + } + + // Otherwise assume CSV storage type and return as string array + var csvTags = + source.ToString() + .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries) + .ToArray(); + return csvTags; + } + + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + if (source == null) + { + return null; + } + return (string[]) source; + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + return typeof(IEnumerable); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) + { + return PropertyCacheLevel.Content; + } + + /// + /// Discovers if the tags data type is storing its data in a Json format + /// + /// + /// The data type id. + /// + /// + /// The . + /// + private static bool JsonStorageType(int dataTypeId) + { + var dts = ApplicationContext.Current.Services.DataTypeService; + var storageType = + dts.GetPreValuesCollectionByDataTypeId(dataTypeId) + .PreValuesAsDictionary.FirstOrDefault( + x => string.Equals(x.Key, "storageType", StringComparison.InvariantCultureIgnoreCase)).Value; + + if (storageType.Value.InvariantEquals("Json")) + { + return true; + } + + return false; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index e49512325c..92ae9e9348 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -511,6 +511,7 @@ + From f51a086137fc34a619ed45ac19ea220f01a5626e Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 30 Nov 2016 18:18:41 +0100 Subject: [PATCH 144/841] deploy-11 - implement DeployVersionAttribute --- .../Deploy/DeploySupportAttribute.cs | 16 ++++++++++++++++ src/Umbraco.Core/Properties/AssemblyInfo.cs | 9 ++++++--- src/Umbraco.Core/Umbraco.Core.csproj | 1 + 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 src/Umbraco.Core/Deploy/DeploySupportAttribute.cs diff --git a/src/Umbraco.Core/Deploy/DeploySupportAttribute.cs b/src/Umbraco.Core/Deploy/DeploySupportAttribute.cs new file mode 100644 index 0000000000..f7f32b52d5 --- /dev/null +++ b/src/Umbraco.Core/Deploy/DeploySupportAttribute.cs @@ -0,0 +1,16 @@ +using System; +using Semver; + +namespace Umbraco.Core.Deploy +{ + [AttributeUsage(AttributeTargets.Assembly)] + public class DeploySupportAttribute : Attribute + { + public DeploySupportAttribute(string version) + { + Version = version; + } + + public SemVersion Version { get; private set; } + } +} diff --git a/src/Umbraco.Core/Properties/AssemblyInfo.cs b/src/Umbraco.Core/Properties/AssemblyInfo.cs index dbc1ab6c93..204612b3d9 100644 --- a/src/Umbraco.Core/Properties/AssemblyInfo.cs +++ b/src/Umbraco.Core/Properties/AssemblyInfo.cs @@ -3,8 +3,9 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; +using Umbraco.Core.Deploy; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Umbraco.Core")] @@ -12,14 +13,16 @@ using System.Security.Permissions; [assembly: AssemblyConfiguration("")] [assembly: AssemblyProduct("Umbraco CMS")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("130a6b5c-50e7-4df3-a0dd-e9e7eb0b7c5c")] +[assembly: DeploySupport("1.0.0-alpha000")] + [assembly: InternalsVisibleTo("umbraco")] [assembly: InternalsVisibleTo("Umbraco.Tests")] [assembly: InternalsVisibleTo("Umbraco.Extensions")] diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 11f113ab1e..9d27e79e21 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -313,6 +313,7 @@ + From 6c4185dc0157611a0130a0a1c4cf923e53bb2bd8 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 5 Dec 2016 12:13:11 +0100 Subject: [PATCH 145/841] Version 7.6.0-alpha032 --- src/SolutionInfo.cs | 2 +- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index 80382c52aa..f6a14611df 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -12,4 +12,4 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("7.6.0")] -[assembly: AssemblyInformationalVersion("7.6.0-alpha031")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("7.6.0-alpha032")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index d534ba314a..9d2bf7ddae 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "alpha031"; } } + public static string CurrentComment { get { return "alpha032"; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx From a24acdb8cec9892366e762a4589a00ebb0d651d5 Mon Sep 17 00:00:00 2001 From: Jeavon Date: Mon, 5 Dec 2016 12:13:47 +0000 Subject: [PATCH 146/841] Added value converter for the slider property editor and and Range class to be returned when range mode is enabled --- src/Umbraco.Core/Models/Range.cs | 52 ++++++++++++ .../ValueConverters/SliderValueConverter.cs | 84 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 2 + 3 files changed, 138 insertions(+) create mode 100644 src/Umbraco.Core/Models/Range.cs create mode 100644 src/Umbraco.Core/PropertyEditors/ValueConverters/SliderValueConverter.cs diff --git a/src/Umbraco.Core/Models/Range.cs b/src/Umbraco.Core/Models/Range.cs new file mode 100644 index 0000000000..3095d6342d --- /dev/null +++ b/src/Umbraco.Core/Models/Range.cs @@ -0,0 +1,52 @@ +using System; +namespace Umbraco.Core.Models +{ + // The Range class. Adapted from http://stackoverflow.com/questions/5343006/is-there-a-c-sharp-type-for-representing-an-integer-range + /// Generic parameter. + public class Range where T : IComparable + { + /// Minimum value of the range. + public T Minimum { get; set; } + + /// Maximum value of the range. + public T Maximum { get; set; } + + /// Presents the Range in readable format. + /// String representation of the Range + public override string ToString() + { + return string.Format("{0},{1}", this.Minimum, this.Maximum); + } + + /// Determines if the range is valid. + /// True if range is valid, else false + public bool IsValid() + { + return this.Minimum.CompareTo(this.Maximum) <= 0; + } + + /// Determines if the provided value is inside the range. + /// The value to test + /// True if the value is inside Range, else false + public bool ContainsValue(T value) + { + return (this.Minimum.CompareTo(value) <= 0) && (value.CompareTo(this.Maximum) <= 0); + } + + /// Determines if this Range is inside the bounds of another range. + /// The parent range to test on + /// True if range is inclusive, else false + public bool IsInsideRange(Range range) + { + return this.IsValid() && range.IsValid() && range.ContainsValue(this.Minimum) && range.ContainsValue(this.Maximum); + } + + /// Determines if another range is inside the bounds of this range. + /// The child range to test + /// True if range is inside, else false + public bool ContainsRange(Range range) + { + return this.IsValid() && range.IsValid() && this.ContainsValue(range.Minimum) && this.ContainsValue(range.Maximum); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/SliderValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/SliderValueConverter.cs new file mode 100644 index 0000000000..1bb246817f --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/SliderValueConverter.cs @@ -0,0 +1,84 @@ +using System; +using System.Linq; +using Umbraco.Core.Configuration; +using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Core.PropertyEditors.ValueConverters +{ + public class SliderValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta + { + public override bool IsConverter(PublishedPropertyType propertyType) + { + if (UmbracoConfig.For.UmbracoSettings().Content.EnablePropertyValueConverters) + { + return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.SliderAlias); + } + return false; + } + + public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) + { + if (source == null) + { + return null; + } + + if (IsRangeDataType(propertyType.DataTypeId)) + { + var rangeRawValues = source.ToString().Split(','); + var minimumAttempt = rangeRawValues[0].TryConvertTo(); + var maximumAttempt = rangeRawValues[1].TryConvertTo(); + + if (minimumAttempt.Success && maximumAttempt.Success) + { + return new Range() { Maximum = maximumAttempt.Result, Minimum = minimumAttempt.Result }; + } + } + + var valueAttempt = source.ToString().TryConvertTo(); + if (valueAttempt.Success) + { + return valueAttempt.Result; + } + + // Something failed in the conversion of the strings to decimals + return null; + + } + + public Type GetPropertyValueType(PublishedPropertyType propertyType) + { + if (IsRangeDataType(propertyType.DataTypeId)) + { + return typeof(Range); + } + return typeof(decimal); + } + + public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue) + { + return PropertyCacheLevel.Content; + } + + /// + /// Discovers if the slider is set to range mode. + /// + /// + /// The data type id. + /// + /// + /// The . + /// + private bool IsRangeDataType(int dataTypeId) + { + var dts = ApplicationContext.Current.Services.DataTypeService; + var enableRange = + dts.GetPreValuesCollectionByDataTypeId(dataTypeId) + .PreValuesAsDictionary.FirstOrDefault( + x => string.Equals(x.Key, "enableRange", StringComparison.InvariantCultureIgnoreCase)).Value; + + return enableRange != null && enableRange.Value.TryConvertTo().Result; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 92ae9e9348..0313a2a206 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -393,6 +393,7 @@ + @@ -511,6 +512,7 @@ + From 3774d4fc628580d908db89baf2e455af34581e2e Mon Sep 17 00:00:00 2001 From: Jeavon Date: Mon, 5 Dec 2016 12:16:43 +0000 Subject: [PATCH 147/841] Adding comments to the Slider, Tags & Multiple Media picker values converters about the need to cache the prevalues --- .../PropertyEditors/ValueConverters/SliderValueConverter.cs | 1 + .../PropertyEditors/ValueConverters/TagsValueConverter.cs | 3 ++- .../ValueConverters/MultipleMediaPickerPropertyConverter.cs | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/SliderValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/SliderValueConverter.cs index 1bb246817f..1e7446a101 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/SliderValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/SliderValueConverter.cs @@ -72,6 +72,7 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters /// private bool IsRangeDataType(int dataTypeId) { + // ** This must be cached (U4-8862) ** var dts = ApplicationContext.Current.Services.DataTypeService; var enableRange = dts.GetPreValuesCollectionByDataTypeId(dataTypeId) diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/TagsValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/TagsValueConverter.cs index 8ae10325f9..4984bca7c9 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/TagsValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/TagsValueConverter.cs @@ -8,7 +8,7 @@ using Umbraco.Core.Models.PublishedContent; namespace Umbraco.Core.PropertyEditors.ValueConverters { - public class TagsValueConverter: PropertyValueConverterBase, IPropertyValueConverterMeta + public class TagsValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta { public override bool IsConverter(PublishedPropertyType propertyType) { @@ -66,6 +66,7 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters /// private static bool JsonStorageType(int dataTypeId) { + // ** This must be cached (U4-8862) ** var dts = ApplicationContext.Current.Services.DataTypeService; var storageType = dts.GetPreValuesCollectionByDataTypeId(dataTypeId) diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs index 2b9ee988bb..d9832e854d 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MultipleMediaPickerPropertyConverter.cs @@ -206,6 +206,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters /// public bool IsMultipleDataType(int dataTypeId) { + // ** This must be cached (U4-8862) ** var dts = ApplicationContext.Current.Services.DataTypeService; var multiPickerPreValue = dts.GetPreValuesCollectionByDataTypeId(dataTypeId) From b4ef37a61aca4b2d5371bf889a61d8e2c1755389 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 5 Dec 2016 16:39:20 +0100 Subject: [PATCH 148/841] More database fixing --- src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs | 7 +++++-- src/UmbracoExamine/BaseUmbracoIndexer.cs | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs index 140540ed4c..fc981b0280 100644 --- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs @@ -300,9 +300,12 @@ namespace Umbraco.Core.Persistence var database = o as UmbracoDatabase; if (o != null && database == null) throw new ArgumentException("Not an UmbracoDatabase.", "o"); + var ambient = DetachAmbientDatabase(); + if (ambient != null) ambient.Dispose(); + if (HttpContext.Current == null) { - if (NonContextValue != null) throw new InvalidOperationException(); + //if (NonContextValue != null) throw new InvalidOperationException(); if (database == null) return; NonContextValue = database; @@ -310,7 +313,7 @@ namespace Umbraco.Core.Persistence } else { - if (HttpContext.Current.Items[typeof (DefaultDatabaseFactory)] != null) throw new InvalidOperationException(); + //if (HttpContext.Current.Items[typeof (DefaultDatabaseFactory)] != null) throw new InvalidOperationException(); if (database == null) return; HttpContext.Current.Items[typeof (DefaultDatabaseFactory)] = database; diff --git a/src/UmbracoExamine/BaseUmbracoIndexer.cs b/src/UmbracoExamine/BaseUmbracoIndexer.cs index 88be199c88..ebd0db8b1c 100644 --- a/src/UmbracoExamine/BaseUmbracoIndexer.cs +++ b/src/UmbracoExamine/BaseUmbracoIndexer.cs @@ -269,10 +269,12 @@ namespace UmbracoExamine { if (CanInitialize()) { + // remove the db from lcc using (new SafeCallContext()) + //using (ApplicationContext.Current.DatabaseContext.UseSafeDatabase()) { base.RebuildIndex(); - } + } // will try to re-instate the original DB *but* if a DB has been created in the meantime what shall we do? } } From ba27c7e8e8cf92eb3f2524719ee2dbff47d9ecad Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 6 Dec 2016 15:46:17 +0100 Subject: [PATCH 149/841] U4-9249 - fix member type standard properties --- .../Persistence/Factories/MemberTypeReadOnlyFactory.cs | 9 ++++++++- .../Persistence/Repositories/MemberTypeRepository.cs | 10 ++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Factories/MemberTypeReadOnlyFactory.cs b/src/Umbraco.Core/Persistence/Factories/MemberTypeReadOnlyFactory.cs index b4d5d2e566..ba7a47165b 100644 --- a/src/Umbraco.Core/Persistence/Factories/MemberTypeReadOnlyFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/MemberTypeReadOnlyFactory.cs @@ -9,9 +9,10 @@ namespace Umbraco.Core.Persistence.Factories { internal class MemberTypeReadOnlyFactory { - public IMemberType BuildEntity(MemberTypeReadOnlyDto dto) + public IMemberType BuildEntity(MemberTypeReadOnlyDto dto, out bool needsSaving) { var standardPropertyTypes = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); + needsSaving = false; var memberType = new MemberType(dto.ParentId); @@ -47,6 +48,12 @@ namespace Umbraco.Core.Persistence.Factories { if (dto.PropertyTypes.Any(x => x.Alias.Equals(standardPropertyType.Key))) continue; + // beware! + // means that we can return a memberType "from database" that has some property types + // that do *not* come from the database and therefore are incomplete eg have no key, + // no id, no dataTypeDefinitionId - ouch! - better notify caller of the situation + needsSaving = true; + //Add the standard PropertyType to the current list propertyTypes.Add(standardPropertyType.Value); diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs index d06399a85b..7d5defe8c9 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs @@ -300,13 +300,19 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// - private static IEnumerable BuildFromDtos(List dtos) + private IEnumerable BuildFromDtos(List dtos) { if (dtos == null || dtos.Any() == false) return Enumerable.Empty(); var factory = new MemberTypeReadOnlyFactory(); - return dtos.Select(factory.BuildEntity); + return dtos.Select(x => + { + bool needsSaving; + var memberType = factory.BuildEntity(x, out needsSaving); + if (needsSaving) PersistUpdatedItem(memberType); + return memberType; + }).ToList(); } /// From b9b7c9f96575fff6766b0edc4c01f010609d9fc9 Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 13 Dec 2016 10:35:16 +0100 Subject: [PATCH 150/841] More database fixing (sqlCE) --- src/Umbraco.Core/Persistence/DatabaseDebugHelper.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Core/Persistence/DatabaseDebugHelper.cs b/src/Umbraco.Core/Persistence/DatabaseDebugHelper.cs index 06512c2d68..4cb8327f5b 100644 --- a/src/Umbraco.Core/Persistence/DatabaseDebugHelper.cs +++ b/src/Umbraco.Core/Persistence/DatabaseDebugHelper.cs @@ -42,6 +42,8 @@ namespace Umbraco.Core.Persistence { var prof = con as StackExchange.Profiling.Data.ProfiledDbConnection; if (prof != null) con = prof.InnerConnection; + var ceCon = con as System.Data.SqlServerCe.SqlCeConnection; + if (ceCon != null) return null; // "NotSupported: SqlCE"; var dbCon = con as DbConnection; return dbCon == null ? "NotSupported: " + con.GetType() From e97e8caab8a84411f6ab50dcb19c72365566cda3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 13 Dec 2016 10:57:19 +0100 Subject: [PATCH 151/841] add umbDateTimePicker component --- .../components/umbdatetimepicker.directive.js | 143 ++++++++++++++++++ .../components/umb-date-time-picker.html | 6 + 2 files changed, 149 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/components/umb-date-time-picker.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js new file mode 100644 index 0000000000..2954e1791c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js @@ -0,0 +1,143 @@ +/** +@ngdoc directive +@name umbraco.directives.directive:umbDateTimePicker +@restrict E +@scope + +@description +Use this directive to render a date time picker + +

    Markup example

    +
    +	
    + + + + +
    +
    + +

    Controller example

    +
    +	(function () {
    +		"use strict";
    +
    +		function Controller() {
    +
    +            var vm = this;
    +
    +            vm.date = "";
    +
    +            vm.config = {
    +                pickDate: true,
    +                pickTime: true,
    +                useSeconds: true,
    +                format: "YYYY-MM-DD HH:mm:ss",
    +                icons: {
    +                    time: "icon-time",
    +                    date: "icon-calendar",
    +                    up: "icon-chevron-up",
    +                    down: "icon-chevron-down"
    +                }
    +            };
    +
    +            vm.datePickerChange = datePickerChange;
    +            vm.datePickerError = datePickerError;
    +
    +            function datePickerChange(event) {
    +                // handle change
    +            }
    +
    +            function datePickerError(event) {
    +                // handle error
    +            }
    +
    +        }
    +
    +		angular.module("umbraco").controller("My.Controller", Controller);
    +
    +	})();
    +
    + +@param {object} options (binding): Config object for the date picker. +@param {string} ngModel (binding): Date value. +@param {callback} onChange (callback): Change callback. +@param {callback} onError (callback): Error callback. +**/ + +(function () { + 'use strict'; + + function DateTimePickerDirective(assetsService) { + + function link(scope, element, attrs, ctrl) { + + function onInit() { + // load css file for the date picker + assetsService.loadCss('lib/datetimepicker/bootstrap-datetimepicker.min.css').then(function () { + + }); + + // load the js file for the date picker + assetsService.loadJs('lib/datetimepicker/bootstrap-datetimepicker.js').then(function () { + // init date picker + initDatePicker(); + }); + } + + function onChange(event) { + if (scope.onChange && event.date && event.date.isValid()) { + scope.$apply(function(){ + // Update ngModel + scope.ngModel = event.date.format(scope.options.format); + // callback + scope.onChange({event: event}); + }); + } + } + + function onError(event) { + if (scope.onError) { + scope.$apply(function(){ + // callback + scope.onError({event:event}); + }); + } + } + + function initDatePicker() { + // Open the datepicker and add a changeDate eventlistener + element + .datetimepicker(angular.extend({ useCurrent: true }, scope.options)) + .on("dp.change", onChange) + .on("dp.error", onError); + } + + onInit(); + + } + + var directive = { + restrict: 'E', + replace: true, + templateUrl: 'views/components/umb-date-time-picker.html', + scope: { + ngModel: "=", + options: "=", + onChange: "&", + onError: "&" + }, + link: link + }; + + return directive; + + } + + angular.module('umbraco.directives').directive('umbDateTimePicker', DateTimePickerDirective); + +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-date-time-picker.html b/src/Umbraco.Web.UI.Client/src/views/components/umb-date-time-picker.html new file mode 100644 index 0000000000..aaf8cfe62d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-date-time-picker.html @@ -0,0 +1,6 @@ +
    + + + + +
    \ No newline at end of file From 4863052a084a2bda24ab72161c97785683fcd37a Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 13 Dec 2016 10:58:19 +0100 Subject: [PATCH 152/841] Revert "deploy-11 - implement DeployVersionAttribute" This reverts commit f51a086137fc34a619ed45ac19ea220f01a5626e. --- .../Deploy/DeploySupportAttribute.cs | 16 ---------------- src/Umbraco.Core/Properties/AssemblyInfo.cs | 9 +++------ src/Umbraco.Core/Umbraco.Core.csproj | 1 - 3 files changed, 3 insertions(+), 23 deletions(-) delete mode 100644 src/Umbraco.Core/Deploy/DeploySupportAttribute.cs diff --git a/src/Umbraco.Core/Deploy/DeploySupportAttribute.cs b/src/Umbraco.Core/Deploy/DeploySupportAttribute.cs deleted file mode 100644 index f7f32b52d5..0000000000 --- a/src/Umbraco.Core/Deploy/DeploySupportAttribute.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using Semver; - -namespace Umbraco.Core.Deploy -{ - [AttributeUsage(AttributeTargets.Assembly)] - public class DeploySupportAttribute : Attribute - { - public DeploySupportAttribute(string version) - { - Version = version; - } - - public SemVersion Version { get; private set; } - } -} diff --git a/src/Umbraco.Core/Properties/AssemblyInfo.cs b/src/Umbraco.Core/Properties/AssemblyInfo.cs index 204612b3d9..dbc1ab6c93 100644 --- a/src/Umbraco.Core/Properties/AssemblyInfo.cs +++ b/src/Umbraco.Core/Properties/AssemblyInfo.cs @@ -3,9 +3,8 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; -using Umbraco.Core.Deploy; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Umbraco.Core")] @@ -13,16 +12,14 @@ using Umbraco.Core.Deploy; [assembly: AssemblyConfiguration("")] [assembly: AssemblyProduct("Umbraco CMS")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("130a6b5c-50e7-4df3-a0dd-e9e7eb0b7c5c")] -[assembly: DeploySupport("1.0.0-alpha000")] - [assembly: InternalsVisibleTo("umbraco")] [assembly: InternalsVisibleTo("Umbraco.Tests")] [assembly: InternalsVisibleTo("Umbraco.Extensions")] diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 9d27e79e21..11f113ab1e 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -313,7 +313,6 @@ - From 7cbfe01c0bb6b9422eb5c5dd9139c0e268382d1e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 13 Dec 2016 10:58:24 +0100 Subject: [PATCH 153/841] use umbDateTimePicker component in query builder --- .../src/less/components/umb-querybuilder.less | 4 +++ .../querybuilder/querybuilder.controller.js | 27 +++++++++++++++---- .../overlays/querybuilder/querybuilder.html | 13 +++++++-- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less index fb6279608e..7c983760e1 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-querybuilder.less @@ -23,4 +23,8 @@ .umb-querybuilder .row > div { padding: 20px 0; border-bottom: 1px solid @grayLighter; +} + +.umb-querybuilder .datepicker input { + width: 90px; } \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js index bc5bc10e13..5166de586e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js @@ -1,7 +1,7 @@ (function () { "use strict"; - function QueryBuilderOverlayController($scope, templateQueryResource) { + function QueryBuilderOverlayController($scope, $element, templateQueryResource, assetsService, angularHelper) { var vm = this; @@ -9,6 +9,18 @@ vm.contentTypes = []; vm.conditions = []; + vm.datePickerConfig = { + pickDate: true, + pickTime: false, + format: "YYYY-MM-DD", + icons: { + time: "icon-time", + date: "icon-calendar", + up: "icon-chevron-up", + down: "icon-chevron-down" + } + }; + vm.query = { contentType: { name: "Everything" @@ -41,6 +53,7 @@ vm.setFilterProperty = setFilterProperty; vm.setFilterTerm = setFilterTerm; vm.changeConstraintValue = changeConstraintValue; + vm.datePickerChange = datePickerChange; function onInit() { @@ -58,7 +71,7 @@ .then(function (conditions) { vm.conditions = conditions; }); - + throttledFunc(); } @@ -134,12 +147,10 @@ function setFilterProperty(filter, property) { filter.property = property; - throttledFunc(); } function setFilterTerm(filter, term) { filter.term = term; - throttledFunc(); } function changeConstraintValue() { @@ -154,7 +165,13 @@ }); }, 200); - + + function datePickerChange(event) { + templateQueryResource.postTemplateQuery(vm.query) + .then(function (response) { + $scope.model.result = response; + }); + } onInit(); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html index 40fb909390..997855cd3c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.html @@ -66,8 +66,17 @@
    - - + + + + + + + + From df103580883890faddf5b9ff44604ee1b5ff1ecb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 13 Dec 2016 11:53:41 +0100 Subject: [PATCH 154/841] Fix weird looking save and publish button group in content section --- .../src/less/components/buttons/umb-button-group.less | 2 +- src/Umbraco.Web.UI.Client/src/views/templates/edit.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less index 119077d52b..4d5fd90fad 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less @@ -10,7 +10,7 @@ } // hack for umb-era-button -.umb-button-group { +.umb-era-button-group { display: flex; diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 83f3d3954d..d2dd2fdd0e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -32,7 +32,7 @@
    -