From bd5ad5ca0147c56eb0aded946f0295785d74a4d6 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 18 Jun 2017 12:17:54 +0100 Subject: [PATCH 01/40] Add .gitignore and initialize repository --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..8e47e6a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.old \ No newline at end of file From f185b9893b40f3706ba1ce2b5a7b2ec02c538c30 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 18 Jun 2017 12:21:05 +0100 Subject: [PATCH 02/40] add license --- LICENSE.md | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..9c8f3ea0 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file From 1cea7a383d7c9a052683545b3ee977a9fc33f502 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 18 Jun 2017 13:57:38 +0100 Subject: [PATCH 03/40] aadd first files based on caddy-filemanager Former-commit-id: 20baeeb41a9555cefc3b31b495e24e907736c443 --- .editorconfig | 18 +++ .gitignore | 2 +- assets/assets.go | 33 ++++ assets/binary.go.REMOVED.git-id | 1 + cmd/filemanager/main.go | 62 +++++++ file.go | 161 +++++++++++++++++++ filemanager.go | 77 +++++++++ frontmatter/frontmatter.go | 276 ++++++++++++++++++++++++++++++++ frontmatter/runes.go | 58 +++++++ frontmatter/runes_test.go | 131 +++++++++++++++ http/checksum.go | 53 ++++++ http/command.go | 136 ++++++++++++++++ http/download.go | 96 +++++++++++ http/editor.go | 121 ++++++++++++++ http/http.go | 173 ++++++++++++++++++++ http/listing.go | 147 +++++++++++++++++ http/put.go | 144 +++++++++++++++++ http/search.go | 118 ++++++++++++++ http/single.go | 54 +++++++ listing.go | 184 +++++++++++++++++++++ page/error.go | 65 ++++++++ page/page.go | 171 ++++++++++++++++++++ utils/errors.go | 24 +++ utils/types.go | 13 ++ utils/types_test.go | 49 ++++++ utils/variables.go | 47 ++++++ utils/variables_test.go | 41 +++++ wrapper/response_writer.go | 29 ++++ 28 files changed, 2483 insertions(+), 1 deletion(-) create mode 100644 .editorconfig create mode 100644 assets/assets.go create mode 100644 assets/binary.go.REMOVED.git-id create mode 100644 cmd/filemanager/main.go create mode 100644 file.go create mode 100644 filemanager.go create mode 100644 frontmatter/frontmatter.go create mode 100644 frontmatter/runes.go create mode 100644 frontmatter/runes_test.go create mode 100644 http/checksum.go create mode 100644 http/command.go create mode 100644 http/download.go create mode 100644 http/editor.go create mode 100644 http/http.go create mode 100644 http/listing.go create mode 100644 http/put.go create mode 100644 http/search.go create mode 100644 http/single.go create mode 100644 listing.go create mode 100644 page/error.go create mode 100644 page/page.go create mode 100644 utils/errors.go create mode 100644 utils/types.go create mode 100644 utils/types_test.go create mode 100644 utils/variables.go create mode 100644 utils/variables_test.go create mode 100644 wrapper/response_writer.go diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..63339e38 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +# 4 space indentation +[*.go] +indent_style = tab +indent_size = 4 diff --git a/.gitignore b/.gitignore index 8e47e6a4..e976ef51 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -.old \ No newline at end of file +_embed \ No newline at end of file diff --git a/assets/assets.go b/assets/assets.go new file mode 100644 index 00000000..ca2e8b73 --- /dev/null +++ b/assets/assets.go @@ -0,0 +1,33 @@ +package assets + +import ( + "mime" + "net/http" + "path/filepath" + "strings" + + "github.com/hacdias/filemanager" +) + +// BaseURL is the url of the assets +const BaseURL = "/_filemanagerinternal" + +// Serve provides the needed assets for the front-end +func Serve(w http.ResponseWriter, r *http.Request, c *filemanager.Config) (int, error) { + // gets the filename to be used with Assets function + filename := strings.Replace(r.URL.Path, c.BaseURL+BaseURL, "public", 1) + file, err := Asset(filename) + if err != nil { + return http.StatusNotFound, nil + } + + // Get the file extension and its mimetype + extension := filepath.Ext(filename) + mediatype := mime.TypeByExtension(extension) + + // Write the header with the Content-Type and write the file + // content to the buffer + w.Header().Set("Content-Type", mediatype) + w.Write(file) + return 200, nil +} diff --git a/assets/binary.go.REMOVED.git-id b/assets/binary.go.REMOVED.git-id new file mode 100644 index 00000000..8fc30cca --- /dev/null +++ b/assets/binary.go.REMOVED.git-id @@ -0,0 +1 @@ +4c30378a214b5b33410a74961df51cbc21bd6122 \ No newline at end of file diff --git a/cmd/filemanager/main.go b/cmd/filemanager/main.go new file mode 100644 index 00000000..4a0b536e --- /dev/null +++ b/cmd/filemanager/main.go @@ -0,0 +1,62 @@ +package main + +import ( + "net/http" + "regexp" + "strings" + + "golang.org/x/net/webdav" + + "github.com/hacdias/filemanager" + handlers "github.com/hacdias/filemanager/http" +) + +var cfg *filemanager.Config + +func handler(w http.ResponseWriter, r *http.Request) { + handlers.ServeHTTP(w, r, cfg) +} + +func main() { + cfg = &filemanager.Config{User: &filemanager.User{}} + cfg.Scope = "." + cfg.FileSystem = webdav.Dir(cfg.Scope) + cfg.BaseURL = "/" + cfg.HugoEnabled = false + cfg.Users = map[string]*filemanager.User{} + cfg.AllowCommands = true + cfg.AllowEdit = true + cfg.AllowNew = true + cfg.Commands = []string{"git", "svn", "hg"} + cfg.BeforeSave = func(r *http.Request, c *filemanager.Config, u *filemanager.User) error { return nil } + cfg.AfterSave = func(r *http.Request, c *filemanager.Config, u *filemanager.User) error { return nil } + cfg.Rules = []*filemanager.Rule{{ + Regex: true, + Allow: false, + Regexp: regexp.MustCompile("\\/\\..+"), + }} + + cfg.BaseURL = strings.TrimPrefix(cfg.BaseURL, "/") + cfg.BaseURL = strings.TrimSuffix(cfg.BaseURL, "/") + cfg.BaseURL = "/" + cfg.BaseURL + cfg.WebDavURL = "" + + if cfg.BaseURL == "/" { + cfg.BaseURL = "" + } + + if cfg.WebDavURL == "" { + cfg.WebDavURL = "webdav" + } + + cfg.PrefixURL = "" + cfg.WebDavURL = cfg.BaseURL + "/" + strings.TrimPrefix(cfg.WebDavURL, "/") + cfg.Handler = &webdav.Handler{ + Prefix: cfg.WebDavURL, + FileSystem: cfg.FileSystem, + LockSystem: webdav.NewMemLS(), + } + + http.HandleFunc("/", handler) + http.ListenAndServe(":8080", nil) +} \ No newline at end of file diff --git a/file.go b/file.go new file mode 100644 index 00000000..009b8449 --- /dev/null +++ b/file.go @@ -0,0 +1,161 @@ +package filemanager + +import ( + "io/ioutil" + "mime" + "net/http" + "net/url" + "os" + "path/filepath" + "strings" + "time" + + humanize "github.com/dustin/go-humanize" +) + +// FileInfo contains the information about a particular file or directory. +type FileInfo struct { + Name string + Size int64 + URL string + Extension string + ModTime time.Time + Mode os.FileMode + IsDir bool + Path string // Relative path to Caddyfile + VirtualPath string // Relative path to u.FileSystem + Mimetype string + Content []byte + Type string + UserAllowed bool // Indicates if the user has enough permissions +} + +// GetInfo retrieves the file information and the error, if there is any. +func GetInfo(url *url.URL, c *Config, u *User) (*FileInfo, error) { + var err error + + i := &FileInfo{URL: c.PrefixURL + url.Path} + i.VirtualPath = strings.Replace(url.Path, c.BaseURL, "", 1) + i.VirtualPath = strings.TrimPrefix(i.VirtualPath, "/") + i.VirtualPath = "/" + i.VirtualPath + + i.Path = u.Scope + i.VirtualPath + i.Path = filepath.Clean(i.Path) + + info, err := os.Stat(i.Path) + if err != nil { + return i, err + } + + i.Name = info.Name() + i.ModTime = info.ModTime() + i.Mode = info.Mode() + i.IsDir = info.IsDir() + i.Size = info.Size() + i.Extension = filepath.Ext(i.Name) + return i, nil +} + +var textExtensions = [...]string{ + ".md", ".markdown", ".mdown", ".mmark", + ".asciidoc", ".adoc", ".ad", + ".rst", + ".json", ".toml", ".yaml", ".csv", ".xml", ".rss", ".conf", ".ini", + ".tex", ".sty", + ".css", ".sass", ".scss", + ".js", + ".html", + ".txt", ".rtf", + ".sh", ".bash", ".ps1", ".bat", ".cmd", + ".php", ".pl", ".py", + "Caddyfile", + ".c", ".cc", ".h", ".hh", ".cpp", ".hpp", ".f90", + ".f", ".bas", ".d", ".ada", ".nim", ".cr", ".java", ".cs", ".vala", ".vapi", +} + +// RetrieveFileType obtains the mimetype and a simplified internal Type +// using the first 512 bytes from the file. +func (i *FileInfo) RetrieveFileType() error { + i.Mimetype = mime.TypeByExtension(i.Extension) + + if i.Mimetype == "" { + err := i.Read() + if err != nil { + return err + } + + i.Mimetype = http.DetectContentType(i.Content) + } + + if strings.HasPrefix(i.Mimetype, "video") { + i.Type = "video" + return nil + } + + if strings.HasPrefix(i.Mimetype, "audio") { + i.Type = "audio" + return nil + } + + if strings.HasPrefix(i.Mimetype, "image") { + i.Type = "image" + return nil + } + + if strings.HasPrefix(i.Mimetype, "text") { + i.Type = "text" + return nil + } + + if strings.HasPrefix(i.Mimetype, "application/javascript") { + i.Type = "text" + return nil + } + + // If the type isn't text (and is blob for example), it will check some + // common types that are mistaken not to be text. + for _, extension := range textExtensions { + if strings.HasSuffix(i.Name, extension) { + i.Type = "text" + return nil + } + } + + i.Type = "blob" + return nil +} + +// Reads the file. +func (i *FileInfo) Read() error { + if len(i.Content) != 0 { + return nil + } + + var err error + i.Content, err = ioutil.ReadFile(i.Path) + if err != nil { + return err + } + return nil +} + +// StringifyContent returns the string version of Raw +func (i FileInfo) StringifyContent() string { + return string(i.Content) +} + +// HumanSize returns the size of the file as a human-readable string +// in IEC format (i.e. power of 2 or base 1024). +func (i FileInfo) HumanSize() string { + return humanize.IBytes(uint64(i.Size)) +} + +// HumanModTime returns the modified time of the file as a human-readable string. +func (i FileInfo) HumanModTime(format string) string { + return i.ModTime.Format(format) +} + +// CanBeEdited checks if the extension of a file is supported by the editor +func (i FileInfo) CanBeEdited() bool { + return i.Type == "text" +} diff --git a/filemanager.go b/filemanager.go new file mode 100644 index 00000000..783eadf7 --- /dev/null +++ b/filemanager.go @@ -0,0 +1,77 @@ +package filemanager + +import ( + "net/http" + "regexp" + "strings" + + "golang.org/x/net/webdav" +) + +// CommandFunc ... +type CommandFunc func(r *http.Request, c *Config, u *User) error + +// Config is a configuration for browsing in a particular path. +type Config struct { + *User + PrefixURL string + BaseURL string + WebDavURL string + HugoEnabled bool // Enables the Hugo plugin for File Manager + Users map[string]*User + BeforeSave CommandFunc + AfterSave CommandFunc +} + +// AbsoluteURL ... +func (c Config) AbsoluteURL() string { + return c.PrefixURL + c.BaseURL +} + +// AbsoluteWebdavURL ... +func (c Config) AbsoluteWebdavURL() string { + return c.PrefixURL + c.WebDavURL +} + +// Rule is a dissalow/allow rule +type Rule struct { + Regex bool + Allow bool + Path string + Regexp *regexp.Regexp +} + +// User contains the configuration for each user +type User struct { + Scope string `json:"-"` // Path the user have access + FileSystem webdav.FileSystem `json:"-"` // The virtual file system the user have access + Handler *webdav.Handler `json:"-"` // The WebDav HTTP Handler + StyleSheet string `json:"-"` // Costum stylesheet + AllowNew bool // Can create files and folders + AllowEdit bool // Can edit/rename files + AllowCommands bool // Can execute commands + Commands []string // Available Commands + Rules []*Rule `json:"-"` // Access rules +} + +// Allowed checks if the user has permission to access a directory/file +func (u User) Allowed(url string) bool { + var rule *Rule + i := len(u.Rules) - 1 + + for i >= 0 { + rule = u.Rules[i] + + if rule.Regex { + if rule.Regexp.MatchString(url) { + return rule.Allow + } + } else if strings.HasPrefix(url, rule.Path) { + return rule.Allow + } + + i-- + } + + return true +} diff --git a/frontmatter/frontmatter.go b/frontmatter/frontmatter.go new file mode 100644 index 00000000..e9e948bf --- /dev/null +++ b/frontmatter/frontmatter.go @@ -0,0 +1,276 @@ +package frontmatter + +import ( + "bytes" + "encoding/json" + "errors" + "log" + "reflect" + "sort" + "strconv" + "strings" + + "gopkg.in/yaml.v2" + + "github.com/BurntSushi/toml" + "github.com/hacdias/filemanager/utils" + + "github.com/spf13/cast" +) + +const ( + mainName = "#MAIN#" + objectType = "object" + arrayType = "array" +) + +var mainTitle = "" + +// Pretty creates a new FrontMatter object +func Pretty(content []byte) (*Content, string, error) { + data, err := Unmarshal(content) + + if err != nil { + return &Content{}, "", err + } + + kind := reflect.ValueOf(data).Kind() + + if kind == reflect.Invalid { + return &Content{}, "", nil + } + + object := new(Block) + object.Type = objectType + object.Name = mainName + + if kind == reflect.Map { + object.Type = objectType + } else if kind == reflect.Slice || kind == reflect.Array { + object.Type = arrayType + } + + return rawToPretty(data, object), mainTitle, nil +} + +// Unmarshal returns the data of the frontmatter +func Unmarshal(content []byte) (interface{}, error) { + mark := rune(content[0]) + var data interface{} + + switch mark { + case '-': + // If it's YAML + if err := yaml.Unmarshal(content, &data); err != nil { + return nil, err + } + case '+': + // If it's TOML + content = bytes.Replace(content, []byte("+"), []byte(""), -1) + if _, err := toml.Decode(string(content), &data); err != nil { + return nil, err + } + case '{', '[': + // If it's JSON + if err := json.Unmarshal(content, &data); err != nil { + return nil, err + } + default: + return nil, errors.New("Invalid frontmatter type") + } + + return data, nil +} + +// Marshal encodes the interface in a specific format +func Marshal(data interface{}, mark rune) ([]byte, error) { + b := new(bytes.Buffer) + + switch mark { + case '+': + enc := toml.NewEncoder(b) + err := enc.Encode(data) + if err != nil { + return nil, err + } + return b.Bytes(), nil + case '{': + by, err := json.MarshalIndent(data, "", " ") + if err != nil { + return nil, err + } + b.Write(by) + _, err = b.Write([]byte("\n")) + if err != nil { + return nil, err + } + return b.Bytes(), nil + case '-': + by, err := yaml.Marshal(data) + if err != nil { + return nil, err + } + b.Write(by) + _, err = b.Write([]byte("...")) + if err != nil { + return nil, err + } + return b.Bytes(), nil + default: + return nil, errors.New("Unsupported Format provided") + } +} + +// Content is the block content +type Content struct { + Other interface{} + Fields []*Block + Arrays []*Block + Objects []*Block +} + +// Block is a block +type Block struct { + Name string + Title string + Type string + HTMLType string + Content *Content + Parent *Block +} + +func rawToPretty(config interface{}, parent *Block) *Content { + objects := []*Block{} + arrays := []*Block{} + fields := []*Block{} + + cnf := map[string]interface{}{} + kind := reflect.TypeOf(config) + + switch kind { + case reflect.TypeOf(map[interface{}]interface{}{}): + for key, value := range config.(map[interface{}]interface{}) { + cnf[key.(string)] = value + } + case reflect.TypeOf([]map[string]interface{}{}): + for index, value := range config.([]map[string]interface{}) { + cnf[strconv.Itoa(index)] = value + } + case reflect.TypeOf([]map[interface{}]interface{}{}): + for index, value := range config.([]map[interface{}]interface{}) { + cnf[strconv.Itoa(index)] = value + } + case reflect.TypeOf([]interface{}{}): + for index, value := range config.([]interface{}) { + cnf[strconv.Itoa(index)] = value + } + default: + cnf = config.(map[string]interface{}) + } + + for name, element := range cnf { + if utils.IsMap(element) { + objects = append(objects, handleObjects(element, parent, name)) + } else if utils.IsSlice(element) { + arrays = append(arrays, handleArrays(element, parent, name)) + } else { + if name == "title" && parent.Name == mainName { + mainTitle = element.(string) + } + fields = append(fields, handleFlatValues(element, parent, name)) + } + } + + sort.Sort(sortByTitle(fields)) + sort.Sort(sortByTitle(arrays)) + sort.Sort(sortByTitle(objects)) + return &Content{ + Fields: fields, + Arrays: arrays, + Objects: objects, + } +} + +type sortByTitle []*Block + +func (f sortByTitle) Len() int { return len(f) } +func (f sortByTitle) Swap(i, j int) { f[i], f[j] = f[j], f[i] } +func (f sortByTitle) Less(i, j int) bool { + return strings.ToLower(f[i].Name) < strings.ToLower(f[j].Name) +} + +func handleObjects(content interface{}, parent *Block, name string) *Block { + c := new(Block) + c.Parent = parent + c.Type = objectType + c.Title = name + + if parent.Name == mainName { + c.Name = c.Title + } else if parent.Type == arrayType { + c.Name = parent.Name + "[" + name + "]" + } else { + c.Name = parent.Name + "." + c.Title + } + + c.Content = rawToPretty(content, c) + return c +} + +func handleArrays(content interface{}, parent *Block, name string) *Block { + c := new(Block) + c.Parent = parent + c.Type = arrayType + c.Title = name + + if parent.Name == mainName { + c.Name = name + } else { + c.Name = parent.Name + "." + name + } + + c.Content = rawToPretty(content, c) + return c +} + +func handleFlatValues(content interface{}, parent *Block, name string) *Block { + c := new(Block) + c.Parent = parent + + switch content.(type) { + case bool: + c.Type = "boolean" + case int, float32, float64: + c.Type = "number" + default: + c.Type = "string" + } + + c.Content = &Content{Other: content} + + switch strings.ToLower(name) { + case "description": + c.HTMLType = "textarea" + case "date", "publishdate": + c.HTMLType = "datetime" + c.Content = &Content{Other: cast.ToTime(content)} + default: + c.HTMLType = "text" + } + + if parent.Type == arrayType { + c.Name = parent.Name + "[]" + c.Title = content.(string) + } else if parent.Type == objectType { + c.Title = name + c.Name = parent.Name + "." + name + + if parent.Name == mainName { + c.Name = name + } + } else { + log.Panic("Parent type not allowed in handleFlatValues.") + } + + return c +} diff --git a/frontmatter/runes.go b/frontmatter/runes.go new file mode 100644 index 00000000..b4ad1dc2 --- /dev/null +++ b/frontmatter/runes.go @@ -0,0 +1,58 @@ +package frontmatter + +import ( + "bytes" + "errors" + "strings" +) + +// HasRune checks if the file has the frontmatter rune +func HasRune(file []byte) bool { + return strings.HasPrefix(string(file), "---") || + strings.HasPrefix(string(file), "+++") || + strings.HasPrefix(string(file), "{") +} + +// AppendRune appends the frontmatter rune to a file +func AppendRune(frontmatter []byte, mark rune) []byte { + frontmatter = bytes.TrimSpace(frontmatter) + + switch mark { + case '-': + return []byte("---\n" + string(frontmatter) + "\n---") + case '+': + return []byte("+++\n" + string(frontmatter) + "\n+++") + case '{': + return []byte("{\n" + string(frontmatter) + "\n}") + } + + return frontmatter +} + +// RuneToStringFormat converts the rune to a string with the format +func RuneToStringFormat(mark rune) (string, error) { + switch mark { + case '-': + return "yaml", nil + case '+': + return "toml", nil + case '{', '}': + return "json", nil + default: + return "", errors.New("Unsupported format type") + } +} + +// StringFormatToRune converts the format name to its rune +func StringFormatToRune(format string) (rune, error) { + switch format { + case "yaml": + return '-', nil + case "toml": + return '+', nil + case "json": + return '{', nil + default: + return '0', errors.New("Unsupported format type") + } +} diff --git a/frontmatter/runes_test.go b/frontmatter/runes_test.go new file mode 100644 index 00000000..6d120948 --- /dev/null +++ b/frontmatter/runes_test.go @@ -0,0 +1,131 @@ +package frontmatter + +import "testing" + +type hasRuneTest struct { + File []byte + Return bool +} + +var testHasRune = []hasRuneTest{ + hasRuneTest{ + File: []byte(`--- +Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Sed auctor libero eget ante fermentum commodo. +---`), + Return: true, + }, + hasRuneTest{ + File: []byte(`+++ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Sed auctor libero eget ante fermentum commodo. ++++`), + Return: true, + }, + hasRuneTest{ + File: []byte(`{ + "json": "Lorem ipsum dolor sit amet" +}`), + Return: true, + }, + hasRuneTest{ + File: []byte(`+`), + Return: false, + }, + hasRuneTest{ + File: []byte(`++`), + Return: false, + }, + hasRuneTest{ + File: []byte(`-`), + Return: false, + }, + hasRuneTest{ + File: []byte(`--`), + Return: false, + }, + hasRuneTest{ + File: []byte(`Lorem ipsum`), + Return: false, + }, +} + +func TestHasRune(t *testing.T) { + for _, test := range testHasRune { + if HasRune(test.File) != test.Return { + t.Error("Incorrect value on HasRune") + } + } +} + +type appendRuneTest struct { + Before []byte + After []byte + Mark rune +} + +var testAppendRuneTest = []appendRuneTest{} + +func TestAppendRune(t *testing.T) { + for i, test := range testAppendRuneTest { + if !compareByte(AppendRune(test.Before, test.Mark), test.After) { + t.Errorf("Incorrect value on AppendRune of Test %d", i) + } + } +} + +func compareByte(a, b []byte) bool { + if a == nil && b == nil { + return true + } + + if a == nil || b == nil { + return false + } + + if len(a) != len(b) { + return false + } + + for i := range a { + if a[i] != b[i] { + return false + } + } + + return true +} + +var testRuneToStringFormat = map[rune]string{ + '-': "yaml", + '+': "toml", + '{': "json", + '}': "json", + '1': "", + 'a': "", +} + +func TestRuneToStringFormat(t *testing.T) { + for mark, format := range testRuneToStringFormat { + val, _ := RuneToStringFormat(mark) + if val != format { + t.Errorf("Incorrect value on RuneToStringFormat of %v; want: %s; got: %s", mark, format, val) + } + } +} + +var testStringFormatToRune = map[string]rune{ + "yaml": '-', + "toml": '+', + "json": '{', + "lorem": '0', +} + +func TestStringFormatToRune(t *testing.T) { + for format, mark := range testStringFormatToRune { + val, _ := StringFormatToRune(format) + if val != mark { + t.Errorf("Incorrect value on StringFormatToRune of %s; want: %v; got: %v", format, mark, val) + } + } +} diff --git a/http/checksum.go b/http/checksum.go new file mode 100644 index 00000000..e4dcb82c --- /dev/null +++ b/http/checksum.go @@ -0,0 +1,53 @@ +package http + +import ( + "crypto/md5" + "crypto/sha1" + "crypto/sha256" + "crypto/sha512" + "encoding/hex" + e "errors" + "hash" + "io" + "net/http" + "os" + + fm "github.com/hacdias/filemanager" + "github.com/hacdias/filemanager/utils" +) + +// checksum calculates the hash of a filemanager. Supports MD5, SHA1, SHA256 and SHA512. +func checksum(w http.ResponseWriter, r *http.Request, c *fm.Config, i *fm.FileInfo) (int, error) { + query := r.URL.Query().Get("checksum") + + file, err := os.Open(i.Path) + if err != nil { + return utils.ErrorToHTTPCode(err, true), err + } + + defer file.Close() + + var h hash.Hash + + switch query { + case "md5": + h = md5.New() + case "sha1": + h = sha1.New() + case "sha256": + h = sha256.New() + case "sha512": + h = sha512.New() + default: + return http.StatusBadRequest, e.New("Unknown HASH type") + } + + _, err = io.Copy(h, file) + if err != nil { + return http.StatusInternalServerError, err + } + + val := hex.EncodeToString(h.Sum(nil)) + w.Write([]byte(val)) + return http.StatusOK, nil +} diff --git a/http/command.go b/http/command.go new file mode 100644 index 00000000..1c1a8ce9 --- /dev/null +++ b/http/command.go @@ -0,0 +1,136 @@ +package http + +import ( + "bytes" + "net/http" + "os/exec" + "path/filepath" + "strings" + "time" + + "github.com/gorilla/websocket" + fm "github.com/hacdias/filemanager" +) + +var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, +} + +var ( + cmdNotImplemented = []byte("Command not implemented.") + cmdNotAllowed = []byte("Command not allowed.") +) + +// command handles the requests for VCS related commands: git, svn and mercurial +func command(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.User) (int, error) { + // Upgrades the connection to a websocket and checks for errors. + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + return 0, err + } + defer conn.Close() + + var ( + message []byte + command []string + ) + + // Starts an infinite loop until a valid command is captured. + for { + _, message, err = conn.ReadMessage() + if err != nil { + return http.StatusInternalServerError, err + } + + command = strings.Split(string(message), " ") + if len(command) != 0 { + break + } + } + + // Check if the command is allowed + allowed := false + + for _, cmd := range u.Commands { + if cmd == command[0] { + allowed = true + } + } + + if !allowed { + err = conn.WriteMessage(websocket.BinaryMessage, cmdNotAllowed) + if err != nil { + return http.StatusInternalServerError, err + } + + return 0, nil + } + + // Check if the program is talled is installed on the computer. + if _, err = exec.LookPath(command[0]); err != nil { + err = conn.WriteMessage(websocket.BinaryMessage, cmdNotImplemented) + if err != nil { + return http.StatusInternalServerError, err + } + + return http.StatusNotImplemented, nil + } + + // Gets the path and initializes a buffer. + path := strings.Replace(r.URL.Path, c.BaseURL, c.Scope, 1) + path = filepath.Clean(path) + buff := new(bytes.Buffer) + + // Sets up the command executation. + cmd := exec.Command(command[0], command[1:]...) + cmd.Dir = path + cmd.Stderr = buff + cmd.Stdout = buff + + // Starts the command and checks for errors. + err = cmd.Start() + if err != nil { + return http.StatusInternalServerError, err + } + + // Set a 'done' variable to check whetever the command has already finished + // running or not. This verification is done using a goroutine that uses the + // method .Wait() from the command. + done := false + go func() { + err = cmd.Wait() + done = true + }() + + // Function to print the current information on the buffer to the connection. + print := func() error { + by := buff.Bytes() + if len(by) > 0 { + err = conn.WriteMessage(websocket.TextMessage, by) + if err != nil { + return err + } + } + + return nil + } + + // While the command hasn't finished running, continue sending the output + // to the client in intervals of 100 milliseconds. + for !done { + if err = print(); err != nil { + return http.StatusInternalServerError, err + } + + time.Sleep(100 * time.Millisecond) + } + + // After the command is done executing, send the output one more time to the + // browser to make sure it gets the latest information. + if err = print(); err != nil { + return http.StatusInternalServerError, err + } + + return 0, nil +} diff --git a/http/download.go b/http/download.go new file mode 100644 index 00000000..b1848e47 --- /dev/null +++ b/http/download.go @@ -0,0 +1,96 @@ +package http + +import ( + "io" + "io/ioutil" + "net/http" + "net/url" + "os" + "path/filepath" + "strings" + + fm "github.com/hacdias/filemanager" + "github.com/mholt/archiver" +) + +// download creates an archive in one of the supported formats (zip, tar, +// tar.gz or tar.bz2) and sends it to be downloaded. +func download(w http.ResponseWriter, r *http.Request, c *fm.Config, i *fm.FileInfo) (int, error) { + query := r.URL.Query().Get("download") + + if !i.IsDir { + w.Header().Set("Content-Disposition", "attachment; filename="+i.Name) + http.ServeFile(w, r, i.Path) + return 0, nil + } + + files := []string{} + names := strings.Split(r.URL.Query().Get("files"), ",") + + if len(names) != 0 { + for _, name := range names { + name, err := url.QueryUnescape(name) + + if err != nil { + return http.StatusInternalServerError, err + } + + files = append(files, filepath.Join(i.Path, name)) + } + + } else { + files = append(files, i.Path) + } + + if query == "true" { + query = "zip" + } + + var ( + extension string + temp string + err error + tempfile string + ) + + temp, err = ioutil.TempDir("", "") + if err != nil { + return http.StatusInternalServerError, err + } + + defer os.RemoveAll(temp) + tempfile = filepath.Join(temp, "temp") + + switch query { + case "zip": + extension, err = ".zip", archiver.Zip.Make(tempfile, files) + case "tar": + extension, err = ".tar", archiver.Tar.Make(tempfile, files) + case "targz": + extension, err = ".tar.gz", archiver.TarGz.Make(tempfile, files) + case "tarbz2": + extension, err = ".tar.bz2", archiver.TarBz2.Make(tempfile, files) + case "tarxz": + extension, err = ".tar.xz", archiver.TarXZ.Make(tempfile, files) + default: + return http.StatusNotImplemented, nil + } + + if err != nil { + return http.StatusInternalServerError, err + } + + file, err := os.Open(temp + "/temp") + if err != nil { + return http.StatusInternalServerError, err + } + + name := i.Name + if name == "." || name == "" { + name = "download" + } + + w.Header().Set("Content-Disposition", "attachment; filename="+name+extension) + io.Copy(w, file) + return http.StatusOK, nil +} diff --git a/http/editor.go b/http/editor.go new file mode 100644 index 00000000..724a6884 --- /dev/null +++ b/http/editor.go @@ -0,0 +1,121 @@ +package http + +import ( + "bytes" + "errors" + "net/http" + "path/filepath" + "strings" + + fm "github.com/hacdias/filemanager" + "github.com/hacdias/filemanager/frontmatter" + "github.com/spf13/hugo/parser" +) + +// Editor contains the information for the editor page +type Editor struct { + Class string + Mode string + Visual bool + Content string + FrontMatter struct { + Content *frontmatter.Content + Rune rune + } +} + +// getEditor gets the editor based on a FileInfo struct +func getEditor(r *http.Request, i *fm.FileInfo) (*Editor, error) { + var err error + + // Create a new editor variable and set the mode + e := new(Editor) + e.Mode = editorMode(i.Name) + e.Class = editorClass(e.Mode) + + if e.Class == "frontmatter-only" || e.Class == "complete" { + e.Visual = true + } + + if r.URL.Query().Get("visual") == "false" { + e.Class = "content-only" + } + + hasRune := frontmatter.HasRune(i.Content) + + if e.Class == "frontmatter-only" && !hasRune { + e.FrontMatter.Rune, err = frontmatter.StringFormatToRune(e.Mode) + if err != nil { + goto Error + } + i.Content = frontmatter.AppendRune(i.Content, e.FrontMatter.Rune) + hasRune = true + } + + if e.Class == "frontmatter-only" && hasRune { + e.FrontMatter.Content, _, err = frontmatter.Pretty(i.Content) + if err != nil { + goto Error + } + } + + if e.Class == "complete" && hasRune { + var page parser.Page + // Starts a new buffer and parses the file using Hugo's functions + buffer := bytes.NewBuffer(i.Content) + page, err = parser.ReadFrom(buffer) + + if err != nil { + goto Error + } + + // Parses the page content and the frontmatter + e.Content = strings.TrimSpace(string(page.Content())) + e.FrontMatter.Rune = rune(i.Content[0]) + e.FrontMatter.Content, _, err = frontmatter.Pretty(page.FrontMatter()) + } + + if e.Class == "complete" && !hasRune { + err = errors.New("Complete but without rune") + } + +Error: + if e.Class == "content-only" || err != nil { + e.Class = "content-only" + e.Content = i.StringifyContent() + } + + return e, nil +} + +func editorClass(mode string) string { + switch mode { + case "json", "toml", "yaml": + return "frontmatter-only" + case "markdown", "asciidoc", "rst": + return "complete" + } + + return "content-only" +} + +func editorMode(filename string) string { + mode := strings.TrimPrefix(filepath.Ext(filename), ".") + + switch mode { + case "md", "markdown", "mdown", "mmark": + mode = "markdown" + case "asciidoc", "adoc", "ad": + mode = "asciidoc" + case "rst": + mode = "rst" + case "html", "htm": + mode = "html" + case "js": + mode = "javascript" + case "go": + mode = "golang" + } + + return mode +} diff --git a/http/http.go b/http/http.go new file mode 100644 index 00000000..b438dd49 --- /dev/null +++ b/http/http.go @@ -0,0 +1,173 @@ +package http + +import ( + "errors" + "net/http" + "os" + "path/filepath" + "strings" + + fm "github.com/hacdias/filemanager" + "github.com/hacdias/filemanager/assets" + "github.com/hacdias/filemanager/page" + "github.com/hacdias/filemanager/utils" + "github.com/hacdias/filemanager/wrapper" + "github.com/mholt/caddy/caddyhttp/httpserver" +) + +// ServeHTTP starts FileManager. +func ServeHTTP(w http.ResponseWriter, r *http.Request, c *fm.Config) (int, error) { + var ( + fi *fm.FileInfo + user *fm.User + code int + err error + ) + + // Checks if the URL matches the Assets URL. Returns the asset if the + // method is GET and Status Forbidden otherwise. + if strings.HasPrefix(r.URL.Path, c.BaseURL+assets.BaseURL) { + if r.Method == http.MethodGet { + return assets.Serve(w, r, c) + } + + return http.StatusForbidden, nil + } + + // Obtains the user. + username, _, _ := r.BasicAuth() + if _, ok := c.Users[username]; ok { + user = c.Users[username] + } else { + user = c.User + } + + // Checks if the request URL is for the WebDav server + if httpserver.Path(r.URL.Path).Matches(c.WebDavURL) { + // Checks for user permissions relatively to this PATH + if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.WebDavURL)) { + return http.StatusForbidden, nil + } + + switch r.Method { + case "GET", "HEAD": + // Excerpt from RFC4918, section 9.4: + // + // GET, when applied to a collection, may return the contents of an + // "index.html" resource, a human-readable view of the contents of + // the collection, or something else altogether. + // + // It was decided on https://github.com/hacdias/caddy-filemanager/issues/85 + // that GET, for collections, will return the same as PROPFIND method. + path := strings.Replace(r.URL.Path, c.WebDavURL, "", 1) + path = user.Scope + "/" + path + path = filepath.Clean(path) + + var i os.FileInfo + i, err = os.Stat(path) + if err != nil { + // Is there any error? WebDav will handle it... no worries. + break + } + + if i.IsDir() { + r.Method = "PROPFIND" + + if r.Method == "HEAD" { + w = wrapper.NewResponseWriterNoBody(w) + } + } + case "PROPPATCH", "MOVE", "PATCH", "PUT", "DELETE": + if !user.AllowEdit { + return http.StatusForbidden, nil + } + case "MKCOL", "COPY": + if !user.AllowNew { + return http.StatusForbidden, nil + } + } + + // Preprocess the PUT request if it's the case + if r.Method == http.MethodPut { + if err = c.BeforeSave(r, c, user); err != nil { + return http.StatusInternalServerError, err + } + + if preProccessPUT(w, r, c, user) != nil { + return http.StatusInternalServerError, err + } + } + + c.Handler.ServeHTTP(w, r) + if err = c.AfterSave(r, c, user); err != nil { + return http.StatusInternalServerError, err + } + + return 0, nil + } + + w.Header().Set("x-frame-options", "SAMEORIGIN") + w.Header().Set("x-content-type", "nosniff") + w.Header().Set("x-xss-protection", "1; mode=block") + + // Checks if the User is allowed to access this file + if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.BaseURL)) { + if r.Method == http.MethodGet { + return page.PrintErrorHTML( + w, http.StatusForbidden, + errors.New("You don't have permission to access this page"), + ) + } + + return http.StatusForbidden, nil + } + + if r.URL.Query().Get("search") != "" { + return search(w, r, c, user) + } + + if r.URL.Query().Get("command") != "" { + return command(w, r, c, user) + } + + if r.Method == http.MethodGet { + // Gets the information of the directory/file + fi, err = fm.GetInfo(r.URL, c, user) + code = utils.ErrorToHTTPCode(err, false) + if err != nil { + if r.Method == http.MethodGet { + return page.PrintErrorHTML(w, code, err) + } + return code, err + } + + // If it's a dir and the path doesn't end with a trailing slash, + // redirect the user. + if fi.IsDir && !strings.HasSuffix(r.URL.Path, "/") { + http.Redirect(w, r, c.PrefixURL+r.URL.Path+"/", http.StatusTemporaryRedirect) + return 0, nil + } + + switch { + case r.URL.Query().Get("download") != "": + code, err = download(w, r, c, fi) + case r.URL.Query().Get("raw") == "true" && !fi.IsDir: + http.ServeFile(w, r, fi.Path) + code, err = 0, nil + case !fi.IsDir && r.URL.Query().Get("checksum") != "": + code, err = checksum(w, r, c, fi) + case fi.IsDir: + code, err = serveListing(w, r, c, user, fi) + default: + code, err = serveSingle(w, r, c, user, fi) + } + + if err != nil { + code, err = page.PrintErrorHTML(w, code, err) + } + + return code, err + } + + return http.StatusNotImplemented, nil +} diff --git a/http/listing.go b/http/listing.go new file mode 100644 index 00000000..3cea7645 --- /dev/null +++ b/http/listing.go @@ -0,0 +1,147 @@ +package http + +import ( + "encoding/json" + "net/http" + "strconv" + "strings" + + fm "github.com/hacdias/filemanager" + "github.com/hacdias/filemanager/page" + "github.com/hacdias/filemanager/utils" + "github.com/mholt/caddy/caddyhttp/httpserver" +) + +// serveListing presents the user with a listage of a directory folder. +func serveListing(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.User, i *fm.FileInfo) (int, error) { + var err error + + // Loads the content of the directory + listing, err := fm.GetListing(u, i.VirtualPath, c.PrefixURL+r.URL.Path) + if err != nil { + return utils.ErrorToHTTPCode(err, true), err + } + + listing.Context = httpserver.Context{ + Root: http.Dir(u.Scope), + Req: r, + URL: r.URL, + } + + cookieScope := c.BaseURL + if cookieScope == "" { + cookieScope = "/" + } + + // Copy the query values into the Listing struct + var limit int + listing.Sort, listing.Order, limit, err = handleSortOrder(w, r, cookieScope) + if err != nil { + return http.StatusBadRequest, err + } + + listing.ApplySort() + + if limit > 0 && limit <= len(listing.Items) { + listing.Items = listing.Items[:limit] + listing.ItemsLimitedTo = limit + } + + if strings.Contains(r.Header.Get("Accept"), "application/json") { + marsh, err := json.Marshal(listing.Items) + if err != nil { + return http.StatusInternalServerError, err + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + if _, err := w.Write(marsh); err != nil { + return http.StatusInternalServerError, err + } + + return http.StatusOK, nil + } + + displayMode := r.URL.Query().Get("display") + + if displayMode == "" { + if displayCookie, err := r.Cookie("display"); err == nil { + displayMode = displayCookie.Value + } + } + + if displayMode == "" || (displayMode != "mosaic" && displayMode != "list") { + displayMode = "mosaic" + } + + http.SetCookie(w, &http.Cookie{ + Name: "display", + Value: displayMode, + Path: cookieScope, + Secure: r.TLS != nil, + }) + + page := &page.Page{ + Minimal: r.Header.Get("Minimal") == "true", + Info: &page.Info{ + Name: listing.Name, + Path: i.VirtualPath, + IsDir: true, + User: u, + Config: c, + Display: displayMode, + Data: listing, + }, + } + + return page.PrintAsHTML(w, "listing") +} + +// handleSortOrder gets and stores for a Listing the 'sort' and 'order', +// and reads 'limit' if given. The latter is 0 if not given. Sets cookies. +func handleSortOrder(w http.ResponseWriter, r *http.Request, scope string) (sort string, order string, limit int, err error) { + sort = r.URL.Query().Get("sort") + order = r.URL.Query().Get("order") + limitQuery := r.URL.Query().Get("limit") + + // If the query 'sort' or 'order' is empty, use defaults or any values + // previously saved in Cookies. + switch sort { + case "": + sort = "name" + if sortCookie, sortErr := r.Cookie("sort"); sortErr == nil { + sort = sortCookie.Value + } + case "name", "size", "type": + http.SetCookie(w, &http.Cookie{ + Name: "sort", + Value: sort, + Path: scope, + Secure: r.TLS != nil, + }) + } + + switch order { + case "": + order = "asc" + if orderCookie, orderErr := r.Cookie("order"); orderErr == nil { + order = orderCookie.Value + } + case "asc", "desc": + http.SetCookie(w, &http.Cookie{ + Name: "order", + Value: order, + Path: scope, + Secure: r.TLS != nil, + }) + } + + if limitQuery != "" { + limit, err = strconv.Atoi(limitQuery) + // If the 'limit' query can't be interpreted as a number, return err. + if err != nil { + return + } + } + + return +} diff --git a/http/put.go b/http/put.go new file mode 100644 index 00000000..23d0418b --- /dev/null +++ b/http/put.go @@ -0,0 +1,144 @@ +package http + +import ( + "bytes" + "encoding/json" + "errors" + "io/ioutil" + "net/http" + "path/filepath" + "strconv" + "strings" + + "github.com/hacdias/filemanager" + "github.com/hacdias/filemanager/frontmatter" +) + +// preProccessPUT is used to update a file that was edited +func preProccessPUT( + w http.ResponseWriter, + r *http.Request, + c *filemanager.Config, + u *filemanager.User, +) (err error) { + var ( + data = map[string]interface{}{} + file []byte + kind string + rawBuffer = new(bytes.Buffer) + ) + + kind = r.Header.Get("kind") + rawBuffer.ReadFrom(r.Body) + + if kind != "" { + err = json.Unmarshal(rawBuffer.Bytes(), &data) + + if err != nil { + return + } + } + + switch kind { + case "frontmatter-only": + if file, err = ParseFrontMatterOnlyFile(data, r.URL.Path); err != nil { + return + } + case "content-only": + mainContent := data["content"].(string) + mainContent = strings.TrimSpace(mainContent) + file = []byte(mainContent) + case "complete": + var mark rune + + if v := r.Header.Get("Rune"); v != "" { + var n int + n, err = strconv.Atoi(v) + if err != nil { + return err + } + + mark = rune(n) + } + + if file, err = ParseCompleteFile(data, r.URL.Path, mark); err != nil { + return + } + default: + file = rawBuffer.Bytes() + } + + // Overwrite the request Body + r.Body = ioutil.NopCloser(bytes.NewReader(file)) + return +} + +// ParseFrontMatterOnlyFile parses a frontmatter only file +func ParseFrontMatterOnlyFile(data interface{}, filename string) ([]byte, error) { + frontmatter := strings.TrimPrefix(filepath.Ext(filename), ".") + f, err := ParseFrontMatter(data, frontmatter) + fString := string(f) + + // If it's toml or yaml, strip frontmatter identifier + if frontmatter == "toml" { + fString = strings.TrimSuffix(fString, "+++\n") + fString = strings.TrimPrefix(fString, "+++\n") + } + + if frontmatter == "yaml" { + fString = strings.TrimSuffix(fString, "---\n") + fString = strings.TrimPrefix(fString, "---\n") + } + + f = []byte(fString) + return f, err +} + +// ParseFrontMatter is the frontmatter parser +func ParseFrontMatter(data interface{}, front string) ([]byte, error) { + var mark rune + + switch front { + case "toml": + mark = '+' + case "json": + mark = '{' + case "yaml": + mark = '-' + default: + return nil, errors.New("Unsupported Format provided") + } + + return frontmatter.Marshal(data, mark) +} + +// ParseCompleteFile parses a complete file +func ParseCompleteFile(data map[string]interface{}, filename string, mark rune) ([]byte, error) { + mainContent := "" + + if _, ok := data["content"]; ok { + // The main content of the file + mainContent = data["content"].(string) + mainContent = "\n\n" + strings.TrimSpace(mainContent) + "\n" + + // Removes the main content from the rest of the frontmatter + delete(data, "content") + } + + if _, ok := data["date"]; ok { + data["date"] = data["date"].(string) + ":00" + } + + front, err := frontmatter.Marshal(data, mark) + if err != nil { + return []byte{}, err + } + + front = frontmatter.AppendRune(front, mark) + + // Generates the final file + f := new(bytes.Buffer) + f.Write(front) + f.Write([]byte(mainContent)) + return f.Bytes(), nil +} diff --git a/http/search.go b/http/search.go new file mode 100644 index 00000000..3604404f --- /dev/null +++ b/http/search.go @@ -0,0 +1,118 @@ +package http + +import ( + "net/http" + "os" + "path/filepath" + "strings" + + "github.com/gorilla/websocket" + fm "github.com/hacdias/filemanager" +) + +type searchOptions struct { + CaseInsensitive bool + Terms []string +} + +func parseSearch(value string) *searchOptions { + opts := &searchOptions{ + CaseInsensitive: strings.Contains(value, "case:insensitive"), + } + + // removes the options from the value + value = strings.Replace(value, "case:insensitive", "", -1) + value = strings.Replace(value, "case:sensitive", "", -1) + value = strings.TrimSpace(value) + + if opts.CaseInsensitive { + value = strings.ToLower(value) + } + + // if the value starts with " and finishes what that character, we will + // only search for that term + if value[0] == '"' && value[len(value)-1] == '"' { + unique := strings.TrimPrefix(value, "\"") + unique = strings.TrimSuffix(unique, "\"") + + opts.Terms = []string{unique} + return opts + } + + opts.Terms = strings.Split(value, " ") + return opts +} + +// search ... +func search(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.User) (int, error) { + // Upgrades the connection to a websocket and checks for errors. + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + return 0, err + } + defer conn.Close() + + var ( + value string + search *searchOptions + message []byte + ) + + // Starts an infinite loop until a valid command is captured. + for { + _, message, err = conn.ReadMessage() + if err != nil { + return http.StatusInternalServerError, err + } + + if len(message) != 0 { + value = string(message) + break + } + } + + search = parseSearch(value) + scope := strings.Replace(r.URL.Path, c.BaseURL, "", 1) + scope = strings.TrimPrefix(scope, "/") + scope = "/" + scope + scope = u.Scope + scope + scope = strings.Replace(scope, "\\", "/", -1) + scope = filepath.Clean(scope) + + err = filepath.Walk(scope, func(path string, f os.FileInfo, err error) error { + if search.CaseInsensitive { + path = strings.ToLower(path) + } + + path = strings.Replace(path, "\\", "/", -1) + is := false + + for _, term := range search.Terms { + if is { + break + } + + if strings.Contains(path, term) { + if !u.Allowed(path) { + return nil + } + + is = true + } + } + + if !is { + return nil + } + + path = strings.TrimPrefix(path, scope) + path = strings.TrimPrefix(path, "/") + return conn.WriteMessage(websocket.TextMessage, []byte(path)) + }) + + if err != nil { + return http.StatusInternalServerError, err + } + + return http.StatusOK, nil +} diff --git a/http/single.go b/http/single.go new file mode 100644 index 00000000..e4d75b6d --- /dev/null +++ b/http/single.go @@ -0,0 +1,54 @@ +package http + +import ( + "net/http" + "strings" + + fm "github.com/hacdias/filemanager" + "github.com/hacdias/filemanager/page" + "github.com/hacdias/filemanager/utils" +) + +// serveSingle serves a single file in an editor (if it is editable), shows the +// plain file, or downloads it if it can't be shown. +func serveSingle(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.User, i *fm.FileInfo) (int, error) { + var err error + + if err = i.RetrieveFileType(); err != nil { + return utils.ErrorToHTTPCode(err, true), err + } + + p := &page.Page{ + Info: &page.Info{ + Name: i.Name, + Path: i.VirtualPath, + IsDir: false, + Data: i, + User: u, + Config: c, + }, + } + + // If the request accepts JSON, we send the file information. + if strings.Contains(r.Header.Get("Accept"), "application/json") { + return p.PrintAsJSON(w) + } + + if i.Type == "text" { + if err = i.Read(); err != nil { + return utils.ErrorToHTTPCode(err, true), err + } + } + + if i.CanBeEdited() && u.AllowEdit { + p.Data, err = getEditor(r, i) + p.Editor = true + if err != nil { + return http.StatusInternalServerError, err + } + + return p.PrintAsHTML(w, "frontmatter", "editor") + } + + return p.PrintAsHTML(w, "single") +} diff --git a/listing.go b/listing.go new file mode 100644 index 00000000..b272c2af --- /dev/null +++ b/listing.go @@ -0,0 +1,184 @@ +package filemanager + +import ( + "context" + "net/url" + "os" + "path" + "sort" + "strings" + + "github.com/mholt/caddy/caddyhttp/httpserver" +) + +// A Listing is the context used to fill out a template. +type Listing struct { + // The name of the directory (the last element of the path) + Name string + // The full path of the request relatively to a File System + Path string + // The items (files and folders) in the path + Items []FileInfo + // The number of directories in the listing + NumDirs int + // The number of files (items that aren't directories) in the listing + NumFiles int + // Which sorting order is used + Sort string + // And which order + Order string + // If ≠0 then Items have been limited to that many elements + ItemsLimitedTo int + httpserver.Context `json:"-"` +} + +// GetListing gets the information about a specific directory and its files. +func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { + // Gets the directory information using the Virtual File System of + // the user configuration. + file, err := u.FileSystem.OpenFile(context.TODO(), filePath, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + defer file.Close() + + // Reads the directory and gets the information about the files. + files, err := file.Readdir(-1) + if err != nil { + return nil, err + } + + var ( + fileinfos []FileInfo + dirCount, fileCount int + ) + + for _, f := range files { + name := f.Name() + allowed := u.Allowed("/" + name) + + if !allowed { + continue + } + + if f.IsDir() { + name += "/" + dirCount++ + } else { + fileCount++ + } + + // Absolute URL + url := url.URL{Path: baseURL + name} + + i := FileInfo{ + Name: f.Name(), + Size: f.Size(), + ModTime: f.ModTime(), + Mode: f.Mode(), + IsDir: f.IsDir(), + URL: url.String(), + UserAllowed: allowed, + } + i.RetrieveFileType() + + fileinfos = append(fileinfos, i) + } + + return &Listing{ + Name: path.Base(filePath), + Path: filePath, + Items: fileinfos, + NumDirs: dirCount, + NumFiles: fileCount, + }, nil +} + +// ApplySort applies the sort order using .Order and .Sort +func (l Listing) ApplySort() { + // Check '.Order' to know how to sort + if l.Order == "desc" { + switch l.Sort { + case "name": + sort.Sort(sort.Reverse(byName(l))) + case "size": + sort.Sort(sort.Reverse(bySize(l))) + case "time": + sort.Sort(sort.Reverse(byTime(l))) + default: + // If not one of the above, do nothing + return + } + } else { // If we had more Orderings we could add them here + switch l.Sort { + case "name": + sort.Sort(byName(l)) + case "size": + sort.Sort(bySize(l)) + case "time": + sort.Sort(byTime(l)) + default: + sort.Sort(byName(l)) + return + } + } +} + +// Implement sorting for Listing +type byName Listing +type bySize Listing +type byTime Listing + +// By Name +func (l byName) Len() int { + return len(l.Items) +} + +func (l byName) Swap(i, j int) { + l.Items[i], l.Items[j] = l.Items[j], l.Items[i] +} + +// Treat upper and lower case equally +func (l byName) Less(i, j int) bool { + if l.Items[i].IsDir && !l.Items[j].IsDir { + return true + } + + if !l.Items[i].IsDir && l.Items[j].IsDir { + return false + } + + return strings.ToLower(l.Items[i].Name) < strings.ToLower(l.Items[j].Name) +} + +// By Size +func (l bySize) Len() int { + return len(l.Items) +} + +func (l bySize) Swap(i, j int) { + l.Items[i], l.Items[j] = l.Items[j], l.Items[i] +} + +const directoryOffset = -1 << 31 // = math.MinInt32 +func (l bySize) Less(i, j int) bool { + iSize, jSize := l.Items[i].Size, l.Items[j].Size + if l.Items[i].IsDir { + iSize = directoryOffset + iSize + } + if l.Items[j].IsDir { + jSize = directoryOffset + jSize + } + return iSize < jSize +} + +// By Time +func (l byTime) Len() int { + return len(l.Items) +} +func (l byTime) Swap(i, j int) { + l.Items[i], l.Items[j] = l.Items[j], l.Items[i] +} +func (l byTime) Less(i, j int) bool { + return l.Items[i].ModTime.Before(l.Items[j].ModTime) +} diff --git a/page/error.go b/page/error.go new file mode 100644 index 00000000..cdd470f7 --- /dev/null +++ b/page/error.go @@ -0,0 +1,65 @@ +package page + +import ( + "net/http" + "strconv" + "strings" +) + +const errTemplate = ` + + + TITLE + + + + + + +
+

TITLE

+ +

Try reloading the page or hitting the back button. If this error persists, it seems that you may have found a bug! Please create an issue at hacdias/caddy-filemanager repository on GitHub with the code below.

+ + CODE +
+` + +// PrintErrorHTML prints the error page +func PrintErrorHTML(w http.ResponseWriter, code int, err error) (int, error) { + tpl := errTemplate + tpl = strings.Replace(tpl, "TITLE", strconv.Itoa(code)+" "+http.StatusText(code), -1) + tpl = strings.Replace(tpl, "CODE", err.Error(), -1) + + _, err = w.Write([]byte(tpl)) + + if err != nil { + return http.StatusInternalServerError, err + } + return http.StatusOK, nil +} diff --git a/page/page.go b/page/page.go new file mode 100644 index 00000000..67592842 --- /dev/null +++ b/page/page.go @@ -0,0 +1,171 @@ +// Package page is used to render the HTML to the end user +package page + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "html/template" + "log" + "net/http" + "strings" + + "github.com/hacdias/filemanager" + "github.com/hacdias/filemanager/assets" + "github.com/hacdias/filemanager/utils" +) + +// Page contains the informations and functions needed to show the Page +type Page struct { + *Info + Minimal bool +} + +// Info contains the information of a Page +type Info struct { + Name string + Path string + IsDir bool + User *filemanager.User + Config *filemanager.Config + Data interface{} + Editor bool + Display string + Token string +} + +// BreadcrumbMapItem ... +type BreadcrumbMapItem struct { + Name string + URL string +} + +// BreadcrumbMap returns p.Path where every element is a map +// of URLs and path segment names. +func (i Info) BreadcrumbMap() []BreadcrumbMapItem { + result := []BreadcrumbMapItem{} + + if len(i.Path) == 0 { + return result + } + + // skip trailing slash + lpath := i.Path + if lpath[len(lpath)-1] == '/' { + lpath = lpath[:len(lpath)-1] + } + + parts := strings.Split(lpath, "/") + for i, part := range parts { + if i == len(parts)-1 { + continue + } + + if i == 0 && part == "" { + result = append([]BreadcrumbMapItem{{ + Name: "/", + URL: "/", + }}, result...) + continue + } + + result = append([]BreadcrumbMapItem{{ + Name: part, + URL: strings.Join(parts[:i+1], "/") + "/", + }}, result...) + } + + return result +} + +// PreviousLink returns the path of the previous folder +func (i Info) PreviousLink() string { + path := strings.TrimSuffix(i.Path, "/") + path = strings.TrimPrefix(path, "/") + path = i.Config.AbsoluteURL() + "/" + path + path = path[0 : len(path)-len(i.Name)] + + if len(path) < len(i.Config.AbsoluteURL()+"/") { + return "" + } + + return path +} + +// PrintAsHTML formats the page in HTML and executes the template +func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, error) { + // Create the functions map, then the template, check for erros and + // execute the template if there aren't errors + functions := template.FuncMap{ + "Defined": utils.Defined, + "CSS": func(s string) template.CSS { + return template.CSS(s) + }, + "Marshal": func(v interface{}) template.JS { + a, _ := json.Marshal(v) + return template.JS(a) + }, + "EncodeBase64": func(s string) string { + return base64.StdEncoding.EncodeToString([]byte(s)) + }, + } + + if p.Minimal { + templates = append(templates, "minimal") + } else { + templates = append(templates, "base") + } + + var tpl *template.Template + + // For each template, add it to the the tpl variable + for i, t := range templates { + // Get the template from the assets + Page, err := assets.Asset("templates/" + t + ".tmpl") + + // Check if there is some error. If so, the template doesn't exist + if err != nil { + log.Print(err) + return http.StatusInternalServerError, err + } + + // If it's the first iteration, creates a new template and add the + // functions map + if i == 0 { + tpl, err = template.New(t).Funcs(functions).Parse(string(Page)) + } else { + tpl, err = tpl.Parse(string(Page)) + } + + if err != nil { + log.Print(err) + return http.StatusInternalServerError, err + } + } + + buf := &bytes.Buffer{} + err := tpl.Execute(buf, p.Info) + + if err != nil { + return http.StatusInternalServerError, err + } + + w.Header().Set("Content-Type", "text/html; charset=utf-8") + _, err = buf.WriteTo(w) + return http.StatusOK, err +} + +// PrintAsJSON prints the current Page information in JSON +func (p Page) PrintAsJSON(w http.ResponseWriter) (int, error) { + marsh, err := json.MarshalIndent(p.Info.Data, "", " ") + if err != nil { + return http.StatusInternalServerError, err + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + if _, err := w.Write(marsh); err != nil { + return http.StatusInternalServerError, err + } + + return http.StatusOK, nil +} diff --git a/utils/errors.go b/utils/errors.go new file mode 100644 index 00000000..c1f13d55 --- /dev/null +++ b/utils/errors.go @@ -0,0 +1,24 @@ +package utils + +import ( + "net/http" + "os" +) + +// ErrorToHTTPCode converts errors to HTTP Status Code. +func ErrorToHTTPCode(err error, gone bool) int { + switch { + case os.IsPermission(err): + return http.StatusForbidden + case os.IsNotExist(err): + if !gone { + return http.StatusNotFound + } + + return http.StatusGone + case os.IsExist(err): + return http.StatusGone + default: + return http.StatusInternalServerError + } +} diff --git a/utils/types.go b/utils/types.go new file mode 100644 index 00000000..7e6b408b --- /dev/null +++ b/utils/types.go @@ -0,0 +1,13 @@ +package utils + +import "reflect" + +// IsMap checks if some variable is a map +func IsMap(sth interface{}) bool { + return reflect.ValueOf(sth).Kind() == reflect.Map +} + +// IsSlice checks if some variable is a slice +func IsSlice(sth interface{}) bool { + return reflect.ValueOf(sth).Kind() == reflect.Slice +} diff --git a/utils/types_test.go b/utils/types_test.go new file mode 100644 index 00000000..28ebd4dc --- /dev/null +++ b/utils/types_test.go @@ -0,0 +1,49 @@ +package utils + +import "testing" + +type interfaceToBool struct { + Value interface{} + Result bool +} + +var testIsMap = []*interfaceToBool{ + &interfaceToBool{"teste", false}, + &interfaceToBool{453478, false}, + &interfaceToBool{-984512, false}, + &interfaceToBool{true, false}, + &interfaceToBool{map[string]bool{}, true}, + &interfaceToBool{map[int]bool{}, true}, + &interfaceToBool{map[interface{}]bool{}, true}, + &interfaceToBool{[]string{}, false}, +} + +func TestIsMap(t *testing.T) { + for _, test := range testIsMap { + if IsMap(test.Value) != test.Result { + t.Errorf("Incorrect value on IsMap for %v; want: %v; got: %v", test.Value, test.Result, !test.Result) + } + } +} + +var testIsSlice = []*interfaceToBool{ + &interfaceToBool{"teste", false}, + &interfaceToBool{453478, false}, + &interfaceToBool{-984512, false}, + &interfaceToBool{true, false}, + &interfaceToBool{map[string]bool{}, false}, + &interfaceToBool{map[int]bool{}, false}, + &interfaceToBool{map[interface{}]bool{}, false}, + &interfaceToBool{[]string{}, true}, + &interfaceToBool{[]int{}, true}, + &interfaceToBool{[]bool{}, true}, + &interfaceToBool{[]interface{}{}, true}, +} + +func TestIsSlice(t *testing.T) { + for _, test := range testIsSlice { + if IsSlice(test.Value) != test.Result { + t.Errorf("Incorrect value on IsSlice for %v; want: %v; got: %v", test.Value, test.Result, !test.Result) + } + } +} diff --git a/utils/variables.go b/utils/variables.go new file mode 100644 index 00000000..28f8383a --- /dev/null +++ b/utils/variables.go @@ -0,0 +1,47 @@ +package utils + +import ( + "errors" + "log" + "reflect" +) + +// Defined checks if variable is defined in a struct +func Defined(data interface{}, field string) bool { + t := reflect.Indirect(reflect.ValueOf(data)).Type() + + if t.Kind() != reflect.Struct { + log.Print("Non-struct type not allowed.") + return false + } + + _, b := t.FieldByName(field) + return b +} + +// Dict allows to send more than one variable into a template +func Dict(values ...interface{}) (map[string]interface{}, error) { + if len(values)%2 != 0 { + return nil, errors.New("invalid dict call") + } + dict := make(map[string]interface{}, len(values)/2) + for i := 0; i < len(values); i += 2 { + key, ok := values[i].(string) + if !ok { + return nil, errors.New("dict keys must be strings") + } + dict[key] = values[i+1] + } + + return dict, nil +} + +// StringInSlice checks if a slice contains a string +func StringInSlice(a string, list []string) (bool, int) { + for i, b := range list { + if b == a { + return true, i + } + } + return false, 0 +} diff --git a/utils/variables_test.go b/utils/variables_test.go new file mode 100644 index 00000000..7122478d --- /dev/null +++ b/utils/variables_test.go @@ -0,0 +1,41 @@ +package utils + +import "testing" + +type testDefinedData struct { + f1 string + f2 bool + f3 int + f4 func() +} + +type testDefined struct { + data interface{} + field string + result bool +} + +var testDefinedCases = []testDefined{ + {testDefinedData{}, "f1", true}, + {testDefinedData{}, "f2", true}, + {testDefinedData{}, "f3", true}, + {testDefinedData{}, "f4", true}, + {testDefinedData{}, "f5", false}, + {[]string{}, "", false}, + {map[string]int{"oi": 4}, "", false}, + {"asa", "", false}, + {"int", "", false}, +} + +func TestDefined(t *testing.T) { + for _, pair := range testDefinedCases { + v := Defined(pair.data, pair.field) + if v != pair.result { + t.Error( + "For", pair.data, + "expected", pair.result, + "got", v, + ) + } + } +} diff --git a/wrapper/response_writer.go b/wrapper/response_writer.go new file mode 100644 index 00000000..0af79376 --- /dev/null +++ b/wrapper/response_writer.go @@ -0,0 +1,29 @@ +package wrapper + +import "net/http" + +// ResponseWriterNoBody is a wrapper used to suprress the body of the response +// to a request. Mainly used for HEAD requests. +type ResponseWriterNoBody struct { + http.ResponseWriter +} + +// NewResponseWriterNoBody creates a new ResponseWriterNoBody. +func NewResponseWriterNoBody(w http.ResponseWriter) *ResponseWriterNoBody { + return &ResponseWriterNoBody{w} +} + +// Header executes the Header method from the http.ResponseWriter. +func (w ResponseWriterNoBody) Header() http.Header { + return w.ResponseWriter.Header() +} + +// Write suprresses the body. +func (w ResponseWriterNoBody) Write(data []byte) (int, error) { + return 0, nil +} + +// WriteHeader writes the header to the http.ResponseWriter. +func (w ResponseWriterNoBody) WriteHeader(statusCode int) { + w.ResponseWriter.WriteHeader(statusCode) +} From fca1dc9bd7af099fd190a908a961fccbdee406f8 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 18 Jun 2017 14:03:15 +0100 Subject: [PATCH 04/40] add submodule Former-commit-id: 3f75f05e34efedced3f420130ed9efed918f6092 --- .gitmodules | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..883b2160 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "_embed/public/ace"] + path = _embed/public/ace + url = https://github.com/ajaxorg/ace-builds + ignore = dirty From ae61d5b6aa4147dd93363751645acc68d3d5bce9 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 18 Jun 2017 14:04:17 +0100 Subject: [PATCH 05/40] remove gitignore Former-commit-id: 1c703e0364c90481dac2a218892907fca2a66963 --- .gitignore | 1 - _embed/public/css/fonts.css | 137 ++ _embed/public/css/material/icons.woff2 | Bin 0 -> 44300 bytes _embed/public/css/normalize.css | 461 +++++++ .../css/roboto/medium-cyrillic-ext.woff2 | Bin 0 -> 15292 bytes .../public/css/roboto/medium-cyrillic.woff2 | Bin 0 -> 10060 bytes .../public/css/roboto/medium-greek-ext.woff2 | Bin 0 -> 1412 bytes _embed/public/css/roboto/medium-greek.woff2 | Bin 0 -> 7176 bytes .../public/css/roboto/medium-latin-ext.woff2 | Bin 0 -> 11912 bytes _embed/public/css/roboto/medium-latin.woff2 | Bin 0 -> 14596 bytes .../public/css/roboto/medium-vietnamese.woff2 | Bin 0 -> 4780 bytes .../css/roboto/normal-cyrillic-ext.woff2 | Bin 0 -> 15832 bytes .../public/css/roboto/normal-cyrillic.woff2 | Bin 0 -> 9996 bytes .../public/css/roboto/normal-greek-ext.woff2 | Bin 0 -> 1432 bytes _embed/public/css/roboto/normal-greek.woff2 | Bin 0 -> 7208 bytes .../public/css/roboto/normal-latin-ext.woff2 | Bin 0 -> 12008 bytes _embed/public/css/roboto/normal-latin.woff2 | Bin 0 -> 14584 bytes .../public/css/roboto/normal-vietnamese.woff2 | Bin 0 -> 4896 bytes _embed/public/css/styles.css | 1207 +++++++++++++++++ _embed/public/js/common.js | 685 ++++++++++ _embed/public/js/editor.js | 278 ++++ _embed/public/js/listing.js | 580 ++++++++ _embed/public/js/vendor/form2js.js | 356 +++++ _embed/templates/base.tmpl | 292 ++++ _embed/templates/editor.tmpl | 57 + _embed/templates/frontmatter.tmpl | 56 + _embed/templates/listing.tmpl | 103 ++ _embed/templates/minimal.tmpl | 1 + _embed/templates/single.tmpl | 23 + 29 files changed, 4236 insertions(+), 1 deletion(-) create mode 100644 _embed/public/css/fonts.css create mode 100644 _embed/public/css/material/icons.woff2 create mode 100644 _embed/public/css/normalize.css create mode 100644 _embed/public/css/roboto/medium-cyrillic-ext.woff2 create mode 100644 _embed/public/css/roboto/medium-cyrillic.woff2 create mode 100644 _embed/public/css/roboto/medium-greek-ext.woff2 create mode 100644 _embed/public/css/roboto/medium-greek.woff2 create mode 100644 _embed/public/css/roboto/medium-latin-ext.woff2 create mode 100644 _embed/public/css/roboto/medium-latin.woff2 create mode 100644 _embed/public/css/roboto/medium-vietnamese.woff2 create mode 100644 _embed/public/css/roboto/normal-cyrillic-ext.woff2 create mode 100644 _embed/public/css/roboto/normal-cyrillic.woff2 create mode 100644 _embed/public/css/roboto/normal-greek-ext.woff2 create mode 100644 _embed/public/css/roboto/normal-greek.woff2 create mode 100644 _embed/public/css/roboto/normal-latin-ext.woff2 create mode 100644 _embed/public/css/roboto/normal-latin.woff2 create mode 100644 _embed/public/css/roboto/normal-vietnamese.woff2 create mode 100644 _embed/public/css/styles.css create mode 100644 _embed/public/js/common.js create mode 100644 _embed/public/js/editor.js create mode 100644 _embed/public/js/listing.js create mode 100644 _embed/public/js/vendor/form2js.js create mode 100644 _embed/templates/base.tmpl create mode 100644 _embed/templates/editor.tmpl create mode 100644 _embed/templates/frontmatter.tmpl create mode 100644 _embed/templates/listing.tmpl create mode 100644 _embed/templates/minimal.tmpl create mode 100644 _embed/templates/single.tmpl diff --git a/.gitignore b/.gitignore index e976ef51..e69de29b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +0,0 @@ -_embed \ No newline at end of file diff --git a/_embed/public/css/fonts.css b/_embed/public/css/fonts.css new file mode 100644 index 00000000..1911d377 --- /dev/null +++ b/_embed/public/css/fonts.css @@ -0,0 +1,137 @@ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-cyrillic-ext.woff2) format('woff2'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-cyrillic.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-greek-ext.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-greek.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-vietnamese.woff2) format('woff2'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-cyrillic-ext.woff2) format('woff2'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-cyrillic.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-greek-ext.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-greek.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-vietnamese.woff2) format('woff2'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} + +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: local('Material Icons'), local('MaterialIcons-Regular'), url(material/icons.woff2) format('woff2'); +} + +.prompt .file-list ul li:before, +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + -moz-osx-font-smoothing: grayscale; + font-feature-settings: 'liga'; +} diff --git a/_embed/public/css/material/icons.woff2 b/_embed/public/css/material/icons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/_embed/public/css/normalize.css b/_embed/public/css/normalize.css new file mode 100644 index 00000000..9b77e0eb --- /dev/null +++ b/_embed/public/css/normalize.css @@ -0,0 +1,461 @@ +/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */ + +/** + * 1. Change the default font family in all browsers (opinionated). + * 2. Correct the line height in all browsers. + * 3. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + +/* Document + ========================================================================== */ + +html { + font-family: sans-serif; /* 1 */ + line-height: 1.15; /* 2 */ + -ms-text-size-adjust: 100%; /* 3 */ + -webkit-text-size-adjust: 100%; /* 3 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers (opinionated). + */ + +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ + +figcaption, +figure, +main { /* 1 */ + display: block; +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/** + * Remove the outline on focused links when they are also active or hovered + * in all browsers (opinionated). + */ + +a:active, +a:hover { + outline-width: 0; +} + +/** + * 1. Remove the bottom border in Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Change the border, margin, and padding in all browsers (opinionated). + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ + +details, /* 1 */ +menu { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Scripting + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ + +template { + display: none; +} + +/* Hidden + ========================================================================== */ + +/** + * Add the correct display in IE 10-. + */ + +[hidden] { + display: none; +} diff --git a/_embed/public/css/roboto/medium-cyrillic-ext.woff2 b/_embed/public/css/roboto/medium-cyrillic-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f63bc9a1934f40bbbc109e7697aacb18ebb2f284 GIT binary patch literal 15292 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 literal 0 HcmV?d00001 diff --git a/_embed/public/css/roboto/medium-cyrillic.woff2 b/_embed/public/css/roboto/medium-cyrillic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b3ca824db64d0186f7e52b1f7464413a638f9f18 GIT binary patch literal 10060 zcmV-SC$rdhPew8T0RR9104GcU5dZ)H09up)04D1I0ssI200000000000000000000 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 mb=gU~>F$4Gvd<#C<9HE{ARVQ^Cs&+nPJhBM@ zc~=Qmjy6|g9I`e@fFodiQDzsJmF+rKKJiZ+FU|uMDNjL_{hC^tZlQlho-L{w+ z<&I1%Xfcs6YUlbe2MRNY(a3;KXoW78PtXl5&;z~D&jMAddro$38ZZpg zU?$5T5Rj3``u?VOv}$@W8>X{h2G8j)MEcJ{A&+$yvY0x{tkIJDlyS}R`BJa)4qwjl zKs@-My}SCn{0sGntoiT1xh`Gy$e1DNmOHh@JkFyqbuR_;($J2?@E>QnU6_KDVbn@+ zS)6W~&^Euv`>_YVtnN$7qnwnq_EyLVsXILgLW7 ztNNsX%m@W@jXbbaRmcW!YfNmqNy>g(#%jae1co?YPG1 zfMVTje-wgflcmLoBHUUk8cGKS_#W$07T7QUjdYfOSe^>g)gqsCvMQ#XebRg}i$=+91;(h~3V9JaOPIqB` z@tqV=Sq`-LFflkH;Msyvr!`~DG+pcuqt zOi0#obu#qL3UGMZLX#RHqkZP~l4BrVGFN95vbmb+jUF2}m}TGjPf?U}lWol8Rkd|~ zm3xPu_qVBp+W>{w*o-j4Zq%lQ{7Bq(E|A)X%xw(!bxdUBIwnk|vilB&n=AvhpHLp) zL$Q%)gZ)b&0Wln`NpCQMr>TI)p3cvt1YSwa<2pXnkVKktEq$Gnnmt_@#mC6wlNpI* zqt8qF$IkOedfptd-p%yIlLT6Q%0a{vpJAXGC3xWd zGG&ND6u~>ibu>gs%o3WoU!}mO7JNo>Gsdm#_=uF#$_b!8^;>-d+!Q6#F@luL(17;C zCE0<2wD;aBnnP>P1vJQ5?oQAo{1dIf#diScpU(TD6wY)EUZ1L5Lv>279ipE)C^$nH z8UQ{k?B*R7tw2=>p-6hUft)4`vGki@f|1gg|97HFxCA9~vNkM_541YY z`9bP?uV1Gn+t5)U8T-c2Tj!~yrlg~b@}!3}$JMT%?>e=3^fJtp*V(-5T|R`6aW{o@ zmu>NS_j{T7-`?qk`On>df%5JN5xE{RQD0x2))6w#A9B84D-m@JaER8ASO`>CK#-vZ z%7#}EO<&Rqa#jEl7}GZ}WWMTZ>{rI)AhvPxJ&efYp0t#1K%u?ANk(@`S4>8^5Q*Ju zyXd>MjX*NDomN_-ljrOkxYb4v;4E#lnNlp%G{bEtB&=1TF{=1%qr&e(1q_$WndX#u zG@Kd~vUY6(H-Xe^UjjK+f@E6|BlauYf+t0Q232^Vo}D*;VHx)2&HFn*EIhB+SJ8okPh zu9>?wU(Ne(2nG*WhG#&S0Ldk#Jb+1^DWX4YZq5K&v`-#Dpo20^ELKq2(zj{Vl1gvM zRWtjWIItMH2t1^I40#Rvk9(}Bg~Ih}>(X_MwMjFqvsk8WwoF{%GB-1Dw2nX5n!|N@ z$KAml@Hnj~-zlmy&aW}4BgYxkx1#I`dW5MV{ekzrFxrl%ey(^{r_7Lz_xBLW{QC(C zQKm&A3MhV0ES+@BlC`NUs9{B9xM{)`Y+*}qmCN0gT<2Yfbnd#luFUte zowXCDo!wlKvUefxr?q4*siMZ>r8lm(S(LY1RmOkBb3WhRw;$VrQG!A|-A5qC87i$9 zyTYY`C3Fu4P9T{GkjT~l%lXpyS5n@5Loe}=7okN-z{<8#VsH{FLWeYc>T5dgS8P!E z>UEc}ac<6s%&w%W$A2enFh z^2vpFiG_IP_W~PZpa*zRDHN#VAPR7Al=0+Q3YDMYk1|dahqj%d-K}(~6)HRUH>5BMtlrs>UPAe{F3`JV5mteG=}4S6bKJ}?GeK?7*`se4G~$U6-C)=nu6O;0NcTSx zxIuX`K;qFfqP@EB3&B+h=duIw9)$wb*VKu4&?vTjy%nzYmP_vfIt9Ylo8CvJiApR~ zykU9df8FdZ_OF!QchPjCKIWDNMN|L3E&ndZg>S|sQ-WQ3=c6cj=R69G6|%7)iWJQR z+?D*sG;~guMzrs_Kx0kXFj6R~onzVZx(yXPUb$ZhE>}qSEof~frsbcD>4+)a z%-{)SRX=dY`VW8m^@*1hbNTvY;=>V%PpOZBK*D-bgn-;_Z%Ij1Hu{zQC#fZcZz) zzF|4nqihL=TiMC4y+vVOwtT%Nx@KS(i=r-@T}%n*3#oWi3&*UH+30dM?dO-$R&K`U z-}I_eoE;^ukH1_mEa~;P)~2DHPg|>oqx-Q&enguU8MJFx9EnxRiYYf#7#oF-Mv!w+ zte{|y7Wg<6^c9M7N<5~}?rmPBLr_2LO;z$LIEVW3s*W+Sl3a)oWf3}k(i^V{xh2fE zQ>I*3^7r&Adsm%S(g(RUO46?z(?*R`W^-PS6vxR}Nl)77l^g=zIBwoCaxyBeaWr+K z*T$~wr;R+V$M|s*N#aW1_!yL zWAXhaGwCSVmZnTBmWCTDf_f|{ILjcSoLW#5r|ye)tx48d$Y8TL-&jj5w!#)`qSg}2 z$h+DC8%>3^(IzEYXRUnos?{1$N1Hs>5t3(>jrHb@(&Z$Z)7EQO1Gib#7Cf~USd^ek zyzDv~ErYe%iZHvxTAM80^tAIBBlR2nFCtBYqWhaV`bMdh?^>g<%EST9geu8Jwp~zN zhah$nZXCkbmSlOcR`K*=R$ZLwyOuuPNDu1wgdRk6;%%LRU@XFj)GN;myCaJFrbj!g zX`H%Q7O_&Ewjauf*b+aDYu^*GkM&_p^RBl2SwGB1!~y2J(ajoj9n>n$4mt;rJS;md iB>Z*wRg(#i;d>LdW9fVQrS%SD&x0d(T^@u10002A;bAiX literal 0 HcmV?d00001 diff --git a/_embed/public/css/roboto/medium-greek-ext.woff2 b/_embed/public/css/roboto/medium-greek-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7e1a807819496f6e3e52ce083544104841602e05 GIT binary patch literal 1412 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 K>W@?d0002eJ=}u; literal 0 HcmV?d00001 diff --git a/_embed/public/css/roboto/medium-latin-ext.woff2 b/_embed/public/css/roboto/medium-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..604b89354421a545b529e76acaacb9c7f5d50988 GIT binary patch literal 11912 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 OA2`Fug|G}F3IG6(|K7_0 literal 0 HcmV?d00001 diff --git a/_embed/public/css/roboto/medium-latin.woff2 b/_embed/public/css/roboto/medium-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5f96609d81a812b8f2557a4e9bba6db29205ae0e GIT binary patch literal 14596 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 literal 0 HcmV?d00001 diff --git a/_embed/public/css/roboto/medium-vietnamese.woff2 b/_embed/public/css/roboto/medium-vietnamese.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d92b712507a5d24f7910ccd4c2394570d4f405b5 GIT binary patch literal 4780 zcmV;d5>xGWPew8T0RR9101~VK5dZ)H04pE>01`_80ssI200000000000000000000 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 ilgW1vW5`h!}HUcCAgd7Wk5C8-q1%eOcS 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 WCa?E`${Nr6J&WjV<7!di4FCYRVoq}a literal 0 HcmV?d00001 diff --git a/_embed/public/css/roboto/normal-greek-ext.woff2 b/_embed/public/css/roboto/normal-greek-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ed0b13ca09d1372918d42c2a7e3f944b762d80dc GIT binary patch literal 1432 zcmV;J1!wwqPew8T0RR9100o!;5&!@I010pa00le%0ssI200000000000000000000 z0000Q6dQpi91I3v09Xi234=Tl3<`s2gGdq-0X7080~`ww00bZff)EEF41rr44hYDO zly2TC2&kqydmw_?d`fZ(pkz5f4k<=dU0r}}4iKq;FXojBL@ogQ5UgVV|7}0D|H`_m z7Vsr?jR&iGR|FooZfbhQPAC9$q~>rLUOU}8$bJOi!Kevr2=nv6MS|^UmDP<2ir4Mg zI>>~ctz835A6&D2Ba6@gve|lTLRF!vQ0fi_y0&hl80*F)c1%N|YYr3&+gV1LNJ)_W zeQtVw-3$r+5Ky%f;zD%LFVkm$7)_?sH|bUYTTgw#7r3&mgbx8>fSQ(;8sd=s-^MU> z+b>fv5my6fWxB*f4Fyoa62cBac5?v>&@cg%H3W=q%JzNnP#xpWxe(vj@Lqlsi##w{c0?y{`1sMNZkYwnZ<0kgj`y&p3& z|3{@BX}GC6p*7i-l!q$~8LzaAaM-MpPqrrQRh35AvZB&9KTP5W`U+=C+3U6`QR!%X zKu1!>4T+UX#U{pv<>6GyNX_1;YIt(n2L-HJ9Iw7s^`JQ1nrlAnSPfe1YE3-5U98He zbVeFFl2t4U@8*igaaB?2j>z%!t38qQL~+_obtE5(qp|Km2d5LshZv{+u-P)?*p6G~ z=?4R($qMi5jmY@v2ThhH)8nZ$9%8)uL!}jcDG>(>*Xswsjt}<%PGAwx8=vz4uc2dD zmHHk{g`14<*&IRNKL750z5R}X<^Fy#5PQkt5591vzWS(B9QpWb_c>pFNawMST&WKd z9R84fyN}P_x6Dn_)$Qipvl8!#NzbCoXVtFd==R{zs+~W&cYS@WDps7f{;#^F_2OIK zyI_(1W_gG6mW$_#*ZSVNXo>5#JMMPfazXsv$A$Vv?j!dP>5jg%%kx{tlcIa)r4mT{JinDr z>kWBXUZf%IIno=*7z(A)L;Ktaj< zM=u9EOHmP;6M+Z9h=PyT!?K#Utbtf3Lb2FJi0Vln3D(liCLGzscKh^py69mCgREgI zopixz+vsBx8!?$q38f~QM!+^dP5g~Bd)O?>M|#wo^Am9 zMZ1=ljRlT_J+1SKfiqDxdqM$l?Ofe3dt}~yY<+Vb;Q26NX2LpZ~-;~Bm;vG3xP@i1Rw>15C+A6|ivt!1SjvQIt&1;i9M)dr>O;|8T&KA=rmnuR(EQC>A3gi*+|lAcASOm2$=! zd~$Y0eObIWpUo;c4d0*Uz3NdywMhvdtxyZCh0Zf<@VV;7?he0DXZ>n6Y8&PFkfdnB z^Yop4r|MRB2O2TS5Sj5K@g-;teXg5-;McyLc`|>uL@Fs*g3!e~5fZ)7vgq6a+~&aQ z#x8udQGk)?-~2`e>b*XZrxFu3htR;O!y97yY32b(| zcJ8nOgCJ1g|JAjm?Rhz~AnA#wz|3Urp_ZUFF{@>pesAh+j7%fT!n@09xhj^`EU&xl ztKX{d4^IfYd4N9%B&>8+hnEiEEn=zs8&=kUHb}6xfAA=(QLID=rR~-dX#n8x|IhVi z-|Z_=3aEgR0v-982HLTz3yK$rXsyPV#B?Q&PsfDiZ2sCBy%k`%llQC4k72 zhSs5FY%+eeC89jHEY3n4aU+Y;osOMrxNJy8EbWPb?;;w~m;F&d0IM_sa_2=A#Y!kD zG)0xBsL>P&P0<`r(W;H2gYFc)jHH;*{aF>0OrubMkC9d~Js%AmN%o8In?QkOw^G z1zzJFb>btwP?Re7P#l!1@qi?;&C5H-v!e_>%2Y@0jSDt)PF$D@0DN&|e zr5d&BBs6N$NjKf~($@fk4KdU(!;LhdC7+L%!kksaq~=;xpOD10tSJjE*QVC%Qrk5_ zQ7ee1ux7O)w5&ynM0@;e3!!Lglb4E!s@qW0n!0w>w=%|E(o&z+Mzl4>qB@dV;TNzD zt#XB7#FnrLkc6=4pfI)kXqbOtO#&DSTUOMdT1lGf&{W^8HNr98e@*=&#M)QTj@s5~ zte=%=xmNg2UJuHXL=DQF6b=kFu%Iq`!lAGc)osd)d3Cb2<%G5+@LC6ywyvT!m4Z~a zrY5}lRwcq|qM}7l;iR_OiE=MdX^lXeK8baTd8Q7*Ky@_8G1maj%?sfH#bS0V^TjzbQKX4)nQ zS_OBHd&u5ocbBzPwWaZqD+!$80C7N{XG8kX74GH9|1kTOJAfE<9$?xxMhxw5Nw#auC8+S;`hZ_ByaA+( z5Nz2s<7etbPt2^IowIKaO?=moEnMe`Gi{d6s)?IjbFhp2d+)!$0C1IgnMeQi{`U+; zI)HrbU^v@xmTaBm=&Xyb-^$)dAAR+cufGAJ1{x%0u(%-#zHMRQ^g$FUHo{1wj5fwt z{xmi=nUDT zqZ?%3qK80t$YF7$ZBK<9g&YTcASXaaKIG)mr$B$mX&q6>nWfKyfsk`^5rdqci@}f! za}kGJoQoll%T^t5Wy)1BG;s~)q7ZUj$8g9E@P9prHx6Ch74{T!%=Jg;LiR$s>K7u<#-U98A_uyTl zqY7tju*+KSFw^?J_)#VEBeEx-pRXa=fbm>`U{KrOdccu`Pk9rinsv_&rt zPe3aNcD0RDDTXMp$}jz)YutdYf}HYCg%~lxEJ3wRavWRe)y?#Z^|Sq(EH?XGrLx4A zIXqbex>|x52DRa5iHB=-vk)fO`dG-^UuKmOXOrEigr~TZRSu&B5K@w&q5&JEBvQTe zVg*m!uB*_n+$gKQ-gfcR66-#tM~qpfF?DSS%LFf*UFG%w#y%f|B6|`)6hF5Bb4u|S zl_Pj(6fMWDAAQALj7sX?wIEQqa5MdSAc|sMVQr8>*XylNw8fn=vPg%r`ez9fVG2K` z?nW(6e9uH_r2_+c zg(kuQUCahkQN0+~V~KnqU!nn$NE%obC~DApQcb6$gr^~e<3QMiGr=rUkQ>(4vB7pA zDF(UYJ%177bu9Q479)mKXTggIN@4LPRg6j)gw)yCBNNWzsixN~r4}j8HJ~-K*`@NT z^xumbQoH{Xvfo3=JEK3C{~9pa8$#BP+0y{?kxF+wFv@?i_D|qQB>L38B%g1l6xTN( zS%);ivne);P-@{)ozn?MN?p9U)gC)3T>}ql=;7K?nsEGS!~D&FqZq1*bv++%YpLF% zkVgyJt}5ahYT#a~>I^Ajq4g$!f!us{eH8LE;ZWCaQ2xsp6=jxZzirRVkYl5Av#V>U zd>bX_cnOO;Fgt_=`(KWVjS&?*>PBjlJg1q!BEfWycF3h6j+j>1Q$I%Lsca;-i@QcM z!`Y_%-UxG{PC=Mdh2sk-EG%po++qdXY+QbXw3NW#@#Gy7AGB~iW8lSC0c#uXIED#6 zNNuxrroB%l(`#QIQdX9ClzryPWf*k!EkEoR-Lv&+Am|t|_#W zXuR&<6{*AaKSomM7(G#fw%D-t-+2$_+)j+fUPfiNyO8S2NptnbIs<)(0n zN`{4=qL(rIYOuVZyd6C*&az_Yy-+7aiUJQZ)i&n);tP<)>qRIfOHy0p8@KHuFpMHU z?xdrD)4G*oT5x~$+zFa=D?o8aE1CNvfWl!xnTKxEA(zl(pvTc3n=C+Y@TE)ii#E~! zm*_vCHs<=m=v1-*V`ZtQa^LBkx;*O{*n zVR48g{@Vs%G?IL#pkR+GX@$chNC)U!pb0&TZv0W$7&sf)bQ}3OhX8L`)jv}8fyn+< zJ(Ogr0x_7E10&E{_UN51ZC{JURe+F}CNPrC`b=v(?>;4^Fyi9U1Rl)&c^-IrHrPQ^ zEAdGNRG%$rd2tbkC;NF|zLJvi0Q`94c#qL4;48dK? zQ)_8#re|;g?l$sba#F}OMW|88zbn%!+WE!>;>jum6ieZ8g4qMfqL-JmF-bGbDpw4J zVQ2Gksnh3OzNn`DRX!1)@Nv2wTQMCU^J&6#=WMLSu#VddlED1|Qm1|NeLHsCnG+$3 zKTS7x>^1xO;BQj8KU6>%h8)FI(O$?Uw~cKs}29OM&q;G@XT zX;7=tYJlP+XzI9fQs56|rSE}>ob^5MUK|A1^)SA3u7!R@e$9&!Z}>e3>MtP38C~l} z6=f(cJwUUi7Nsc#YdsLW$$z{za?eX7c; zxBH_|eM*La`s!(i$!7yXHT#e~KbxC<@C*XBX5rhYC{T3Yh6ec<=c@$E&ZxX|Tse#3ueXkspUeLzYr zWP~-rh@8waU=nvD3s7UI$E%tDNNJAx=2TsOtEM6{eetElXlv8@>BLRSQ`k7?#Br>PyU1(ex0-TwBJM2}cHw_!hd&xSkU!V!xJXgzE zoi@YBVRTpFkGKd;P*Eo2?AISH+$*q!LexSb{OJ_)JilvDEfZO~#WS1Uxu(9cL2 z4rKOXwLX;;mS(=a<$`n+e!~0fwrZQ$4T>yXS$lhN{oDMG%TSgjx<2kQil^(I_6iF? z!fB|M1oe9{=Y%4U+f()t*_ppVZF!~sN%@RMFU0p9l)a5S%PsX_H2;h zo%|_GZs-yr;mq&&6e{RaZmsWpYnjeM&Rq63>xSAfFf5xLdWMg-w)~0aZ%<=ki4R|& zj*6e8QM@j)Lw3ib;sB#&R++y=_}I9@@$Rq1y>T&x-FEtEWkFdH-f}cD?`+jzuYyy7 zl*11*qpjJ~AyF!w?ENc z3q6!uF}y92`40!;rQ8t7Q|4Tz_Dh8uaG|bvbB=u-ValbmT0nLC~bQ z+?T=cQnJg(1?hPvivQv=i>g|&PYIT+aHj}#ZH#~y`Tw-^R$oz5%K0-{7uemqRuHkw z_HtG�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 literal 0 HcmV?d00001 diff --git a/_embed/public/css/roboto/normal-latin-ext.woff2 b/_embed/public/css/roboto/normal-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0c7aec28f513926a7e749abc12863001e2f1b65c GIT binary patch literal 12008 zcmV15C-=YD)d5n~(-7Vu&e!NviA)NIQBKSGo-Ov^y72Ovb!q=aIX+2ag~ zBym!K%A+ob1=d>XS1aY+H!}_#007KcZNG0KliQ7i9jw^cp-c?PYVd*gZU6xM2_TXc zNC5!Ahu`Ba@C3|T06+tFR1%y$!%%{Rc;MI8yk8s8VsW^x)qowiw9!NxU26w=0oaXt znRo?8FJ|xuXqz2^Fngg9Zott7~f(2F~Kt~ckhtVQzt z^Y=cv_I>x90zy#$TOc6?L5CD(=_s#vkGohQz1aAIUP$HoKz;(0x03o?!lJ{Nm zDh#@MAY0q&Knad-5%|OZe`{qmq^EkAdL~3@frO2g_rFuSnJsd(KgxNFW=a^6D>w5PcBDp|QxOHKe4J}U{JFFe1e|Pd-q%+i#fB&=n0h>BN zP6q#yPI6kERIucr3dG}2O7vSEaq5IS@Y{KqaacQSU6=mf(q=a|vsWuPmfD2@q2lCD zq3q87d$-B;xz;w+B$U?Gf#RW>t7SuL38fatNgl!>6dqyJS^V5v>Nh0!Zhc&P1UbZE z@q|n$LddnO{4MA@*#1wTBPD6msMPq@2;fasSI}u%|8ok>X^YTaXF`hAgmvB^ z2w z6lk;)ju7NHs8hNA!z$=x$TG+f4+tIm5k)DYfx2~02qF;7AN!;~_i^|4%znw++@<=4 znl}OFErIi~+jrxSe&267oQ+R^2VfS1AoH<7E>_QWvTwoM#t(lpyRY>6A^l~0O+RTu zyW1aTK|ht@y3Z`g`Drt!_J#fy=IFE7T!R^)6jiwSU@|pNKkur(Ab#hUeKzhtS^nT1jb>Fx970idh7JP`(wQoLE{TIyV93t%!^NAJp&I}JM z5Ww`zt5Let1^lA^e=a0QktRc?ECUTP*bqYvGu#LxjWXI8V~sPxM3YQ5#Z=QwH^WSe zEVhK(ax1O2&IX%ovCR(IcG>MypZVMua^%Xh$6os!aL5toU6k*NFMaJ>-}}+ee)XH* z{ozl4DR9l-3SD>8ZFk&r-vbYM6no^cCp_Iw&Zhu6u=QBl)2sNLc?Hn$wXOOEzpcWC zzACT+24E>vYZWW~Q1Dk1MB&i5bsQh-QSE?@fJ3|}MJu-**g_T358n2wx}ebBAqw7N zFR^BCJAQO}1@Gg7gH21cLjhDpAH{t(ehNWF`{Iwhku(fVJvgFK2W&`;i&hK**+r4J zFV$WM!ij!9bZCJn58yE4jV)C9inB-*RnD<5l~@sy07)bkH}KGNj_T zUj0SZ_^E33krc6;@hZ&(Dgi`1kBguk%#Vu_$l7HCa3VVZT8pA_;=DDlw(CPsk#TZ6 z$UK@10`2P0vku}X0g=hoC`LV&v5R+taxY0Cq#)IyYYN>!-JyHRfcINCU7?a*=TtkqB~V)*Y>m{~A0V5W5{ z%!KaWf5_*Bw2xLV`VCOxd*lBbc{h@;KfnG43jZkTTKIY4j>7E-(59_HD}*Ge&X8n~ zQ>6KQrFceDQZ;9j&9>NTo9%YksRb=J(AUz6)|_?DMVI8eEKT~By?Zv?lcE^J?+3INP9>J&;q0*#09b;k&vi}y%>pxbOSk%o{(g)ACdw|1!p0TSCLF` z5t0QN7{{x~Ajk}G1u|0&L>rJ51JM>_b!6H>c0#g&q~Q)g4g%{59+10`caZlW1M&f4 z0{=iMR}5PooQ4uS@+aUtl&1aA84iXO03N{6X4tmCJve3!J3lCdS9fDca7u0)k3X@R&+DCI(d!9wvo=mIJTTkQf&clm-N2c!zwym?w&6i+A~neEao@ zdEudGN1%?qyuiB7#U)G@k|GDI?m?_wX%}`~=Vh8&t&9E8Jd$|UXMD&1=`@kp_%5JT z8_Bya%glZX2B6cnpShb6FT1KQp#h^&%8RoE(u$tbD3RFRjCSO%ufG?!Zd9~(^>~-o z5VMSg@v_lKZCoxc(JnS?$7ioo?zwv5$s=P`;#MJ485Mc82g`RpOAi;c69$Z4qRnPD zQf6ifXNn(t9L*2ge1_bQ(vAc_p>v z0}dBTF`l#N>;pTxALggu-hKYL(|B@em)~7yha1W3r_&Sm3s0FZfAY5}4Y1BV;Pcln z@3i}~GrQPxxS71ZIK9h7coN<`j{$E1$TNqnU{;TFKHocMIS!_61grJ^uPI6gw-KnsLw#vHhogf<@h%iiz$?!YY!a?E_sg9OTP%C~HH#ZO#YD zUAf=vm&FjZIE^LAWoyUZolACbHTZq?><|+n*Di>i z#N}v=DD0O+wIG-5r}9!+Ga;9JR?sSUB}*YM$X(27GVjzNH1P#j1T0dxA4WmtFQD&6 zcdn7DkIiLxEO`oolGHXZ=-Mb&qQlF+$7=0x2UM-c6KwwHlUZUKOT;Z!B4I%i;!W|| zM!jBldc@v-2S=NkX`OBeLAF*PHon~D+#z?ut0~+-8Dk2?MYzxgryptNNPESM*X~s5 zzzt_siLk30-mY<&A0s2Kk=_jJ;TrI z8NmUI*J4vq;hx##wQZ86oek~4fCyFe!}e=@X7J16E%<}Q4mY*{dzv{#mI|m?zB|Fg zABPq*AP`<31Lk)LaYfqcu;17S>LE3r9GFqUy;ldSE&EZ*d;ZIV@3a_Wh$LgTU+ zke>QaFZjIe%zQg+2Izo9+Iw*39V7}TD&qlBnv!AF^Y;Ubk)m}D!`u3C6EIrKn`oMK zeauLi{Q9bXttMnVF%-bfzXT2g^3}4-l(Xk;K9Gt~=rk(3)}iWgOHxi7C}q={9N?Z~ zSuOxfH( zlx{tXxsSqouAQ{DUZWYFqD%cWZdi@RBErm=MS?I5_JRldo`#D z`Au}0p)7(Bi-m#UP>VJ~-R3s}hq}BSy;vS;+Gh+`SQkj*Ow+T`mK23mgEJ%QBAUheThw2ET40l?#;}EZe?bdwN~N_4YIv+lSe_}vJ(Nc zLk)r5{D?FIlLm)@9=vBWmDX%N6hoq7h?-T>`=L<98bvLUw{OxssEJK-v(}^ntt(nDHcDrTO@w`<9deBV{kxyvdV_q*7d?q2$0<|@(MBcH1H=|kl4Na- za;3pxZ$(OFV_$CeYlB@hmSkF446SvSd4Oa^5?bLAx7@%G33&pj+acZrcoO7@>a2l| zl6eER6r^R`c_%FoNtgb!SY%hHXcH4j^|lBLal#K%e9)(lNBN!0I}ooW1t~vbge6T{4K}C`u@V@S7JXOv8mlr%bv|sK2=A3bAe6h1?ysaLpiZ; z>D;fJkK-5URV{hKoyN_WPg6c9-AGXdrVHH1)Wjli<)`-wUn8CzsI)@($rCkTY4VrrI{H3TUvepJ@r`zhY^~g@NK6HtjQcqo>)K^On&?>FtNCLQ zS)CUp`l7s0bghKXN4+6{Q)#S-SNgLmjUE(`j@@y>YVI#3Lmy&SXl^7QsFc;@nd%J^w z?KKgM&7Ms9Acm2W+LG${jp9gO^C-SGKyMGdz3){@pu9yr?J@8J`s;I&pM^o7r%wjA zDeaG{Yunl>JKE1?gom!R@qxeB@D_f*dO&RStn>?(kRXl9Hzp$#UOW7eGE^ZUxVrkU z#cywmqw>Xv#kW!ILNzK3$XD{9FH(3Z-*SvJlSxJNzbY(Rw^<32*_XcdFK8vFc2>=G zWi~tvblTiY=Ep<%p~3L`Dhzjw4l8HJ{r)%i{_0ynu=O6el0KH{ zhqqBOh;YU)@!@77NHx3#VrMzC@nslqnLqb$uqMK@xT2dSR=z)7iP}fOoV>&D7PR4s zq)gB7q~XDLP{v_z@e-bDNBQJX)`BN3KM+9n#u3Mz*-~a1bHF(C?b~j6Zy9SaVK0ke z?#O^KCdK5!LKEHMLql{0x?sH;!aC5RZz^r{4UzqPVz=I zCd7b6^LN46@$uzTorw~Lbd#-2`15}TVedTjuMZ{WXHizc?xmCaeTu8AVJkbQes_}I zw40sLxCOtCD`{#j#IOx;pqY44FTbd(D*Yw>M2slJ8pWhp5ccNL_85-$9L*GKK0CL z>~ABHpSADpJBEbCp)pxucD;OrgRXuY)gEfEi)eSkth@&9kKN>;whtB;#aMpQ!;@q5 zB8X;WbHR@t=-s0dpgz`jq%T zh3R={M=A571k}u2QJ>m~Pq}HWd8l)Gw#{b`=h5{-+GG{DzxN4CN>5%yw>HXUQfi( zH7s|b(Eze`d|&UFwFI^JM|j4xuo0vI97$6Pqe92-OsTa_`jY9bwcy||t)F5;quux; zVW&%R?X#V|i=dg)bq&4cM|H4@TZS1U-C)xp@zAb{i_Sz4F{$7Th|^ z*4Wrnro(%tU>9y+6667CCA7wX8XommV?3{5fva{acqDH2j!lZZ|AteIMLNJj#!9|E zcWc|1vNCTDkCcav)*RYCt-#3um~BCD!2eGknz;l*D&VS%_zV+HJybGLdO^u7qghA} zfyZZ+ew}neGe_Xg`R=Bztc8IL;(zu!mfI)2uyTdA#NtT-CZ4M+f@WZ!{(G!!k5_gT z6jXwZY2aXIx|IiT5L`;cG}K4P0an=3+)<(hrBgADs_>ek|0nL!;^v~}($gpBB2+}! z9p5~C755+B(LV$1WC^*{|6}V4PS+R4kW4HQ<|YVhQ(3NcXFIysMX9J{=lDo>kGQC| zxY)j?6R~hqFoZ)D;Rb$&Mo=XK;~V!XBHWzJ5Q>_oV~lUQxdsL~xu%xJsmm+B+zpLO z^|;>YqthmGodS*L2#Lw^l*V~$N{ZjqfXnI1tpEGT$~T9~k8jBnwGt1ypnNP$eZ5Uh zygkgVd_A3vr1ebxnQt6asm8BzZEOqJXaO-6MYzdYa$t%}108kFlFh&kn8;5ack@T! zh1zY{u))i8-1dO2Tx9DQXbQ-ii_NGdu>p*)NhGuPOdc0c4eqUW429f_zm2(Hn#kVc zk?0J@BZ-c zsNViS8kH0tA-xPf83*rCF7ztaB|5pfwn1K4ARQ?#ecJVWAM|X`M^4L;OL#j@I(I&3 zoqo=X1`>Wu1ImL1+~IO$euaS(&P(!Sa-cyi*dMe^(BP`4+J^AD9gUzjqI5Zx>oDji zmJU%0Iti%((A2q8E;$NEqhCotu(G|3DbQmwq(FR*F_SAn;RgLb!5C)~;Rt;!InD6+ z6&S}q#J@;c%vdBZZe4oE`*C)ir20|}(xqTn zt@>;AA@vQ?hEYB@iLz$&+A4+ahWVEC7Li5+h;7m~GnLvn{^tq>c3LjKW?7q?l-CrJ zhRyaXxRr^S{=pEWq|f=1!zgQ8izKqm@Sn@L(ma9ZBs2aJ0fC}_&E~aQGRx4leSxFD zt7|)85{6X;K^%`zU)L=#x5Q`30&Y{Cs_e~-Ym#2;Fi(BZEAs3+Z@V=)zHW8lg1~}5 z=^(-N7x#fR8BbGSWp{j<-mx#j-ZsQ;8M#8@o(T0Auzv<)hBdK-23HjzV5dPZ^2)Dg ze=T0YH><7pI5%wR@8E26c;9^XmS$Rk>I4E7YH5y8s?&68T5{YXg+FOxn#E>CdWP~< z+7yX_vSHRkudZH5Q;Muj1nF9sOr(z*B9uLGb3qqBZ)ecuu4?bfBL{C+g!@FelfGFI zuLTTr*%3HV0b0VbR;9oqJZp6>JNf{mecMH?Ko5%OFb3?jZg zfGs5SHLh6p7NhLyxooJYZ8D2Pfh!FZJW9l@&?h0aXH`RDZejqtC-GDsIJK+_Vt~A~ z=x!AgwOMUtidlx5ZK46qsJ1GDWY-=V7BnN#O$Jdx7)1STQ&y#G*`L@OF0Uzu6sGZ3 z>H(V&3zg--Bl32-Bq6F~b=JCe!!7`yAW;!i0pbb$38I$iH3}E4-hC%B#Xs0OF6C>5Q=~z zrC;N~6gzRvxWAwjo5=A5wKSdu++5JbhGv52PA+-C@~L4j6nEyYy`;ud+HaBV-234+*KcSW5`*A!Q#D6O<;7t;dOsf~WG8D%K> z+Z;zhXp&V2daTw#OZibo#&X?p^oewrmyC%~QaEIcB0!n7AjS#mYT^oT*%Yg-dhuQ5 z&LO7(`A{w?0rHbGJf_GuGd;3o$gu2&E5?Z>QSu)f3u9XJb!S#;u~}Cxg~0lly)IPdnSqTj!HsJlq-7+Ggrab!L&^|s0O#<_fsFW`JsD^!r#bg&lUfo z2?4#rE;775$Aguur>;+_buw+Abt^EjJ+olrR~dVfeKOcu_1wHit#V^l$5hKIV9X5tqRogN`B(SOsy-vwFb6s z<@(TWsD-4*A*?r*XX^AyMYPkGkXP+ZdoYMwmQ>2isU=5T; zyNHq?B1)eUkYmgmLaKuV*axbpZtVmK0XOnj3Acw!aW{kaXDs0+jSKVaSfMdNVw=r) zVgT&fDE3TGv-qouxlA82O^qfCkmX}FE` zOK)gXwu-(`kJR5HZGFch#DzgeOy)CK`fPo%?OD_69}{}_nse?M&{JX#e|_Rc%cK)< zz*R|D#b1AOE>5o=Mt5jSVN9Aeq+}=)Et=t@3wbwV`IY>xpQbNUqN@idi~}=E)H8B#Eax}{)s4QBo_Av%;T?KR(<1zKTP7b&j zm=nXp>3eS=%mNIHdT=U>sc9l6w=zB7WG69qelRSVZ+rK#K{|tyrKbb(F0QDEpBF`e zvtQp`zL-NMUHJw?HXbgsZ@{z%h#XMfaXXBk= zCp3f#wYQF#5C!xWZm|v_vNw5YbB{W8?v(=+p|f7m3i6c#$RNWAC8ih(Nh&FT!e3|? z;SvT4czvp8Ti0EGLrk#*Ucr0#3Mo+^7@<|(;op85I)}3_vff!%HX&QUpYhlHBhRbC zyrEkn6C%47UZEwF1^EeDXh(%CI+wbO>CN`;6PlV2C$eiUO*Z;IRYZA*RzM?wLlD3MhnGcu zijfGF>hAXSRA4q4SaqzbL$G8M$A^@gT?NCss0~I|e>SU(XXbQU479&ntuPkSgCQ(b zw-e;O4+)3}AZ`PykSO)p)S#}uj)PMaUe$VSP}f+nHcWPR1qr6l>@l`x6Hn# z)AVDzsNRdRb`J1=9|D7P={rOibmj!pI>{7oRjJt>!r)eki3ESTfW6*>8X5B9 zZ5TLh1;NN9sn&b2Xc5qX#6yz(fCP66U>=s&q-uh4_!97=O$4vxip^#SNJXZn2)%A6 zRuP-CnZghY9T$r2#h6oPMXrkcX1S`E{VOn2%VN8jMoSL86(`&zB#2T2r7Bp;DInzy z_r@s#oSNFgj`*f(VR(0UZ3nT1NV`=A zZQIWkU+uGyIW0`>cL0+vwaP=8rXP^B>l};;KR%;xRqnL){h(}sL&u>~&T=vXpM#og zmy$FaGZ%UPuZB>iNqt^bR(mA>a983(u&BlV<3TMPNjl42Jl@x}u+Rx&B!G7KmHwUG+jKQ|Nz7SwhH!j5Rp4#zD zl=ytl!G|bl&P@=5GU|mRfSzO;6oDL70)`Vs%^JzYJx3kB$|!2I<3eZvtV@+&1-|VK z8yqaetCTrd(Md{i%h0cE>3H0gq1zQ-2?Z1@ta%OQ)I`#Gv`t(>$lb)Fi{%V+Es;0` zt-zIKN9qtjpN7TY!0lip)C~Y7Z~$iH2<>1zE(n1|pcqBy>;q^l2r~5NB$l>*1OO7@ zMFF*q_0wBhtaV3s>L=Ia7p}>DDJVIBc_S9O)%?aLaHBbB9iJq24ElM@Gue_Aq_s;J zUCQFN8UQmn8zg%UJ@7bMv>fTXmm3NUiqi=mha$tbj#V(vY8HuHP>d0Ye-d*-aYV$c z>bz(`n%noB2q75!WGdlREGFH_MlcRR8iC#~L;;paOvfe4{b*GW-c1p_0#PuHhGe;x zHRCTpC?C)&6;t09f)i`02jHy5=#HIW_O4%sOpN9UY3uaa1g(3@2(Q>9R#s(uGt}{V z#qxpkta=p9JnvEBCCE^ z^!D_URas5m6eZVbpt(LTG7LQ{RH!+UBEs2f#DP31^D*F|JZK`2C?fBbZP7(2w>^+r z)G7%Qd->}pvDdT$=+EuRtmaTcMLc1W*9=pQLP+O_NrS#)ZUcU9KYarB(^FW=Wyhyi zICdQC$PydS$)jJCbhgVtP0LpI0}ChC`6$*0K9CYR+Bj)e8v2aRqo8c~BK9!i5tBmX zBz?DR|X_rNdWmX|K z30p_fQR`s*HsS}I=lT>(SkkoTMEK%pD2pxee7$b6oK&Ks;6RVH&7MYn0aWEuIUH(8 z7zIAG5SF|4d1eTx6B3K8V;Z}3PGofNKEd?1lR=0Rl%hphddPF8Wh9^xH>^XLa?V=W zcxsMM4hA@_a2yFfWp#hSPp2|ok@EOUH@cxiFp`}F#bb%tbe30MW}EPN8lNhCQProb zd$S(f8@Vxy{aLS{*tYa#DY-O~jP71w^)vrvoE)q8jI*s+^yT-sGwzOLBh6%uOB)@O zPda|r1=LK==vdA>a?^l`lzK{K)oBA>x*y10L@IFx(2EsgSOqA4gnOT#;-FwN+hF3IGN>`uXftmq)wu)P>7OK;M>#-6 z&=GINC8vaPX*zkCtp);lI%udj@c!@g@e$^l{xZrgQuD-*_BJ+dHF|@J_h(HNQ zL7J;lQG3O}a$Pn1t`BK(R)HiX`Uzf|mn8+NqPw}mv6^cDmw`jb$mP44hfDX?S=w`K zO50C5Xt@!a^9GZt&)`mDA2S{N7FQe zuRmXCUmgHLL-p=+=}7_f@8RGtc;mf}N?EjmjRu5I4I+b2zqDD-GQDfFGa%|187hin z%-&^WN-gfCHuT~Cpmkt>9S>=Bdz9nKKCbX0K9e>=hGlrk>5!`^k<@fm`eWMF_>xll z|MsL&%6gAwok4lDQ)6}_IgPaU+nGYrj*c93up>+)yS9qt*j86!$A~HX#{IMg3OWl} zwm`%Uq$D0Mp9wivJ%FzO;$G@S#Cu*rlHysGX;couD4D?efML zbt0@yMv3lj*h1c5PGjghWR7LmB`$jQ=F03cFEjN{3%_fS={m{LiJB|1GMZI*bc<;6 zcJ3lPYsH0636VZt*UEmIE~Zd>S&V{bom*8Pnnq9kdEQ1L*tDYW5ccSlmO(vAT@~F- z;@Jd1T&8>X9<9a6eK>_q2&=73wwO!sue zr!wY-fe;19LY~z=ndqZ!-e686ji-@1s~t1o=k?E3v`P6HVV~!j0bWGkq|Gs{_Q81N z7ws}rVr|pHQzu-NHg3at`zIvSXa?PM&`APUlIG1!9U?|2OFd+VIZMw^;r9#L5NYF< zq0=@yM2@1iF#BovZNCO@`tlHmyTaVDhFoWM@5bd9d?cBdXEWsPtgkeic1@?T5PJrP zV0;LOf++@4b$-S;$BZ+1ZIFyn!Z3_6!=*;*lAu%}Sbl^)Sz(wr2H{S~bYx60B?N|q z(6S|qp$YnhKenlRIjby&0)`>zvL%M=0=bdi>4Ypt@|{HPx)hAE2Gxd?Z!xNj;)D7g z`NHl>4gR?lEPMR$>yxC_SI7evU-^*kb}#z#>)RjwHTl~Gq5g#f+yAe9altIZ{#h`a z>sR;h-Mk(s{u^BjZFsA?WxSb!yocUQh^}g4>B*hhEeM@L;Y_J6xkJv08LY7mF#*I` z>o+hyMwM*B{3vG*iJud~bVcrcNo#F^pZ2ZZM+Hrpthwf9_*9fIA4r}$5@({6iRR9M zWqI2}^X$0!fvp?NQXiYUXPyD08}EjMW z$MrKA?|8Aq&U6E+Oa=LA%f#6{ZB$mStE^|)WuD5a{I;|35(lGi)eM=l!1mSVanB=* z2G~4$jLAK6xQ}47rF|?%yUF8*aCO4e@mtbxGXo!!(C14tNP_{(QAH!q7gz4e*(lA8 zo7}anq9&!b7RjlbNh})`6)*|;W5+?XBCLtq%TqNi4KW*0$o(SrI7Y3FC@naCtr1Gu zXkC(=HXPsWQ8=wQ1+5WEEly9PbijiFJ?- zV0=Um<<7B-1vtlXKH@ybImz-p@|(UR&P|+`L_Q+wW;;?I96!9i@LHg$7kr3gty*$B z7%I>%o8A{8z*|-*Lr?npKd&z+C_xOp*+PFRqS;ixH(V!WkxlUbzmm7r8 zrP-IB(sVbnuZ%RVeYWm04K&^`smAE7J^L7A4K~sUPQs}VDa9H>vEo`&e3n%hyyPA$ zXp!~e2rv|4(VDzbi)b~}j258PZ^H^gB@|{_4-gL5Yq-N?R?NW}LqH-gC%^;~RonmF zwkY6Pnb$c8Zs^XJatqy0`YH7KwFuobX*w=9y{@a4Z`r*xoUrS?9^fZpy1_?C5rxMeS@!SlAO+t80 zqqGyEpn%#b?kI7q@GaBU`JjWF(|r*B*>4j)lrO^34+?Z3J|0P*1x5`=(fvZEBO^t~ GC;$N0_xDr) literal 0 HcmV?d00001 diff --git a/_embed/public/css/roboto/normal-latin.woff2 b/_embed/public/css/roboto/normal-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..120796bb71997275eafef44818771a32bd857e12 GIT binary patch literal 14584 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 literal 0 HcmV?d00001 diff --git a/_embed/public/css/roboto/normal-vietnamese.woff2 b/_embed/public/css/roboto/normal-vietnamese.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7936b665b54003fab3aafced6d6ae16c751d3736 GIT binary patch literal 4896 zcmV+*6W{E2Pew8T0RR91023ep5&!@I04{U@0206e0ssI200000000000000000000 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 Stqovy*8;1vBH2AlK^6c6HeG@M literal 0 HcmV?d00001 diff --git a/_embed/public/css/styles.css b/_embed/public/css/styles.css new file mode 100644 index 00000000..eb9d8a5b --- /dev/null +++ b/_embed/public/css/styles.css @@ -0,0 +1,1207 @@ +body { + font-family: 'Roboto', sans-serif; + padding-top: 7.8em; + background-color: #f8f8f8; +} + +* { + box-sizing: border-box; +} + +*, +*:hover, +*:active, +*:focus { + outline: 0 +} + +a { + text-decoration: none; +} + +img { + max-width: 100%; +} + +audio, +video { + width: 100%; +} + +pre { + padding: 1em; + border: 1px solid #e6e6e6; + border-radius: 0.5em; + background-color: #f5f5f5; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; +} + +button { + border: 0; + padding: .5em 1em; + margin-left: .5em; + border-radius: .1em; + cursor: pointer; + background: #2196f3; + color: #fff; + border: 1px solid rgba(0, 0, 0, 0.05); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.05); + transition: .1s ease all; +} + +button:hover { + background-color: #1E88E5; +} + +.mobile-only { + display: none !important; +} + +.container { + width: 95%; + max-width: 960px; + margin: 1em auto 0; +} + +i.spin { + animation: 1s spin linear infinite; +} + +.pdf { + width: 100%; + height: calc(100vh - 13em); +} + + +/* * * * * * * * * * * * * * * * + * EDITOR * + * * * * * * * * * * * * * * * */ + +#editor .source { + display: none; +} + +#editor .content { + background: #fff; + padding: 1em 0; +} + +#editor #ace, +#editor h2, +#editor .frontmatter { + width: 95%; + max-width: 960px; + margin: 1em auto 0; +} + +#editor h2 { + margin: 1.5em auto 1em; + color: rgba(0, 0, 0, 0.3); + font-weight: 500; +} + +#editor .ace_gutter { + background-color: #fff; +} + + +/* * * * * * * * * * * * * * * * + * EDITOR - MARKDOWN * + * * * * * * * * * * * * * * * */ + +.frontmatter { + column-count: 3; + column-gap: 1em; + column-fill: balance; + /* display: flex; */ + /* flex-wrap: wrap; */ + /* justify-content: space-between; */ + /* flex-grow: 1; */ +} + +.frontmatter label { + display: block; + width: calc(100% - 1em); + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.frontmatter label, +.frontmatter h3 { + font-weight: 500; + margin: 0 0; + color: rgba(0, 0, 0, 0.6); +} + +.frontmatter input, +.frontmatter textarea { + display: block; + width: 100%; + border: 0; + margin-top: .5em; + padding: 0; + line-height: 1; +} + +.frontmatter .block, +.frontmatter fieldset[data-type="array"], +.button { + position: relative; + background: #fff; + border-radius: .2em; + border: 1px solid rgba(0, 0, 0, 0.075); + padding: .5em; + break-inside: avoid; + margin: 0 0 1em; + width: 100%; + display: inline-block; +} + +.frontmatter fieldset[data-type="object"] { + position: relative; + margin: 0; +} + +.frontmatter .button { + background-color: #2196f3; + color: #fff; + cursor: pointer; + text-align: center; +} + +[data-type="array-item"] { + position: relative; +} + +[data-type="array-item"] .action { + top: 0; + right: 0; +} + +.frontmatter textarea { + resize: none; +} + +[data-type="array-item"] input { + width: calc(100% - 1em); +} + +.block .action, +fieldset .action { + position: absolute; + top: .5em; + right: .5em; +} + +.block>.action, +fieldset>.action { + opacity: 0; +} + +.block:hover>.action, +fieldset:hover>.action { + opacity: 1; +} + +.block .action.add, +fieldset .action.add { + right: 1.5em; +} + +.frontmatter .action i { + padding: 0; + font-size: 1em; +} + +fieldset { + border: 0; + padding: 0; +} + +.frontmatter>fieldset h3, +.frontmatter>.group h3 { + font-size: 1.5em; + margin-bottom: .5em; +} + +fieldset h3, +.group h3 { + font-size: 0.9em; +} + + +/* * * * * * * * * * * * * * * * + * ACTION * + * * * * * * * * * * * * * * * */ + +.action { + display: inline-block; + cursor: pointer; + -webkit-transition: 0.2s ease all; + transition: 0.2s ease all; + border: 0; + margin: 0; + color: #546E7A; + border-radius: 50%; +} + +.action.disabled { + opacity: 0.2; + cursor: not-allowed; +} + +.action i { + padding: 0.4em; + -webkit-transition: 0.2s ease-in-out all; + transition: 0.2s ease-in-out all; + border-radius: 50%; +} + +.action:hover i { + background-color: rgba(0, 0, 0, .1); +} + +.action ul { + position: absolute; + top: 0; + color: #7d7d7d; + list-style: none; + margin: 0; + padding: 0; + flex-direction: column; + display: flex; +} + +.action ul li { + line-height: 1; + padding: .7em; + transition: .1s ease background-color; +} + +.action ul li:hover { + background-color: rgba(0, 0, 0, 0.04); +} + + +/* * * * * * * * * * * * * * * * + * NEW FILE/DIR * + * * * * * * * * * * * * * * * */ + +.floating { + position: fixed; + bottom: 1em; + right: 1em; +} + +.floating .action { + background-color: #2196f3 !important; + color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); +} + +#newdir { + position: fixed; + bottom: 1.3em; + right: 5em; + transition: .2s ease all; + opacity: 0; + border: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24); + padding: .5em; + width: 22em; + border-radius: .2em; +} + +#newdir.enabled { + opacity: 1; +} + + +/* * * * * * * * * * * * * * * * + * HEADER * + * * * * * * * * * * * * * * * */ + +header { + z-index: 1000; + background-color: #fff; + border-bottom: 1px solid rgba(0, 0, 0, 0.075); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + position: fixed; + top: 0; + left: 0; + width: 100%; + padding: 0; +} + +header a, +header a:hover { + color: inherit; +} + +header p i { + font-size: 1em !important; + color: rgba(255, 255, 255, .31); +} + +header>div { + display: flex; + width: 100%; + padding: 0.5em 0.5em 0.5em 1em; + align-items: center; +} + +header p { + display: inline-block; + margin: 0; + vertical-align: middle; +} + +header p a, +header p a:hover { + color: inherit; +} + +header .action span { + display: none; +} + +header>div div { + vertical-align: middle; + position: relative; +} + +#logout { + border-radius: 0; + margin-left: auto; + padding: .15em; +} + +#click-overlay { + display: none; + position: fixed; + cursor: pointer; + top: 0; + left: 0; + height: 100%; + width: 100%; +} + +#click-overlay.active { + display: block; +} + + +/* * * * * * * * * * * * * * * * + * TOP BAR * + * * * * * * * * * * * * * * * */ + +#top-bar { + height: 4em; +} + +#top-bar>div:nth-child(1) { + margin-right: 1em; + font-weight: 500; + font-size: 1.5em; + line-height: 2; +} + + +/* * * * * * * * * * * * * * * * + * SEARCH BAR * + * * * * * * * * * * * * * * * */ + +#search { + position: relative; + display: flex; + height: 100%; + padding: 0.75em; + vertical-align: middle; + border-radius: 0.3em; + background-color: #f5f5f5; + transition: .1s ease all; + width: 100%; + max-width: 25em; +} + +#search.active { + background-color: #fff; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); +} + +#search.active i, +#search.active input { + color: #212121; +} + +#search i, +#search input { + vertical-align: middle; +} + +#search i { + margin-right: 0.3em; + user-select: none; +} + +#search input { + width: 100%; + border: 0; + outline: 0; + background-color: transparent; +} + +#search.active div { + visibility: visible; + opacity: 1; + top: 100%; +} + +#search ul { + padding: 0; + margin: 0; + list-style: none; +} + +#search li { + margin-bottom: .5em; +} + +#search>div { + position: absolute; + top: 0; + width: 100%; + left: 0; + z-index: 999999; + background-color: #fff; + text-align: left; + color: #ccc; + box-shadow: 0 2px 3px rgba(0, 0, 0, .06), 0 2px 2px rgba(0, 0, 0, .12); + padding: .5em; + border-bottom-left-radius: .3em; + border-bottom-right-radius: .3em; + transition: .1s ease all; + visibility: hidden; + opacity: 0; + overflow-x: hidden; + overflow-y: auto; + max-height: 50vh; +} + +#search>div div { + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; +} + +#search>div p { + width: 100%; + text-align: center; + display: none; + margin: 0; + max-width: none; +} + +#search.ongoing p { + display: block; +} + +#search.active div i, +#sidebar #search.active div i { + color: #ccc; + text-align: center; + margin: 0 auto; + display: table; +} + +#search::-webkit-input-placeholder { + color: rgba(255, 255, 255, .5); +} + +#search:-moz-placeholder { + opacity: 1; + color: rgba(255, 255, 255, .5); +} + +#search::-moz-placeholder { + opacity: 1; + color: rgba(255, 255, 255, .5); +} + +#search:-ms-input-placeholder { + color: rgba(255, 255, 255, .5); +} + + +/* * * * * * * * * * * * * * * * + * BOTTOM BAR * + * * * * * * * * * * * * * * * */ + +#bottom-bar { + background-color: #fafafa; + border-top: 1px solid rgba(0, 0, 0, 0.075); + border-bottom: 1px solid rgba(0, 0, 0, 0.075); + height: 3.8em; +} + +#bottom-bar>div:first-child>* { + display: inline-block; + vertical-align: middle; +} + +#bottom-bar>div:first-child>i { + margin-right: .3em; +} + +#bottom-bar>*:first-child { + margin-right: auto; + max-width: calc(100% - 25em); + width: 100%; +} + +#bottom-bar p { + text-overflow: ellipsis; + overflow: hidden; + width: calc(100% - 3em); + white-space: nowrap; +} + +#more { + display: none; +} + +#file-only { + display: inline-block; + border-right: 1px solid rgba(0, 0, 0, 0.075); + padding-right: .3em; + margin-right: .3em; + transition: .2s ease opacity, visibility; + visibility: visible; +} + +#file-only.disabled { + opacity: 0; + visibility: hidden; +} + +#download ul.active { + top: 0; + right: 0; +} + +#more ul.active { + right: .5em; + top: 4.5em; +} + + +/* * * * * * * * * * * * * * * * + * DROPDOWN * + * * * * * * * * * * * * * * * */ + +.dropdown { + position: fixed; + top: -100%; + right: -100%; + visibility: hidden; + display: flex; + flex-direction: column; + border-radius: .1em; + border-top-left-radius: 0; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + background: #fff; + z-index: 9999999; +} + +.dropdown.active { + visibility: visible; +} + +.dropdown .action { + padding: .7em; +} + +.dropdown i { + padding: 0; + vertical-align: middle; +} + +.dropdown span { + display: inline-block; + margin-left: .5em; + font-size: .9em; +} + + +/* * * * * * * * * * * * * * * * + * BREADCRUMBS * + * * * * * * * * * * * * * * * */ + +#previous { + margin-left: -.5em; +} + +#breadcrumbs { + min-width: 7em; +} + +#breadcrumbs.active { + top: 0; + left: 0; + right: auto; +} + + +/* * * * * * * * * * * * * * * * + * LISTING * + * * * * * * * * * * * * * * * */ + +#listing { + max-width: calc(100% - 1.2em); + width: 100%; +} + +#listing h2 { + margin: 0 0 0 0.5em; + font-size: 1em; + color: rgba(0, 0, 0, 0.2); + font-weight: 500; +} + +#listing .item div:last-of-type * { + text-overflow: ellipsis; + overflow: hidden; +} + +#listing>div { + display: flex; + padding: 0; + flex-wrap: wrap; + justify-content: flex-start; + position: relative; +} + +#listing .item { + background-color: #fff; + position: relative; + display: flex; + flex-wrap: nowrap; + color: #6f6f6f; + transition: .1s ease all; + align-items: center; + cursor: pointer; +} + +#listing .item div:last-of-type { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +#listing .item p { + margin: 0; +} + +#listing .item .size, +#listing .item .modified { + font-size: 0.9em; +} + +#listing .item .name { + font-weight: bold; +} + +#listing .item i { + font-size: 4em; + margin-right: 0.1em; + vertical-align: bottom; +} + +#listing h2.message, +.message { + text-align: center; + font-size: 3em; + margin: 1em auto; + display: block !important; + width: 95%; + color: rgba(0, 0, 0, 0.2); + font-weight: 500; +} + +.message i { + font-size: inherit; + vertical-align: middle; +} + + +/* * * * * * * * * * * * * * * * + * LISTING - MOSAIC * + * * * * * * * * * * * * * * * */ + +#listing.mosaic { + margin-top: 1em; +} + +#listing.mosaic .item { + width: calc(33% - 1em); + margin: .5em; + padding: 0.5em; + border-radius: 0.2em; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); +} + +#listing.mosaic .item:hover { + box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24) !important; +} + +#listing.mosaic .header { + display: none; +} + +#listing.mosaic .item div:first-of-type { + width: 5em; +} + +#listing.mosaic .item div:last-of-type { + width: calc(100% - 5vw); +} + + +/* * * * * * * * * * * * * * * * + * LISTING - DETAIL * + * * * * * * * * * * * * * * * */ + +#listing.list { + flex-direction: column; + padding-top: 3.25em; + width: 100%; + max-width: 100%; + margin: 0; +} + +#listing.list .item { + width: 100%; + margin: 0; + border: 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + padding: 1em; +} + +#listing.list h2 { + display: none; +} + +#listing .item[aria-selected=true] { + background: #2196f3 !important; + color: #fff !important; +} + +#listing.list .item div:first-of-type { + width: 3em; +} + +#listing.list .item div:first-of-type i { + font-size: 2em; +} + +#listing.list .item div:last-of-type { + width: calc(100% - 3em); + display: flex; + align-items: center; +} + +#listing.list .item .name { + width: 50%; +} + +#listing.list .item .size { + width: 25%; +} + +#listing .item.header { + display: none !important; + background-color: #ccc; +} + +#listing.list .header i { + font-size: 1.5em; + vertical-align: middle; + margin-left: .2em; +} + +#listing.list .item.header { + display: flex !important; + background: #fafafa; + position: fixed; + width: 100%; + top: 7.8em; + left: 0; + z-index: 999; + padding: .85em; +} + +#listing.list .item.header>div:first-child { + width: 0; +} + +#listing.list .item.header .name { + margin-right: 3em; +} + +#listing.list .header { + display: flex; + background: #fafafa; + position: fixed; + width: 100%; + top: 7.8em; + left: 0; + z-index: 999; +} + +#listing.list .header a { + color: inherit; +} + +#listing.list .item.header>div:first-child { + width: 0; +} + +#listing.list .name { + font-weight: normal; +} + +#listing.list .item.header .name { + margin-right: 3em; +} + +#listing.list .header span { + vertical-align: middle; +} + +#listing.list .header i { + opacity: 0; + transition: .1s ease all; +} + +#listing.list .header p:hover i, +#listing.list .header .active i { + opacity: 1; +} + +#listing.list .item.header .active { + font-weight: bold; +} + + +/* * * * * * * * * * * * * * * * + * MULTIPLE SELECTION DIALOG * + * * * * * * * * * * * * * * * */ + +#multiple-selection { + position: fixed; + bottom: -4em; + left: 0; + z-index: 99999999; + width: 100%; + background-color: #2196f3; + height: 4em; + display: flex !important; + padding: 0.5em 0.5em 0.5em 1em; + justify-content: space-between; + align-items: center; + transition: .2s ease all; +} + +#multiple-selection.active { + bottom: 0; +} + +#multiple-selection * { + margin: 0; +} + +#multiple-selection p, +#multiple-selection i { + color: #fff; +} + + +/* * * * * * * * * * * * * * * * + * PROMPT * + * * * * * * * * * * * * * * * */ + +.overlay, +.prompt, +.help { + opacity: 0; + z-index: -1; + transition: .1s ease opacity, z-index; +} + +.overlay.active, +.prompt.active, +.help.active { + z-index: 9999999; + opacity: 1; +} + +.overlay { + background-color: rgba(0, 0, 0, 0.5); + position: fixed; + top: 0; + left: 0; + height: 0; + width: 0; +} + +.overlay.active { + height: 100%; + width: 100%; +} + +.prompt, +.help { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 99999999; + background: #fff; + border: 1px solid rgba(0, 0, 0, 0.075); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + padding: 2em; + max-width: 25em; + width: 90%; + max-height: 95%; +} + +.prompt h3, +.help h3 { + margin: 0; + font-weight: 500; + font-size: 1.5em; +} + +.prompt p, +.help p { + font-size: .9em; + color: rgba(0, 0, 0, 0.8); + margin: .5em 0 1em; +} + +.prompt input { + width: 100%; + border: 1px solid #dadada; + line-height: 1; + padding: .3em; +} + +.prompt code { + word-wrap: break-word; +} + +.prompt div, +.help div { + margin-top: 1em; + display: flex; + justify-content: flex-start; + flex-direction: row-reverse; +} + +.prompt .cancel { + background-color: #ECEFF1; + color: #37474F; +} + +.prompt .cancel:hover { + background-color: #e9eaeb; +} + + +/* * * * * * * * * * * * * * * * + * PROMPT - MOVE * + * * * * * * * * * * * * * * * */ + +.prompt .file-list { + flex-direction: initial; + max-height: 50vh; + overflow: auto; +} + +.prompt .file-list ul { + list-style: none; + margin: 0; + padding: 0; + width: 100%; +} + +.prompt .file-list ul li { + width: 100%; + user-select: none; +} + +.prompt .file-list ul li[aria-selected=true] { + background: #2196f3 !important; + color: #fff !important; + transition: .1s ease all; +} + +.prompt .file-list ul li:hover { + background-color: #e9eaeb; + cursor: pointer; +} + +.prompt .file-list ul li:before { + content: "folder"; + color: #6f6f6f; + vertical-align: middle; + padding: 0 .25em; + line-height: 2em; +} + +.prompt .file-list ul li[aria-selected=true]:before { + color: white; +} + + +/* * * * * * * * * * * * * * * * + * HELP * + * * * * * * * * * * * * * * * */ + +.help { + max-width: 24em; + visibility: hidden; + top: -100%; + left: -100%; +} + +.help.active { + visibility: visible; + top: 50%; + left: 50%; +} + +.help ul { + padding: 0; + margin: 1em 0; + list-style: none; +} + + +/* * * * * * * * * * * * * * * * + * FOOTER * + * * * * * * * * * * * * * * * */ + +footer { + font-size: 0.6em; + margin: 2em 0 2em; + text-align: center; + color: grey; +} + +footer a, +footer a:hover { + color: inherit; +} + + +/* * * * * * * * * * * * * * * * + * MEDIA QUERIES * + * * * * * * * * * * * * * * * */ + +@media screen and (max-width: 850px) { + .frontmatter { + column-count: 2; + } +} + +@media screen and (max-width: 650px) { + body { + transition: .2s ease padding; + } + .mobile-only { + display: inherit !important; + } + #top-bar>div:nth-child(1) { + display: none; + } + #bottom-bar>*:first-child { + max-width: calc(100% - 16em) !important; + } + #main-actions { + position: fixed; + top: -100%; + right: -100%; + visibility: hidden; + display: flex; + flex-direction: column; + border-radius: .1em; + border-top-left-radius: 0; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + background: #fff; + z-index: 9999999; + } + #main-actions.active { + right: .5em; + top: 4.5em; + visibility: visible; + } + #main-actions .action { + padding: .7em; + border-radius: 0; + align-items: center; + } + #main-actions .action:hover { + background-color: rgba(0, 0, 0, 0.04); + } + #main-actions i { + padding: 0; + vertical-align: middle; + } + #main-actions .action:hover i { + padding: 0; + background-color: transparent; + } + #main-actions span { + display: inline-block; + margin-left: .5em; + font-size: .9em; + } + #listing.list .item .size, + #listing.list .item .modified { + display: none; + } + #listing.list .item .name { + width: 100%; + } + .frontmatter { + column-count: 1; + } +} + +@media screen and (max-width: 450px) { + #bottom-bar p { + display: none !important; + } +} + + +/* * * * * * * * * * * * * * * * + * ANIMATIONS * + * * * * * * * * * * * * * * * */ + +@keyframes spin { + 100% { + -webkit-transform: rotate(-360deg); + transform: rotate(-360deg); + } +} diff --git a/_embed/public/js/common.js b/_embed/public/js/common.js new file mode 100644 index 00000000..76cae2a3 --- /dev/null +++ b/_embed/public/js/common.js @@ -0,0 +1,685 @@ +'use strict' + +var tempID = '_fm_internal_temporary_id' +var ssl = (window.location.protocol === 'https:') +var templates = {} +var selectedItems = [] +var overlay +var clickOverlay + +// Removes an element, if exists, from an array +Array.prototype.removeElement = function (element) { + var i = this.indexOf(element) + if (i !== -1) { + this.splice(i, 1) + } +} + +// Replaces an element inside an array by another +Array.prototype.replaceElement = function (oldElement, newElement) { + var i = this.indexOf(oldElement) + if (i !== -1) { + this[i] = newElement + } +} + +// Sends a costum event to itself +Document.prototype.sendCostumEvent = function (text) { + this.dispatchEvent(new window.CustomEvent(text)) +} + +// Gets the content of a cookie +Document.prototype.getCookie = function (name) { + var re = new RegExp('(?:(?:^|.*;\\s*)' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$') + return document.cookie.replace(re, '$1') +} + +// Remove the last directory of an url +var removeLastDirectoryPartOf = function (url) { + var arr = url.split('/') + if (arr.pop() === '') { + arr.pop() + } + return (arr.join('/')) +} + +function getCSSRule (rules) { + for (let i = 0; i < rules.length; i++) { + rules[i] = rules[i].toLowerCase() + } + + let result = null + let find = Array.prototype.find + + find.call(document.styleSheets, styleSheet => { + result = find.call(styleSheet.cssRules, cssRule => { + let found = false + + if (cssRule instanceof CSSStyleRule) { + for (let i = 0; i < rules.length; i++) { + if (cssRule.selectorText.toLowerCase() === rules[i]) { + found = true + } + } + } + + return found + }) + + return result != null + }) + + return result +} + +/* * * * * * * * * * * * * * * * + * * + * BUTTONS * + * * + * * * * * * * * * * * * * * * */ +var buttons = { + previousState: {} +} + +buttons.setLoading = function (name) { + if (typeof this[name] === 'undefined') return + let i = this[name].querySelector('i') + + this.previousState[name] = i.innerHTML + i.style.opacity = 0 + + setTimeout(function () { + i.classList.add('spin') + i.innerHTML = 'autorenew' + i.style.opacity = 1 + }, 200) +} + +// Changes an element to done animation +buttons.setDone = function (name, success = true) { + let i = this[name].querySelector('i') + + i.style.opacity = 0 + + let thirdStep = () => { + i.innerHTML = this.previousState[name] + i.style.opacity = null + + if (selectedItems.length === 0 && document.getElementById('listing')) { + document.sendCostumEvent('changed-selected') + } + } + + let secondStep = () => { + i.style.opacity = 0 + setTimeout(thirdStep, 200) + } + + let firstStep = () => { + i.classList.remove('spin') + i.innerHTML = success + ? 'done' + : 'close' + i.style.opacity = 1 + setTimeout(secondStep, 1000) + } + + setTimeout(firstStep, 200) + return false +} + +/* * * * * * * * * * * * * * * * + * * + * WEBDAV * + * * + * * * * * * * * * * * * * * * */ +var webdav = {} + +webdav.convertURL = function (url) { + return window.location.origin + url.replace(baseURL + '/', webdavURL + '/') +} + +webdav.move = function (oldLink, newLink) { + return new Promise((resolve, reject) => { + let request = new window.XMLHttpRequest() + let destination = newLink.replace(baseURL + '/', webdavURL + '/') + + destination = window.location.origin + destination.substring(prefixURL.length) + + request.open('MOVE', webdav.convertURL(oldLink), true) + request.setRequestHeader('Destination', destination) + request.onload = () => { + if (request.status === 201 || request.status === 204) { + resolve() + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send() + }) +} + +webdav.put = function (link, body, headers = {}) { + return new Promise((resolve, reject) => { + let request = new window.XMLHttpRequest() + request.open('PUT', webdav.convertURL(link), true) + + for (let key in headers) { + request.setRequestHeader(key, headers[key]) + } + + request.onload = () => { + if (request.status == 201) { + resolve() + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send(body) + }) +} + +webdav.propfind = function (link, body, headers = {}) { + return new Promise((resolve, reject) => { + let request = new window.XMLHttpRequest() + request.open('PROPFIND', webdav.convertURL(link), true) + + for (let key in headers) { + request.setRequestHeader(key, headers[key]) + } + + request.onload = () => { + if (request.status < 300) { + resolve(request.responseText) + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send(body) + }) +} + +webdav.delete = function (link) { + return new Promise((resolve, reject) => { + let request = new window.XMLHttpRequest() + request.open('DELETE', webdav.convertURL(link), true) + request.onload = () => { + if (request.status === 204) { + resolve() + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send() + }) +} + +webdav.new = function (link) { + return new Promise((resolve, reject) => { + let request = new window.XMLHttpRequest() + request.open((link.endsWith('/') ? 'MKCOL' : 'PUT'), webdav.convertURL(link), true) + request.onload = () => { + if (request.status === 201) { + resolve() + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send() + }) +} + +/* * * * * * * * * * * * * * * * + * * + * EVENTS * + * * + * * * * * * * * * * * * * * * */ +function closePrompt (event) { + let prompt = document.querySelector('.prompt') + + if (!prompt) return + + if (typeof event !== 'undefined') { + event.preventDefault() + } + + document.querySelector('.overlay').classList.remove('active') + prompt.classList.remove('active') + + setTimeout(() => { + prompt.remove() + }, 100) +} + +function notImplemented (event) { + event.preventDefault() + clickOverlay.click() + + let clone = document.importNode(templates.message.content, true) + clone.querySelector('h3').innerHTML = 'Not implemented' + clone.querySelector('p').innerHTML = "Sorry, but this feature wasn't implemented yet." + + document.querySelector('body').appendChild(clone) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') +} + +// Prevent Default event +var preventDefault = function (event) { + event.preventDefault() +} + +function logoutEvent (event) { + let request = new window.XMLHttpRequest() + request.open('GET', window.location.pathname, true, 'username', 'password') + request.send() + request.onreadystatechange = function () { + if (request.readyState === 4) { + window.location = '/' + } + } +} + +function openEvent (event) { + if (event.currentTarget.classList.contains('disabled')) { + return false + } + + let link = '?raw=true' + + if (selectedItems.length) { + link = document.getElementById(selectedItems[0]).dataset.url + link + } else { + link = window.location.pathname + link + } + + window.open(link) + return false +} + +function getHash (event, hash) { + event.preventDefault() + + let request = new window.XMLHttpRequest() + let link + + if (selectedItems.length) { + link = document.getElementById(selectedItems[0]).dataset.url + } else { + link = window.location.pathname + } + + request.open('GET', `${link}?checksum=${hash}`, true) + + request.onload = () => { + if (request.status >= 300) { + console.log(request.statusText) + return + } + event.target.parentElement.innerHTML = request.responseText + } + request.onerror = (e) => console.log(e) + request.send() +} + +function infoEvent (event) { + event.preventDefault() + if (event.currentTarget.classList.contains('disabled')) { + return + } + + let dir = false + let link + + if (selectedItems.length) { + link = document.getElementById(selectedItems[0]).dataset.url + dir = document.getElementById(selectedItems[0]).dataset.dir + } else { + if (document.getElementById('listing') !== null) { + dir = true + } + + link = window.location.pathname + } + + buttons.setLoading('info', false) + + webdav.propfind(link) + .then((text) => { + let parser = new window.DOMParser() + let xml = parser.parseFromString(text, 'text/xml') + let clone = document.importNode(templates.info.content, true) + + let value = xml.getElementsByTagName('displayname') + if (value.length > 0) { + clone.getElementById('display_name').innerHTML = value[0].innerHTML + } else { + clone.getElementById('display_name').innerHTML = xml.getElementsByTagName('D:displayname')[0].innerHTML + } + + value = xml.getElementsByTagName('getcontentlength') + if (value.length > 0) { + clone.getElementById('content_length').innerHTML = value[0].innerHTML + } else { + clone.getElementById('content_length').innerHTML = xml.getElementsByTagName('D:getcontentlength')[0].innerHTML + } + + value = xml.getElementsByTagName('getlastmodified') + if (value.length > 0) { + clone.getElementById('last_modified').innerHTML = value[0].innerHTML + } else { + clone.getElementById('last_modified').innerHTML = xml.getElementsByTagName('D:getlastmodified')[0].innerHTML + } + + if (dir === true || dir === 'true') { + clone.querySelector('.file-only').style.display = 'none' + } + + document.querySelector('body').appendChild(clone) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') + buttons.setDone('info', true) + }) + .catch(e => { + buttons.setDone('info', false) + console.log(e) + }) +} + +function deleteOnSingleFile () { + closePrompt() + buttons.setLoading('delete') + + webdav.delete(window.location.pathname) + .then(() => { + window.location.pathname = removeLastDirectoryPartOf(window.location.pathname) + }) + .catch(e => { + buttons.setDone('delete', false) + console.log(e) + }) +} + +function deleteOnListing () { + closePrompt() + buttons.setLoading('delete') + + let promises = [] + + for (let id of selectedItems) { + promises.push(webdav.delete(document.getElementById(id).dataset.url)) + } + + Promise.all(promises) + .then(() => { + listing.reload() + buttons.setDone('delete') + }) + .catch(e => { + console.log(e) + buttons.setDone('delete', false) + }) +} + +// Handles the delete button event +function deleteEvent (event) { + let single = false + + if (!selectedItems.length) { + selectedItems = ['placeholder'] + single = true + } + + let clone = document.importNode(templates.question.content, true) + clone.querySelector('h3').innerHTML = 'Delete files' + + if (single) { + clone.querySelector('form').addEventListener('submit', deleteOnSingleFile) + clone.querySelector('p').innerHTML = `Are you sure you want to delete this file/folder?` + } else { + clone.querySelector('form').addEventListener('submit', deleteOnListing) + clone.querySelector('p').innerHTML = `Are you sure you want to delete ${selectedItems.length} file(s)?` + } + + clone.querySelector('input').remove() + clone.querySelector('.ok').innerHTML = 'Delete' + + document.body.appendChild(clone) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') + + return false +} + +function resetSearchText () { + let box = document.querySelector('#search > div div') + + if (user.AllowCommands) { + box.innerHTML = `Search or use one of your supported commands: ${user.Commands.join(", ")}.` + } else { + box.innerHTML = 'Type and press enter to search.' + } +} + +function searchEvent (event) { + if (this.value.length === 0) { + resetSearchText() + return + } + + let value = this.value, + search = document.getElementById('search'), + scrollable = document.querySelector('#search > div'), + box = document.querySelector('#search > div div'), + pieces = value.split(' '), + supported = false + + user.Commands.forEach(function (cmd) { + if (cmd == pieces[0]) { + supported = true + } + }) + + if (!supported || !user.AllowCommands) { + box.innerHTML = 'Press enter to search.' + } else { + box.innerHTML = 'Press enter to execute.' + } + + if (event.keyCode === 13) { + box.innerHTML = '' + search.classList.add('ongoing') + + let url = window.location.host + window.location.pathname + + if (document.getElementById('editor')) { + url = removeLastDirectoryPartOf(url) + } + + let protocol = ssl ? 'wss:' : 'ws:' + + if (supported && user.AllowCommands) { + let conn = new window.WebSocket(`${protocol}//${url}?command=true`) + + conn.onopen = function () { + conn.send(value) + } + + conn.onmessage = function (event) { + box.innerHTML = event.data + scrollable.scrollTop = scrollable.scrollHeight + } + + conn.onclose = function (event) { + search.classList.remove('ongoing') + listing.reload() + } + + return + } + + box.innerHTML = '
    ' + + let ul = box.querySelector('ul') + let conn = new window.WebSocket(`${protocol}//${url}?search=true`) + + conn.onopen = function () { + conn.send(value) + } + + conn.onmessage = function (event) { + ul.innerHTML += '
  • ' + event.data + '
  • ' + scrollable.scrollTop = scrollable.scrollHeight + } + + conn.onclose = function (event) { + search.classList.remove('ongoing') + } + } +} + +function setupSearch () { + let search = document.getElementById('search') + let searchInput = search.querySelector('input') + let searchDiv = search.querySelector('div') + let hover = false + let focus = false + + resetSearchText() + + searchInput.addEventListener('focus', event => { + focus = true + search.classList.add('active') + }) + + searchDiv.addEventListener('mouseover', event => { + hover = true + search.classList.add('active') + }) + + searchInput.addEventListener('blur', event => { + focus = false + if (hover) return + search.classList.remove('active') + }) + + search.addEventListener('mouseleave', event => { + hover = false + if (focus) return + search.classList.remove('active') + }) + + search.addEventListener('click', event => { + search.classList.add('active') + search.querySelector('input').focus() + }) + + searchInput.addEventListener('keyup', searchEvent) +} + +function closeHelp (event) { + event.preventDefault() + + document.querySelector('.help').classList.remove('active') + document.querySelector('.overlay').classList.remove('active') +} + +function openHelp (event) { + closePrompt(event) + + document.querySelector('.help').classList.add('active') + document.querySelector('.overlay').classList.add('active') +} + +window.addEventListener('keydown', (event) => { + if (event.keyCode === 27) { + if (document.querySelector('.help.active')) { + closeHelp(event) + } + } + + if (event.keyCode === 46) { + deleteEvent(event) + } + + if (event.keyCode === 112) { + event.preventDefault() + openHelp(event) + } +}) + +/* * * * * * * * * * * * * * * * + * * + * BOOTSTRAP * + * * + * * * * * * * * * * * * * * * */ + +document.addEventListener('DOMContentLoaded', function (event) { + overlay = document.querySelector('.overlay') + clickOverlay = document.querySelector('#click-overlay') + + buttons.logout = document.getElementById('logout') + buttons.open = document.getElementById('open') + buttons.delete = document.getElementById('delete') + buttons.previous = document.getElementById('previous') + buttons.info = document.getElementById('info') + + // Attach event listeners + buttons.logout.addEventListener('click', logoutEvent) + buttons.open.addEventListener('click', openEvent) + buttons.info.addEventListener('click', infoEvent) + + templates.question = document.querySelector('#question-template') + templates.info = document.querySelector('#info-template') + templates.message = document.querySelector('#message-template') + templates.move = document.querySelector('#move-template') + + if (user.AllowEdit) { + buttons.delete.addEventListener('click', deleteEvent) + } + + let dropdownButtons = document.querySelectorAll('.action[data-dropdown]') + Array.from(dropdownButtons).forEach(button => { + button.addEventListener('click', event => { + button.querySelector('ul').classList.toggle('active') + clickOverlay.classList.add('active') + + clickOverlay.addEventListener('click', event => { + button.querySelector('ul').classList.remove('active') + clickOverlay.classList.remove('active') + }) + }) + }) + + overlay.addEventListener('click', event => { + if (document.querySelector('.help.active')) { + closeHelp(event) + return + } + + closePrompt(event) + }) + + let mainActions = document.getElementById('main-actions') + + document.getElementById('more').addEventListener('click', event => { + event.preventDefault() + event.stopPropagation() + + clickOverlay.classList.add('active') + mainActions.classList.add('active') + + clickOverlay.addEventListener('click', event => { + mainActions.classList.remove('active') + clickOverlay.classList.remove('active') + }) + }) + + setupSearch() + return false +}) diff --git a/_embed/public/js/editor.js b/_embed/public/js/editor.js new file mode 100644 index 00000000..38ff40c7 --- /dev/null +++ b/_embed/public/js/editor.js @@ -0,0 +1,278 @@ +'use strict' + +var editor = {} + +editor.textareaAutoGrow = function () { + let autogrow = function () { + console.log(this.style.height) + this.style.height = 'auto' + this.style.height = (this.scrollHeight) + 'px' + } + + let textareas = document.getElementsByTagName('textarea') + + let addAutoGrow = () => { + Array.from(textareas).forEach(textarea => { + autogrow.bind(textarea)() + textarea.addEventListener('keyup', autogrow) + }) + } + + addAutoGrow() + window.addEventListener('resize', addAutoGrow) +} + +editor.toggleSourceEditor = function (event) { + event.preventDefault() + + if (document.querySelector('[data-kind="content-only"]')) { + window.location = window.location.pathname + '?visual=true' + return + } + + window.location = window.location.pathname + '?visual=false' +} + +function deleteFrontMatterItem (event) { + event.preventDefault() + document.getElementById(this.dataset.delete).remove() +} + +function makeFromBaseTemplate (id, type, name, parent) { + let clone = document.importNode(templates.base.content, true) + clone.querySelector('fieldset').id = id + clone.querySelector('fieldset').dataset.type = type + clone.querySelector('h3').innerHTML = name + clone.querySelector('.delete').dataset.delete = id + clone.querySelector('.delete').addEventListener('click', deleteFrontMatterItem) + clone.querySelector('.add').addEventListener('click', addFrontMatterItem) + + if (parent.classList.contains('frontmatter')) { + parent.insertBefore(clone, document.querySelector('div.button.add')) + return + } + + parent.appendChild(clone) +} + +function makeFromArrayItemTemplate (id, number, parent) { + let clone = document.importNode(templates.arrayItem.content, true) + clone.querySelector('[data-type="array-item"]').id = `${id}-${number}` + clone.querySelector('input').name = id + clone.querySelector('input').id = id + clone.querySelector('div.action').dataset.delete = `${id}-${number}` + clone.querySelector('div.action').addEventListener('click', deleteFrontMatterItem) + parent.querySelector('.group').appendChild(clone) + document.getElementById(`${id}-${number}`).querySelector('input').focus() +} + +function makeFromObjectItemTemplate (id, name, parent) { + let clone = document.importNode(templates.objectItem.content, true) + clone.querySelector('.block').id = `block-${id}` + clone.querySelector('.block').dataset.content = id + clone.querySelector('label').for = id + clone.querySelector('label').innerHTML = name + clone.querySelector('input').name = id + clone.querySelector('input').id = id + clone.querySelector('.action').dataset.delete = `block-${id}` + clone.querySelector('.action').addEventListener('click', deleteFrontMatterItem) + + parent.appendChild(clone) + document.getElementById(id).focus() +} + +function addFrontMatterItemPrompt (parent) { + return function (event) { + event.preventDefault() + + let value = event.currentTarget.querySelector('input').value + if (value === '') { + return true + } + + closePrompt(event) + + let name = value.substring(0, value.lastIndexOf(':')), + type = value.substring(value.lastIndexOf(':') + 1, value.length) + + if (type !== '' && type !== 'array' && type !== 'object') { + name = value + } + + name = name.replace(' ', '_') + + let id = name + + if (parent.id != '') { + id = parent.id + '.' + id + } + + if (type == 'array' || type == 'object') { + if (parent.dataset.type == 'parent') { + makeFromBaseTemplate(id, type, name, document.querySelector('.frontmatter')) + return + } + + makeFromBaseTemplate(id, type, name, block) + return + } + + let group = parent.querySelector('.group') + + if (group == null) { + parent.insertAdjacentHTML('afterbegin', '
    ') + group = parent.querySelector('.group') + } + + makeFromObjectItemTemplate(id, name, group) + } +} + +function addFrontMatterItem (event) { + event.preventDefault() + + let parent = event.currentTarget.parentNode, + type = parent.dataset.type + + // If the block is an array + if (type === 'array') { + let id = parent.id + '[]', + count = parent.querySelectorAll('.group > div').length, + fieldsets = parent.getElementsByTagName('fieldset') + + if (fieldsets.length > 0) { + let itemType = fieldsets[0].dataset.type, + itemID = parent.id + '[' + fieldsets.length + ']', + itemName = fieldsets.length + + makeFromBaseTemplate(itemID, itemType, itemName, parent) + } else { + makeFromArrayItemTemplate(id, count, parent) + } + + return + } + + if (type == 'object' || type == 'parent') { + let clone = document.importNode(templates.question.content, true) + clone.querySelector('form').id = tempID + clone.querySelector('h3').innerHTML = 'New field' + clone.querySelector('p').innerHTML = 'Write the field name and then press enter. If you want to create an array or an object, end the name with :array or :object.' + clone.querySelector('.ok').innerHTML = 'Create' + clone.querySelector('form').addEventListener('submit', addFrontMatterItemPrompt(parent)) + clone.querySelector('form').classList.add('active') + document.querySelector('body').appendChild(clone) + + document.querySelector('.overlay').classList.add('active') + document.getElementById(tempID).classList.add('active') + } + + return false +} + +document.addEventListener('DOMContentLoaded', (event) => { + if (!document.getElementById('editor')) return + + editor.textareaAutoGrow() + + templates.arrayItem = document.getElementById('array-item-template') + templates.base = document.getElementById('base-template') + templates.objectItem = document.getElementById('object-item-template') + templates.temporary = document.getElementById('temporary-template') + + buttons.save = document.querySelector('#save') + buttons.editSource = document.querySelector('#edit-source') + + if (buttons.editSource) { + buttons.editSource.addEventListener('click', editor.toggleSourceEditor) + } + + let container = document.getElementById('editor'), + kind = container.dataset.kind, + rune = container.dataset.rune + + if (kind != 'frontmatter-only') { + let editor = document.querySelector('.content #ace'), + mode = editor.dataset.mode, + textarea = document.querySelector('textarea[name="content"]'), + aceEditor = ace.edit('ace'), + options = { + wrap: true, + maxLines: Infinity, + theme: 'ace/theme/github', + showPrintMargin: false, + fontSize: '1em', + minLines: 20 + } + + aceEditor.getSession().setMode('ace/mode/' + mode) + aceEditor.getSession().setValue(textarea.value) + aceEditor.getSession().on('change', function () { + textarea.value = aceEditor.getSession().getValue() + }) + + if (mode == 'markdown') options.showGutter = false + aceEditor.setOptions(options) + } + + let deleteFrontMatterItemButtons = document.getElementsByClassName('delete') + Array.from(deleteFrontMatterItemButtons).forEach(button => { + button.addEventListener('click', deleteFrontMatterItem) + }) + + let addFrontMatterItemButtons = document.getElementsByClassName('add') + Array.from(addFrontMatterItemButtons).forEach(button => { + button.addEventListener('click', addFrontMatterItem) + }) + + let saveContent = function () { + let data = form2js(document.querySelector('form')) + + if (typeof data.content === 'undefined' && kind !== 'frontmatter-only') { + data.content = '' + } + + if (typeof data.content === 'number') { + data.content = data.content.toString() + } + + let request = new XMLHttpRequest() + + buttons.setLoading('save') + + webdav.put(window.location.pathname, JSON.stringify(data), { + 'Kind': kind, + 'Rune': rune + }) + .then(() => { + buttons.setDone('save') + }) + .catch(e => { + console.log(e) + buttons.setDone('save', false) + }) + } + + document.querySelector('#save').addEventListener('click', event => { + event.preventDefault() + saveContent() + }) + + document.querySelector('form').addEventListener('submit', (event) => { + event.preventDefault() + saveContent() + }) + + window.addEventListener('keydown', (event) => { + if (event.ctrlKey || event.metaKey) { + switch (String.fromCharCode(event.which).toLowerCase()) { + case 's': + event.preventDefault() + saveContent() + break + } + } + }) + + return false +}) diff --git a/_embed/public/js/listing.js b/_embed/public/js/listing.js new file mode 100644 index 00000000..baef101d --- /dev/null +++ b/_embed/public/js/listing.js @@ -0,0 +1,580 @@ +'use strict' + +var listing = { + selectMultiple: false +} + +listing.reload = function (callback) { + let request = new XMLHttpRequest() + + request.open('GET', window.location) + request.setRequestHeader('Minimal', 'true') + request.send() + request.onreadystatechange = function () { + if (request.readyState === 4) { + if (request.status === 200) { + document.querySelector('body main').innerHTML = request.responseText + listing.addDoubleTapEvent() + + if (typeof callback === 'function') { + callback() + } + } + } + } +} + +listing.itemDragStart = function (event) { + let el = event.target + + for (let i = 0; i < 5; i++) { + if (!el.classList.contains('item')) { + el = el.parentElement + } + } + + event.dataTransfer.setData('id', el.id) + event.dataTransfer.setData('name', el.querySelector('.name').innerHTML) +} + +listing.itemDragOver = function (event) { + event.preventDefault() + let el = event.target + + for (let i = 0; i < 5; i++) { + if (!el.classList.contains('item')) { + el = el.parentElement + } + } + + el.style.opacity = 1 +} + +listing.itemDrop = function (e) { + e.preventDefault() + + let el = e.target, + id = e.dataTransfer.getData('id'), + name = e.dataTransfer.getData('name') + + if (id == '' || name == '') return + + for (let i = 0; i < 5; i++) { + if (!el.classList.contains('item')) { + el = el.parentElement + } + } + + if (el.id === id) return + + let oldLink = document.getElementById(id).dataset.url, + newLink = el.dataset.url + name + + webdav.move(oldLink, newLink) + .then(() => listing.reload()) + .catch(e => console.log(e)) +} + +listing.documentDrop = function (event) { + event.preventDefault() + let dt = event.dataTransfer, + files = dt.files, + el = event.target, + items = document.getElementsByClassName('item') + + for (let i = 0; i < 5; i++) { + if (el != null && !el.classList.contains('item')) { + el = el.parentElement + } + } + + if (files.length > 0) { + if (el != null && el.classList.contains('item') && el.dataset.dir == 'true') { + listing.handleFiles(files, el.querySelector('.name').innerHTML + '/') + return + } + + listing.handleFiles(files, '') + } else { + Array.from(items).forEach(file => { + file.style.opacity = 1 + }) + } +} + +listing.rename = function (event) { + if (!selectedItems.length || selectedItems.length > 1) { + return false + } + + let item = document.getElementById(selectedItems[0]) + + if (item.classList.contains('disabled')) { + return false + } + + let link = item.dataset.url, + field = item.querySelector('.name'), + name = field.innerHTML + + let submit = (event) => { + event.preventDefault() + + let newName = event.currentTarget.querySelector('input').value, + newLink = removeLastDirectoryPartOf(link) + '/' + newName + + closePrompt(event) + buttons.setLoading('rename') + + webdav.move(link, newLink).then(() => { + listing.reload(() => { + newName = btoa(newName) + selectedItems = [newName] + document.getElementById(newName).setAttribute('aria-selected', true) + listing.handleSelectionChange() + }) + + buttons.setDone('rename') + }).catch(error => { + field.innerHTML = name + buttons.setDone('rename', false) + console.log(error) + }) + + return false + } + + let clone = document.importNode(templates.question.content, true) + clone.querySelector('h3').innerHTML = 'Rename' + clone.querySelector('input').value = name + clone.querySelector('.ok').innerHTML = 'Rename' + clone.querySelector('form').addEventListener('submit', submit) + + document.querySelector('body').appendChild(clone) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') + + return false +} + +listing.handleFiles = function (files, base) { + buttons.setLoading('upload') + + let promises = [] + + for (let file of files) { + promises.push(webdav.put(window.location.pathname + base + file.name, file)) + } + + Promise.all(promises) + .then(() => { + listing.reload() + buttons.setDone('upload') + }) + .catch(e => { + console.log(e) + buttons.setDone('upload', false) + }) + + return false +} + +listing.unselectAll = function () { + let items = document.getElementsByClassName('item') + Array.from(items).forEach(link => { + link.setAttribute('aria-selected', false) + }) + + selectedItems = [] + + listing.handleSelectionChange() + return false +} + +listing.handleSelectionChange = function (event) { + listing.redefineDownloadURLs() + + let selectedNumber = selectedItems.length, + fileAction = document.getElementById('file-only') + + if (selectedNumber) { + fileAction.classList.remove('disabled') + + if (selectedNumber > 1) { + buttons.open.classList.add('disabled') + buttons.rename.classList.add('disabled') + buttons.info.classList.add('disabled') + } + + if (selectedNumber == 1) { + if (document.getElementById(selectedItems[0]).dataset.dir == 'true') { + buttons.open.classList.add('disabled') + } else { + buttons.open.classList.remove('disabled') + } + + buttons.info.classList.remove('disabled') + buttons.rename.classList.remove('disabled') + } + + return false + } + + buttons.info.classList.remove('disabled') + fileAction.classList.add('disabled') + return false +} + +listing.redefineDownloadURLs = function () { + let files = '' + + for (let i = 0; i < selectedItems.length; i++) { + let url = document.getElementById(selectedItems[i]).dataset.url + files += url.replace(window.location.pathname, '') + ',' + } + + files = files.substring(0, files.length - 1) + files = encodeURIComponent(files) + + let links = document.querySelectorAll('#download ul a') + Array.from(links).forEach(link => { + link.href = '?download=' + link.dataset.format + '&files=' + files + }) +} + +listing.openItem = function (event) { + window.location = event.currentTarget.dataset.url +} + +listing.selectItem = function (event) { + let el = event.currentTarget + + if (selectedItems.length != 0) event.preventDefault() + if (selectedItems.indexOf(el.id) == -1) { + if (!event.ctrlKey && !listing.selectMultiple) listing.unselectAll() + + el.setAttribute('aria-selected', true) + selectedItems.push(el.id) + } else { + el.setAttribute('aria-selected', false) + selectedItems.removeElement(el.id) + } + + listing.handleSelectionChange() + return false +} + +listing.newFileButton = function (event) { + event.preventDefault() + + let clone = document.importNode(templates.question.content, true) + clone.querySelector('h3').innerHTML = 'New file' + clone.querySelector('p').innerHTML = 'End with a trailing slash to create a dir.' + clone.querySelector('.ok').innerHTML = 'Create' + clone.querySelector('form').addEventListener('submit', listing.newFilePrompt) + + document.querySelector('body').appendChild(clone) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') +} + +listing.newFilePrompt = function (event) { + event.preventDefault() + buttons.setLoading('new') + + let name = event.currentTarget.querySelector('input').value + + webdav.new(window.location.pathname + name) + .then(() => { + buttons.setDone('new') + listing.reload() + }) + .catch(e => { + console.log(e) + buttons.setDone('new', false) + }) + + closePrompt(event) + return false +} + +listing.updateColumns = function (event) { + let columns = Math.floor(document.getElementById('listing').offsetWidth / 300), + items = getCSSRule(['#listing.mosaic .item', '.mosaic#listing .item']) + + items.style.width = `calc(${100/columns}% - 1em)` +} + +listing.addDoubleTapEvent = function () { + let items = document.getElementsByClassName('item'), + touches = { + id: '', + count: 0 + } + + Array.from(items).forEach(file => { + file.addEventListener('touchstart', event => { + if (touches.id != file.id) { + touches.id = file.id + touches.count = 1 + + setTimeout(() => { + touches.count = 0 + }, 300) + + return + } + + touches.count++ + + if (touches.count > 1) { + window.location = file.dataset.url + } + }) + }) +} + +// Keydown events +window.addEventListener('keydown', (event) => { + if (event.keyCode == 27) { + listing.unselectAll() + + if (document.querySelectorAll('.prompt').length) { + closePrompt(event) + } + } + + if (event.keyCode == 113) { + listing.rename() + } + + if (event.ctrlKey || event.metaKey) { + switch (String.fromCharCode(event.which).toLowerCase()) { + case 's': + event.preventDefault() + window.location = '?download=true' + } + } +}) + +window.addEventListener('resize', () => { + listing.updateColumns() +}) + +listing.selectMoveFolder = function (event) { + if (event.target.getAttribute('aria-selected') === 'true') { + event.target.setAttribute('aria-selected', false) + return + } else { + if (document.querySelector('.file-list li[aria-selected=true]')) { + document.querySelector('.file-list li[aria-selected=true]').setAttribute('aria-selected', false) + } + event.target.setAttribute('aria-selected', true) + return + } +} + +listing.getJSON = function (link) { + return new Promise((resolve, reject) => { + let request = new XMLHttpRequest() + request.open('GET', link) + request.setRequestHeader('Accept', 'application/json') + request.onload = () => { + if (request.status == 200) { + resolve(request.responseText) + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send() + }) +} + +listing.moveMakeItem = function (url, name) { + let node = document.createElement('li'), + count = 0 + + node.dataset.url = url + node.innerHTML = name + node.setAttribute('aria-selected', false) + + node.addEventListener('dblclick', listing.moveDialogNext) + node.addEventListener('click', listing.selectMoveFolder) + node.addEventListener('touchstart', event => { + count++ + + setTimeout(() => { + count = 0 + }, 300) + + if (count > 1) { + listing.moveDialogNext(event) + } + }) + + return node +} + +listing.moveDialogNext = function (event) { + let request = new XMLHttpRequest(), + prompt = document.querySelector('form.prompt.active'), + list = prompt.querySelector('div.file-list ul') + + prompt.addEventListener('submit', listing.moveSelected) + + listing.getJSON(event.target.dataset.url) + .then((data) => { + let dirs = 0 + + prompt.querySelector('ul').innerHTML = '' + prompt.querySelector('code').innerHTML = event.target.dataset.url + + if (event.target.dataset.url != baseURL + '/') { + let node = listing.moveMakeItem(removeLastDirectoryPartOf(event.target.dataset.url) + '/', '..') + list.appendChild(node) + } + + if (JSON.parse(data) == null) { + prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.` + return + } + + for (let f of JSON.parse(data)) { + if (f.IsDir === true) { + dirs++ + list.appendChild(listing.moveMakeItem(f.URL, f.Name)) + } + } + + if (dirs === 0) + prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.` + }) + .catch(e => console.log(e)) +} + +listing.moveSelected = function (event) { + event.preventDefault() + + let promises = [] + buttons.setLoading('move') + + for (let file of selectedItems) { + let fileElement = document.getElementById(file), + destFolder = event.target.querySelector('p code').innerHTML + + if (event.currentTarget.querySelector('li[aria-selected=true]') != null) { + destFolder = event.currentTarget.querySelector('li[aria-selected=true]').dataset.url + } + + let destPath = '/' + destFolder + '/' + fileElement.querySelector('.name').innerHTML + destPath = destPath.replace('//', '/') + + promises.push(webdav.move(fileElement.dataset.url, destPath)) + } + + Promise.all(promises) + .then(() => { + closePrompt(event) + buttons.setDone('move') + listing.reload() + }) + .catch(e => { + console.log(e) + }) +} + +listing.moveEvent = function (event) { + if (event.currentTarget.classList.contains('disabled')) + return + + listing.getJSON(window.location.pathname) + .then((data) => { + let prompt = document.importNode(templates.move.content, true), + list = prompt.querySelector('div.file-list ul'), + dirs = 0 + + prompt.querySelector('form').addEventListener('submit', listing.moveSelected) + prompt.querySelector('code').innerHTML = window.location.pathname + + if (window.location.pathname !== baseURL + '/') { + list.appendChild(listing.moveMakeItem(removeLastDirectoryPartOf(window.location.pathname) + '/', '..')) + } + + for (let f of JSON.parse(data)) { + if (f.IsDir === true) { + dirs++ + list.appendChild(listing.moveMakeItem(f.URL, f.Name)) + } + } + + if (dirs === 0) { + prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.` + } + + document.body.appendChild(prompt) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') + }) + .catch(e => console.log(e)) +} + +document.addEventListener('DOMContentLoaded', event => { + listing.updateColumns() + listing.addDoubleTapEvent() + + buttons.rename = document.getElementById('rename') + buttons.upload = document.getElementById('upload') + buttons.new = document.getElementById('new') + buttons.download = document.getElementById('download') + buttons.move = document.getElementById('move') + + document.getElementById('multiple-selection-activate').addEventListener('click', event => { + listing.selectMultiple = true + clickOverlay.click() + + document.getElementById('multiple-selection').classList.add('active') + document.querySelector('body').style.paddingBottom = '4em' + }) + + document.getElementById('multiple-selection-cancel').addEventListener('click', event => { + listing.selectMultiple = false + + document.querySelector('body').style.paddingBottom = '0' + document.getElementById('multiple-selection').classList.remove('active') + }) + + if (user.AllowEdit) { + buttons.move.addEventListener('click', listing.moveEvent) + buttons.rename.addEventListener('click', listing.rename) + } + + let items = document.getElementsByClassName('item') + + if (user.AllowNew) { + buttons.upload.addEventListener('click', (event) => { + document.getElementById('upload-input').click() + }) + + buttons.new.addEventListener('click', listing.newFileButton) + + // Drag and Drop + document.addEventListener('dragover', function (event) { + event.preventDefault() + }, false) + + document.addEventListener('dragenter', (event) => { + Array.from(items).forEach(file => { + file.style.opacity = 0.5 + }) + }, false) + + document.addEventListener('dragend', (event) => { + Array.from(items).forEach(file => { + file.style.opacity = 1 + }) + }, false) + + document.addEventListener('drop', listing.documentDrop, false) + } +}) diff --git a/_embed/public/js/vendor/form2js.js b/_embed/public/js/vendor/form2js.js new file mode 100644 index 00000000..2614c194 --- /dev/null +++ b/_embed/public/js/vendor/form2js.js @@ -0,0 +1,356 @@ +/** + * Copyright (c) 2010 Maxim Vasiliev + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author Maxim Vasiliev + * Date: 09.09.2010 + * Time: 19:02:33 + */ + + +(function (root, factory) +{ + if (typeof exports !== 'undefined' && typeof module !== 'undefined' && module.exports) { + // NodeJS + module.exports = factory(); + } + else if (typeof define === 'function' && define.amd) + { + // AMD. Register as an anonymous module. + define(factory); + } + else + { + // Browser globals + root.form2js = factory(); + } +}(this, function () +{ + "use strict"; + + /** + * Returns form values represented as Javascript object + * "name" attribute defines structure of resulting object + * + * @param rootNode {Element|String} root form element (or it's id) or array of root elements + * @param delimiter {String} structure parts delimiter defaults to '.' + * @param skipEmpty {Boolean} should skip empty text values, defaults to true + * @param nodeCallback {Function} custom function to get node value + * @param useIdIfEmptyName {Boolean} if true value of id attribute of field will be used if name of field is empty + */ + function form2js(rootNode, delimiter, skipEmpty, nodeCallback, useIdIfEmptyName, getDisabled) + { + getDisabled = getDisabled ? true : false; + if (typeof skipEmpty == 'undefined' || skipEmpty == null) skipEmpty = true; + if (typeof delimiter == 'undefined' || delimiter == null) delimiter = '.'; + if (arguments.length < 5) useIdIfEmptyName = false; + + rootNode = typeof rootNode == 'string' ? document.getElementById(rootNode) : rootNode; + + var formValues = [], + currNode, + i = 0; + + /* If rootNode is array - combine values */ + if (rootNode.constructor == Array || (typeof NodeList != "undefined" && rootNode.constructor == NodeList)) + { + while(currNode = rootNode[i++]) + { + formValues = formValues.concat(getFormValues(currNode, nodeCallback, useIdIfEmptyName, getDisabled)); + } + } + else + { + formValues = getFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled); + } + + return processNameValues(formValues, skipEmpty, delimiter); + } + + /** + * Processes collection of { name: 'name', value: 'value' } objects. + * @param nameValues + * @param skipEmpty if true skips elements with value == '' or value == null + * @param delimiter + */ + function processNameValues(nameValues, skipEmpty, delimiter) + { + var result = {}, + arrays = {}, + i, j, k, l, + value, + nameParts, + currResult, + arrNameFull, + arrName, + arrIdx, + namePart, + name, + _nameParts; + + for (i = 0; i < nameValues.length; i++) + { + value = nameValues[i].value; + + if (skipEmpty && (value === '' || value === null)) continue; + + name = nameValues[i].name; + _nameParts = name.split(delimiter); + nameParts = []; + currResult = result; + arrNameFull = ''; + + for(j = 0; j < _nameParts.length; j++) + { + namePart = _nameParts[j].split(']['); + if (namePart.length > 1) + { + for(k = 0; k < namePart.length; k++) + { + if (k == 0) + { + namePart[k] = namePart[k] + ']'; + } + else if (k == namePart.length - 1) + { + namePart[k] = '[' + namePart[k]; + } + else + { + namePart[k] = '[' + namePart[k] + ']'; + } + + arrIdx = namePart[k].match(/([a-z_]+)?\[([a-z_][a-z0-9_]+?)\]/i); + if (arrIdx) + { + for(l = 1; l < arrIdx.length; l++) + { + if (arrIdx[l]) nameParts.push(arrIdx[l]); + } + } + else{ + nameParts.push(namePart[k]); + } + } + } + else + nameParts = nameParts.concat(namePart); + } + + for (j = 0; j < nameParts.length; j++) + { + namePart = nameParts[j]; + + if (namePart.indexOf('[]') > -1 && j == nameParts.length - 1) + { + arrName = namePart.substr(0, namePart.indexOf('[')); + arrNameFull += arrName; + + if (!currResult[arrName]) currResult[arrName] = []; + currResult[arrName].push(value); + } + else if (namePart.indexOf('[') > -1) + { + arrName = namePart.substr(0, namePart.indexOf('[')); + arrIdx = namePart.replace(/(^([a-z_]+)?\[)|(\]$)/gi, ''); + + /* Unique array name */ + arrNameFull += '_' + arrName + '_' + arrIdx; + + /* + * Because arrIdx in field name can be not zero-based and step can be + * other than 1, we can't use them in target array directly. + * Instead we're making a hash where key is arrIdx and value is a reference to + * added array element + */ + + if (!arrays[arrNameFull]) arrays[arrNameFull] = {}; + if (arrName != '' && !currResult[arrName]) currResult[arrName] = []; + + if (j == nameParts.length - 1) + { + if (arrName == '') + { + currResult.push(value); + arrays[arrNameFull][arrIdx] = convertValue(currResult[currResult.length - 1]); + } + else + { + currResult[arrName].push(value); + arrays[arrNameFull][arrIdx] = convertValue(currResult[arrName][currResult[arrName].length - 1]); + } + } + else + { + if (!arrays[arrNameFull][arrIdx]) + { + if ((/^[0-9a-z_]+\[?/i).test(nameParts[j+1])) currResult[arrName].push({}); + else currResult[arrName].push([]); + + arrays[arrNameFull][arrIdx] = convertValue(currResult[arrName][currResult[arrName].length - 1]); + } + } + + currResult = convertValue(arrays[arrNameFull][arrIdx]); + } + else + { + arrNameFull += namePart; + + if (j < nameParts.length - 1) /* Not the last part of name - means object */ + { + if (!currResult[namePart]) currResult[namePart] = {}; + currResult = convertValue(currResult[namePart]); + } + else + { + currResult[namePart] = convertValue(value); + } + } + } + } + + return result; + } + + function convertValue(value) { + if (value == "true") return true; + if (value == "false") return false; + if (!isNaN(value)) return parseInt(value); + return value; + } + + function getFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled) + { + var result = extractNodeValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled); + return result.length > 0 ? result : getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled); + } + + function getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled) + { + var result = [], + currentNode = rootNode.firstChild; + + while (currentNode) + { + result = result.concat(extractNodeValues(currentNode, nodeCallback, useIdIfEmptyName, getDisabled)); + currentNode = currentNode.nextSibling; + } + + return result; + } + + function extractNodeValues(node, nodeCallback, useIdIfEmptyName, getDisabled) { + if (node.disabled && !getDisabled) return []; + + var callbackResult, fieldValue, result, fieldName = getFieldName(node, useIdIfEmptyName); + + callbackResult = nodeCallback && nodeCallback(node); + + if (callbackResult && callbackResult.name) { + result = [callbackResult]; + } + else if (fieldName != '' && node.nodeName.match(/INPUT|TEXTAREA/i)) { + fieldValue = getFieldValue(node, getDisabled); + if (null === fieldValue) { + result = []; + } else { + result = [ { name: fieldName, value: fieldValue} ]; + } + } + else if (fieldName != '' && node.nodeName.match(/SELECT/i)) { + fieldValue = getFieldValue(node, getDisabled); + result = [ { name: fieldName.replace(/\[\]$/, ''), value: fieldValue } ]; + } + else { + result = getSubFormValues(node, nodeCallback, useIdIfEmptyName, getDisabled); + } + + return result; + } + + function getFieldName(node, useIdIfEmptyName) + { + if (node.name && node.name != '') return node.name; + else if (useIdIfEmptyName && node.id && node.id != '') return node.id; + else return ''; + } + + + function getFieldValue(fieldNode, getDisabled) + { + if (fieldNode.disabled && !getDisabled) return null; + + switch (fieldNode.nodeName) { + case 'INPUT': + case 'TEXTAREA': + switch (fieldNode.type.toLowerCase()) { + case 'radio': + if (fieldNode.checked && fieldNode.value === "false") return false; + case 'checkbox': + if (fieldNode.checked && fieldNode.value === "true") return true; + if (!fieldNode.checked && fieldNode.value === "true") return false; + if (fieldNode.checked) return fieldNode.value; + break; + + case 'button': + case 'reset': + case 'submit': + case 'image': + return ''; + break; + + default: + return fieldNode.value; + break; + } + break; + + case 'SELECT': + return getSelectedOptionValue(fieldNode); + break; + + default: + break; + } + + return null; + } + + function getSelectedOptionValue(selectNode) + { + var multiple = selectNode.multiple, + result = [], + options, + i, l; + + if (!multiple) return selectNode.value; + + for (options = selectNode.getElementsByTagName("option"), i = 0, l = options.length; i < l; i++) + { + if (options[i].selected) result.push(options[i].value); + } + + return result; + } + + return form2js; + +})); diff --git a/_embed/templates/base.tmpl b/_embed/templates/base.tmpl new file mode 100644 index 00000000..38fbeaf5 --- /dev/null +++ b/_embed/templates/base.tmpl @@ -0,0 +1,292 @@ + + +{{ $absURL := .Config.AbsoluteURL }} + + {{.Name}} + + + + + + {{- if ne .User.StyleSheet "" -}} + + {{- end -}} + + + + {{- if .IsDir }} + + {{- else }} + + + + {{- end }} + {{- if .Config.HugoEnabled }} + + {{- end }} + + +
    +
    +

    File Manager

    + + +
    + exit_to_app +
    +
    + +
    +
    + {{- if ne .Name "/"}} + + {{- end }} + + {{ if ne .Name "/"}}

    {{ .Name }}

    {{ end }} +
    + +
    + {{- if and (not .IsDir) (.User.AllowEdit) }} + {{- if .Editor}} + + {{- if eq .Data.Mode "markdown" }} +
    + remove_red_eye +
    + {{- end }} + + {{- if eq .Data.Visual true }} +
    + code +
    + {{- end }} + {{- end }} + +
    + save +
    + {{- end }} + + {{- if .IsDir }} +
    + open_in_new + See raw +
    + {{- end }} + + {{- if and (.User.AllowEdit) (.IsDir) }} +
    + forward + Move file +
    + {{- end }} + + {{- if and .IsDir .User.AllowEdit }} +
    + mode_edit +
    + {{- end }} + + {{- if and .User.AllowEdit .IsDir }} +
    + deleteDelete +
    + {{- end }} +
    + +
    + more_vert +
    + +
    + {{- if .IsDir }} +
    + {{- if eq .Display "mosaic" }} + + view_listSwitch view + + {{- else }} + + view_moduleSwitch view + + {{- end }} +
    + +
    + check_circleSelect +
    + {{- end }} + + {{- if and (.User.AllowNew) (.IsDir) }} +
    + file_uploadUpload +
    + {{- end }} + + {{- if not .IsDir }} +
    + open_in_new + See raw +
    + {{- end }} + + {{- if and .User.AllowEdit (not .IsDir) }} +
    + deleteDelete +
    + {{- end }} + +
    + {{- if not .IsDir}}{{ end }} + file_downloadDownload + {{- if not .IsDir}}{{ end }} + + {{- if .IsDir }} + + {{- end }} +
    + +
    + infoInfo +
    +
    +
    + +
    +
    + +
    +

    Multiple selection enabled

    +
    + clear +
    +
    + +
    + {{- template "content" . }} +
    + +
    + + {{- if and (.User.AllowNew) (.IsDir) }} +
    +
    + add +
    +
    + {{- end }} + + + + + + + + + +
    +

    Help

    + +
      +
    • F1 - this information
    • +
    • F2 - rename file
    • +
    • DEL - delete selected items
    • +
    • ESC - clear selection and/or close the prompt
    • +
    • CTRL + S - save a file or download the directory where you are
    • +
    • CTRL + Click - select multiple files or directories
    • +
    • Double click - open a file or directory
    • +
    • Click - select file or directory
    • +
    + +

    Not available yet

    + +
      +
    • Alt + Click - select a group of files
    • +
    + +
    + +
    +
    + + + + diff --git a/_embed/templates/editor.tmpl b/_embed/templates/editor.tmpl new file mode 100644 index 00000000..d02238d8 --- /dev/null +++ b/_embed/templates/editor.tmpl @@ -0,0 +1,57 @@ +{{ define "content" }} +{{- with .Data }} +
    + {{- if or (eq .Class "frontmatter-only") (eq .Class "complete") }} + {{- if (eq .Class "complete")}} +

    Metadata

    + {{- end }} +
    + {{- template "blocks" .FrontMatter.Content }} +
    Add field
    +
    + {{- end }} + + {{ if or (eq .Class "content-only") (eq .Class "complete") }} + {{ if (eq .Class "complete")}} +

    Body

    + {{ end }} +
    +
    + +
    + {{ end }} +
    +{{- end }} + + + + + + +{{ end }} diff --git a/_embed/templates/frontmatter.tmpl b/_embed/templates/frontmatter.tmpl new file mode 100644 index 00000000..3389da90 --- /dev/null +++ b/_embed/templates/frontmatter.tmpl @@ -0,0 +1,56 @@ +{{ define "blocks" }} +{{ if .Fields }}
    {{ end }} +{{- range $key, $value := .Fields }} + {{- if eq $value.Parent.Type "array" }} +
    + {{- template "value" $value }} +
    + close +
    +
    + {{- else }} +
    + + {{ template "value" $value }} +
    + close +
    +
    + {{- end }} +{{- end }} +{{- if .Fields }}
    {{ end }} + +{{- range $key, $value := .Arrays }} +{{- template "fielset" $value }} +{{- end }} + +{{- range $key, $value := .Objects }} +{{- template "fielset" $value }} +{{- end }} + +{{ end }} + +{{ define "value" }} +{{- if eq .HTMLType "textarea" }} + +{{- else if eq .HTMLType "datetime" }} + +{{- else }} + +{{- end }} +{{ end }} + +{{ define "fielset" }} +
    + {{- if not (eq .Title "") }} +

    {{ .Name }}

    + {{- end }} +
    + add +
    +
    + close +
    + {{- template "blocks" .Content }} +
    +{{ end }} diff --git a/_embed/templates/listing.tmpl b/_embed/templates/listing.tmpl new file mode 100644 index 00000000..da94b962 --- /dev/null +++ b/_embed/templates/listing.tmpl @@ -0,0 +1,103 @@ +{{ define "content" }} +
    +{{- with .Data -}} +
    +
    +
    +
    +

    Name + {{- if eq .Sort "name" -}} + {{- if eq .Order "asc" -}} + arrow_downward + {{- else -}} + arrow_upward + {{- end -}} + {{- else -}} + arrow_downward + {{- end -}} +

    +

    File Size + {{- if eq .Sort "size" -}} + {{- if eq .Order "asc" -}} + arrow_downward + {{- else -}} + arrow_upward + {{- end -}} + {{- else -}} + arrow_downward + {{- end -}} +

    +

    Last modified

    +
    +
    +
    + + {{ if and (eq .NumDirs 0) (eq .NumFiles 0) }} +

    It feels lonely here :'(

    + {{ end }} + + {{- if not (eq .NumDirs 0)}} +

    Folders

    +
    + {{- range .Items }} + {{- if (.IsDir) }} + {{ template "item" .}} + {{- end }} + {{- end }} +
    + {{- end }} + + {{- if not (eq .NumFiles 0)}} +

    Files

    +
    + {{- range .Items }} + {{- if (not .IsDir) }} + {{ template "item" .}} + {{- end }} + {{- end }} +
    + {{- end }} +
    + + +{{- end -}} +{{- end -}} + +{{ define "item" }} +
    +
    + {{- if .IsDir}} + folder + {{- else}} + {{ if eq .Type "image" }} + insert_photo + {{ else if eq .Type "audio" }} + volume_up + {{ else if eq .Type "video" }} + movie + {{ else }} + insert_drive_file + {{ end }} + {{- end}} +
    +
    +

    {{.Name}}

    + {{- if .IsDir}} +

    + {{- else}} +

    {{.HumanSize}}

    + {{- end}} +

    + +

    +
    +
    +{{ end }} diff --git a/_embed/templates/minimal.tmpl b/_embed/templates/minimal.tmpl new file mode 100644 index 00000000..66e0068d --- /dev/null +++ b/_embed/templates/minimal.tmpl @@ -0,0 +1 @@ +{{ template "content" . }} diff --git a/_embed/templates/single.tmpl b/_embed/templates/single.tmpl new file mode 100644 index 00000000..c85ab5a4 --- /dev/null +++ b/_embed/templates/single.tmpl @@ -0,0 +1,23 @@ +{{ define "content" }} +{{ with .Data}} +
    + {{ if eq .Type "image" }} +
    + {{ else if eq .Type "audio" }} + + {{ else if eq .Type "video" }} + + {{ else if eq .Extension ".pdf" }} + + {{ else if eq .Type "blob" }} +

    Download file_download

    + {{ else}} +
    {{ .StringifyContent }}
    + {{ end }} +
    +{{ end }} +{{ end }} From 48298708905bf529a1517cbcd55c41d4721acd52 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 19 Jun 2017 17:10:03 +0100 Subject: [PATCH 06/40] more updates and renaming Former-commit-id: 8c194821906b2170df92672fe9dfb9d710640659 --- _embed/public/ace | 1 + _embed/public/css/old.css | 1207 +++ _embed/public/js/form2js.js | 1 + _embed/public/js/vendor/form2js.js | 356 - _embed/templates/base.tmpl | 19 +- assets/assets.go | 2 +- assets/binary.go | 7413 +++++++++++++++++ assets/binary.go.REMOVED.git-id | 1 - cmd/filemanager/main.go | 45 +- filemanager.go | 61 +- frontmatter/frontmatter.go | 5 +- frontmatter/types.go | 13 + {utils => frontmatter}/types_test.go | 6 +- http/checksum.go | 3 +- http/http.go | 24 +- http/listing.go | 3 +- {wrapper => http}/response_writer.go | 2 +- http/single.go | 5 +- page/functions.go | 47 + .../functions_test.go | 4 +- page/page.go | 20 +- pre-build.sh | 7 + utils/errors.go | 24 - utils/types.go | 13 - utils/variables.go | 47 - 25 files changed, 8783 insertions(+), 546 deletions(-) create mode 160000 _embed/public/ace create mode 100644 _embed/public/css/old.css create mode 100644 _embed/public/js/form2js.js delete mode 100644 _embed/public/js/vendor/form2js.js create mode 100644 assets/binary.go delete mode 100644 assets/binary.go.REMOVED.git-id create mode 100644 frontmatter/types.go rename {utils => frontmatter}/types_test.go (92%) rename {wrapper => http}/response_writer.go (98%) create mode 100644 page/functions.go rename utils/variables_test.go => page/functions_test.go (92%) create mode 100644 pre-build.sh delete mode 100644 utils/errors.go delete mode 100644 utils/types.go delete mode 100644 utils/variables.go diff --git a/_embed/public/ace b/_embed/public/ace new file mode 160000 index 00000000..784ffa86 --- /dev/null +++ b/_embed/public/ace @@ -0,0 +1 @@ +Subproject commit 784ffa862c5351e0d300370f61471b1eb95ebcf1 diff --git a/_embed/public/css/old.css b/_embed/public/css/old.css new file mode 100644 index 00000000..eb9d8a5b --- /dev/null +++ b/_embed/public/css/old.css @@ -0,0 +1,1207 @@ +body { + font-family: 'Roboto', sans-serif; + padding-top: 7.8em; + background-color: #f8f8f8; +} + +* { + box-sizing: border-box; +} + +*, +*:hover, +*:active, +*:focus { + outline: 0 +} + +a { + text-decoration: none; +} + +img { + max-width: 100%; +} + +audio, +video { + width: 100%; +} + +pre { + padding: 1em; + border: 1px solid #e6e6e6; + border-radius: 0.5em; + background-color: #f5f5f5; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; +} + +button { + border: 0; + padding: .5em 1em; + margin-left: .5em; + border-radius: .1em; + cursor: pointer; + background: #2196f3; + color: #fff; + border: 1px solid rgba(0, 0, 0, 0.05); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.05); + transition: .1s ease all; +} + +button:hover { + background-color: #1E88E5; +} + +.mobile-only { + display: none !important; +} + +.container { + width: 95%; + max-width: 960px; + margin: 1em auto 0; +} + +i.spin { + animation: 1s spin linear infinite; +} + +.pdf { + width: 100%; + height: calc(100vh - 13em); +} + + +/* * * * * * * * * * * * * * * * + * EDITOR * + * * * * * * * * * * * * * * * */ + +#editor .source { + display: none; +} + +#editor .content { + background: #fff; + padding: 1em 0; +} + +#editor #ace, +#editor h2, +#editor .frontmatter { + width: 95%; + max-width: 960px; + margin: 1em auto 0; +} + +#editor h2 { + margin: 1.5em auto 1em; + color: rgba(0, 0, 0, 0.3); + font-weight: 500; +} + +#editor .ace_gutter { + background-color: #fff; +} + + +/* * * * * * * * * * * * * * * * + * EDITOR - MARKDOWN * + * * * * * * * * * * * * * * * */ + +.frontmatter { + column-count: 3; + column-gap: 1em; + column-fill: balance; + /* display: flex; */ + /* flex-wrap: wrap; */ + /* justify-content: space-between; */ + /* flex-grow: 1; */ +} + +.frontmatter label { + display: block; + width: calc(100% - 1em); + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.frontmatter label, +.frontmatter h3 { + font-weight: 500; + margin: 0 0; + color: rgba(0, 0, 0, 0.6); +} + +.frontmatter input, +.frontmatter textarea { + display: block; + width: 100%; + border: 0; + margin-top: .5em; + padding: 0; + line-height: 1; +} + +.frontmatter .block, +.frontmatter fieldset[data-type="array"], +.button { + position: relative; + background: #fff; + border-radius: .2em; + border: 1px solid rgba(0, 0, 0, 0.075); + padding: .5em; + break-inside: avoid; + margin: 0 0 1em; + width: 100%; + display: inline-block; +} + +.frontmatter fieldset[data-type="object"] { + position: relative; + margin: 0; +} + +.frontmatter .button { + background-color: #2196f3; + color: #fff; + cursor: pointer; + text-align: center; +} + +[data-type="array-item"] { + position: relative; +} + +[data-type="array-item"] .action { + top: 0; + right: 0; +} + +.frontmatter textarea { + resize: none; +} + +[data-type="array-item"] input { + width: calc(100% - 1em); +} + +.block .action, +fieldset .action { + position: absolute; + top: .5em; + right: .5em; +} + +.block>.action, +fieldset>.action { + opacity: 0; +} + +.block:hover>.action, +fieldset:hover>.action { + opacity: 1; +} + +.block .action.add, +fieldset .action.add { + right: 1.5em; +} + +.frontmatter .action i { + padding: 0; + font-size: 1em; +} + +fieldset { + border: 0; + padding: 0; +} + +.frontmatter>fieldset h3, +.frontmatter>.group h3 { + font-size: 1.5em; + margin-bottom: .5em; +} + +fieldset h3, +.group h3 { + font-size: 0.9em; +} + + +/* * * * * * * * * * * * * * * * + * ACTION * + * * * * * * * * * * * * * * * */ + +.action { + display: inline-block; + cursor: pointer; + -webkit-transition: 0.2s ease all; + transition: 0.2s ease all; + border: 0; + margin: 0; + color: #546E7A; + border-radius: 50%; +} + +.action.disabled { + opacity: 0.2; + cursor: not-allowed; +} + +.action i { + padding: 0.4em; + -webkit-transition: 0.2s ease-in-out all; + transition: 0.2s ease-in-out all; + border-radius: 50%; +} + +.action:hover i { + background-color: rgba(0, 0, 0, .1); +} + +.action ul { + position: absolute; + top: 0; + color: #7d7d7d; + list-style: none; + margin: 0; + padding: 0; + flex-direction: column; + display: flex; +} + +.action ul li { + line-height: 1; + padding: .7em; + transition: .1s ease background-color; +} + +.action ul li:hover { + background-color: rgba(0, 0, 0, 0.04); +} + + +/* * * * * * * * * * * * * * * * + * NEW FILE/DIR * + * * * * * * * * * * * * * * * */ + +.floating { + position: fixed; + bottom: 1em; + right: 1em; +} + +.floating .action { + background-color: #2196f3 !important; + color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); +} + +#newdir { + position: fixed; + bottom: 1.3em; + right: 5em; + transition: .2s ease all; + opacity: 0; + border: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24); + padding: .5em; + width: 22em; + border-radius: .2em; +} + +#newdir.enabled { + opacity: 1; +} + + +/* * * * * * * * * * * * * * * * + * HEADER * + * * * * * * * * * * * * * * * */ + +header { + z-index: 1000; + background-color: #fff; + border-bottom: 1px solid rgba(0, 0, 0, 0.075); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + position: fixed; + top: 0; + left: 0; + width: 100%; + padding: 0; +} + +header a, +header a:hover { + color: inherit; +} + +header p i { + font-size: 1em !important; + color: rgba(255, 255, 255, .31); +} + +header>div { + display: flex; + width: 100%; + padding: 0.5em 0.5em 0.5em 1em; + align-items: center; +} + +header p { + display: inline-block; + margin: 0; + vertical-align: middle; +} + +header p a, +header p a:hover { + color: inherit; +} + +header .action span { + display: none; +} + +header>div div { + vertical-align: middle; + position: relative; +} + +#logout { + border-radius: 0; + margin-left: auto; + padding: .15em; +} + +#click-overlay { + display: none; + position: fixed; + cursor: pointer; + top: 0; + left: 0; + height: 100%; + width: 100%; +} + +#click-overlay.active { + display: block; +} + + +/* * * * * * * * * * * * * * * * + * TOP BAR * + * * * * * * * * * * * * * * * */ + +#top-bar { + height: 4em; +} + +#top-bar>div:nth-child(1) { + margin-right: 1em; + font-weight: 500; + font-size: 1.5em; + line-height: 2; +} + + +/* * * * * * * * * * * * * * * * + * SEARCH BAR * + * * * * * * * * * * * * * * * */ + +#search { + position: relative; + display: flex; + height: 100%; + padding: 0.75em; + vertical-align: middle; + border-radius: 0.3em; + background-color: #f5f5f5; + transition: .1s ease all; + width: 100%; + max-width: 25em; +} + +#search.active { + background-color: #fff; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); +} + +#search.active i, +#search.active input { + color: #212121; +} + +#search i, +#search input { + vertical-align: middle; +} + +#search i { + margin-right: 0.3em; + user-select: none; +} + +#search input { + width: 100%; + border: 0; + outline: 0; + background-color: transparent; +} + +#search.active div { + visibility: visible; + opacity: 1; + top: 100%; +} + +#search ul { + padding: 0; + margin: 0; + list-style: none; +} + +#search li { + margin-bottom: .5em; +} + +#search>div { + position: absolute; + top: 0; + width: 100%; + left: 0; + z-index: 999999; + background-color: #fff; + text-align: left; + color: #ccc; + box-shadow: 0 2px 3px rgba(0, 0, 0, .06), 0 2px 2px rgba(0, 0, 0, .12); + padding: .5em; + border-bottom-left-radius: .3em; + border-bottom-right-radius: .3em; + transition: .1s ease all; + visibility: hidden; + opacity: 0; + overflow-x: hidden; + overflow-y: auto; + max-height: 50vh; +} + +#search>div div { + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; +} + +#search>div p { + width: 100%; + text-align: center; + display: none; + margin: 0; + max-width: none; +} + +#search.ongoing p { + display: block; +} + +#search.active div i, +#sidebar #search.active div i { + color: #ccc; + text-align: center; + margin: 0 auto; + display: table; +} + +#search::-webkit-input-placeholder { + color: rgba(255, 255, 255, .5); +} + +#search:-moz-placeholder { + opacity: 1; + color: rgba(255, 255, 255, .5); +} + +#search::-moz-placeholder { + opacity: 1; + color: rgba(255, 255, 255, .5); +} + +#search:-ms-input-placeholder { + color: rgba(255, 255, 255, .5); +} + + +/* * * * * * * * * * * * * * * * + * BOTTOM BAR * + * * * * * * * * * * * * * * * */ + +#bottom-bar { + background-color: #fafafa; + border-top: 1px solid rgba(0, 0, 0, 0.075); + border-bottom: 1px solid rgba(0, 0, 0, 0.075); + height: 3.8em; +} + +#bottom-bar>div:first-child>* { + display: inline-block; + vertical-align: middle; +} + +#bottom-bar>div:first-child>i { + margin-right: .3em; +} + +#bottom-bar>*:first-child { + margin-right: auto; + max-width: calc(100% - 25em); + width: 100%; +} + +#bottom-bar p { + text-overflow: ellipsis; + overflow: hidden; + width: calc(100% - 3em); + white-space: nowrap; +} + +#more { + display: none; +} + +#file-only { + display: inline-block; + border-right: 1px solid rgba(0, 0, 0, 0.075); + padding-right: .3em; + margin-right: .3em; + transition: .2s ease opacity, visibility; + visibility: visible; +} + +#file-only.disabled { + opacity: 0; + visibility: hidden; +} + +#download ul.active { + top: 0; + right: 0; +} + +#more ul.active { + right: .5em; + top: 4.5em; +} + + +/* * * * * * * * * * * * * * * * + * DROPDOWN * + * * * * * * * * * * * * * * * */ + +.dropdown { + position: fixed; + top: -100%; + right: -100%; + visibility: hidden; + display: flex; + flex-direction: column; + border-radius: .1em; + border-top-left-radius: 0; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + background: #fff; + z-index: 9999999; +} + +.dropdown.active { + visibility: visible; +} + +.dropdown .action { + padding: .7em; +} + +.dropdown i { + padding: 0; + vertical-align: middle; +} + +.dropdown span { + display: inline-block; + margin-left: .5em; + font-size: .9em; +} + + +/* * * * * * * * * * * * * * * * + * BREADCRUMBS * + * * * * * * * * * * * * * * * */ + +#previous { + margin-left: -.5em; +} + +#breadcrumbs { + min-width: 7em; +} + +#breadcrumbs.active { + top: 0; + left: 0; + right: auto; +} + + +/* * * * * * * * * * * * * * * * + * LISTING * + * * * * * * * * * * * * * * * */ + +#listing { + max-width: calc(100% - 1.2em); + width: 100%; +} + +#listing h2 { + margin: 0 0 0 0.5em; + font-size: 1em; + color: rgba(0, 0, 0, 0.2); + font-weight: 500; +} + +#listing .item div:last-of-type * { + text-overflow: ellipsis; + overflow: hidden; +} + +#listing>div { + display: flex; + padding: 0; + flex-wrap: wrap; + justify-content: flex-start; + position: relative; +} + +#listing .item { + background-color: #fff; + position: relative; + display: flex; + flex-wrap: nowrap; + color: #6f6f6f; + transition: .1s ease all; + align-items: center; + cursor: pointer; +} + +#listing .item div:last-of-type { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +#listing .item p { + margin: 0; +} + +#listing .item .size, +#listing .item .modified { + font-size: 0.9em; +} + +#listing .item .name { + font-weight: bold; +} + +#listing .item i { + font-size: 4em; + margin-right: 0.1em; + vertical-align: bottom; +} + +#listing h2.message, +.message { + text-align: center; + font-size: 3em; + margin: 1em auto; + display: block !important; + width: 95%; + color: rgba(0, 0, 0, 0.2); + font-weight: 500; +} + +.message i { + font-size: inherit; + vertical-align: middle; +} + + +/* * * * * * * * * * * * * * * * + * LISTING - MOSAIC * + * * * * * * * * * * * * * * * */ + +#listing.mosaic { + margin-top: 1em; +} + +#listing.mosaic .item { + width: calc(33% - 1em); + margin: .5em; + padding: 0.5em; + border-radius: 0.2em; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); +} + +#listing.mosaic .item:hover { + box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24) !important; +} + +#listing.mosaic .header { + display: none; +} + +#listing.mosaic .item div:first-of-type { + width: 5em; +} + +#listing.mosaic .item div:last-of-type { + width: calc(100% - 5vw); +} + + +/* * * * * * * * * * * * * * * * + * LISTING - DETAIL * + * * * * * * * * * * * * * * * */ + +#listing.list { + flex-direction: column; + padding-top: 3.25em; + width: 100%; + max-width: 100%; + margin: 0; +} + +#listing.list .item { + width: 100%; + margin: 0; + border: 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + padding: 1em; +} + +#listing.list h2 { + display: none; +} + +#listing .item[aria-selected=true] { + background: #2196f3 !important; + color: #fff !important; +} + +#listing.list .item div:first-of-type { + width: 3em; +} + +#listing.list .item div:first-of-type i { + font-size: 2em; +} + +#listing.list .item div:last-of-type { + width: calc(100% - 3em); + display: flex; + align-items: center; +} + +#listing.list .item .name { + width: 50%; +} + +#listing.list .item .size { + width: 25%; +} + +#listing .item.header { + display: none !important; + background-color: #ccc; +} + +#listing.list .header i { + font-size: 1.5em; + vertical-align: middle; + margin-left: .2em; +} + +#listing.list .item.header { + display: flex !important; + background: #fafafa; + position: fixed; + width: 100%; + top: 7.8em; + left: 0; + z-index: 999; + padding: .85em; +} + +#listing.list .item.header>div:first-child { + width: 0; +} + +#listing.list .item.header .name { + margin-right: 3em; +} + +#listing.list .header { + display: flex; + background: #fafafa; + position: fixed; + width: 100%; + top: 7.8em; + left: 0; + z-index: 999; +} + +#listing.list .header a { + color: inherit; +} + +#listing.list .item.header>div:first-child { + width: 0; +} + +#listing.list .name { + font-weight: normal; +} + +#listing.list .item.header .name { + margin-right: 3em; +} + +#listing.list .header span { + vertical-align: middle; +} + +#listing.list .header i { + opacity: 0; + transition: .1s ease all; +} + +#listing.list .header p:hover i, +#listing.list .header .active i { + opacity: 1; +} + +#listing.list .item.header .active { + font-weight: bold; +} + + +/* * * * * * * * * * * * * * * * + * MULTIPLE SELECTION DIALOG * + * * * * * * * * * * * * * * * */ + +#multiple-selection { + position: fixed; + bottom: -4em; + left: 0; + z-index: 99999999; + width: 100%; + background-color: #2196f3; + height: 4em; + display: flex !important; + padding: 0.5em 0.5em 0.5em 1em; + justify-content: space-between; + align-items: center; + transition: .2s ease all; +} + +#multiple-selection.active { + bottom: 0; +} + +#multiple-selection * { + margin: 0; +} + +#multiple-selection p, +#multiple-selection i { + color: #fff; +} + + +/* * * * * * * * * * * * * * * * + * PROMPT * + * * * * * * * * * * * * * * * */ + +.overlay, +.prompt, +.help { + opacity: 0; + z-index: -1; + transition: .1s ease opacity, z-index; +} + +.overlay.active, +.prompt.active, +.help.active { + z-index: 9999999; + opacity: 1; +} + +.overlay { + background-color: rgba(0, 0, 0, 0.5); + position: fixed; + top: 0; + left: 0; + height: 0; + width: 0; +} + +.overlay.active { + height: 100%; + width: 100%; +} + +.prompt, +.help { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 99999999; + background: #fff; + border: 1px solid rgba(0, 0, 0, 0.075); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + padding: 2em; + max-width: 25em; + width: 90%; + max-height: 95%; +} + +.prompt h3, +.help h3 { + margin: 0; + font-weight: 500; + font-size: 1.5em; +} + +.prompt p, +.help p { + font-size: .9em; + color: rgba(0, 0, 0, 0.8); + margin: .5em 0 1em; +} + +.prompt input { + width: 100%; + border: 1px solid #dadada; + line-height: 1; + padding: .3em; +} + +.prompt code { + word-wrap: break-word; +} + +.prompt div, +.help div { + margin-top: 1em; + display: flex; + justify-content: flex-start; + flex-direction: row-reverse; +} + +.prompt .cancel { + background-color: #ECEFF1; + color: #37474F; +} + +.prompt .cancel:hover { + background-color: #e9eaeb; +} + + +/* * * * * * * * * * * * * * * * + * PROMPT - MOVE * + * * * * * * * * * * * * * * * */ + +.prompt .file-list { + flex-direction: initial; + max-height: 50vh; + overflow: auto; +} + +.prompt .file-list ul { + list-style: none; + margin: 0; + padding: 0; + width: 100%; +} + +.prompt .file-list ul li { + width: 100%; + user-select: none; +} + +.prompt .file-list ul li[aria-selected=true] { + background: #2196f3 !important; + color: #fff !important; + transition: .1s ease all; +} + +.prompt .file-list ul li:hover { + background-color: #e9eaeb; + cursor: pointer; +} + +.prompt .file-list ul li:before { + content: "folder"; + color: #6f6f6f; + vertical-align: middle; + padding: 0 .25em; + line-height: 2em; +} + +.prompt .file-list ul li[aria-selected=true]:before { + color: white; +} + + +/* * * * * * * * * * * * * * * * + * HELP * + * * * * * * * * * * * * * * * */ + +.help { + max-width: 24em; + visibility: hidden; + top: -100%; + left: -100%; +} + +.help.active { + visibility: visible; + top: 50%; + left: 50%; +} + +.help ul { + padding: 0; + margin: 1em 0; + list-style: none; +} + + +/* * * * * * * * * * * * * * * * + * FOOTER * + * * * * * * * * * * * * * * * */ + +footer { + font-size: 0.6em; + margin: 2em 0 2em; + text-align: center; + color: grey; +} + +footer a, +footer a:hover { + color: inherit; +} + + +/* * * * * * * * * * * * * * * * + * MEDIA QUERIES * + * * * * * * * * * * * * * * * */ + +@media screen and (max-width: 850px) { + .frontmatter { + column-count: 2; + } +} + +@media screen and (max-width: 650px) { + body { + transition: .2s ease padding; + } + .mobile-only { + display: inherit !important; + } + #top-bar>div:nth-child(1) { + display: none; + } + #bottom-bar>*:first-child { + max-width: calc(100% - 16em) !important; + } + #main-actions { + position: fixed; + top: -100%; + right: -100%; + visibility: hidden; + display: flex; + flex-direction: column; + border-radius: .1em; + border-top-left-radius: 0; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + background: #fff; + z-index: 9999999; + } + #main-actions.active { + right: .5em; + top: 4.5em; + visibility: visible; + } + #main-actions .action { + padding: .7em; + border-radius: 0; + align-items: center; + } + #main-actions .action:hover { + background-color: rgba(0, 0, 0, 0.04); + } + #main-actions i { + padding: 0; + vertical-align: middle; + } + #main-actions .action:hover i { + padding: 0; + background-color: transparent; + } + #main-actions span { + display: inline-block; + margin-left: .5em; + font-size: .9em; + } + #listing.list .item .size, + #listing.list .item .modified { + display: none; + } + #listing.list .item .name { + width: 100%; + } + .frontmatter { + column-count: 1; + } +} + +@media screen and (max-width: 450px) { + #bottom-bar p { + display: none !important; + } +} + + +/* * * * * * * * * * * * * * * * + * ANIMATIONS * + * * * * * * * * * * * * * * * */ + +@keyframes spin { + 100% { + -webkit-transform: rotate(-360deg); + transform: rotate(-360deg); + } +} diff --git a/_embed/public/js/form2js.js b/_embed/public/js/form2js.js new file mode 100644 index 00000000..8d739bbd --- /dev/null +++ b/_embed/public/js/form2js.js @@ -0,0 +1 @@ +!function(e,n){"undefined"!=typeof exports&&"undefined"!=typeof module&&module.exports?module.exports=n():"function"==typeof define&&define.amd?define(n):e.form2js=n()}(this,function(){"use strict";function e(e,r,u,i,a,l){l=!!l,void 0!==u&&null!=u||(u=!0),void 0!==r&&null!=r||(r="."),arguments.length<5&&(a=!1);var o,c=[],s=0;if((e="string"==typeof e?document.getElementById(e):e).constructor==Array||"undefined"!=typeof NodeList&&e.constructor==NodeList)for(;o=e[s++];)c=c.concat(t(o,i,a,l));else c=t(e,i,a,l);return n(c,u,r)}function n(e,n,t){var r,u,i,a,l,o,c,s,f,d,h,m,g={},p={};for(r=0;r1)for(i=0;i-1&&u==o.length-1?(s+=f=h.substr(0,h.indexOf("[")),c[f]||(c[f]=[]),c[f].push(l)):h.indexOf("[")>-1?(p[s+="_"+(f=h.substr(0,h.indexOf("[")))+"_"+(d=h.replace(/(^([a-z_]+)?\[)|(\]$)/gi,""))]||(p[s]={}),""==f||c[f]||(c[f]=[]),u==o.length-1?""==f?(c.push(l),p[s][d]=c[c.length-1]):(c[f].push(l),p[s][d]=c[f][c[f].length-1]):p[s][d]||(/^[0-9a-z_]+\[?/i.test(o[u+1])?c[f].push({}):c[f].push([]),p[s][d]=c[f][c[f].length-1]),c=p[s][d]):(s+=h,u0?a:r(e,n,t,i)}function r(e,n,t,r){for(var i=[],a=e.firstChild;a;)i=i.concat(u(a,n,t,r)),a=a.nextSibling;return i}function u(e,n,t,u){if(e.disabled&&!u)return[];var l,o,c,s=i(e,t);return l=n&&n(e),l&&l.name?c=[l]:""!=s&&e.nodeName.match(/INPUT|TEXTAREA/i)?c=null===(o=a(e,u))?[]:[{name:s,value:o}]:""!=s&&e.nodeName.match(/SELECT/i)?(o=a(e,u),c=[{name:s.replace(/\[\]$/,""),value:o}]):c=r(e,n,t,u),c}function i(e,n){return e.name&&""!=e.name?e.name:n&&e.id&&""!=e.id?e.id:""}function a(e,n){if(e.disabled&&!n)return null;switch(e.nodeName){case"INPUT":case"TEXTAREA":switch(e.type.toLowerCase()){case"radio":if(e.checked&&"false"===e.value)return!1;case"checkbox":if(e.checked&&"true"===e.value)return!0;if(!e.checked&&"true"===e.value)return!1;if(e.checked)return e.value;break;case"button":case"reset":case"submit":case"image":return"";default:return e.value}break;case"SELECT":return l(e)}return null}function l(e){var n,t,r,u=[];if(!e.multiple)return e.value;for(t=0,r=(n=e.getElementsByTagName("option")).length;t 1) - { - for(k = 0; k < namePart.length; k++) - { - if (k == 0) - { - namePart[k] = namePart[k] + ']'; - } - else if (k == namePart.length - 1) - { - namePart[k] = '[' + namePart[k]; - } - else - { - namePart[k] = '[' + namePart[k] + ']'; - } - - arrIdx = namePart[k].match(/([a-z_]+)?\[([a-z_][a-z0-9_]+?)\]/i); - if (arrIdx) - { - for(l = 1; l < arrIdx.length; l++) - { - if (arrIdx[l]) nameParts.push(arrIdx[l]); - } - } - else{ - nameParts.push(namePart[k]); - } - } - } - else - nameParts = nameParts.concat(namePart); - } - - for (j = 0; j < nameParts.length; j++) - { - namePart = nameParts[j]; - - if (namePart.indexOf('[]') > -1 && j == nameParts.length - 1) - { - arrName = namePart.substr(0, namePart.indexOf('[')); - arrNameFull += arrName; - - if (!currResult[arrName]) currResult[arrName] = []; - currResult[arrName].push(value); - } - else if (namePart.indexOf('[') > -1) - { - arrName = namePart.substr(0, namePart.indexOf('[')); - arrIdx = namePart.replace(/(^([a-z_]+)?\[)|(\]$)/gi, ''); - - /* Unique array name */ - arrNameFull += '_' + arrName + '_' + arrIdx; - - /* - * Because arrIdx in field name can be not zero-based and step can be - * other than 1, we can't use them in target array directly. - * Instead we're making a hash where key is arrIdx and value is a reference to - * added array element - */ - - if (!arrays[arrNameFull]) arrays[arrNameFull] = {}; - if (arrName != '' && !currResult[arrName]) currResult[arrName] = []; - - if (j == nameParts.length - 1) - { - if (arrName == '') - { - currResult.push(value); - arrays[arrNameFull][arrIdx] = convertValue(currResult[currResult.length - 1]); - } - else - { - currResult[arrName].push(value); - arrays[arrNameFull][arrIdx] = convertValue(currResult[arrName][currResult[arrName].length - 1]); - } - } - else - { - if (!arrays[arrNameFull][arrIdx]) - { - if ((/^[0-9a-z_]+\[?/i).test(nameParts[j+1])) currResult[arrName].push({}); - else currResult[arrName].push([]); - - arrays[arrNameFull][arrIdx] = convertValue(currResult[arrName][currResult[arrName].length - 1]); - } - } - - currResult = convertValue(arrays[arrNameFull][arrIdx]); - } - else - { - arrNameFull += namePart; - - if (j < nameParts.length - 1) /* Not the last part of name - means object */ - { - if (!currResult[namePart]) currResult[namePart] = {}; - currResult = convertValue(currResult[namePart]); - } - else - { - currResult[namePart] = convertValue(value); - } - } - } - } - - return result; - } - - function convertValue(value) { - if (value == "true") return true; - if (value == "false") return false; - if (!isNaN(value)) return parseInt(value); - return value; - } - - function getFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled) - { - var result = extractNodeValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled); - return result.length > 0 ? result : getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled); - } - - function getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled) - { - var result = [], - currentNode = rootNode.firstChild; - - while (currentNode) - { - result = result.concat(extractNodeValues(currentNode, nodeCallback, useIdIfEmptyName, getDisabled)); - currentNode = currentNode.nextSibling; - } - - return result; - } - - function extractNodeValues(node, nodeCallback, useIdIfEmptyName, getDisabled) { - if (node.disabled && !getDisabled) return []; - - var callbackResult, fieldValue, result, fieldName = getFieldName(node, useIdIfEmptyName); - - callbackResult = nodeCallback && nodeCallback(node); - - if (callbackResult && callbackResult.name) { - result = [callbackResult]; - } - else if (fieldName != '' && node.nodeName.match(/INPUT|TEXTAREA/i)) { - fieldValue = getFieldValue(node, getDisabled); - if (null === fieldValue) { - result = []; - } else { - result = [ { name: fieldName, value: fieldValue} ]; - } - } - else if (fieldName != '' && node.nodeName.match(/SELECT/i)) { - fieldValue = getFieldValue(node, getDisabled); - result = [ { name: fieldName.replace(/\[\]$/, ''), value: fieldValue } ]; - } - else { - result = getSubFormValues(node, nodeCallback, useIdIfEmptyName, getDisabled); - } - - return result; - } - - function getFieldName(node, useIdIfEmptyName) - { - if (node.name && node.name != '') return node.name; - else if (useIdIfEmptyName && node.id && node.id != '') return node.id; - else return ''; - } - - - function getFieldValue(fieldNode, getDisabled) - { - if (fieldNode.disabled && !getDisabled) return null; - - switch (fieldNode.nodeName) { - case 'INPUT': - case 'TEXTAREA': - switch (fieldNode.type.toLowerCase()) { - case 'radio': - if (fieldNode.checked && fieldNode.value === "false") return false; - case 'checkbox': - if (fieldNode.checked && fieldNode.value === "true") return true; - if (!fieldNode.checked && fieldNode.value === "true") return false; - if (fieldNode.checked) return fieldNode.value; - break; - - case 'button': - case 'reset': - case 'submit': - case 'image': - return ''; - break; - - default: - return fieldNode.value; - break; - } - break; - - case 'SELECT': - return getSelectedOptionValue(fieldNode); - break; - - default: - break; - } - - return null; - } - - function getSelectedOptionValue(selectNode) - { - var multiple = selectNode.multiple, - result = [], - options, - i, l; - - if (!multiple) return selectNode.value; - - for (options = selectNode.getElementsByTagName("option"), i = 0, l = options.length; i < l; i++) - { - if (options[i].selected) result.push(options[i].value); - } - - return result; - } - - return form2js; - -})); diff --git a/_embed/templates/base.tmpl b/_embed/templates/base.tmpl index 38fbeaf5..14dbb525 100644 --- a/_embed/templates/base.tmpl +++ b/_embed/templates/base.tmpl @@ -5,9 +5,9 @@ {{.Name}} - - - + + + {{- if ne .User.StyleSheet "" -}} {{- end -}} @@ -18,16 +18,13 @@ baseURL = "{{.Config.AbsoluteURL}}", prefixURL = "{{ .Config.PrefixURL }}"; - + {{- if .IsDir }} - + {{- else }} - - - - {{- end }} - {{- if .Config.HugoEnabled }} - + + + {{- end }} diff --git a/assets/assets.go b/assets/assets.go index ca2e8b73..22990cbe 100644 --- a/assets/assets.go +++ b/assets/assets.go @@ -10,7 +10,7 @@ import ( ) // BaseURL is the url of the assets -const BaseURL = "/_filemanagerinternal" +const BaseURL = "/_internal" // Serve provides the needed assets for the front-end func Serve(w http.ResponseWriter, r *http.Request, c *filemanager.Config) (int, error) { diff --git a/assets/binary.go b/assets/binary.go new file mode 100644 index 00000000..560a6b56 --- /dev/null +++ b/assets/binary.go @@ -0,0 +1,7413 @@ +// Code generated by go-bindata. +// sources: +// _embed/templates/base.tmpl +// _embed/templates/editor.tmpl +// _embed/templates/frontmatter.tmpl +// _embed/templates/listing.tmpl +// _embed/templates/minimal.tmpl +// _embed/templates/single.tmpl +// _embed/public/js/common.js +// _embed/public/js/editor.js +// _embed/public/js/form2js.js +// _embed/public/js/listing.js +// _embed/public/css/fonts.css +// _embed/public/css/material/icons.woff2 +// _embed/public/css/normalize.css +// _embed/public/css/roboto/medium-cyrillic-ext.woff2 +// _embed/public/css/roboto/medium-cyrillic.woff2 +// _embed/public/css/roboto/medium-greek-ext.woff2 +// _embed/public/css/roboto/medium-greek.woff2 +// _embed/public/css/roboto/medium-latin-ext.woff2 +// _embed/public/css/roboto/medium-latin.woff2 +// _embed/public/css/roboto/medium-vietnamese.woff2 +// _embed/public/css/roboto/normal-cyrillic-ext.woff2 +// _embed/public/css/roboto/normal-cyrillic.woff2 +// _embed/public/css/roboto/normal-greek-ext.woff2 +// _embed/public/css/roboto/normal-greek.woff2 +// _embed/public/css/roboto/normal-latin-ext.woff2 +// _embed/public/css/roboto/normal-latin.woff2 +// _embed/public/css/roboto/normal-vietnamese.woff2 +// _embed/public/css/styles.css +// _embed/public/ace/src-min/ace.js +// _embed/public/ace/src-min/ext-beautify.js +// _embed/public/ace/src-min/ext-chromevox.js +// _embed/public/ace/src-min/ext-elastic_tabstops_lite.js +// _embed/public/ace/src-min/ext-emmet.js +// _embed/public/ace/src-min/ext-error_marker.js +// _embed/public/ace/src-min/ext-keybinding_menu.js +// _embed/public/ace/src-min/ext-language_tools.js +// _embed/public/ace/src-min/ext-linking.js +// _embed/public/ace/src-min/ext-modelist.js +// _embed/public/ace/src-min/ext-old_ie.js +// _embed/public/ace/src-min/ext-searchbox.js +// _embed/public/ace/src-min/ext-settings_menu.js +// _embed/public/ace/src-min/ext-spellcheck.js +// _embed/public/ace/src-min/ext-split.js +// _embed/public/ace/src-min/ext-static_highlight.js +// _embed/public/ace/src-min/ext-statusbar.js +// _embed/public/ace/src-min/ext-textarea.js +// _embed/public/ace/src-min/ext-themelist.js +// _embed/public/ace/src-min/ext-whitespace.js +// _embed/public/ace/src-min/keybinding-emacs.js +// _embed/public/ace/src-min/keybinding-vim.js +// _embed/public/ace/src-min/mode-abap.js +// _embed/public/ace/src-min/mode-abc.js +// _embed/public/ace/src-min/mode-actionscript.js +// _embed/public/ace/src-min/mode-ada.js +// _embed/public/ace/src-min/mode-apache_conf.js +// _embed/public/ace/src-min/mode-applescript.js +// _embed/public/ace/src-min/mode-asciidoc.js +// _embed/public/ace/src-min/mode-assembly_x86.js +// _embed/public/ace/src-min/mode-autohotkey.js +// _embed/public/ace/src-min/mode-batchfile.js +// _embed/public/ace/src-min/mode-bro.js +// _embed/public/ace/src-min/mode-c9search.js +// _embed/public/ace/src-min/mode-c_cpp.js +// _embed/public/ace/src-min/mode-cirru.js +// _embed/public/ace/src-min/mode-clojure.js +// _embed/public/ace/src-min/mode-cobol.js +// _embed/public/ace/src-min/mode-coffee.js +// _embed/public/ace/src-min/mode-coldfusion.js +// _embed/public/ace/src-min/mode-csharp.js +// _embed/public/ace/src-min/mode-css.js +// _embed/public/ace/src-min/mode-curly.js +// _embed/public/ace/src-min/mode-d.js +// _embed/public/ace/src-min/mode-dart.js +// _embed/public/ace/src-min/mode-diff.js +// _embed/public/ace/src-min/mode-django.js +// _embed/public/ace/src-min/mode-dockerfile.js +// _embed/public/ace/src-min/mode-dot.js +// _embed/public/ace/src-min/mode-drools.js +// _embed/public/ace/src-min/mode-eiffel.js +// _embed/public/ace/src-min/mode-ejs.js +// _embed/public/ace/src-min/mode-elixir.js +// _embed/public/ace/src-min/mode-elm.js +// _embed/public/ace/src-min/mode-erlang.js +// _embed/public/ace/src-min/mode-forth.js +// _embed/public/ace/src-min/mode-fortran.js +// _embed/public/ace/src-min/mode-ftl.js +// _embed/public/ace/src-min/mode-gcode.js +// _embed/public/ace/src-min/mode-gherkin.js +// _embed/public/ace/src-min/mode-gitignore.js +// _embed/public/ace/src-min/mode-glsl.js +// _embed/public/ace/src-min/mode-gobstones.js +// _embed/public/ace/src-min/mode-golang.js +// _embed/public/ace/src-min/mode-groovy.js +// _embed/public/ace/src-min/mode-haml.js +// _embed/public/ace/src-min/mode-handlebars.js +// _embed/public/ace/src-min/mode-haskell.js +// _embed/public/ace/src-min/mode-haskell_cabal.js +// _embed/public/ace/src-min/mode-haxe.js +// _embed/public/ace/src-min/mode-hjson.js +// _embed/public/ace/src-min/mode-html.js +// _embed/public/ace/src-min/mode-html_elixir.js +// _embed/public/ace/src-min/mode-html_ruby.js +// _embed/public/ace/src-min/mode-ini.js +// _embed/public/ace/src-min/mode-io.js +// _embed/public/ace/src-min/mode-jack.js +// _embed/public/ace/src-min/mode-jade.js +// _embed/public/ace/src-min/mode-java.js +// _embed/public/ace/src-min/mode-javascript.js +// _embed/public/ace/src-min/mode-json.js +// _embed/public/ace/src-min/mode-jsoniq.js +// _embed/public/ace/src-min/mode-jsp.js +// _embed/public/ace/src-min/mode-jsx.js +// _embed/public/ace/src-min/mode-julia.js +// _embed/public/ace/src-min/mode-kotlin.js +// _embed/public/ace/src-min/mode-latex.js +// _embed/public/ace/src-min/mode-lean.js +// _embed/public/ace/src-min/mode-less.js +// _embed/public/ace/src-min/mode-liquid.js +// _embed/public/ace/src-min/mode-lisp.js +// _embed/public/ace/src-min/mode-live_script.js +// _embed/public/ace/src-min/mode-livescript.js +// _embed/public/ace/src-min/mode-logiql.js +// _embed/public/ace/src-min/mode-lsl.js +// _embed/public/ace/src-min/mode-lua.js +// _embed/public/ace/src-min/mode-luapage.js +// _embed/public/ace/src-min/mode-lucene.js +// _embed/public/ace/src-min/mode-makefile.js +// _embed/public/ace/src-min/mode-markdown.js +// _embed/public/ace/src-min/mode-mask.js +// _embed/public/ace/src-min/mode-matlab.js +// _embed/public/ace/src-min/mode-maze.js +// _embed/public/ace/src-min/mode-mel.js +// _embed/public/ace/src-min/mode-mips_assembler.js +// _embed/public/ace/src-min/mode-mipsassembler.js +// _embed/public/ace/src-min/mode-mushcode.js +// _embed/public/ace/src-min/mode-mysql.js +// _embed/public/ace/src-min/mode-nix.js +// _embed/public/ace/src-min/mode-nsis.js +// _embed/public/ace/src-min/mode-objectivec.js +// _embed/public/ace/src-min/mode-ocaml.js +// _embed/public/ace/src-min/mode-pascal.js +// _embed/public/ace/src-min/mode-perl.js +// _embed/public/ace/src-min/mode-pgsql.js +// _embed/public/ace/src-min/mode-php.js +// _embed/public/ace/src-min/mode-plain_text.js +// _embed/public/ace/src-min/mode-powershell.js +// _embed/public/ace/src-min/mode-praat.js +// _embed/public/ace/src-min/mode-prolog.js +// _embed/public/ace/src-min/mode-properties.js +// _embed/public/ace/src-min/mode-protobuf.js +// _embed/public/ace/src-min/mode-python.js +// _embed/public/ace/src-min/mode-r.js +// _embed/public/ace/src-min/mode-razor.js +// _embed/public/ace/src-min/mode-rdoc.js +// _embed/public/ace/src-min/mode-rhtml.js +// _embed/public/ace/src-min/mode-rst.js +// _embed/public/ace/src-min/mode-ruby.js +// _embed/public/ace/src-min/mode-rust.js +// _embed/public/ace/src-min/mode-sass.js +// _embed/public/ace/src-min/mode-scad.js +// _embed/public/ace/src-min/mode-scala.js +// _embed/public/ace/src-min/mode-scheme.js +// _embed/public/ace/src-min/mode-scss.js +// _embed/public/ace/src-min/mode-sh.js +// _embed/public/ace/src-min/mode-sjs.js +// _embed/public/ace/src-min/mode-smarty.js +// _embed/public/ace/src-min/mode-snippets.js +// _embed/public/ace/src-min/mode-soy_template.js +// _embed/public/ace/src-min/mode-space.js +// _embed/public/ace/src-min/mode-sql.js +// _embed/public/ace/src-min/mode-sqlserver.js +// _embed/public/ace/src-min/mode-stylus.js +// _embed/public/ace/src-min/mode-svg.js +// _embed/public/ace/src-min/mode-swift.js +// _embed/public/ace/src-min/mode-swig.js +// _embed/public/ace/src-min/mode-tcl.js +// _embed/public/ace/src-min/mode-tex.js +// _embed/public/ace/src-min/mode-text.js +// _embed/public/ace/src-min/mode-textile.js +// _embed/public/ace/src-min/mode-toml.js +// _embed/public/ace/src-min/mode-tsx.js +// _embed/public/ace/src-min/mode-twig.js +// _embed/public/ace/src-min/mode-typescript.js +// _embed/public/ace/src-min/mode-vala.js +// _embed/public/ace/src-min/mode-vbscript.js +// _embed/public/ace/src-min/mode-velocity.js +// _embed/public/ace/src-min/mode-verilog.js +// _embed/public/ace/src-min/mode-vhdl.js +// _embed/public/ace/src-min/mode-wollok.js +// _embed/public/ace/src-min/mode-xml.js +// _embed/public/ace/src-min/mode-xquery.js +// _embed/public/ace/src-min/mode-yaml.js +// _embed/public/ace/src-min/snippets/abap.js +// _embed/public/ace/src-min/snippets/abc.js +// _embed/public/ace/src-min/snippets/actionscript.js +// _embed/public/ace/src-min/snippets/ada.js +// _embed/public/ace/src-min/snippets/apache_conf.js +// _embed/public/ace/src-min/snippets/applescript.js +// _embed/public/ace/src-min/snippets/asciidoc.js +// _embed/public/ace/src-min/snippets/assembly_x86.js +// _embed/public/ace/src-min/snippets/autohotkey.js +// _embed/public/ace/src-min/snippets/batchfile.js +// _embed/public/ace/src-min/snippets/bro.js +// _embed/public/ace/src-min/snippets/c9search.js +// _embed/public/ace/src-min/snippets/c_cpp.js +// _embed/public/ace/src-min/snippets/cirru.js +// _embed/public/ace/src-min/snippets/clojure.js +// _embed/public/ace/src-min/snippets/cobol.js +// _embed/public/ace/src-min/snippets/coffee.js +// _embed/public/ace/src-min/snippets/coldfusion.js +// _embed/public/ace/src-min/snippets/csharp.js +// _embed/public/ace/src-min/snippets/css.js +// _embed/public/ace/src-min/snippets/curly.js +// _embed/public/ace/src-min/snippets/d.js +// _embed/public/ace/src-min/snippets/dart.js +// _embed/public/ace/src-min/snippets/diff.js +// _embed/public/ace/src-min/snippets/django.js +// _embed/public/ace/src-min/snippets/dockerfile.js +// _embed/public/ace/src-min/snippets/dot.js +// _embed/public/ace/src-min/snippets/drools.js +// _embed/public/ace/src-min/snippets/eiffel.js +// _embed/public/ace/src-min/snippets/ejs.js +// _embed/public/ace/src-min/snippets/elixir.js +// _embed/public/ace/src-min/snippets/elm.js +// _embed/public/ace/src-min/snippets/erlang.js +// _embed/public/ace/src-min/snippets/forth.js +// _embed/public/ace/src-min/snippets/fortran.js +// _embed/public/ace/src-min/snippets/ftl.js +// _embed/public/ace/src-min/snippets/gcode.js +// _embed/public/ace/src-min/snippets/gherkin.js +// _embed/public/ace/src-min/snippets/gitignore.js +// _embed/public/ace/src-min/snippets/glsl.js +// _embed/public/ace/src-min/snippets/gobstones.js +// _embed/public/ace/src-min/snippets/golang.js +// _embed/public/ace/src-min/snippets/groovy.js +// _embed/public/ace/src-min/snippets/haml.js +// _embed/public/ace/src-min/snippets/handlebars.js +// _embed/public/ace/src-min/snippets/haskell.js +// _embed/public/ace/src-min/snippets/haskell_cabal.js +// _embed/public/ace/src-min/snippets/haxe.js +// _embed/public/ace/src-min/snippets/hjson.js +// _embed/public/ace/src-min/snippets/html.js +// _embed/public/ace/src-min/snippets/html_elixir.js +// _embed/public/ace/src-min/snippets/html_ruby.js +// _embed/public/ace/src-min/snippets/ini.js +// _embed/public/ace/src-min/snippets/io.js +// _embed/public/ace/src-min/snippets/jack.js +// _embed/public/ace/src-min/snippets/jade.js +// _embed/public/ace/src-min/snippets/java.js +// _embed/public/ace/src-min/snippets/javascript.js +// _embed/public/ace/src-min/snippets/json.js +// _embed/public/ace/src-min/snippets/jsoniq.js +// _embed/public/ace/src-min/snippets/jsp.js +// _embed/public/ace/src-min/snippets/jsx.js +// _embed/public/ace/src-min/snippets/julia.js +// _embed/public/ace/src-min/snippets/kotlin.js +// _embed/public/ace/src-min/snippets/latex.js +// _embed/public/ace/src-min/snippets/lean.js +// _embed/public/ace/src-min/snippets/less.js +// _embed/public/ace/src-min/snippets/liquid.js +// _embed/public/ace/src-min/snippets/lisp.js +// _embed/public/ace/src-min/snippets/live_script.js +// _embed/public/ace/src-min/snippets/livescript.js +// _embed/public/ace/src-min/snippets/logiql.js +// _embed/public/ace/src-min/snippets/lsl.js +// _embed/public/ace/src-min/snippets/lua.js +// _embed/public/ace/src-min/snippets/luapage.js +// _embed/public/ace/src-min/snippets/lucene.js +// _embed/public/ace/src-min/snippets/makefile.js +// _embed/public/ace/src-min/snippets/markdown.js +// _embed/public/ace/src-min/snippets/mask.js +// _embed/public/ace/src-min/snippets/matlab.js +// _embed/public/ace/src-min/snippets/maze.js +// _embed/public/ace/src-min/snippets/mel.js +// _embed/public/ace/src-min/snippets/mips_assembler.js +// _embed/public/ace/src-min/snippets/mipsassembler.js +// _embed/public/ace/src-min/snippets/mushcode.js +// _embed/public/ace/src-min/snippets/mysql.js +// _embed/public/ace/src-min/snippets/nix.js +// _embed/public/ace/src-min/snippets/nsis.js +// _embed/public/ace/src-min/snippets/objectivec.js +// _embed/public/ace/src-min/snippets/ocaml.js +// _embed/public/ace/src-min/snippets/pascal.js +// _embed/public/ace/src-min/snippets/perl.js +// _embed/public/ace/src-min/snippets/pgsql.js +// _embed/public/ace/src-min/snippets/php.js +// _embed/public/ace/src-min/snippets/plain_text.js +// _embed/public/ace/src-min/snippets/powershell.js +// _embed/public/ace/src-min/snippets/praat.js +// _embed/public/ace/src-min/snippets/prolog.js +// _embed/public/ace/src-min/snippets/properties.js +// _embed/public/ace/src-min/snippets/protobuf.js +// _embed/public/ace/src-min/snippets/python.js +// _embed/public/ace/src-min/snippets/r.js +// _embed/public/ace/src-min/snippets/razor.js +// _embed/public/ace/src-min/snippets/rdoc.js +// _embed/public/ace/src-min/snippets/rhtml.js +// _embed/public/ace/src-min/snippets/rst.js +// _embed/public/ace/src-min/snippets/ruby.js +// _embed/public/ace/src-min/snippets/rust.js +// _embed/public/ace/src-min/snippets/sass.js +// _embed/public/ace/src-min/snippets/scad.js +// _embed/public/ace/src-min/snippets/scala.js +// _embed/public/ace/src-min/snippets/scheme.js +// _embed/public/ace/src-min/snippets/scss.js +// _embed/public/ace/src-min/snippets/sh.js +// _embed/public/ace/src-min/snippets/sjs.js +// _embed/public/ace/src-min/snippets/smarty.js +// _embed/public/ace/src-min/snippets/snippets.js +// _embed/public/ace/src-min/snippets/soy_template.js +// _embed/public/ace/src-min/snippets/space.js +// _embed/public/ace/src-min/snippets/sql.js +// _embed/public/ace/src-min/snippets/sqlserver.js +// _embed/public/ace/src-min/snippets/stylus.js +// _embed/public/ace/src-min/snippets/svg.js +// _embed/public/ace/src-min/snippets/swift.js +// _embed/public/ace/src-min/snippets/swig.js +// _embed/public/ace/src-min/snippets/tcl.js +// _embed/public/ace/src-min/snippets/tex.js +// _embed/public/ace/src-min/snippets/text.js +// _embed/public/ace/src-min/snippets/textile.js +// _embed/public/ace/src-min/snippets/toml.js +// _embed/public/ace/src-min/snippets/tsx.js +// _embed/public/ace/src-min/snippets/twig.js +// _embed/public/ace/src-min/snippets/typescript.js +// _embed/public/ace/src-min/snippets/vala.js +// _embed/public/ace/src-min/snippets/vbscript.js +// _embed/public/ace/src-min/snippets/velocity.js +// _embed/public/ace/src-min/snippets/verilog.js +// _embed/public/ace/src-min/snippets/vhdl.js +// _embed/public/ace/src-min/snippets/wollok.js +// _embed/public/ace/src-min/snippets/xml.js +// _embed/public/ace/src-min/snippets/xquery.js +// _embed/public/ace/src-min/snippets/yaml.js +// _embed/public/ace/src-min/theme-github.js +// _embed/public/ace/src-min/worker-coffee.js +// _embed/public/ace/src-min/worker-css.js +// _embed/public/ace/src-min/worker-html.js +// _embed/public/ace/src-min/worker-javascript.js +// _embed/public/ace/src-min/worker-json.js +// _embed/public/ace/src-min/worker-lua.js +// _embed/public/ace/src-min/worker-php.js +// _embed/public/ace/src-min/worker-xml.js +// _embed/public/ace/src-min/worker-xquery.js +// DO NOT EDIT! + +package assets + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" +) + +// bindataRead reads the given file from disk. It returns an error on failure. +func bindataRead(path, name string) ([]byte, error) { + buf, err := ioutil.ReadFile(path) + if err != nil { + err = fmt.Errorf("Error reading asset %s at %s: %v", name, path, err) + } + return buf, err +} + +type asset struct { + bytes []byte + info os.FileInfo +} + +// templatesBaseTmpl reads file data from disk. It returns an error on failure. +func templatesBaseTmpl() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\base.tmpl" + name := "templates/base.tmpl" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// templatesEditorTmpl reads file data from disk. It returns an error on failure. +func templatesEditorTmpl() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\editor.tmpl" + name := "templates/editor.tmpl" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// templatesFrontmatterTmpl reads file data from disk. It returns an error on failure. +func templatesFrontmatterTmpl() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\frontmatter.tmpl" + name := "templates/frontmatter.tmpl" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// templatesListingTmpl reads file data from disk. It returns an error on failure. +func templatesListingTmpl() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\listing.tmpl" + name := "templates/listing.tmpl" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// templatesMinimalTmpl reads file data from disk. It returns an error on failure. +func templatesMinimalTmpl() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\minimal.tmpl" + name := "templates/minimal.tmpl" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// templatesSingleTmpl reads file data from disk. It returns an error on failure. +func templatesSingleTmpl() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\single.tmpl" + name := "templates/single.tmpl" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicJsCommonJs reads file data from disk. It returns an error on failure. +func publicJsCommonJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\js\\common.js" + name := "public/js/common.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicJsEditorJs reads file data from disk. It returns an error on failure. +func publicJsEditorJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\js\\editor.js" + name := "public/js/editor.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicJsForm2jsJs reads file data from disk. It returns an error on failure. +func publicJsForm2jsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\js\\form2js.js" + name := "public/js/form2js.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicJsListingJs reads file data from disk. It returns an error on failure. +func publicJsListingJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\js\\listing.js" + name := "public/js/listing.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssFontsCss reads file data from disk. It returns an error on failure. +func publicCssFontsCss() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\fonts.css" + name := "public/css/fonts.css" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssMaterialIconsWoff2 reads file data from disk. It returns an error on failure. +func publicCssMaterialIconsWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\material\\icons.woff2" + name := "public/css/material/icons.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssNormalizeCss reads file data from disk. It returns an error on failure. +func publicCssNormalizeCss() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\normalize.css" + name := "public/css/normalize.css" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoMediumCyrillicExtWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoMediumCyrillicExtWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-cyrillic-ext.woff2" + name := "public/css/roboto/medium-cyrillic-ext.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoMediumCyrillicWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoMediumCyrillicWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-cyrillic.woff2" + name := "public/css/roboto/medium-cyrillic.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoMediumGreekExtWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoMediumGreekExtWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-greek-ext.woff2" + name := "public/css/roboto/medium-greek-ext.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoMediumGreekWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoMediumGreekWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-greek.woff2" + name := "public/css/roboto/medium-greek.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoMediumLatinExtWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoMediumLatinExtWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-latin-ext.woff2" + name := "public/css/roboto/medium-latin-ext.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoMediumLatinWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoMediumLatinWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-latin.woff2" + name := "public/css/roboto/medium-latin.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoMediumVietnameseWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoMediumVietnameseWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-vietnamese.woff2" + name := "public/css/roboto/medium-vietnamese.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoNormalCyrillicExtWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoNormalCyrillicExtWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-cyrillic-ext.woff2" + name := "public/css/roboto/normal-cyrillic-ext.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoNormalCyrillicWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoNormalCyrillicWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-cyrillic.woff2" + name := "public/css/roboto/normal-cyrillic.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoNormalGreekExtWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoNormalGreekExtWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-greek-ext.woff2" + name := "public/css/roboto/normal-greek-ext.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoNormalGreekWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoNormalGreekWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-greek.woff2" + name := "public/css/roboto/normal-greek.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoNormalLatinExtWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoNormalLatinExtWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-latin-ext.woff2" + name := "public/css/roboto/normal-latin-ext.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoNormalLatinWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoNormalLatinWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-latin.woff2" + name := "public/css/roboto/normal-latin.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssRobotoNormalVietnameseWoff2 reads file data from disk. It returns an error on failure. +func publicCssRobotoNormalVietnameseWoff2() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-vietnamese.woff2" + name := "public/css/roboto/normal-vietnamese.woff2" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicCssStylesCss reads file data from disk. It returns an error on failure. +func publicCssStylesCss() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\styles.css" + name := "public/css/styles.css" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinAceJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinAceJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ace.js" + name := "public/ace/src-min/ace.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtBeautifyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtBeautifyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-beautify.js" + name := "public/ace/src-min/ext-beautify.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtChromevoxJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtChromevoxJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-chromevox.js" + name := "public/ace/src-min/ext-chromevox.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtElastic_tabstops_liteJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtElastic_tabstops_liteJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-elastic_tabstops_lite.js" + name := "public/ace/src-min/ext-elastic_tabstops_lite.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtEmmetJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtEmmetJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-emmet.js" + name := "public/ace/src-min/ext-emmet.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtError_markerJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtError_markerJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-error_marker.js" + name := "public/ace/src-min/ext-error_marker.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtKeybinding_menuJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtKeybinding_menuJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-keybinding_menu.js" + name := "public/ace/src-min/ext-keybinding_menu.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtLanguage_toolsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtLanguage_toolsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-language_tools.js" + name := "public/ace/src-min/ext-language_tools.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtLinkingJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtLinkingJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-linking.js" + name := "public/ace/src-min/ext-linking.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtModelistJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtModelistJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-modelist.js" + name := "public/ace/src-min/ext-modelist.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtOld_ieJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtOld_ieJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-old_ie.js" + name := "public/ace/src-min/ext-old_ie.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtSearchboxJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtSearchboxJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-searchbox.js" + name := "public/ace/src-min/ext-searchbox.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtSettings_menuJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtSettings_menuJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-settings_menu.js" + name := "public/ace/src-min/ext-settings_menu.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtSpellcheckJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtSpellcheckJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-spellcheck.js" + name := "public/ace/src-min/ext-spellcheck.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtSplitJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtSplitJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-split.js" + name := "public/ace/src-min/ext-split.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtStatic_highlightJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtStatic_highlightJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-static_highlight.js" + name := "public/ace/src-min/ext-static_highlight.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtStatusbarJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtStatusbarJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-statusbar.js" + name := "public/ace/src-min/ext-statusbar.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtTextareaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtTextareaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-textarea.js" + name := "public/ace/src-min/ext-textarea.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtThemelistJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtThemelistJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-themelist.js" + name := "public/ace/src-min/ext-themelist.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinExtWhitespaceJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinExtWhitespaceJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-whitespace.js" + name := "public/ace/src-min/ext-whitespace.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinKeybindingEmacsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinKeybindingEmacsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\keybinding-emacs.js" + name := "public/ace/src-min/keybinding-emacs.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinKeybindingVimJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinKeybindingVimJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\keybinding-vim.js" + name := "public/ace/src-min/keybinding-vim.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeAbapJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeAbapJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-abap.js" + name := "public/ace/src-min/mode-abap.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeAbcJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeAbcJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-abc.js" + name := "public/ace/src-min/mode-abc.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeActionscriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeActionscriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-actionscript.js" + name := "public/ace/src-min/mode-actionscript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeAdaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeAdaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ada.js" + name := "public/ace/src-min/mode-ada.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeApache_confJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeApache_confJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-apache_conf.js" + name := "public/ace/src-min/mode-apache_conf.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeApplescriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeApplescriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-applescript.js" + name := "public/ace/src-min/mode-applescript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeAsciidocJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeAsciidocJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-asciidoc.js" + name := "public/ace/src-min/mode-asciidoc.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeAssembly_x86Js reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeAssembly_x86Js() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-assembly_x86.js" + name := "public/ace/src-min/mode-assembly_x86.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeAutohotkeyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeAutohotkeyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-autohotkey.js" + name := "public/ace/src-min/mode-autohotkey.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeBatchfileJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeBatchfileJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-batchfile.js" + name := "public/ace/src-min/mode-batchfile.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeBroJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeBroJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-bro.js" + name := "public/ace/src-min/mode-bro.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeC9searchJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeC9searchJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-c9search.js" + name := "public/ace/src-min/mode-c9search.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeC_cppJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeC_cppJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-c_cpp.js" + name := "public/ace/src-min/mode-c_cpp.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeCirruJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeCirruJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-cirru.js" + name := "public/ace/src-min/mode-cirru.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeClojureJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeClojureJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-clojure.js" + name := "public/ace/src-min/mode-clojure.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeCobolJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeCobolJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-cobol.js" + name := "public/ace/src-min/mode-cobol.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeCoffeeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeCoffeeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-coffee.js" + name := "public/ace/src-min/mode-coffee.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeColdfusionJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeColdfusionJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-coldfusion.js" + name := "public/ace/src-min/mode-coldfusion.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeCsharpJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeCsharpJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-csharp.js" + name := "public/ace/src-min/mode-csharp.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeCssJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeCssJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-css.js" + name := "public/ace/src-min/mode-css.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeCurlyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeCurlyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-curly.js" + name := "public/ace/src-min/mode-curly.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeDJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeDJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-d.js" + name := "public/ace/src-min/mode-d.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeDartJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeDartJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-dart.js" + name := "public/ace/src-min/mode-dart.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeDiffJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeDiffJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-diff.js" + name := "public/ace/src-min/mode-diff.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeDjangoJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeDjangoJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-django.js" + name := "public/ace/src-min/mode-django.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeDockerfileJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeDockerfileJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-dockerfile.js" + name := "public/ace/src-min/mode-dockerfile.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeDotJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeDotJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-dot.js" + name := "public/ace/src-min/mode-dot.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeDroolsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeDroolsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-drools.js" + name := "public/ace/src-min/mode-drools.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeEiffelJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeEiffelJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-eiffel.js" + name := "public/ace/src-min/mode-eiffel.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeEjsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeEjsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ejs.js" + name := "public/ace/src-min/mode-ejs.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeElixirJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeElixirJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-elixir.js" + name := "public/ace/src-min/mode-elixir.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeElmJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeElmJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-elm.js" + name := "public/ace/src-min/mode-elm.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeErlangJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeErlangJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-erlang.js" + name := "public/ace/src-min/mode-erlang.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeForthJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeForthJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-forth.js" + name := "public/ace/src-min/mode-forth.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeFortranJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeFortranJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-fortran.js" + name := "public/ace/src-min/mode-fortran.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeFtlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeFtlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ftl.js" + name := "public/ace/src-min/mode-ftl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeGcodeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeGcodeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-gcode.js" + name := "public/ace/src-min/mode-gcode.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeGherkinJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeGherkinJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-gherkin.js" + name := "public/ace/src-min/mode-gherkin.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeGitignoreJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeGitignoreJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-gitignore.js" + name := "public/ace/src-min/mode-gitignore.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeGlslJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeGlslJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-glsl.js" + name := "public/ace/src-min/mode-glsl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeGobstonesJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeGobstonesJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-gobstones.js" + name := "public/ace/src-min/mode-gobstones.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeGolangJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeGolangJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-golang.js" + name := "public/ace/src-min/mode-golang.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeGroovyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeGroovyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-groovy.js" + name := "public/ace/src-min/mode-groovy.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeHamlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeHamlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-haml.js" + name := "public/ace/src-min/mode-haml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeHandlebarsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeHandlebarsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-handlebars.js" + name := "public/ace/src-min/mode-handlebars.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeHaskellJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeHaskellJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-haskell.js" + name := "public/ace/src-min/mode-haskell.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeHaskell_cabalJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeHaskell_cabalJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-haskell_cabal.js" + name := "public/ace/src-min/mode-haskell_cabal.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeHaxeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeHaxeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-haxe.js" + name := "public/ace/src-min/mode-haxe.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeHjsonJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeHjsonJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-hjson.js" + name := "public/ace/src-min/mode-hjson.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeHtmlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeHtmlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-html.js" + name := "public/ace/src-min/mode-html.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeHtml_elixirJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeHtml_elixirJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-html_elixir.js" + name := "public/ace/src-min/mode-html_elixir.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeHtml_rubyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeHtml_rubyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-html_ruby.js" + name := "public/ace/src-min/mode-html_ruby.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeIniJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeIniJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ini.js" + name := "public/ace/src-min/mode-ini.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeIoJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeIoJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-io.js" + name := "public/ace/src-min/mode-io.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeJackJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeJackJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-jack.js" + name := "public/ace/src-min/mode-jack.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeJadeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeJadeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-jade.js" + name := "public/ace/src-min/mode-jade.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeJavaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeJavaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-java.js" + name := "public/ace/src-min/mode-java.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeJavascriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeJavascriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-javascript.js" + name := "public/ace/src-min/mode-javascript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeJsonJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeJsonJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-json.js" + name := "public/ace/src-min/mode-json.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeJsoniqJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeJsoniqJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-jsoniq.js" + name := "public/ace/src-min/mode-jsoniq.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeJspJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeJspJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-jsp.js" + name := "public/ace/src-min/mode-jsp.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeJsxJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeJsxJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-jsx.js" + name := "public/ace/src-min/mode-jsx.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeJuliaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeJuliaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-julia.js" + name := "public/ace/src-min/mode-julia.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeKotlinJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeKotlinJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-kotlin.js" + name := "public/ace/src-min/mode-kotlin.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLatexJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLatexJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-latex.js" + name := "public/ace/src-min/mode-latex.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLeanJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLeanJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-lean.js" + name := "public/ace/src-min/mode-lean.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLessJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLessJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-less.js" + name := "public/ace/src-min/mode-less.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLiquidJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLiquidJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-liquid.js" + name := "public/ace/src-min/mode-liquid.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLispJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLispJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-lisp.js" + name := "public/ace/src-min/mode-lisp.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLive_scriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLive_scriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-live_script.js" + name := "public/ace/src-min/mode-live_script.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLivescriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLivescriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-livescript.js" + name := "public/ace/src-min/mode-livescript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLogiqlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLogiqlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-logiql.js" + name := "public/ace/src-min/mode-logiql.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLslJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLslJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-lsl.js" + name := "public/ace/src-min/mode-lsl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLuaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLuaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-lua.js" + name := "public/ace/src-min/mode-lua.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLuapageJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLuapageJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-luapage.js" + name := "public/ace/src-min/mode-luapage.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeLuceneJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeLuceneJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-lucene.js" + name := "public/ace/src-min/mode-lucene.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeMakefileJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeMakefileJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-makefile.js" + name := "public/ace/src-min/mode-makefile.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeMarkdownJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeMarkdownJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-markdown.js" + name := "public/ace/src-min/mode-markdown.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeMaskJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeMaskJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mask.js" + name := "public/ace/src-min/mode-mask.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeMatlabJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeMatlabJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-matlab.js" + name := "public/ace/src-min/mode-matlab.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeMazeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeMazeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-maze.js" + name := "public/ace/src-min/mode-maze.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeMelJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeMelJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mel.js" + name := "public/ace/src-min/mode-mel.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeMips_assemblerJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeMips_assemblerJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mips_assembler.js" + name := "public/ace/src-min/mode-mips_assembler.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeMipsassemblerJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeMipsassemblerJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mipsassembler.js" + name := "public/ace/src-min/mode-mipsassembler.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeMushcodeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeMushcodeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mushcode.js" + name := "public/ace/src-min/mode-mushcode.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeMysqlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeMysqlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mysql.js" + name := "public/ace/src-min/mode-mysql.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeNixJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeNixJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-nix.js" + name := "public/ace/src-min/mode-nix.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeNsisJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeNsisJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-nsis.js" + name := "public/ace/src-min/mode-nsis.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeObjectivecJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeObjectivecJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-objectivec.js" + name := "public/ace/src-min/mode-objectivec.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeOcamlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeOcamlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ocaml.js" + name := "public/ace/src-min/mode-ocaml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModePascalJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModePascalJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-pascal.js" + name := "public/ace/src-min/mode-pascal.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModePerlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModePerlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-perl.js" + name := "public/ace/src-min/mode-perl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModePgsqlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModePgsqlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-pgsql.js" + name := "public/ace/src-min/mode-pgsql.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModePhpJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModePhpJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-php.js" + name := "public/ace/src-min/mode-php.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModePlain_textJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModePlain_textJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-plain_text.js" + name := "public/ace/src-min/mode-plain_text.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModePowershellJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModePowershellJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-powershell.js" + name := "public/ace/src-min/mode-powershell.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModePraatJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModePraatJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-praat.js" + name := "public/ace/src-min/mode-praat.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModePrologJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModePrologJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-prolog.js" + name := "public/ace/src-min/mode-prolog.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModePropertiesJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModePropertiesJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-properties.js" + name := "public/ace/src-min/mode-properties.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeProtobufJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeProtobufJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-protobuf.js" + name := "public/ace/src-min/mode-protobuf.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModePythonJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModePythonJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-python.js" + name := "public/ace/src-min/mode-python.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeRJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeRJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-r.js" + name := "public/ace/src-min/mode-r.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeRazorJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeRazorJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-razor.js" + name := "public/ace/src-min/mode-razor.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeRdocJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeRdocJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-rdoc.js" + name := "public/ace/src-min/mode-rdoc.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeRhtmlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeRhtmlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-rhtml.js" + name := "public/ace/src-min/mode-rhtml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeRstJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeRstJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-rst.js" + name := "public/ace/src-min/mode-rst.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeRubyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeRubyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ruby.js" + name := "public/ace/src-min/mode-ruby.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeRustJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeRustJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-rust.js" + name := "public/ace/src-min/mode-rust.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSassJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSassJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-sass.js" + name := "public/ace/src-min/mode-sass.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeScadJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeScadJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-scad.js" + name := "public/ace/src-min/mode-scad.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeScalaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeScalaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-scala.js" + name := "public/ace/src-min/mode-scala.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSchemeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSchemeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-scheme.js" + name := "public/ace/src-min/mode-scheme.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeScssJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeScssJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-scss.js" + name := "public/ace/src-min/mode-scss.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeShJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeShJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-sh.js" + name := "public/ace/src-min/mode-sh.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSjsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSjsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-sjs.js" + name := "public/ace/src-min/mode-sjs.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSmartyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSmartyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-smarty.js" + name := "public/ace/src-min/mode-smarty.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSnippetsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSnippetsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-snippets.js" + name := "public/ace/src-min/mode-snippets.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSoy_templateJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSoy_templateJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-soy_template.js" + name := "public/ace/src-min/mode-soy_template.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSpaceJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSpaceJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-space.js" + name := "public/ace/src-min/mode-space.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSqlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSqlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-sql.js" + name := "public/ace/src-min/mode-sql.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSqlserverJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSqlserverJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-sqlserver.js" + name := "public/ace/src-min/mode-sqlserver.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeStylusJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeStylusJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-stylus.js" + name := "public/ace/src-min/mode-stylus.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSvgJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSvgJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-svg.js" + name := "public/ace/src-min/mode-svg.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSwiftJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSwiftJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-swift.js" + name := "public/ace/src-min/mode-swift.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeSwigJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeSwigJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-swig.js" + name := "public/ace/src-min/mode-swig.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeTclJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeTclJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-tcl.js" + name := "public/ace/src-min/mode-tcl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeTexJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeTexJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-tex.js" + name := "public/ace/src-min/mode-tex.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeTextJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeTextJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-text.js" + name := "public/ace/src-min/mode-text.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeTextileJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeTextileJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-textile.js" + name := "public/ace/src-min/mode-textile.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeTomlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeTomlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-toml.js" + name := "public/ace/src-min/mode-toml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeTsxJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeTsxJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-tsx.js" + name := "public/ace/src-min/mode-tsx.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeTwigJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeTwigJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-twig.js" + name := "public/ace/src-min/mode-twig.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeTypescriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeTypescriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-typescript.js" + name := "public/ace/src-min/mode-typescript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeValaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeValaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-vala.js" + name := "public/ace/src-min/mode-vala.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeVbscriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeVbscriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-vbscript.js" + name := "public/ace/src-min/mode-vbscript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeVelocityJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeVelocityJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-velocity.js" + name := "public/ace/src-min/mode-velocity.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeVerilogJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeVerilogJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-verilog.js" + name := "public/ace/src-min/mode-verilog.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeVhdlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeVhdlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-vhdl.js" + name := "public/ace/src-min/mode-vhdl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeWollokJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeWollokJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-wollok.js" + name := "public/ace/src-min/mode-wollok.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeXmlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeXmlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-xml.js" + name := "public/ace/src-min/mode-xml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeXqueryJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeXqueryJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-xquery.js" + name := "public/ace/src-min/mode-xquery.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinModeYamlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinModeYamlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-yaml.js" + name := "public/ace/src-min/mode-yaml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsAbapJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsAbapJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\abap.js" + name := "public/ace/src-min/snippets/abap.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsAbcJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsAbcJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\abc.js" + name := "public/ace/src-min/snippets/abc.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsActionscriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsActionscriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\actionscript.js" + name := "public/ace/src-min/snippets/actionscript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsAdaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsAdaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ada.js" + name := "public/ace/src-min/snippets/ada.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsApache_confJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsApache_confJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\apache_conf.js" + name := "public/ace/src-min/snippets/apache_conf.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsApplescriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsApplescriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\applescript.js" + name := "public/ace/src-min/snippets/applescript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsAsciidocJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsAsciidocJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\asciidoc.js" + name := "public/ace/src-min/snippets/asciidoc.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsAssembly_x86Js reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsAssembly_x86Js() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\assembly_x86.js" + name := "public/ace/src-min/snippets/assembly_x86.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsAutohotkeyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsAutohotkeyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\autohotkey.js" + name := "public/ace/src-min/snippets/autohotkey.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsBatchfileJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsBatchfileJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\batchfile.js" + name := "public/ace/src-min/snippets/batchfile.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsBroJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsBroJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\bro.js" + name := "public/ace/src-min/snippets/bro.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsC9searchJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsC9searchJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\c9search.js" + name := "public/ace/src-min/snippets/c9search.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsC_cppJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsC_cppJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\c_cpp.js" + name := "public/ace/src-min/snippets/c_cpp.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsCirruJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsCirruJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\cirru.js" + name := "public/ace/src-min/snippets/cirru.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsClojureJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsClojureJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\clojure.js" + name := "public/ace/src-min/snippets/clojure.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsCobolJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsCobolJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\cobol.js" + name := "public/ace/src-min/snippets/cobol.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsCoffeeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsCoffeeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\coffee.js" + name := "public/ace/src-min/snippets/coffee.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsColdfusionJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsColdfusionJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\coldfusion.js" + name := "public/ace/src-min/snippets/coldfusion.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsCsharpJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsCsharpJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\csharp.js" + name := "public/ace/src-min/snippets/csharp.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsCssJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsCssJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\css.js" + name := "public/ace/src-min/snippets/css.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsCurlyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsCurlyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\curly.js" + name := "public/ace/src-min/snippets/curly.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsDJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsDJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\d.js" + name := "public/ace/src-min/snippets/d.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsDartJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsDartJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\dart.js" + name := "public/ace/src-min/snippets/dart.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsDiffJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsDiffJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\diff.js" + name := "public/ace/src-min/snippets/diff.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsDjangoJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsDjangoJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\django.js" + name := "public/ace/src-min/snippets/django.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsDockerfileJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsDockerfileJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\dockerfile.js" + name := "public/ace/src-min/snippets/dockerfile.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsDotJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsDotJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\dot.js" + name := "public/ace/src-min/snippets/dot.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsDroolsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsDroolsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\drools.js" + name := "public/ace/src-min/snippets/drools.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsEiffelJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsEiffelJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\eiffel.js" + name := "public/ace/src-min/snippets/eiffel.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsEjsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsEjsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ejs.js" + name := "public/ace/src-min/snippets/ejs.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsElixirJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsElixirJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\elixir.js" + name := "public/ace/src-min/snippets/elixir.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsElmJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsElmJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\elm.js" + name := "public/ace/src-min/snippets/elm.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsErlangJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsErlangJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\erlang.js" + name := "public/ace/src-min/snippets/erlang.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsForthJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsForthJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\forth.js" + name := "public/ace/src-min/snippets/forth.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsFortranJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsFortranJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\fortran.js" + name := "public/ace/src-min/snippets/fortran.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsFtlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsFtlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ftl.js" + name := "public/ace/src-min/snippets/ftl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsGcodeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsGcodeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\gcode.js" + name := "public/ace/src-min/snippets/gcode.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsGherkinJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsGherkinJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\gherkin.js" + name := "public/ace/src-min/snippets/gherkin.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsGitignoreJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsGitignoreJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\gitignore.js" + name := "public/ace/src-min/snippets/gitignore.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsGlslJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsGlslJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\glsl.js" + name := "public/ace/src-min/snippets/glsl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsGobstonesJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsGobstonesJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\gobstones.js" + name := "public/ace/src-min/snippets/gobstones.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsGolangJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsGolangJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\golang.js" + name := "public/ace/src-min/snippets/golang.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsGroovyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsGroovyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\groovy.js" + name := "public/ace/src-min/snippets/groovy.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsHamlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsHamlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\haml.js" + name := "public/ace/src-min/snippets/haml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsHandlebarsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsHandlebarsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\handlebars.js" + name := "public/ace/src-min/snippets/handlebars.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsHaskellJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsHaskellJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\haskell.js" + name := "public/ace/src-min/snippets/haskell.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsHaskell_cabalJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsHaskell_cabalJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\haskell_cabal.js" + name := "public/ace/src-min/snippets/haskell_cabal.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsHaxeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsHaxeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\haxe.js" + name := "public/ace/src-min/snippets/haxe.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsHjsonJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsHjsonJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\hjson.js" + name := "public/ace/src-min/snippets/hjson.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsHtmlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsHtmlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\html.js" + name := "public/ace/src-min/snippets/html.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsHtml_elixirJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsHtml_elixirJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\html_elixir.js" + name := "public/ace/src-min/snippets/html_elixir.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsHtml_rubyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsHtml_rubyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\html_ruby.js" + name := "public/ace/src-min/snippets/html_ruby.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsIniJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsIniJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ini.js" + name := "public/ace/src-min/snippets/ini.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsIoJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsIoJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\io.js" + name := "public/ace/src-min/snippets/io.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsJackJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsJackJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\jack.js" + name := "public/ace/src-min/snippets/jack.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsJadeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsJadeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\jade.js" + name := "public/ace/src-min/snippets/jade.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsJavaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsJavaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\java.js" + name := "public/ace/src-min/snippets/java.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsJavascriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsJavascriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\javascript.js" + name := "public/ace/src-min/snippets/javascript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsJsonJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsJsonJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\json.js" + name := "public/ace/src-min/snippets/json.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsJsoniqJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsJsoniqJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\jsoniq.js" + name := "public/ace/src-min/snippets/jsoniq.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsJspJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsJspJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\jsp.js" + name := "public/ace/src-min/snippets/jsp.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsJsxJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsJsxJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\jsx.js" + name := "public/ace/src-min/snippets/jsx.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsJuliaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsJuliaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\julia.js" + name := "public/ace/src-min/snippets/julia.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsKotlinJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsKotlinJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\kotlin.js" + name := "public/ace/src-min/snippets/kotlin.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLatexJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLatexJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\latex.js" + name := "public/ace/src-min/snippets/latex.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLeanJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLeanJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\lean.js" + name := "public/ace/src-min/snippets/lean.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLessJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLessJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\less.js" + name := "public/ace/src-min/snippets/less.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLiquidJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLiquidJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\liquid.js" + name := "public/ace/src-min/snippets/liquid.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLispJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLispJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\lisp.js" + name := "public/ace/src-min/snippets/lisp.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLive_scriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLive_scriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\live_script.js" + name := "public/ace/src-min/snippets/live_script.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLivescriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLivescriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\livescript.js" + name := "public/ace/src-min/snippets/livescript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLogiqlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLogiqlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\logiql.js" + name := "public/ace/src-min/snippets/logiql.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLslJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLslJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\lsl.js" + name := "public/ace/src-min/snippets/lsl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLuaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLuaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\lua.js" + name := "public/ace/src-min/snippets/lua.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLuapageJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLuapageJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\luapage.js" + name := "public/ace/src-min/snippets/luapage.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsLuceneJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsLuceneJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\lucene.js" + name := "public/ace/src-min/snippets/lucene.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsMakefileJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsMakefileJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\makefile.js" + name := "public/ace/src-min/snippets/makefile.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsMarkdownJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsMarkdownJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\markdown.js" + name := "public/ace/src-min/snippets/markdown.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsMaskJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsMaskJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mask.js" + name := "public/ace/src-min/snippets/mask.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsMatlabJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsMatlabJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\matlab.js" + name := "public/ace/src-min/snippets/matlab.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsMazeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsMazeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\maze.js" + name := "public/ace/src-min/snippets/maze.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsMelJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsMelJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mel.js" + name := "public/ace/src-min/snippets/mel.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsMips_assemblerJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsMips_assemblerJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mips_assembler.js" + name := "public/ace/src-min/snippets/mips_assembler.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsMipsassemblerJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsMipsassemblerJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mipsassembler.js" + name := "public/ace/src-min/snippets/mipsassembler.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsMushcodeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsMushcodeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mushcode.js" + name := "public/ace/src-min/snippets/mushcode.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsMysqlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsMysqlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mysql.js" + name := "public/ace/src-min/snippets/mysql.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsNixJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsNixJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\nix.js" + name := "public/ace/src-min/snippets/nix.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsNsisJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsNsisJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\nsis.js" + name := "public/ace/src-min/snippets/nsis.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsObjectivecJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsObjectivecJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\objectivec.js" + name := "public/ace/src-min/snippets/objectivec.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsOcamlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsOcamlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ocaml.js" + name := "public/ace/src-min/snippets/ocaml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsPascalJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsPascalJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\pascal.js" + name := "public/ace/src-min/snippets/pascal.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsPerlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsPerlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\perl.js" + name := "public/ace/src-min/snippets/perl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsPgsqlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsPgsqlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\pgsql.js" + name := "public/ace/src-min/snippets/pgsql.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsPhpJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsPhpJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\php.js" + name := "public/ace/src-min/snippets/php.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsPlain_textJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsPlain_textJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\plain_text.js" + name := "public/ace/src-min/snippets/plain_text.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsPowershellJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsPowershellJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\powershell.js" + name := "public/ace/src-min/snippets/powershell.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsPraatJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsPraatJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\praat.js" + name := "public/ace/src-min/snippets/praat.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsPrologJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsPrologJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\prolog.js" + name := "public/ace/src-min/snippets/prolog.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsPropertiesJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsPropertiesJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\properties.js" + name := "public/ace/src-min/snippets/properties.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsProtobufJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsProtobufJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\protobuf.js" + name := "public/ace/src-min/snippets/protobuf.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsPythonJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsPythonJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\python.js" + name := "public/ace/src-min/snippets/python.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsRJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsRJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\r.js" + name := "public/ace/src-min/snippets/r.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsRazorJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsRazorJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\razor.js" + name := "public/ace/src-min/snippets/razor.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsRdocJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsRdocJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\rdoc.js" + name := "public/ace/src-min/snippets/rdoc.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsRhtmlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsRhtmlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\rhtml.js" + name := "public/ace/src-min/snippets/rhtml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsRstJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsRstJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\rst.js" + name := "public/ace/src-min/snippets/rst.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsRubyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsRubyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ruby.js" + name := "public/ace/src-min/snippets/ruby.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsRustJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsRustJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\rust.js" + name := "public/ace/src-min/snippets/rust.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSassJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSassJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\sass.js" + name := "public/ace/src-min/snippets/sass.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsScadJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsScadJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\scad.js" + name := "public/ace/src-min/snippets/scad.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsScalaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsScalaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\scala.js" + name := "public/ace/src-min/snippets/scala.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSchemeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSchemeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\scheme.js" + name := "public/ace/src-min/snippets/scheme.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsScssJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsScssJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\scss.js" + name := "public/ace/src-min/snippets/scss.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsShJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsShJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\sh.js" + name := "public/ace/src-min/snippets/sh.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSjsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSjsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\sjs.js" + name := "public/ace/src-min/snippets/sjs.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSmartyJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSmartyJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\smarty.js" + name := "public/ace/src-min/snippets/smarty.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSnippetsJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSnippetsJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\snippets.js" + name := "public/ace/src-min/snippets/snippets.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSoy_templateJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSoy_templateJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\soy_template.js" + name := "public/ace/src-min/snippets/soy_template.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSpaceJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSpaceJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\space.js" + name := "public/ace/src-min/snippets/space.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSqlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSqlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\sql.js" + name := "public/ace/src-min/snippets/sql.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSqlserverJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSqlserverJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\sqlserver.js" + name := "public/ace/src-min/snippets/sqlserver.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsStylusJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsStylusJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\stylus.js" + name := "public/ace/src-min/snippets/stylus.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSvgJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSvgJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\svg.js" + name := "public/ace/src-min/snippets/svg.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSwiftJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSwiftJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\swift.js" + name := "public/ace/src-min/snippets/swift.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsSwigJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsSwigJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\swig.js" + name := "public/ace/src-min/snippets/swig.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsTclJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsTclJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\tcl.js" + name := "public/ace/src-min/snippets/tcl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsTexJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsTexJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\tex.js" + name := "public/ace/src-min/snippets/tex.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsTextJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsTextJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\text.js" + name := "public/ace/src-min/snippets/text.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsTextileJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsTextileJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\textile.js" + name := "public/ace/src-min/snippets/textile.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsTomlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsTomlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\toml.js" + name := "public/ace/src-min/snippets/toml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsTsxJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsTsxJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\tsx.js" + name := "public/ace/src-min/snippets/tsx.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsTwigJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsTwigJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\twig.js" + name := "public/ace/src-min/snippets/twig.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsTypescriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsTypescriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\typescript.js" + name := "public/ace/src-min/snippets/typescript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsValaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsValaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\vala.js" + name := "public/ace/src-min/snippets/vala.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsVbscriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsVbscriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\vbscript.js" + name := "public/ace/src-min/snippets/vbscript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsVelocityJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsVelocityJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\velocity.js" + name := "public/ace/src-min/snippets/velocity.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsVerilogJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsVerilogJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\verilog.js" + name := "public/ace/src-min/snippets/verilog.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsVhdlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsVhdlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\vhdl.js" + name := "public/ace/src-min/snippets/vhdl.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsWollokJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsWollokJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\wollok.js" + name := "public/ace/src-min/snippets/wollok.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsXmlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsXmlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\xml.js" + name := "public/ace/src-min/snippets/xml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsXqueryJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsXqueryJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\xquery.js" + name := "public/ace/src-min/snippets/xquery.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinSnippetsYamlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinSnippetsYamlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\yaml.js" + name := "public/ace/src-min/snippets/yaml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinThemeGithubJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinThemeGithubJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\theme-github.js" + name := "public/ace/src-min/theme-github.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinWorkerCoffeeJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinWorkerCoffeeJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-coffee.js" + name := "public/ace/src-min/worker-coffee.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinWorkerCssJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinWorkerCssJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-css.js" + name := "public/ace/src-min/worker-css.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinWorkerHtmlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinWorkerHtmlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-html.js" + name := "public/ace/src-min/worker-html.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinWorkerJavascriptJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinWorkerJavascriptJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-javascript.js" + name := "public/ace/src-min/worker-javascript.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinWorkerJsonJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinWorkerJsonJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-json.js" + name := "public/ace/src-min/worker-json.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinWorkerLuaJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinWorkerLuaJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-lua.js" + name := "public/ace/src-min/worker-lua.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinWorkerPhpJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinWorkerPhpJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-php.js" + name := "public/ace/src-min/worker-php.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinWorkerXmlJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinWorkerXmlJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-xml.js" + name := "public/ace/src-min/worker-xml.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// publicAceSrcMinWorkerXqueryJs reads file data from disk. It returns an error on failure. +func publicAceSrcMinWorkerXqueryJs() (*asset, error) { + path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-xquery.js" + name := "public/ace/src-min/worker-xquery.js" + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + "templates/base.tmpl": templatesBaseTmpl, + "templates/editor.tmpl": templatesEditorTmpl, + "templates/frontmatter.tmpl": templatesFrontmatterTmpl, + "templates/listing.tmpl": templatesListingTmpl, + "templates/minimal.tmpl": templatesMinimalTmpl, + "templates/single.tmpl": templatesSingleTmpl, + "public/js/common.js": publicJsCommonJs, + "public/js/editor.js": publicJsEditorJs, + "public/js/form2js.js": publicJsForm2jsJs, + "public/js/listing.js": publicJsListingJs, + "public/css/fonts.css": publicCssFontsCss, + "public/css/material/icons.woff2": publicCssMaterialIconsWoff2, + "public/css/normalize.css": publicCssNormalizeCss, + "public/css/roboto/medium-cyrillic-ext.woff2": publicCssRobotoMediumCyrillicExtWoff2, + "public/css/roboto/medium-cyrillic.woff2": publicCssRobotoMediumCyrillicWoff2, + "public/css/roboto/medium-greek-ext.woff2": publicCssRobotoMediumGreekExtWoff2, + "public/css/roboto/medium-greek.woff2": publicCssRobotoMediumGreekWoff2, + "public/css/roboto/medium-latin-ext.woff2": publicCssRobotoMediumLatinExtWoff2, + "public/css/roboto/medium-latin.woff2": publicCssRobotoMediumLatinWoff2, + "public/css/roboto/medium-vietnamese.woff2": publicCssRobotoMediumVietnameseWoff2, + "public/css/roboto/normal-cyrillic-ext.woff2": publicCssRobotoNormalCyrillicExtWoff2, + "public/css/roboto/normal-cyrillic.woff2": publicCssRobotoNormalCyrillicWoff2, + "public/css/roboto/normal-greek-ext.woff2": publicCssRobotoNormalGreekExtWoff2, + "public/css/roboto/normal-greek.woff2": publicCssRobotoNormalGreekWoff2, + "public/css/roboto/normal-latin-ext.woff2": publicCssRobotoNormalLatinExtWoff2, + "public/css/roboto/normal-latin.woff2": publicCssRobotoNormalLatinWoff2, + "public/css/roboto/normal-vietnamese.woff2": publicCssRobotoNormalVietnameseWoff2, + "public/css/styles.css": publicCssStylesCss, + "public/ace/src-min/ace.js": publicAceSrcMinAceJs, + "public/ace/src-min/ext-beautify.js": publicAceSrcMinExtBeautifyJs, + "public/ace/src-min/ext-chromevox.js": publicAceSrcMinExtChromevoxJs, + "public/ace/src-min/ext-elastic_tabstops_lite.js": publicAceSrcMinExtElastic_tabstops_liteJs, + "public/ace/src-min/ext-emmet.js": publicAceSrcMinExtEmmetJs, + "public/ace/src-min/ext-error_marker.js": publicAceSrcMinExtError_markerJs, + "public/ace/src-min/ext-keybinding_menu.js": publicAceSrcMinExtKeybinding_menuJs, + "public/ace/src-min/ext-language_tools.js": publicAceSrcMinExtLanguage_toolsJs, + "public/ace/src-min/ext-linking.js": publicAceSrcMinExtLinkingJs, + "public/ace/src-min/ext-modelist.js": publicAceSrcMinExtModelistJs, + "public/ace/src-min/ext-old_ie.js": publicAceSrcMinExtOld_ieJs, + "public/ace/src-min/ext-searchbox.js": publicAceSrcMinExtSearchboxJs, + "public/ace/src-min/ext-settings_menu.js": publicAceSrcMinExtSettings_menuJs, + "public/ace/src-min/ext-spellcheck.js": publicAceSrcMinExtSpellcheckJs, + "public/ace/src-min/ext-split.js": publicAceSrcMinExtSplitJs, + "public/ace/src-min/ext-static_highlight.js": publicAceSrcMinExtStatic_highlightJs, + "public/ace/src-min/ext-statusbar.js": publicAceSrcMinExtStatusbarJs, + "public/ace/src-min/ext-textarea.js": publicAceSrcMinExtTextareaJs, + "public/ace/src-min/ext-themelist.js": publicAceSrcMinExtThemelistJs, + "public/ace/src-min/ext-whitespace.js": publicAceSrcMinExtWhitespaceJs, + "public/ace/src-min/keybinding-emacs.js": publicAceSrcMinKeybindingEmacsJs, + "public/ace/src-min/keybinding-vim.js": publicAceSrcMinKeybindingVimJs, + "public/ace/src-min/mode-abap.js": publicAceSrcMinModeAbapJs, + "public/ace/src-min/mode-abc.js": publicAceSrcMinModeAbcJs, + "public/ace/src-min/mode-actionscript.js": publicAceSrcMinModeActionscriptJs, + "public/ace/src-min/mode-ada.js": publicAceSrcMinModeAdaJs, + "public/ace/src-min/mode-apache_conf.js": publicAceSrcMinModeApache_confJs, + "public/ace/src-min/mode-applescript.js": publicAceSrcMinModeApplescriptJs, + "public/ace/src-min/mode-asciidoc.js": publicAceSrcMinModeAsciidocJs, + "public/ace/src-min/mode-assembly_x86.js": publicAceSrcMinModeAssembly_x86Js, + "public/ace/src-min/mode-autohotkey.js": publicAceSrcMinModeAutohotkeyJs, + "public/ace/src-min/mode-batchfile.js": publicAceSrcMinModeBatchfileJs, + "public/ace/src-min/mode-bro.js": publicAceSrcMinModeBroJs, + "public/ace/src-min/mode-c9search.js": publicAceSrcMinModeC9searchJs, + "public/ace/src-min/mode-c_cpp.js": publicAceSrcMinModeC_cppJs, + "public/ace/src-min/mode-cirru.js": publicAceSrcMinModeCirruJs, + "public/ace/src-min/mode-clojure.js": publicAceSrcMinModeClojureJs, + "public/ace/src-min/mode-cobol.js": publicAceSrcMinModeCobolJs, + "public/ace/src-min/mode-coffee.js": publicAceSrcMinModeCoffeeJs, + "public/ace/src-min/mode-coldfusion.js": publicAceSrcMinModeColdfusionJs, + "public/ace/src-min/mode-csharp.js": publicAceSrcMinModeCsharpJs, + "public/ace/src-min/mode-css.js": publicAceSrcMinModeCssJs, + "public/ace/src-min/mode-curly.js": publicAceSrcMinModeCurlyJs, + "public/ace/src-min/mode-d.js": publicAceSrcMinModeDJs, + "public/ace/src-min/mode-dart.js": publicAceSrcMinModeDartJs, + "public/ace/src-min/mode-diff.js": publicAceSrcMinModeDiffJs, + "public/ace/src-min/mode-django.js": publicAceSrcMinModeDjangoJs, + "public/ace/src-min/mode-dockerfile.js": publicAceSrcMinModeDockerfileJs, + "public/ace/src-min/mode-dot.js": publicAceSrcMinModeDotJs, + "public/ace/src-min/mode-drools.js": publicAceSrcMinModeDroolsJs, + "public/ace/src-min/mode-eiffel.js": publicAceSrcMinModeEiffelJs, + "public/ace/src-min/mode-ejs.js": publicAceSrcMinModeEjsJs, + "public/ace/src-min/mode-elixir.js": publicAceSrcMinModeElixirJs, + "public/ace/src-min/mode-elm.js": publicAceSrcMinModeElmJs, + "public/ace/src-min/mode-erlang.js": publicAceSrcMinModeErlangJs, + "public/ace/src-min/mode-forth.js": publicAceSrcMinModeForthJs, + "public/ace/src-min/mode-fortran.js": publicAceSrcMinModeFortranJs, + "public/ace/src-min/mode-ftl.js": publicAceSrcMinModeFtlJs, + "public/ace/src-min/mode-gcode.js": publicAceSrcMinModeGcodeJs, + "public/ace/src-min/mode-gherkin.js": publicAceSrcMinModeGherkinJs, + "public/ace/src-min/mode-gitignore.js": publicAceSrcMinModeGitignoreJs, + "public/ace/src-min/mode-glsl.js": publicAceSrcMinModeGlslJs, + "public/ace/src-min/mode-gobstones.js": publicAceSrcMinModeGobstonesJs, + "public/ace/src-min/mode-golang.js": publicAceSrcMinModeGolangJs, + "public/ace/src-min/mode-groovy.js": publicAceSrcMinModeGroovyJs, + "public/ace/src-min/mode-haml.js": publicAceSrcMinModeHamlJs, + "public/ace/src-min/mode-handlebars.js": publicAceSrcMinModeHandlebarsJs, + "public/ace/src-min/mode-haskell.js": publicAceSrcMinModeHaskellJs, + "public/ace/src-min/mode-haskell_cabal.js": publicAceSrcMinModeHaskell_cabalJs, + "public/ace/src-min/mode-haxe.js": publicAceSrcMinModeHaxeJs, + "public/ace/src-min/mode-hjson.js": publicAceSrcMinModeHjsonJs, + "public/ace/src-min/mode-html.js": publicAceSrcMinModeHtmlJs, + "public/ace/src-min/mode-html_elixir.js": publicAceSrcMinModeHtml_elixirJs, + "public/ace/src-min/mode-html_ruby.js": publicAceSrcMinModeHtml_rubyJs, + "public/ace/src-min/mode-ini.js": publicAceSrcMinModeIniJs, + "public/ace/src-min/mode-io.js": publicAceSrcMinModeIoJs, + "public/ace/src-min/mode-jack.js": publicAceSrcMinModeJackJs, + "public/ace/src-min/mode-jade.js": publicAceSrcMinModeJadeJs, + "public/ace/src-min/mode-java.js": publicAceSrcMinModeJavaJs, + "public/ace/src-min/mode-javascript.js": publicAceSrcMinModeJavascriptJs, + "public/ace/src-min/mode-json.js": publicAceSrcMinModeJsonJs, + "public/ace/src-min/mode-jsoniq.js": publicAceSrcMinModeJsoniqJs, + "public/ace/src-min/mode-jsp.js": publicAceSrcMinModeJspJs, + "public/ace/src-min/mode-jsx.js": publicAceSrcMinModeJsxJs, + "public/ace/src-min/mode-julia.js": publicAceSrcMinModeJuliaJs, + "public/ace/src-min/mode-kotlin.js": publicAceSrcMinModeKotlinJs, + "public/ace/src-min/mode-latex.js": publicAceSrcMinModeLatexJs, + "public/ace/src-min/mode-lean.js": publicAceSrcMinModeLeanJs, + "public/ace/src-min/mode-less.js": publicAceSrcMinModeLessJs, + "public/ace/src-min/mode-liquid.js": publicAceSrcMinModeLiquidJs, + "public/ace/src-min/mode-lisp.js": publicAceSrcMinModeLispJs, + "public/ace/src-min/mode-live_script.js": publicAceSrcMinModeLive_scriptJs, + "public/ace/src-min/mode-livescript.js": publicAceSrcMinModeLivescriptJs, + "public/ace/src-min/mode-logiql.js": publicAceSrcMinModeLogiqlJs, + "public/ace/src-min/mode-lsl.js": publicAceSrcMinModeLslJs, + "public/ace/src-min/mode-lua.js": publicAceSrcMinModeLuaJs, + "public/ace/src-min/mode-luapage.js": publicAceSrcMinModeLuapageJs, + "public/ace/src-min/mode-lucene.js": publicAceSrcMinModeLuceneJs, + "public/ace/src-min/mode-makefile.js": publicAceSrcMinModeMakefileJs, + "public/ace/src-min/mode-markdown.js": publicAceSrcMinModeMarkdownJs, + "public/ace/src-min/mode-mask.js": publicAceSrcMinModeMaskJs, + "public/ace/src-min/mode-matlab.js": publicAceSrcMinModeMatlabJs, + "public/ace/src-min/mode-maze.js": publicAceSrcMinModeMazeJs, + "public/ace/src-min/mode-mel.js": publicAceSrcMinModeMelJs, + "public/ace/src-min/mode-mips_assembler.js": publicAceSrcMinModeMips_assemblerJs, + "public/ace/src-min/mode-mipsassembler.js": publicAceSrcMinModeMipsassemblerJs, + "public/ace/src-min/mode-mushcode.js": publicAceSrcMinModeMushcodeJs, + "public/ace/src-min/mode-mysql.js": publicAceSrcMinModeMysqlJs, + "public/ace/src-min/mode-nix.js": publicAceSrcMinModeNixJs, + "public/ace/src-min/mode-nsis.js": publicAceSrcMinModeNsisJs, + "public/ace/src-min/mode-objectivec.js": publicAceSrcMinModeObjectivecJs, + "public/ace/src-min/mode-ocaml.js": publicAceSrcMinModeOcamlJs, + "public/ace/src-min/mode-pascal.js": publicAceSrcMinModePascalJs, + "public/ace/src-min/mode-perl.js": publicAceSrcMinModePerlJs, + "public/ace/src-min/mode-pgsql.js": publicAceSrcMinModePgsqlJs, + "public/ace/src-min/mode-php.js": publicAceSrcMinModePhpJs, + "public/ace/src-min/mode-plain_text.js": publicAceSrcMinModePlain_textJs, + "public/ace/src-min/mode-powershell.js": publicAceSrcMinModePowershellJs, + "public/ace/src-min/mode-praat.js": publicAceSrcMinModePraatJs, + "public/ace/src-min/mode-prolog.js": publicAceSrcMinModePrologJs, + "public/ace/src-min/mode-properties.js": publicAceSrcMinModePropertiesJs, + "public/ace/src-min/mode-protobuf.js": publicAceSrcMinModeProtobufJs, + "public/ace/src-min/mode-python.js": publicAceSrcMinModePythonJs, + "public/ace/src-min/mode-r.js": publicAceSrcMinModeRJs, + "public/ace/src-min/mode-razor.js": publicAceSrcMinModeRazorJs, + "public/ace/src-min/mode-rdoc.js": publicAceSrcMinModeRdocJs, + "public/ace/src-min/mode-rhtml.js": publicAceSrcMinModeRhtmlJs, + "public/ace/src-min/mode-rst.js": publicAceSrcMinModeRstJs, + "public/ace/src-min/mode-ruby.js": publicAceSrcMinModeRubyJs, + "public/ace/src-min/mode-rust.js": publicAceSrcMinModeRustJs, + "public/ace/src-min/mode-sass.js": publicAceSrcMinModeSassJs, + "public/ace/src-min/mode-scad.js": publicAceSrcMinModeScadJs, + "public/ace/src-min/mode-scala.js": publicAceSrcMinModeScalaJs, + "public/ace/src-min/mode-scheme.js": publicAceSrcMinModeSchemeJs, + "public/ace/src-min/mode-scss.js": publicAceSrcMinModeScssJs, + "public/ace/src-min/mode-sh.js": publicAceSrcMinModeShJs, + "public/ace/src-min/mode-sjs.js": publicAceSrcMinModeSjsJs, + "public/ace/src-min/mode-smarty.js": publicAceSrcMinModeSmartyJs, + "public/ace/src-min/mode-snippets.js": publicAceSrcMinModeSnippetsJs, + "public/ace/src-min/mode-soy_template.js": publicAceSrcMinModeSoy_templateJs, + "public/ace/src-min/mode-space.js": publicAceSrcMinModeSpaceJs, + "public/ace/src-min/mode-sql.js": publicAceSrcMinModeSqlJs, + "public/ace/src-min/mode-sqlserver.js": publicAceSrcMinModeSqlserverJs, + "public/ace/src-min/mode-stylus.js": publicAceSrcMinModeStylusJs, + "public/ace/src-min/mode-svg.js": publicAceSrcMinModeSvgJs, + "public/ace/src-min/mode-swift.js": publicAceSrcMinModeSwiftJs, + "public/ace/src-min/mode-swig.js": publicAceSrcMinModeSwigJs, + "public/ace/src-min/mode-tcl.js": publicAceSrcMinModeTclJs, + "public/ace/src-min/mode-tex.js": publicAceSrcMinModeTexJs, + "public/ace/src-min/mode-text.js": publicAceSrcMinModeTextJs, + "public/ace/src-min/mode-textile.js": publicAceSrcMinModeTextileJs, + "public/ace/src-min/mode-toml.js": publicAceSrcMinModeTomlJs, + "public/ace/src-min/mode-tsx.js": publicAceSrcMinModeTsxJs, + "public/ace/src-min/mode-twig.js": publicAceSrcMinModeTwigJs, + "public/ace/src-min/mode-typescript.js": publicAceSrcMinModeTypescriptJs, + "public/ace/src-min/mode-vala.js": publicAceSrcMinModeValaJs, + "public/ace/src-min/mode-vbscript.js": publicAceSrcMinModeVbscriptJs, + "public/ace/src-min/mode-velocity.js": publicAceSrcMinModeVelocityJs, + "public/ace/src-min/mode-verilog.js": publicAceSrcMinModeVerilogJs, + "public/ace/src-min/mode-vhdl.js": publicAceSrcMinModeVhdlJs, + "public/ace/src-min/mode-wollok.js": publicAceSrcMinModeWollokJs, + "public/ace/src-min/mode-xml.js": publicAceSrcMinModeXmlJs, + "public/ace/src-min/mode-xquery.js": publicAceSrcMinModeXqueryJs, + "public/ace/src-min/mode-yaml.js": publicAceSrcMinModeYamlJs, + "public/ace/src-min/snippets/abap.js": publicAceSrcMinSnippetsAbapJs, + "public/ace/src-min/snippets/abc.js": publicAceSrcMinSnippetsAbcJs, + "public/ace/src-min/snippets/actionscript.js": publicAceSrcMinSnippetsActionscriptJs, + "public/ace/src-min/snippets/ada.js": publicAceSrcMinSnippetsAdaJs, + "public/ace/src-min/snippets/apache_conf.js": publicAceSrcMinSnippetsApache_confJs, + "public/ace/src-min/snippets/applescript.js": publicAceSrcMinSnippetsApplescriptJs, + "public/ace/src-min/snippets/asciidoc.js": publicAceSrcMinSnippetsAsciidocJs, + "public/ace/src-min/snippets/assembly_x86.js": publicAceSrcMinSnippetsAssembly_x86Js, + "public/ace/src-min/snippets/autohotkey.js": publicAceSrcMinSnippetsAutohotkeyJs, + "public/ace/src-min/snippets/batchfile.js": publicAceSrcMinSnippetsBatchfileJs, + "public/ace/src-min/snippets/bro.js": publicAceSrcMinSnippetsBroJs, + "public/ace/src-min/snippets/c9search.js": publicAceSrcMinSnippetsC9searchJs, + "public/ace/src-min/snippets/c_cpp.js": publicAceSrcMinSnippetsC_cppJs, + "public/ace/src-min/snippets/cirru.js": publicAceSrcMinSnippetsCirruJs, + "public/ace/src-min/snippets/clojure.js": publicAceSrcMinSnippetsClojureJs, + "public/ace/src-min/snippets/cobol.js": publicAceSrcMinSnippetsCobolJs, + "public/ace/src-min/snippets/coffee.js": publicAceSrcMinSnippetsCoffeeJs, + "public/ace/src-min/snippets/coldfusion.js": publicAceSrcMinSnippetsColdfusionJs, + "public/ace/src-min/snippets/csharp.js": publicAceSrcMinSnippetsCsharpJs, + "public/ace/src-min/snippets/css.js": publicAceSrcMinSnippetsCssJs, + "public/ace/src-min/snippets/curly.js": publicAceSrcMinSnippetsCurlyJs, + "public/ace/src-min/snippets/d.js": publicAceSrcMinSnippetsDJs, + "public/ace/src-min/snippets/dart.js": publicAceSrcMinSnippetsDartJs, + "public/ace/src-min/snippets/diff.js": publicAceSrcMinSnippetsDiffJs, + "public/ace/src-min/snippets/django.js": publicAceSrcMinSnippetsDjangoJs, + "public/ace/src-min/snippets/dockerfile.js": publicAceSrcMinSnippetsDockerfileJs, + "public/ace/src-min/snippets/dot.js": publicAceSrcMinSnippetsDotJs, + "public/ace/src-min/snippets/drools.js": publicAceSrcMinSnippetsDroolsJs, + "public/ace/src-min/snippets/eiffel.js": publicAceSrcMinSnippetsEiffelJs, + "public/ace/src-min/snippets/ejs.js": publicAceSrcMinSnippetsEjsJs, + "public/ace/src-min/snippets/elixir.js": publicAceSrcMinSnippetsElixirJs, + "public/ace/src-min/snippets/elm.js": publicAceSrcMinSnippetsElmJs, + "public/ace/src-min/snippets/erlang.js": publicAceSrcMinSnippetsErlangJs, + "public/ace/src-min/snippets/forth.js": publicAceSrcMinSnippetsForthJs, + "public/ace/src-min/snippets/fortran.js": publicAceSrcMinSnippetsFortranJs, + "public/ace/src-min/snippets/ftl.js": publicAceSrcMinSnippetsFtlJs, + "public/ace/src-min/snippets/gcode.js": publicAceSrcMinSnippetsGcodeJs, + "public/ace/src-min/snippets/gherkin.js": publicAceSrcMinSnippetsGherkinJs, + "public/ace/src-min/snippets/gitignore.js": publicAceSrcMinSnippetsGitignoreJs, + "public/ace/src-min/snippets/glsl.js": publicAceSrcMinSnippetsGlslJs, + "public/ace/src-min/snippets/gobstones.js": publicAceSrcMinSnippetsGobstonesJs, + "public/ace/src-min/snippets/golang.js": publicAceSrcMinSnippetsGolangJs, + "public/ace/src-min/snippets/groovy.js": publicAceSrcMinSnippetsGroovyJs, + "public/ace/src-min/snippets/haml.js": publicAceSrcMinSnippetsHamlJs, + "public/ace/src-min/snippets/handlebars.js": publicAceSrcMinSnippetsHandlebarsJs, + "public/ace/src-min/snippets/haskell.js": publicAceSrcMinSnippetsHaskellJs, + "public/ace/src-min/snippets/haskell_cabal.js": publicAceSrcMinSnippetsHaskell_cabalJs, + "public/ace/src-min/snippets/haxe.js": publicAceSrcMinSnippetsHaxeJs, + "public/ace/src-min/snippets/hjson.js": publicAceSrcMinSnippetsHjsonJs, + "public/ace/src-min/snippets/html.js": publicAceSrcMinSnippetsHtmlJs, + "public/ace/src-min/snippets/html_elixir.js": publicAceSrcMinSnippetsHtml_elixirJs, + "public/ace/src-min/snippets/html_ruby.js": publicAceSrcMinSnippetsHtml_rubyJs, + "public/ace/src-min/snippets/ini.js": publicAceSrcMinSnippetsIniJs, + "public/ace/src-min/snippets/io.js": publicAceSrcMinSnippetsIoJs, + "public/ace/src-min/snippets/jack.js": publicAceSrcMinSnippetsJackJs, + "public/ace/src-min/snippets/jade.js": publicAceSrcMinSnippetsJadeJs, + "public/ace/src-min/snippets/java.js": publicAceSrcMinSnippetsJavaJs, + "public/ace/src-min/snippets/javascript.js": publicAceSrcMinSnippetsJavascriptJs, + "public/ace/src-min/snippets/json.js": publicAceSrcMinSnippetsJsonJs, + "public/ace/src-min/snippets/jsoniq.js": publicAceSrcMinSnippetsJsoniqJs, + "public/ace/src-min/snippets/jsp.js": publicAceSrcMinSnippetsJspJs, + "public/ace/src-min/snippets/jsx.js": publicAceSrcMinSnippetsJsxJs, + "public/ace/src-min/snippets/julia.js": publicAceSrcMinSnippetsJuliaJs, + "public/ace/src-min/snippets/kotlin.js": publicAceSrcMinSnippetsKotlinJs, + "public/ace/src-min/snippets/latex.js": publicAceSrcMinSnippetsLatexJs, + "public/ace/src-min/snippets/lean.js": publicAceSrcMinSnippetsLeanJs, + "public/ace/src-min/snippets/less.js": publicAceSrcMinSnippetsLessJs, + "public/ace/src-min/snippets/liquid.js": publicAceSrcMinSnippetsLiquidJs, + "public/ace/src-min/snippets/lisp.js": publicAceSrcMinSnippetsLispJs, + "public/ace/src-min/snippets/live_script.js": publicAceSrcMinSnippetsLive_scriptJs, + "public/ace/src-min/snippets/livescript.js": publicAceSrcMinSnippetsLivescriptJs, + "public/ace/src-min/snippets/logiql.js": publicAceSrcMinSnippetsLogiqlJs, + "public/ace/src-min/snippets/lsl.js": publicAceSrcMinSnippetsLslJs, + "public/ace/src-min/snippets/lua.js": publicAceSrcMinSnippetsLuaJs, + "public/ace/src-min/snippets/luapage.js": publicAceSrcMinSnippetsLuapageJs, + "public/ace/src-min/snippets/lucene.js": publicAceSrcMinSnippetsLuceneJs, + "public/ace/src-min/snippets/makefile.js": publicAceSrcMinSnippetsMakefileJs, + "public/ace/src-min/snippets/markdown.js": publicAceSrcMinSnippetsMarkdownJs, + "public/ace/src-min/snippets/mask.js": publicAceSrcMinSnippetsMaskJs, + "public/ace/src-min/snippets/matlab.js": publicAceSrcMinSnippetsMatlabJs, + "public/ace/src-min/snippets/maze.js": publicAceSrcMinSnippetsMazeJs, + "public/ace/src-min/snippets/mel.js": publicAceSrcMinSnippetsMelJs, + "public/ace/src-min/snippets/mips_assembler.js": publicAceSrcMinSnippetsMips_assemblerJs, + "public/ace/src-min/snippets/mipsassembler.js": publicAceSrcMinSnippetsMipsassemblerJs, + "public/ace/src-min/snippets/mushcode.js": publicAceSrcMinSnippetsMushcodeJs, + "public/ace/src-min/snippets/mysql.js": publicAceSrcMinSnippetsMysqlJs, + "public/ace/src-min/snippets/nix.js": publicAceSrcMinSnippetsNixJs, + "public/ace/src-min/snippets/nsis.js": publicAceSrcMinSnippetsNsisJs, + "public/ace/src-min/snippets/objectivec.js": publicAceSrcMinSnippetsObjectivecJs, + "public/ace/src-min/snippets/ocaml.js": publicAceSrcMinSnippetsOcamlJs, + "public/ace/src-min/snippets/pascal.js": publicAceSrcMinSnippetsPascalJs, + "public/ace/src-min/snippets/perl.js": publicAceSrcMinSnippetsPerlJs, + "public/ace/src-min/snippets/pgsql.js": publicAceSrcMinSnippetsPgsqlJs, + "public/ace/src-min/snippets/php.js": publicAceSrcMinSnippetsPhpJs, + "public/ace/src-min/snippets/plain_text.js": publicAceSrcMinSnippetsPlain_textJs, + "public/ace/src-min/snippets/powershell.js": publicAceSrcMinSnippetsPowershellJs, + "public/ace/src-min/snippets/praat.js": publicAceSrcMinSnippetsPraatJs, + "public/ace/src-min/snippets/prolog.js": publicAceSrcMinSnippetsPrologJs, + "public/ace/src-min/snippets/properties.js": publicAceSrcMinSnippetsPropertiesJs, + "public/ace/src-min/snippets/protobuf.js": publicAceSrcMinSnippetsProtobufJs, + "public/ace/src-min/snippets/python.js": publicAceSrcMinSnippetsPythonJs, + "public/ace/src-min/snippets/r.js": publicAceSrcMinSnippetsRJs, + "public/ace/src-min/snippets/razor.js": publicAceSrcMinSnippetsRazorJs, + "public/ace/src-min/snippets/rdoc.js": publicAceSrcMinSnippetsRdocJs, + "public/ace/src-min/snippets/rhtml.js": publicAceSrcMinSnippetsRhtmlJs, + "public/ace/src-min/snippets/rst.js": publicAceSrcMinSnippetsRstJs, + "public/ace/src-min/snippets/ruby.js": publicAceSrcMinSnippetsRubyJs, + "public/ace/src-min/snippets/rust.js": publicAceSrcMinSnippetsRustJs, + "public/ace/src-min/snippets/sass.js": publicAceSrcMinSnippetsSassJs, + "public/ace/src-min/snippets/scad.js": publicAceSrcMinSnippetsScadJs, + "public/ace/src-min/snippets/scala.js": publicAceSrcMinSnippetsScalaJs, + "public/ace/src-min/snippets/scheme.js": publicAceSrcMinSnippetsSchemeJs, + "public/ace/src-min/snippets/scss.js": publicAceSrcMinSnippetsScssJs, + "public/ace/src-min/snippets/sh.js": publicAceSrcMinSnippetsShJs, + "public/ace/src-min/snippets/sjs.js": publicAceSrcMinSnippetsSjsJs, + "public/ace/src-min/snippets/smarty.js": publicAceSrcMinSnippetsSmartyJs, + "public/ace/src-min/snippets/snippets.js": publicAceSrcMinSnippetsSnippetsJs, + "public/ace/src-min/snippets/soy_template.js": publicAceSrcMinSnippetsSoy_templateJs, + "public/ace/src-min/snippets/space.js": publicAceSrcMinSnippetsSpaceJs, + "public/ace/src-min/snippets/sql.js": publicAceSrcMinSnippetsSqlJs, + "public/ace/src-min/snippets/sqlserver.js": publicAceSrcMinSnippetsSqlserverJs, + "public/ace/src-min/snippets/stylus.js": publicAceSrcMinSnippetsStylusJs, + "public/ace/src-min/snippets/svg.js": publicAceSrcMinSnippetsSvgJs, + "public/ace/src-min/snippets/swift.js": publicAceSrcMinSnippetsSwiftJs, + "public/ace/src-min/snippets/swig.js": publicAceSrcMinSnippetsSwigJs, + "public/ace/src-min/snippets/tcl.js": publicAceSrcMinSnippetsTclJs, + "public/ace/src-min/snippets/tex.js": publicAceSrcMinSnippetsTexJs, + "public/ace/src-min/snippets/text.js": publicAceSrcMinSnippetsTextJs, + "public/ace/src-min/snippets/textile.js": publicAceSrcMinSnippetsTextileJs, + "public/ace/src-min/snippets/toml.js": publicAceSrcMinSnippetsTomlJs, + "public/ace/src-min/snippets/tsx.js": publicAceSrcMinSnippetsTsxJs, + "public/ace/src-min/snippets/twig.js": publicAceSrcMinSnippetsTwigJs, + "public/ace/src-min/snippets/typescript.js": publicAceSrcMinSnippetsTypescriptJs, + "public/ace/src-min/snippets/vala.js": publicAceSrcMinSnippetsValaJs, + "public/ace/src-min/snippets/vbscript.js": publicAceSrcMinSnippetsVbscriptJs, + "public/ace/src-min/snippets/velocity.js": publicAceSrcMinSnippetsVelocityJs, + "public/ace/src-min/snippets/verilog.js": publicAceSrcMinSnippetsVerilogJs, + "public/ace/src-min/snippets/vhdl.js": publicAceSrcMinSnippetsVhdlJs, + "public/ace/src-min/snippets/wollok.js": publicAceSrcMinSnippetsWollokJs, + "public/ace/src-min/snippets/xml.js": publicAceSrcMinSnippetsXmlJs, + "public/ace/src-min/snippets/xquery.js": publicAceSrcMinSnippetsXqueryJs, + "public/ace/src-min/snippets/yaml.js": publicAceSrcMinSnippetsYamlJs, + "public/ace/src-min/theme-github.js": publicAceSrcMinThemeGithubJs, + "public/ace/src-min/worker-coffee.js": publicAceSrcMinWorkerCoffeeJs, + "public/ace/src-min/worker-css.js": publicAceSrcMinWorkerCssJs, + "public/ace/src-min/worker-html.js": publicAceSrcMinWorkerHtmlJs, + "public/ace/src-min/worker-javascript.js": publicAceSrcMinWorkerJavascriptJs, + "public/ace/src-min/worker-json.js": publicAceSrcMinWorkerJsonJs, + "public/ace/src-min/worker-lua.js": publicAceSrcMinWorkerLuaJs, + "public/ace/src-min/worker-php.js": publicAceSrcMinWorkerPhpJs, + "public/ace/src-min/worker-xml.js": publicAceSrcMinWorkerXmlJs, + "public/ace/src-min/worker-xquery.js": publicAceSrcMinWorkerXqueryJs, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} +var _bintree = &bintree{nil, map[string]*bintree{ + "public": &bintree{nil, map[string]*bintree{ + "ace": &bintree{nil, map[string]*bintree{ + "src-min": &bintree{nil, map[string]*bintree{ + "ace.js": &bintree{publicAceSrcMinAceJs, map[string]*bintree{}}, + "ext-beautify.js": &bintree{publicAceSrcMinExtBeautifyJs, map[string]*bintree{}}, + "ext-chromevox.js": &bintree{publicAceSrcMinExtChromevoxJs, map[string]*bintree{}}, + "ext-elastic_tabstops_lite.js": &bintree{publicAceSrcMinExtElastic_tabstops_liteJs, map[string]*bintree{}}, + "ext-emmet.js": &bintree{publicAceSrcMinExtEmmetJs, map[string]*bintree{}}, + "ext-error_marker.js": &bintree{publicAceSrcMinExtError_markerJs, map[string]*bintree{}}, + "ext-keybinding_menu.js": &bintree{publicAceSrcMinExtKeybinding_menuJs, map[string]*bintree{}}, + "ext-language_tools.js": &bintree{publicAceSrcMinExtLanguage_toolsJs, map[string]*bintree{}}, + "ext-linking.js": &bintree{publicAceSrcMinExtLinkingJs, map[string]*bintree{}}, + "ext-modelist.js": &bintree{publicAceSrcMinExtModelistJs, map[string]*bintree{}}, + "ext-old_ie.js": &bintree{publicAceSrcMinExtOld_ieJs, map[string]*bintree{}}, + "ext-searchbox.js": &bintree{publicAceSrcMinExtSearchboxJs, map[string]*bintree{}}, + "ext-settings_menu.js": &bintree{publicAceSrcMinExtSettings_menuJs, map[string]*bintree{}}, + "ext-spellcheck.js": &bintree{publicAceSrcMinExtSpellcheckJs, map[string]*bintree{}}, + "ext-split.js": &bintree{publicAceSrcMinExtSplitJs, map[string]*bintree{}}, + "ext-static_highlight.js": &bintree{publicAceSrcMinExtStatic_highlightJs, map[string]*bintree{}}, + "ext-statusbar.js": &bintree{publicAceSrcMinExtStatusbarJs, map[string]*bintree{}}, + "ext-textarea.js": &bintree{publicAceSrcMinExtTextareaJs, map[string]*bintree{}}, + "ext-themelist.js": &bintree{publicAceSrcMinExtThemelistJs, map[string]*bintree{}}, + "ext-whitespace.js": &bintree{publicAceSrcMinExtWhitespaceJs, map[string]*bintree{}}, + "keybinding-emacs.js": &bintree{publicAceSrcMinKeybindingEmacsJs, map[string]*bintree{}}, + "keybinding-vim.js": &bintree{publicAceSrcMinKeybindingVimJs, map[string]*bintree{}}, + "mode-abap.js": &bintree{publicAceSrcMinModeAbapJs, map[string]*bintree{}}, + "mode-abc.js": &bintree{publicAceSrcMinModeAbcJs, map[string]*bintree{}}, + "mode-actionscript.js": &bintree{publicAceSrcMinModeActionscriptJs, map[string]*bintree{}}, + "mode-ada.js": &bintree{publicAceSrcMinModeAdaJs, map[string]*bintree{}}, + "mode-apache_conf.js": &bintree{publicAceSrcMinModeApache_confJs, map[string]*bintree{}}, + "mode-applescript.js": &bintree{publicAceSrcMinModeApplescriptJs, map[string]*bintree{}}, + "mode-asciidoc.js": &bintree{publicAceSrcMinModeAsciidocJs, map[string]*bintree{}}, + "mode-assembly_x86.js": &bintree{publicAceSrcMinModeAssembly_x86Js, map[string]*bintree{}}, + "mode-autohotkey.js": &bintree{publicAceSrcMinModeAutohotkeyJs, map[string]*bintree{}}, + "mode-batchfile.js": &bintree{publicAceSrcMinModeBatchfileJs, map[string]*bintree{}}, + "mode-bro.js": &bintree{publicAceSrcMinModeBroJs, map[string]*bintree{}}, + "mode-c9search.js": &bintree{publicAceSrcMinModeC9searchJs, map[string]*bintree{}}, + "mode-c_cpp.js": &bintree{publicAceSrcMinModeC_cppJs, map[string]*bintree{}}, + "mode-cirru.js": &bintree{publicAceSrcMinModeCirruJs, map[string]*bintree{}}, + "mode-clojure.js": &bintree{publicAceSrcMinModeClojureJs, map[string]*bintree{}}, + "mode-cobol.js": &bintree{publicAceSrcMinModeCobolJs, map[string]*bintree{}}, + "mode-coffee.js": &bintree{publicAceSrcMinModeCoffeeJs, map[string]*bintree{}}, + "mode-coldfusion.js": &bintree{publicAceSrcMinModeColdfusionJs, map[string]*bintree{}}, + "mode-csharp.js": &bintree{publicAceSrcMinModeCsharpJs, map[string]*bintree{}}, + "mode-css.js": &bintree{publicAceSrcMinModeCssJs, map[string]*bintree{}}, + "mode-curly.js": &bintree{publicAceSrcMinModeCurlyJs, map[string]*bintree{}}, + "mode-d.js": &bintree{publicAceSrcMinModeDJs, map[string]*bintree{}}, + "mode-dart.js": &bintree{publicAceSrcMinModeDartJs, map[string]*bintree{}}, + "mode-diff.js": &bintree{publicAceSrcMinModeDiffJs, map[string]*bintree{}}, + "mode-django.js": &bintree{publicAceSrcMinModeDjangoJs, map[string]*bintree{}}, + "mode-dockerfile.js": &bintree{publicAceSrcMinModeDockerfileJs, map[string]*bintree{}}, + "mode-dot.js": &bintree{publicAceSrcMinModeDotJs, map[string]*bintree{}}, + "mode-drools.js": &bintree{publicAceSrcMinModeDroolsJs, map[string]*bintree{}}, + "mode-eiffel.js": &bintree{publicAceSrcMinModeEiffelJs, map[string]*bintree{}}, + "mode-ejs.js": &bintree{publicAceSrcMinModeEjsJs, map[string]*bintree{}}, + "mode-elixir.js": &bintree{publicAceSrcMinModeElixirJs, map[string]*bintree{}}, + "mode-elm.js": &bintree{publicAceSrcMinModeElmJs, map[string]*bintree{}}, + "mode-erlang.js": &bintree{publicAceSrcMinModeErlangJs, map[string]*bintree{}}, + "mode-forth.js": &bintree{publicAceSrcMinModeForthJs, map[string]*bintree{}}, + "mode-fortran.js": &bintree{publicAceSrcMinModeFortranJs, map[string]*bintree{}}, + "mode-ftl.js": &bintree{publicAceSrcMinModeFtlJs, map[string]*bintree{}}, + "mode-gcode.js": &bintree{publicAceSrcMinModeGcodeJs, map[string]*bintree{}}, + "mode-gherkin.js": &bintree{publicAceSrcMinModeGherkinJs, map[string]*bintree{}}, + "mode-gitignore.js": &bintree{publicAceSrcMinModeGitignoreJs, map[string]*bintree{}}, + "mode-glsl.js": &bintree{publicAceSrcMinModeGlslJs, map[string]*bintree{}}, + "mode-gobstones.js": &bintree{publicAceSrcMinModeGobstonesJs, map[string]*bintree{}}, + "mode-golang.js": &bintree{publicAceSrcMinModeGolangJs, map[string]*bintree{}}, + "mode-groovy.js": &bintree{publicAceSrcMinModeGroovyJs, map[string]*bintree{}}, + "mode-haml.js": &bintree{publicAceSrcMinModeHamlJs, map[string]*bintree{}}, + "mode-handlebars.js": &bintree{publicAceSrcMinModeHandlebarsJs, map[string]*bintree{}}, + "mode-haskell.js": &bintree{publicAceSrcMinModeHaskellJs, map[string]*bintree{}}, + "mode-haskell_cabal.js": &bintree{publicAceSrcMinModeHaskell_cabalJs, map[string]*bintree{}}, + "mode-haxe.js": &bintree{publicAceSrcMinModeHaxeJs, map[string]*bintree{}}, + "mode-hjson.js": &bintree{publicAceSrcMinModeHjsonJs, map[string]*bintree{}}, + "mode-html.js": &bintree{publicAceSrcMinModeHtmlJs, map[string]*bintree{}}, + "mode-html_elixir.js": &bintree{publicAceSrcMinModeHtml_elixirJs, map[string]*bintree{}}, + "mode-html_ruby.js": &bintree{publicAceSrcMinModeHtml_rubyJs, map[string]*bintree{}}, + "mode-ini.js": &bintree{publicAceSrcMinModeIniJs, map[string]*bintree{}}, + "mode-io.js": &bintree{publicAceSrcMinModeIoJs, map[string]*bintree{}}, + "mode-jack.js": &bintree{publicAceSrcMinModeJackJs, map[string]*bintree{}}, + "mode-jade.js": &bintree{publicAceSrcMinModeJadeJs, map[string]*bintree{}}, + "mode-java.js": &bintree{publicAceSrcMinModeJavaJs, map[string]*bintree{}}, + "mode-javascript.js": &bintree{publicAceSrcMinModeJavascriptJs, map[string]*bintree{}}, + "mode-json.js": &bintree{publicAceSrcMinModeJsonJs, map[string]*bintree{}}, + "mode-jsoniq.js": &bintree{publicAceSrcMinModeJsoniqJs, map[string]*bintree{}}, + "mode-jsp.js": &bintree{publicAceSrcMinModeJspJs, map[string]*bintree{}}, + "mode-jsx.js": &bintree{publicAceSrcMinModeJsxJs, map[string]*bintree{}}, + "mode-julia.js": &bintree{publicAceSrcMinModeJuliaJs, map[string]*bintree{}}, + "mode-kotlin.js": &bintree{publicAceSrcMinModeKotlinJs, map[string]*bintree{}}, + "mode-latex.js": &bintree{publicAceSrcMinModeLatexJs, map[string]*bintree{}}, + "mode-lean.js": &bintree{publicAceSrcMinModeLeanJs, map[string]*bintree{}}, + "mode-less.js": &bintree{publicAceSrcMinModeLessJs, map[string]*bintree{}}, + "mode-liquid.js": &bintree{publicAceSrcMinModeLiquidJs, map[string]*bintree{}}, + "mode-lisp.js": &bintree{publicAceSrcMinModeLispJs, map[string]*bintree{}}, + "mode-live_script.js": &bintree{publicAceSrcMinModeLive_scriptJs, map[string]*bintree{}}, + "mode-livescript.js": &bintree{publicAceSrcMinModeLivescriptJs, map[string]*bintree{}}, + "mode-logiql.js": &bintree{publicAceSrcMinModeLogiqlJs, map[string]*bintree{}}, + "mode-lsl.js": &bintree{publicAceSrcMinModeLslJs, map[string]*bintree{}}, + "mode-lua.js": &bintree{publicAceSrcMinModeLuaJs, map[string]*bintree{}}, + "mode-luapage.js": &bintree{publicAceSrcMinModeLuapageJs, map[string]*bintree{}}, + "mode-lucene.js": &bintree{publicAceSrcMinModeLuceneJs, map[string]*bintree{}}, + "mode-makefile.js": &bintree{publicAceSrcMinModeMakefileJs, map[string]*bintree{}}, + "mode-markdown.js": &bintree{publicAceSrcMinModeMarkdownJs, map[string]*bintree{}}, + "mode-mask.js": &bintree{publicAceSrcMinModeMaskJs, map[string]*bintree{}}, + "mode-matlab.js": &bintree{publicAceSrcMinModeMatlabJs, map[string]*bintree{}}, + "mode-maze.js": &bintree{publicAceSrcMinModeMazeJs, map[string]*bintree{}}, + "mode-mel.js": &bintree{publicAceSrcMinModeMelJs, map[string]*bintree{}}, + "mode-mips_assembler.js": &bintree{publicAceSrcMinModeMips_assemblerJs, map[string]*bintree{}}, + "mode-mipsassembler.js": &bintree{publicAceSrcMinModeMipsassemblerJs, map[string]*bintree{}}, + "mode-mushcode.js": &bintree{publicAceSrcMinModeMushcodeJs, map[string]*bintree{}}, + "mode-mysql.js": &bintree{publicAceSrcMinModeMysqlJs, map[string]*bintree{}}, + "mode-nix.js": &bintree{publicAceSrcMinModeNixJs, map[string]*bintree{}}, + "mode-nsis.js": &bintree{publicAceSrcMinModeNsisJs, map[string]*bintree{}}, + "mode-objectivec.js": &bintree{publicAceSrcMinModeObjectivecJs, map[string]*bintree{}}, + "mode-ocaml.js": &bintree{publicAceSrcMinModeOcamlJs, map[string]*bintree{}}, + "mode-pascal.js": &bintree{publicAceSrcMinModePascalJs, map[string]*bintree{}}, + "mode-perl.js": &bintree{publicAceSrcMinModePerlJs, map[string]*bintree{}}, + "mode-pgsql.js": &bintree{publicAceSrcMinModePgsqlJs, map[string]*bintree{}}, + "mode-php.js": &bintree{publicAceSrcMinModePhpJs, map[string]*bintree{}}, + "mode-plain_text.js": &bintree{publicAceSrcMinModePlain_textJs, map[string]*bintree{}}, + "mode-powershell.js": &bintree{publicAceSrcMinModePowershellJs, map[string]*bintree{}}, + "mode-praat.js": &bintree{publicAceSrcMinModePraatJs, map[string]*bintree{}}, + "mode-prolog.js": &bintree{publicAceSrcMinModePrologJs, map[string]*bintree{}}, + "mode-properties.js": &bintree{publicAceSrcMinModePropertiesJs, map[string]*bintree{}}, + "mode-protobuf.js": &bintree{publicAceSrcMinModeProtobufJs, map[string]*bintree{}}, + "mode-python.js": &bintree{publicAceSrcMinModePythonJs, map[string]*bintree{}}, + "mode-r.js": &bintree{publicAceSrcMinModeRJs, map[string]*bintree{}}, + "mode-razor.js": &bintree{publicAceSrcMinModeRazorJs, map[string]*bintree{}}, + "mode-rdoc.js": &bintree{publicAceSrcMinModeRdocJs, map[string]*bintree{}}, + "mode-rhtml.js": &bintree{publicAceSrcMinModeRhtmlJs, map[string]*bintree{}}, + "mode-rst.js": &bintree{publicAceSrcMinModeRstJs, map[string]*bintree{}}, + "mode-ruby.js": &bintree{publicAceSrcMinModeRubyJs, map[string]*bintree{}}, + "mode-rust.js": &bintree{publicAceSrcMinModeRustJs, map[string]*bintree{}}, + "mode-sass.js": &bintree{publicAceSrcMinModeSassJs, map[string]*bintree{}}, + "mode-scad.js": &bintree{publicAceSrcMinModeScadJs, map[string]*bintree{}}, + "mode-scala.js": &bintree{publicAceSrcMinModeScalaJs, map[string]*bintree{}}, + "mode-scheme.js": &bintree{publicAceSrcMinModeSchemeJs, map[string]*bintree{}}, + "mode-scss.js": &bintree{publicAceSrcMinModeScssJs, map[string]*bintree{}}, + "mode-sh.js": &bintree{publicAceSrcMinModeShJs, map[string]*bintree{}}, + "mode-sjs.js": &bintree{publicAceSrcMinModeSjsJs, map[string]*bintree{}}, + "mode-smarty.js": &bintree{publicAceSrcMinModeSmartyJs, map[string]*bintree{}}, + "mode-snippets.js": &bintree{publicAceSrcMinModeSnippetsJs, map[string]*bintree{}}, + "mode-soy_template.js": &bintree{publicAceSrcMinModeSoy_templateJs, map[string]*bintree{}}, + "mode-space.js": &bintree{publicAceSrcMinModeSpaceJs, map[string]*bintree{}}, + "mode-sql.js": &bintree{publicAceSrcMinModeSqlJs, map[string]*bintree{}}, + "mode-sqlserver.js": &bintree{publicAceSrcMinModeSqlserverJs, map[string]*bintree{}}, + "mode-stylus.js": &bintree{publicAceSrcMinModeStylusJs, map[string]*bintree{}}, + "mode-svg.js": &bintree{publicAceSrcMinModeSvgJs, map[string]*bintree{}}, + "mode-swift.js": &bintree{publicAceSrcMinModeSwiftJs, map[string]*bintree{}}, + "mode-swig.js": &bintree{publicAceSrcMinModeSwigJs, map[string]*bintree{}}, + "mode-tcl.js": &bintree{publicAceSrcMinModeTclJs, map[string]*bintree{}}, + "mode-tex.js": &bintree{publicAceSrcMinModeTexJs, map[string]*bintree{}}, + "mode-text.js": &bintree{publicAceSrcMinModeTextJs, map[string]*bintree{}}, + "mode-textile.js": &bintree{publicAceSrcMinModeTextileJs, map[string]*bintree{}}, + "mode-toml.js": &bintree{publicAceSrcMinModeTomlJs, map[string]*bintree{}}, + "mode-tsx.js": &bintree{publicAceSrcMinModeTsxJs, map[string]*bintree{}}, + "mode-twig.js": &bintree{publicAceSrcMinModeTwigJs, map[string]*bintree{}}, + "mode-typescript.js": &bintree{publicAceSrcMinModeTypescriptJs, map[string]*bintree{}}, + "mode-vala.js": &bintree{publicAceSrcMinModeValaJs, map[string]*bintree{}}, + "mode-vbscript.js": &bintree{publicAceSrcMinModeVbscriptJs, map[string]*bintree{}}, + "mode-velocity.js": &bintree{publicAceSrcMinModeVelocityJs, map[string]*bintree{}}, + "mode-verilog.js": &bintree{publicAceSrcMinModeVerilogJs, map[string]*bintree{}}, + "mode-vhdl.js": &bintree{publicAceSrcMinModeVhdlJs, map[string]*bintree{}}, + "mode-wollok.js": &bintree{publicAceSrcMinModeWollokJs, map[string]*bintree{}}, + "mode-xml.js": &bintree{publicAceSrcMinModeXmlJs, map[string]*bintree{}}, + "mode-xquery.js": &bintree{publicAceSrcMinModeXqueryJs, map[string]*bintree{}}, + "mode-yaml.js": &bintree{publicAceSrcMinModeYamlJs, map[string]*bintree{}}, + "snippets": &bintree{nil, map[string]*bintree{ + "abap.js": &bintree{publicAceSrcMinSnippetsAbapJs, map[string]*bintree{}}, + "abc.js": &bintree{publicAceSrcMinSnippetsAbcJs, map[string]*bintree{}}, + "actionscript.js": &bintree{publicAceSrcMinSnippetsActionscriptJs, map[string]*bintree{}}, + "ada.js": &bintree{publicAceSrcMinSnippetsAdaJs, map[string]*bintree{}}, + "apache_conf.js": &bintree{publicAceSrcMinSnippetsApache_confJs, map[string]*bintree{}}, + "applescript.js": &bintree{publicAceSrcMinSnippetsApplescriptJs, map[string]*bintree{}}, + "asciidoc.js": &bintree{publicAceSrcMinSnippetsAsciidocJs, map[string]*bintree{}}, + "assembly_x86.js": &bintree{publicAceSrcMinSnippetsAssembly_x86Js, map[string]*bintree{}}, + "autohotkey.js": &bintree{publicAceSrcMinSnippetsAutohotkeyJs, map[string]*bintree{}}, + "batchfile.js": &bintree{publicAceSrcMinSnippetsBatchfileJs, map[string]*bintree{}}, + "bro.js": &bintree{publicAceSrcMinSnippetsBroJs, map[string]*bintree{}}, + "c9search.js": &bintree{publicAceSrcMinSnippetsC9searchJs, map[string]*bintree{}}, + "c_cpp.js": &bintree{publicAceSrcMinSnippetsC_cppJs, map[string]*bintree{}}, + "cirru.js": &bintree{publicAceSrcMinSnippetsCirruJs, map[string]*bintree{}}, + "clojure.js": &bintree{publicAceSrcMinSnippetsClojureJs, map[string]*bintree{}}, + "cobol.js": &bintree{publicAceSrcMinSnippetsCobolJs, map[string]*bintree{}}, + "coffee.js": &bintree{publicAceSrcMinSnippetsCoffeeJs, map[string]*bintree{}}, + "coldfusion.js": &bintree{publicAceSrcMinSnippetsColdfusionJs, map[string]*bintree{}}, + "csharp.js": &bintree{publicAceSrcMinSnippetsCsharpJs, map[string]*bintree{}}, + "css.js": &bintree{publicAceSrcMinSnippetsCssJs, map[string]*bintree{}}, + "curly.js": &bintree{publicAceSrcMinSnippetsCurlyJs, map[string]*bintree{}}, + "d.js": &bintree{publicAceSrcMinSnippetsDJs, map[string]*bintree{}}, + "dart.js": &bintree{publicAceSrcMinSnippetsDartJs, map[string]*bintree{}}, + "diff.js": &bintree{publicAceSrcMinSnippetsDiffJs, map[string]*bintree{}}, + "django.js": &bintree{publicAceSrcMinSnippetsDjangoJs, map[string]*bintree{}}, + "dockerfile.js": &bintree{publicAceSrcMinSnippetsDockerfileJs, map[string]*bintree{}}, + "dot.js": &bintree{publicAceSrcMinSnippetsDotJs, map[string]*bintree{}}, + "drools.js": &bintree{publicAceSrcMinSnippetsDroolsJs, map[string]*bintree{}}, + "eiffel.js": &bintree{publicAceSrcMinSnippetsEiffelJs, map[string]*bintree{}}, + "ejs.js": &bintree{publicAceSrcMinSnippetsEjsJs, map[string]*bintree{}}, + "elixir.js": &bintree{publicAceSrcMinSnippetsElixirJs, map[string]*bintree{}}, + "elm.js": &bintree{publicAceSrcMinSnippetsElmJs, map[string]*bintree{}}, + "erlang.js": &bintree{publicAceSrcMinSnippetsErlangJs, map[string]*bintree{}}, + "forth.js": &bintree{publicAceSrcMinSnippetsForthJs, map[string]*bintree{}}, + "fortran.js": &bintree{publicAceSrcMinSnippetsFortranJs, map[string]*bintree{}}, + "ftl.js": &bintree{publicAceSrcMinSnippetsFtlJs, map[string]*bintree{}}, + "gcode.js": &bintree{publicAceSrcMinSnippetsGcodeJs, map[string]*bintree{}}, + "gherkin.js": &bintree{publicAceSrcMinSnippetsGherkinJs, map[string]*bintree{}}, + "gitignore.js": &bintree{publicAceSrcMinSnippetsGitignoreJs, map[string]*bintree{}}, + "glsl.js": &bintree{publicAceSrcMinSnippetsGlslJs, map[string]*bintree{}}, + "gobstones.js": &bintree{publicAceSrcMinSnippetsGobstonesJs, map[string]*bintree{}}, + "golang.js": &bintree{publicAceSrcMinSnippetsGolangJs, map[string]*bintree{}}, + "groovy.js": &bintree{publicAceSrcMinSnippetsGroovyJs, map[string]*bintree{}}, + "haml.js": &bintree{publicAceSrcMinSnippetsHamlJs, map[string]*bintree{}}, + "handlebars.js": &bintree{publicAceSrcMinSnippetsHandlebarsJs, map[string]*bintree{}}, + "haskell.js": &bintree{publicAceSrcMinSnippetsHaskellJs, map[string]*bintree{}}, + "haskell_cabal.js": &bintree{publicAceSrcMinSnippetsHaskell_cabalJs, map[string]*bintree{}}, + "haxe.js": &bintree{publicAceSrcMinSnippetsHaxeJs, map[string]*bintree{}}, + "hjson.js": &bintree{publicAceSrcMinSnippetsHjsonJs, map[string]*bintree{}}, + "html.js": &bintree{publicAceSrcMinSnippetsHtmlJs, map[string]*bintree{}}, + "html_elixir.js": &bintree{publicAceSrcMinSnippetsHtml_elixirJs, map[string]*bintree{}}, + "html_ruby.js": &bintree{publicAceSrcMinSnippetsHtml_rubyJs, map[string]*bintree{}}, + "ini.js": &bintree{publicAceSrcMinSnippetsIniJs, map[string]*bintree{}}, + "io.js": &bintree{publicAceSrcMinSnippetsIoJs, map[string]*bintree{}}, + "jack.js": &bintree{publicAceSrcMinSnippetsJackJs, map[string]*bintree{}}, + "jade.js": &bintree{publicAceSrcMinSnippetsJadeJs, map[string]*bintree{}}, + "java.js": &bintree{publicAceSrcMinSnippetsJavaJs, map[string]*bintree{}}, + "javascript.js": &bintree{publicAceSrcMinSnippetsJavascriptJs, map[string]*bintree{}}, + "json.js": &bintree{publicAceSrcMinSnippetsJsonJs, map[string]*bintree{}}, + "jsoniq.js": &bintree{publicAceSrcMinSnippetsJsoniqJs, map[string]*bintree{}}, + "jsp.js": &bintree{publicAceSrcMinSnippetsJspJs, map[string]*bintree{}}, + "jsx.js": &bintree{publicAceSrcMinSnippetsJsxJs, map[string]*bintree{}}, + "julia.js": &bintree{publicAceSrcMinSnippetsJuliaJs, map[string]*bintree{}}, + "kotlin.js": &bintree{publicAceSrcMinSnippetsKotlinJs, map[string]*bintree{}}, + "latex.js": &bintree{publicAceSrcMinSnippetsLatexJs, map[string]*bintree{}}, + "lean.js": &bintree{publicAceSrcMinSnippetsLeanJs, map[string]*bintree{}}, + "less.js": &bintree{publicAceSrcMinSnippetsLessJs, map[string]*bintree{}}, + "liquid.js": &bintree{publicAceSrcMinSnippetsLiquidJs, map[string]*bintree{}}, + "lisp.js": &bintree{publicAceSrcMinSnippetsLispJs, map[string]*bintree{}}, + "live_script.js": &bintree{publicAceSrcMinSnippetsLive_scriptJs, map[string]*bintree{}}, + "livescript.js": &bintree{publicAceSrcMinSnippetsLivescriptJs, map[string]*bintree{}}, + "logiql.js": &bintree{publicAceSrcMinSnippetsLogiqlJs, map[string]*bintree{}}, + "lsl.js": &bintree{publicAceSrcMinSnippetsLslJs, map[string]*bintree{}}, + "lua.js": &bintree{publicAceSrcMinSnippetsLuaJs, map[string]*bintree{}}, + "luapage.js": &bintree{publicAceSrcMinSnippetsLuapageJs, map[string]*bintree{}}, + "lucene.js": &bintree{publicAceSrcMinSnippetsLuceneJs, map[string]*bintree{}}, + "makefile.js": &bintree{publicAceSrcMinSnippetsMakefileJs, map[string]*bintree{}}, + "markdown.js": &bintree{publicAceSrcMinSnippetsMarkdownJs, map[string]*bintree{}}, + "mask.js": &bintree{publicAceSrcMinSnippetsMaskJs, map[string]*bintree{}}, + "matlab.js": &bintree{publicAceSrcMinSnippetsMatlabJs, map[string]*bintree{}}, + "maze.js": &bintree{publicAceSrcMinSnippetsMazeJs, map[string]*bintree{}}, + "mel.js": &bintree{publicAceSrcMinSnippetsMelJs, map[string]*bintree{}}, + "mips_assembler.js": &bintree{publicAceSrcMinSnippetsMips_assemblerJs, map[string]*bintree{}}, + "mipsassembler.js": &bintree{publicAceSrcMinSnippetsMipsassemblerJs, map[string]*bintree{}}, + "mushcode.js": &bintree{publicAceSrcMinSnippetsMushcodeJs, map[string]*bintree{}}, + "mysql.js": &bintree{publicAceSrcMinSnippetsMysqlJs, map[string]*bintree{}}, + "nix.js": &bintree{publicAceSrcMinSnippetsNixJs, map[string]*bintree{}}, + "nsis.js": &bintree{publicAceSrcMinSnippetsNsisJs, map[string]*bintree{}}, + "objectivec.js": &bintree{publicAceSrcMinSnippetsObjectivecJs, map[string]*bintree{}}, + "ocaml.js": &bintree{publicAceSrcMinSnippetsOcamlJs, map[string]*bintree{}}, + "pascal.js": &bintree{publicAceSrcMinSnippetsPascalJs, map[string]*bintree{}}, + "perl.js": &bintree{publicAceSrcMinSnippetsPerlJs, map[string]*bintree{}}, + "pgsql.js": &bintree{publicAceSrcMinSnippetsPgsqlJs, map[string]*bintree{}}, + "php.js": &bintree{publicAceSrcMinSnippetsPhpJs, map[string]*bintree{}}, + "plain_text.js": &bintree{publicAceSrcMinSnippetsPlain_textJs, map[string]*bintree{}}, + "powershell.js": &bintree{publicAceSrcMinSnippetsPowershellJs, map[string]*bintree{}}, + "praat.js": &bintree{publicAceSrcMinSnippetsPraatJs, map[string]*bintree{}}, + "prolog.js": &bintree{publicAceSrcMinSnippetsPrologJs, map[string]*bintree{}}, + "properties.js": &bintree{publicAceSrcMinSnippetsPropertiesJs, map[string]*bintree{}}, + "protobuf.js": &bintree{publicAceSrcMinSnippetsProtobufJs, map[string]*bintree{}}, + "python.js": &bintree{publicAceSrcMinSnippetsPythonJs, map[string]*bintree{}}, + "r.js": &bintree{publicAceSrcMinSnippetsRJs, map[string]*bintree{}}, + "razor.js": &bintree{publicAceSrcMinSnippetsRazorJs, map[string]*bintree{}}, + "rdoc.js": &bintree{publicAceSrcMinSnippetsRdocJs, map[string]*bintree{}}, + "rhtml.js": &bintree{publicAceSrcMinSnippetsRhtmlJs, map[string]*bintree{}}, + "rst.js": &bintree{publicAceSrcMinSnippetsRstJs, map[string]*bintree{}}, + "ruby.js": &bintree{publicAceSrcMinSnippetsRubyJs, map[string]*bintree{}}, + "rust.js": &bintree{publicAceSrcMinSnippetsRustJs, map[string]*bintree{}}, + "sass.js": &bintree{publicAceSrcMinSnippetsSassJs, map[string]*bintree{}}, + "scad.js": &bintree{publicAceSrcMinSnippetsScadJs, map[string]*bintree{}}, + "scala.js": &bintree{publicAceSrcMinSnippetsScalaJs, map[string]*bintree{}}, + "scheme.js": &bintree{publicAceSrcMinSnippetsSchemeJs, map[string]*bintree{}}, + "scss.js": &bintree{publicAceSrcMinSnippetsScssJs, map[string]*bintree{}}, + "sh.js": &bintree{publicAceSrcMinSnippetsShJs, map[string]*bintree{}}, + "sjs.js": &bintree{publicAceSrcMinSnippetsSjsJs, map[string]*bintree{}}, + "smarty.js": &bintree{publicAceSrcMinSnippetsSmartyJs, map[string]*bintree{}}, + "snippets.js": &bintree{publicAceSrcMinSnippetsSnippetsJs, map[string]*bintree{}}, + "soy_template.js": &bintree{publicAceSrcMinSnippetsSoy_templateJs, map[string]*bintree{}}, + "space.js": &bintree{publicAceSrcMinSnippetsSpaceJs, map[string]*bintree{}}, + "sql.js": &bintree{publicAceSrcMinSnippetsSqlJs, map[string]*bintree{}}, + "sqlserver.js": &bintree{publicAceSrcMinSnippetsSqlserverJs, map[string]*bintree{}}, + "stylus.js": &bintree{publicAceSrcMinSnippetsStylusJs, map[string]*bintree{}}, + "svg.js": &bintree{publicAceSrcMinSnippetsSvgJs, map[string]*bintree{}}, + "swift.js": &bintree{publicAceSrcMinSnippetsSwiftJs, map[string]*bintree{}}, + "swig.js": &bintree{publicAceSrcMinSnippetsSwigJs, map[string]*bintree{}}, + "tcl.js": &bintree{publicAceSrcMinSnippetsTclJs, map[string]*bintree{}}, + "tex.js": &bintree{publicAceSrcMinSnippetsTexJs, map[string]*bintree{}}, + "text.js": &bintree{publicAceSrcMinSnippetsTextJs, map[string]*bintree{}}, + "textile.js": &bintree{publicAceSrcMinSnippetsTextileJs, map[string]*bintree{}}, + "toml.js": &bintree{publicAceSrcMinSnippetsTomlJs, map[string]*bintree{}}, + "tsx.js": &bintree{publicAceSrcMinSnippetsTsxJs, map[string]*bintree{}}, + "twig.js": &bintree{publicAceSrcMinSnippetsTwigJs, map[string]*bintree{}}, + "typescript.js": &bintree{publicAceSrcMinSnippetsTypescriptJs, map[string]*bintree{}}, + "vala.js": &bintree{publicAceSrcMinSnippetsValaJs, map[string]*bintree{}}, + "vbscript.js": &bintree{publicAceSrcMinSnippetsVbscriptJs, map[string]*bintree{}}, + "velocity.js": &bintree{publicAceSrcMinSnippetsVelocityJs, map[string]*bintree{}}, + "verilog.js": &bintree{publicAceSrcMinSnippetsVerilogJs, map[string]*bintree{}}, + "vhdl.js": &bintree{publicAceSrcMinSnippetsVhdlJs, map[string]*bintree{}}, + "wollok.js": &bintree{publicAceSrcMinSnippetsWollokJs, map[string]*bintree{}}, + "xml.js": &bintree{publicAceSrcMinSnippetsXmlJs, map[string]*bintree{}}, + "xquery.js": &bintree{publicAceSrcMinSnippetsXqueryJs, map[string]*bintree{}}, + "yaml.js": &bintree{publicAceSrcMinSnippetsYamlJs, map[string]*bintree{}}, + }}, + "theme-github.js": &bintree{publicAceSrcMinThemeGithubJs, map[string]*bintree{}}, + "worker-coffee.js": &bintree{publicAceSrcMinWorkerCoffeeJs, map[string]*bintree{}}, + "worker-css.js": &bintree{publicAceSrcMinWorkerCssJs, map[string]*bintree{}}, + "worker-html.js": &bintree{publicAceSrcMinWorkerHtmlJs, map[string]*bintree{}}, + "worker-javascript.js": &bintree{publicAceSrcMinWorkerJavascriptJs, map[string]*bintree{}}, + "worker-json.js": &bintree{publicAceSrcMinWorkerJsonJs, map[string]*bintree{}}, + "worker-lua.js": &bintree{publicAceSrcMinWorkerLuaJs, map[string]*bintree{}}, + "worker-php.js": &bintree{publicAceSrcMinWorkerPhpJs, map[string]*bintree{}}, + "worker-xml.js": &bintree{publicAceSrcMinWorkerXmlJs, map[string]*bintree{}}, + "worker-xquery.js": &bintree{publicAceSrcMinWorkerXqueryJs, map[string]*bintree{}}, + }}, + }}, + "css": &bintree{nil, map[string]*bintree{ + "fonts.css": &bintree{publicCssFontsCss, map[string]*bintree{}}, + "material": &bintree{nil, map[string]*bintree{ + "icons.woff2": &bintree{publicCssMaterialIconsWoff2, map[string]*bintree{}}, + }}, + "normalize.css": &bintree{publicCssNormalizeCss, map[string]*bintree{}}, + "roboto": &bintree{nil, map[string]*bintree{ + "medium-cyrillic-ext.woff2": &bintree{publicCssRobotoMediumCyrillicExtWoff2, map[string]*bintree{}}, + "medium-cyrillic.woff2": &bintree{publicCssRobotoMediumCyrillicWoff2, map[string]*bintree{}}, + "medium-greek-ext.woff2": &bintree{publicCssRobotoMediumGreekExtWoff2, map[string]*bintree{}}, + "medium-greek.woff2": &bintree{publicCssRobotoMediumGreekWoff2, map[string]*bintree{}}, + "medium-latin-ext.woff2": &bintree{publicCssRobotoMediumLatinExtWoff2, map[string]*bintree{}}, + "medium-latin.woff2": &bintree{publicCssRobotoMediumLatinWoff2, map[string]*bintree{}}, + "medium-vietnamese.woff2": &bintree{publicCssRobotoMediumVietnameseWoff2, map[string]*bintree{}}, + "normal-cyrillic-ext.woff2": &bintree{publicCssRobotoNormalCyrillicExtWoff2, map[string]*bintree{}}, + "normal-cyrillic.woff2": &bintree{publicCssRobotoNormalCyrillicWoff2, map[string]*bintree{}}, + "normal-greek-ext.woff2": &bintree{publicCssRobotoNormalGreekExtWoff2, map[string]*bintree{}}, + "normal-greek.woff2": &bintree{publicCssRobotoNormalGreekWoff2, map[string]*bintree{}}, + "normal-latin-ext.woff2": &bintree{publicCssRobotoNormalLatinExtWoff2, map[string]*bintree{}}, + "normal-latin.woff2": &bintree{publicCssRobotoNormalLatinWoff2, map[string]*bintree{}}, + "normal-vietnamese.woff2": &bintree{publicCssRobotoNormalVietnameseWoff2, map[string]*bintree{}}, + }}, + "styles.css": &bintree{publicCssStylesCss, map[string]*bintree{}}, + }}, + "js": &bintree{nil, map[string]*bintree{ + "common.js": &bintree{publicJsCommonJs, map[string]*bintree{}}, + "editor.js": &bintree{publicJsEditorJs, map[string]*bintree{}}, + "form2js.js": &bintree{publicJsForm2jsJs, map[string]*bintree{}}, + "listing.js": &bintree{publicJsListingJs, map[string]*bintree{}}, + }}, + }}, + "templates": &bintree{nil, map[string]*bintree{ + "base.tmpl": &bintree{templatesBaseTmpl, map[string]*bintree{}}, + "editor.tmpl": &bintree{templatesEditorTmpl, map[string]*bintree{}}, + "frontmatter.tmpl": &bintree{templatesFrontmatterTmpl, map[string]*bintree{}}, + "listing.tmpl": &bintree{templatesListingTmpl, map[string]*bintree{}}, + "minimal.tmpl": &bintree{templatesMinimalTmpl, map[string]*bintree{}}, + "single.tmpl": &bintree{templatesSingleTmpl, map[string]*bintree{}}, + }}, +}} + +// RestoreAsset restores an asset under the given directory +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) + if err != nil { + return err + } + return nil +} + +// RestoreAssets restores an asset under the given directory recursively +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + cannonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) +} + diff --git a/assets/binary.go.REMOVED.git-id b/assets/binary.go.REMOVED.git-id deleted file mode 100644 index 8fc30cca..00000000 --- a/assets/binary.go.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -4c30378a214b5b33410a74961df51cbc21bd6122 \ No newline at end of file diff --git a/cmd/filemanager/main.go b/cmd/filemanager/main.go index 4a0b536e..f421b3b7 100644 --- a/cmd/filemanager/main.go +++ b/cmd/filemanager/main.go @@ -2,10 +2,6 @@ package main import ( "net/http" - "regexp" - "strings" - - "golang.org/x/net/webdav" "github.com/hacdias/filemanager" handlers "github.com/hacdias/filemanager/http" @@ -18,45 +14,8 @@ func handler(w http.ResponseWriter, r *http.Request) { } func main() { - cfg = &filemanager.Config{User: &filemanager.User{}} - cfg.Scope = "." - cfg.FileSystem = webdav.Dir(cfg.Scope) - cfg.BaseURL = "/" - cfg.HugoEnabled = false - cfg.Users = map[string]*filemanager.User{} - cfg.AllowCommands = true - cfg.AllowEdit = true - cfg.AllowNew = true - cfg.Commands = []string{"git", "svn", "hg"} - cfg.BeforeSave = func(r *http.Request, c *filemanager.Config, u *filemanager.User) error { return nil } - cfg.AfterSave = func(r *http.Request, c *filemanager.Config, u *filemanager.User) error { return nil } - cfg.Rules = []*filemanager.Rule{{ - Regex: true, - Allow: false, - Regexp: regexp.MustCompile("\\/\\..+"), - }} - - cfg.BaseURL = strings.TrimPrefix(cfg.BaseURL, "/") - cfg.BaseURL = strings.TrimSuffix(cfg.BaseURL, "/") - cfg.BaseURL = "/" + cfg.BaseURL - cfg.WebDavURL = "" - - if cfg.BaseURL == "/" { - cfg.BaseURL = "" - } - - if cfg.WebDavURL == "" { - cfg.WebDavURL = "webdav" - } - - cfg.PrefixURL = "" - cfg.WebDavURL = cfg.BaseURL + "/" + strings.TrimPrefix(cfg.WebDavURL, "/") - cfg.Handler = &webdav.Handler{ - Prefix: cfg.WebDavURL, - FileSystem: cfg.FileSystem, - LockSystem: webdav.NewMemLS(), - } + cfg = filemanager.New("D:\\TEST\\") http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) -} \ No newline at end of file +} diff --git a/filemanager.go b/filemanager.go index 783eadf7..6ad2cb29 100644 --- a/filemanager.go +++ b/filemanager.go @@ -5,22 +5,58 @@ import ( "regexp" "strings" + rice "github.com/GeertJohan/go.rice" + "golang.org/x/net/webdav" ) -// CommandFunc ... -type CommandFunc func(r *http.Request, c *Config, u *User) error - // Config is a configuration for browsing in a particular path. type Config struct { *User - PrefixURL string - BaseURL string - WebDavURL string - HugoEnabled bool // Enables the Hugo plugin for File Manager - Users map[string]*User - BeforeSave CommandFunc - AfterSave CommandFunc + PrefixURL string // A part of the URL that is stripped from the http.Request + BaseURL string // The base URL of FileManager interface + WebDavURL string // The URL of WebDAV + Users map[string]*User + BeforeSave Command + AfterSave Command + Assets struct { + Templates *rice.Box + Static *rice.Box + } +} + +// New creates a new FileManager object with the default settings +// for a certain scope. +func New(scope string) *Config { + cfg := &Config{ + User: &User{ + Scope: scope, + FileSystem: webdav.Dir(scope), + AllowCommands: true, + AllowEdit: true, + AllowNew: true, + Commands: []string{"git", "svn", "hg"}, + Rules: []*Rule{{ + Regex: true, + Allow: false, + Regexp: regexp.MustCompile("\\/\\..+"), + }}, + }, + Users: map[string]*User{}, + BaseURL: "", + PrefixURL: "", + WebDavURL: "/webdav", + BeforeSave: func(r *http.Request, c *Config, u *User) error { return nil }, + AfterSave: func(r *http.Request, c *Config, u *User) error { return nil }, + } + + cfg.Handler = &webdav.Handler{ + Prefix: cfg.WebDavURL, + FileSystem: cfg.FileSystem, + LockSystem: webdav.NewMemLS(), + } + + return cfg } // AbsoluteURL ... @@ -47,11 +83,11 @@ type User struct { FileSystem webdav.FileSystem `json:"-"` // The virtual file system the user have access Handler *webdav.Handler `json:"-"` // The WebDav HTTP Handler StyleSheet string `json:"-"` // Costum stylesheet + Rules []*Rule `json:"-"` // Access rules AllowNew bool // Can create files and folders AllowEdit bool // Can edit/rename files AllowCommands bool // Can execute commands Commands []string // Available Commands - Rules []*Rule `json:"-"` // Access rules } // Allowed checks if the user has permission to access a directory/file @@ -75,3 +111,6 @@ func (u User) Allowed(url string) bool { return true } + +// Command is a user-defined command that is executed in some moments. +type Command func(r *http.Request, c *Config, u *User) error diff --git a/frontmatter/frontmatter.go b/frontmatter/frontmatter.go index e9e948bf..6e2401d8 100644 --- a/frontmatter/frontmatter.go +++ b/frontmatter/frontmatter.go @@ -13,7 +13,6 @@ import ( "gopkg.in/yaml.v2" "github.com/BurntSushi/toml" - "github.com/hacdias/filemanager/utils" "github.com/spf13/cast" ) @@ -169,9 +168,9 @@ func rawToPretty(config interface{}, parent *Block) *Content { } for name, element := range cnf { - if utils.IsMap(element) { + if isMap(element) { objects = append(objects, handleObjects(element, parent, name)) - } else if utils.IsSlice(element) { + } else if isSlice(element) { arrays = append(arrays, handleArrays(element, parent, name)) } else { if name == "title" && parent.Name == mainName { diff --git a/frontmatter/types.go b/frontmatter/types.go new file mode 100644 index 00000000..89ff9b6d --- /dev/null +++ b/frontmatter/types.go @@ -0,0 +1,13 @@ +package frontmatter + +import "reflect" + +// isMap checks if some variable is a map +func isMap(sth interface{}) bool { + return reflect.ValueOf(sth).Kind() == reflect.Map +} + +// isSlice checks if some variable is a slice +func isSlice(sth interface{}) bool { + return reflect.ValueOf(sth).Kind() == reflect.Slice +} diff --git a/utils/types_test.go b/frontmatter/types_test.go similarity index 92% rename from utils/types_test.go rename to frontmatter/types_test.go index 28ebd4dc..e2f008c3 100644 --- a/utils/types_test.go +++ b/frontmatter/types_test.go @@ -1,4 +1,4 @@ -package utils +package frontmatter import "testing" @@ -20,7 +20,7 @@ var testIsMap = []*interfaceToBool{ func TestIsMap(t *testing.T) { for _, test := range testIsMap { - if IsMap(test.Value) != test.Result { + if isMap(test.Value) != test.Result { t.Errorf("Incorrect value on IsMap for %v; want: %v; got: %v", test.Value, test.Result, !test.Result) } } @@ -42,7 +42,7 @@ var testIsSlice = []*interfaceToBool{ func TestIsSlice(t *testing.T) { for _, test := range testIsSlice { - if IsSlice(test.Value) != test.Result { + if isSlice(test.Value) != test.Result { t.Errorf("Incorrect value on IsSlice for %v; want: %v; got: %v", test.Value, test.Result, !test.Result) } } diff --git a/http/checksum.go b/http/checksum.go index e4dcb82c..a6d535bd 100644 --- a/http/checksum.go +++ b/http/checksum.go @@ -13,7 +13,6 @@ import ( "os" fm "github.com/hacdias/filemanager" - "github.com/hacdias/filemanager/utils" ) // checksum calculates the hash of a filemanager. Supports MD5, SHA1, SHA256 and SHA512. @@ -22,7 +21,7 @@ func checksum(w http.ResponseWriter, r *http.Request, c *fm.Config, i *fm.FileIn file, err := os.Open(i.Path) if err != nil { - return utils.ErrorToHTTPCode(err, true), err + return errorToHTTPCode(err, true), err } defer file.Close() diff --git a/http/http.go b/http/http.go index b438dd49..26bb1a4f 100644 --- a/http/http.go +++ b/http/http.go @@ -10,8 +10,6 @@ import ( fm "github.com/hacdias/filemanager" "github.com/hacdias/filemanager/assets" "github.com/hacdias/filemanager/page" - "github.com/hacdias/filemanager/utils" - "github.com/hacdias/filemanager/wrapper" "github.com/mholt/caddy/caddyhttp/httpserver" ) @@ -74,7 +72,7 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *fm.Config) (int, error r.Method = "PROPFIND" if r.Method == "HEAD" { - w = wrapper.NewResponseWriterNoBody(w) + w = NewResponseWriterNoBody(w) } } case "PROPPATCH", "MOVE", "PATCH", "PUT", "DELETE": @@ -133,7 +131,7 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *fm.Config) (int, error if r.Method == http.MethodGet { // Gets the information of the directory/file fi, err = fm.GetInfo(r.URL, c, user) - code = utils.ErrorToHTTPCode(err, false) + code = errorToHTTPCode(err, false) if err != nil { if r.Method == http.MethodGet { return page.PrintErrorHTML(w, code, err) @@ -171,3 +169,21 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *fm.Config) (int, error return http.StatusNotImplemented, nil } + +// errorToHTTPCode converts errors to HTTP Status Code. +func errorToHTTPCode(err error, gone bool) int { + switch { + case os.IsPermission(err): + return http.StatusForbidden + case os.IsNotExist(err): + if !gone { + return http.StatusNotFound + } + + return http.StatusGone + case os.IsExist(err): + return http.StatusGone + default: + return http.StatusInternalServerError + } +} diff --git a/http/listing.go b/http/listing.go index 3cea7645..807bbe18 100644 --- a/http/listing.go +++ b/http/listing.go @@ -8,7 +8,6 @@ import ( fm "github.com/hacdias/filemanager" "github.com/hacdias/filemanager/page" - "github.com/hacdias/filemanager/utils" "github.com/mholt/caddy/caddyhttp/httpserver" ) @@ -19,7 +18,7 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.Us // Loads the content of the directory listing, err := fm.GetListing(u, i.VirtualPath, c.PrefixURL+r.URL.Path) if err != nil { - return utils.ErrorToHTTPCode(err, true), err + return errorToHTTPCode(err, true), err } listing.Context = httpserver.Context{ diff --git a/wrapper/response_writer.go b/http/response_writer.go similarity index 98% rename from wrapper/response_writer.go rename to http/response_writer.go index 0af79376..060e8f38 100644 --- a/wrapper/response_writer.go +++ b/http/response_writer.go @@ -1,4 +1,4 @@ -package wrapper +package http import "net/http" diff --git a/http/single.go b/http/single.go index e4d75b6d..88709af6 100644 --- a/http/single.go +++ b/http/single.go @@ -6,7 +6,6 @@ import ( fm "github.com/hacdias/filemanager" "github.com/hacdias/filemanager/page" - "github.com/hacdias/filemanager/utils" ) // serveSingle serves a single file in an editor (if it is editable), shows the @@ -15,7 +14,7 @@ func serveSingle(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.Use var err error if err = i.RetrieveFileType(); err != nil { - return utils.ErrorToHTTPCode(err, true), err + return errorToHTTPCode(err, true), err } p := &page.Page{ @@ -36,7 +35,7 @@ func serveSingle(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.Use if i.Type == "text" { if err = i.Read(); err != nil { - return utils.ErrorToHTTPCode(err, true), err + return errorToHTTPCode(err, true), err } } diff --git a/page/functions.go b/page/functions.go new file mode 100644 index 00000000..2eb088f9 --- /dev/null +++ b/page/functions.go @@ -0,0 +1,47 @@ +package page + +import ( + "encoding/base64" + "encoding/json" + "html/template" + "log" + "reflect" +) + +// Create the functions map, then the template, check for erros and +// execute the template if there aren't errors +var functionMap = template.FuncMap{ + "Defined": defined, + "CSS": css, + "Marshal": marshal, + "EncodeBase64": encodeBase64, +} + +// defined checks if variable is defined in a struct +func defined(data interface{}, field string) bool { + t := reflect.Indirect(reflect.ValueOf(data)).Type() + + if t.Kind() != reflect.Struct { + log.Print("Non-struct type not allowed.") + return false + } + + _, b := t.FieldByName(field) + return b +} + +// css returns the sanitized and safe css +func css(s string) template.CSS { + return template.CSS(s) +} + +// marshal converts an interface to json and sanitizes it +func marshal(v interface{}) template.JS { + a, _ := json.Marshal(v) + return template.JS(a) +} + +// encodeBase64 encodes a string in base 64 +func encodeBase64(s string) string { + return base64.StdEncoding.EncodeToString([]byte(s)) +} diff --git a/utils/variables_test.go b/page/functions_test.go similarity index 92% rename from utils/variables_test.go rename to page/functions_test.go index 7122478d..58b83a49 100644 --- a/utils/variables_test.go +++ b/page/functions_test.go @@ -1,4 +1,4 @@ -package utils +package page import "testing" @@ -29,7 +29,7 @@ var testDefinedCases = []testDefined{ func TestDefined(t *testing.T) { for _, pair := range testDefinedCases { - v := Defined(pair.data, pair.field) + v := defined(pair.data, pair.field) if v != pair.result { t.Error( "For", pair.data, diff --git a/page/page.go b/page/page.go index 67592842..8b8c3a65 100644 --- a/page/page.go +++ b/page/page.go @@ -3,7 +3,6 @@ package page import ( "bytes" - "encoding/base64" "encoding/json" "html/template" "log" @@ -12,7 +11,6 @@ import ( "github.com/hacdias/filemanager" "github.com/hacdias/filemanager/assets" - "github.com/hacdias/filemanager/utils" ) // Page contains the informations and functions needed to show the Page @@ -31,7 +29,6 @@ type Info struct { Data interface{} Editor bool Display string - Token string } // BreadcrumbMapItem ... @@ -94,21 +91,6 @@ func (i Info) PreviousLink() string { // PrintAsHTML formats the page in HTML and executes the template func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, error) { - // Create the functions map, then the template, check for erros and - // execute the template if there aren't errors - functions := template.FuncMap{ - "Defined": utils.Defined, - "CSS": func(s string) template.CSS { - return template.CSS(s) - }, - "Marshal": func(v interface{}) template.JS { - a, _ := json.Marshal(v) - return template.JS(a) - }, - "EncodeBase64": func(s string) string { - return base64.StdEncoding.EncodeToString([]byte(s)) - }, - } if p.Minimal { templates = append(templates, "minimal") @@ -132,7 +114,7 @@ func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, erro // If it's the first iteration, creates a new template and add the // functions map if i == 0 { - tpl, err = template.New(t).Funcs(functions).Parse(string(Page)) + tpl, err = template.New(t).Funcs(functionMap).Parse(string(Page)) } else { tpl, err = tpl.Parse(string(Page)) } diff --git a/pre-build.sh b/pre-build.sh new file mode 100644 index 00000000..493b588b --- /dev/null +++ b/pre-build.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +go get github.com/jteeuwen/go-bindata/go-bindata + +go-bindata -debug -pkg assets -prefix "_embed" \ + -o assets/binary.go -ignore "^.*theme-([^g]|g[^i]|gi[^t]|git[^h]|gith[^u]|githu[^b]).*\.js$" \ + _embed/templates/... _embed/public/js/... _embed/public/css/... _embed/public/ace/src-min/... \ \ No newline at end of file diff --git a/utils/errors.go b/utils/errors.go deleted file mode 100644 index c1f13d55..00000000 --- a/utils/errors.go +++ /dev/null @@ -1,24 +0,0 @@ -package utils - -import ( - "net/http" - "os" -) - -// ErrorToHTTPCode converts errors to HTTP Status Code. -func ErrorToHTTPCode(err error, gone bool) int { - switch { - case os.IsPermission(err): - return http.StatusForbidden - case os.IsNotExist(err): - if !gone { - return http.StatusNotFound - } - - return http.StatusGone - case os.IsExist(err): - return http.StatusGone - default: - return http.StatusInternalServerError - } -} diff --git a/utils/types.go b/utils/types.go deleted file mode 100644 index 7e6b408b..00000000 --- a/utils/types.go +++ /dev/null @@ -1,13 +0,0 @@ -package utils - -import "reflect" - -// IsMap checks if some variable is a map -func IsMap(sth interface{}) bool { - return reflect.ValueOf(sth).Kind() == reflect.Map -} - -// IsSlice checks if some variable is a slice -func IsSlice(sth interface{}) bool { - return reflect.ValueOf(sth).Kind() == reflect.Slice -} diff --git a/utils/variables.go b/utils/variables.go deleted file mode 100644 index 28f8383a..00000000 --- a/utils/variables.go +++ /dev/null @@ -1,47 +0,0 @@ -package utils - -import ( - "errors" - "log" - "reflect" -) - -// Defined checks if variable is defined in a struct -func Defined(data interface{}, field string) bool { - t := reflect.Indirect(reflect.ValueOf(data)).Type() - - if t.Kind() != reflect.Struct { - log.Print("Non-struct type not allowed.") - return false - } - - _, b := t.FieldByName(field) - return b -} - -// Dict allows to send more than one variable into a template -func Dict(values ...interface{}) (map[string]interface{}, error) { - if len(values)%2 != 0 { - return nil, errors.New("invalid dict call") - } - dict := make(map[string]interface{}, len(values)/2) - for i := 0; i < len(values); i += 2 { - key, ok := values[i].(string) - if !ok { - return nil, errors.New("dict keys must be strings") - } - dict[key] = values[i+1] - } - - return dict, nil -} - -// StringInSlice checks if a slice contains a string -func StringInSlice(a string, list []string) (bool, int) { - for i, b := range list { - if b == a { - return true, i - } - } - return false, 0 -} From 8d4981fcb877f5b88e792ef49adf611cc1a4e66f Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 19 Jun 2017 18:07:03 +0100 Subject: [PATCH 07/40] more updates Former-commit-id: af4aaf07df5c97968d9498d37222ad39d0f0c689 --- http/editor.go => editor.go | 13 ++- file.go | 22 ++--- page/functions.go => functions.go | 2 +- page/functions_test.go => functions_test.go | 2 +- http/http.go => http.go | 55 ++++------- http/checksum.go => http_checksum.go | 10 +- http/command.go => http_command.go | 5 +- http/download.go => http_download.go | 5 +- http/listing.go => http_listing.go | 14 ++- http/put.go => http_put.go | 10 +- http/search.go => http_search.go | 5 +- http/single.go => http_single.go | 21 ++-- http_utils.go | 24 +++++ listing.go | 6 +- page/page.go => page.go | 95 +++++++++++++++---- page/error.go | 65 ------------- http/response_writer.go => response_writer.go | 2 +- 17 files changed, 167 insertions(+), 189 deletions(-) rename http/editor.go => editor.go (89%) rename page/functions.go => functions.go (98%) rename page/functions_test.go => functions_test.go (97%) rename http/http.go => http.go (77%) rename http/checksum.go => http_checksum.go (76%) rename http/command.go => http_command.go (95%) rename http/download.go => http_download.go (92%) rename http/listing.go => http_listing.go (89%) rename http/put.go => http_put.go (94%) rename http/search.go => http_search.go (94%) rename http/single.go => http_single.go (64%) create mode 100644 http_utils.go rename page/page.go => page.go (53%) delete mode 100644 page/error.go rename http/response_writer.go => response_writer.go (97%) diff --git a/http/editor.go b/editor.go similarity index 89% rename from http/editor.go rename to editor.go index 724a6884..4e785c88 100644 --- a/http/editor.go +++ b/editor.go @@ -1,4 +1,4 @@ -package http +package filemanager import ( "bytes" @@ -7,13 +7,12 @@ import ( "path/filepath" "strings" - fm "github.com/hacdias/filemanager" "github.com/hacdias/filemanager/frontmatter" "github.com/spf13/hugo/parser" ) -// Editor contains the information for the editor page -type Editor struct { +// editor contains the information for the editor page +type editor struct { Class string Mode string Visual bool @@ -24,12 +23,12 @@ type Editor struct { } } -// getEditor gets the editor based on a FileInfo struct -func getEditor(r *http.Request, i *fm.FileInfo) (*Editor, error) { +// newEditor gets the editor based on a FileInfo struct +func newEditor(r *http.Request, i *file) (*editor, error) { var err error // Create a new editor variable and set the mode - e := new(Editor) + e := new(editor) e.Mode = editorMode(i.Name) e.Class = editorClass(e.Mode) diff --git a/file.go b/file.go index 009b8449..70961ce2 100644 --- a/file.go +++ b/file.go @@ -13,8 +13,8 @@ import ( humanize "github.com/dustin/go-humanize" ) -// FileInfo contains the information about a particular file or directory. -type FileInfo struct { +// file contains the information about a particular file or directory. +type file struct { Name string Size int64 URL string @@ -30,11 +30,11 @@ type FileInfo struct { UserAllowed bool // Indicates if the user has enough permissions } -// GetInfo retrieves the file information and the error, if there is any. -func GetInfo(url *url.URL, c *Config, u *User) (*FileInfo, error) { +// getFile retrieves the file information and the error, if there is any. +func getFile(url *url.URL, c *Config, u *User) (*file, error) { var err error - i := &FileInfo{URL: c.PrefixURL + url.Path} + i := &file{URL: c.PrefixURL + url.Path} i.VirtualPath = strings.Replace(url.Path, c.BaseURL, "", 1) i.VirtualPath = strings.TrimPrefix(i.VirtualPath, "/") i.VirtualPath = "/" + i.VirtualPath @@ -75,7 +75,7 @@ var textExtensions = [...]string{ // RetrieveFileType obtains the mimetype and a simplified internal Type // using the first 512 bytes from the file. -func (i *FileInfo) RetrieveFileType() error { +func (i *file) RetrieveFileType() error { i.Mimetype = mime.TypeByExtension(i.Extension) if i.Mimetype == "" { @@ -126,7 +126,7 @@ func (i *FileInfo) RetrieveFileType() error { } // Reads the file. -func (i *FileInfo) Read() error { +func (i *file) Read() error { if len(i.Content) != 0 { return nil } @@ -140,22 +140,22 @@ func (i *FileInfo) Read() error { } // StringifyContent returns the string version of Raw -func (i FileInfo) StringifyContent() string { +func (i file) StringifyContent() string { return string(i.Content) } // HumanSize returns the size of the file as a human-readable string // in IEC format (i.e. power of 2 or base 1024). -func (i FileInfo) HumanSize() string { +func (i file) HumanSize() string { return humanize.IBytes(uint64(i.Size)) } // HumanModTime returns the modified time of the file as a human-readable string. -func (i FileInfo) HumanModTime(format string) string { +func (i file) HumanModTime(format string) string { return i.ModTime.Format(format) } // CanBeEdited checks if the extension of a file is supported by the editor -func (i FileInfo) CanBeEdited() bool { +func (i file) CanBeEdited() bool { return i.Type == "text" } diff --git a/page/functions.go b/functions.go similarity index 98% rename from page/functions.go rename to functions.go index 2eb088f9..a85d3991 100644 --- a/page/functions.go +++ b/functions.go @@ -1,4 +1,4 @@ -package page +package filemanager import ( "encoding/base64" diff --git a/page/functions_test.go b/functions_test.go similarity index 97% rename from page/functions_test.go rename to functions_test.go index 58b83a49..7c5b5c8a 100644 --- a/page/functions_test.go +++ b/functions_test.go @@ -1,4 +1,4 @@ -package page +package filemanager import "testing" diff --git a/http/http.go b/http.go similarity index 77% rename from http/http.go rename to http.go index 26bb1a4f..6e49a3f1 100644 --- a/http/http.go +++ b/http.go @@ -1,4 +1,4 @@ -package http +package filemanager import ( "errors" @@ -7,21 +7,18 @@ import ( "path/filepath" "strings" - fm "github.com/hacdias/filemanager" - "github.com/hacdias/filemanager/assets" - "github.com/hacdias/filemanager/page" "github.com/mholt/caddy/caddyhttp/httpserver" ) // ServeHTTP starts FileManager. -func ServeHTTP(w http.ResponseWriter, r *http.Request, c *fm.Config) (int, error) { +func (c *Config) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { var ( - fi *fm.FileInfo - user *fm.User + fi *file + user *User code int err error ) - + /* TODO: readd this // Checks if the URL matches the Assets URL. Returns the asset if the // method is GET and Status Forbidden otherwise. if strings.HasPrefix(r.URL.Path, c.BaseURL+assets.BaseURL) { @@ -30,7 +27,7 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *fm.Config) (int, error } return http.StatusForbidden, nil - } + } */ // Obtains the user. username, _, _ := r.BasicAuth() @@ -91,7 +88,7 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *fm.Config) (int, error return http.StatusInternalServerError, err } - if preProccessPUT(w, r, c, user) != nil { + if c.preProccessPUT(w, r, user) != nil { return http.StatusInternalServerError, err } } @@ -111,7 +108,7 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *fm.Config) (int, error // Checks if the User is allowed to access this file if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.BaseURL)) { if r.Method == http.MethodGet { - return page.PrintErrorHTML( + return printError( w, http.StatusForbidden, errors.New("You don't have permission to access this page"), ) @@ -121,20 +118,20 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *fm.Config) (int, error } if r.URL.Query().Get("search") != "" { - return search(w, r, c, user) + return c.search(w, r, user) } if r.URL.Query().Get("command") != "" { - return command(w, r, c, user) + return c.command(w, r, user) } if r.Method == http.MethodGet { // Gets the information of the directory/file - fi, err = fm.GetInfo(r.URL, c, user) + fi, err = getFile(r.URL, c, user) code = errorToHTTPCode(err, false) if err != nil { if r.Method == http.MethodGet { - return page.PrintErrorHTML(w, code, err) + return printError(w, code, err) } return code, err } @@ -148,20 +145,20 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *fm.Config) (int, error switch { case r.URL.Query().Get("download") != "": - code, err = download(w, r, c, fi) + code, err = c.download(w, r, fi) case r.URL.Query().Get("raw") == "true" && !fi.IsDir: http.ServeFile(w, r, fi.Path) code, err = 0, nil case !fi.IsDir && r.URL.Query().Get("checksum") != "": - code, err = checksum(w, r, c, fi) + code, err = c.checksum(w, r, fi) case fi.IsDir: - code, err = serveListing(w, r, c, user, fi) + code, err = c.serveListing(w, r, user, fi) default: - code, err = serveSingle(w, r, c, user, fi) + code, err = c.serveSingle(w, r, user, fi) } if err != nil { - code, err = page.PrintErrorHTML(w, code, err) + code, err = printError(w, code, err) } return code, err @@ -169,21 +166,3 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *fm.Config) (int, error return http.StatusNotImplemented, nil } - -// errorToHTTPCode converts errors to HTTP Status Code. -func errorToHTTPCode(err error, gone bool) int { - switch { - case os.IsPermission(err): - return http.StatusForbidden - case os.IsNotExist(err): - if !gone { - return http.StatusNotFound - } - - return http.StatusGone - case os.IsExist(err): - return http.StatusGone - default: - return http.StatusInternalServerError - } -} diff --git a/http/checksum.go b/http_checksum.go similarity index 76% rename from http/checksum.go rename to http_checksum.go index a6d535bd..12039a6a 100644 --- a/http/checksum.go +++ b/http_checksum.go @@ -1,4 +1,4 @@ -package http +package filemanager import ( "crypto/md5" @@ -6,17 +6,15 @@ import ( "crypto/sha256" "crypto/sha512" "encoding/hex" - e "errors" + "errors" "hash" "io" "net/http" "os" - - fm "github.com/hacdias/filemanager" ) // checksum calculates the hash of a filemanager. Supports MD5, SHA1, SHA256 and SHA512. -func checksum(w http.ResponseWriter, r *http.Request, c *fm.Config, i *fm.FileInfo) (int, error) { +func (c *Config) checksum(w http.ResponseWriter, r *http.Request, i *file) (int, error) { query := r.URL.Query().Get("checksum") file, err := os.Open(i.Path) @@ -38,7 +36,7 @@ func checksum(w http.ResponseWriter, r *http.Request, c *fm.Config, i *fm.FileIn case "sha512": h = sha512.New() default: - return http.StatusBadRequest, e.New("Unknown HASH type") + return http.StatusBadRequest, errors.New("Unknown HASH type") } _, err = io.Copy(h, file) diff --git a/http/command.go b/http_command.go similarity index 95% rename from http/command.go rename to http_command.go index 1c1a8ce9..2529b152 100644 --- a/http/command.go +++ b/http_command.go @@ -1,4 +1,4 @@ -package http +package filemanager import ( "bytes" @@ -9,7 +9,6 @@ import ( "time" "github.com/gorilla/websocket" - fm "github.com/hacdias/filemanager" ) var upgrader = websocket.Upgrader{ @@ -23,7 +22,7 @@ var ( ) // command handles the requests for VCS related commands: git, svn and mercurial -func command(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.User) (int, error) { +func (c *Config) command(w http.ResponseWriter, r *http.Request, u *User) (int, error) { // Upgrades the connection to a websocket and checks for errors. conn, err := upgrader.Upgrade(w, r, nil) if err != nil { diff --git a/http/download.go b/http_download.go similarity index 92% rename from http/download.go rename to http_download.go index b1848e47..6d987d58 100644 --- a/http/download.go +++ b/http_download.go @@ -1,4 +1,4 @@ -package http +package filemanager import ( "io" @@ -9,13 +9,12 @@ import ( "path/filepath" "strings" - fm "github.com/hacdias/filemanager" "github.com/mholt/archiver" ) // download creates an archive in one of the supported formats (zip, tar, // tar.gz or tar.bz2) and sends it to be downloaded. -func download(w http.ResponseWriter, r *http.Request, c *fm.Config, i *fm.FileInfo) (int, error) { +func (c *Config) download(w http.ResponseWriter, r *http.Request, i *file) (int, error) { query := r.URL.Query().Get("download") if !i.IsDir { diff --git a/http/listing.go b/http_listing.go similarity index 89% rename from http/listing.go rename to http_listing.go index 807bbe18..3f82bc7e 100644 --- a/http/listing.go +++ b/http_listing.go @@ -1,4 +1,4 @@ -package http +package filemanager import ( "encoding/json" @@ -6,17 +6,15 @@ import ( "strconv" "strings" - fm "github.com/hacdias/filemanager" - "github.com/hacdias/filemanager/page" "github.com/mholt/caddy/caddyhttp/httpserver" ) // serveListing presents the user with a listage of a directory folder. -func serveListing(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.User, i *fm.FileInfo) (int, error) { +func (c *Config) serveListing(w http.ResponseWriter, r *http.Request, u *User, i *file) (int, error) { var err error // Loads the content of the directory - listing, err := fm.GetListing(u, i.VirtualPath, c.PrefixURL+r.URL.Path) + listing, err := GetListing(u, i.VirtualPath, c.PrefixURL+r.URL.Path) if err != nil { return errorToHTTPCode(err, true), err } @@ -79,9 +77,9 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.Us Secure: r.TLS != nil, }) - page := &page.Page{ + page := &page{ Minimal: r.Header.Get("Minimal") == "true", - Info: &page.Info{ + Info: &pageInfo{ Name: listing.Name, Path: i.VirtualPath, IsDir: true, @@ -92,7 +90,7 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.Us }, } - return page.PrintAsHTML(w, "listing") + return page.PrintHTML(w, "listing") } // handleSortOrder gets and stores for a Listing the 'sort' and 'order', diff --git a/http/put.go b/http_put.go similarity index 94% rename from http/put.go rename to http_put.go index 23d0418b..679b9802 100644 --- a/http/put.go +++ b/http_put.go @@ -1,4 +1,4 @@ -package http +package filemanager import ( "bytes" @@ -10,17 +10,11 @@ import ( "strconv" "strings" - "github.com/hacdias/filemanager" "github.com/hacdias/filemanager/frontmatter" ) // preProccessPUT is used to update a file that was edited -func preProccessPUT( - w http.ResponseWriter, - r *http.Request, - c *filemanager.Config, - u *filemanager.User, -) (err error) { +func (c *Config) preProccessPUT(w http.ResponseWriter, r *http.Request, u *User) (err error) { var ( data = map[string]interface{}{} file []byte diff --git a/http/search.go b/http_search.go similarity index 94% rename from http/search.go rename to http_search.go index 3604404f..8604fcc5 100644 --- a/http/search.go +++ b/http_search.go @@ -1,4 +1,4 @@ -package http +package filemanager import ( "net/http" @@ -7,7 +7,6 @@ import ( "strings" "github.com/gorilla/websocket" - fm "github.com/hacdias/filemanager" ) type searchOptions struct { @@ -44,7 +43,7 @@ func parseSearch(value string) *searchOptions { } // search ... -func search(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.User) (int, error) { +func (c *Config) search(w http.ResponseWriter, r *http.Request, u *User) (int, error) { // Upgrades the connection to a websocket and checks for errors. conn, err := upgrader.Upgrade(w, r, nil) if err != nil { diff --git a/http/single.go b/http_single.go similarity index 64% rename from http/single.go rename to http_single.go index 88709af6..fbf0f47d 100644 --- a/http/single.go +++ b/http_single.go @@ -1,24 +1,21 @@ -package http +package filemanager import ( "net/http" "strings" - - fm "github.com/hacdias/filemanager" - "github.com/hacdias/filemanager/page" ) // serveSingle serves a single file in an editor (if it is editable), shows the // plain file, or downloads it if it can't be shown. -func serveSingle(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.User, i *fm.FileInfo) (int, error) { +func (c *Config) serveSingle(w http.ResponseWriter, r *http.Request, u *User, i *file) (int, error) { var err error if err = i.RetrieveFileType(); err != nil { return errorToHTTPCode(err, true), err } - p := &page.Page{ - Info: &page.Info{ + p := &page{ + Info: &pageInfo{ Name: i.Name, Path: i.VirtualPath, IsDir: false, @@ -30,7 +27,7 @@ func serveSingle(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.Use // If the request accepts JSON, we send the file information. if strings.Contains(r.Header.Get("Accept"), "application/json") { - return p.PrintAsJSON(w) + return p.PrintJSON(w) } if i.Type == "text" { @@ -40,14 +37,14 @@ func serveSingle(w http.ResponseWriter, r *http.Request, c *fm.Config, u *fm.Use } if i.CanBeEdited() && u.AllowEdit { - p.Data, err = getEditor(r, i) - p.Editor = true + p.Info.Data, err = newEditor(r, i) + p.Info.Editor = true if err != nil { return http.StatusInternalServerError, err } - return p.PrintAsHTML(w, "frontmatter", "editor") + return p.PrintHTML(w, "frontmatter", "editor") } - return p.PrintAsHTML(w, "single") + return p.PrintHTML(w, "single") } diff --git a/http_utils.go b/http_utils.go new file mode 100644 index 00000000..6ce6f8ea --- /dev/null +++ b/http_utils.go @@ -0,0 +1,24 @@ +package filemanager + +import ( + "net/http" + "os" +) + +// errorToHTTPCode converts errors to HTTP Status Code. +func errorToHTTPCode(err error, gone bool) int { + switch { + case os.IsPermission(err): + return http.StatusForbidden + case os.IsNotExist(err): + if !gone { + return http.StatusNotFound + } + + return http.StatusGone + case os.IsExist(err): + return http.StatusGone + default: + return http.StatusInternalServerError + } +} diff --git a/listing.go b/listing.go index b272c2af..79c53c11 100644 --- a/listing.go +++ b/listing.go @@ -18,7 +18,7 @@ type Listing struct { // The full path of the request relatively to a File System Path string // The items (files and folders) in the path - Items []FileInfo + Items []file // The number of directories in the listing NumDirs int // The number of files (items that aren't directories) in the listing @@ -49,7 +49,7 @@ func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { } var ( - fileinfos []FileInfo + fileinfos []*file dirCount, fileCount int ) @@ -71,7 +71,7 @@ func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { // Absolute URL url := url.URL{Path: baseURL + name} - i := FileInfo{ + i := &file{ Name: f.Name(), Size: f.Size(), ModTime: f.ModTime(), diff --git a/page/page.go b/page.go similarity index 53% rename from page/page.go rename to page.go index 8b8c3a65..ba46b4f8 100644 --- a/page/page.go +++ b/page.go @@ -1,31 +1,29 @@ -// Package page is used to render the HTML to the end user -package page +package filemanager import ( "bytes" "encoding/json" + "errors" "html/template" "log" "net/http" + "strconv" "strings" - - "github.com/hacdias/filemanager" - "github.com/hacdias/filemanager/assets" ) -// Page contains the informations and functions needed to show the Page -type Page struct { - *Info +// page contains the informations and functions needed to show the Page +type page struct { + Info *pageInfo Minimal bool } -// Info contains the information of a Page -type Info struct { +// pageInfo contains the information of a Page +type pageInfo struct { Name string Path string IsDir bool - User *filemanager.User - Config *filemanager.Config + User *User + Config *Config Data interface{} Editor bool Display string @@ -39,7 +37,7 @@ type BreadcrumbMapItem struct { // BreadcrumbMap returns p.Path where every element is a map // of URLs and path segment names. -func (i Info) BreadcrumbMap() []BreadcrumbMapItem { +func (i pageInfo) BreadcrumbMap() []BreadcrumbMapItem { result := []BreadcrumbMapItem{} if len(i.Path) == 0 { @@ -76,7 +74,7 @@ func (i Info) BreadcrumbMap() []BreadcrumbMapItem { } // PreviousLink returns the path of the previous folder -func (i Info) PreviousLink() string { +func (i pageInfo) PreviousLink() string { path := strings.TrimSuffix(i.Path, "/") path = strings.TrimPrefix(path, "/") path = i.Config.AbsoluteURL() + "/" + path @@ -89,8 +87,8 @@ func (i Info) PreviousLink() string { return path } -// PrintAsHTML formats the page in HTML and executes the template -func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, error) { +// PrintHTML formats the page in HTML and executes the template +func (p page) PrintHTML(w http.ResponseWriter, templates ...string) (int, error) { if p.Minimal { templates = append(templates, "minimal") @@ -103,7 +101,8 @@ func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, erro // For each template, add it to the the tpl variable for i, t := range templates { // Get the template from the assets - Page, err := assets.Asset("templates/" + t + ".tmpl") + //Page, err := assets.Asset("templates/" + t + ".tmpl") + Page, err := []byte("Shit"), errors.New("Hello") // Check if there is some error. If so, the template doesn't exist if err != nil { @@ -137,8 +136,8 @@ func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, erro return http.StatusOK, err } -// PrintAsJSON prints the current Page information in JSON -func (p Page) PrintAsJSON(w http.ResponseWriter) (int, error) { +// PrintJSON prints the current Page information in JSON +func (p page) PrintJSON(w http.ResponseWriter) (int, error) { marsh, err := json.MarshalIndent(p.Info.Data, "", " ") if err != nil { return http.StatusInternalServerError, err @@ -151,3 +150,61 @@ func (p Page) PrintAsJSON(w http.ResponseWriter) (int, error) { return http.StatusOK, nil } + +// printError prints the error page +func printError(w http.ResponseWriter, code int, err error) (int, error) { + tpl := errorTemplate + tpl = strings.Replace(tpl, "TITLE", strconv.Itoa(code)+" "+http.StatusText(code), -1) + tpl = strings.Replace(tpl, "CODE", err.Error(), -1) + + _, err = w.Write([]byte(tpl)) + + if err != nil { + return http.StatusInternalServerError, err + } + return http.StatusOK, nil +} + +const errorTemplate = ` + + + TITLE + + + + + + +
    +

    TITLE

    + +

    Try reloading the page or hitting the back button. If this error persists, it seems that you may have found a bug! Please create an issue at hacdias/caddy-filemanager repository on GitHub with the code below.

    + + CODE +
    +` diff --git a/page/error.go b/page/error.go deleted file mode 100644 index cdd470f7..00000000 --- a/page/error.go +++ /dev/null @@ -1,65 +0,0 @@ -package page - -import ( - "net/http" - "strconv" - "strings" -) - -const errTemplate = ` - - - TITLE - - - - - - -
    -

    TITLE

    - -

    Try reloading the page or hitting the back button. If this error persists, it seems that you may have found a bug! Please create an issue at hacdias/caddy-filemanager repository on GitHub with the code below.

    - - CODE -
    -` - -// PrintErrorHTML prints the error page -func PrintErrorHTML(w http.ResponseWriter, code int, err error) (int, error) { - tpl := errTemplate - tpl = strings.Replace(tpl, "TITLE", strconv.Itoa(code)+" "+http.StatusText(code), -1) - tpl = strings.Replace(tpl, "CODE", err.Error(), -1) - - _, err = w.Write([]byte(tpl)) - - if err != nil { - return http.StatusInternalServerError, err - } - return http.StatusOK, nil -} diff --git a/http/response_writer.go b/response_writer.go similarity index 97% rename from http/response_writer.go rename to response_writer.go index 060e8f38..496971d4 100644 --- a/http/response_writer.go +++ b/response_writer.go @@ -1,4 +1,4 @@ -package http +package filemanager import "net/http" From bd7184d5df1569071ff1dcf5d956e6af45c830b3 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 19 Jun 2017 18:23:57 +0100 Subject: [PATCH 08/40] more updates Former-commit-id: 8c19eda25f60e0fc5587dde8c19a8428befc3e0d --- editor.go | 2 +- file.go | 22 +++++++++++----------- filemanager.go | 26 +++++++++++++------------- http.go | 6 +++--- http_checksum.go | 2 +- http_command.go | 2 +- http_download.go | 2 +- http_listing.go | 4 ++-- http_put.go | 2 +- http_search.go | 2 +- http_single.go | 2 +- http_utils.go | 24 ------------------------ listing.go | 26 +++++++++++++------------- page.go | 11 ++++++++++- functions.go => utils.go | 29 ++++++++++++++++++++--------- functions_test.go => utils_test.go | 0 16 files changed, 79 insertions(+), 83 deletions(-) delete mode 100644 http_utils.go rename functions.go => utils.go (67%) rename functions_test.go => utils_test.go (100%) diff --git a/editor.go b/editor.go index 4e785c88..c42deee1 100644 --- a/editor.go +++ b/editor.go @@ -24,7 +24,7 @@ type editor struct { } // newEditor gets the editor based on a FileInfo struct -func newEditor(r *http.Request, i *file) (*editor, error) { +func newEditor(r *http.Request, i *fileInfo) (*editor, error) { var err error // Create a new editor variable and set the mode diff --git a/file.go b/file.go index 70961ce2..5e0599b9 100644 --- a/file.go +++ b/file.go @@ -13,8 +13,8 @@ import ( humanize "github.com/dustin/go-humanize" ) -// file contains the information about a particular file or directory. -type file struct { +// fileInfo contains the information about a particular file or directory. +type fileInfo struct { Name string Size int64 URL string @@ -30,11 +30,11 @@ type file struct { UserAllowed bool // Indicates if the user has enough permissions } -// getFile retrieves the file information and the error, if there is any. -func getFile(url *url.URL, c *Config, u *User) (*file, error) { +// getFileInfo retrieves the file information and the error, if there is any. +func getFileInfo(url *url.URL, c *FileManager, u *User) (*fileInfo, error) { var err error - i := &file{URL: c.PrefixURL + url.Path} + i := &fileInfo{URL: c.PrefixURL + url.Path} i.VirtualPath = strings.Replace(url.Path, c.BaseURL, "", 1) i.VirtualPath = strings.TrimPrefix(i.VirtualPath, "/") i.VirtualPath = "/" + i.VirtualPath @@ -75,7 +75,7 @@ var textExtensions = [...]string{ // RetrieveFileType obtains the mimetype and a simplified internal Type // using the first 512 bytes from the file. -func (i *file) RetrieveFileType() error { +func (i fileInfo) RetrieveFileType() error { i.Mimetype = mime.TypeByExtension(i.Extension) if i.Mimetype == "" { @@ -126,7 +126,7 @@ func (i *file) RetrieveFileType() error { } // Reads the file. -func (i *file) Read() error { +func (i fileInfo) Read() error { if len(i.Content) != 0 { return nil } @@ -140,22 +140,22 @@ func (i *file) Read() error { } // StringifyContent returns the string version of Raw -func (i file) StringifyContent() string { +func (i fileInfo) StringifyContent() string { return string(i.Content) } // HumanSize returns the size of the file as a human-readable string // in IEC format (i.e. power of 2 or base 1024). -func (i file) HumanSize() string { +func (i fileInfo) HumanSize() string { return humanize.IBytes(uint64(i.Size)) } // HumanModTime returns the modified time of the file as a human-readable string. -func (i file) HumanModTime(format string) string { +func (i fileInfo) HumanModTime(format string) string { return i.ModTime.Format(format) } // CanBeEdited checks if the extension of a file is supported by the editor -func (i file) CanBeEdited() bool { +func (i fileInfo) CanBeEdited() bool { return i.Type == "text" } diff --git a/filemanager.go b/filemanager.go index 6ad2cb29..6fc6107c 100644 --- a/filemanager.go +++ b/filemanager.go @@ -10,8 +10,8 @@ import ( "golang.org/x/net/webdav" ) -// Config is a configuration for browsing in a particular path. -type Config struct { +// FileManager is a configuration for browsing in a particular path. +type FileManager struct { *User PrefixURL string // A part of the URL that is stripped from the http.Request BaseURL string // The base URL of FileManager interface @@ -27,8 +27,8 @@ type Config struct { // New creates a new FileManager object with the default settings // for a certain scope. -func New(scope string) *Config { - cfg := &Config{ +func New(scope string) *FileManager { + fm := &FileManager{ User: &User{ Scope: scope, FileSystem: webdav.Dir(scope), @@ -46,26 +46,26 @@ func New(scope string) *Config { BaseURL: "", PrefixURL: "", WebDavURL: "/webdav", - BeforeSave: func(r *http.Request, c *Config, u *User) error { return nil }, - AfterSave: func(r *http.Request, c *Config, u *User) error { return nil }, + BeforeSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, + AfterSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, } - cfg.Handler = &webdav.Handler{ - Prefix: cfg.WebDavURL, - FileSystem: cfg.FileSystem, + fm.Handler = &webdav.Handler{ + Prefix: fm.WebDavURL, + FileSystem: fm.FileSystem, LockSystem: webdav.NewMemLS(), } - return cfg + return fm } // AbsoluteURL ... -func (c Config) AbsoluteURL() string { +func (c FileManager) AbsoluteURL() string { return c.PrefixURL + c.BaseURL } // AbsoluteWebdavURL ... -func (c Config) AbsoluteWebdavURL() string { +func (c FileManager) AbsoluteWebdavURL() string { return c.PrefixURL + c.WebDavURL } @@ -113,4 +113,4 @@ func (u User) Allowed(url string) bool { } // Command is a user-defined command that is executed in some moments. -type Command func(r *http.Request, c *Config, u *User) error +type Command func(r *http.Request, c *FileManager, u *User) error diff --git a/http.go b/http.go index 6e49a3f1..d6c851a1 100644 --- a/http.go +++ b/http.go @@ -11,9 +11,9 @@ import ( ) // ServeHTTP starts FileManager. -func (c *Config) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { +func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { var ( - fi *file + fi *fileInfo user *User code int err error @@ -127,7 +127,7 @@ func (c *Config) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) if r.Method == http.MethodGet { // Gets the information of the directory/file - fi, err = getFile(r.URL, c, user) + fi, err = getFileInfo(r.URL, c, user) code = errorToHTTPCode(err, false) if err != nil { if r.Method == http.MethodGet { diff --git a/http_checksum.go b/http_checksum.go index 12039a6a..58f9fe0e 100644 --- a/http_checksum.go +++ b/http_checksum.go @@ -14,7 +14,7 @@ import ( ) // checksum calculates the hash of a filemanager. Supports MD5, SHA1, SHA256 and SHA512. -func (c *Config) checksum(w http.ResponseWriter, r *http.Request, i *file) (int, error) { +func (c *FileManager) checksum(w http.ResponseWriter, r *http.Request, i *fileInfo) (int, error) { query := r.URL.Query().Get("checksum") file, err := os.Open(i.Path) diff --git a/http_command.go b/http_command.go index 2529b152..3893473b 100644 --- a/http_command.go +++ b/http_command.go @@ -22,7 +22,7 @@ var ( ) // command handles the requests for VCS related commands: git, svn and mercurial -func (c *Config) command(w http.ResponseWriter, r *http.Request, u *User) (int, error) { +func (c *FileManager) command(w http.ResponseWriter, r *http.Request, u *User) (int, error) { // Upgrades the connection to a websocket and checks for errors. conn, err := upgrader.Upgrade(w, r, nil) if err != nil { diff --git a/http_download.go b/http_download.go index 6d987d58..f1556153 100644 --- a/http_download.go +++ b/http_download.go @@ -14,7 +14,7 @@ import ( // download creates an archive in one of the supported formats (zip, tar, // tar.gz or tar.bz2) and sends it to be downloaded. -func (c *Config) download(w http.ResponseWriter, r *http.Request, i *file) (int, error) { +func (c *FileManager) download(w http.ResponseWriter, r *http.Request, i *fileInfo) (int, error) { query := r.URL.Query().Get("download") if !i.IsDir { diff --git a/http_listing.go b/http_listing.go index 3f82bc7e..11480a88 100644 --- a/http_listing.go +++ b/http_listing.go @@ -10,11 +10,11 @@ import ( ) // serveListing presents the user with a listage of a directory folder. -func (c *Config) serveListing(w http.ResponseWriter, r *http.Request, u *User, i *file) (int, error) { +func (c *FileManager) serveListing(w http.ResponseWriter, r *http.Request, u *User, i *fileInfo) (int, error) { var err error // Loads the content of the directory - listing, err := GetListing(u, i.VirtualPath, c.PrefixURL+r.URL.Path) + listing, err := getListing(u, i.VirtualPath, c.PrefixURL+r.URL.Path) if err != nil { return errorToHTTPCode(err, true), err } diff --git a/http_put.go b/http_put.go index 679b9802..fa41658e 100644 --- a/http_put.go +++ b/http_put.go @@ -14,7 +14,7 @@ import ( ) // preProccessPUT is used to update a file that was edited -func (c *Config) preProccessPUT(w http.ResponseWriter, r *http.Request, u *User) (err error) { +func (c *FileManager) preProccessPUT(w http.ResponseWriter, r *http.Request, u *User) (err error) { var ( data = map[string]interface{}{} file []byte diff --git a/http_search.go b/http_search.go index 8604fcc5..9e656de2 100644 --- a/http_search.go +++ b/http_search.go @@ -43,7 +43,7 @@ func parseSearch(value string) *searchOptions { } // search ... -func (c *Config) search(w http.ResponseWriter, r *http.Request, u *User) (int, error) { +func (c *FileManager) search(w http.ResponseWriter, r *http.Request, u *User) (int, error) { // Upgrades the connection to a websocket and checks for errors. conn, err := upgrader.Upgrade(w, r, nil) if err != nil { diff --git a/http_single.go b/http_single.go index fbf0f47d..32f9dbed 100644 --- a/http_single.go +++ b/http_single.go @@ -7,7 +7,7 @@ import ( // serveSingle serves a single file in an editor (if it is editable), shows the // plain file, or downloads it if it can't be shown. -func (c *Config) serveSingle(w http.ResponseWriter, r *http.Request, u *User, i *file) (int, error) { +func (c *FileManager) serveSingle(w http.ResponseWriter, r *http.Request, u *User, i *fileInfo) (int, error) { var err error if err = i.RetrieveFileType(); err != nil { diff --git a/http_utils.go b/http_utils.go deleted file mode 100644 index 6ce6f8ea..00000000 --- a/http_utils.go +++ /dev/null @@ -1,24 +0,0 @@ -package filemanager - -import ( - "net/http" - "os" -) - -// errorToHTTPCode converts errors to HTTP Status Code. -func errorToHTTPCode(err error, gone bool) int { - switch { - case os.IsPermission(err): - return http.StatusForbidden - case os.IsNotExist(err): - if !gone { - return http.StatusNotFound - } - - return http.StatusGone - case os.IsExist(err): - return http.StatusGone - default: - return http.StatusInternalServerError - } -} diff --git a/listing.go b/listing.go index 79c53c11..0b4468c9 100644 --- a/listing.go +++ b/listing.go @@ -11,14 +11,14 @@ import ( "github.com/mholt/caddy/caddyhttp/httpserver" ) -// A Listing is the context used to fill out a template. -type Listing struct { +// A listing is the context used to fill out a template. +type listing struct { // The name of the directory (the last element of the path) Name string // The full path of the request relatively to a File System Path string // The items (files and folders) in the path - Items []file + Items []fileInfo // The number of directories in the listing NumDirs int // The number of files (items that aren't directories) in the listing @@ -32,8 +32,8 @@ type Listing struct { httpserver.Context `json:"-"` } -// GetListing gets the information about a specific directory and its files. -func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { +// getListing gets the information about a specific directory and its files. +func getListing(u *User, filePath string, baseURL string) (*listing, error) { // Gets the directory information using the Virtual File System of // the user configuration. file, err := u.FileSystem.OpenFile(context.TODO(), filePath, os.O_RDONLY, 0) @@ -49,7 +49,7 @@ func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { } var ( - fileinfos []*file + fileinfos []fileInfo dirCount, fileCount int ) @@ -71,7 +71,7 @@ func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { // Absolute URL url := url.URL{Path: baseURL + name} - i := &file{ + i := fileInfo{ Name: f.Name(), Size: f.Size(), ModTime: f.ModTime(), @@ -85,7 +85,7 @@ func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { fileinfos = append(fileinfos, i) } - return &Listing{ + return &listing{ Name: path.Base(filePath), Path: filePath, Items: fileinfos, @@ -95,7 +95,7 @@ func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { } // ApplySort applies the sort order using .Order and .Sort -func (l Listing) ApplySort() { +func (l listing) ApplySort() { // Check '.Order' to know how to sort if l.Order == "desc" { switch l.Sort { @@ -124,10 +124,10 @@ func (l Listing) ApplySort() { } } -// Implement sorting for Listing -type byName Listing -type bySize Listing -type byTime Listing +// Implement sorting for listing +type byName listing +type bySize listing +type byTime listing // By Name func (l byName) Len() int { diff --git a/page.go b/page.go index ba46b4f8..0e44acd6 100644 --- a/page.go +++ b/page.go @@ -11,6 +11,15 @@ import ( "strings" ) +// Create the functions map, then the template, check for erros and +// execute the template if there aren't errors +var functionMap = template.FuncMap{ + "Defined": defined, + "CSS": css, + "Marshal": marshal, + "EncodeBase64": encodeBase64, +} + // page contains the informations and functions needed to show the Page type page struct { Info *pageInfo @@ -23,7 +32,7 @@ type pageInfo struct { Path string IsDir bool User *User - Config *Config + Config *FileManager Data interface{} Editor bool Display string diff --git a/functions.go b/utils.go similarity index 67% rename from functions.go rename to utils.go index a85d3991..bb8592ce 100644 --- a/functions.go +++ b/utils.go @@ -5,18 +5,11 @@ import ( "encoding/json" "html/template" "log" + "net/http" + "os" "reflect" ) -// Create the functions map, then the template, check for erros and -// execute the template if there aren't errors -var functionMap = template.FuncMap{ - "Defined": defined, - "CSS": css, - "Marshal": marshal, - "EncodeBase64": encodeBase64, -} - // defined checks if variable is defined in a struct func defined(data interface{}, field string) bool { t := reflect.Indirect(reflect.ValueOf(data)).Type() @@ -45,3 +38,21 @@ func marshal(v interface{}) template.JS { func encodeBase64(s string) string { return base64.StdEncoding.EncodeToString([]byte(s)) } + +// errorToHTTPCode converts errors to HTTP Status Code. +func errorToHTTPCode(err error, gone bool) int { + switch { + case os.IsPermission(err): + return http.StatusForbidden + case os.IsNotExist(err): + if !gone { + return http.StatusNotFound + } + + return http.StatusGone + case os.IsExist(err): + return http.StatusGone + default: + return http.StatusInternalServerError + } +} diff --git a/functions_test.go b/utils_test.go similarity index 100% rename from functions_test.go rename to utils_test.go From 39da67641b912d6baf1a50b25860556f62670619 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 20 Jun 2017 11:35:16 +0100 Subject: [PATCH 09/40] prepare for complete rewrite Former-commit-id: f4f1444e244d78dda4453051842d068106ef1fb7 --- .editorconfig | 18 - .gitignore | 0 .gitmodules | 4 - LICENSE.md | 201 - _embed/public/ace | 1 - _embed/public/css/fonts.css | 137 - _embed/public/css/material/icons.woff2 | Bin 44300 -> 0 bytes _embed/public/css/normalize.css | 461 - _embed/public/css/old.css | 1207 --- .../css/roboto/medium-cyrillic-ext.woff2 | Bin 15292 -> 0 bytes .../public/css/roboto/medium-cyrillic.woff2 | Bin 10060 -> 0 bytes .../public/css/roboto/medium-greek-ext.woff2 | Bin 1412 -> 0 bytes _embed/public/css/roboto/medium-greek.woff2 | Bin 7176 -> 0 bytes .../public/css/roboto/medium-latin-ext.woff2 | Bin 11912 -> 0 bytes _embed/public/css/roboto/medium-latin.woff2 | Bin 14596 -> 0 bytes .../public/css/roboto/medium-vietnamese.woff2 | Bin 4780 -> 0 bytes .../css/roboto/normal-cyrillic-ext.woff2 | Bin 15832 -> 0 bytes .../public/css/roboto/normal-cyrillic.woff2 | Bin 9996 -> 0 bytes .../public/css/roboto/normal-greek-ext.woff2 | Bin 1432 -> 0 bytes _embed/public/css/roboto/normal-greek.woff2 | Bin 7208 -> 0 bytes .../public/css/roboto/normal-latin-ext.woff2 | Bin 12008 -> 0 bytes _embed/public/css/roboto/normal-latin.woff2 | Bin 14584 -> 0 bytes .../public/css/roboto/normal-vietnamese.woff2 | Bin 4896 -> 0 bytes _embed/public/css/styles.css | 1207 --- _embed/public/js/common.js | 685 -- _embed/public/js/editor.js | 278 - _embed/public/js/form2js.js | 1 - _embed/public/js/listing.js | 580 -- _embed/templates/base.tmpl | 289 - _embed/templates/editor.tmpl | 57 - _embed/templates/frontmatter.tmpl | 56 - _embed/templates/listing.tmpl | 103 - _embed/templates/minimal.tmpl | 1 - _embed/templates/single.tmpl | 23 - assets/assets.go | 33 - assets/binary.go | 7413 ----------------- cmd/filemanager/main.go | 21 - editor.go | 120 - file.go | 161 - filemanager.go | 116 - frontmatter/frontmatter.go | 275 - frontmatter/runes.go | 58 - frontmatter/runes_test.go | 131 - frontmatter/types.go | 13 - frontmatter/types_test.go | 49 - http.go | 168 - http_checksum.go | 50 - http_command.go | 135 - http_download.go | 95 - http_listing.go | 144 - http_put.go | 138 - http_search.go | 117 - http_single.go | 50 - listing.go | 184 - page.go | 219 - pre-build.sh | 7 - response_writer.go | 29 - utils.go | 58 - utils_test.go | 41 - 59 files changed, 15134 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .gitignore delete mode 100644 .gitmodules delete mode 100644 LICENSE.md delete mode 160000 _embed/public/ace delete mode 100644 _embed/public/css/fonts.css delete mode 100644 _embed/public/css/material/icons.woff2 delete mode 100644 _embed/public/css/normalize.css delete mode 100644 _embed/public/css/old.css delete mode 100644 _embed/public/css/roboto/medium-cyrillic-ext.woff2 delete mode 100644 _embed/public/css/roboto/medium-cyrillic.woff2 delete mode 100644 _embed/public/css/roboto/medium-greek-ext.woff2 delete mode 100644 _embed/public/css/roboto/medium-greek.woff2 delete mode 100644 _embed/public/css/roboto/medium-latin-ext.woff2 delete mode 100644 _embed/public/css/roboto/medium-latin.woff2 delete mode 100644 _embed/public/css/roboto/medium-vietnamese.woff2 delete mode 100644 _embed/public/css/roboto/normal-cyrillic-ext.woff2 delete mode 100644 _embed/public/css/roboto/normal-cyrillic.woff2 delete mode 100644 _embed/public/css/roboto/normal-greek-ext.woff2 delete mode 100644 _embed/public/css/roboto/normal-greek.woff2 delete mode 100644 _embed/public/css/roboto/normal-latin-ext.woff2 delete mode 100644 _embed/public/css/roboto/normal-latin.woff2 delete mode 100644 _embed/public/css/roboto/normal-vietnamese.woff2 delete mode 100644 _embed/public/css/styles.css delete mode 100644 _embed/public/js/common.js delete mode 100644 _embed/public/js/editor.js delete mode 100644 _embed/public/js/form2js.js delete mode 100644 _embed/public/js/listing.js delete mode 100644 _embed/templates/base.tmpl delete mode 100644 _embed/templates/editor.tmpl delete mode 100644 _embed/templates/frontmatter.tmpl delete mode 100644 _embed/templates/listing.tmpl delete mode 100644 _embed/templates/minimal.tmpl delete mode 100644 _embed/templates/single.tmpl delete mode 100644 assets/assets.go delete mode 100644 assets/binary.go delete mode 100644 cmd/filemanager/main.go delete mode 100644 editor.go delete mode 100644 file.go delete mode 100644 filemanager.go delete mode 100644 frontmatter/frontmatter.go delete mode 100644 frontmatter/runes.go delete mode 100644 frontmatter/runes_test.go delete mode 100644 frontmatter/types.go delete mode 100644 frontmatter/types_test.go delete mode 100644 http.go delete mode 100644 http_checksum.go delete mode 100644 http_command.go delete mode 100644 http_download.go delete mode 100644 http_listing.go delete mode 100644 http_put.go delete mode 100644 http_search.go delete mode 100644 http_single.go delete mode 100644 listing.go delete mode 100644 page.go delete mode 100644 pre-build.sh delete mode 100644 response_writer.go delete mode 100644 utils.go delete mode 100644 utils_test.go diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 63339e38..00000000 --- a/.editorconfig +++ /dev/null @@ -1,18 +0,0 @@ -# EditorConfig is awesome: http://EditorConfig.org - -# top-most EditorConfig file -root = true - -# Unix-style newlines with a newline ending every file -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true - -# 4 space indentation -[*.go] -indent_style = tab -indent_size = 4 diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 883b2160..00000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "_embed/public/ace"] - path = _embed/public/ace - url = https://github.com/ajaxorg/ace-builds - ignore = dirty diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 9c8f3ea0..00000000 --- a/LICENSE.md +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/_embed/public/ace b/_embed/public/ace deleted file mode 160000 index 784ffa86..00000000 --- a/_embed/public/ace +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 784ffa862c5351e0d300370f61471b1eb95ebcf1 diff --git a/_embed/public/css/fonts.css b/_embed/public/css/fonts.css deleted file mode 100644 index 1911d377..00000000 --- a/_embed/public/css/fonts.css +++ /dev/null @@ -1,137 +0,0 @@ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-cyrillic-ext.woff2) format('woff2'); - unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-cyrillic.woff2) format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-greek-ext.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-greek.woff2) format('woff2'); - unicode-range: U+0370-03FF; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-vietnamese.woff2) format('woff2'); - unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-latin-ext.woff2) format('woff2'); - unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-latin.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-cyrillic-ext.woff2) format('woff2'); - unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-cyrillic.woff2) format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-greek-ext.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-greek.woff2) format('woff2'); - unicode-range: U+0370-03FF; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-vietnamese.woff2) format('woff2'); - unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-latin-ext.woff2) format('woff2'); - unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-latin.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; -} - -@font-face { - font-family: 'Material Icons'; - font-style: normal; - font-weight: 400; - src: local('Material Icons'), local('MaterialIcons-Regular'), url(material/icons.woff2) format('woff2'); -} - -.prompt .file-list ul li:before, -.material-icons { - font-family: 'Material Icons'; - font-weight: normal; - font-style: normal; - font-size: 24px; - line-height: 1; - letter-spacing: normal; - text-transform: none; - display: inline-block; - white-space: nowrap; - word-wrap: normal; - direction: ltr; - -webkit-font-smoothing: antialiased; - text-rendering: optimizeLegibility; - -moz-osx-font-smoothing: grayscale; - font-feature-settings: 'liga'; -} diff --git a/_embed/public/css/material/icons.woff2 b/_embed/public/css/material/icons.woff2 deleted file mode 100644 index 9fa211252080046a23b2449dbdced6abc2b0bb34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 diff --git a/_embed/public/css/normalize.css b/_embed/public/css/normalize.css deleted file mode 100644 index 9b77e0eb..00000000 --- a/_embed/public/css/normalize.css +++ /dev/null @@ -1,461 +0,0 @@ -/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */ - -/** - * 1. Change the default font family in all browsers (opinionated). - * 2. Correct the line height in all browsers. - * 3. Prevent adjustments of font size after orientation changes in - * IE on Windows Phone and in iOS. - */ - -/* Document - ========================================================================== */ - -html { - font-family: sans-serif; /* 1 */ - line-height: 1.15; /* 2 */ - -ms-text-size-adjust: 100%; /* 3 */ - -webkit-text-size-adjust: 100%; /* 3 */ -} - -/* Sections - ========================================================================== */ - -/** - * Remove the margin in all browsers (opinionated). - */ - -body { - margin: 0; -} - -/** - * Add the correct display in IE 9-. - */ - -article, -aside, -footer, -header, -nav, -section { - display: block; -} - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/* Grouping content - ========================================================================== */ - -/** - * Add the correct display in IE 9-. - * 1. Add the correct display in IE. - */ - -figcaption, -figure, -main { /* 1 */ - display: block; -} - -/** - * Add the correct margin in IE 8. - */ - -figure { - margin: 1em 40px; -} - -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ - -hr { - box-sizing: content-box; /* 1 */ - height: 0; /* 1 */ - overflow: visible; /* 2 */ -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -pre { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/* Text-level semantics - ========================================================================== */ - -/** - * 1. Remove the gray background on active links in IE 10. - * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. - */ - -a { - background-color: transparent; /* 1 */ - -webkit-text-decoration-skip: objects; /* 2 */ -} - -/** - * Remove the outline on focused links when they are also active or hovered - * in all browsers (opinionated). - */ - -a:active, -a:hover { - outline-width: 0; -} - -/** - * 1. Remove the bottom border in Firefox 39-. - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ - -abbr[title] { - border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - text-decoration: underline dotted; /* 2 */ -} - -/** - * Prevent the duplicate application of `bolder` by the next rule in Safari 6. - */ - -b, -strong { - font-weight: inherit; -} - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ - -b, -strong { - font-weight: bolder; -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -code, -kbd, -samp { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** - * Add the correct font style in Android 4.3-. - */ - -dfn { - font-style: italic; -} - -/** - * Add the correct background and color in IE 9-. - */ - -mark { - background-color: #ff0; - color: #000; -} - -/** - * Add the correct font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Add the correct display in IE 9-. - */ - -audio, -video { - display: inline-block; -} - -/** - * Add the correct display in iOS 4-7. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Remove the border on images inside links in IE 10-. - */ - -img { - border-style: none; -} - -/** - * Hide the overflow in IE. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* Forms - ========================================================================== */ - -/** - * 1. Change the font styles in all browsers (opinionated). - * 2. Remove the margin in Firefox and Safari. - */ - -button, -input, -optgroup, -select, -textarea { - font-family: sans-serif; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - -button, -input { /* 1 */ - overflow: visible; -} - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ - -button, -select { /* 1 */ - text-transform: none; -} - -/** - * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` - * controls in Android 4. - * 2. Correct the inability to style clickable types in iOS and Safari. - */ - -button, -html [type="button"], /* 1 */ -[type="reset"], -[type="submit"] { - -webkit-appearance: button; /* 2 */ -} - -/** - * Remove the inner border and padding in Firefox. - */ - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** - * Restore the focus styles unset by the previous rule. - */ - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** - * Change the border, margin, and padding in all browsers (opinionated). - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ - -legend { - box-sizing: border-box; /* 1 */ - color: inherit; /* 2 */ - display: table; /* 1 */ - max-width: 100%; /* 1 */ - padding: 0; /* 3 */ - white-space: normal; /* 1 */ -} - -/** - * 1. Add the correct display in IE 9-. - * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ - -progress { - display: inline-block; /* 1 */ - vertical-align: baseline; /* 2 */ -} - -/** - * Remove the default vertical scrollbar in IE. - */ - -textarea { - overflow: auto; -} - -/** - * 1. Add the correct box sizing in IE 10-. - * 2. Remove the padding in IE 10-. - */ - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ - -[type="search"] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** - * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. - */ - -[type="search"]::-webkit-search-cancel-button, -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} - -/* Interactive - ========================================================================== */ - -/* - * Add the correct display in IE 9-. - * 1. Add the correct display in Edge, IE, and Firefox. - */ - -details, /* 1 */ -menu { - display: block; -} - -/* - * Add the correct display in all browsers. - */ - -summary { - display: list-item; -} - -/* Scripting - ========================================================================== */ - -/** - * Add the correct display in IE 9-. - */ - -canvas { - display: inline-block; -} - -/** - * Add the correct display in IE. - */ - -template { - display: none; -} - -/* Hidden - ========================================================================== */ - -/** - * Add the correct display in IE 10-. - */ - -[hidden] { - display: none; -} diff --git a/_embed/public/css/old.css b/_embed/public/css/old.css deleted file mode 100644 index eb9d8a5b..00000000 --- a/_embed/public/css/old.css +++ /dev/null @@ -1,1207 +0,0 @@ -body { - font-family: 'Roboto', sans-serif; - padding-top: 7.8em; - background-color: #f8f8f8; -} - -* { - box-sizing: border-box; -} - -*, -*:hover, -*:active, -*:focus { - outline: 0 -} - -a { - text-decoration: none; -} - -img { - max-width: 100%; -} - -audio, -video { - width: 100%; -} - -pre { - padding: 1em; - border: 1px solid #e6e6e6; - border-radius: 0.5em; - background-color: #f5f5f5; - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; -} - -button { - border: 0; - padding: .5em 1em; - margin-left: .5em; - border-radius: .1em; - cursor: pointer; - background: #2196f3; - color: #fff; - border: 1px solid rgba(0, 0, 0, 0.05); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.05); - transition: .1s ease all; -} - -button:hover { - background-color: #1E88E5; -} - -.mobile-only { - display: none !important; -} - -.container { - width: 95%; - max-width: 960px; - margin: 1em auto 0; -} - -i.spin { - animation: 1s spin linear infinite; -} - -.pdf { - width: 100%; - height: calc(100vh - 13em); -} - - -/* * * * * * * * * * * * * * * * - * EDITOR * - * * * * * * * * * * * * * * * */ - -#editor .source { - display: none; -} - -#editor .content { - background: #fff; - padding: 1em 0; -} - -#editor #ace, -#editor h2, -#editor .frontmatter { - width: 95%; - max-width: 960px; - margin: 1em auto 0; -} - -#editor h2 { - margin: 1.5em auto 1em; - color: rgba(0, 0, 0, 0.3); - font-weight: 500; -} - -#editor .ace_gutter { - background-color: #fff; -} - - -/* * * * * * * * * * * * * * * * - * EDITOR - MARKDOWN * - * * * * * * * * * * * * * * * */ - -.frontmatter { - column-count: 3; - column-gap: 1em; - column-fill: balance; - /* display: flex; */ - /* flex-wrap: wrap; */ - /* justify-content: space-between; */ - /* flex-grow: 1; */ -} - -.frontmatter label { - display: block; - width: calc(100% - 1em); - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} - -.frontmatter label, -.frontmatter h3 { - font-weight: 500; - margin: 0 0; - color: rgba(0, 0, 0, 0.6); -} - -.frontmatter input, -.frontmatter textarea { - display: block; - width: 100%; - border: 0; - margin-top: .5em; - padding: 0; - line-height: 1; -} - -.frontmatter .block, -.frontmatter fieldset[data-type="array"], -.button { - position: relative; - background: #fff; - border-radius: .2em; - border: 1px solid rgba(0, 0, 0, 0.075); - padding: .5em; - break-inside: avoid; - margin: 0 0 1em; - width: 100%; - display: inline-block; -} - -.frontmatter fieldset[data-type="object"] { - position: relative; - margin: 0; -} - -.frontmatter .button { - background-color: #2196f3; - color: #fff; - cursor: pointer; - text-align: center; -} - -[data-type="array-item"] { - position: relative; -} - -[data-type="array-item"] .action { - top: 0; - right: 0; -} - -.frontmatter textarea { - resize: none; -} - -[data-type="array-item"] input { - width: calc(100% - 1em); -} - -.block .action, -fieldset .action { - position: absolute; - top: .5em; - right: .5em; -} - -.block>.action, -fieldset>.action { - opacity: 0; -} - -.block:hover>.action, -fieldset:hover>.action { - opacity: 1; -} - -.block .action.add, -fieldset .action.add { - right: 1.5em; -} - -.frontmatter .action i { - padding: 0; - font-size: 1em; -} - -fieldset { - border: 0; - padding: 0; -} - -.frontmatter>fieldset h3, -.frontmatter>.group h3 { - font-size: 1.5em; - margin-bottom: .5em; -} - -fieldset h3, -.group h3 { - font-size: 0.9em; -} - - -/* * * * * * * * * * * * * * * * - * ACTION * - * * * * * * * * * * * * * * * */ - -.action { - display: inline-block; - cursor: pointer; - -webkit-transition: 0.2s ease all; - transition: 0.2s ease all; - border: 0; - margin: 0; - color: #546E7A; - border-radius: 50%; -} - -.action.disabled { - opacity: 0.2; - cursor: not-allowed; -} - -.action i { - padding: 0.4em; - -webkit-transition: 0.2s ease-in-out all; - transition: 0.2s ease-in-out all; - border-radius: 50%; -} - -.action:hover i { - background-color: rgba(0, 0, 0, .1); -} - -.action ul { - position: absolute; - top: 0; - color: #7d7d7d; - list-style: none; - margin: 0; - padding: 0; - flex-direction: column; - display: flex; -} - -.action ul li { - line-height: 1; - padding: .7em; - transition: .1s ease background-color; -} - -.action ul li:hover { - background-color: rgba(0, 0, 0, 0.04); -} - - -/* * * * * * * * * * * * * * * * - * NEW FILE/DIR * - * * * * * * * * * * * * * * * */ - -.floating { - position: fixed; - bottom: 1em; - right: 1em; -} - -.floating .action { - background-color: #2196f3 !important; - color: #fff; - box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); -} - -#newdir { - position: fixed; - bottom: 1.3em; - right: 5em; - transition: .2s ease all; - opacity: 0; - border: 0; - box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24); - padding: .5em; - width: 22em; - border-radius: .2em; -} - -#newdir.enabled { - opacity: 1; -} - - -/* * * * * * * * * * * * * * * * - * HEADER * - * * * * * * * * * * * * * * * */ - -header { - z-index: 1000; - background-color: #fff; - border-bottom: 1px solid rgba(0, 0, 0, 0.075); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - position: fixed; - top: 0; - left: 0; - width: 100%; - padding: 0; -} - -header a, -header a:hover { - color: inherit; -} - -header p i { - font-size: 1em !important; - color: rgba(255, 255, 255, .31); -} - -header>div { - display: flex; - width: 100%; - padding: 0.5em 0.5em 0.5em 1em; - align-items: center; -} - -header p { - display: inline-block; - margin: 0; - vertical-align: middle; -} - -header p a, -header p a:hover { - color: inherit; -} - -header .action span { - display: none; -} - -header>div div { - vertical-align: middle; - position: relative; -} - -#logout { - border-radius: 0; - margin-left: auto; - padding: .15em; -} - -#click-overlay { - display: none; - position: fixed; - cursor: pointer; - top: 0; - left: 0; - height: 100%; - width: 100%; -} - -#click-overlay.active { - display: block; -} - - -/* * * * * * * * * * * * * * * * - * TOP BAR * - * * * * * * * * * * * * * * * */ - -#top-bar { - height: 4em; -} - -#top-bar>div:nth-child(1) { - margin-right: 1em; - font-weight: 500; - font-size: 1.5em; - line-height: 2; -} - - -/* * * * * * * * * * * * * * * * - * SEARCH BAR * - * * * * * * * * * * * * * * * */ - -#search { - position: relative; - display: flex; - height: 100%; - padding: 0.75em; - vertical-align: middle; - border-radius: 0.3em; - background-color: #f5f5f5; - transition: .1s ease all; - width: 100%; - max-width: 25em; -} - -#search.active { - background-color: #fff; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); -} - -#search.active i, -#search.active input { - color: #212121; -} - -#search i, -#search input { - vertical-align: middle; -} - -#search i { - margin-right: 0.3em; - user-select: none; -} - -#search input { - width: 100%; - border: 0; - outline: 0; - background-color: transparent; -} - -#search.active div { - visibility: visible; - opacity: 1; - top: 100%; -} - -#search ul { - padding: 0; - margin: 0; - list-style: none; -} - -#search li { - margin-bottom: .5em; -} - -#search>div { - position: absolute; - top: 0; - width: 100%; - left: 0; - z-index: 999999; - background-color: #fff; - text-align: left; - color: #ccc; - box-shadow: 0 2px 3px rgba(0, 0, 0, .06), 0 2px 2px rgba(0, 0, 0, .12); - padding: .5em; - border-bottom-left-radius: .3em; - border-bottom-right-radius: .3em; - transition: .1s ease all; - visibility: hidden; - opacity: 0; - overflow-x: hidden; - overflow-y: auto; - max-height: 50vh; -} - -#search>div div { - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; -} - -#search>div p { - width: 100%; - text-align: center; - display: none; - margin: 0; - max-width: none; -} - -#search.ongoing p { - display: block; -} - -#search.active div i, -#sidebar #search.active div i { - color: #ccc; - text-align: center; - margin: 0 auto; - display: table; -} - -#search::-webkit-input-placeholder { - color: rgba(255, 255, 255, .5); -} - -#search:-moz-placeholder { - opacity: 1; - color: rgba(255, 255, 255, .5); -} - -#search::-moz-placeholder { - opacity: 1; - color: rgba(255, 255, 255, .5); -} - -#search:-ms-input-placeholder { - color: rgba(255, 255, 255, .5); -} - - -/* * * * * * * * * * * * * * * * - * BOTTOM BAR * - * * * * * * * * * * * * * * * */ - -#bottom-bar { - background-color: #fafafa; - border-top: 1px solid rgba(0, 0, 0, 0.075); - border-bottom: 1px solid rgba(0, 0, 0, 0.075); - height: 3.8em; -} - -#bottom-bar>div:first-child>* { - display: inline-block; - vertical-align: middle; -} - -#bottom-bar>div:first-child>i { - margin-right: .3em; -} - -#bottom-bar>*:first-child { - margin-right: auto; - max-width: calc(100% - 25em); - width: 100%; -} - -#bottom-bar p { - text-overflow: ellipsis; - overflow: hidden; - width: calc(100% - 3em); - white-space: nowrap; -} - -#more { - display: none; -} - -#file-only { - display: inline-block; - border-right: 1px solid rgba(0, 0, 0, 0.075); - padding-right: .3em; - margin-right: .3em; - transition: .2s ease opacity, visibility; - visibility: visible; -} - -#file-only.disabled { - opacity: 0; - visibility: hidden; -} - -#download ul.active { - top: 0; - right: 0; -} - -#more ul.active { - right: .5em; - top: 4.5em; -} - - -/* * * * * * * * * * * * * * * * - * DROPDOWN * - * * * * * * * * * * * * * * * */ - -.dropdown { - position: fixed; - top: -100%; - right: -100%; - visibility: hidden; - display: flex; - flex-direction: column; - border-radius: .1em; - border-top-left-radius: 0; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - background: #fff; - z-index: 9999999; -} - -.dropdown.active { - visibility: visible; -} - -.dropdown .action { - padding: .7em; -} - -.dropdown i { - padding: 0; - vertical-align: middle; -} - -.dropdown span { - display: inline-block; - margin-left: .5em; - font-size: .9em; -} - - -/* * * * * * * * * * * * * * * * - * BREADCRUMBS * - * * * * * * * * * * * * * * * */ - -#previous { - margin-left: -.5em; -} - -#breadcrumbs { - min-width: 7em; -} - -#breadcrumbs.active { - top: 0; - left: 0; - right: auto; -} - - -/* * * * * * * * * * * * * * * * - * LISTING * - * * * * * * * * * * * * * * * */ - -#listing { - max-width: calc(100% - 1.2em); - width: 100%; -} - -#listing h2 { - margin: 0 0 0 0.5em; - font-size: 1em; - color: rgba(0, 0, 0, 0.2); - font-weight: 500; -} - -#listing .item div:last-of-type * { - text-overflow: ellipsis; - overflow: hidden; -} - -#listing>div { - display: flex; - padding: 0; - flex-wrap: wrap; - justify-content: flex-start; - position: relative; -} - -#listing .item { - background-color: #fff; - position: relative; - display: flex; - flex-wrap: nowrap; - color: #6f6f6f; - transition: .1s ease all; - align-items: center; - cursor: pointer; -} - -#listing .item div:last-of-type { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -#listing .item p { - margin: 0; -} - -#listing .item .size, -#listing .item .modified { - font-size: 0.9em; -} - -#listing .item .name { - font-weight: bold; -} - -#listing .item i { - font-size: 4em; - margin-right: 0.1em; - vertical-align: bottom; -} - -#listing h2.message, -.message { - text-align: center; - font-size: 3em; - margin: 1em auto; - display: block !important; - width: 95%; - color: rgba(0, 0, 0, 0.2); - font-weight: 500; -} - -.message i { - font-size: inherit; - vertical-align: middle; -} - - -/* * * * * * * * * * * * * * * * - * LISTING - MOSAIC * - * * * * * * * * * * * * * * * */ - -#listing.mosaic { - margin-top: 1em; -} - -#listing.mosaic .item { - width: calc(33% - 1em); - margin: .5em; - padding: 0.5em; - border-radius: 0.2em; - box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); -} - -#listing.mosaic .item:hover { - box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24) !important; -} - -#listing.mosaic .header { - display: none; -} - -#listing.mosaic .item div:first-of-type { - width: 5em; -} - -#listing.mosaic .item div:last-of-type { - width: calc(100% - 5vw); -} - - -/* * * * * * * * * * * * * * * * - * LISTING - DETAIL * - * * * * * * * * * * * * * * * */ - -#listing.list { - flex-direction: column; - padding-top: 3.25em; - width: 100%; - max-width: 100%; - margin: 0; -} - -#listing.list .item { - width: 100%; - margin: 0; - border: 0; - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - padding: 1em; -} - -#listing.list h2 { - display: none; -} - -#listing .item[aria-selected=true] { - background: #2196f3 !important; - color: #fff !important; -} - -#listing.list .item div:first-of-type { - width: 3em; -} - -#listing.list .item div:first-of-type i { - font-size: 2em; -} - -#listing.list .item div:last-of-type { - width: calc(100% - 3em); - display: flex; - align-items: center; -} - -#listing.list .item .name { - width: 50%; -} - -#listing.list .item .size { - width: 25%; -} - -#listing .item.header { - display: none !important; - background-color: #ccc; -} - -#listing.list .header i { - font-size: 1.5em; - vertical-align: middle; - margin-left: .2em; -} - -#listing.list .item.header { - display: flex !important; - background: #fafafa; - position: fixed; - width: 100%; - top: 7.8em; - left: 0; - z-index: 999; - padding: .85em; -} - -#listing.list .item.header>div:first-child { - width: 0; -} - -#listing.list .item.header .name { - margin-right: 3em; -} - -#listing.list .header { - display: flex; - background: #fafafa; - position: fixed; - width: 100%; - top: 7.8em; - left: 0; - z-index: 999; -} - -#listing.list .header a { - color: inherit; -} - -#listing.list .item.header>div:first-child { - width: 0; -} - -#listing.list .name { - font-weight: normal; -} - -#listing.list .item.header .name { - margin-right: 3em; -} - -#listing.list .header span { - vertical-align: middle; -} - -#listing.list .header i { - opacity: 0; - transition: .1s ease all; -} - -#listing.list .header p:hover i, -#listing.list .header .active i { - opacity: 1; -} - -#listing.list .item.header .active { - font-weight: bold; -} - - -/* * * * * * * * * * * * * * * * - * MULTIPLE SELECTION DIALOG * - * * * * * * * * * * * * * * * */ - -#multiple-selection { - position: fixed; - bottom: -4em; - left: 0; - z-index: 99999999; - width: 100%; - background-color: #2196f3; - height: 4em; - display: flex !important; - padding: 0.5em 0.5em 0.5em 1em; - justify-content: space-between; - align-items: center; - transition: .2s ease all; -} - -#multiple-selection.active { - bottom: 0; -} - -#multiple-selection * { - margin: 0; -} - -#multiple-selection p, -#multiple-selection i { - color: #fff; -} - - -/* * * * * * * * * * * * * * * * - * PROMPT * - * * * * * * * * * * * * * * * */ - -.overlay, -.prompt, -.help { - opacity: 0; - z-index: -1; - transition: .1s ease opacity, z-index; -} - -.overlay.active, -.prompt.active, -.help.active { - z-index: 9999999; - opacity: 1; -} - -.overlay { - background-color: rgba(0, 0, 0, 0.5); - position: fixed; - top: 0; - left: 0; - height: 0; - width: 0; -} - -.overlay.active { - height: 100%; - width: 100%; -} - -.prompt, -.help { - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - z-index: 99999999; - background: #fff; - border: 1px solid rgba(0, 0, 0, 0.075); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - padding: 2em; - max-width: 25em; - width: 90%; - max-height: 95%; -} - -.prompt h3, -.help h3 { - margin: 0; - font-weight: 500; - font-size: 1.5em; -} - -.prompt p, -.help p { - font-size: .9em; - color: rgba(0, 0, 0, 0.8); - margin: .5em 0 1em; -} - -.prompt input { - width: 100%; - border: 1px solid #dadada; - line-height: 1; - padding: .3em; -} - -.prompt code { - word-wrap: break-word; -} - -.prompt div, -.help div { - margin-top: 1em; - display: flex; - justify-content: flex-start; - flex-direction: row-reverse; -} - -.prompt .cancel { - background-color: #ECEFF1; - color: #37474F; -} - -.prompt .cancel:hover { - background-color: #e9eaeb; -} - - -/* * * * * * * * * * * * * * * * - * PROMPT - MOVE * - * * * * * * * * * * * * * * * */ - -.prompt .file-list { - flex-direction: initial; - max-height: 50vh; - overflow: auto; -} - -.prompt .file-list ul { - list-style: none; - margin: 0; - padding: 0; - width: 100%; -} - -.prompt .file-list ul li { - width: 100%; - user-select: none; -} - -.prompt .file-list ul li[aria-selected=true] { - background: #2196f3 !important; - color: #fff !important; - transition: .1s ease all; -} - -.prompt .file-list ul li:hover { - background-color: #e9eaeb; - cursor: pointer; -} - -.prompt .file-list ul li:before { - content: "folder"; - color: #6f6f6f; - vertical-align: middle; - padding: 0 .25em; - line-height: 2em; -} - -.prompt .file-list ul li[aria-selected=true]:before { - color: white; -} - - -/* * * * * * * * * * * * * * * * - * HELP * - * * * * * * * * * * * * * * * */ - -.help { - max-width: 24em; - visibility: hidden; - top: -100%; - left: -100%; -} - -.help.active { - visibility: visible; - top: 50%; - left: 50%; -} - -.help ul { - padding: 0; - margin: 1em 0; - list-style: none; -} - - -/* * * * * * * * * * * * * * * * - * FOOTER * - * * * * * * * * * * * * * * * */ - -footer { - font-size: 0.6em; - margin: 2em 0 2em; - text-align: center; - color: grey; -} - -footer a, -footer a:hover { - color: inherit; -} - - -/* * * * * * * * * * * * * * * * - * MEDIA QUERIES * - * * * * * * * * * * * * * * * */ - -@media screen and (max-width: 850px) { - .frontmatter { - column-count: 2; - } -} - -@media screen and (max-width: 650px) { - body { - transition: .2s ease padding; - } - .mobile-only { - display: inherit !important; - } - #top-bar>div:nth-child(1) { - display: none; - } - #bottom-bar>*:first-child { - max-width: calc(100% - 16em) !important; - } - #main-actions { - position: fixed; - top: -100%; - right: -100%; - visibility: hidden; - display: flex; - flex-direction: column; - border-radius: .1em; - border-top-left-radius: 0; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - background: #fff; - z-index: 9999999; - } - #main-actions.active { - right: .5em; - top: 4.5em; - visibility: visible; - } - #main-actions .action { - padding: .7em; - border-radius: 0; - align-items: center; - } - #main-actions .action:hover { - background-color: rgba(0, 0, 0, 0.04); - } - #main-actions i { - padding: 0; - vertical-align: middle; - } - #main-actions .action:hover i { - padding: 0; - background-color: transparent; - } - #main-actions span { - display: inline-block; - margin-left: .5em; - font-size: .9em; - } - #listing.list .item .size, - #listing.list .item .modified { - display: none; - } - #listing.list .item .name { - width: 100%; - } - .frontmatter { - column-count: 1; - } -} - -@media screen and (max-width: 450px) { - #bottom-bar p { - display: none !important; - } -} - - -/* * * * * * * * * * * * * * * * - * ANIMATIONS * - * * * * * * * * * * * * * * * */ - -@keyframes spin { - 100% { - -webkit-transform: rotate(-360deg); - transform: rotate(-360deg); - } -} diff --git a/_embed/public/css/roboto/medium-cyrillic-ext.woff2 b/_embed/public/css/roboto/medium-cyrillic-ext.woff2 deleted file mode 100644 index f63bc9a1934f40bbbc109e7697aacb18ebb2f284..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15292 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 diff --git a/_embed/public/css/roboto/medium-cyrillic.woff2 b/_embed/public/css/roboto/medium-cyrillic.woff2 deleted file mode 100644 index b3ca824db64d0186f7e52b1f7464413a638f9f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10060 zcmV-SC$rdhPew8T0RR9104GcU5dZ)H09up)04D1I0ssI200000000000000000000 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 mb=gU~>F$4Gvd<#C<9HE{ARVQ^Cs&+nPJhBM@ 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 diff --git a/_embed/public/css/roboto/medium-greek-ext.woff2 b/_embed/public/css/roboto/medium-greek-ext.woff2 deleted file mode 100644 index 7e1a807819496f6e3e52ce083544104841602e05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1412 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 K>W@?d0002eJ=}u; diff --git a/_embed/public/css/roboto/medium-latin-ext.woff2 b/_embed/public/css/roboto/medium-latin-ext.woff2 deleted file mode 100644 index 604b89354421a545b529e76acaacb9c7f5d50988..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11912 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 OA2`Fug|G}F3IG6(|K7_0 diff --git a/_embed/public/css/roboto/medium-latin.woff2 b/_embed/public/css/roboto/medium-latin.woff2 deleted file mode 100644 index 5f96609d81a812b8f2557a4e9bba6db29205ae0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14596 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 diff --git a/_embed/public/css/roboto/medium-vietnamese.woff2 b/_embed/public/css/roboto/medium-vietnamese.woff2 deleted file mode 100644 index d92b712507a5d24f7910ccd4c2394570d4f405b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4780 zcmV;d5>xGWPew8T0RR9101~VK5dZ)H04pE>01`_80ssI200000000000000000000 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 ilgW1vW5`h!}HUcCAgd7Wk5C8-q1%eOcS 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 WCa?E`${Nr6J&WjV<7!di4FCYRVoq}a diff --git a/_embed/public/css/roboto/normal-greek-ext.woff2 b/_embed/public/css/roboto/normal-greek-ext.woff2 deleted file mode 100644 index ed0b13ca09d1372918d42c2a7e3f944b762d80dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1432 zcmV;J1!wwqPew8T0RR9100o!;5&!@I010pa00le%0ssI200000000000000000000 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�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 diff --git a/_embed/public/css/roboto/normal-latin-ext.woff2 b/_embed/public/css/roboto/normal-latin-ext.woff2 deleted file mode 100644 index 0c7aec28f513926a7e749abc12863001e2f1b65c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12008 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 GC;$N0_xDr) diff --git a/_embed/public/css/roboto/normal-latin.woff2 b/_embed/public/css/roboto/normal-latin.woff2 deleted file mode 100644 index 120796bb71997275eafef44818771a32bd857e12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14584 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 diff --git a/_embed/public/css/roboto/normal-vietnamese.woff2 b/_embed/public/css/roboto/normal-vietnamese.woff2 deleted file mode 100644 index 7936b665b54003fab3aafced6d6ae16c751d3736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4896 zcmV+*6W{E2Pew8T0RR91023ep5&!@I04{U@0206e0ssI200000000000000000000 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 Stqovy*8;1vBH2AlK^6c6HeG@M diff --git a/_embed/public/css/styles.css b/_embed/public/css/styles.css deleted file mode 100644 index eb9d8a5b..00000000 --- a/_embed/public/css/styles.css +++ /dev/null @@ -1,1207 +0,0 @@ -body { - font-family: 'Roboto', sans-serif; - padding-top: 7.8em; - background-color: #f8f8f8; -} - -* { - box-sizing: border-box; -} - -*, -*:hover, -*:active, -*:focus { - outline: 0 -} - -a { - text-decoration: none; -} - -img { - max-width: 100%; -} - -audio, -video { - width: 100%; -} - -pre { - padding: 1em; - border: 1px solid #e6e6e6; - border-radius: 0.5em; - background-color: #f5f5f5; - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; -} - -button { - border: 0; - padding: .5em 1em; - margin-left: .5em; - border-radius: .1em; - cursor: pointer; - background: #2196f3; - color: #fff; - border: 1px solid rgba(0, 0, 0, 0.05); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.05); - transition: .1s ease all; -} - -button:hover { - background-color: #1E88E5; -} - -.mobile-only { - display: none !important; -} - -.container { - width: 95%; - max-width: 960px; - margin: 1em auto 0; -} - -i.spin { - animation: 1s spin linear infinite; -} - -.pdf { - width: 100%; - height: calc(100vh - 13em); -} - - -/* * * * * * * * * * * * * * * * - * EDITOR * - * * * * * * * * * * * * * * * */ - -#editor .source { - display: none; -} - -#editor .content { - background: #fff; - padding: 1em 0; -} - -#editor #ace, -#editor h2, -#editor .frontmatter { - width: 95%; - max-width: 960px; - margin: 1em auto 0; -} - -#editor h2 { - margin: 1.5em auto 1em; - color: rgba(0, 0, 0, 0.3); - font-weight: 500; -} - -#editor .ace_gutter { - background-color: #fff; -} - - -/* * * * * * * * * * * * * * * * - * EDITOR - MARKDOWN * - * * * * * * * * * * * * * * * */ - -.frontmatter { - column-count: 3; - column-gap: 1em; - column-fill: balance; - /* display: flex; */ - /* flex-wrap: wrap; */ - /* justify-content: space-between; */ - /* flex-grow: 1; */ -} - -.frontmatter label { - display: block; - width: calc(100% - 1em); - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} - -.frontmatter label, -.frontmatter h3 { - font-weight: 500; - margin: 0 0; - color: rgba(0, 0, 0, 0.6); -} - -.frontmatter input, -.frontmatter textarea { - display: block; - width: 100%; - border: 0; - margin-top: .5em; - padding: 0; - line-height: 1; -} - -.frontmatter .block, -.frontmatter fieldset[data-type="array"], -.button { - position: relative; - background: #fff; - border-radius: .2em; - border: 1px solid rgba(0, 0, 0, 0.075); - padding: .5em; - break-inside: avoid; - margin: 0 0 1em; - width: 100%; - display: inline-block; -} - -.frontmatter fieldset[data-type="object"] { - position: relative; - margin: 0; -} - -.frontmatter .button { - background-color: #2196f3; - color: #fff; - cursor: pointer; - text-align: center; -} - -[data-type="array-item"] { - position: relative; -} - -[data-type="array-item"] .action { - top: 0; - right: 0; -} - -.frontmatter textarea { - resize: none; -} - -[data-type="array-item"] input { - width: calc(100% - 1em); -} - -.block .action, -fieldset .action { - position: absolute; - top: .5em; - right: .5em; -} - -.block>.action, -fieldset>.action { - opacity: 0; -} - -.block:hover>.action, -fieldset:hover>.action { - opacity: 1; -} - -.block .action.add, -fieldset .action.add { - right: 1.5em; -} - -.frontmatter .action i { - padding: 0; - font-size: 1em; -} - -fieldset { - border: 0; - padding: 0; -} - -.frontmatter>fieldset h3, -.frontmatter>.group h3 { - font-size: 1.5em; - margin-bottom: .5em; -} - -fieldset h3, -.group h3 { - font-size: 0.9em; -} - - -/* * * * * * * * * * * * * * * * - * ACTION * - * * * * * * * * * * * * * * * */ - -.action { - display: inline-block; - cursor: pointer; - -webkit-transition: 0.2s ease all; - transition: 0.2s ease all; - border: 0; - margin: 0; - color: #546E7A; - border-radius: 50%; -} - -.action.disabled { - opacity: 0.2; - cursor: not-allowed; -} - -.action i { - padding: 0.4em; - -webkit-transition: 0.2s ease-in-out all; - transition: 0.2s ease-in-out all; - border-radius: 50%; -} - -.action:hover i { - background-color: rgba(0, 0, 0, .1); -} - -.action ul { - position: absolute; - top: 0; - color: #7d7d7d; - list-style: none; - margin: 0; - padding: 0; - flex-direction: column; - display: flex; -} - -.action ul li { - line-height: 1; - padding: .7em; - transition: .1s ease background-color; -} - -.action ul li:hover { - background-color: rgba(0, 0, 0, 0.04); -} - - -/* * * * * * * * * * * * * * * * - * NEW FILE/DIR * - * * * * * * * * * * * * * * * */ - -.floating { - position: fixed; - bottom: 1em; - right: 1em; -} - -.floating .action { - background-color: #2196f3 !important; - color: #fff; - box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); -} - -#newdir { - position: fixed; - bottom: 1.3em; - right: 5em; - transition: .2s ease all; - opacity: 0; - border: 0; - box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24); - padding: .5em; - width: 22em; - border-radius: .2em; -} - -#newdir.enabled { - opacity: 1; -} - - -/* * * * * * * * * * * * * * * * - * HEADER * - * * * * * * * * * * * * * * * */ - -header { - z-index: 1000; - background-color: #fff; - border-bottom: 1px solid rgba(0, 0, 0, 0.075); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - position: fixed; - top: 0; - left: 0; - width: 100%; - padding: 0; -} - -header a, -header a:hover { - color: inherit; -} - -header p i { - font-size: 1em !important; - color: rgba(255, 255, 255, .31); -} - -header>div { - display: flex; - width: 100%; - padding: 0.5em 0.5em 0.5em 1em; - align-items: center; -} - -header p { - display: inline-block; - margin: 0; - vertical-align: middle; -} - -header p a, -header p a:hover { - color: inherit; -} - -header .action span { - display: none; -} - -header>div div { - vertical-align: middle; - position: relative; -} - -#logout { - border-radius: 0; - margin-left: auto; - padding: .15em; -} - -#click-overlay { - display: none; - position: fixed; - cursor: pointer; - top: 0; - left: 0; - height: 100%; - width: 100%; -} - -#click-overlay.active { - display: block; -} - - -/* * * * * * * * * * * * * * * * - * TOP BAR * - * * * * * * * * * * * * * * * */ - -#top-bar { - height: 4em; -} - -#top-bar>div:nth-child(1) { - margin-right: 1em; - font-weight: 500; - font-size: 1.5em; - line-height: 2; -} - - -/* * * * * * * * * * * * * * * * - * SEARCH BAR * - * * * * * * * * * * * * * * * */ - -#search { - position: relative; - display: flex; - height: 100%; - padding: 0.75em; - vertical-align: middle; - border-radius: 0.3em; - background-color: #f5f5f5; - transition: .1s ease all; - width: 100%; - max-width: 25em; -} - -#search.active { - background-color: #fff; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); -} - -#search.active i, -#search.active input { - color: #212121; -} - -#search i, -#search input { - vertical-align: middle; -} - -#search i { - margin-right: 0.3em; - user-select: none; -} - -#search input { - width: 100%; - border: 0; - outline: 0; - background-color: transparent; -} - -#search.active div { - visibility: visible; - opacity: 1; - top: 100%; -} - -#search ul { - padding: 0; - margin: 0; - list-style: none; -} - -#search li { - margin-bottom: .5em; -} - -#search>div { - position: absolute; - top: 0; - width: 100%; - left: 0; - z-index: 999999; - background-color: #fff; - text-align: left; - color: #ccc; - box-shadow: 0 2px 3px rgba(0, 0, 0, .06), 0 2px 2px rgba(0, 0, 0, .12); - padding: .5em; - border-bottom-left-radius: .3em; - border-bottom-right-radius: .3em; - transition: .1s ease all; - visibility: hidden; - opacity: 0; - overflow-x: hidden; - overflow-y: auto; - max-height: 50vh; -} - -#search>div div { - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; -} - -#search>div p { - width: 100%; - text-align: center; - display: none; - margin: 0; - max-width: none; -} - -#search.ongoing p { - display: block; -} - -#search.active div i, -#sidebar #search.active div i { - color: #ccc; - text-align: center; - margin: 0 auto; - display: table; -} - -#search::-webkit-input-placeholder { - color: rgba(255, 255, 255, .5); -} - -#search:-moz-placeholder { - opacity: 1; - color: rgba(255, 255, 255, .5); -} - -#search::-moz-placeholder { - opacity: 1; - color: rgba(255, 255, 255, .5); -} - -#search:-ms-input-placeholder { - color: rgba(255, 255, 255, .5); -} - - -/* * * * * * * * * * * * * * * * - * BOTTOM BAR * - * * * * * * * * * * * * * * * */ - -#bottom-bar { - background-color: #fafafa; - border-top: 1px solid rgba(0, 0, 0, 0.075); - border-bottom: 1px solid rgba(0, 0, 0, 0.075); - height: 3.8em; -} - -#bottom-bar>div:first-child>* { - display: inline-block; - vertical-align: middle; -} - -#bottom-bar>div:first-child>i { - margin-right: .3em; -} - -#bottom-bar>*:first-child { - margin-right: auto; - max-width: calc(100% - 25em); - width: 100%; -} - -#bottom-bar p { - text-overflow: ellipsis; - overflow: hidden; - width: calc(100% - 3em); - white-space: nowrap; -} - -#more { - display: none; -} - -#file-only { - display: inline-block; - border-right: 1px solid rgba(0, 0, 0, 0.075); - padding-right: .3em; - margin-right: .3em; - transition: .2s ease opacity, visibility; - visibility: visible; -} - -#file-only.disabled { - opacity: 0; - visibility: hidden; -} - -#download ul.active { - top: 0; - right: 0; -} - -#more ul.active { - right: .5em; - top: 4.5em; -} - - -/* * * * * * * * * * * * * * * * - * DROPDOWN * - * * * * * * * * * * * * * * * */ - -.dropdown { - position: fixed; - top: -100%; - right: -100%; - visibility: hidden; - display: flex; - flex-direction: column; - border-radius: .1em; - border-top-left-radius: 0; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - background: #fff; - z-index: 9999999; -} - -.dropdown.active { - visibility: visible; -} - -.dropdown .action { - padding: .7em; -} - -.dropdown i { - padding: 0; - vertical-align: middle; -} - -.dropdown span { - display: inline-block; - margin-left: .5em; - font-size: .9em; -} - - -/* * * * * * * * * * * * * * * * - * BREADCRUMBS * - * * * * * * * * * * * * * * * */ - -#previous { - margin-left: -.5em; -} - -#breadcrumbs { - min-width: 7em; -} - -#breadcrumbs.active { - top: 0; - left: 0; - right: auto; -} - - -/* * * * * * * * * * * * * * * * - * LISTING * - * * * * * * * * * * * * * * * */ - -#listing { - max-width: calc(100% - 1.2em); - width: 100%; -} - -#listing h2 { - margin: 0 0 0 0.5em; - font-size: 1em; - color: rgba(0, 0, 0, 0.2); - font-weight: 500; -} - -#listing .item div:last-of-type * { - text-overflow: ellipsis; - overflow: hidden; -} - -#listing>div { - display: flex; - padding: 0; - flex-wrap: wrap; - justify-content: flex-start; - position: relative; -} - -#listing .item { - background-color: #fff; - position: relative; - display: flex; - flex-wrap: nowrap; - color: #6f6f6f; - transition: .1s ease all; - align-items: center; - cursor: pointer; -} - -#listing .item div:last-of-type { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -#listing .item p { - margin: 0; -} - -#listing .item .size, -#listing .item .modified { - font-size: 0.9em; -} - -#listing .item .name { - font-weight: bold; -} - -#listing .item i { - font-size: 4em; - margin-right: 0.1em; - vertical-align: bottom; -} - -#listing h2.message, -.message { - text-align: center; - font-size: 3em; - margin: 1em auto; - display: block !important; - width: 95%; - color: rgba(0, 0, 0, 0.2); - font-weight: 500; -} - -.message i { - font-size: inherit; - vertical-align: middle; -} - - -/* * * * * * * * * * * * * * * * - * LISTING - MOSAIC * - * * * * * * * * * * * * * * * */ - -#listing.mosaic { - margin-top: 1em; -} - -#listing.mosaic .item { - width: calc(33% - 1em); - margin: .5em; - padding: 0.5em; - border-radius: 0.2em; - box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); -} - -#listing.mosaic .item:hover { - box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24) !important; -} - -#listing.mosaic .header { - display: none; -} - -#listing.mosaic .item div:first-of-type { - width: 5em; -} - -#listing.mosaic .item div:last-of-type { - width: calc(100% - 5vw); -} - - -/* * * * * * * * * * * * * * * * - * LISTING - DETAIL * - * * * * * * * * * * * * * * * */ - -#listing.list { - flex-direction: column; - padding-top: 3.25em; - width: 100%; - max-width: 100%; - margin: 0; -} - -#listing.list .item { - width: 100%; - margin: 0; - border: 0; - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - padding: 1em; -} - -#listing.list h2 { - display: none; -} - -#listing .item[aria-selected=true] { - background: #2196f3 !important; - color: #fff !important; -} - -#listing.list .item div:first-of-type { - width: 3em; -} - -#listing.list .item div:first-of-type i { - font-size: 2em; -} - -#listing.list .item div:last-of-type { - width: calc(100% - 3em); - display: flex; - align-items: center; -} - -#listing.list .item .name { - width: 50%; -} - -#listing.list .item .size { - width: 25%; -} - -#listing .item.header { - display: none !important; - background-color: #ccc; -} - -#listing.list .header i { - font-size: 1.5em; - vertical-align: middle; - margin-left: .2em; -} - -#listing.list .item.header { - display: flex !important; - background: #fafafa; - position: fixed; - width: 100%; - top: 7.8em; - left: 0; - z-index: 999; - padding: .85em; -} - -#listing.list .item.header>div:first-child { - width: 0; -} - -#listing.list .item.header .name { - margin-right: 3em; -} - -#listing.list .header { - display: flex; - background: #fafafa; - position: fixed; - width: 100%; - top: 7.8em; - left: 0; - z-index: 999; -} - -#listing.list .header a { - color: inherit; -} - -#listing.list .item.header>div:first-child { - width: 0; -} - -#listing.list .name { - font-weight: normal; -} - -#listing.list .item.header .name { - margin-right: 3em; -} - -#listing.list .header span { - vertical-align: middle; -} - -#listing.list .header i { - opacity: 0; - transition: .1s ease all; -} - -#listing.list .header p:hover i, -#listing.list .header .active i { - opacity: 1; -} - -#listing.list .item.header .active { - font-weight: bold; -} - - -/* * * * * * * * * * * * * * * * - * MULTIPLE SELECTION DIALOG * - * * * * * * * * * * * * * * * */ - -#multiple-selection { - position: fixed; - bottom: -4em; - left: 0; - z-index: 99999999; - width: 100%; - background-color: #2196f3; - height: 4em; - display: flex !important; - padding: 0.5em 0.5em 0.5em 1em; - justify-content: space-between; - align-items: center; - transition: .2s ease all; -} - -#multiple-selection.active { - bottom: 0; -} - -#multiple-selection * { - margin: 0; -} - -#multiple-selection p, -#multiple-selection i { - color: #fff; -} - - -/* * * * * * * * * * * * * * * * - * PROMPT * - * * * * * * * * * * * * * * * */ - -.overlay, -.prompt, -.help { - opacity: 0; - z-index: -1; - transition: .1s ease opacity, z-index; -} - -.overlay.active, -.prompt.active, -.help.active { - z-index: 9999999; - opacity: 1; -} - -.overlay { - background-color: rgba(0, 0, 0, 0.5); - position: fixed; - top: 0; - left: 0; - height: 0; - width: 0; -} - -.overlay.active { - height: 100%; - width: 100%; -} - -.prompt, -.help { - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - z-index: 99999999; - background: #fff; - border: 1px solid rgba(0, 0, 0, 0.075); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - padding: 2em; - max-width: 25em; - width: 90%; - max-height: 95%; -} - -.prompt h3, -.help h3 { - margin: 0; - font-weight: 500; - font-size: 1.5em; -} - -.prompt p, -.help p { - font-size: .9em; - color: rgba(0, 0, 0, 0.8); - margin: .5em 0 1em; -} - -.prompt input { - width: 100%; - border: 1px solid #dadada; - line-height: 1; - padding: .3em; -} - -.prompt code { - word-wrap: break-word; -} - -.prompt div, -.help div { - margin-top: 1em; - display: flex; - justify-content: flex-start; - flex-direction: row-reverse; -} - -.prompt .cancel { - background-color: #ECEFF1; - color: #37474F; -} - -.prompt .cancel:hover { - background-color: #e9eaeb; -} - - -/* * * * * * * * * * * * * * * * - * PROMPT - MOVE * - * * * * * * * * * * * * * * * */ - -.prompt .file-list { - flex-direction: initial; - max-height: 50vh; - overflow: auto; -} - -.prompt .file-list ul { - list-style: none; - margin: 0; - padding: 0; - width: 100%; -} - -.prompt .file-list ul li { - width: 100%; - user-select: none; -} - -.prompt .file-list ul li[aria-selected=true] { - background: #2196f3 !important; - color: #fff !important; - transition: .1s ease all; -} - -.prompt .file-list ul li:hover { - background-color: #e9eaeb; - cursor: pointer; -} - -.prompt .file-list ul li:before { - content: "folder"; - color: #6f6f6f; - vertical-align: middle; - padding: 0 .25em; - line-height: 2em; -} - -.prompt .file-list ul li[aria-selected=true]:before { - color: white; -} - - -/* * * * * * * * * * * * * * * * - * HELP * - * * * * * * * * * * * * * * * */ - -.help { - max-width: 24em; - visibility: hidden; - top: -100%; - left: -100%; -} - -.help.active { - visibility: visible; - top: 50%; - left: 50%; -} - -.help ul { - padding: 0; - margin: 1em 0; - list-style: none; -} - - -/* * * * * * * * * * * * * * * * - * FOOTER * - * * * * * * * * * * * * * * * */ - -footer { - font-size: 0.6em; - margin: 2em 0 2em; - text-align: center; - color: grey; -} - -footer a, -footer a:hover { - color: inherit; -} - - -/* * * * * * * * * * * * * * * * - * MEDIA QUERIES * - * * * * * * * * * * * * * * * */ - -@media screen and (max-width: 850px) { - .frontmatter { - column-count: 2; - } -} - -@media screen and (max-width: 650px) { - body { - transition: .2s ease padding; - } - .mobile-only { - display: inherit !important; - } - #top-bar>div:nth-child(1) { - display: none; - } - #bottom-bar>*:first-child { - max-width: calc(100% - 16em) !important; - } - #main-actions { - position: fixed; - top: -100%; - right: -100%; - visibility: hidden; - display: flex; - flex-direction: column; - border-radius: .1em; - border-top-left-radius: 0; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - background: #fff; - z-index: 9999999; - } - #main-actions.active { - right: .5em; - top: 4.5em; - visibility: visible; - } - #main-actions .action { - padding: .7em; - border-radius: 0; - align-items: center; - } - #main-actions .action:hover { - background-color: rgba(0, 0, 0, 0.04); - } - #main-actions i { - padding: 0; - vertical-align: middle; - } - #main-actions .action:hover i { - padding: 0; - background-color: transparent; - } - #main-actions span { - display: inline-block; - margin-left: .5em; - font-size: .9em; - } - #listing.list .item .size, - #listing.list .item .modified { - display: none; - } - #listing.list .item .name { - width: 100%; - } - .frontmatter { - column-count: 1; - } -} - -@media screen and (max-width: 450px) { - #bottom-bar p { - display: none !important; - } -} - - -/* * * * * * * * * * * * * * * * - * ANIMATIONS * - * * * * * * * * * * * * * * * */ - -@keyframes spin { - 100% { - -webkit-transform: rotate(-360deg); - transform: rotate(-360deg); - } -} diff --git a/_embed/public/js/common.js b/_embed/public/js/common.js deleted file mode 100644 index 76cae2a3..00000000 --- a/_embed/public/js/common.js +++ /dev/null @@ -1,685 +0,0 @@ -'use strict' - -var tempID = '_fm_internal_temporary_id' -var ssl = (window.location.protocol === 'https:') -var templates = {} -var selectedItems = [] -var overlay -var clickOverlay - -// Removes an element, if exists, from an array -Array.prototype.removeElement = function (element) { - var i = this.indexOf(element) - if (i !== -1) { - this.splice(i, 1) - } -} - -// Replaces an element inside an array by another -Array.prototype.replaceElement = function (oldElement, newElement) { - var i = this.indexOf(oldElement) - if (i !== -1) { - this[i] = newElement - } -} - -// Sends a costum event to itself -Document.prototype.sendCostumEvent = function (text) { - this.dispatchEvent(new window.CustomEvent(text)) -} - -// Gets the content of a cookie -Document.prototype.getCookie = function (name) { - var re = new RegExp('(?:(?:^|.*;\\s*)' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$') - return document.cookie.replace(re, '$1') -} - -// Remove the last directory of an url -var removeLastDirectoryPartOf = function (url) { - var arr = url.split('/') - if (arr.pop() === '') { - arr.pop() - } - return (arr.join('/')) -} - -function getCSSRule (rules) { - for (let i = 0; i < rules.length; i++) { - rules[i] = rules[i].toLowerCase() - } - - let result = null - let find = Array.prototype.find - - find.call(document.styleSheets, styleSheet => { - result = find.call(styleSheet.cssRules, cssRule => { - let found = false - - if (cssRule instanceof CSSStyleRule) { - for (let i = 0; i < rules.length; i++) { - if (cssRule.selectorText.toLowerCase() === rules[i]) { - found = true - } - } - } - - return found - }) - - return result != null - }) - - return result -} - -/* * * * * * * * * * * * * * * * - * * - * BUTTONS * - * * - * * * * * * * * * * * * * * * */ -var buttons = { - previousState: {} -} - -buttons.setLoading = function (name) { - if (typeof this[name] === 'undefined') return - let i = this[name].querySelector('i') - - this.previousState[name] = i.innerHTML - i.style.opacity = 0 - - setTimeout(function () { - i.classList.add('spin') - i.innerHTML = 'autorenew' - i.style.opacity = 1 - }, 200) -} - -// Changes an element to done animation -buttons.setDone = function (name, success = true) { - let i = this[name].querySelector('i') - - i.style.opacity = 0 - - let thirdStep = () => { - i.innerHTML = this.previousState[name] - i.style.opacity = null - - if (selectedItems.length === 0 && document.getElementById('listing')) { - document.sendCostumEvent('changed-selected') - } - } - - let secondStep = () => { - i.style.opacity = 0 - setTimeout(thirdStep, 200) - } - - let firstStep = () => { - i.classList.remove('spin') - i.innerHTML = success - ? 'done' - : 'close' - i.style.opacity = 1 - setTimeout(secondStep, 1000) - } - - setTimeout(firstStep, 200) - return false -} - -/* * * * * * * * * * * * * * * * - * * - * WEBDAV * - * * - * * * * * * * * * * * * * * * */ -var webdav = {} - -webdav.convertURL = function (url) { - return window.location.origin + url.replace(baseURL + '/', webdavURL + '/') -} - -webdav.move = function (oldLink, newLink) { - return new Promise((resolve, reject) => { - let request = new window.XMLHttpRequest() - let destination = newLink.replace(baseURL + '/', webdavURL + '/') - - destination = window.location.origin + destination.substring(prefixURL.length) - - request.open('MOVE', webdav.convertURL(oldLink), true) - request.setRequestHeader('Destination', destination) - request.onload = () => { - if (request.status === 201 || request.status === 204) { - resolve() - } else { - reject(request.statusText) - } - } - request.onerror = () => reject(request.statusText) - request.send() - }) -} - -webdav.put = function (link, body, headers = {}) { - return new Promise((resolve, reject) => { - let request = new window.XMLHttpRequest() - request.open('PUT', webdav.convertURL(link), true) - - for (let key in headers) { - request.setRequestHeader(key, headers[key]) - } - - request.onload = () => { - if (request.status == 201) { - resolve() - } else { - reject(request.statusText) - } - } - request.onerror = () => reject(request.statusText) - request.send(body) - }) -} - -webdav.propfind = function (link, body, headers = {}) { - return new Promise((resolve, reject) => { - let request = new window.XMLHttpRequest() - request.open('PROPFIND', webdav.convertURL(link), true) - - for (let key in headers) { - request.setRequestHeader(key, headers[key]) - } - - request.onload = () => { - if (request.status < 300) { - resolve(request.responseText) - } else { - reject(request.statusText) - } - } - request.onerror = () => reject(request.statusText) - request.send(body) - }) -} - -webdav.delete = function (link) { - return new Promise((resolve, reject) => { - let request = new window.XMLHttpRequest() - request.open('DELETE', webdav.convertURL(link), true) - request.onload = () => { - if (request.status === 204) { - resolve() - } else { - reject(request.statusText) - } - } - request.onerror = () => reject(request.statusText) - request.send() - }) -} - -webdav.new = function (link) { - return new Promise((resolve, reject) => { - let request = new window.XMLHttpRequest() - request.open((link.endsWith('/') ? 'MKCOL' : 'PUT'), webdav.convertURL(link), true) - request.onload = () => { - if (request.status === 201) { - resolve() - } else { - reject(request.statusText) - } - } - request.onerror = () => reject(request.statusText) - request.send() - }) -} - -/* * * * * * * * * * * * * * * * - * * - * EVENTS * - * * - * * * * * * * * * * * * * * * */ -function closePrompt (event) { - let prompt = document.querySelector('.prompt') - - if (!prompt) return - - if (typeof event !== 'undefined') { - event.preventDefault() - } - - document.querySelector('.overlay').classList.remove('active') - prompt.classList.remove('active') - - setTimeout(() => { - prompt.remove() - }, 100) -} - -function notImplemented (event) { - event.preventDefault() - clickOverlay.click() - - let clone = document.importNode(templates.message.content, true) - clone.querySelector('h3').innerHTML = 'Not implemented' - clone.querySelector('p').innerHTML = "Sorry, but this feature wasn't implemented yet." - - document.querySelector('body').appendChild(clone) - document.querySelector('.overlay').classList.add('active') - document.querySelector('.prompt').classList.add('active') -} - -// Prevent Default event -var preventDefault = function (event) { - event.preventDefault() -} - -function logoutEvent (event) { - let request = new window.XMLHttpRequest() - request.open('GET', window.location.pathname, true, 'username', 'password') - request.send() - request.onreadystatechange = function () { - if (request.readyState === 4) { - window.location = '/' - } - } -} - -function openEvent (event) { - if (event.currentTarget.classList.contains('disabled')) { - return false - } - - let link = '?raw=true' - - if (selectedItems.length) { - link = document.getElementById(selectedItems[0]).dataset.url + link - } else { - link = window.location.pathname + link - } - - window.open(link) - return false -} - -function getHash (event, hash) { - event.preventDefault() - - let request = new window.XMLHttpRequest() - let link - - if (selectedItems.length) { - link = document.getElementById(selectedItems[0]).dataset.url - } else { - link = window.location.pathname - } - - request.open('GET', `${link}?checksum=${hash}`, true) - - request.onload = () => { - if (request.status >= 300) { - console.log(request.statusText) - return - } - event.target.parentElement.innerHTML = request.responseText - } - request.onerror = (e) => console.log(e) - request.send() -} - -function infoEvent (event) { - event.preventDefault() - if (event.currentTarget.classList.contains('disabled')) { - return - } - - let dir = false - let link - - if (selectedItems.length) { - link = document.getElementById(selectedItems[0]).dataset.url - dir = document.getElementById(selectedItems[0]).dataset.dir - } else { - if (document.getElementById('listing') !== null) { - dir = true - } - - link = window.location.pathname - } - - buttons.setLoading('info', false) - - webdav.propfind(link) - .then((text) => { - let parser = new window.DOMParser() - let xml = parser.parseFromString(text, 'text/xml') - let clone = document.importNode(templates.info.content, true) - - let value = xml.getElementsByTagName('displayname') - if (value.length > 0) { - clone.getElementById('display_name').innerHTML = value[0].innerHTML - } else { - clone.getElementById('display_name').innerHTML = xml.getElementsByTagName('D:displayname')[0].innerHTML - } - - value = xml.getElementsByTagName('getcontentlength') - if (value.length > 0) { - clone.getElementById('content_length').innerHTML = value[0].innerHTML - } else { - clone.getElementById('content_length').innerHTML = xml.getElementsByTagName('D:getcontentlength')[0].innerHTML - } - - value = xml.getElementsByTagName('getlastmodified') - if (value.length > 0) { - clone.getElementById('last_modified').innerHTML = value[0].innerHTML - } else { - clone.getElementById('last_modified').innerHTML = xml.getElementsByTagName('D:getlastmodified')[0].innerHTML - } - - if (dir === true || dir === 'true') { - clone.querySelector('.file-only').style.display = 'none' - } - - document.querySelector('body').appendChild(clone) - document.querySelector('.overlay').classList.add('active') - document.querySelector('.prompt').classList.add('active') - buttons.setDone('info', true) - }) - .catch(e => { - buttons.setDone('info', false) - console.log(e) - }) -} - -function deleteOnSingleFile () { - closePrompt() - buttons.setLoading('delete') - - webdav.delete(window.location.pathname) - .then(() => { - window.location.pathname = removeLastDirectoryPartOf(window.location.pathname) - }) - .catch(e => { - buttons.setDone('delete', false) - console.log(e) - }) -} - -function deleteOnListing () { - closePrompt() - buttons.setLoading('delete') - - let promises = [] - - for (let id of selectedItems) { - promises.push(webdav.delete(document.getElementById(id).dataset.url)) - } - - Promise.all(promises) - .then(() => { - listing.reload() - buttons.setDone('delete') - }) - .catch(e => { - console.log(e) - buttons.setDone('delete', false) - }) -} - -// Handles the delete button event -function deleteEvent (event) { - let single = false - - if (!selectedItems.length) { - selectedItems = ['placeholder'] - single = true - } - - let clone = document.importNode(templates.question.content, true) - clone.querySelector('h3').innerHTML = 'Delete files' - - if (single) { - clone.querySelector('form').addEventListener('submit', deleteOnSingleFile) - clone.querySelector('p').innerHTML = `Are you sure you want to delete this file/folder?` - } else { - clone.querySelector('form').addEventListener('submit', deleteOnListing) - clone.querySelector('p').innerHTML = `Are you sure you want to delete ${selectedItems.length} file(s)?` - } - - clone.querySelector('input').remove() - clone.querySelector('.ok').innerHTML = 'Delete' - - document.body.appendChild(clone) - document.querySelector('.overlay').classList.add('active') - document.querySelector('.prompt').classList.add('active') - - return false -} - -function resetSearchText () { - let box = document.querySelector('#search > div div') - - if (user.AllowCommands) { - box.innerHTML = `Search or use one of your supported commands: ${user.Commands.join(", ")}.` - } else { - box.innerHTML = 'Type and press enter to search.' - } -} - -function searchEvent (event) { - if (this.value.length === 0) { - resetSearchText() - return - } - - let value = this.value, - search = document.getElementById('search'), - scrollable = document.querySelector('#search > div'), - box = document.querySelector('#search > div div'), - pieces = value.split(' '), - supported = false - - user.Commands.forEach(function (cmd) { - if (cmd == pieces[0]) { - supported = true - } - }) - - if (!supported || !user.AllowCommands) { - box.innerHTML = 'Press enter to search.' - } else { - box.innerHTML = 'Press enter to execute.' - } - - if (event.keyCode === 13) { - box.innerHTML = '' - search.classList.add('ongoing') - - let url = window.location.host + window.location.pathname - - if (document.getElementById('editor')) { - url = removeLastDirectoryPartOf(url) - } - - let protocol = ssl ? 'wss:' : 'ws:' - - if (supported && user.AllowCommands) { - let conn = new window.WebSocket(`${protocol}//${url}?command=true`) - - conn.onopen = function () { - conn.send(value) - } - - conn.onmessage = function (event) { - box.innerHTML = event.data - scrollable.scrollTop = scrollable.scrollHeight - } - - conn.onclose = function (event) { - search.classList.remove('ongoing') - listing.reload() - } - - return - } - - box.innerHTML = '
      ' - - let ul = box.querySelector('ul') - let conn = new window.WebSocket(`${protocol}//${url}?search=true`) - - conn.onopen = function () { - conn.send(value) - } - - conn.onmessage = function (event) { - ul.innerHTML += '
    • ' + event.data + '
    • ' - scrollable.scrollTop = scrollable.scrollHeight - } - - conn.onclose = function (event) { - search.classList.remove('ongoing') - } - } -} - -function setupSearch () { - let search = document.getElementById('search') - let searchInput = search.querySelector('input') - let searchDiv = search.querySelector('div') - let hover = false - let focus = false - - resetSearchText() - - searchInput.addEventListener('focus', event => { - focus = true - search.classList.add('active') - }) - - searchDiv.addEventListener('mouseover', event => { - hover = true - search.classList.add('active') - }) - - searchInput.addEventListener('blur', event => { - focus = false - if (hover) return - search.classList.remove('active') - }) - - search.addEventListener('mouseleave', event => { - hover = false - if (focus) return - search.classList.remove('active') - }) - - search.addEventListener('click', event => { - search.classList.add('active') - search.querySelector('input').focus() - }) - - searchInput.addEventListener('keyup', searchEvent) -} - -function closeHelp (event) { - event.preventDefault() - - document.querySelector('.help').classList.remove('active') - document.querySelector('.overlay').classList.remove('active') -} - -function openHelp (event) { - closePrompt(event) - - document.querySelector('.help').classList.add('active') - document.querySelector('.overlay').classList.add('active') -} - -window.addEventListener('keydown', (event) => { - if (event.keyCode === 27) { - if (document.querySelector('.help.active')) { - closeHelp(event) - } - } - - if (event.keyCode === 46) { - deleteEvent(event) - } - - if (event.keyCode === 112) { - event.preventDefault() - openHelp(event) - } -}) - -/* * * * * * * * * * * * * * * * - * * - * BOOTSTRAP * - * * - * * * * * * * * * * * * * * * */ - -document.addEventListener('DOMContentLoaded', function (event) { - overlay = document.querySelector('.overlay') - clickOverlay = document.querySelector('#click-overlay') - - buttons.logout = document.getElementById('logout') - buttons.open = document.getElementById('open') - buttons.delete = document.getElementById('delete') - buttons.previous = document.getElementById('previous') - buttons.info = document.getElementById('info') - - // Attach event listeners - buttons.logout.addEventListener('click', logoutEvent) - buttons.open.addEventListener('click', openEvent) - buttons.info.addEventListener('click', infoEvent) - - templates.question = document.querySelector('#question-template') - templates.info = document.querySelector('#info-template') - templates.message = document.querySelector('#message-template') - templates.move = document.querySelector('#move-template') - - if (user.AllowEdit) { - buttons.delete.addEventListener('click', deleteEvent) - } - - let dropdownButtons = document.querySelectorAll('.action[data-dropdown]') - Array.from(dropdownButtons).forEach(button => { - button.addEventListener('click', event => { - button.querySelector('ul').classList.toggle('active') - clickOverlay.classList.add('active') - - clickOverlay.addEventListener('click', event => { - button.querySelector('ul').classList.remove('active') - clickOverlay.classList.remove('active') - }) - }) - }) - - overlay.addEventListener('click', event => { - if (document.querySelector('.help.active')) { - closeHelp(event) - return - } - - closePrompt(event) - }) - - let mainActions = document.getElementById('main-actions') - - document.getElementById('more').addEventListener('click', event => { - event.preventDefault() - event.stopPropagation() - - clickOverlay.classList.add('active') - mainActions.classList.add('active') - - clickOverlay.addEventListener('click', event => { - mainActions.classList.remove('active') - clickOverlay.classList.remove('active') - }) - }) - - setupSearch() - return false -}) diff --git a/_embed/public/js/editor.js b/_embed/public/js/editor.js deleted file mode 100644 index 38ff40c7..00000000 --- a/_embed/public/js/editor.js +++ /dev/null @@ -1,278 +0,0 @@ -'use strict' - -var editor = {} - -editor.textareaAutoGrow = function () { - let autogrow = function () { - console.log(this.style.height) - this.style.height = 'auto' - this.style.height = (this.scrollHeight) + 'px' - } - - let textareas = document.getElementsByTagName('textarea') - - let addAutoGrow = () => { - Array.from(textareas).forEach(textarea => { - autogrow.bind(textarea)() - textarea.addEventListener('keyup', autogrow) - }) - } - - addAutoGrow() - window.addEventListener('resize', addAutoGrow) -} - -editor.toggleSourceEditor = function (event) { - event.preventDefault() - - if (document.querySelector('[data-kind="content-only"]')) { - window.location = window.location.pathname + '?visual=true' - return - } - - window.location = window.location.pathname + '?visual=false' -} - -function deleteFrontMatterItem (event) { - event.preventDefault() - document.getElementById(this.dataset.delete).remove() -} - -function makeFromBaseTemplate (id, type, name, parent) { - let clone = document.importNode(templates.base.content, true) - clone.querySelector('fieldset').id = id - clone.querySelector('fieldset').dataset.type = type - clone.querySelector('h3').innerHTML = name - clone.querySelector('.delete').dataset.delete = id - clone.querySelector('.delete').addEventListener('click', deleteFrontMatterItem) - clone.querySelector('.add').addEventListener('click', addFrontMatterItem) - - if (parent.classList.contains('frontmatter')) { - parent.insertBefore(clone, document.querySelector('div.button.add')) - return - } - - parent.appendChild(clone) -} - -function makeFromArrayItemTemplate (id, number, parent) { - let clone = document.importNode(templates.arrayItem.content, true) - clone.querySelector('[data-type="array-item"]').id = `${id}-${number}` - clone.querySelector('input').name = id - clone.querySelector('input').id = id - clone.querySelector('div.action').dataset.delete = `${id}-${number}` - clone.querySelector('div.action').addEventListener('click', deleteFrontMatterItem) - parent.querySelector('.group').appendChild(clone) - document.getElementById(`${id}-${number}`).querySelector('input').focus() -} - -function makeFromObjectItemTemplate (id, name, parent) { - let clone = document.importNode(templates.objectItem.content, true) - clone.querySelector('.block').id = `block-${id}` - clone.querySelector('.block').dataset.content = id - clone.querySelector('label').for = id - clone.querySelector('label').innerHTML = name - clone.querySelector('input').name = id - clone.querySelector('input').id = id - clone.querySelector('.action').dataset.delete = `block-${id}` - clone.querySelector('.action').addEventListener('click', deleteFrontMatterItem) - - parent.appendChild(clone) - document.getElementById(id).focus() -} - -function addFrontMatterItemPrompt (parent) { - return function (event) { - event.preventDefault() - - let value = event.currentTarget.querySelector('input').value - if (value === '') { - return true - } - - closePrompt(event) - - let name = value.substring(0, value.lastIndexOf(':')), - type = value.substring(value.lastIndexOf(':') + 1, value.length) - - if (type !== '' && type !== 'array' && type !== 'object') { - name = value - } - - name = name.replace(' ', '_') - - let id = name - - if (parent.id != '') { - id = parent.id + '.' + id - } - - if (type == 'array' || type == 'object') { - if (parent.dataset.type == 'parent') { - makeFromBaseTemplate(id, type, name, document.querySelector('.frontmatter')) - return - } - - makeFromBaseTemplate(id, type, name, block) - return - } - - let group = parent.querySelector('.group') - - if (group == null) { - parent.insertAdjacentHTML('afterbegin', '
      ') - group = parent.querySelector('.group') - } - - makeFromObjectItemTemplate(id, name, group) - } -} - -function addFrontMatterItem (event) { - event.preventDefault() - - let parent = event.currentTarget.parentNode, - type = parent.dataset.type - - // If the block is an array - if (type === 'array') { - let id = parent.id + '[]', - count = parent.querySelectorAll('.group > div').length, - fieldsets = parent.getElementsByTagName('fieldset') - - if (fieldsets.length > 0) { - let itemType = fieldsets[0].dataset.type, - itemID = parent.id + '[' + fieldsets.length + ']', - itemName = fieldsets.length - - makeFromBaseTemplate(itemID, itemType, itemName, parent) - } else { - makeFromArrayItemTemplate(id, count, parent) - } - - return - } - - if (type == 'object' || type == 'parent') { - let clone = document.importNode(templates.question.content, true) - clone.querySelector('form').id = tempID - clone.querySelector('h3').innerHTML = 'New field' - clone.querySelector('p').innerHTML = 'Write the field name and then press enter. If you want to create an array or an object, end the name with :array or :object.' - clone.querySelector('.ok').innerHTML = 'Create' - clone.querySelector('form').addEventListener('submit', addFrontMatterItemPrompt(parent)) - clone.querySelector('form').classList.add('active') - document.querySelector('body').appendChild(clone) - - document.querySelector('.overlay').classList.add('active') - document.getElementById(tempID).classList.add('active') - } - - return false -} - -document.addEventListener('DOMContentLoaded', (event) => { - if (!document.getElementById('editor')) return - - editor.textareaAutoGrow() - - templates.arrayItem = document.getElementById('array-item-template') - templates.base = document.getElementById('base-template') - templates.objectItem = document.getElementById('object-item-template') - templates.temporary = document.getElementById('temporary-template') - - buttons.save = document.querySelector('#save') - buttons.editSource = document.querySelector('#edit-source') - - if (buttons.editSource) { - buttons.editSource.addEventListener('click', editor.toggleSourceEditor) - } - - let container = document.getElementById('editor'), - kind = container.dataset.kind, - rune = container.dataset.rune - - if (kind != 'frontmatter-only') { - let editor = document.querySelector('.content #ace'), - mode = editor.dataset.mode, - textarea = document.querySelector('textarea[name="content"]'), - aceEditor = ace.edit('ace'), - options = { - wrap: true, - maxLines: Infinity, - theme: 'ace/theme/github', - showPrintMargin: false, - fontSize: '1em', - minLines: 20 - } - - aceEditor.getSession().setMode('ace/mode/' + mode) - aceEditor.getSession().setValue(textarea.value) - aceEditor.getSession().on('change', function () { - textarea.value = aceEditor.getSession().getValue() - }) - - if (mode == 'markdown') options.showGutter = false - aceEditor.setOptions(options) - } - - let deleteFrontMatterItemButtons = document.getElementsByClassName('delete') - Array.from(deleteFrontMatterItemButtons).forEach(button => { - button.addEventListener('click', deleteFrontMatterItem) - }) - - let addFrontMatterItemButtons = document.getElementsByClassName('add') - Array.from(addFrontMatterItemButtons).forEach(button => { - button.addEventListener('click', addFrontMatterItem) - }) - - let saveContent = function () { - let data = form2js(document.querySelector('form')) - - if (typeof data.content === 'undefined' && kind !== 'frontmatter-only') { - data.content = '' - } - - if (typeof data.content === 'number') { - data.content = data.content.toString() - } - - let request = new XMLHttpRequest() - - buttons.setLoading('save') - - webdav.put(window.location.pathname, JSON.stringify(data), { - 'Kind': kind, - 'Rune': rune - }) - .then(() => { - buttons.setDone('save') - }) - .catch(e => { - console.log(e) - buttons.setDone('save', false) - }) - } - - document.querySelector('#save').addEventListener('click', event => { - event.preventDefault() - saveContent() - }) - - document.querySelector('form').addEventListener('submit', (event) => { - event.preventDefault() - saveContent() - }) - - window.addEventListener('keydown', (event) => { - if (event.ctrlKey || event.metaKey) { - switch (String.fromCharCode(event.which).toLowerCase()) { - case 's': - event.preventDefault() - saveContent() - break - } - } - }) - - return false -}) diff --git a/_embed/public/js/form2js.js b/_embed/public/js/form2js.js deleted file mode 100644 index 8d739bbd..00000000 --- a/_embed/public/js/form2js.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,n){"undefined"!=typeof exports&&"undefined"!=typeof module&&module.exports?module.exports=n():"function"==typeof define&&define.amd?define(n):e.form2js=n()}(this,function(){"use strict";function e(e,r,u,i,a,l){l=!!l,void 0!==u&&null!=u||(u=!0),void 0!==r&&null!=r||(r="."),arguments.length<5&&(a=!1);var o,c=[],s=0;if((e="string"==typeof e?document.getElementById(e):e).constructor==Array||"undefined"!=typeof NodeList&&e.constructor==NodeList)for(;o=e[s++];)c=c.concat(t(o,i,a,l));else c=t(e,i,a,l);return n(c,u,r)}function n(e,n,t){var r,u,i,a,l,o,c,s,f,d,h,m,g={},p={};for(r=0;r1)for(i=0;i-1&&u==o.length-1?(s+=f=h.substr(0,h.indexOf("[")),c[f]||(c[f]=[]),c[f].push(l)):h.indexOf("[")>-1?(p[s+="_"+(f=h.substr(0,h.indexOf("[")))+"_"+(d=h.replace(/(^([a-z_]+)?\[)|(\]$)/gi,""))]||(p[s]={}),""==f||c[f]||(c[f]=[]),u==o.length-1?""==f?(c.push(l),p[s][d]=c[c.length-1]):(c[f].push(l),p[s][d]=c[f][c[f].length-1]):p[s][d]||(/^[0-9a-z_]+\[?/i.test(o[u+1])?c[f].push({}):c[f].push([]),p[s][d]=c[f][c[f].length-1]),c=p[s][d]):(s+=h,u0?a:r(e,n,t,i)}function r(e,n,t,r){for(var i=[],a=e.firstChild;a;)i=i.concat(u(a,n,t,r)),a=a.nextSibling;return i}function u(e,n,t,u){if(e.disabled&&!u)return[];var l,o,c,s=i(e,t);return l=n&&n(e),l&&l.name?c=[l]:""!=s&&e.nodeName.match(/INPUT|TEXTAREA/i)?c=null===(o=a(e,u))?[]:[{name:s,value:o}]:""!=s&&e.nodeName.match(/SELECT/i)?(o=a(e,u),c=[{name:s.replace(/\[\]$/,""),value:o}]):c=r(e,n,t,u),c}function i(e,n){return e.name&&""!=e.name?e.name:n&&e.id&&""!=e.id?e.id:""}function a(e,n){if(e.disabled&&!n)return null;switch(e.nodeName){case"INPUT":case"TEXTAREA":switch(e.type.toLowerCase()){case"radio":if(e.checked&&"false"===e.value)return!1;case"checkbox":if(e.checked&&"true"===e.value)return!0;if(!e.checked&&"true"===e.value)return!1;if(e.checked)return e.value;break;case"button":case"reset":case"submit":case"image":return"";default:return e.value}break;case"SELECT":return l(e)}return null}function l(e){var n,t,r,u=[];if(!e.multiple)return e.value;for(t=0,r=(n=e.getElementsByTagName("option")).length;t listing.reload()) - .catch(e => console.log(e)) -} - -listing.documentDrop = function (event) { - event.preventDefault() - let dt = event.dataTransfer, - files = dt.files, - el = event.target, - items = document.getElementsByClassName('item') - - for (let i = 0; i < 5; i++) { - if (el != null && !el.classList.contains('item')) { - el = el.parentElement - } - } - - if (files.length > 0) { - if (el != null && el.classList.contains('item') && el.dataset.dir == 'true') { - listing.handleFiles(files, el.querySelector('.name').innerHTML + '/') - return - } - - listing.handleFiles(files, '') - } else { - Array.from(items).forEach(file => { - file.style.opacity = 1 - }) - } -} - -listing.rename = function (event) { - if (!selectedItems.length || selectedItems.length > 1) { - return false - } - - let item = document.getElementById(selectedItems[0]) - - if (item.classList.contains('disabled')) { - return false - } - - let link = item.dataset.url, - field = item.querySelector('.name'), - name = field.innerHTML - - let submit = (event) => { - event.preventDefault() - - let newName = event.currentTarget.querySelector('input').value, - newLink = removeLastDirectoryPartOf(link) + '/' + newName - - closePrompt(event) - buttons.setLoading('rename') - - webdav.move(link, newLink).then(() => { - listing.reload(() => { - newName = btoa(newName) - selectedItems = [newName] - document.getElementById(newName).setAttribute('aria-selected', true) - listing.handleSelectionChange() - }) - - buttons.setDone('rename') - }).catch(error => { - field.innerHTML = name - buttons.setDone('rename', false) - console.log(error) - }) - - return false - } - - let clone = document.importNode(templates.question.content, true) - clone.querySelector('h3').innerHTML = 'Rename' - clone.querySelector('input').value = name - clone.querySelector('.ok').innerHTML = 'Rename' - clone.querySelector('form').addEventListener('submit', submit) - - document.querySelector('body').appendChild(clone) - document.querySelector('.overlay').classList.add('active') - document.querySelector('.prompt').classList.add('active') - - return false -} - -listing.handleFiles = function (files, base) { - buttons.setLoading('upload') - - let promises = [] - - for (let file of files) { - promises.push(webdav.put(window.location.pathname + base + file.name, file)) - } - - Promise.all(promises) - .then(() => { - listing.reload() - buttons.setDone('upload') - }) - .catch(e => { - console.log(e) - buttons.setDone('upload', false) - }) - - return false -} - -listing.unselectAll = function () { - let items = document.getElementsByClassName('item') - Array.from(items).forEach(link => { - link.setAttribute('aria-selected', false) - }) - - selectedItems = [] - - listing.handleSelectionChange() - return false -} - -listing.handleSelectionChange = function (event) { - listing.redefineDownloadURLs() - - let selectedNumber = selectedItems.length, - fileAction = document.getElementById('file-only') - - if (selectedNumber) { - fileAction.classList.remove('disabled') - - if (selectedNumber > 1) { - buttons.open.classList.add('disabled') - buttons.rename.classList.add('disabled') - buttons.info.classList.add('disabled') - } - - if (selectedNumber == 1) { - if (document.getElementById(selectedItems[0]).dataset.dir == 'true') { - buttons.open.classList.add('disabled') - } else { - buttons.open.classList.remove('disabled') - } - - buttons.info.classList.remove('disabled') - buttons.rename.classList.remove('disabled') - } - - return false - } - - buttons.info.classList.remove('disabled') - fileAction.classList.add('disabled') - return false -} - -listing.redefineDownloadURLs = function () { - let files = '' - - for (let i = 0; i < selectedItems.length; i++) { - let url = document.getElementById(selectedItems[i]).dataset.url - files += url.replace(window.location.pathname, '') + ',' - } - - files = files.substring(0, files.length - 1) - files = encodeURIComponent(files) - - let links = document.querySelectorAll('#download ul a') - Array.from(links).forEach(link => { - link.href = '?download=' + link.dataset.format + '&files=' + files - }) -} - -listing.openItem = function (event) { - window.location = event.currentTarget.dataset.url -} - -listing.selectItem = function (event) { - let el = event.currentTarget - - if (selectedItems.length != 0) event.preventDefault() - if (selectedItems.indexOf(el.id) == -1) { - if (!event.ctrlKey && !listing.selectMultiple) listing.unselectAll() - - el.setAttribute('aria-selected', true) - selectedItems.push(el.id) - } else { - el.setAttribute('aria-selected', false) - selectedItems.removeElement(el.id) - } - - listing.handleSelectionChange() - return false -} - -listing.newFileButton = function (event) { - event.preventDefault() - - let clone = document.importNode(templates.question.content, true) - clone.querySelector('h3').innerHTML = 'New file' - clone.querySelector('p').innerHTML = 'End with a trailing slash to create a dir.' - clone.querySelector('.ok').innerHTML = 'Create' - clone.querySelector('form').addEventListener('submit', listing.newFilePrompt) - - document.querySelector('body').appendChild(clone) - document.querySelector('.overlay').classList.add('active') - document.querySelector('.prompt').classList.add('active') -} - -listing.newFilePrompt = function (event) { - event.preventDefault() - buttons.setLoading('new') - - let name = event.currentTarget.querySelector('input').value - - webdav.new(window.location.pathname + name) - .then(() => { - buttons.setDone('new') - listing.reload() - }) - .catch(e => { - console.log(e) - buttons.setDone('new', false) - }) - - closePrompt(event) - return false -} - -listing.updateColumns = function (event) { - let columns = Math.floor(document.getElementById('listing').offsetWidth / 300), - items = getCSSRule(['#listing.mosaic .item', '.mosaic#listing .item']) - - items.style.width = `calc(${100/columns}% - 1em)` -} - -listing.addDoubleTapEvent = function () { - let items = document.getElementsByClassName('item'), - touches = { - id: '', - count: 0 - } - - Array.from(items).forEach(file => { - file.addEventListener('touchstart', event => { - if (touches.id != file.id) { - touches.id = file.id - touches.count = 1 - - setTimeout(() => { - touches.count = 0 - }, 300) - - return - } - - touches.count++ - - if (touches.count > 1) { - window.location = file.dataset.url - } - }) - }) -} - -// Keydown events -window.addEventListener('keydown', (event) => { - if (event.keyCode == 27) { - listing.unselectAll() - - if (document.querySelectorAll('.prompt').length) { - closePrompt(event) - } - } - - if (event.keyCode == 113) { - listing.rename() - } - - if (event.ctrlKey || event.metaKey) { - switch (String.fromCharCode(event.which).toLowerCase()) { - case 's': - event.preventDefault() - window.location = '?download=true' - } - } -}) - -window.addEventListener('resize', () => { - listing.updateColumns() -}) - -listing.selectMoveFolder = function (event) { - if (event.target.getAttribute('aria-selected') === 'true') { - event.target.setAttribute('aria-selected', false) - return - } else { - if (document.querySelector('.file-list li[aria-selected=true]')) { - document.querySelector('.file-list li[aria-selected=true]').setAttribute('aria-selected', false) - } - event.target.setAttribute('aria-selected', true) - return - } -} - -listing.getJSON = function (link) { - return new Promise((resolve, reject) => { - let request = new XMLHttpRequest() - request.open('GET', link) - request.setRequestHeader('Accept', 'application/json') - request.onload = () => { - if (request.status == 200) { - resolve(request.responseText) - } else { - reject(request.statusText) - } - } - request.onerror = () => reject(request.statusText) - request.send() - }) -} - -listing.moveMakeItem = function (url, name) { - let node = document.createElement('li'), - count = 0 - - node.dataset.url = url - node.innerHTML = name - node.setAttribute('aria-selected', false) - - node.addEventListener('dblclick', listing.moveDialogNext) - node.addEventListener('click', listing.selectMoveFolder) - node.addEventListener('touchstart', event => { - count++ - - setTimeout(() => { - count = 0 - }, 300) - - if (count > 1) { - listing.moveDialogNext(event) - } - }) - - return node -} - -listing.moveDialogNext = function (event) { - let request = new XMLHttpRequest(), - prompt = document.querySelector('form.prompt.active'), - list = prompt.querySelector('div.file-list ul') - - prompt.addEventListener('submit', listing.moveSelected) - - listing.getJSON(event.target.dataset.url) - .then((data) => { - let dirs = 0 - - prompt.querySelector('ul').innerHTML = '' - prompt.querySelector('code').innerHTML = event.target.dataset.url - - if (event.target.dataset.url != baseURL + '/') { - let node = listing.moveMakeItem(removeLastDirectoryPartOf(event.target.dataset.url) + '/', '..') - list.appendChild(node) - } - - if (JSON.parse(data) == null) { - prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.` - return - } - - for (let f of JSON.parse(data)) { - if (f.IsDir === true) { - dirs++ - list.appendChild(listing.moveMakeItem(f.URL, f.Name)) - } - } - - if (dirs === 0) - prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.` - }) - .catch(e => console.log(e)) -} - -listing.moveSelected = function (event) { - event.preventDefault() - - let promises = [] - buttons.setLoading('move') - - for (let file of selectedItems) { - let fileElement = document.getElementById(file), - destFolder = event.target.querySelector('p code').innerHTML - - if (event.currentTarget.querySelector('li[aria-selected=true]') != null) { - destFolder = event.currentTarget.querySelector('li[aria-selected=true]').dataset.url - } - - let destPath = '/' + destFolder + '/' + fileElement.querySelector('.name').innerHTML - destPath = destPath.replace('//', '/') - - promises.push(webdav.move(fileElement.dataset.url, destPath)) - } - - Promise.all(promises) - .then(() => { - closePrompt(event) - buttons.setDone('move') - listing.reload() - }) - .catch(e => { - console.log(e) - }) -} - -listing.moveEvent = function (event) { - if (event.currentTarget.classList.contains('disabled')) - return - - listing.getJSON(window.location.pathname) - .then((data) => { - let prompt = document.importNode(templates.move.content, true), - list = prompt.querySelector('div.file-list ul'), - dirs = 0 - - prompt.querySelector('form').addEventListener('submit', listing.moveSelected) - prompt.querySelector('code').innerHTML = window.location.pathname - - if (window.location.pathname !== baseURL + '/') { - list.appendChild(listing.moveMakeItem(removeLastDirectoryPartOf(window.location.pathname) + '/', '..')) - } - - for (let f of JSON.parse(data)) { - if (f.IsDir === true) { - dirs++ - list.appendChild(listing.moveMakeItem(f.URL, f.Name)) - } - } - - if (dirs === 0) { - prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.` - } - - document.body.appendChild(prompt) - document.querySelector('.overlay').classList.add('active') - document.querySelector('.prompt').classList.add('active') - }) - .catch(e => console.log(e)) -} - -document.addEventListener('DOMContentLoaded', event => { - listing.updateColumns() - listing.addDoubleTapEvent() - - buttons.rename = document.getElementById('rename') - buttons.upload = document.getElementById('upload') - buttons.new = document.getElementById('new') - buttons.download = document.getElementById('download') - buttons.move = document.getElementById('move') - - document.getElementById('multiple-selection-activate').addEventListener('click', event => { - listing.selectMultiple = true - clickOverlay.click() - - document.getElementById('multiple-selection').classList.add('active') - document.querySelector('body').style.paddingBottom = '4em' - }) - - document.getElementById('multiple-selection-cancel').addEventListener('click', event => { - listing.selectMultiple = false - - document.querySelector('body').style.paddingBottom = '0' - document.getElementById('multiple-selection').classList.remove('active') - }) - - if (user.AllowEdit) { - buttons.move.addEventListener('click', listing.moveEvent) - buttons.rename.addEventListener('click', listing.rename) - } - - let items = document.getElementsByClassName('item') - - if (user.AllowNew) { - buttons.upload.addEventListener('click', (event) => { - document.getElementById('upload-input').click() - }) - - buttons.new.addEventListener('click', listing.newFileButton) - - // Drag and Drop - document.addEventListener('dragover', function (event) { - event.preventDefault() - }, false) - - document.addEventListener('dragenter', (event) => { - Array.from(items).forEach(file => { - file.style.opacity = 0.5 - }) - }, false) - - document.addEventListener('dragend', (event) => { - Array.from(items).forEach(file => { - file.style.opacity = 1 - }) - }, false) - - document.addEventListener('drop', listing.documentDrop, false) - } -}) diff --git a/_embed/templates/base.tmpl b/_embed/templates/base.tmpl deleted file mode 100644 index 14dbb525..00000000 --- a/_embed/templates/base.tmpl +++ /dev/null @@ -1,289 +0,0 @@ - - -{{ $absURL := .Config.AbsoluteURL }} - - {{.Name}} - - - - - - {{- if ne .User.StyleSheet "" -}} - - {{- end -}} - - - - {{- if .IsDir }} - - {{- else }} - - - - {{- end }} - - -
      -
      -

      File Manager

      - - -
      - exit_to_app -
      -
      - -
      -
      - {{- if ne .Name "/"}} - - {{- end }} - - {{ if ne .Name "/"}}

      {{ .Name }}

      {{ end }} -
      - -
      - {{- if and (not .IsDir) (.User.AllowEdit) }} - {{- if .Editor}} - - {{- if eq .Data.Mode "markdown" }} -
      - remove_red_eye -
      - {{- end }} - - {{- if eq .Data.Visual true }} -
      - code -
      - {{- end }} - {{- end }} - -
      - save -
      - {{- end }} - - {{- if .IsDir }} -
      - open_in_new - See raw -
      - {{- end }} - - {{- if and (.User.AllowEdit) (.IsDir) }} -
      - forward - Move file -
      - {{- end }} - - {{- if and .IsDir .User.AllowEdit }} -
      - mode_edit -
      - {{- end }} - - {{- if and .User.AllowEdit .IsDir }} -
      - deleteDelete -
      - {{- end }} -
      - -
      - more_vert -
      - -
      - {{- if .IsDir }} -
      - {{- if eq .Display "mosaic" }} - - view_listSwitch view - - {{- else }} - - view_moduleSwitch view - - {{- end }} -
      - -
      - check_circleSelect -
      - {{- end }} - - {{- if and (.User.AllowNew) (.IsDir) }} -
      - file_uploadUpload -
      - {{- end }} - - {{- if not .IsDir }} -
      - open_in_new - See raw -
      - {{- end }} - - {{- if and .User.AllowEdit (not .IsDir) }} -
      - deleteDelete -
      - {{- end }} - -
      - {{- if not .IsDir}}{{ end }} - file_downloadDownload - {{- if not .IsDir}}{{ end }} - - {{- if .IsDir }} - - {{- end }} -
      - -
      - infoInfo -
      -
      -
      - -
      -
      - -
      -

      Multiple selection enabled

      -
      - clear -
      -
      - -
      - {{- template "content" . }} -
      - -
      - - {{- if and (.User.AllowNew) (.IsDir) }} -
      -
      - add -
      -
      - {{- end }} - - - - - - - - - -
      -

      Help

      - -
        -
      • F1 - this information
      • -
      • F2 - rename file
      • -
      • DEL - delete selected items
      • -
      • ESC - clear selection and/or close the prompt
      • -
      • CTRL + S - save a file or download the directory where you are
      • -
      • CTRL + Click - select multiple files or directories
      • -
      • Double click - open a file or directory
      • -
      • Click - select file or directory
      • -
      - -

      Not available yet

      - -
        -
      • Alt + Click - select a group of files
      • -
      - -
      - -
      -
      - - - - diff --git a/_embed/templates/editor.tmpl b/_embed/templates/editor.tmpl deleted file mode 100644 index d02238d8..00000000 --- a/_embed/templates/editor.tmpl +++ /dev/null @@ -1,57 +0,0 @@ -{{ define "content" }} -{{- with .Data }} -
      - {{- if or (eq .Class "frontmatter-only") (eq .Class "complete") }} - {{- if (eq .Class "complete")}} -

      Metadata

      - {{- end }} -
      - {{- template "blocks" .FrontMatter.Content }} -
      Add field
      -
      - {{- end }} - - {{ if or (eq .Class "content-only") (eq .Class "complete") }} - {{ if (eq .Class "complete")}} -

      Body

      - {{ end }} -
      -
      - -
      - {{ end }} -
      -{{- end }} - - - - - - -{{ end }} diff --git a/_embed/templates/frontmatter.tmpl b/_embed/templates/frontmatter.tmpl deleted file mode 100644 index 3389da90..00000000 --- a/_embed/templates/frontmatter.tmpl +++ /dev/null @@ -1,56 +0,0 @@ -{{ define "blocks" }} -{{ if .Fields }}
      {{ end }} -{{- range $key, $value := .Fields }} - {{- if eq $value.Parent.Type "array" }} -
      - {{- template "value" $value }} -
      - close -
      -
      - {{- else }} -
      - - {{ template "value" $value }} -
      - close -
      -
      - {{- end }} -{{- end }} -{{- if .Fields }}
      {{ end }} - -{{- range $key, $value := .Arrays }} -{{- template "fielset" $value }} -{{- end }} - -{{- range $key, $value := .Objects }} -{{- template "fielset" $value }} -{{- end }} - -{{ end }} - -{{ define "value" }} -{{- if eq .HTMLType "textarea" }} - -{{- else if eq .HTMLType "datetime" }} - -{{- else }} - -{{- end }} -{{ end }} - -{{ define "fielset" }} -
      - {{- if not (eq .Title "") }} -

      {{ .Name }}

      - {{- end }} -
      - add -
      -
      - close -
      - {{- template "blocks" .Content }} -
      -{{ end }} diff --git a/_embed/templates/listing.tmpl b/_embed/templates/listing.tmpl deleted file mode 100644 index da94b962..00000000 --- a/_embed/templates/listing.tmpl +++ /dev/null @@ -1,103 +0,0 @@ -{{ define "content" }} -
      -{{- with .Data -}} -
      -
      -
      -
      -

      Name - {{- if eq .Sort "name" -}} - {{- if eq .Order "asc" -}} - arrow_downward - {{- else -}} - arrow_upward - {{- end -}} - {{- else -}} - arrow_downward - {{- end -}} -

      -

      File Size - {{- if eq .Sort "size" -}} - {{- if eq .Order "asc" -}} - arrow_downward - {{- else -}} - arrow_upward - {{- end -}} - {{- else -}} - arrow_downward - {{- end -}} -

      -

      Last modified

      -
      -
      -
      - - {{ if and (eq .NumDirs 0) (eq .NumFiles 0) }} -

      It feels lonely here :'(

      - {{ end }} - - {{- if not (eq .NumDirs 0)}} -

      Folders

      -
      - {{- range .Items }} - {{- if (.IsDir) }} - {{ template "item" .}} - {{- end }} - {{- end }} -
      - {{- end }} - - {{- if not (eq .NumFiles 0)}} -

      Files

      -
      - {{- range .Items }} - {{- if (not .IsDir) }} - {{ template "item" .}} - {{- end }} - {{- end }} -
      - {{- end }} -
      - - -{{- end -}} -{{- end -}} - -{{ define "item" }} -
      -
      - {{- if .IsDir}} - folder - {{- else}} - {{ if eq .Type "image" }} - insert_photo - {{ else if eq .Type "audio" }} - volume_up - {{ else if eq .Type "video" }} - movie - {{ else }} - insert_drive_file - {{ end }} - {{- end}} -
      -
      -

      {{.Name}}

      - {{- if .IsDir}} -

      - {{- else}} -

      {{.HumanSize}}

      - {{- end}} -

      - -

      -
      -
      -{{ end }} diff --git a/_embed/templates/minimal.tmpl b/_embed/templates/minimal.tmpl deleted file mode 100644 index 66e0068d..00000000 --- a/_embed/templates/minimal.tmpl +++ /dev/null @@ -1 +0,0 @@ -{{ template "content" . }} diff --git a/_embed/templates/single.tmpl b/_embed/templates/single.tmpl deleted file mode 100644 index c85ab5a4..00000000 --- a/_embed/templates/single.tmpl +++ /dev/null @@ -1,23 +0,0 @@ -{{ define "content" }} -{{ with .Data}} -
      - {{ if eq .Type "image" }} -
      - {{ else if eq .Type "audio" }} - - {{ else if eq .Type "video" }} - - {{ else if eq .Extension ".pdf" }} - - {{ else if eq .Type "blob" }} -

      Download file_download

      - {{ else}} -
      {{ .StringifyContent }}
      - {{ end }} -
      -{{ end }} -{{ end }} diff --git a/assets/assets.go b/assets/assets.go deleted file mode 100644 index 22990cbe..00000000 --- a/assets/assets.go +++ /dev/null @@ -1,33 +0,0 @@ -package assets - -import ( - "mime" - "net/http" - "path/filepath" - "strings" - - "github.com/hacdias/filemanager" -) - -// BaseURL is the url of the assets -const BaseURL = "/_internal" - -// Serve provides the needed assets for the front-end -func Serve(w http.ResponseWriter, r *http.Request, c *filemanager.Config) (int, error) { - // gets the filename to be used with Assets function - filename := strings.Replace(r.URL.Path, c.BaseURL+BaseURL, "public", 1) - file, err := Asset(filename) - if err != nil { - return http.StatusNotFound, nil - } - - // Get the file extension and its mimetype - extension := filepath.Ext(filename) - mediatype := mime.TypeByExtension(extension) - - // Write the header with the Content-Type and write the file - // content to the buffer - w.Header().Set("Content-Type", mediatype) - w.Write(file) - return 200, nil -} diff --git a/assets/binary.go b/assets/binary.go deleted file mode 100644 index 560a6b56..00000000 --- a/assets/binary.go +++ /dev/null @@ -1,7413 +0,0 @@ -// Code generated by go-bindata. -// sources: -// _embed/templates/base.tmpl -// _embed/templates/editor.tmpl -// _embed/templates/frontmatter.tmpl -// _embed/templates/listing.tmpl -// _embed/templates/minimal.tmpl -// _embed/templates/single.tmpl -// _embed/public/js/common.js -// _embed/public/js/editor.js -// _embed/public/js/form2js.js -// _embed/public/js/listing.js -// _embed/public/css/fonts.css -// _embed/public/css/material/icons.woff2 -// _embed/public/css/normalize.css -// _embed/public/css/roboto/medium-cyrillic-ext.woff2 -// _embed/public/css/roboto/medium-cyrillic.woff2 -// _embed/public/css/roboto/medium-greek-ext.woff2 -// _embed/public/css/roboto/medium-greek.woff2 -// _embed/public/css/roboto/medium-latin-ext.woff2 -// _embed/public/css/roboto/medium-latin.woff2 -// _embed/public/css/roboto/medium-vietnamese.woff2 -// _embed/public/css/roboto/normal-cyrillic-ext.woff2 -// _embed/public/css/roboto/normal-cyrillic.woff2 -// _embed/public/css/roboto/normal-greek-ext.woff2 -// _embed/public/css/roboto/normal-greek.woff2 -// _embed/public/css/roboto/normal-latin-ext.woff2 -// _embed/public/css/roboto/normal-latin.woff2 -// _embed/public/css/roboto/normal-vietnamese.woff2 -// _embed/public/css/styles.css -// _embed/public/ace/src-min/ace.js -// _embed/public/ace/src-min/ext-beautify.js -// _embed/public/ace/src-min/ext-chromevox.js -// _embed/public/ace/src-min/ext-elastic_tabstops_lite.js -// _embed/public/ace/src-min/ext-emmet.js -// _embed/public/ace/src-min/ext-error_marker.js -// _embed/public/ace/src-min/ext-keybinding_menu.js -// _embed/public/ace/src-min/ext-language_tools.js -// _embed/public/ace/src-min/ext-linking.js -// _embed/public/ace/src-min/ext-modelist.js -// _embed/public/ace/src-min/ext-old_ie.js -// _embed/public/ace/src-min/ext-searchbox.js -// _embed/public/ace/src-min/ext-settings_menu.js -// _embed/public/ace/src-min/ext-spellcheck.js -// _embed/public/ace/src-min/ext-split.js -// _embed/public/ace/src-min/ext-static_highlight.js -// _embed/public/ace/src-min/ext-statusbar.js -// _embed/public/ace/src-min/ext-textarea.js -// _embed/public/ace/src-min/ext-themelist.js -// _embed/public/ace/src-min/ext-whitespace.js -// _embed/public/ace/src-min/keybinding-emacs.js -// _embed/public/ace/src-min/keybinding-vim.js -// _embed/public/ace/src-min/mode-abap.js -// _embed/public/ace/src-min/mode-abc.js -// _embed/public/ace/src-min/mode-actionscript.js -// _embed/public/ace/src-min/mode-ada.js -// _embed/public/ace/src-min/mode-apache_conf.js -// _embed/public/ace/src-min/mode-applescript.js -// _embed/public/ace/src-min/mode-asciidoc.js -// _embed/public/ace/src-min/mode-assembly_x86.js -// _embed/public/ace/src-min/mode-autohotkey.js -// _embed/public/ace/src-min/mode-batchfile.js -// _embed/public/ace/src-min/mode-bro.js -// _embed/public/ace/src-min/mode-c9search.js -// _embed/public/ace/src-min/mode-c_cpp.js -// _embed/public/ace/src-min/mode-cirru.js -// _embed/public/ace/src-min/mode-clojure.js -// _embed/public/ace/src-min/mode-cobol.js -// _embed/public/ace/src-min/mode-coffee.js -// _embed/public/ace/src-min/mode-coldfusion.js -// _embed/public/ace/src-min/mode-csharp.js -// _embed/public/ace/src-min/mode-css.js -// _embed/public/ace/src-min/mode-curly.js -// _embed/public/ace/src-min/mode-d.js -// _embed/public/ace/src-min/mode-dart.js -// _embed/public/ace/src-min/mode-diff.js -// _embed/public/ace/src-min/mode-django.js -// _embed/public/ace/src-min/mode-dockerfile.js -// _embed/public/ace/src-min/mode-dot.js -// _embed/public/ace/src-min/mode-drools.js -// _embed/public/ace/src-min/mode-eiffel.js -// _embed/public/ace/src-min/mode-ejs.js -// _embed/public/ace/src-min/mode-elixir.js -// _embed/public/ace/src-min/mode-elm.js -// _embed/public/ace/src-min/mode-erlang.js -// _embed/public/ace/src-min/mode-forth.js -// _embed/public/ace/src-min/mode-fortran.js -// _embed/public/ace/src-min/mode-ftl.js -// _embed/public/ace/src-min/mode-gcode.js -// _embed/public/ace/src-min/mode-gherkin.js -// _embed/public/ace/src-min/mode-gitignore.js -// _embed/public/ace/src-min/mode-glsl.js -// _embed/public/ace/src-min/mode-gobstones.js -// _embed/public/ace/src-min/mode-golang.js -// _embed/public/ace/src-min/mode-groovy.js -// _embed/public/ace/src-min/mode-haml.js -// _embed/public/ace/src-min/mode-handlebars.js -// _embed/public/ace/src-min/mode-haskell.js -// _embed/public/ace/src-min/mode-haskell_cabal.js -// _embed/public/ace/src-min/mode-haxe.js -// _embed/public/ace/src-min/mode-hjson.js -// _embed/public/ace/src-min/mode-html.js -// _embed/public/ace/src-min/mode-html_elixir.js -// _embed/public/ace/src-min/mode-html_ruby.js -// _embed/public/ace/src-min/mode-ini.js -// _embed/public/ace/src-min/mode-io.js -// _embed/public/ace/src-min/mode-jack.js -// _embed/public/ace/src-min/mode-jade.js -// _embed/public/ace/src-min/mode-java.js -// _embed/public/ace/src-min/mode-javascript.js -// _embed/public/ace/src-min/mode-json.js -// _embed/public/ace/src-min/mode-jsoniq.js -// _embed/public/ace/src-min/mode-jsp.js -// _embed/public/ace/src-min/mode-jsx.js -// _embed/public/ace/src-min/mode-julia.js -// _embed/public/ace/src-min/mode-kotlin.js -// _embed/public/ace/src-min/mode-latex.js -// _embed/public/ace/src-min/mode-lean.js -// _embed/public/ace/src-min/mode-less.js -// _embed/public/ace/src-min/mode-liquid.js -// _embed/public/ace/src-min/mode-lisp.js -// _embed/public/ace/src-min/mode-live_script.js -// _embed/public/ace/src-min/mode-livescript.js -// _embed/public/ace/src-min/mode-logiql.js -// _embed/public/ace/src-min/mode-lsl.js -// _embed/public/ace/src-min/mode-lua.js -// _embed/public/ace/src-min/mode-luapage.js -// _embed/public/ace/src-min/mode-lucene.js -// _embed/public/ace/src-min/mode-makefile.js -// _embed/public/ace/src-min/mode-markdown.js -// _embed/public/ace/src-min/mode-mask.js -// _embed/public/ace/src-min/mode-matlab.js -// _embed/public/ace/src-min/mode-maze.js -// _embed/public/ace/src-min/mode-mel.js -// _embed/public/ace/src-min/mode-mips_assembler.js -// _embed/public/ace/src-min/mode-mipsassembler.js -// _embed/public/ace/src-min/mode-mushcode.js -// _embed/public/ace/src-min/mode-mysql.js -// _embed/public/ace/src-min/mode-nix.js -// _embed/public/ace/src-min/mode-nsis.js -// _embed/public/ace/src-min/mode-objectivec.js -// _embed/public/ace/src-min/mode-ocaml.js -// _embed/public/ace/src-min/mode-pascal.js -// _embed/public/ace/src-min/mode-perl.js -// _embed/public/ace/src-min/mode-pgsql.js -// _embed/public/ace/src-min/mode-php.js -// _embed/public/ace/src-min/mode-plain_text.js -// _embed/public/ace/src-min/mode-powershell.js -// _embed/public/ace/src-min/mode-praat.js -// _embed/public/ace/src-min/mode-prolog.js -// _embed/public/ace/src-min/mode-properties.js -// _embed/public/ace/src-min/mode-protobuf.js -// _embed/public/ace/src-min/mode-python.js -// _embed/public/ace/src-min/mode-r.js -// _embed/public/ace/src-min/mode-razor.js -// _embed/public/ace/src-min/mode-rdoc.js -// _embed/public/ace/src-min/mode-rhtml.js -// _embed/public/ace/src-min/mode-rst.js -// _embed/public/ace/src-min/mode-ruby.js -// _embed/public/ace/src-min/mode-rust.js -// _embed/public/ace/src-min/mode-sass.js -// _embed/public/ace/src-min/mode-scad.js -// _embed/public/ace/src-min/mode-scala.js -// _embed/public/ace/src-min/mode-scheme.js -// _embed/public/ace/src-min/mode-scss.js -// _embed/public/ace/src-min/mode-sh.js -// _embed/public/ace/src-min/mode-sjs.js -// _embed/public/ace/src-min/mode-smarty.js -// _embed/public/ace/src-min/mode-snippets.js -// _embed/public/ace/src-min/mode-soy_template.js -// _embed/public/ace/src-min/mode-space.js -// _embed/public/ace/src-min/mode-sql.js -// _embed/public/ace/src-min/mode-sqlserver.js -// _embed/public/ace/src-min/mode-stylus.js -// _embed/public/ace/src-min/mode-svg.js -// _embed/public/ace/src-min/mode-swift.js -// _embed/public/ace/src-min/mode-swig.js -// _embed/public/ace/src-min/mode-tcl.js -// _embed/public/ace/src-min/mode-tex.js -// _embed/public/ace/src-min/mode-text.js -// _embed/public/ace/src-min/mode-textile.js -// _embed/public/ace/src-min/mode-toml.js -// _embed/public/ace/src-min/mode-tsx.js -// _embed/public/ace/src-min/mode-twig.js -// _embed/public/ace/src-min/mode-typescript.js -// _embed/public/ace/src-min/mode-vala.js -// _embed/public/ace/src-min/mode-vbscript.js -// _embed/public/ace/src-min/mode-velocity.js -// _embed/public/ace/src-min/mode-verilog.js -// _embed/public/ace/src-min/mode-vhdl.js -// _embed/public/ace/src-min/mode-wollok.js -// _embed/public/ace/src-min/mode-xml.js -// _embed/public/ace/src-min/mode-xquery.js -// _embed/public/ace/src-min/mode-yaml.js -// _embed/public/ace/src-min/snippets/abap.js -// _embed/public/ace/src-min/snippets/abc.js -// _embed/public/ace/src-min/snippets/actionscript.js -// _embed/public/ace/src-min/snippets/ada.js -// _embed/public/ace/src-min/snippets/apache_conf.js -// _embed/public/ace/src-min/snippets/applescript.js -// _embed/public/ace/src-min/snippets/asciidoc.js -// _embed/public/ace/src-min/snippets/assembly_x86.js -// _embed/public/ace/src-min/snippets/autohotkey.js -// _embed/public/ace/src-min/snippets/batchfile.js -// _embed/public/ace/src-min/snippets/bro.js -// _embed/public/ace/src-min/snippets/c9search.js -// _embed/public/ace/src-min/snippets/c_cpp.js -// _embed/public/ace/src-min/snippets/cirru.js -// _embed/public/ace/src-min/snippets/clojure.js -// _embed/public/ace/src-min/snippets/cobol.js -// _embed/public/ace/src-min/snippets/coffee.js -// _embed/public/ace/src-min/snippets/coldfusion.js -// _embed/public/ace/src-min/snippets/csharp.js -// _embed/public/ace/src-min/snippets/css.js -// _embed/public/ace/src-min/snippets/curly.js -// _embed/public/ace/src-min/snippets/d.js -// _embed/public/ace/src-min/snippets/dart.js -// _embed/public/ace/src-min/snippets/diff.js -// _embed/public/ace/src-min/snippets/django.js -// _embed/public/ace/src-min/snippets/dockerfile.js -// _embed/public/ace/src-min/snippets/dot.js -// _embed/public/ace/src-min/snippets/drools.js -// _embed/public/ace/src-min/snippets/eiffel.js -// _embed/public/ace/src-min/snippets/ejs.js -// _embed/public/ace/src-min/snippets/elixir.js -// _embed/public/ace/src-min/snippets/elm.js -// _embed/public/ace/src-min/snippets/erlang.js -// _embed/public/ace/src-min/snippets/forth.js -// _embed/public/ace/src-min/snippets/fortran.js -// _embed/public/ace/src-min/snippets/ftl.js -// _embed/public/ace/src-min/snippets/gcode.js -// _embed/public/ace/src-min/snippets/gherkin.js -// _embed/public/ace/src-min/snippets/gitignore.js -// _embed/public/ace/src-min/snippets/glsl.js -// _embed/public/ace/src-min/snippets/gobstones.js -// _embed/public/ace/src-min/snippets/golang.js -// _embed/public/ace/src-min/snippets/groovy.js -// _embed/public/ace/src-min/snippets/haml.js -// _embed/public/ace/src-min/snippets/handlebars.js -// _embed/public/ace/src-min/snippets/haskell.js -// _embed/public/ace/src-min/snippets/haskell_cabal.js -// _embed/public/ace/src-min/snippets/haxe.js -// _embed/public/ace/src-min/snippets/hjson.js -// _embed/public/ace/src-min/snippets/html.js -// _embed/public/ace/src-min/snippets/html_elixir.js -// _embed/public/ace/src-min/snippets/html_ruby.js -// _embed/public/ace/src-min/snippets/ini.js -// _embed/public/ace/src-min/snippets/io.js -// _embed/public/ace/src-min/snippets/jack.js -// _embed/public/ace/src-min/snippets/jade.js -// _embed/public/ace/src-min/snippets/java.js -// _embed/public/ace/src-min/snippets/javascript.js -// _embed/public/ace/src-min/snippets/json.js -// _embed/public/ace/src-min/snippets/jsoniq.js -// _embed/public/ace/src-min/snippets/jsp.js -// _embed/public/ace/src-min/snippets/jsx.js -// _embed/public/ace/src-min/snippets/julia.js -// _embed/public/ace/src-min/snippets/kotlin.js -// _embed/public/ace/src-min/snippets/latex.js -// _embed/public/ace/src-min/snippets/lean.js -// _embed/public/ace/src-min/snippets/less.js -// _embed/public/ace/src-min/snippets/liquid.js -// _embed/public/ace/src-min/snippets/lisp.js -// _embed/public/ace/src-min/snippets/live_script.js -// _embed/public/ace/src-min/snippets/livescript.js -// _embed/public/ace/src-min/snippets/logiql.js -// _embed/public/ace/src-min/snippets/lsl.js -// _embed/public/ace/src-min/snippets/lua.js -// _embed/public/ace/src-min/snippets/luapage.js -// _embed/public/ace/src-min/snippets/lucene.js -// _embed/public/ace/src-min/snippets/makefile.js -// _embed/public/ace/src-min/snippets/markdown.js -// _embed/public/ace/src-min/snippets/mask.js -// _embed/public/ace/src-min/snippets/matlab.js -// _embed/public/ace/src-min/snippets/maze.js -// _embed/public/ace/src-min/snippets/mel.js -// _embed/public/ace/src-min/snippets/mips_assembler.js -// _embed/public/ace/src-min/snippets/mipsassembler.js -// _embed/public/ace/src-min/snippets/mushcode.js -// _embed/public/ace/src-min/snippets/mysql.js -// _embed/public/ace/src-min/snippets/nix.js -// _embed/public/ace/src-min/snippets/nsis.js -// _embed/public/ace/src-min/snippets/objectivec.js -// _embed/public/ace/src-min/snippets/ocaml.js -// _embed/public/ace/src-min/snippets/pascal.js -// _embed/public/ace/src-min/snippets/perl.js -// _embed/public/ace/src-min/snippets/pgsql.js -// _embed/public/ace/src-min/snippets/php.js -// _embed/public/ace/src-min/snippets/plain_text.js -// _embed/public/ace/src-min/snippets/powershell.js -// _embed/public/ace/src-min/snippets/praat.js -// _embed/public/ace/src-min/snippets/prolog.js -// _embed/public/ace/src-min/snippets/properties.js -// _embed/public/ace/src-min/snippets/protobuf.js -// _embed/public/ace/src-min/snippets/python.js -// _embed/public/ace/src-min/snippets/r.js -// _embed/public/ace/src-min/snippets/razor.js -// _embed/public/ace/src-min/snippets/rdoc.js -// _embed/public/ace/src-min/snippets/rhtml.js -// _embed/public/ace/src-min/snippets/rst.js -// _embed/public/ace/src-min/snippets/ruby.js -// _embed/public/ace/src-min/snippets/rust.js -// _embed/public/ace/src-min/snippets/sass.js -// _embed/public/ace/src-min/snippets/scad.js -// _embed/public/ace/src-min/snippets/scala.js -// _embed/public/ace/src-min/snippets/scheme.js -// _embed/public/ace/src-min/snippets/scss.js -// _embed/public/ace/src-min/snippets/sh.js -// _embed/public/ace/src-min/snippets/sjs.js -// _embed/public/ace/src-min/snippets/smarty.js -// _embed/public/ace/src-min/snippets/snippets.js -// _embed/public/ace/src-min/snippets/soy_template.js -// _embed/public/ace/src-min/snippets/space.js -// _embed/public/ace/src-min/snippets/sql.js -// _embed/public/ace/src-min/snippets/sqlserver.js -// _embed/public/ace/src-min/snippets/stylus.js -// _embed/public/ace/src-min/snippets/svg.js -// _embed/public/ace/src-min/snippets/swift.js -// _embed/public/ace/src-min/snippets/swig.js -// _embed/public/ace/src-min/snippets/tcl.js -// _embed/public/ace/src-min/snippets/tex.js -// _embed/public/ace/src-min/snippets/text.js -// _embed/public/ace/src-min/snippets/textile.js -// _embed/public/ace/src-min/snippets/toml.js -// _embed/public/ace/src-min/snippets/tsx.js -// _embed/public/ace/src-min/snippets/twig.js -// _embed/public/ace/src-min/snippets/typescript.js -// _embed/public/ace/src-min/snippets/vala.js -// _embed/public/ace/src-min/snippets/vbscript.js -// _embed/public/ace/src-min/snippets/velocity.js -// _embed/public/ace/src-min/snippets/verilog.js -// _embed/public/ace/src-min/snippets/vhdl.js -// _embed/public/ace/src-min/snippets/wollok.js -// _embed/public/ace/src-min/snippets/xml.js -// _embed/public/ace/src-min/snippets/xquery.js -// _embed/public/ace/src-min/snippets/yaml.js -// _embed/public/ace/src-min/theme-github.js -// _embed/public/ace/src-min/worker-coffee.js -// _embed/public/ace/src-min/worker-css.js -// _embed/public/ace/src-min/worker-html.js -// _embed/public/ace/src-min/worker-javascript.js -// _embed/public/ace/src-min/worker-json.js -// _embed/public/ace/src-min/worker-lua.js -// _embed/public/ace/src-min/worker-php.js -// _embed/public/ace/src-min/worker-xml.js -// _embed/public/ace/src-min/worker-xquery.js -// DO NOT EDIT! - -package assets - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strings" -) - -// bindataRead reads the given file from disk. It returns an error on failure. -func bindataRead(path, name string) ([]byte, error) { - buf, err := ioutil.ReadFile(path) - if err != nil { - err = fmt.Errorf("Error reading asset %s at %s: %v", name, path, err) - } - return buf, err -} - -type asset struct { - bytes []byte - info os.FileInfo -} - -// templatesBaseTmpl reads file data from disk. It returns an error on failure. -func templatesBaseTmpl() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\base.tmpl" - name := "templates/base.tmpl" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// templatesEditorTmpl reads file data from disk. It returns an error on failure. -func templatesEditorTmpl() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\editor.tmpl" - name := "templates/editor.tmpl" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// templatesFrontmatterTmpl reads file data from disk. It returns an error on failure. -func templatesFrontmatterTmpl() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\frontmatter.tmpl" - name := "templates/frontmatter.tmpl" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// templatesListingTmpl reads file data from disk. It returns an error on failure. -func templatesListingTmpl() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\listing.tmpl" - name := "templates/listing.tmpl" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// templatesMinimalTmpl reads file data from disk. It returns an error on failure. -func templatesMinimalTmpl() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\minimal.tmpl" - name := "templates/minimal.tmpl" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// templatesSingleTmpl reads file data from disk. It returns an error on failure. -func templatesSingleTmpl() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\templates\\single.tmpl" - name := "templates/single.tmpl" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicJsCommonJs reads file data from disk. It returns an error on failure. -func publicJsCommonJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\js\\common.js" - name := "public/js/common.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicJsEditorJs reads file data from disk. It returns an error on failure. -func publicJsEditorJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\js\\editor.js" - name := "public/js/editor.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicJsForm2jsJs reads file data from disk. It returns an error on failure. -func publicJsForm2jsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\js\\form2js.js" - name := "public/js/form2js.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicJsListingJs reads file data from disk. It returns an error on failure. -func publicJsListingJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\js\\listing.js" - name := "public/js/listing.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssFontsCss reads file data from disk. It returns an error on failure. -func publicCssFontsCss() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\fonts.css" - name := "public/css/fonts.css" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssMaterialIconsWoff2 reads file data from disk. It returns an error on failure. -func publicCssMaterialIconsWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\material\\icons.woff2" - name := "public/css/material/icons.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssNormalizeCss reads file data from disk. It returns an error on failure. -func publicCssNormalizeCss() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\normalize.css" - name := "public/css/normalize.css" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoMediumCyrillicExtWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoMediumCyrillicExtWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-cyrillic-ext.woff2" - name := "public/css/roboto/medium-cyrillic-ext.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoMediumCyrillicWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoMediumCyrillicWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-cyrillic.woff2" - name := "public/css/roboto/medium-cyrillic.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoMediumGreekExtWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoMediumGreekExtWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-greek-ext.woff2" - name := "public/css/roboto/medium-greek-ext.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoMediumGreekWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoMediumGreekWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-greek.woff2" - name := "public/css/roboto/medium-greek.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoMediumLatinExtWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoMediumLatinExtWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-latin-ext.woff2" - name := "public/css/roboto/medium-latin-ext.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoMediumLatinWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoMediumLatinWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-latin.woff2" - name := "public/css/roboto/medium-latin.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoMediumVietnameseWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoMediumVietnameseWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\medium-vietnamese.woff2" - name := "public/css/roboto/medium-vietnamese.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoNormalCyrillicExtWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoNormalCyrillicExtWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-cyrillic-ext.woff2" - name := "public/css/roboto/normal-cyrillic-ext.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoNormalCyrillicWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoNormalCyrillicWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-cyrillic.woff2" - name := "public/css/roboto/normal-cyrillic.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoNormalGreekExtWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoNormalGreekExtWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-greek-ext.woff2" - name := "public/css/roboto/normal-greek-ext.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoNormalGreekWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoNormalGreekWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-greek.woff2" - name := "public/css/roboto/normal-greek.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoNormalLatinExtWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoNormalLatinExtWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-latin-ext.woff2" - name := "public/css/roboto/normal-latin-ext.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoNormalLatinWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoNormalLatinWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-latin.woff2" - name := "public/css/roboto/normal-latin.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssRobotoNormalVietnameseWoff2 reads file data from disk. It returns an error on failure. -func publicCssRobotoNormalVietnameseWoff2() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\roboto\\normal-vietnamese.woff2" - name := "public/css/roboto/normal-vietnamese.woff2" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicCssStylesCss reads file data from disk. It returns an error on failure. -func publicCssStylesCss() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\css\\styles.css" - name := "public/css/styles.css" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinAceJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinAceJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ace.js" - name := "public/ace/src-min/ace.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtBeautifyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtBeautifyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-beautify.js" - name := "public/ace/src-min/ext-beautify.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtChromevoxJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtChromevoxJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-chromevox.js" - name := "public/ace/src-min/ext-chromevox.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtElastic_tabstops_liteJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtElastic_tabstops_liteJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-elastic_tabstops_lite.js" - name := "public/ace/src-min/ext-elastic_tabstops_lite.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtEmmetJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtEmmetJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-emmet.js" - name := "public/ace/src-min/ext-emmet.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtError_markerJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtError_markerJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-error_marker.js" - name := "public/ace/src-min/ext-error_marker.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtKeybinding_menuJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtKeybinding_menuJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-keybinding_menu.js" - name := "public/ace/src-min/ext-keybinding_menu.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtLanguage_toolsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtLanguage_toolsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-language_tools.js" - name := "public/ace/src-min/ext-language_tools.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtLinkingJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtLinkingJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-linking.js" - name := "public/ace/src-min/ext-linking.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtModelistJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtModelistJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-modelist.js" - name := "public/ace/src-min/ext-modelist.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtOld_ieJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtOld_ieJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-old_ie.js" - name := "public/ace/src-min/ext-old_ie.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtSearchboxJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtSearchboxJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-searchbox.js" - name := "public/ace/src-min/ext-searchbox.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtSettings_menuJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtSettings_menuJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-settings_menu.js" - name := "public/ace/src-min/ext-settings_menu.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtSpellcheckJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtSpellcheckJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-spellcheck.js" - name := "public/ace/src-min/ext-spellcheck.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtSplitJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtSplitJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-split.js" - name := "public/ace/src-min/ext-split.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtStatic_highlightJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtStatic_highlightJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-static_highlight.js" - name := "public/ace/src-min/ext-static_highlight.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtStatusbarJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtStatusbarJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-statusbar.js" - name := "public/ace/src-min/ext-statusbar.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtTextareaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtTextareaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-textarea.js" - name := "public/ace/src-min/ext-textarea.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtThemelistJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtThemelistJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-themelist.js" - name := "public/ace/src-min/ext-themelist.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinExtWhitespaceJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinExtWhitespaceJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\ext-whitespace.js" - name := "public/ace/src-min/ext-whitespace.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinKeybindingEmacsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinKeybindingEmacsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\keybinding-emacs.js" - name := "public/ace/src-min/keybinding-emacs.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinKeybindingVimJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinKeybindingVimJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\keybinding-vim.js" - name := "public/ace/src-min/keybinding-vim.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeAbapJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeAbapJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-abap.js" - name := "public/ace/src-min/mode-abap.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeAbcJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeAbcJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-abc.js" - name := "public/ace/src-min/mode-abc.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeActionscriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeActionscriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-actionscript.js" - name := "public/ace/src-min/mode-actionscript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeAdaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeAdaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ada.js" - name := "public/ace/src-min/mode-ada.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeApache_confJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeApache_confJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-apache_conf.js" - name := "public/ace/src-min/mode-apache_conf.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeApplescriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeApplescriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-applescript.js" - name := "public/ace/src-min/mode-applescript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeAsciidocJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeAsciidocJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-asciidoc.js" - name := "public/ace/src-min/mode-asciidoc.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeAssembly_x86Js reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeAssembly_x86Js() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-assembly_x86.js" - name := "public/ace/src-min/mode-assembly_x86.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeAutohotkeyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeAutohotkeyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-autohotkey.js" - name := "public/ace/src-min/mode-autohotkey.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeBatchfileJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeBatchfileJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-batchfile.js" - name := "public/ace/src-min/mode-batchfile.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeBroJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeBroJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-bro.js" - name := "public/ace/src-min/mode-bro.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeC9searchJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeC9searchJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-c9search.js" - name := "public/ace/src-min/mode-c9search.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeC_cppJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeC_cppJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-c_cpp.js" - name := "public/ace/src-min/mode-c_cpp.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeCirruJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeCirruJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-cirru.js" - name := "public/ace/src-min/mode-cirru.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeClojureJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeClojureJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-clojure.js" - name := "public/ace/src-min/mode-clojure.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeCobolJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeCobolJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-cobol.js" - name := "public/ace/src-min/mode-cobol.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeCoffeeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeCoffeeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-coffee.js" - name := "public/ace/src-min/mode-coffee.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeColdfusionJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeColdfusionJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-coldfusion.js" - name := "public/ace/src-min/mode-coldfusion.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeCsharpJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeCsharpJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-csharp.js" - name := "public/ace/src-min/mode-csharp.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeCssJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeCssJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-css.js" - name := "public/ace/src-min/mode-css.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeCurlyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeCurlyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-curly.js" - name := "public/ace/src-min/mode-curly.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeDJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeDJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-d.js" - name := "public/ace/src-min/mode-d.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeDartJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeDartJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-dart.js" - name := "public/ace/src-min/mode-dart.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeDiffJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeDiffJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-diff.js" - name := "public/ace/src-min/mode-diff.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeDjangoJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeDjangoJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-django.js" - name := "public/ace/src-min/mode-django.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeDockerfileJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeDockerfileJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-dockerfile.js" - name := "public/ace/src-min/mode-dockerfile.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeDotJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeDotJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-dot.js" - name := "public/ace/src-min/mode-dot.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeDroolsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeDroolsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-drools.js" - name := "public/ace/src-min/mode-drools.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeEiffelJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeEiffelJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-eiffel.js" - name := "public/ace/src-min/mode-eiffel.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeEjsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeEjsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ejs.js" - name := "public/ace/src-min/mode-ejs.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeElixirJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeElixirJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-elixir.js" - name := "public/ace/src-min/mode-elixir.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeElmJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeElmJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-elm.js" - name := "public/ace/src-min/mode-elm.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeErlangJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeErlangJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-erlang.js" - name := "public/ace/src-min/mode-erlang.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeForthJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeForthJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-forth.js" - name := "public/ace/src-min/mode-forth.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeFortranJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeFortranJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-fortran.js" - name := "public/ace/src-min/mode-fortran.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeFtlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeFtlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ftl.js" - name := "public/ace/src-min/mode-ftl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeGcodeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeGcodeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-gcode.js" - name := "public/ace/src-min/mode-gcode.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeGherkinJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeGherkinJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-gherkin.js" - name := "public/ace/src-min/mode-gherkin.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeGitignoreJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeGitignoreJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-gitignore.js" - name := "public/ace/src-min/mode-gitignore.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeGlslJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeGlslJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-glsl.js" - name := "public/ace/src-min/mode-glsl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeGobstonesJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeGobstonesJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-gobstones.js" - name := "public/ace/src-min/mode-gobstones.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeGolangJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeGolangJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-golang.js" - name := "public/ace/src-min/mode-golang.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeGroovyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeGroovyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-groovy.js" - name := "public/ace/src-min/mode-groovy.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeHamlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeHamlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-haml.js" - name := "public/ace/src-min/mode-haml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeHandlebarsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeHandlebarsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-handlebars.js" - name := "public/ace/src-min/mode-handlebars.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeHaskellJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeHaskellJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-haskell.js" - name := "public/ace/src-min/mode-haskell.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeHaskell_cabalJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeHaskell_cabalJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-haskell_cabal.js" - name := "public/ace/src-min/mode-haskell_cabal.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeHaxeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeHaxeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-haxe.js" - name := "public/ace/src-min/mode-haxe.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeHjsonJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeHjsonJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-hjson.js" - name := "public/ace/src-min/mode-hjson.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeHtmlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeHtmlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-html.js" - name := "public/ace/src-min/mode-html.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeHtml_elixirJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeHtml_elixirJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-html_elixir.js" - name := "public/ace/src-min/mode-html_elixir.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeHtml_rubyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeHtml_rubyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-html_ruby.js" - name := "public/ace/src-min/mode-html_ruby.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeIniJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeIniJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ini.js" - name := "public/ace/src-min/mode-ini.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeIoJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeIoJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-io.js" - name := "public/ace/src-min/mode-io.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeJackJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeJackJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-jack.js" - name := "public/ace/src-min/mode-jack.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeJadeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeJadeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-jade.js" - name := "public/ace/src-min/mode-jade.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeJavaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeJavaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-java.js" - name := "public/ace/src-min/mode-java.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeJavascriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeJavascriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-javascript.js" - name := "public/ace/src-min/mode-javascript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeJsonJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeJsonJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-json.js" - name := "public/ace/src-min/mode-json.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeJsoniqJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeJsoniqJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-jsoniq.js" - name := "public/ace/src-min/mode-jsoniq.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeJspJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeJspJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-jsp.js" - name := "public/ace/src-min/mode-jsp.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeJsxJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeJsxJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-jsx.js" - name := "public/ace/src-min/mode-jsx.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeJuliaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeJuliaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-julia.js" - name := "public/ace/src-min/mode-julia.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeKotlinJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeKotlinJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-kotlin.js" - name := "public/ace/src-min/mode-kotlin.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLatexJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLatexJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-latex.js" - name := "public/ace/src-min/mode-latex.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLeanJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLeanJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-lean.js" - name := "public/ace/src-min/mode-lean.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLessJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLessJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-less.js" - name := "public/ace/src-min/mode-less.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLiquidJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLiquidJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-liquid.js" - name := "public/ace/src-min/mode-liquid.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLispJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLispJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-lisp.js" - name := "public/ace/src-min/mode-lisp.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLive_scriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLive_scriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-live_script.js" - name := "public/ace/src-min/mode-live_script.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLivescriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLivescriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-livescript.js" - name := "public/ace/src-min/mode-livescript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLogiqlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLogiqlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-logiql.js" - name := "public/ace/src-min/mode-logiql.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLslJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLslJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-lsl.js" - name := "public/ace/src-min/mode-lsl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLuaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLuaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-lua.js" - name := "public/ace/src-min/mode-lua.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLuapageJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLuapageJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-luapage.js" - name := "public/ace/src-min/mode-luapage.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeLuceneJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeLuceneJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-lucene.js" - name := "public/ace/src-min/mode-lucene.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeMakefileJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeMakefileJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-makefile.js" - name := "public/ace/src-min/mode-makefile.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeMarkdownJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeMarkdownJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-markdown.js" - name := "public/ace/src-min/mode-markdown.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeMaskJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeMaskJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mask.js" - name := "public/ace/src-min/mode-mask.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeMatlabJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeMatlabJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-matlab.js" - name := "public/ace/src-min/mode-matlab.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeMazeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeMazeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-maze.js" - name := "public/ace/src-min/mode-maze.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeMelJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeMelJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mel.js" - name := "public/ace/src-min/mode-mel.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeMips_assemblerJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeMips_assemblerJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mips_assembler.js" - name := "public/ace/src-min/mode-mips_assembler.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeMipsassemblerJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeMipsassemblerJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mipsassembler.js" - name := "public/ace/src-min/mode-mipsassembler.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeMushcodeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeMushcodeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mushcode.js" - name := "public/ace/src-min/mode-mushcode.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeMysqlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeMysqlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-mysql.js" - name := "public/ace/src-min/mode-mysql.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeNixJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeNixJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-nix.js" - name := "public/ace/src-min/mode-nix.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeNsisJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeNsisJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-nsis.js" - name := "public/ace/src-min/mode-nsis.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeObjectivecJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeObjectivecJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-objectivec.js" - name := "public/ace/src-min/mode-objectivec.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeOcamlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeOcamlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ocaml.js" - name := "public/ace/src-min/mode-ocaml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModePascalJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModePascalJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-pascal.js" - name := "public/ace/src-min/mode-pascal.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModePerlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModePerlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-perl.js" - name := "public/ace/src-min/mode-perl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModePgsqlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModePgsqlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-pgsql.js" - name := "public/ace/src-min/mode-pgsql.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModePhpJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModePhpJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-php.js" - name := "public/ace/src-min/mode-php.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModePlain_textJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModePlain_textJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-plain_text.js" - name := "public/ace/src-min/mode-plain_text.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModePowershellJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModePowershellJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-powershell.js" - name := "public/ace/src-min/mode-powershell.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModePraatJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModePraatJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-praat.js" - name := "public/ace/src-min/mode-praat.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModePrologJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModePrologJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-prolog.js" - name := "public/ace/src-min/mode-prolog.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModePropertiesJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModePropertiesJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-properties.js" - name := "public/ace/src-min/mode-properties.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeProtobufJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeProtobufJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-protobuf.js" - name := "public/ace/src-min/mode-protobuf.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModePythonJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModePythonJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-python.js" - name := "public/ace/src-min/mode-python.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeRJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeRJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-r.js" - name := "public/ace/src-min/mode-r.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeRazorJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeRazorJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-razor.js" - name := "public/ace/src-min/mode-razor.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeRdocJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeRdocJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-rdoc.js" - name := "public/ace/src-min/mode-rdoc.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeRhtmlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeRhtmlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-rhtml.js" - name := "public/ace/src-min/mode-rhtml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeRstJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeRstJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-rst.js" - name := "public/ace/src-min/mode-rst.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeRubyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeRubyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-ruby.js" - name := "public/ace/src-min/mode-ruby.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeRustJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeRustJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-rust.js" - name := "public/ace/src-min/mode-rust.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSassJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSassJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-sass.js" - name := "public/ace/src-min/mode-sass.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeScadJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeScadJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-scad.js" - name := "public/ace/src-min/mode-scad.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeScalaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeScalaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-scala.js" - name := "public/ace/src-min/mode-scala.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSchemeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSchemeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-scheme.js" - name := "public/ace/src-min/mode-scheme.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeScssJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeScssJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-scss.js" - name := "public/ace/src-min/mode-scss.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeShJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeShJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-sh.js" - name := "public/ace/src-min/mode-sh.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSjsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSjsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-sjs.js" - name := "public/ace/src-min/mode-sjs.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSmartyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSmartyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-smarty.js" - name := "public/ace/src-min/mode-smarty.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSnippetsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSnippetsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-snippets.js" - name := "public/ace/src-min/mode-snippets.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSoy_templateJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSoy_templateJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-soy_template.js" - name := "public/ace/src-min/mode-soy_template.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSpaceJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSpaceJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-space.js" - name := "public/ace/src-min/mode-space.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSqlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSqlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-sql.js" - name := "public/ace/src-min/mode-sql.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSqlserverJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSqlserverJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-sqlserver.js" - name := "public/ace/src-min/mode-sqlserver.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeStylusJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeStylusJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-stylus.js" - name := "public/ace/src-min/mode-stylus.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSvgJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSvgJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-svg.js" - name := "public/ace/src-min/mode-svg.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSwiftJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSwiftJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-swift.js" - name := "public/ace/src-min/mode-swift.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeSwigJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeSwigJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-swig.js" - name := "public/ace/src-min/mode-swig.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeTclJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeTclJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-tcl.js" - name := "public/ace/src-min/mode-tcl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeTexJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeTexJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-tex.js" - name := "public/ace/src-min/mode-tex.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeTextJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeTextJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-text.js" - name := "public/ace/src-min/mode-text.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeTextileJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeTextileJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-textile.js" - name := "public/ace/src-min/mode-textile.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeTomlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeTomlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-toml.js" - name := "public/ace/src-min/mode-toml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeTsxJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeTsxJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-tsx.js" - name := "public/ace/src-min/mode-tsx.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeTwigJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeTwigJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-twig.js" - name := "public/ace/src-min/mode-twig.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeTypescriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeTypescriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-typescript.js" - name := "public/ace/src-min/mode-typescript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeValaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeValaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-vala.js" - name := "public/ace/src-min/mode-vala.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeVbscriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeVbscriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-vbscript.js" - name := "public/ace/src-min/mode-vbscript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeVelocityJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeVelocityJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-velocity.js" - name := "public/ace/src-min/mode-velocity.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeVerilogJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeVerilogJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-verilog.js" - name := "public/ace/src-min/mode-verilog.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeVhdlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeVhdlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-vhdl.js" - name := "public/ace/src-min/mode-vhdl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeWollokJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeWollokJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-wollok.js" - name := "public/ace/src-min/mode-wollok.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeXmlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeXmlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-xml.js" - name := "public/ace/src-min/mode-xml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeXqueryJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeXqueryJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-xquery.js" - name := "public/ace/src-min/mode-xquery.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinModeYamlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinModeYamlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\mode-yaml.js" - name := "public/ace/src-min/mode-yaml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsAbapJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsAbapJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\abap.js" - name := "public/ace/src-min/snippets/abap.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsAbcJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsAbcJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\abc.js" - name := "public/ace/src-min/snippets/abc.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsActionscriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsActionscriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\actionscript.js" - name := "public/ace/src-min/snippets/actionscript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsAdaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsAdaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ada.js" - name := "public/ace/src-min/snippets/ada.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsApache_confJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsApache_confJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\apache_conf.js" - name := "public/ace/src-min/snippets/apache_conf.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsApplescriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsApplescriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\applescript.js" - name := "public/ace/src-min/snippets/applescript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsAsciidocJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsAsciidocJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\asciidoc.js" - name := "public/ace/src-min/snippets/asciidoc.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsAssembly_x86Js reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsAssembly_x86Js() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\assembly_x86.js" - name := "public/ace/src-min/snippets/assembly_x86.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsAutohotkeyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsAutohotkeyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\autohotkey.js" - name := "public/ace/src-min/snippets/autohotkey.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsBatchfileJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsBatchfileJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\batchfile.js" - name := "public/ace/src-min/snippets/batchfile.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsBroJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsBroJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\bro.js" - name := "public/ace/src-min/snippets/bro.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsC9searchJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsC9searchJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\c9search.js" - name := "public/ace/src-min/snippets/c9search.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsC_cppJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsC_cppJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\c_cpp.js" - name := "public/ace/src-min/snippets/c_cpp.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsCirruJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsCirruJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\cirru.js" - name := "public/ace/src-min/snippets/cirru.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsClojureJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsClojureJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\clojure.js" - name := "public/ace/src-min/snippets/clojure.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsCobolJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsCobolJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\cobol.js" - name := "public/ace/src-min/snippets/cobol.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsCoffeeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsCoffeeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\coffee.js" - name := "public/ace/src-min/snippets/coffee.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsColdfusionJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsColdfusionJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\coldfusion.js" - name := "public/ace/src-min/snippets/coldfusion.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsCsharpJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsCsharpJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\csharp.js" - name := "public/ace/src-min/snippets/csharp.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsCssJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsCssJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\css.js" - name := "public/ace/src-min/snippets/css.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsCurlyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsCurlyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\curly.js" - name := "public/ace/src-min/snippets/curly.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsDJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsDJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\d.js" - name := "public/ace/src-min/snippets/d.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsDartJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsDartJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\dart.js" - name := "public/ace/src-min/snippets/dart.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsDiffJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsDiffJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\diff.js" - name := "public/ace/src-min/snippets/diff.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsDjangoJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsDjangoJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\django.js" - name := "public/ace/src-min/snippets/django.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsDockerfileJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsDockerfileJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\dockerfile.js" - name := "public/ace/src-min/snippets/dockerfile.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsDotJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsDotJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\dot.js" - name := "public/ace/src-min/snippets/dot.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsDroolsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsDroolsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\drools.js" - name := "public/ace/src-min/snippets/drools.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsEiffelJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsEiffelJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\eiffel.js" - name := "public/ace/src-min/snippets/eiffel.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsEjsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsEjsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ejs.js" - name := "public/ace/src-min/snippets/ejs.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsElixirJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsElixirJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\elixir.js" - name := "public/ace/src-min/snippets/elixir.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsElmJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsElmJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\elm.js" - name := "public/ace/src-min/snippets/elm.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsErlangJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsErlangJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\erlang.js" - name := "public/ace/src-min/snippets/erlang.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsForthJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsForthJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\forth.js" - name := "public/ace/src-min/snippets/forth.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsFortranJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsFortranJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\fortran.js" - name := "public/ace/src-min/snippets/fortran.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsFtlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsFtlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ftl.js" - name := "public/ace/src-min/snippets/ftl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsGcodeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsGcodeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\gcode.js" - name := "public/ace/src-min/snippets/gcode.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsGherkinJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsGherkinJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\gherkin.js" - name := "public/ace/src-min/snippets/gherkin.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsGitignoreJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsGitignoreJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\gitignore.js" - name := "public/ace/src-min/snippets/gitignore.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsGlslJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsGlslJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\glsl.js" - name := "public/ace/src-min/snippets/glsl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsGobstonesJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsGobstonesJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\gobstones.js" - name := "public/ace/src-min/snippets/gobstones.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsGolangJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsGolangJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\golang.js" - name := "public/ace/src-min/snippets/golang.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsGroovyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsGroovyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\groovy.js" - name := "public/ace/src-min/snippets/groovy.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsHamlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsHamlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\haml.js" - name := "public/ace/src-min/snippets/haml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsHandlebarsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsHandlebarsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\handlebars.js" - name := "public/ace/src-min/snippets/handlebars.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsHaskellJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsHaskellJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\haskell.js" - name := "public/ace/src-min/snippets/haskell.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsHaskell_cabalJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsHaskell_cabalJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\haskell_cabal.js" - name := "public/ace/src-min/snippets/haskell_cabal.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsHaxeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsHaxeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\haxe.js" - name := "public/ace/src-min/snippets/haxe.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsHjsonJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsHjsonJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\hjson.js" - name := "public/ace/src-min/snippets/hjson.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsHtmlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsHtmlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\html.js" - name := "public/ace/src-min/snippets/html.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsHtml_elixirJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsHtml_elixirJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\html_elixir.js" - name := "public/ace/src-min/snippets/html_elixir.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsHtml_rubyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsHtml_rubyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\html_ruby.js" - name := "public/ace/src-min/snippets/html_ruby.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsIniJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsIniJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ini.js" - name := "public/ace/src-min/snippets/ini.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsIoJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsIoJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\io.js" - name := "public/ace/src-min/snippets/io.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsJackJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsJackJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\jack.js" - name := "public/ace/src-min/snippets/jack.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsJadeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsJadeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\jade.js" - name := "public/ace/src-min/snippets/jade.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsJavaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsJavaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\java.js" - name := "public/ace/src-min/snippets/java.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsJavascriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsJavascriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\javascript.js" - name := "public/ace/src-min/snippets/javascript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsJsonJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsJsonJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\json.js" - name := "public/ace/src-min/snippets/json.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsJsoniqJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsJsoniqJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\jsoniq.js" - name := "public/ace/src-min/snippets/jsoniq.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsJspJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsJspJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\jsp.js" - name := "public/ace/src-min/snippets/jsp.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsJsxJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsJsxJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\jsx.js" - name := "public/ace/src-min/snippets/jsx.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsJuliaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsJuliaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\julia.js" - name := "public/ace/src-min/snippets/julia.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsKotlinJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsKotlinJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\kotlin.js" - name := "public/ace/src-min/snippets/kotlin.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLatexJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLatexJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\latex.js" - name := "public/ace/src-min/snippets/latex.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLeanJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLeanJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\lean.js" - name := "public/ace/src-min/snippets/lean.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLessJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLessJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\less.js" - name := "public/ace/src-min/snippets/less.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLiquidJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLiquidJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\liquid.js" - name := "public/ace/src-min/snippets/liquid.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLispJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLispJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\lisp.js" - name := "public/ace/src-min/snippets/lisp.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLive_scriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLive_scriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\live_script.js" - name := "public/ace/src-min/snippets/live_script.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLivescriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLivescriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\livescript.js" - name := "public/ace/src-min/snippets/livescript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLogiqlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLogiqlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\logiql.js" - name := "public/ace/src-min/snippets/logiql.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLslJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLslJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\lsl.js" - name := "public/ace/src-min/snippets/lsl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLuaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLuaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\lua.js" - name := "public/ace/src-min/snippets/lua.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLuapageJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLuapageJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\luapage.js" - name := "public/ace/src-min/snippets/luapage.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsLuceneJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsLuceneJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\lucene.js" - name := "public/ace/src-min/snippets/lucene.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsMakefileJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsMakefileJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\makefile.js" - name := "public/ace/src-min/snippets/makefile.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsMarkdownJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsMarkdownJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\markdown.js" - name := "public/ace/src-min/snippets/markdown.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsMaskJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsMaskJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mask.js" - name := "public/ace/src-min/snippets/mask.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsMatlabJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsMatlabJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\matlab.js" - name := "public/ace/src-min/snippets/matlab.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsMazeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsMazeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\maze.js" - name := "public/ace/src-min/snippets/maze.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsMelJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsMelJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mel.js" - name := "public/ace/src-min/snippets/mel.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsMips_assemblerJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsMips_assemblerJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mips_assembler.js" - name := "public/ace/src-min/snippets/mips_assembler.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsMipsassemblerJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsMipsassemblerJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mipsassembler.js" - name := "public/ace/src-min/snippets/mipsassembler.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsMushcodeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsMushcodeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mushcode.js" - name := "public/ace/src-min/snippets/mushcode.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsMysqlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsMysqlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\mysql.js" - name := "public/ace/src-min/snippets/mysql.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsNixJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsNixJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\nix.js" - name := "public/ace/src-min/snippets/nix.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsNsisJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsNsisJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\nsis.js" - name := "public/ace/src-min/snippets/nsis.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsObjectivecJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsObjectivecJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\objectivec.js" - name := "public/ace/src-min/snippets/objectivec.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsOcamlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsOcamlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ocaml.js" - name := "public/ace/src-min/snippets/ocaml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsPascalJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsPascalJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\pascal.js" - name := "public/ace/src-min/snippets/pascal.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsPerlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsPerlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\perl.js" - name := "public/ace/src-min/snippets/perl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsPgsqlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsPgsqlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\pgsql.js" - name := "public/ace/src-min/snippets/pgsql.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsPhpJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsPhpJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\php.js" - name := "public/ace/src-min/snippets/php.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsPlain_textJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsPlain_textJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\plain_text.js" - name := "public/ace/src-min/snippets/plain_text.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsPowershellJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsPowershellJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\powershell.js" - name := "public/ace/src-min/snippets/powershell.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsPraatJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsPraatJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\praat.js" - name := "public/ace/src-min/snippets/praat.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsPrologJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsPrologJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\prolog.js" - name := "public/ace/src-min/snippets/prolog.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsPropertiesJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsPropertiesJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\properties.js" - name := "public/ace/src-min/snippets/properties.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsProtobufJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsProtobufJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\protobuf.js" - name := "public/ace/src-min/snippets/protobuf.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsPythonJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsPythonJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\python.js" - name := "public/ace/src-min/snippets/python.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsRJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsRJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\r.js" - name := "public/ace/src-min/snippets/r.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsRazorJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsRazorJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\razor.js" - name := "public/ace/src-min/snippets/razor.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsRdocJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsRdocJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\rdoc.js" - name := "public/ace/src-min/snippets/rdoc.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsRhtmlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsRhtmlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\rhtml.js" - name := "public/ace/src-min/snippets/rhtml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsRstJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsRstJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\rst.js" - name := "public/ace/src-min/snippets/rst.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsRubyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsRubyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\ruby.js" - name := "public/ace/src-min/snippets/ruby.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsRustJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsRustJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\rust.js" - name := "public/ace/src-min/snippets/rust.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSassJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSassJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\sass.js" - name := "public/ace/src-min/snippets/sass.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsScadJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsScadJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\scad.js" - name := "public/ace/src-min/snippets/scad.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsScalaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsScalaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\scala.js" - name := "public/ace/src-min/snippets/scala.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSchemeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSchemeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\scheme.js" - name := "public/ace/src-min/snippets/scheme.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsScssJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsScssJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\scss.js" - name := "public/ace/src-min/snippets/scss.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsShJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsShJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\sh.js" - name := "public/ace/src-min/snippets/sh.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSjsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSjsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\sjs.js" - name := "public/ace/src-min/snippets/sjs.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSmartyJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSmartyJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\smarty.js" - name := "public/ace/src-min/snippets/smarty.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSnippetsJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSnippetsJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\snippets.js" - name := "public/ace/src-min/snippets/snippets.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSoy_templateJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSoy_templateJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\soy_template.js" - name := "public/ace/src-min/snippets/soy_template.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSpaceJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSpaceJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\space.js" - name := "public/ace/src-min/snippets/space.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSqlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSqlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\sql.js" - name := "public/ace/src-min/snippets/sql.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSqlserverJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSqlserverJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\sqlserver.js" - name := "public/ace/src-min/snippets/sqlserver.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsStylusJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsStylusJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\stylus.js" - name := "public/ace/src-min/snippets/stylus.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSvgJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSvgJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\svg.js" - name := "public/ace/src-min/snippets/svg.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSwiftJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSwiftJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\swift.js" - name := "public/ace/src-min/snippets/swift.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsSwigJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsSwigJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\swig.js" - name := "public/ace/src-min/snippets/swig.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsTclJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsTclJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\tcl.js" - name := "public/ace/src-min/snippets/tcl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsTexJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsTexJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\tex.js" - name := "public/ace/src-min/snippets/tex.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsTextJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsTextJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\text.js" - name := "public/ace/src-min/snippets/text.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsTextileJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsTextileJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\textile.js" - name := "public/ace/src-min/snippets/textile.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsTomlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsTomlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\toml.js" - name := "public/ace/src-min/snippets/toml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsTsxJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsTsxJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\tsx.js" - name := "public/ace/src-min/snippets/tsx.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsTwigJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsTwigJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\twig.js" - name := "public/ace/src-min/snippets/twig.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsTypescriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsTypescriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\typescript.js" - name := "public/ace/src-min/snippets/typescript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsValaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsValaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\vala.js" - name := "public/ace/src-min/snippets/vala.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsVbscriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsVbscriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\vbscript.js" - name := "public/ace/src-min/snippets/vbscript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsVelocityJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsVelocityJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\velocity.js" - name := "public/ace/src-min/snippets/velocity.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsVerilogJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsVerilogJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\verilog.js" - name := "public/ace/src-min/snippets/verilog.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsVhdlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsVhdlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\vhdl.js" - name := "public/ace/src-min/snippets/vhdl.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsWollokJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsWollokJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\wollok.js" - name := "public/ace/src-min/snippets/wollok.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsXmlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsXmlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\xml.js" - name := "public/ace/src-min/snippets/xml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsXqueryJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsXqueryJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\xquery.js" - name := "public/ace/src-min/snippets/xquery.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinSnippetsYamlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinSnippetsYamlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\snippets\\yaml.js" - name := "public/ace/src-min/snippets/yaml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinThemeGithubJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinThemeGithubJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\theme-github.js" - name := "public/ace/src-min/theme-github.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinWorkerCoffeeJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinWorkerCoffeeJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-coffee.js" - name := "public/ace/src-min/worker-coffee.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinWorkerCssJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinWorkerCssJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-css.js" - name := "public/ace/src-min/worker-css.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinWorkerHtmlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinWorkerHtmlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-html.js" - name := "public/ace/src-min/worker-html.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinWorkerJavascriptJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinWorkerJavascriptJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-javascript.js" - name := "public/ace/src-min/worker-javascript.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinWorkerJsonJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinWorkerJsonJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-json.js" - name := "public/ace/src-min/worker-json.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinWorkerLuaJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinWorkerLuaJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-lua.js" - name := "public/ace/src-min/worker-lua.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinWorkerPhpJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinWorkerPhpJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-php.js" - name := "public/ace/src-min/worker-php.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinWorkerXmlJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinWorkerXmlJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-xml.js" - name := "public/ace/src-min/worker-xml.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// publicAceSrcMinWorkerXqueryJs reads file data from disk. It returns an error on failure. -func publicAceSrcMinWorkerXqueryJs() (*asset, error) { - path := "D:\\Code\\Go\\src\\github.com\\hacdias\\filemanager\\_embed\\public\\ace\\src-min\\worker-xquery.js" - name := "public/ace/src-min/worker-xquery.js" - bytes, err := bindataRead(path, name) - if err != nil { - return nil, err - } - - fi, err := os.Stat(path) - if err != nil { - err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err) - } - - a := &asset{bytes: bytes, info: fi} - return a, err -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "templates/base.tmpl": templatesBaseTmpl, - "templates/editor.tmpl": templatesEditorTmpl, - "templates/frontmatter.tmpl": templatesFrontmatterTmpl, - "templates/listing.tmpl": templatesListingTmpl, - "templates/minimal.tmpl": templatesMinimalTmpl, - "templates/single.tmpl": templatesSingleTmpl, - "public/js/common.js": publicJsCommonJs, - "public/js/editor.js": publicJsEditorJs, - "public/js/form2js.js": publicJsForm2jsJs, - "public/js/listing.js": publicJsListingJs, - "public/css/fonts.css": publicCssFontsCss, - "public/css/material/icons.woff2": publicCssMaterialIconsWoff2, - "public/css/normalize.css": publicCssNormalizeCss, - "public/css/roboto/medium-cyrillic-ext.woff2": publicCssRobotoMediumCyrillicExtWoff2, - "public/css/roboto/medium-cyrillic.woff2": publicCssRobotoMediumCyrillicWoff2, - "public/css/roboto/medium-greek-ext.woff2": publicCssRobotoMediumGreekExtWoff2, - "public/css/roboto/medium-greek.woff2": publicCssRobotoMediumGreekWoff2, - "public/css/roboto/medium-latin-ext.woff2": publicCssRobotoMediumLatinExtWoff2, - "public/css/roboto/medium-latin.woff2": publicCssRobotoMediumLatinWoff2, - "public/css/roboto/medium-vietnamese.woff2": publicCssRobotoMediumVietnameseWoff2, - "public/css/roboto/normal-cyrillic-ext.woff2": publicCssRobotoNormalCyrillicExtWoff2, - "public/css/roboto/normal-cyrillic.woff2": publicCssRobotoNormalCyrillicWoff2, - "public/css/roboto/normal-greek-ext.woff2": publicCssRobotoNormalGreekExtWoff2, - "public/css/roboto/normal-greek.woff2": publicCssRobotoNormalGreekWoff2, - "public/css/roboto/normal-latin-ext.woff2": publicCssRobotoNormalLatinExtWoff2, - "public/css/roboto/normal-latin.woff2": publicCssRobotoNormalLatinWoff2, - "public/css/roboto/normal-vietnamese.woff2": publicCssRobotoNormalVietnameseWoff2, - "public/css/styles.css": publicCssStylesCss, - "public/ace/src-min/ace.js": publicAceSrcMinAceJs, - "public/ace/src-min/ext-beautify.js": publicAceSrcMinExtBeautifyJs, - "public/ace/src-min/ext-chromevox.js": publicAceSrcMinExtChromevoxJs, - "public/ace/src-min/ext-elastic_tabstops_lite.js": publicAceSrcMinExtElastic_tabstops_liteJs, - "public/ace/src-min/ext-emmet.js": publicAceSrcMinExtEmmetJs, - "public/ace/src-min/ext-error_marker.js": publicAceSrcMinExtError_markerJs, - "public/ace/src-min/ext-keybinding_menu.js": publicAceSrcMinExtKeybinding_menuJs, - "public/ace/src-min/ext-language_tools.js": publicAceSrcMinExtLanguage_toolsJs, - "public/ace/src-min/ext-linking.js": publicAceSrcMinExtLinkingJs, - "public/ace/src-min/ext-modelist.js": publicAceSrcMinExtModelistJs, - "public/ace/src-min/ext-old_ie.js": publicAceSrcMinExtOld_ieJs, - "public/ace/src-min/ext-searchbox.js": publicAceSrcMinExtSearchboxJs, - "public/ace/src-min/ext-settings_menu.js": publicAceSrcMinExtSettings_menuJs, - "public/ace/src-min/ext-spellcheck.js": publicAceSrcMinExtSpellcheckJs, - "public/ace/src-min/ext-split.js": publicAceSrcMinExtSplitJs, - "public/ace/src-min/ext-static_highlight.js": publicAceSrcMinExtStatic_highlightJs, - "public/ace/src-min/ext-statusbar.js": publicAceSrcMinExtStatusbarJs, - "public/ace/src-min/ext-textarea.js": publicAceSrcMinExtTextareaJs, - "public/ace/src-min/ext-themelist.js": publicAceSrcMinExtThemelistJs, - "public/ace/src-min/ext-whitespace.js": publicAceSrcMinExtWhitespaceJs, - "public/ace/src-min/keybinding-emacs.js": publicAceSrcMinKeybindingEmacsJs, - "public/ace/src-min/keybinding-vim.js": publicAceSrcMinKeybindingVimJs, - "public/ace/src-min/mode-abap.js": publicAceSrcMinModeAbapJs, - "public/ace/src-min/mode-abc.js": publicAceSrcMinModeAbcJs, - "public/ace/src-min/mode-actionscript.js": publicAceSrcMinModeActionscriptJs, - "public/ace/src-min/mode-ada.js": publicAceSrcMinModeAdaJs, - "public/ace/src-min/mode-apache_conf.js": publicAceSrcMinModeApache_confJs, - "public/ace/src-min/mode-applescript.js": publicAceSrcMinModeApplescriptJs, - "public/ace/src-min/mode-asciidoc.js": publicAceSrcMinModeAsciidocJs, - "public/ace/src-min/mode-assembly_x86.js": publicAceSrcMinModeAssembly_x86Js, - "public/ace/src-min/mode-autohotkey.js": publicAceSrcMinModeAutohotkeyJs, - "public/ace/src-min/mode-batchfile.js": publicAceSrcMinModeBatchfileJs, - "public/ace/src-min/mode-bro.js": publicAceSrcMinModeBroJs, - "public/ace/src-min/mode-c9search.js": publicAceSrcMinModeC9searchJs, - "public/ace/src-min/mode-c_cpp.js": publicAceSrcMinModeC_cppJs, - "public/ace/src-min/mode-cirru.js": publicAceSrcMinModeCirruJs, - "public/ace/src-min/mode-clojure.js": publicAceSrcMinModeClojureJs, - "public/ace/src-min/mode-cobol.js": publicAceSrcMinModeCobolJs, - "public/ace/src-min/mode-coffee.js": publicAceSrcMinModeCoffeeJs, - "public/ace/src-min/mode-coldfusion.js": publicAceSrcMinModeColdfusionJs, - "public/ace/src-min/mode-csharp.js": publicAceSrcMinModeCsharpJs, - "public/ace/src-min/mode-css.js": publicAceSrcMinModeCssJs, - "public/ace/src-min/mode-curly.js": publicAceSrcMinModeCurlyJs, - "public/ace/src-min/mode-d.js": publicAceSrcMinModeDJs, - "public/ace/src-min/mode-dart.js": publicAceSrcMinModeDartJs, - "public/ace/src-min/mode-diff.js": publicAceSrcMinModeDiffJs, - "public/ace/src-min/mode-django.js": publicAceSrcMinModeDjangoJs, - "public/ace/src-min/mode-dockerfile.js": publicAceSrcMinModeDockerfileJs, - "public/ace/src-min/mode-dot.js": publicAceSrcMinModeDotJs, - "public/ace/src-min/mode-drools.js": publicAceSrcMinModeDroolsJs, - "public/ace/src-min/mode-eiffel.js": publicAceSrcMinModeEiffelJs, - "public/ace/src-min/mode-ejs.js": publicAceSrcMinModeEjsJs, - "public/ace/src-min/mode-elixir.js": publicAceSrcMinModeElixirJs, - "public/ace/src-min/mode-elm.js": publicAceSrcMinModeElmJs, - "public/ace/src-min/mode-erlang.js": publicAceSrcMinModeErlangJs, - "public/ace/src-min/mode-forth.js": publicAceSrcMinModeForthJs, - "public/ace/src-min/mode-fortran.js": publicAceSrcMinModeFortranJs, - "public/ace/src-min/mode-ftl.js": publicAceSrcMinModeFtlJs, - "public/ace/src-min/mode-gcode.js": publicAceSrcMinModeGcodeJs, - "public/ace/src-min/mode-gherkin.js": publicAceSrcMinModeGherkinJs, - "public/ace/src-min/mode-gitignore.js": publicAceSrcMinModeGitignoreJs, - "public/ace/src-min/mode-glsl.js": publicAceSrcMinModeGlslJs, - "public/ace/src-min/mode-gobstones.js": publicAceSrcMinModeGobstonesJs, - "public/ace/src-min/mode-golang.js": publicAceSrcMinModeGolangJs, - "public/ace/src-min/mode-groovy.js": publicAceSrcMinModeGroovyJs, - "public/ace/src-min/mode-haml.js": publicAceSrcMinModeHamlJs, - "public/ace/src-min/mode-handlebars.js": publicAceSrcMinModeHandlebarsJs, - "public/ace/src-min/mode-haskell.js": publicAceSrcMinModeHaskellJs, - "public/ace/src-min/mode-haskell_cabal.js": publicAceSrcMinModeHaskell_cabalJs, - "public/ace/src-min/mode-haxe.js": publicAceSrcMinModeHaxeJs, - "public/ace/src-min/mode-hjson.js": publicAceSrcMinModeHjsonJs, - "public/ace/src-min/mode-html.js": publicAceSrcMinModeHtmlJs, - "public/ace/src-min/mode-html_elixir.js": publicAceSrcMinModeHtml_elixirJs, - "public/ace/src-min/mode-html_ruby.js": publicAceSrcMinModeHtml_rubyJs, - "public/ace/src-min/mode-ini.js": publicAceSrcMinModeIniJs, - "public/ace/src-min/mode-io.js": publicAceSrcMinModeIoJs, - "public/ace/src-min/mode-jack.js": publicAceSrcMinModeJackJs, - "public/ace/src-min/mode-jade.js": publicAceSrcMinModeJadeJs, - "public/ace/src-min/mode-java.js": publicAceSrcMinModeJavaJs, - "public/ace/src-min/mode-javascript.js": publicAceSrcMinModeJavascriptJs, - "public/ace/src-min/mode-json.js": publicAceSrcMinModeJsonJs, - "public/ace/src-min/mode-jsoniq.js": publicAceSrcMinModeJsoniqJs, - "public/ace/src-min/mode-jsp.js": publicAceSrcMinModeJspJs, - "public/ace/src-min/mode-jsx.js": publicAceSrcMinModeJsxJs, - "public/ace/src-min/mode-julia.js": publicAceSrcMinModeJuliaJs, - "public/ace/src-min/mode-kotlin.js": publicAceSrcMinModeKotlinJs, - "public/ace/src-min/mode-latex.js": publicAceSrcMinModeLatexJs, - "public/ace/src-min/mode-lean.js": publicAceSrcMinModeLeanJs, - "public/ace/src-min/mode-less.js": publicAceSrcMinModeLessJs, - "public/ace/src-min/mode-liquid.js": publicAceSrcMinModeLiquidJs, - "public/ace/src-min/mode-lisp.js": publicAceSrcMinModeLispJs, - "public/ace/src-min/mode-live_script.js": publicAceSrcMinModeLive_scriptJs, - "public/ace/src-min/mode-livescript.js": publicAceSrcMinModeLivescriptJs, - "public/ace/src-min/mode-logiql.js": publicAceSrcMinModeLogiqlJs, - "public/ace/src-min/mode-lsl.js": publicAceSrcMinModeLslJs, - "public/ace/src-min/mode-lua.js": publicAceSrcMinModeLuaJs, - "public/ace/src-min/mode-luapage.js": publicAceSrcMinModeLuapageJs, - "public/ace/src-min/mode-lucene.js": publicAceSrcMinModeLuceneJs, - "public/ace/src-min/mode-makefile.js": publicAceSrcMinModeMakefileJs, - "public/ace/src-min/mode-markdown.js": publicAceSrcMinModeMarkdownJs, - "public/ace/src-min/mode-mask.js": publicAceSrcMinModeMaskJs, - "public/ace/src-min/mode-matlab.js": publicAceSrcMinModeMatlabJs, - "public/ace/src-min/mode-maze.js": publicAceSrcMinModeMazeJs, - "public/ace/src-min/mode-mel.js": publicAceSrcMinModeMelJs, - "public/ace/src-min/mode-mips_assembler.js": publicAceSrcMinModeMips_assemblerJs, - "public/ace/src-min/mode-mipsassembler.js": publicAceSrcMinModeMipsassemblerJs, - "public/ace/src-min/mode-mushcode.js": publicAceSrcMinModeMushcodeJs, - "public/ace/src-min/mode-mysql.js": publicAceSrcMinModeMysqlJs, - "public/ace/src-min/mode-nix.js": publicAceSrcMinModeNixJs, - "public/ace/src-min/mode-nsis.js": publicAceSrcMinModeNsisJs, - "public/ace/src-min/mode-objectivec.js": publicAceSrcMinModeObjectivecJs, - "public/ace/src-min/mode-ocaml.js": publicAceSrcMinModeOcamlJs, - "public/ace/src-min/mode-pascal.js": publicAceSrcMinModePascalJs, - "public/ace/src-min/mode-perl.js": publicAceSrcMinModePerlJs, - "public/ace/src-min/mode-pgsql.js": publicAceSrcMinModePgsqlJs, - "public/ace/src-min/mode-php.js": publicAceSrcMinModePhpJs, - "public/ace/src-min/mode-plain_text.js": publicAceSrcMinModePlain_textJs, - "public/ace/src-min/mode-powershell.js": publicAceSrcMinModePowershellJs, - "public/ace/src-min/mode-praat.js": publicAceSrcMinModePraatJs, - "public/ace/src-min/mode-prolog.js": publicAceSrcMinModePrologJs, - "public/ace/src-min/mode-properties.js": publicAceSrcMinModePropertiesJs, - "public/ace/src-min/mode-protobuf.js": publicAceSrcMinModeProtobufJs, - "public/ace/src-min/mode-python.js": publicAceSrcMinModePythonJs, - "public/ace/src-min/mode-r.js": publicAceSrcMinModeRJs, - "public/ace/src-min/mode-razor.js": publicAceSrcMinModeRazorJs, - "public/ace/src-min/mode-rdoc.js": publicAceSrcMinModeRdocJs, - "public/ace/src-min/mode-rhtml.js": publicAceSrcMinModeRhtmlJs, - "public/ace/src-min/mode-rst.js": publicAceSrcMinModeRstJs, - "public/ace/src-min/mode-ruby.js": publicAceSrcMinModeRubyJs, - "public/ace/src-min/mode-rust.js": publicAceSrcMinModeRustJs, - "public/ace/src-min/mode-sass.js": publicAceSrcMinModeSassJs, - "public/ace/src-min/mode-scad.js": publicAceSrcMinModeScadJs, - "public/ace/src-min/mode-scala.js": publicAceSrcMinModeScalaJs, - "public/ace/src-min/mode-scheme.js": publicAceSrcMinModeSchemeJs, - "public/ace/src-min/mode-scss.js": publicAceSrcMinModeScssJs, - "public/ace/src-min/mode-sh.js": publicAceSrcMinModeShJs, - "public/ace/src-min/mode-sjs.js": publicAceSrcMinModeSjsJs, - "public/ace/src-min/mode-smarty.js": publicAceSrcMinModeSmartyJs, - "public/ace/src-min/mode-snippets.js": publicAceSrcMinModeSnippetsJs, - "public/ace/src-min/mode-soy_template.js": publicAceSrcMinModeSoy_templateJs, - "public/ace/src-min/mode-space.js": publicAceSrcMinModeSpaceJs, - "public/ace/src-min/mode-sql.js": publicAceSrcMinModeSqlJs, - "public/ace/src-min/mode-sqlserver.js": publicAceSrcMinModeSqlserverJs, - "public/ace/src-min/mode-stylus.js": publicAceSrcMinModeStylusJs, - "public/ace/src-min/mode-svg.js": publicAceSrcMinModeSvgJs, - "public/ace/src-min/mode-swift.js": publicAceSrcMinModeSwiftJs, - "public/ace/src-min/mode-swig.js": publicAceSrcMinModeSwigJs, - "public/ace/src-min/mode-tcl.js": publicAceSrcMinModeTclJs, - "public/ace/src-min/mode-tex.js": publicAceSrcMinModeTexJs, - "public/ace/src-min/mode-text.js": publicAceSrcMinModeTextJs, - "public/ace/src-min/mode-textile.js": publicAceSrcMinModeTextileJs, - "public/ace/src-min/mode-toml.js": publicAceSrcMinModeTomlJs, - "public/ace/src-min/mode-tsx.js": publicAceSrcMinModeTsxJs, - "public/ace/src-min/mode-twig.js": publicAceSrcMinModeTwigJs, - "public/ace/src-min/mode-typescript.js": publicAceSrcMinModeTypescriptJs, - "public/ace/src-min/mode-vala.js": publicAceSrcMinModeValaJs, - "public/ace/src-min/mode-vbscript.js": publicAceSrcMinModeVbscriptJs, - "public/ace/src-min/mode-velocity.js": publicAceSrcMinModeVelocityJs, - "public/ace/src-min/mode-verilog.js": publicAceSrcMinModeVerilogJs, - "public/ace/src-min/mode-vhdl.js": publicAceSrcMinModeVhdlJs, - "public/ace/src-min/mode-wollok.js": publicAceSrcMinModeWollokJs, - "public/ace/src-min/mode-xml.js": publicAceSrcMinModeXmlJs, - "public/ace/src-min/mode-xquery.js": publicAceSrcMinModeXqueryJs, - "public/ace/src-min/mode-yaml.js": publicAceSrcMinModeYamlJs, - "public/ace/src-min/snippets/abap.js": publicAceSrcMinSnippetsAbapJs, - "public/ace/src-min/snippets/abc.js": publicAceSrcMinSnippetsAbcJs, - "public/ace/src-min/snippets/actionscript.js": publicAceSrcMinSnippetsActionscriptJs, - "public/ace/src-min/snippets/ada.js": publicAceSrcMinSnippetsAdaJs, - "public/ace/src-min/snippets/apache_conf.js": publicAceSrcMinSnippetsApache_confJs, - "public/ace/src-min/snippets/applescript.js": publicAceSrcMinSnippetsApplescriptJs, - "public/ace/src-min/snippets/asciidoc.js": publicAceSrcMinSnippetsAsciidocJs, - "public/ace/src-min/snippets/assembly_x86.js": publicAceSrcMinSnippetsAssembly_x86Js, - "public/ace/src-min/snippets/autohotkey.js": publicAceSrcMinSnippetsAutohotkeyJs, - "public/ace/src-min/snippets/batchfile.js": publicAceSrcMinSnippetsBatchfileJs, - "public/ace/src-min/snippets/bro.js": publicAceSrcMinSnippetsBroJs, - "public/ace/src-min/snippets/c9search.js": publicAceSrcMinSnippetsC9searchJs, - "public/ace/src-min/snippets/c_cpp.js": publicAceSrcMinSnippetsC_cppJs, - "public/ace/src-min/snippets/cirru.js": publicAceSrcMinSnippetsCirruJs, - "public/ace/src-min/snippets/clojure.js": publicAceSrcMinSnippetsClojureJs, - "public/ace/src-min/snippets/cobol.js": publicAceSrcMinSnippetsCobolJs, - "public/ace/src-min/snippets/coffee.js": publicAceSrcMinSnippetsCoffeeJs, - "public/ace/src-min/snippets/coldfusion.js": publicAceSrcMinSnippetsColdfusionJs, - "public/ace/src-min/snippets/csharp.js": publicAceSrcMinSnippetsCsharpJs, - "public/ace/src-min/snippets/css.js": publicAceSrcMinSnippetsCssJs, - "public/ace/src-min/snippets/curly.js": publicAceSrcMinSnippetsCurlyJs, - "public/ace/src-min/snippets/d.js": publicAceSrcMinSnippetsDJs, - "public/ace/src-min/snippets/dart.js": publicAceSrcMinSnippetsDartJs, - "public/ace/src-min/snippets/diff.js": publicAceSrcMinSnippetsDiffJs, - "public/ace/src-min/snippets/django.js": publicAceSrcMinSnippetsDjangoJs, - "public/ace/src-min/snippets/dockerfile.js": publicAceSrcMinSnippetsDockerfileJs, - "public/ace/src-min/snippets/dot.js": publicAceSrcMinSnippetsDotJs, - "public/ace/src-min/snippets/drools.js": publicAceSrcMinSnippetsDroolsJs, - "public/ace/src-min/snippets/eiffel.js": publicAceSrcMinSnippetsEiffelJs, - "public/ace/src-min/snippets/ejs.js": publicAceSrcMinSnippetsEjsJs, - "public/ace/src-min/snippets/elixir.js": publicAceSrcMinSnippetsElixirJs, - "public/ace/src-min/snippets/elm.js": publicAceSrcMinSnippetsElmJs, - "public/ace/src-min/snippets/erlang.js": publicAceSrcMinSnippetsErlangJs, - "public/ace/src-min/snippets/forth.js": publicAceSrcMinSnippetsForthJs, - "public/ace/src-min/snippets/fortran.js": publicAceSrcMinSnippetsFortranJs, - "public/ace/src-min/snippets/ftl.js": publicAceSrcMinSnippetsFtlJs, - "public/ace/src-min/snippets/gcode.js": publicAceSrcMinSnippetsGcodeJs, - "public/ace/src-min/snippets/gherkin.js": publicAceSrcMinSnippetsGherkinJs, - "public/ace/src-min/snippets/gitignore.js": publicAceSrcMinSnippetsGitignoreJs, - "public/ace/src-min/snippets/glsl.js": publicAceSrcMinSnippetsGlslJs, - "public/ace/src-min/snippets/gobstones.js": publicAceSrcMinSnippetsGobstonesJs, - "public/ace/src-min/snippets/golang.js": publicAceSrcMinSnippetsGolangJs, - "public/ace/src-min/snippets/groovy.js": publicAceSrcMinSnippetsGroovyJs, - "public/ace/src-min/snippets/haml.js": publicAceSrcMinSnippetsHamlJs, - "public/ace/src-min/snippets/handlebars.js": publicAceSrcMinSnippetsHandlebarsJs, - "public/ace/src-min/snippets/haskell.js": publicAceSrcMinSnippetsHaskellJs, - "public/ace/src-min/snippets/haskell_cabal.js": publicAceSrcMinSnippetsHaskell_cabalJs, - "public/ace/src-min/snippets/haxe.js": publicAceSrcMinSnippetsHaxeJs, - "public/ace/src-min/snippets/hjson.js": publicAceSrcMinSnippetsHjsonJs, - "public/ace/src-min/snippets/html.js": publicAceSrcMinSnippetsHtmlJs, - "public/ace/src-min/snippets/html_elixir.js": publicAceSrcMinSnippetsHtml_elixirJs, - "public/ace/src-min/snippets/html_ruby.js": publicAceSrcMinSnippetsHtml_rubyJs, - "public/ace/src-min/snippets/ini.js": publicAceSrcMinSnippetsIniJs, - "public/ace/src-min/snippets/io.js": publicAceSrcMinSnippetsIoJs, - "public/ace/src-min/snippets/jack.js": publicAceSrcMinSnippetsJackJs, - "public/ace/src-min/snippets/jade.js": publicAceSrcMinSnippetsJadeJs, - "public/ace/src-min/snippets/java.js": publicAceSrcMinSnippetsJavaJs, - "public/ace/src-min/snippets/javascript.js": publicAceSrcMinSnippetsJavascriptJs, - "public/ace/src-min/snippets/json.js": publicAceSrcMinSnippetsJsonJs, - "public/ace/src-min/snippets/jsoniq.js": publicAceSrcMinSnippetsJsoniqJs, - "public/ace/src-min/snippets/jsp.js": publicAceSrcMinSnippetsJspJs, - "public/ace/src-min/snippets/jsx.js": publicAceSrcMinSnippetsJsxJs, - "public/ace/src-min/snippets/julia.js": publicAceSrcMinSnippetsJuliaJs, - "public/ace/src-min/snippets/kotlin.js": publicAceSrcMinSnippetsKotlinJs, - "public/ace/src-min/snippets/latex.js": publicAceSrcMinSnippetsLatexJs, - "public/ace/src-min/snippets/lean.js": publicAceSrcMinSnippetsLeanJs, - "public/ace/src-min/snippets/less.js": publicAceSrcMinSnippetsLessJs, - "public/ace/src-min/snippets/liquid.js": publicAceSrcMinSnippetsLiquidJs, - "public/ace/src-min/snippets/lisp.js": publicAceSrcMinSnippetsLispJs, - "public/ace/src-min/snippets/live_script.js": publicAceSrcMinSnippetsLive_scriptJs, - "public/ace/src-min/snippets/livescript.js": publicAceSrcMinSnippetsLivescriptJs, - "public/ace/src-min/snippets/logiql.js": publicAceSrcMinSnippetsLogiqlJs, - "public/ace/src-min/snippets/lsl.js": publicAceSrcMinSnippetsLslJs, - "public/ace/src-min/snippets/lua.js": publicAceSrcMinSnippetsLuaJs, - "public/ace/src-min/snippets/luapage.js": publicAceSrcMinSnippetsLuapageJs, - "public/ace/src-min/snippets/lucene.js": publicAceSrcMinSnippetsLuceneJs, - "public/ace/src-min/snippets/makefile.js": publicAceSrcMinSnippetsMakefileJs, - "public/ace/src-min/snippets/markdown.js": publicAceSrcMinSnippetsMarkdownJs, - "public/ace/src-min/snippets/mask.js": publicAceSrcMinSnippetsMaskJs, - "public/ace/src-min/snippets/matlab.js": publicAceSrcMinSnippetsMatlabJs, - "public/ace/src-min/snippets/maze.js": publicAceSrcMinSnippetsMazeJs, - "public/ace/src-min/snippets/mel.js": publicAceSrcMinSnippetsMelJs, - "public/ace/src-min/snippets/mips_assembler.js": publicAceSrcMinSnippetsMips_assemblerJs, - "public/ace/src-min/snippets/mipsassembler.js": publicAceSrcMinSnippetsMipsassemblerJs, - "public/ace/src-min/snippets/mushcode.js": publicAceSrcMinSnippetsMushcodeJs, - "public/ace/src-min/snippets/mysql.js": publicAceSrcMinSnippetsMysqlJs, - "public/ace/src-min/snippets/nix.js": publicAceSrcMinSnippetsNixJs, - "public/ace/src-min/snippets/nsis.js": publicAceSrcMinSnippetsNsisJs, - "public/ace/src-min/snippets/objectivec.js": publicAceSrcMinSnippetsObjectivecJs, - "public/ace/src-min/snippets/ocaml.js": publicAceSrcMinSnippetsOcamlJs, - "public/ace/src-min/snippets/pascal.js": publicAceSrcMinSnippetsPascalJs, - "public/ace/src-min/snippets/perl.js": publicAceSrcMinSnippetsPerlJs, - "public/ace/src-min/snippets/pgsql.js": publicAceSrcMinSnippetsPgsqlJs, - "public/ace/src-min/snippets/php.js": publicAceSrcMinSnippetsPhpJs, - "public/ace/src-min/snippets/plain_text.js": publicAceSrcMinSnippetsPlain_textJs, - "public/ace/src-min/snippets/powershell.js": publicAceSrcMinSnippetsPowershellJs, - "public/ace/src-min/snippets/praat.js": publicAceSrcMinSnippetsPraatJs, - "public/ace/src-min/snippets/prolog.js": publicAceSrcMinSnippetsPrologJs, - "public/ace/src-min/snippets/properties.js": publicAceSrcMinSnippetsPropertiesJs, - "public/ace/src-min/snippets/protobuf.js": publicAceSrcMinSnippetsProtobufJs, - "public/ace/src-min/snippets/python.js": publicAceSrcMinSnippetsPythonJs, - "public/ace/src-min/snippets/r.js": publicAceSrcMinSnippetsRJs, - "public/ace/src-min/snippets/razor.js": publicAceSrcMinSnippetsRazorJs, - "public/ace/src-min/snippets/rdoc.js": publicAceSrcMinSnippetsRdocJs, - "public/ace/src-min/snippets/rhtml.js": publicAceSrcMinSnippetsRhtmlJs, - "public/ace/src-min/snippets/rst.js": publicAceSrcMinSnippetsRstJs, - "public/ace/src-min/snippets/ruby.js": publicAceSrcMinSnippetsRubyJs, - "public/ace/src-min/snippets/rust.js": publicAceSrcMinSnippetsRustJs, - "public/ace/src-min/snippets/sass.js": publicAceSrcMinSnippetsSassJs, - "public/ace/src-min/snippets/scad.js": publicAceSrcMinSnippetsScadJs, - "public/ace/src-min/snippets/scala.js": publicAceSrcMinSnippetsScalaJs, - "public/ace/src-min/snippets/scheme.js": publicAceSrcMinSnippetsSchemeJs, - "public/ace/src-min/snippets/scss.js": publicAceSrcMinSnippetsScssJs, - "public/ace/src-min/snippets/sh.js": publicAceSrcMinSnippetsShJs, - "public/ace/src-min/snippets/sjs.js": publicAceSrcMinSnippetsSjsJs, - "public/ace/src-min/snippets/smarty.js": publicAceSrcMinSnippetsSmartyJs, - "public/ace/src-min/snippets/snippets.js": publicAceSrcMinSnippetsSnippetsJs, - "public/ace/src-min/snippets/soy_template.js": publicAceSrcMinSnippetsSoy_templateJs, - "public/ace/src-min/snippets/space.js": publicAceSrcMinSnippetsSpaceJs, - "public/ace/src-min/snippets/sql.js": publicAceSrcMinSnippetsSqlJs, - "public/ace/src-min/snippets/sqlserver.js": publicAceSrcMinSnippetsSqlserverJs, - "public/ace/src-min/snippets/stylus.js": publicAceSrcMinSnippetsStylusJs, - "public/ace/src-min/snippets/svg.js": publicAceSrcMinSnippetsSvgJs, - "public/ace/src-min/snippets/swift.js": publicAceSrcMinSnippetsSwiftJs, - "public/ace/src-min/snippets/swig.js": publicAceSrcMinSnippetsSwigJs, - "public/ace/src-min/snippets/tcl.js": publicAceSrcMinSnippetsTclJs, - "public/ace/src-min/snippets/tex.js": publicAceSrcMinSnippetsTexJs, - "public/ace/src-min/snippets/text.js": publicAceSrcMinSnippetsTextJs, - "public/ace/src-min/snippets/textile.js": publicAceSrcMinSnippetsTextileJs, - "public/ace/src-min/snippets/toml.js": publicAceSrcMinSnippetsTomlJs, - "public/ace/src-min/snippets/tsx.js": publicAceSrcMinSnippetsTsxJs, - "public/ace/src-min/snippets/twig.js": publicAceSrcMinSnippetsTwigJs, - "public/ace/src-min/snippets/typescript.js": publicAceSrcMinSnippetsTypescriptJs, - "public/ace/src-min/snippets/vala.js": publicAceSrcMinSnippetsValaJs, - "public/ace/src-min/snippets/vbscript.js": publicAceSrcMinSnippetsVbscriptJs, - "public/ace/src-min/snippets/velocity.js": publicAceSrcMinSnippetsVelocityJs, - "public/ace/src-min/snippets/verilog.js": publicAceSrcMinSnippetsVerilogJs, - "public/ace/src-min/snippets/vhdl.js": publicAceSrcMinSnippetsVhdlJs, - "public/ace/src-min/snippets/wollok.js": publicAceSrcMinSnippetsWollokJs, - "public/ace/src-min/snippets/xml.js": publicAceSrcMinSnippetsXmlJs, - "public/ace/src-min/snippets/xquery.js": publicAceSrcMinSnippetsXqueryJs, - "public/ace/src-min/snippets/yaml.js": publicAceSrcMinSnippetsYamlJs, - "public/ace/src-min/theme-github.js": publicAceSrcMinThemeGithubJs, - "public/ace/src-min/worker-coffee.js": publicAceSrcMinWorkerCoffeeJs, - "public/ace/src-min/worker-css.js": publicAceSrcMinWorkerCssJs, - "public/ace/src-min/worker-html.js": publicAceSrcMinWorkerHtmlJs, - "public/ace/src-min/worker-javascript.js": publicAceSrcMinWorkerJavascriptJs, - "public/ace/src-min/worker-json.js": publicAceSrcMinWorkerJsonJs, - "public/ace/src-min/worker-lua.js": publicAceSrcMinWorkerLuaJs, - "public/ace/src-min/worker-php.js": publicAceSrcMinWorkerPhpJs, - "public/ace/src-min/worker-xml.js": publicAceSrcMinWorkerXmlJs, - "public/ace/src-min/worker-xquery.js": publicAceSrcMinWorkerXqueryJs, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} -var _bintree = &bintree{nil, map[string]*bintree{ - "public": &bintree{nil, map[string]*bintree{ - "ace": &bintree{nil, map[string]*bintree{ - "src-min": &bintree{nil, map[string]*bintree{ - "ace.js": &bintree{publicAceSrcMinAceJs, map[string]*bintree{}}, - "ext-beautify.js": &bintree{publicAceSrcMinExtBeautifyJs, map[string]*bintree{}}, - "ext-chromevox.js": &bintree{publicAceSrcMinExtChromevoxJs, map[string]*bintree{}}, - "ext-elastic_tabstops_lite.js": &bintree{publicAceSrcMinExtElastic_tabstops_liteJs, map[string]*bintree{}}, - "ext-emmet.js": &bintree{publicAceSrcMinExtEmmetJs, map[string]*bintree{}}, - "ext-error_marker.js": &bintree{publicAceSrcMinExtError_markerJs, map[string]*bintree{}}, - "ext-keybinding_menu.js": &bintree{publicAceSrcMinExtKeybinding_menuJs, map[string]*bintree{}}, - "ext-language_tools.js": &bintree{publicAceSrcMinExtLanguage_toolsJs, map[string]*bintree{}}, - "ext-linking.js": &bintree{publicAceSrcMinExtLinkingJs, map[string]*bintree{}}, - "ext-modelist.js": &bintree{publicAceSrcMinExtModelistJs, map[string]*bintree{}}, - "ext-old_ie.js": &bintree{publicAceSrcMinExtOld_ieJs, map[string]*bintree{}}, - "ext-searchbox.js": &bintree{publicAceSrcMinExtSearchboxJs, map[string]*bintree{}}, - "ext-settings_menu.js": &bintree{publicAceSrcMinExtSettings_menuJs, map[string]*bintree{}}, - "ext-spellcheck.js": &bintree{publicAceSrcMinExtSpellcheckJs, map[string]*bintree{}}, - "ext-split.js": &bintree{publicAceSrcMinExtSplitJs, map[string]*bintree{}}, - "ext-static_highlight.js": &bintree{publicAceSrcMinExtStatic_highlightJs, map[string]*bintree{}}, - "ext-statusbar.js": &bintree{publicAceSrcMinExtStatusbarJs, map[string]*bintree{}}, - "ext-textarea.js": &bintree{publicAceSrcMinExtTextareaJs, map[string]*bintree{}}, - "ext-themelist.js": &bintree{publicAceSrcMinExtThemelistJs, map[string]*bintree{}}, - "ext-whitespace.js": &bintree{publicAceSrcMinExtWhitespaceJs, map[string]*bintree{}}, - "keybinding-emacs.js": &bintree{publicAceSrcMinKeybindingEmacsJs, map[string]*bintree{}}, - "keybinding-vim.js": &bintree{publicAceSrcMinKeybindingVimJs, map[string]*bintree{}}, - "mode-abap.js": &bintree{publicAceSrcMinModeAbapJs, map[string]*bintree{}}, - "mode-abc.js": &bintree{publicAceSrcMinModeAbcJs, map[string]*bintree{}}, - "mode-actionscript.js": &bintree{publicAceSrcMinModeActionscriptJs, map[string]*bintree{}}, - "mode-ada.js": &bintree{publicAceSrcMinModeAdaJs, map[string]*bintree{}}, - "mode-apache_conf.js": &bintree{publicAceSrcMinModeApache_confJs, map[string]*bintree{}}, - "mode-applescript.js": &bintree{publicAceSrcMinModeApplescriptJs, map[string]*bintree{}}, - "mode-asciidoc.js": &bintree{publicAceSrcMinModeAsciidocJs, map[string]*bintree{}}, - "mode-assembly_x86.js": &bintree{publicAceSrcMinModeAssembly_x86Js, map[string]*bintree{}}, - "mode-autohotkey.js": &bintree{publicAceSrcMinModeAutohotkeyJs, map[string]*bintree{}}, - "mode-batchfile.js": &bintree{publicAceSrcMinModeBatchfileJs, map[string]*bintree{}}, - "mode-bro.js": &bintree{publicAceSrcMinModeBroJs, map[string]*bintree{}}, - "mode-c9search.js": &bintree{publicAceSrcMinModeC9searchJs, map[string]*bintree{}}, - "mode-c_cpp.js": &bintree{publicAceSrcMinModeC_cppJs, map[string]*bintree{}}, - "mode-cirru.js": &bintree{publicAceSrcMinModeCirruJs, map[string]*bintree{}}, - "mode-clojure.js": &bintree{publicAceSrcMinModeClojureJs, map[string]*bintree{}}, - "mode-cobol.js": &bintree{publicAceSrcMinModeCobolJs, map[string]*bintree{}}, - "mode-coffee.js": &bintree{publicAceSrcMinModeCoffeeJs, map[string]*bintree{}}, - "mode-coldfusion.js": &bintree{publicAceSrcMinModeColdfusionJs, map[string]*bintree{}}, - "mode-csharp.js": &bintree{publicAceSrcMinModeCsharpJs, map[string]*bintree{}}, - "mode-css.js": &bintree{publicAceSrcMinModeCssJs, map[string]*bintree{}}, - "mode-curly.js": &bintree{publicAceSrcMinModeCurlyJs, map[string]*bintree{}}, - "mode-d.js": &bintree{publicAceSrcMinModeDJs, map[string]*bintree{}}, - "mode-dart.js": &bintree{publicAceSrcMinModeDartJs, map[string]*bintree{}}, - "mode-diff.js": &bintree{publicAceSrcMinModeDiffJs, map[string]*bintree{}}, - "mode-django.js": &bintree{publicAceSrcMinModeDjangoJs, map[string]*bintree{}}, - "mode-dockerfile.js": &bintree{publicAceSrcMinModeDockerfileJs, map[string]*bintree{}}, - "mode-dot.js": &bintree{publicAceSrcMinModeDotJs, map[string]*bintree{}}, - "mode-drools.js": &bintree{publicAceSrcMinModeDroolsJs, map[string]*bintree{}}, - "mode-eiffel.js": &bintree{publicAceSrcMinModeEiffelJs, map[string]*bintree{}}, - "mode-ejs.js": &bintree{publicAceSrcMinModeEjsJs, map[string]*bintree{}}, - "mode-elixir.js": &bintree{publicAceSrcMinModeElixirJs, map[string]*bintree{}}, - "mode-elm.js": &bintree{publicAceSrcMinModeElmJs, map[string]*bintree{}}, - "mode-erlang.js": &bintree{publicAceSrcMinModeErlangJs, map[string]*bintree{}}, - "mode-forth.js": &bintree{publicAceSrcMinModeForthJs, map[string]*bintree{}}, - "mode-fortran.js": &bintree{publicAceSrcMinModeFortranJs, map[string]*bintree{}}, - "mode-ftl.js": &bintree{publicAceSrcMinModeFtlJs, map[string]*bintree{}}, - "mode-gcode.js": &bintree{publicAceSrcMinModeGcodeJs, map[string]*bintree{}}, - "mode-gherkin.js": &bintree{publicAceSrcMinModeGherkinJs, map[string]*bintree{}}, - "mode-gitignore.js": &bintree{publicAceSrcMinModeGitignoreJs, map[string]*bintree{}}, - "mode-glsl.js": &bintree{publicAceSrcMinModeGlslJs, map[string]*bintree{}}, - "mode-gobstones.js": &bintree{publicAceSrcMinModeGobstonesJs, map[string]*bintree{}}, - "mode-golang.js": &bintree{publicAceSrcMinModeGolangJs, map[string]*bintree{}}, - "mode-groovy.js": &bintree{publicAceSrcMinModeGroovyJs, map[string]*bintree{}}, - "mode-haml.js": &bintree{publicAceSrcMinModeHamlJs, map[string]*bintree{}}, - "mode-handlebars.js": &bintree{publicAceSrcMinModeHandlebarsJs, map[string]*bintree{}}, - "mode-haskell.js": &bintree{publicAceSrcMinModeHaskellJs, map[string]*bintree{}}, - "mode-haskell_cabal.js": &bintree{publicAceSrcMinModeHaskell_cabalJs, map[string]*bintree{}}, - "mode-haxe.js": &bintree{publicAceSrcMinModeHaxeJs, map[string]*bintree{}}, - "mode-hjson.js": &bintree{publicAceSrcMinModeHjsonJs, map[string]*bintree{}}, - "mode-html.js": &bintree{publicAceSrcMinModeHtmlJs, map[string]*bintree{}}, - "mode-html_elixir.js": &bintree{publicAceSrcMinModeHtml_elixirJs, map[string]*bintree{}}, - "mode-html_ruby.js": &bintree{publicAceSrcMinModeHtml_rubyJs, map[string]*bintree{}}, - "mode-ini.js": &bintree{publicAceSrcMinModeIniJs, map[string]*bintree{}}, - "mode-io.js": &bintree{publicAceSrcMinModeIoJs, map[string]*bintree{}}, - "mode-jack.js": &bintree{publicAceSrcMinModeJackJs, map[string]*bintree{}}, - "mode-jade.js": &bintree{publicAceSrcMinModeJadeJs, map[string]*bintree{}}, - "mode-java.js": &bintree{publicAceSrcMinModeJavaJs, map[string]*bintree{}}, - "mode-javascript.js": &bintree{publicAceSrcMinModeJavascriptJs, map[string]*bintree{}}, - "mode-json.js": &bintree{publicAceSrcMinModeJsonJs, map[string]*bintree{}}, - "mode-jsoniq.js": &bintree{publicAceSrcMinModeJsoniqJs, map[string]*bintree{}}, - "mode-jsp.js": &bintree{publicAceSrcMinModeJspJs, map[string]*bintree{}}, - "mode-jsx.js": &bintree{publicAceSrcMinModeJsxJs, map[string]*bintree{}}, - "mode-julia.js": &bintree{publicAceSrcMinModeJuliaJs, map[string]*bintree{}}, - "mode-kotlin.js": &bintree{publicAceSrcMinModeKotlinJs, map[string]*bintree{}}, - "mode-latex.js": &bintree{publicAceSrcMinModeLatexJs, map[string]*bintree{}}, - "mode-lean.js": &bintree{publicAceSrcMinModeLeanJs, map[string]*bintree{}}, - "mode-less.js": &bintree{publicAceSrcMinModeLessJs, map[string]*bintree{}}, - "mode-liquid.js": &bintree{publicAceSrcMinModeLiquidJs, map[string]*bintree{}}, - "mode-lisp.js": &bintree{publicAceSrcMinModeLispJs, map[string]*bintree{}}, - "mode-live_script.js": &bintree{publicAceSrcMinModeLive_scriptJs, map[string]*bintree{}}, - "mode-livescript.js": &bintree{publicAceSrcMinModeLivescriptJs, map[string]*bintree{}}, - "mode-logiql.js": &bintree{publicAceSrcMinModeLogiqlJs, map[string]*bintree{}}, - "mode-lsl.js": &bintree{publicAceSrcMinModeLslJs, map[string]*bintree{}}, - "mode-lua.js": &bintree{publicAceSrcMinModeLuaJs, map[string]*bintree{}}, - "mode-luapage.js": &bintree{publicAceSrcMinModeLuapageJs, map[string]*bintree{}}, - "mode-lucene.js": &bintree{publicAceSrcMinModeLuceneJs, map[string]*bintree{}}, - "mode-makefile.js": &bintree{publicAceSrcMinModeMakefileJs, map[string]*bintree{}}, - "mode-markdown.js": &bintree{publicAceSrcMinModeMarkdownJs, map[string]*bintree{}}, - "mode-mask.js": &bintree{publicAceSrcMinModeMaskJs, map[string]*bintree{}}, - "mode-matlab.js": &bintree{publicAceSrcMinModeMatlabJs, map[string]*bintree{}}, - "mode-maze.js": &bintree{publicAceSrcMinModeMazeJs, map[string]*bintree{}}, - "mode-mel.js": &bintree{publicAceSrcMinModeMelJs, map[string]*bintree{}}, - "mode-mips_assembler.js": &bintree{publicAceSrcMinModeMips_assemblerJs, map[string]*bintree{}}, - "mode-mipsassembler.js": &bintree{publicAceSrcMinModeMipsassemblerJs, map[string]*bintree{}}, - "mode-mushcode.js": &bintree{publicAceSrcMinModeMushcodeJs, map[string]*bintree{}}, - "mode-mysql.js": &bintree{publicAceSrcMinModeMysqlJs, map[string]*bintree{}}, - "mode-nix.js": &bintree{publicAceSrcMinModeNixJs, map[string]*bintree{}}, - "mode-nsis.js": &bintree{publicAceSrcMinModeNsisJs, map[string]*bintree{}}, - "mode-objectivec.js": &bintree{publicAceSrcMinModeObjectivecJs, map[string]*bintree{}}, - "mode-ocaml.js": &bintree{publicAceSrcMinModeOcamlJs, map[string]*bintree{}}, - "mode-pascal.js": &bintree{publicAceSrcMinModePascalJs, map[string]*bintree{}}, - "mode-perl.js": &bintree{publicAceSrcMinModePerlJs, map[string]*bintree{}}, - "mode-pgsql.js": &bintree{publicAceSrcMinModePgsqlJs, map[string]*bintree{}}, - "mode-php.js": &bintree{publicAceSrcMinModePhpJs, map[string]*bintree{}}, - "mode-plain_text.js": &bintree{publicAceSrcMinModePlain_textJs, map[string]*bintree{}}, - "mode-powershell.js": &bintree{publicAceSrcMinModePowershellJs, map[string]*bintree{}}, - "mode-praat.js": &bintree{publicAceSrcMinModePraatJs, map[string]*bintree{}}, - "mode-prolog.js": &bintree{publicAceSrcMinModePrologJs, map[string]*bintree{}}, - "mode-properties.js": &bintree{publicAceSrcMinModePropertiesJs, map[string]*bintree{}}, - "mode-protobuf.js": &bintree{publicAceSrcMinModeProtobufJs, map[string]*bintree{}}, - "mode-python.js": &bintree{publicAceSrcMinModePythonJs, map[string]*bintree{}}, - "mode-r.js": &bintree{publicAceSrcMinModeRJs, map[string]*bintree{}}, - "mode-razor.js": &bintree{publicAceSrcMinModeRazorJs, map[string]*bintree{}}, - "mode-rdoc.js": &bintree{publicAceSrcMinModeRdocJs, map[string]*bintree{}}, - "mode-rhtml.js": &bintree{publicAceSrcMinModeRhtmlJs, map[string]*bintree{}}, - "mode-rst.js": &bintree{publicAceSrcMinModeRstJs, map[string]*bintree{}}, - "mode-ruby.js": &bintree{publicAceSrcMinModeRubyJs, map[string]*bintree{}}, - "mode-rust.js": &bintree{publicAceSrcMinModeRustJs, map[string]*bintree{}}, - "mode-sass.js": &bintree{publicAceSrcMinModeSassJs, map[string]*bintree{}}, - "mode-scad.js": &bintree{publicAceSrcMinModeScadJs, map[string]*bintree{}}, - "mode-scala.js": &bintree{publicAceSrcMinModeScalaJs, map[string]*bintree{}}, - "mode-scheme.js": &bintree{publicAceSrcMinModeSchemeJs, map[string]*bintree{}}, - "mode-scss.js": &bintree{publicAceSrcMinModeScssJs, map[string]*bintree{}}, - "mode-sh.js": &bintree{publicAceSrcMinModeShJs, map[string]*bintree{}}, - "mode-sjs.js": &bintree{publicAceSrcMinModeSjsJs, map[string]*bintree{}}, - "mode-smarty.js": &bintree{publicAceSrcMinModeSmartyJs, map[string]*bintree{}}, - "mode-snippets.js": &bintree{publicAceSrcMinModeSnippetsJs, map[string]*bintree{}}, - "mode-soy_template.js": &bintree{publicAceSrcMinModeSoy_templateJs, map[string]*bintree{}}, - "mode-space.js": &bintree{publicAceSrcMinModeSpaceJs, map[string]*bintree{}}, - "mode-sql.js": &bintree{publicAceSrcMinModeSqlJs, map[string]*bintree{}}, - "mode-sqlserver.js": &bintree{publicAceSrcMinModeSqlserverJs, map[string]*bintree{}}, - "mode-stylus.js": &bintree{publicAceSrcMinModeStylusJs, map[string]*bintree{}}, - "mode-svg.js": &bintree{publicAceSrcMinModeSvgJs, map[string]*bintree{}}, - "mode-swift.js": &bintree{publicAceSrcMinModeSwiftJs, map[string]*bintree{}}, - "mode-swig.js": &bintree{publicAceSrcMinModeSwigJs, map[string]*bintree{}}, - "mode-tcl.js": &bintree{publicAceSrcMinModeTclJs, map[string]*bintree{}}, - "mode-tex.js": &bintree{publicAceSrcMinModeTexJs, map[string]*bintree{}}, - "mode-text.js": &bintree{publicAceSrcMinModeTextJs, map[string]*bintree{}}, - "mode-textile.js": &bintree{publicAceSrcMinModeTextileJs, map[string]*bintree{}}, - "mode-toml.js": &bintree{publicAceSrcMinModeTomlJs, map[string]*bintree{}}, - "mode-tsx.js": &bintree{publicAceSrcMinModeTsxJs, map[string]*bintree{}}, - "mode-twig.js": &bintree{publicAceSrcMinModeTwigJs, map[string]*bintree{}}, - "mode-typescript.js": &bintree{publicAceSrcMinModeTypescriptJs, map[string]*bintree{}}, - "mode-vala.js": &bintree{publicAceSrcMinModeValaJs, map[string]*bintree{}}, - "mode-vbscript.js": &bintree{publicAceSrcMinModeVbscriptJs, map[string]*bintree{}}, - "mode-velocity.js": &bintree{publicAceSrcMinModeVelocityJs, map[string]*bintree{}}, - "mode-verilog.js": &bintree{publicAceSrcMinModeVerilogJs, map[string]*bintree{}}, - "mode-vhdl.js": &bintree{publicAceSrcMinModeVhdlJs, map[string]*bintree{}}, - "mode-wollok.js": &bintree{publicAceSrcMinModeWollokJs, map[string]*bintree{}}, - "mode-xml.js": &bintree{publicAceSrcMinModeXmlJs, map[string]*bintree{}}, - "mode-xquery.js": &bintree{publicAceSrcMinModeXqueryJs, map[string]*bintree{}}, - "mode-yaml.js": &bintree{publicAceSrcMinModeYamlJs, map[string]*bintree{}}, - "snippets": &bintree{nil, map[string]*bintree{ - "abap.js": &bintree{publicAceSrcMinSnippetsAbapJs, map[string]*bintree{}}, - "abc.js": &bintree{publicAceSrcMinSnippetsAbcJs, map[string]*bintree{}}, - "actionscript.js": &bintree{publicAceSrcMinSnippetsActionscriptJs, map[string]*bintree{}}, - "ada.js": &bintree{publicAceSrcMinSnippetsAdaJs, map[string]*bintree{}}, - "apache_conf.js": &bintree{publicAceSrcMinSnippetsApache_confJs, map[string]*bintree{}}, - "applescript.js": &bintree{publicAceSrcMinSnippetsApplescriptJs, map[string]*bintree{}}, - "asciidoc.js": &bintree{publicAceSrcMinSnippetsAsciidocJs, map[string]*bintree{}}, - "assembly_x86.js": &bintree{publicAceSrcMinSnippetsAssembly_x86Js, map[string]*bintree{}}, - "autohotkey.js": &bintree{publicAceSrcMinSnippetsAutohotkeyJs, map[string]*bintree{}}, - "batchfile.js": &bintree{publicAceSrcMinSnippetsBatchfileJs, map[string]*bintree{}}, - "bro.js": &bintree{publicAceSrcMinSnippetsBroJs, map[string]*bintree{}}, - "c9search.js": &bintree{publicAceSrcMinSnippetsC9searchJs, map[string]*bintree{}}, - "c_cpp.js": &bintree{publicAceSrcMinSnippetsC_cppJs, map[string]*bintree{}}, - "cirru.js": &bintree{publicAceSrcMinSnippetsCirruJs, map[string]*bintree{}}, - "clojure.js": &bintree{publicAceSrcMinSnippetsClojureJs, map[string]*bintree{}}, - "cobol.js": &bintree{publicAceSrcMinSnippetsCobolJs, map[string]*bintree{}}, - "coffee.js": &bintree{publicAceSrcMinSnippetsCoffeeJs, map[string]*bintree{}}, - "coldfusion.js": &bintree{publicAceSrcMinSnippetsColdfusionJs, map[string]*bintree{}}, - "csharp.js": &bintree{publicAceSrcMinSnippetsCsharpJs, map[string]*bintree{}}, - "css.js": &bintree{publicAceSrcMinSnippetsCssJs, map[string]*bintree{}}, - "curly.js": &bintree{publicAceSrcMinSnippetsCurlyJs, map[string]*bintree{}}, - "d.js": &bintree{publicAceSrcMinSnippetsDJs, map[string]*bintree{}}, - "dart.js": &bintree{publicAceSrcMinSnippetsDartJs, map[string]*bintree{}}, - "diff.js": &bintree{publicAceSrcMinSnippetsDiffJs, map[string]*bintree{}}, - "django.js": &bintree{publicAceSrcMinSnippetsDjangoJs, map[string]*bintree{}}, - "dockerfile.js": &bintree{publicAceSrcMinSnippetsDockerfileJs, map[string]*bintree{}}, - "dot.js": &bintree{publicAceSrcMinSnippetsDotJs, map[string]*bintree{}}, - "drools.js": &bintree{publicAceSrcMinSnippetsDroolsJs, map[string]*bintree{}}, - "eiffel.js": &bintree{publicAceSrcMinSnippetsEiffelJs, map[string]*bintree{}}, - "ejs.js": &bintree{publicAceSrcMinSnippetsEjsJs, map[string]*bintree{}}, - "elixir.js": &bintree{publicAceSrcMinSnippetsElixirJs, map[string]*bintree{}}, - "elm.js": &bintree{publicAceSrcMinSnippetsElmJs, map[string]*bintree{}}, - "erlang.js": &bintree{publicAceSrcMinSnippetsErlangJs, map[string]*bintree{}}, - "forth.js": &bintree{publicAceSrcMinSnippetsForthJs, map[string]*bintree{}}, - "fortran.js": &bintree{publicAceSrcMinSnippetsFortranJs, map[string]*bintree{}}, - "ftl.js": &bintree{publicAceSrcMinSnippetsFtlJs, map[string]*bintree{}}, - "gcode.js": &bintree{publicAceSrcMinSnippetsGcodeJs, map[string]*bintree{}}, - "gherkin.js": &bintree{publicAceSrcMinSnippetsGherkinJs, map[string]*bintree{}}, - "gitignore.js": &bintree{publicAceSrcMinSnippetsGitignoreJs, map[string]*bintree{}}, - "glsl.js": &bintree{publicAceSrcMinSnippetsGlslJs, map[string]*bintree{}}, - "gobstones.js": &bintree{publicAceSrcMinSnippetsGobstonesJs, map[string]*bintree{}}, - "golang.js": &bintree{publicAceSrcMinSnippetsGolangJs, map[string]*bintree{}}, - "groovy.js": &bintree{publicAceSrcMinSnippetsGroovyJs, map[string]*bintree{}}, - "haml.js": &bintree{publicAceSrcMinSnippetsHamlJs, map[string]*bintree{}}, - "handlebars.js": &bintree{publicAceSrcMinSnippetsHandlebarsJs, map[string]*bintree{}}, - "haskell.js": &bintree{publicAceSrcMinSnippetsHaskellJs, map[string]*bintree{}}, - "haskell_cabal.js": &bintree{publicAceSrcMinSnippetsHaskell_cabalJs, map[string]*bintree{}}, - "haxe.js": &bintree{publicAceSrcMinSnippetsHaxeJs, map[string]*bintree{}}, - "hjson.js": &bintree{publicAceSrcMinSnippetsHjsonJs, map[string]*bintree{}}, - "html.js": &bintree{publicAceSrcMinSnippetsHtmlJs, map[string]*bintree{}}, - "html_elixir.js": &bintree{publicAceSrcMinSnippetsHtml_elixirJs, map[string]*bintree{}}, - "html_ruby.js": &bintree{publicAceSrcMinSnippetsHtml_rubyJs, map[string]*bintree{}}, - "ini.js": &bintree{publicAceSrcMinSnippetsIniJs, map[string]*bintree{}}, - "io.js": &bintree{publicAceSrcMinSnippetsIoJs, map[string]*bintree{}}, - "jack.js": &bintree{publicAceSrcMinSnippetsJackJs, map[string]*bintree{}}, - "jade.js": &bintree{publicAceSrcMinSnippetsJadeJs, map[string]*bintree{}}, - "java.js": &bintree{publicAceSrcMinSnippetsJavaJs, map[string]*bintree{}}, - "javascript.js": &bintree{publicAceSrcMinSnippetsJavascriptJs, map[string]*bintree{}}, - "json.js": &bintree{publicAceSrcMinSnippetsJsonJs, map[string]*bintree{}}, - "jsoniq.js": &bintree{publicAceSrcMinSnippetsJsoniqJs, map[string]*bintree{}}, - "jsp.js": &bintree{publicAceSrcMinSnippetsJspJs, map[string]*bintree{}}, - "jsx.js": &bintree{publicAceSrcMinSnippetsJsxJs, map[string]*bintree{}}, - "julia.js": &bintree{publicAceSrcMinSnippetsJuliaJs, map[string]*bintree{}}, - "kotlin.js": &bintree{publicAceSrcMinSnippetsKotlinJs, map[string]*bintree{}}, - "latex.js": &bintree{publicAceSrcMinSnippetsLatexJs, map[string]*bintree{}}, - "lean.js": &bintree{publicAceSrcMinSnippetsLeanJs, map[string]*bintree{}}, - "less.js": &bintree{publicAceSrcMinSnippetsLessJs, map[string]*bintree{}}, - "liquid.js": &bintree{publicAceSrcMinSnippetsLiquidJs, map[string]*bintree{}}, - "lisp.js": &bintree{publicAceSrcMinSnippetsLispJs, map[string]*bintree{}}, - "live_script.js": &bintree{publicAceSrcMinSnippetsLive_scriptJs, map[string]*bintree{}}, - "livescript.js": &bintree{publicAceSrcMinSnippetsLivescriptJs, map[string]*bintree{}}, - "logiql.js": &bintree{publicAceSrcMinSnippetsLogiqlJs, map[string]*bintree{}}, - "lsl.js": &bintree{publicAceSrcMinSnippetsLslJs, map[string]*bintree{}}, - "lua.js": &bintree{publicAceSrcMinSnippetsLuaJs, map[string]*bintree{}}, - "luapage.js": &bintree{publicAceSrcMinSnippetsLuapageJs, map[string]*bintree{}}, - "lucene.js": &bintree{publicAceSrcMinSnippetsLuceneJs, map[string]*bintree{}}, - "makefile.js": &bintree{publicAceSrcMinSnippetsMakefileJs, map[string]*bintree{}}, - "markdown.js": &bintree{publicAceSrcMinSnippetsMarkdownJs, map[string]*bintree{}}, - "mask.js": &bintree{publicAceSrcMinSnippetsMaskJs, map[string]*bintree{}}, - "matlab.js": &bintree{publicAceSrcMinSnippetsMatlabJs, map[string]*bintree{}}, - "maze.js": &bintree{publicAceSrcMinSnippetsMazeJs, map[string]*bintree{}}, - "mel.js": &bintree{publicAceSrcMinSnippetsMelJs, map[string]*bintree{}}, - "mips_assembler.js": &bintree{publicAceSrcMinSnippetsMips_assemblerJs, map[string]*bintree{}}, - "mipsassembler.js": &bintree{publicAceSrcMinSnippetsMipsassemblerJs, map[string]*bintree{}}, - "mushcode.js": &bintree{publicAceSrcMinSnippetsMushcodeJs, map[string]*bintree{}}, - "mysql.js": &bintree{publicAceSrcMinSnippetsMysqlJs, map[string]*bintree{}}, - "nix.js": &bintree{publicAceSrcMinSnippetsNixJs, map[string]*bintree{}}, - "nsis.js": &bintree{publicAceSrcMinSnippetsNsisJs, map[string]*bintree{}}, - "objectivec.js": &bintree{publicAceSrcMinSnippetsObjectivecJs, map[string]*bintree{}}, - "ocaml.js": &bintree{publicAceSrcMinSnippetsOcamlJs, map[string]*bintree{}}, - "pascal.js": &bintree{publicAceSrcMinSnippetsPascalJs, map[string]*bintree{}}, - "perl.js": &bintree{publicAceSrcMinSnippetsPerlJs, map[string]*bintree{}}, - "pgsql.js": &bintree{publicAceSrcMinSnippetsPgsqlJs, map[string]*bintree{}}, - "php.js": &bintree{publicAceSrcMinSnippetsPhpJs, map[string]*bintree{}}, - "plain_text.js": &bintree{publicAceSrcMinSnippetsPlain_textJs, map[string]*bintree{}}, - "powershell.js": &bintree{publicAceSrcMinSnippetsPowershellJs, map[string]*bintree{}}, - "praat.js": &bintree{publicAceSrcMinSnippetsPraatJs, map[string]*bintree{}}, - "prolog.js": &bintree{publicAceSrcMinSnippetsPrologJs, map[string]*bintree{}}, - "properties.js": &bintree{publicAceSrcMinSnippetsPropertiesJs, map[string]*bintree{}}, - "protobuf.js": &bintree{publicAceSrcMinSnippetsProtobufJs, map[string]*bintree{}}, - "python.js": &bintree{publicAceSrcMinSnippetsPythonJs, map[string]*bintree{}}, - "r.js": &bintree{publicAceSrcMinSnippetsRJs, map[string]*bintree{}}, - "razor.js": &bintree{publicAceSrcMinSnippetsRazorJs, map[string]*bintree{}}, - "rdoc.js": &bintree{publicAceSrcMinSnippetsRdocJs, map[string]*bintree{}}, - "rhtml.js": &bintree{publicAceSrcMinSnippetsRhtmlJs, map[string]*bintree{}}, - "rst.js": &bintree{publicAceSrcMinSnippetsRstJs, map[string]*bintree{}}, - "ruby.js": &bintree{publicAceSrcMinSnippetsRubyJs, map[string]*bintree{}}, - "rust.js": &bintree{publicAceSrcMinSnippetsRustJs, map[string]*bintree{}}, - "sass.js": &bintree{publicAceSrcMinSnippetsSassJs, map[string]*bintree{}}, - "scad.js": &bintree{publicAceSrcMinSnippetsScadJs, map[string]*bintree{}}, - "scala.js": &bintree{publicAceSrcMinSnippetsScalaJs, map[string]*bintree{}}, - "scheme.js": &bintree{publicAceSrcMinSnippetsSchemeJs, map[string]*bintree{}}, - "scss.js": &bintree{publicAceSrcMinSnippetsScssJs, map[string]*bintree{}}, - "sh.js": &bintree{publicAceSrcMinSnippetsShJs, map[string]*bintree{}}, - "sjs.js": &bintree{publicAceSrcMinSnippetsSjsJs, map[string]*bintree{}}, - "smarty.js": &bintree{publicAceSrcMinSnippetsSmartyJs, map[string]*bintree{}}, - "snippets.js": &bintree{publicAceSrcMinSnippetsSnippetsJs, map[string]*bintree{}}, - "soy_template.js": &bintree{publicAceSrcMinSnippetsSoy_templateJs, map[string]*bintree{}}, - "space.js": &bintree{publicAceSrcMinSnippetsSpaceJs, map[string]*bintree{}}, - "sql.js": &bintree{publicAceSrcMinSnippetsSqlJs, map[string]*bintree{}}, - "sqlserver.js": &bintree{publicAceSrcMinSnippetsSqlserverJs, map[string]*bintree{}}, - "stylus.js": &bintree{publicAceSrcMinSnippetsStylusJs, map[string]*bintree{}}, - "svg.js": &bintree{publicAceSrcMinSnippetsSvgJs, map[string]*bintree{}}, - "swift.js": &bintree{publicAceSrcMinSnippetsSwiftJs, map[string]*bintree{}}, - "swig.js": &bintree{publicAceSrcMinSnippetsSwigJs, map[string]*bintree{}}, - "tcl.js": &bintree{publicAceSrcMinSnippetsTclJs, map[string]*bintree{}}, - "tex.js": &bintree{publicAceSrcMinSnippetsTexJs, map[string]*bintree{}}, - "text.js": &bintree{publicAceSrcMinSnippetsTextJs, map[string]*bintree{}}, - "textile.js": &bintree{publicAceSrcMinSnippetsTextileJs, map[string]*bintree{}}, - "toml.js": &bintree{publicAceSrcMinSnippetsTomlJs, map[string]*bintree{}}, - "tsx.js": &bintree{publicAceSrcMinSnippetsTsxJs, map[string]*bintree{}}, - "twig.js": &bintree{publicAceSrcMinSnippetsTwigJs, map[string]*bintree{}}, - "typescript.js": &bintree{publicAceSrcMinSnippetsTypescriptJs, map[string]*bintree{}}, - "vala.js": &bintree{publicAceSrcMinSnippetsValaJs, map[string]*bintree{}}, - "vbscript.js": &bintree{publicAceSrcMinSnippetsVbscriptJs, map[string]*bintree{}}, - "velocity.js": &bintree{publicAceSrcMinSnippetsVelocityJs, map[string]*bintree{}}, - "verilog.js": &bintree{publicAceSrcMinSnippetsVerilogJs, map[string]*bintree{}}, - "vhdl.js": &bintree{publicAceSrcMinSnippetsVhdlJs, map[string]*bintree{}}, - "wollok.js": &bintree{publicAceSrcMinSnippetsWollokJs, map[string]*bintree{}}, - "xml.js": &bintree{publicAceSrcMinSnippetsXmlJs, map[string]*bintree{}}, - "xquery.js": &bintree{publicAceSrcMinSnippetsXqueryJs, map[string]*bintree{}}, - "yaml.js": &bintree{publicAceSrcMinSnippetsYamlJs, map[string]*bintree{}}, - }}, - "theme-github.js": &bintree{publicAceSrcMinThemeGithubJs, map[string]*bintree{}}, - "worker-coffee.js": &bintree{publicAceSrcMinWorkerCoffeeJs, map[string]*bintree{}}, - "worker-css.js": &bintree{publicAceSrcMinWorkerCssJs, map[string]*bintree{}}, - "worker-html.js": &bintree{publicAceSrcMinWorkerHtmlJs, map[string]*bintree{}}, - "worker-javascript.js": &bintree{publicAceSrcMinWorkerJavascriptJs, map[string]*bintree{}}, - "worker-json.js": &bintree{publicAceSrcMinWorkerJsonJs, map[string]*bintree{}}, - "worker-lua.js": &bintree{publicAceSrcMinWorkerLuaJs, map[string]*bintree{}}, - "worker-php.js": &bintree{publicAceSrcMinWorkerPhpJs, map[string]*bintree{}}, - "worker-xml.js": &bintree{publicAceSrcMinWorkerXmlJs, map[string]*bintree{}}, - "worker-xquery.js": &bintree{publicAceSrcMinWorkerXqueryJs, map[string]*bintree{}}, - }}, - }}, - "css": &bintree{nil, map[string]*bintree{ - "fonts.css": &bintree{publicCssFontsCss, map[string]*bintree{}}, - "material": &bintree{nil, map[string]*bintree{ - "icons.woff2": &bintree{publicCssMaterialIconsWoff2, map[string]*bintree{}}, - }}, - "normalize.css": &bintree{publicCssNormalizeCss, map[string]*bintree{}}, - "roboto": &bintree{nil, map[string]*bintree{ - "medium-cyrillic-ext.woff2": &bintree{publicCssRobotoMediumCyrillicExtWoff2, map[string]*bintree{}}, - "medium-cyrillic.woff2": &bintree{publicCssRobotoMediumCyrillicWoff2, map[string]*bintree{}}, - "medium-greek-ext.woff2": &bintree{publicCssRobotoMediumGreekExtWoff2, map[string]*bintree{}}, - "medium-greek.woff2": &bintree{publicCssRobotoMediumGreekWoff2, map[string]*bintree{}}, - "medium-latin-ext.woff2": &bintree{publicCssRobotoMediumLatinExtWoff2, map[string]*bintree{}}, - "medium-latin.woff2": &bintree{publicCssRobotoMediumLatinWoff2, map[string]*bintree{}}, - "medium-vietnamese.woff2": &bintree{publicCssRobotoMediumVietnameseWoff2, map[string]*bintree{}}, - "normal-cyrillic-ext.woff2": &bintree{publicCssRobotoNormalCyrillicExtWoff2, map[string]*bintree{}}, - "normal-cyrillic.woff2": &bintree{publicCssRobotoNormalCyrillicWoff2, map[string]*bintree{}}, - "normal-greek-ext.woff2": &bintree{publicCssRobotoNormalGreekExtWoff2, map[string]*bintree{}}, - "normal-greek.woff2": &bintree{publicCssRobotoNormalGreekWoff2, map[string]*bintree{}}, - "normal-latin-ext.woff2": &bintree{publicCssRobotoNormalLatinExtWoff2, map[string]*bintree{}}, - "normal-latin.woff2": &bintree{publicCssRobotoNormalLatinWoff2, map[string]*bintree{}}, - "normal-vietnamese.woff2": &bintree{publicCssRobotoNormalVietnameseWoff2, map[string]*bintree{}}, - }}, - "styles.css": &bintree{publicCssStylesCss, map[string]*bintree{}}, - }}, - "js": &bintree{nil, map[string]*bintree{ - "common.js": &bintree{publicJsCommonJs, map[string]*bintree{}}, - "editor.js": &bintree{publicJsEditorJs, map[string]*bintree{}}, - "form2js.js": &bintree{publicJsForm2jsJs, map[string]*bintree{}}, - "listing.js": &bintree{publicJsListingJs, map[string]*bintree{}}, - }}, - }}, - "templates": &bintree{nil, map[string]*bintree{ - "base.tmpl": &bintree{templatesBaseTmpl, map[string]*bintree{}}, - "editor.tmpl": &bintree{templatesEditorTmpl, map[string]*bintree{}}, - "frontmatter.tmpl": &bintree{templatesFrontmatterTmpl, map[string]*bintree{}}, - "listing.tmpl": &bintree{templatesListingTmpl, map[string]*bintree{}}, - "minimal.tmpl": &bintree{templatesMinimalTmpl, map[string]*bintree{}}, - "single.tmpl": &bintree{templatesSingleTmpl, map[string]*bintree{}}, - }}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) - if err != nil { - return err - } - return nil -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} - diff --git a/cmd/filemanager/main.go b/cmd/filemanager/main.go deleted file mode 100644 index f421b3b7..00000000 --- a/cmd/filemanager/main.go +++ /dev/null @@ -1,21 +0,0 @@ -package main - -import ( - "net/http" - - "github.com/hacdias/filemanager" - handlers "github.com/hacdias/filemanager/http" -) - -var cfg *filemanager.Config - -func handler(w http.ResponseWriter, r *http.Request) { - handlers.ServeHTTP(w, r, cfg) -} - -func main() { - cfg = filemanager.New("D:\\TEST\\") - - http.HandleFunc("/", handler) - http.ListenAndServe(":8080", nil) -} diff --git a/editor.go b/editor.go deleted file mode 100644 index c42deee1..00000000 --- a/editor.go +++ /dev/null @@ -1,120 +0,0 @@ -package filemanager - -import ( - "bytes" - "errors" - "net/http" - "path/filepath" - "strings" - - "github.com/hacdias/filemanager/frontmatter" - "github.com/spf13/hugo/parser" -) - -// editor contains the information for the editor page -type editor struct { - Class string - Mode string - Visual bool - Content string - FrontMatter struct { - Content *frontmatter.Content - Rune rune - } -} - -// newEditor gets the editor based on a FileInfo struct -func newEditor(r *http.Request, i *fileInfo) (*editor, error) { - var err error - - // Create a new editor variable and set the mode - e := new(editor) - e.Mode = editorMode(i.Name) - e.Class = editorClass(e.Mode) - - if e.Class == "frontmatter-only" || e.Class == "complete" { - e.Visual = true - } - - if r.URL.Query().Get("visual") == "false" { - e.Class = "content-only" - } - - hasRune := frontmatter.HasRune(i.Content) - - if e.Class == "frontmatter-only" && !hasRune { - e.FrontMatter.Rune, err = frontmatter.StringFormatToRune(e.Mode) - if err != nil { - goto Error - } - i.Content = frontmatter.AppendRune(i.Content, e.FrontMatter.Rune) - hasRune = true - } - - if e.Class == "frontmatter-only" && hasRune { - e.FrontMatter.Content, _, err = frontmatter.Pretty(i.Content) - if err != nil { - goto Error - } - } - - if e.Class == "complete" && hasRune { - var page parser.Page - // Starts a new buffer and parses the file using Hugo's functions - buffer := bytes.NewBuffer(i.Content) - page, err = parser.ReadFrom(buffer) - - if err != nil { - goto Error - } - - // Parses the page content and the frontmatter - e.Content = strings.TrimSpace(string(page.Content())) - e.FrontMatter.Rune = rune(i.Content[0]) - e.FrontMatter.Content, _, err = frontmatter.Pretty(page.FrontMatter()) - } - - if e.Class == "complete" && !hasRune { - err = errors.New("Complete but without rune") - } - -Error: - if e.Class == "content-only" || err != nil { - e.Class = "content-only" - e.Content = i.StringifyContent() - } - - return e, nil -} - -func editorClass(mode string) string { - switch mode { - case "json", "toml", "yaml": - return "frontmatter-only" - case "markdown", "asciidoc", "rst": - return "complete" - } - - return "content-only" -} - -func editorMode(filename string) string { - mode := strings.TrimPrefix(filepath.Ext(filename), ".") - - switch mode { - case "md", "markdown", "mdown", "mmark": - mode = "markdown" - case "asciidoc", "adoc", "ad": - mode = "asciidoc" - case "rst": - mode = "rst" - case "html", "htm": - mode = "html" - case "js": - mode = "javascript" - case "go": - mode = "golang" - } - - return mode -} diff --git a/file.go b/file.go deleted file mode 100644 index 5e0599b9..00000000 --- a/file.go +++ /dev/null @@ -1,161 +0,0 @@ -package filemanager - -import ( - "io/ioutil" - "mime" - "net/http" - "net/url" - "os" - "path/filepath" - "strings" - "time" - - humanize "github.com/dustin/go-humanize" -) - -// fileInfo contains the information about a particular file or directory. -type fileInfo struct { - Name string - Size int64 - URL string - Extension string - ModTime time.Time - Mode os.FileMode - IsDir bool - Path string // Relative path to Caddyfile - VirtualPath string // Relative path to u.FileSystem - Mimetype string - Content []byte - Type string - UserAllowed bool // Indicates if the user has enough permissions -} - -// getFileInfo retrieves the file information and the error, if there is any. -func getFileInfo(url *url.URL, c *FileManager, u *User) (*fileInfo, error) { - var err error - - i := &fileInfo{URL: c.PrefixURL + url.Path} - i.VirtualPath = strings.Replace(url.Path, c.BaseURL, "", 1) - i.VirtualPath = strings.TrimPrefix(i.VirtualPath, "/") - i.VirtualPath = "/" + i.VirtualPath - - i.Path = u.Scope + i.VirtualPath - i.Path = filepath.Clean(i.Path) - - info, err := os.Stat(i.Path) - if err != nil { - return i, err - } - - i.Name = info.Name() - i.ModTime = info.ModTime() - i.Mode = info.Mode() - i.IsDir = info.IsDir() - i.Size = info.Size() - i.Extension = filepath.Ext(i.Name) - return i, nil -} - -var textExtensions = [...]string{ - ".md", ".markdown", ".mdown", ".mmark", - ".asciidoc", ".adoc", ".ad", - ".rst", - ".json", ".toml", ".yaml", ".csv", ".xml", ".rss", ".conf", ".ini", - ".tex", ".sty", - ".css", ".sass", ".scss", - ".js", - ".html", - ".txt", ".rtf", - ".sh", ".bash", ".ps1", ".bat", ".cmd", - ".php", ".pl", ".py", - "Caddyfile", - ".c", ".cc", ".h", ".hh", ".cpp", ".hpp", ".f90", - ".f", ".bas", ".d", ".ada", ".nim", ".cr", ".java", ".cs", ".vala", ".vapi", -} - -// RetrieveFileType obtains the mimetype and a simplified internal Type -// using the first 512 bytes from the file. -func (i fileInfo) RetrieveFileType() error { - i.Mimetype = mime.TypeByExtension(i.Extension) - - if i.Mimetype == "" { - err := i.Read() - if err != nil { - return err - } - - i.Mimetype = http.DetectContentType(i.Content) - } - - if strings.HasPrefix(i.Mimetype, "video") { - i.Type = "video" - return nil - } - - if strings.HasPrefix(i.Mimetype, "audio") { - i.Type = "audio" - return nil - } - - if strings.HasPrefix(i.Mimetype, "image") { - i.Type = "image" - return nil - } - - if strings.HasPrefix(i.Mimetype, "text") { - i.Type = "text" - return nil - } - - if strings.HasPrefix(i.Mimetype, "application/javascript") { - i.Type = "text" - return nil - } - - // If the type isn't text (and is blob for example), it will check some - // common types that are mistaken not to be text. - for _, extension := range textExtensions { - if strings.HasSuffix(i.Name, extension) { - i.Type = "text" - return nil - } - } - - i.Type = "blob" - return nil -} - -// Reads the file. -func (i fileInfo) Read() error { - if len(i.Content) != 0 { - return nil - } - - var err error - i.Content, err = ioutil.ReadFile(i.Path) - if err != nil { - return err - } - return nil -} - -// StringifyContent returns the string version of Raw -func (i fileInfo) StringifyContent() string { - return string(i.Content) -} - -// HumanSize returns the size of the file as a human-readable string -// in IEC format (i.e. power of 2 or base 1024). -func (i fileInfo) HumanSize() string { - return humanize.IBytes(uint64(i.Size)) -} - -// HumanModTime returns the modified time of the file as a human-readable string. -func (i fileInfo) HumanModTime(format string) string { - return i.ModTime.Format(format) -} - -// CanBeEdited checks if the extension of a file is supported by the editor -func (i fileInfo) CanBeEdited() bool { - return i.Type == "text" -} diff --git a/filemanager.go b/filemanager.go deleted file mode 100644 index 6fc6107c..00000000 --- a/filemanager.go +++ /dev/null @@ -1,116 +0,0 @@ -package filemanager - -import ( - "net/http" - "regexp" - "strings" - - rice "github.com/GeertJohan/go.rice" - - "golang.org/x/net/webdav" -) - -// FileManager is a configuration for browsing in a particular path. -type FileManager struct { - *User - PrefixURL string // A part of the URL that is stripped from the http.Request - BaseURL string // The base URL of FileManager interface - WebDavURL string // The URL of WebDAV - Users map[string]*User - BeforeSave Command - AfterSave Command - Assets struct { - Templates *rice.Box - Static *rice.Box - } -} - -// New creates a new FileManager object with the default settings -// for a certain scope. -func New(scope string) *FileManager { - fm := &FileManager{ - User: &User{ - Scope: scope, - FileSystem: webdav.Dir(scope), - AllowCommands: true, - AllowEdit: true, - AllowNew: true, - Commands: []string{"git", "svn", "hg"}, - Rules: []*Rule{{ - Regex: true, - Allow: false, - Regexp: regexp.MustCompile("\\/\\..+"), - }}, - }, - Users: map[string]*User{}, - BaseURL: "", - PrefixURL: "", - WebDavURL: "/webdav", - BeforeSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, - AfterSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, - } - - fm.Handler = &webdav.Handler{ - Prefix: fm.WebDavURL, - FileSystem: fm.FileSystem, - LockSystem: webdav.NewMemLS(), - } - - return fm -} - -// AbsoluteURL ... -func (c FileManager) AbsoluteURL() string { - return c.PrefixURL + c.BaseURL -} - -// AbsoluteWebdavURL ... -func (c FileManager) AbsoluteWebdavURL() string { - return c.PrefixURL + c.WebDavURL -} - -// Rule is a dissalow/allow rule -type Rule struct { - Regex bool - Allow bool - Path string - Regexp *regexp.Regexp -} - -// User contains the configuration for each user -type User struct { - Scope string `json:"-"` // Path the user have access - FileSystem webdav.FileSystem `json:"-"` // The virtual file system the user have access - Handler *webdav.Handler `json:"-"` // The WebDav HTTP Handler - StyleSheet string `json:"-"` // Costum stylesheet - Rules []*Rule `json:"-"` // Access rules - AllowNew bool // Can create files and folders - AllowEdit bool // Can edit/rename files - AllowCommands bool // Can execute commands - Commands []string // Available Commands -} - -// Allowed checks if the user has permission to access a directory/file -func (u User) Allowed(url string) bool { - var rule *Rule - i := len(u.Rules) - 1 - - for i >= 0 { - rule = u.Rules[i] - - if rule.Regex { - if rule.Regexp.MatchString(url) { - return rule.Allow - } - } else if strings.HasPrefix(url, rule.Path) { - return rule.Allow - } - - i-- - } - - return true -} - -// Command is a user-defined command that is executed in some moments. -type Command func(r *http.Request, c *FileManager, u *User) error diff --git a/frontmatter/frontmatter.go b/frontmatter/frontmatter.go deleted file mode 100644 index 6e2401d8..00000000 --- a/frontmatter/frontmatter.go +++ /dev/null @@ -1,275 +0,0 @@ -package frontmatter - -import ( - "bytes" - "encoding/json" - "errors" - "log" - "reflect" - "sort" - "strconv" - "strings" - - "gopkg.in/yaml.v2" - - "github.com/BurntSushi/toml" - - "github.com/spf13/cast" -) - -const ( - mainName = "#MAIN#" - objectType = "object" - arrayType = "array" -) - -var mainTitle = "" - -// Pretty creates a new FrontMatter object -func Pretty(content []byte) (*Content, string, error) { - data, err := Unmarshal(content) - - if err != nil { - return &Content{}, "", err - } - - kind := reflect.ValueOf(data).Kind() - - if kind == reflect.Invalid { - return &Content{}, "", nil - } - - object := new(Block) - object.Type = objectType - object.Name = mainName - - if kind == reflect.Map { - object.Type = objectType - } else if kind == reflect.Slice || kind == reflect.Array { - object.Type = arrayType - } - - return rawToPretty(data, object), mainTitle, nil -} - -// Unmarshal returns the data of the frontmatter -func Unmarshal(content []byte) (interface{}, error) { - mark := rune(content[0]) - var data interface{} - - switch mark { - case '-': - // If it's YAML - if err := yaml.Unmarshal(content, &data); err != nil { - return nil, err - } - case '+': - // If it's TOML - content = bytes.Replace(content, []byte("+"), []byte(""), -1) - if _, err := toml.Decode(string(content), &data); err != nil { - return nil, err - } - case '{', '[': - // If it's JSON - if err := json.Unmarshal(content, &data); err != nil { - return nil, err - } - default: - return nil, errors.New("Invalid frontmatter type") - } - - return data, nil -} - -// Marshal encodes the interface in a specific format -func Marshal(data interface{}, mark rune) ([]byte, error) { - b := new(bytes.Buffer) - - switch mark { - case '+': - enc := toml.NewEncoder(b) - err := enc.Encode(data) - if err != nil { - return nil, err - } - return b.Bytes(), nil - case '{': - by, err := json.MarshalIndent(data, "", " ") - if err != nil { - return nil, err - } - b.Write(by) - _, err = b.Write([]byte("\n")) - if err != nil { - return nil, err - } - return b.Bytes(), nil - case '-': - by, err := yaml.Marshal(data) - if err != nil { - return nil, err - } - b.Write(by) - _, err = b.Write([]byte("...")) - if err != nil { - return nil, err - } - return b.Bytes(), nil - default: - return nil, errors.New("Unsupported Format provided") - } -} - -// Content is the block content -type Content struct { - Other interface{} - Fields []*Block - Arrays []*Block - Objects []*Block -} - -// Block is a block -type Block struct { - Name string - Title string - Type string - HTMLType string - Content *Content - Parent *Block -} - -func rawToPretty(config interface{}, parent *Block) *Content { - objects := []*Block{} - arrays := []*Block{} - fields := []*Block{} - - cnf := map[string]interface{}{} - kind := reflect.TypeOf(config) - - switch kind { - case reflect.TypeOf(map[interface{}]interface{}{}): - for key, value := range config.(map[interface{}]interface{}) { - cnf[key.(string)] = value - } - case reflect.TypeOf([]map[string]interface{}{}): - for index, value := range config.([]map[string]interface{}) { - cnf[strconv.Itoa(index)] = value - } - case reflect.TypeOf([]map[interface{}]interface{}{}): - for index, value := range config.([]map[interface{}]interface{}) { - cnf[strconv.Itoa(index)] = value - } - case reflect.TypeOf([]interface{}{}): - for index, value := range config.([]interface{}) { - cnf[strconv.Itoa(index)] = value - } - default: - cnf = config.(map[string]interface{}) - } - - for name, element := range cnf { - if isMap(element) { - objects = append(objects, handleObjects(element, parent, name)) - } else if isSlice(element) { - arrays = append(arrays, handleArrays(element, parent, name)) - } else { - if name == "title" && parent.Name == mainName { - mainTitle = element.(string) - } - fields = append(fields, handleFlatValues(element, parent, name)) - } - } - - sort.Sort(sortByTitle(fields)) - sort.Sort(sortByTitle(arrays)) - sort.Sort(sortByTitle(objects)) - return &Content{ - Fields: fields, - Arrays: arrays, - Objects: objects, - } -} - -type sortByTitle []*Block - -func (f sortByTitle) Len() int { return len(f) } -func (f sortByTitle) Swap(i, j int) { f[i], f[j] = f[j], f[i] } -func (f sortByTitle) Less(i, j int) bool { - return strings.ToLower(f[i].Name) < strings.ToLower(f[j].Name) -} - -func handleObjects(content interface{}, parent *Block, name string) *Block { - c := new(Block) - c.Parent = parent - c.Type = objectType - c.Title = name - - if parent.Name == mainName { - c.Name = c.Title - } else if parent.Type == arrayType { - c.Name = parent.Name + "[" + name + "]" - } else { - c.Name = parent.Name + "." + c.Title - } - - c.Content = rawToPretty(content, c) - return c -} - -func handleArrays(content interface{}, parent *Block, name string) *Block { - c := new(Block) - c.Parent = parent - c.Type = arrayType - c.Title = name - - if parent.Name == mainName { - c.Name = name - } else { - c.Name = parent.Name + "." + name - } - - c.Content = rawToPretty(content, c) - return c -} - -func handleFlatValues(content interface{}, parent *Block, name string) *Block { - c := new(Block) - c.Parent = parent - - switch content.(type) { - case bool: - c.Type = "boolean" - case int, float32, float64: - c.Type = "number" - default: - c.Type = "string" - } - - c.Content = &Content{Other: content} - - switch strings.ToLower(name) { - case "description": - c.HTMLType = "textarea" - case "date", "publishdate": - c.HTMLType = "datetime" - c.Content = &Content{Other: cast.ToTime(content)} - default: - c.HTMLType = "text" - } - - if parent.Type == arrayType { - c.Name = parent.Name + "[]" - c.Title = content.(string) - } else if parent.Type == objectType { - c.Title = name - c.Name = parent.Name + "." + name - - if parent.Name == mainName { - c.Name = name - } - } else { - log.Panic("Parent type not allowed in handleFlatValues.") - } - - return c -} diff --git a/frontmatter/runes.go b/frontmatter/runes.go deleted file mode 100644 index b4ad1dc2..00000000 --- a/frontmatter/runes.go +++ /dev/null @@ -1,58 +0,0 @@ -package frontmatter - -import ( - "bytes" - "errors" - "strings" -) - -// HasRune checks if the file has the frontmatter rune -func HasRune(file []byte) bool { - return strings.HasPrefix(string(file), "---") || - strings.HasPrefix(string(file), "+++") || - strings.HasPrefix(string(file), "{") -} - -// AppendRune appends the frontmatter rune to a file -func AppendRune(frontmatter []byte, mark rune) []byte { - frontmatter = bytes.TrimSpace(frontmatter) - - switch mark { - case '-': - return []byte("---\n" + string(frontmatter) + "\n---") - case '+': - return []byte("+++\n" + string(frontmatter) + "\n+++") - case '{': - return []byte("{\n" + string(frontmatter) + "\n}") - } - - return frontmatter -} - -// RuneToStringFormat converts the rune to a string with the format -func RuneToStringFormat(mark rune) (string, error) { - switch mark { - case '-': - return "yaml", nil - case '+': - return "toml", nil - case '{', '}': - return "json", nil - default: - return "", errors.New("Unsupported format type") - } -} - -// StringFormatToRune converts the format name to its rune -func StringFormatToRune(format string) (rune, error) { - switch format { - case "yaml": - return '-', nil - case "toml": - return '+', nil - case "json": - return '{', nil - default: - return '0', errors.New("Unsupported format type") - } -} diff --git a/frontmatter/runes_test.go b/frontmatter/runes_test.go deleted file mode 100644 index 6d120948..00000000 --- a/frontmatter/runes_test.go +++ /dev/null @@ -1,131 +0,0 @@ -package frontmatter - -import "testing" - -type hasRuneTest struct { - File []byte - Return bool -} - -var testHasRune = []hasRuneTest{ - hasRuneTest{ - File: []byte(`--- -Lorem ipsum dolor sit amet, consectetur adipiscing elit. -Sed auctor libero eget ante fermentum commodo. ----`), - Return: true, - }, - hasRuneTest{ - File: []byte(`+++ -Lorem ipsum dolor sit amet, consectetur adipiscing elit. -Sed auctor libero eget ante fermentum commodo. -+++`), - Return: true, - }, - hasRuneTest{ - File: []byte(`{ - "json": "Lorem ipsum dolor sit amet" -}`), - Return: true, - }, - hasRuneTest{ - File: []byte(`+`), - Return: false, - }, - hasRuneTest{ - File: []byte(`++`), - Return: false, - }, - hasRuneTest{ - File: []byte(`-`), - Return: false, - }, - hasRuneTest{ - File: []byte(`--`), - Return: false, - }, - hasRuneTest{ - File: []byte(`Lorem ipsum`), - Return: false, - }, -} - -func TestHasRune(t *testing.T) { - for _, test := range testHasRune { - if HasRune(test.File) != test.Return { - t.Error("Incorrect value on HasRune") - } - } -} - -type appendRuneTest struct { - Before []byte - After []byte - Mark rune -} - -var testAppendRuneTest = []appendRuneTest{} - -func TestAppendRune(t *testing.T) { - for i, test := range testAppendRuneTest { - if !compareByte(AppendRune(test.Before, test.Mark), test.After) { - t.Errorf("Incorrect value on AppendRune of Test %d", i) - } - } -} - -func compareByte(a, b []byte) bool { - if a == nil && b == nil { - return true - } - - if a == nil || b == nil { - return false - } - - if len(a) != len(b) { - return false - } - - for i := range a { - if a[i] != b[i] { - return false - } - } - - return true -} - -var testRuneToStringFormat = map[rune]string{ - '-': "yaml", - '+': "toml", - '{': "json", - '}': "json", - '1': "", - 'a': "", -} - -func TestRuneToStringFormat(t *testing.T) { - for mark, format := range testRuneToStringFormat { - val, _ := RuneToStringFormat(mark) - if val != format { - t.Errorf("Incorrect value on RuneToStringFormat of %v; want: %s; got: %s", mark, format, val) - } - } -} - -var testStringFormatToRune = map[string]rune{ - "yaml": '-', - "toml": '+', - "json": '{', - "lorem": '0', -} - -func TestStringFormatToRune(t *testing.T) { - for format, mark := range testStringFormatToRune { - val, _ := StringFormatToRune(format) - if val != mark { - t.Errorf("Incorrect value on StringFormatToRune of %s; want: %v; got: %v", format, mark, val) - } - } -} diff --git a/frontmatter/types.go b/frontmatter/types.go deleted file mode 100644 index 89ff9b6d..00000000 --- a/frontmatter/types.go +++ /dev/null @@ -1,13 +0,0 @@ -package frontmatter - -import "reflect" - -// isMap checks if some variable is a map -func isMap(sth interface{}) bool { - return reflect.ValueOf(sth).Kind() == reflect.Map -} - -// isSlice checks if some variable is a slice -func isSlice(sth interface{}) bool { - return reflect.ValueOf(sth).Kind() == reflect.Slice -} diff --git a/frontmatter/types_test.go b/frontmatter/types_test.go deleted file mode 100644 index e2f008c3..00000000 --- a/frontmatter/types_test.go +++ /dev/null @@ -1,49 +0,0 @@ -package frontmatter - -import "testing" - -type interfaceToBool struct { - Value interface{} - Result bool -} - -var testIsMap = []*interfaceToBool{ - &interfaceToBool{"teste", false}, - &interfaceToBool{453478, false}, - &interfaceToBool{-984512, false}, - &interfaceToBool{true, false}, - &interfaceToBool{map[string]bool{}, true}, - &interfaceToBool{map[int]bool{}, true}, - &interfaceToBool{map[interface{}]bool{}, true}, - &interfaceToBool{[]string{}, false}, -} - -func TestIsMap(t *testing.T) { - for _, test := range testIsMap { - if isMap(test.Value) != test.Result { - t.Errorf("Incorrect value on IsMap for %v; want: %v; got: %v", test.Value, test.Result, !test.Result) - } - } -} - -var testIsSlice = []*interfaceToBool{ - &interfaceToBool{"teste", false}, - &interfaceToBool{453478, false}, - &interfaceToBool{-984512, false}, - &interfaceToBool{true, false}, - &interfaceToBool{map[string]bool{}, false}, - &interfaceToBool{map[int]bool{}, false}, - &interfaceToBool{map[interface{}]bool{}, false}, - &interfaceToBool{[]string{}, true}, - &interfaceToBool{[]int{}, true}, - &interfaceToBool{[]bool{}, true}, - &interfaceToBool{[]interface{}{}, true}, -} - -func TestIsSlice(t *testing.T) { - for _, test := range testIsSlice { - if isSlice(test.Value) != test.Result { - t.Errorf("Incorrect value on IsSlice for %v; want: %v; got: %v", test.Value, test.Result, !test.Result) - } - } -} diff --git a/http.go b/http.go deleted file mode 100644 index d6c851a1..00000000 --- a/http.go +++ /dev/null @@ -1,168 +0,0 @@ -package filemanager - -import ( - "errors" - "net/http" - "os" - "path/filepath" - "strings" - - "github.com/mholt/caddy/caddyhttp/httpserver" -) - -// ServeHTTP starts FileManager. -func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { - var ( - fi *fileInfo - user *User - code int - err error - ) - /* TODO: readd this - // Checks if the URL matches the Assets URL. Returns the asset if the - // method is GET and Status Forbidden otherwise. - if strings.HasPrefix(r.URL.Path, c.BaseURL+assets.BaseURL) { - if r.Method == http.MethodGet { - return assets.Serve(w, r, c) - } - - return http.StatusForbidden, nil - } */ - - // Obtains the user. - username, _, _ := r.BasicAuth() - if _, ok := c.Users[username]; ok { - user = c.Users[username] - } else { - user = c.User - } - - // Checks if the request URL is for the WebDav server - if httpserver.Path(r.URL.Path).Matches(c.WebDavURL) { - // Checks for user permissions relatively to this PATH - if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.WebDavURL)) { - return http.StatusForbidden, nil - } - - switch r.Method { - case "GET", "HEAD": - // Excerpt from RFC4918, section 9.4: - // - // GET, when applied to a collection, may return the contents of an - // "index.html" resource, a human-readable view of the contents of - // the collection, or something else altogether. - // - // It was decided on https://github.com/hacdias/caddy-filemanager/issues/85 - // that GET, for collections, will return the same as PROPFIND method. - path := strings.Replace(r.URL.Path, c.WebDavURL, "", 1) - path = user.Scope + "/" + path - path = filepath.Clean(path) - - var i os.FileInfo - i, err = os.Stat(path) - if err != nil { - // Is there any error? WebDav will handle it... no worries. - break - } - - if i.IsDir() { - r.Method = "PROPFIND" - - if r.Method == "HEAD" { - w = NewResponseWriterNoBody(w) - } - } - case "PROPPATCH", "MOVE", "PATCH", "PUT", "DELETE": - if !user.AllowEdit { - return http.StatusForbidden, nil - } - case "MKCOL", "COPY": - if !user.AllowNew { - return http.StatusForbidden, nil - } - } - - // Preprocess the PUT request if it's the case - if r.Method == http.MethodPut { - if err = c.BeforeSave(r, c, user); err != nil { - return http.StatusInternalServerError, err - } - - if c.preProccessPUT(w, r, user) != nil { - return http.StatusInternalServerError, err - } - } - - c.Handler.ServeHTTP(w, r) - if err = c.AfterSave(r, c, user); err != nil { - return http.StatusInternalServerError, err - } - - return 0, nil - } - - w.Header().Set("x-frame-options", "SAMEORIGIN") - w.Header().Set("x-content-type", "nosniff") - w.Header().Set("x-xss-protection", "1; mode=block") - - // Checks if the User is allowed to access this file - if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.BaseURL)) { - if r.Method == http.MethodGet { - return printError( - w, http.StatusForbidden, - errors.New("You don't have permission to access this page"), - ) - } - - return http.StatusForbidden, nil - } - - if r.URL.Query().Get("search") != "" { - return c.search(w, r, user) - } - - if r.URL.Query().Get("command") != "" { - return c.command(w, r, user) - } - - if r.Method == http.MethodGet { - // Gets the information of the directory/file - fi, err = getFileInfo(r.URL, c, user) - code = errorToHTTPCode(err, false) - if err != nil { - if r.Method == http.MethodGet { - return printError(w, code, err) - } - return code, err - } - - // If it's a dir and the path doesn't end with a trailing slash, - // redirect the user. - if fi.IsDir && !strings.HasSuffix(r.URL.Path, "/") { - http.Redirect(w, r, c.PrefixURL+r.URL.Path+"/", http.StatusTemporaryRedirect) - return 0, nil - } - - switch { - case r.URL.Query().Get("download") != "": - code, err = c.download(w, r, fi) - case r.URL.Query().Get("raw") == "true" && !fi.IsDir: - http.ServeFile(w, r, fi.Path) - code, err = 0, nil - case !fi.IsDir && r.URL.Query().Get("checksum") != "": - code, err = c.checksum(w, r, fi) - case fi.IsDir: - code, err = c.serveListing(w, r, user, fi) - default: - code, err = c.serveSingle(w, r, user, fi) - } - - if err != nil { - code, err = printError(w, code, err) - } - - return code, err - } - - return http.StatusNotImplemented, nil -} diff --git a/http_checksum.go b/http_checksum.go deleted file mode 100644 index 58f9fe0e..00000000 --- a/http_checksum.go +++ /dev/null @@ -1,50 +0,0 @@ -package filemanager - -import ( - "crypto/md5" - "crypto/sha1" - "crypto/sha256" - "crypto/sha512" - "encoding/hex" - "errors" - "hash" - "io" - "net/http" - "os" -) - -// checksum calculates the hash of a filemanager. Supports MD5, SHA1, SHA256 and SHA512. -func (c *FileManager) checksum(w http.ResponseWriter, r *http.Request, i *fileInfo) (int, error) { - query := r.URL.Query().Get("checksum") - - file, err := os.Open(i.Path) - if err != nil { - return errorToHTTPCode(err, true), err - } - - defer file.Close() - - var h hash.Hash - - switch query { - case "md5": - h = md5.New() - case "sha1": - h = sha1.New() - case "sha256": - h = sha256.New() - case "sha512": - h = sha512.New() - default: - return http.StatusBadRequest, errors.New("Unknown HASH type") - } - - _, err = io.Copy(h, file) - if err != nil { - return http.StatusInternalServerError, err - } - - val := hex.EncodeToString(h.Sum(nil)) - w.Write([]byte(val)) - return http.StatusOK, nil -} diff --git a/http_command.go b/http_command.go deleted file mode 100644 index 3893473b..00000000 --- a/http_command.go +++ /dev/null @@ -1,135 +0,0 @@ -package filemanager - -import ( - "bytes" - "net/http" - "os/exec" - "path/filepath" - "strings" - "time" - - "github.com/gorilla/websocket" -) - -var upgrader = websocket.Upgrader{ - ReadBufferSize: 1024, - WriteBufferSize: 1024, -} - -var ( - cmdNotImplemented = []byte("Command not implemented.") - cmdNotAllowed = []byte("Command not allowed.") -) - -// command handles the requests for VCS related commands: git, svn and mercurial -func (c *FileManager) command(w http.ResponseWriter, r *http.Request, u *User) (int, error) { - // Upgrades the connection to a websocket and checks for errors. - conn, err := upgrader.Upgrade(w, r, nil) - if err != nil { - return 0, err - } - defer conn.Close() - - var ( - message []byte - command []string - ) - - // Starts an infinite loop until a valid command is captured. - for { - _, message, err = conn.ReadMessage() - if err != nil { - return http.StatusInternalServerError, err - } - - command = strings.Split(string(message), " ") - if len(command) != 0 { - break - } - } - - // Check if the command is allowed - allowed := false - - for _, cmd := range u.Commands { - if cmd == command[0] { - allowed = true - } - } - - if !allowed { - err = conn.WriteMessage(websocket.BinaryMessage, cmdNotAllowed) - if err != nil { - return http.StatusInternalServerError, err - } - - return 0, nil - } - - // Check if the program is talled is installed on the computer. - if _, err = exec.LookPath(command[0]); err != nil { - err = conn.WriteMessage(websocket.BinaryMessage, cmdNotImplemented) - if err != nil { - return http.StatusInternalServerError, err - } - - return http.StatusNotImplemented, nil - } - - // Gets the path and initializes a buffer. - path := strings.Replace(r.URL.Path, c.BaseURL, c.Scope, 1) - path = filepath.Clean(path) - buff := new(bytes.Buffer) - - // Sets up the command executation. - cmd := exec.Command(command[0], command[1:]...) - cmd.Dir = path - cmd.Stderr = buff - cmd.Stdout = buff - - // Starts the command and checks for errors. - err = cmd.Start() - if err != nil { - return http.StatusInternalServerError, err - } - - // Set a 'done' variable to check whetever the command has already finished - // running or not. This verification is done using a goroutine that uses the - // method .Wait() from the command. - done := false - go func() { - err = cmd.Wait() - done = true - }() - - // Function to print the current information on the buffer to the connection. - print := func() error { - by := buff.Bytes() - if len(by) > 0 { - err = conn.WriteMessage(websocket.TextMessage, by) - if err != nil { - return err - } - } - - return nil - } - - // While the command hasn't finished running, continue sending the output - // to the client in intervals of 100 milliseconds. - for !done { - if err = print(); err != nil { - return http.StatusInternalServerError, err - } - - time.Sleep(100 * time.Millisecond) - } - - // After the command is done executing, send the output one more time to the - // browser to make sure it gets the latest information. - if err = print(); err != nil { - return http.StatusInternalServerError, err - } - - return 0, nil -} diff --git a/http_download.go b/http_download.go deleted file mode 100644 index f1556153..00000000 --- a/http_download.go +++ /dev/null @@ -1,95 +0,0 @@ -package filemanager - -import ( - "io" - "io/ioutil" - "net/http" - "net/url" - "os" - "path/filepath" - "strings" - - "github.com/mholt/archiver" -) - -// download creates an archive in one of the supported formats (zip, tar, -// tar.gz or tar.bz2) and sends it to be downloaded. -func (c *FileManager) download(w http.ResponseWriter, r *http.Request, i *fileInfo) (int, error) { - query := r.URL.Query().Get("download") - - if !i.IsDir { - w.Header().Set("Content-Disposition", "attachment; filename="+i.Name) - http.ServeFile(w, r, i.Path) - return 0, nil - } - - files := []string{} - names := strings.Split(r.URL.Query().Get("files"), ",") - - if len(names) != 0 { - for _, name := range names { - name, err := url.QueryUnescape(name) - - if err != nil { - return http.StatusInternalServerError, err - } - - files = append(files, filepath.Join(i.Path, name)) - } - - } else { - files = append(files, i.Path) - } - - if query == "true" { - query = "zip" - } - - var ( - extension string - temp string - err error - tempfile string - ) - - temp, err = ioutil.TempDir("", "") - if err != nil { - return http.StatusInternalServerError, err - } - - defer os.RemoveAll(temp) - tempfile = filepath.Join(temp, "temp") - - switch query { - case "zip": - extension, err = ".zip", archiver.Zip.Make(tempfile, files) - case "tar": - extension, err = ".tar", archiver.Tar.Make(tempfile, files) - case "targz": - extension, err = ".tar.gz", archiver.TarGz.Make(tempfile, files) - case "tarbz2": - extension, err = ".tar.bz2", archiver.TarBz2.Make(tempfile, files) - case "tarxz": - extension, err = ".tar.xz", archiver.TarXZ.Make(tempfile, files) - default: - return http.StatusNotImplemented, nil - } - - if err != nil { - return http.StatusInternalServerError, err - } - - file, err := os.Open(temp + "/temp") - if err != nil { - return http.StatusInternalServerError, err - } - - name := i.Name - if name == "." || name == "" { - name = "download" - } - - w.Header().Set("Content-Disposition", "attachment; filename="+name+extension) - io.Copy(w, file) - return http.StatusOK, nil -} diff --git a/http_listing.go b/http_listing.go deleted file mode 100644 index 11480a88..00000000 --- a/http_listing.go +++ /dev/null @@ -1,144 +0,0 @@ -package filemanager - -import ( - "encoding/json" - "net/http" - "strconv" - "strings" - - "github.com/mholt/caddy/caddyhttp/httpserver" -) - -// serveListing presents the user with a listage of a directory folder. -func (c *FileManager) serveListing(w http.ResponseWriter, r *http.Request, u *User, i *fileInfo) (int, error) { - var err error - - // Loads the content of the directory - listing, err := getListing(u, i.VirtualPath, c.PrefixURL+r.URL.Path) - if err != nil { - return errorToHTTPCode(err, true), err - } - - listing.Context = httpserver.Context{ - Root: http.Dir(u.Scope), - Req: r, - URL: r.URL, - } - - cookieScope := c.BaseURL - if cookieScope == "" { - cookieScope = "/" - } - - // Copy the query values into the Listing struct - var limit int - listing.Sort, listing.Order, limit, err = handleSortOrder(w, r, cookieScope) - if err != nil { - return http.StatusBadRequest, err - } - - listing.ApplySort() - - if limit > 0 && limit <= len(listing.Items) { - listing.Items = listing.Items[:limit] - listing.ItemsLimitedTo = limit - } - - if strings.Contains(r.Header.Get("Accept"), "application/json") { - marsh, err := json.Marshal(listing.Items) - if err != nil { - return http.StatusInternalServerError, err - } - - w.Header().Set("Content-Type", "application/json; charset=utf-8") - if _, err := w.Write(marsh); err != nil { - return http.StatusInternalServerError, err - } - - return http.StatusOK, nil - } - - displayMode := r.URL.Query().Get("display") - - if displayMode == "" { - if displayCookie, err := r.Cookie("display"); err == nil { - displayMode = displayCookie.Value - } - } - - if displayMode == "" || (displayMode != "mosaic" && displayMode != "list") { - displayMode = "mosaic" - } - - http.SetCookie(w, &http.Cookie{ - Name: "display", - Value: displayMode, - Path: cookieScope, - Secure: r.TLS != nil, - }) - - page := &page{ - Minimal: r.Header.Get("Minimal") == "true", - Info: &pageInfo{ - Name: listing.Name, - Path: i.VirtualPath, - IsDir: true, - User: u, - Config: c, - Display: displayMode, - Data: listing, - }, - } - - return page.PrintHTML(w, "listing") -} - -// handleSortOrder gets and stores for a Listing the 'sort' and 'order', -// and reads 'limit' if given. The latter is 0 if not given. Sets cookies. -func handleSortOrder(w http.ResponseWriter, r *http.Request, scope string) (sort string, order string, limit int, err error) { - sort = r.URL.Query().Get("sort") - order = r.URL.Query().Get("order") - limitQuery := r.URL.Query().Get("limit") - - // If the query 'sort' or 'order' is empty, use defaults or any values - // previously saved in Cookies. - switch sort { - case "": - sort = "name" - if sortCookie, sortErr := r.Cookie("sort"); sortErr == nil { - sort = sortCookie.Value - } - case "name", "size", "type": - http.SetCookie(w, &http.Cookie{ - Name: "sort", - Value: sort, - Path: scope, - Secure: r.TLS != nil, - }) - } - - switch order { - case "": - order = "asc" - if orderCookie, orderErr := r.Cookie("order"); orderErr == nil { - order = orderCookie.Value - } - case "asc", "desc": - http.SetCookie(w, &http.Cookie{ - Name: "order", - Value: order, - Path: scope, - Secure: r.TLS != nil, - }) - } - - if limitQuery != "" { - limit, err = strconv.Atoi(limitQuery) - // If the 'limit' query can't be interpreted as a number, return err. - if err != nil { - return - } - } - - return -} diff --git a/http_put.go b/http_put.go deleted file mode 100644 index fa41658e..00000000 --- a/http_put.go +++ /dev/null @@ -1,138 +0,0 @@ -package filemanager - -import ( - "bytes" - "encoding/json" - "errors" - "io/ioutil" - "net/http" - "path/filepath" - "strconv" - "strings" - - "github.com/hacdias/filemanager/frontmatter" -) - -// preProccessPUT is used to update a file that was edited -func (c *FileManager) preProccessPUT(w http.ResponseWriter, r *http.Request, u *User) (err error) { - var ( - data = map[string]interface{}{} - file []byte - kind string - rawBuffer = new(bytes.Buffer) - ) - - kind = r.Header.Get("kind") - rawBuffer.ReadFrom(r.Body) - - if kind != "" { - err = json.Unmarshal(rawBuffer.Bytes(), &data) - - if err != nil { - return - } - } - - switch kind { - case "frontmatter-only": - if file, err = ParseFrontMatterOnlyFile(data, r.URL.Path); err != nil { - return - } - case "content-only": - mainContent := data["content"].(string) - mainContent = strings.TrimSpace(mainContent) - file = []byte(mainContent) - case "complete": - var mark rune - - if v := r.Header.Get("Rune"); v != "" { - var n int - n, err = strconv.Atoi(v) - if err != nil { - return err - } - - mark = rune(n) - } - - if file, err = ParseCompleteFile(data, r.URL.Path, mark); err != nil { - return - } - default: - file = rawBuffer.Bytes() - } - - // Overwrite the request Body - r.Body = ioutil.NopCloser(bytes.NewReader(file)) - return -} - -// ParseFrontMatterOnlyFile parses a frontmatter only file -func ParseFrontMatterOnlyFile(data interface{}, filename string) ([]byte, error) { - frontmatter := strings.TrimPrefix(filepath.Ext(filename), ".") - f, err := ParseFrontMatter(data, frontmatter) - fString := string(f) - - // If it's toml or yaml, strip frontmatter identifier - if frontmatter == "toml" { - fString = strings.TrimSuffix(fString, "+++\n") - fString = strings.TrimPrefix(fString, "+++\n") - } - - if frontmatter == "yaml" { - fString = strings.TrimSuffix(fString, "---\n") - fString = strings.TrimPrefix(fString, "---\n") - } - - f = []byte(fString) - return f, err -} - -// ParseFrontMatter is the frontmatter parser -func ParseFrontMatter(data interface{}, front string) ([]byte, error) { - var mark rune - - switch front { - case "toml": - mark = '+' - case "json": - mark = '{' - case "yaml": - mark = '-' - default: - return nil, errors.New("Unsupported Format provided") - } - - return frontmatter.Marshal(data, mark) -} - -// ParseCompleteFile parses a complete file -func ParseCompleteFile(data map[string]interface{}, filename string, mark rune) ([]byte, error) { - mainContent := "" - - if _, ok := data["content"]; ok { - // The main content of the file - mainContent = data["content"].(string) - mainContent = "\n\n" + strings.TrimSpace(mainContent) + "\n" - - // Removes the main content from the rest of the frontmatter - delete(data, "content") - } - - if _, ok := data["date"]; ok { - data["date"] = data["date"].(string) + ":00" - } - - front, err := frontmatter.Marshal(data, mark) - if err != nil { - return []byte{}, err - } - - front = frontmatter.AppendRune(front, mark) - - // Generates the final file - f := new(bytes.Buffer) - f.Write(front) - f.Write([]byte(mainContent)) - return f.Bytes(), nil -} diff --git a/http_search.go b/http_search.go deleted file mode 100644 index 9e656de2..00000000 --- a/http_search.go +++ /dev/null @@ -1,117 +0,0 @@ -package filemanager - -import ( - "net/http" - "os" - "path/filepath" - "strings" - - "github.com/gorilla/websocket" -) - -type searchOptions struct { - CaseInsensitive bool - Terms []string -} - -func parseSearch(value string) *searchOptions { - opts := &searchOptions{ - CaseInsensitive: strings.Contains(value, "case:insensitive"), - } - - // removes the options from the value - value = strings.Replace(value, "case:insensitive", "", -1) - value = strings.Replace(value, "case:sensitive", "", -1) - value = strings.TrimSpace(value) - - if opts.CaseInsensitive { - value = strings.ToLower(value) - } - - // if the value starts with " and finishes what that character, we will - // only search for that term - if value[0] == '"' && value[len(value)-1] == '"' { - unique := strings.TrimPrefix(value, "\"") - unique = strings.TrimSuffix(unique, "\"") - - opts.Terms = []string{unique} - return opts - } - - opts.Terms = strings.Split(value, " ") - return opts -} - -// search ... -func (c *FileManager) search(w http.ResponseWriter, r *http.Request, u *User) (int, error) { - // Upgrades the connection to a websocket and checks for errors. - conn, err := upgrader.Upgrade(w, r, nil) - if err != nil { - return 0, err - } - defer conn.Close() - - var ( - value string - search *searchOptions - message []byte - ) - - // Starts an infinite loop until a valid command is captured. - for { - _, message, err = conn.ReadMessage() - if err != nil { - return http.StatusInternalServerError, err - } - - if len(message) != 0 { - value = string(message) - break - } - } - - search = parseSearch(value) - scope := strings.Replace(r.URL.Path, c.BaseURL, "", 1) - scope = strings.TrimPrefix(scope, "/") - scope = "/" + scope - scope = u.Scope + scope - scope = strings.Replace(scope, "\\", "/", -1) - scope = filepath.Clean(scope) - - err = filepath.Walk(scope, func(path string, f os.FileInfo, err error) error { - if search.CaseInsensitive { - path = strings.ToLower(path) - } - - path = strings.Replace(path, "\\", "/", -1) - is := false - - for _, term := range search.Terms { - if is { - break - } - - if strings.Contains(path, term) { - if !u.Allowed(path) { - return nil - } - - is = true - } - } - - if !is { - return nil - } - - path = strings.TrimPrefix(path, scope) - path = strings.TrimPrefix(path, "/") - return conn.WriteMessage(websocket.TextMessage, []byte(path)) - }) - - if err != nil { - return http.StatusInternalServerError, err - } - - return http.StatusOK, nil -} diff --git a/http_single.go b/http_single.go deleted file mode 100644 index 32f9dbed..00000000 --- a/http_single.go +++ /dev/null @@ -1,50 +0,0 @@ -package filemanager - -import ( - "net/http" - "strings" -) - -// serveSingle serves a single file in an editor (if it is editable), shows the -// plain file, or downloads it if it can't be shown. -func (c *FileManager) serveSingle(w http.ResponseWriter, r *http.Request, u *User, i *fileInfo) (int, error) { - var err error - - if err = i.RetrieveFileType(); err != nil { - return errorToHTTPCode(err, true), err - } - - p := &page{ - Info: &pageInfo{ - Name: i.Name, - Path: i.VirtualPath, - IsDir: false, - Data: i, - User: u, - Config: c, - }, - } - - // If the request accepts JSON, we send the file information. - if strings.Contains(r.Header.Get("Accept"), "application/json") { - return p.PrintJSON(w) - } - - if i.Type == "text" { - if err = i.Read(); err != nil { - return errorToHTTPCode(err, true), err - } - } - - if i.CanBeEdited() && u.AllowEdit { - p.Info.Data, err = newEditor(r, i) - p.Info.Editor = true - if err != nil { - return http.StatusInternalServerError, err - } - - return p.PrintHTML(w, "frontmatter", "editor") - } - - return p.PrintHTML(w, "single") -} diff --git a/listing.go b/listing.go deleted file mode 100644 index 0b4468c9..00000000 --- a/listing.go +++ /dev/null @@ -1,184 +0,0 @@ -package filemanager - -import ( - "context" - "net/url" - "os" - "path" - "sort" - "strings" - - "github.com/mholt/caddy/caddyhttp/httpserver" -) - -// A listing is the context used to fill out a template. -type listing struct { - // The name of the directory (the last element of the path) - Name string - // The full path of the request relatively to a File System - Path string - // The items (files and folders) in the path - Items []fileInfo - // The number of directories in the listing - NumDirs int - // The number of files (items that aren't directories) in the listing - NumFiles int - // Which sorting order is used - Sort string - // And which order - Order string - // If ≠0 then Items have been limited to that many elements - ItemsLimitedTo int - httpserver.Context `json:"-"` -} - -// getListing gets the information about a specific directory and its files. -func getListing(u *User, filePath string, baseURL string) (*listing, error) { - // Gets the directory information using the Virtual File System of - // the user configuration. - file, err := u.FileSystem.OpenFile(context.TODO(), filePath, os.O_RDONLY, 0) - if err != nil { - return nil, err - } - defer file.Close() - - // Reads the directory and gets the information about the files. - files, err := file.Readdir(-1) - if err != nil { - return nil, err - } - - var ( - fileinfos []fileInfo - dirCount, fileCount int - ) - - for _, f := range files { - name := f.Name() - allowed := u.Allowed("/" + name) - - if !allowed { - continue - } - - if f.IsDir() { - name += "/" - dirCount++ - } else { - fileCount++ - } - - // Absolute URL - url := url.URL{Path: baseURL + name} - - i := fileInfo{ - Name: f.Name(), - Size: f.Size(), - ModTime: f.ModTime(), - Mode: f.Mode(), - IsDir: f.IsDir(), - URL: url.String(), - UserAllowed: allowed, - } - i.RetrieveFileType() - - fileinfos = append(fileinfos, i) - } - - return &listing{ - Name: path.Base(filePath), - Path: filePath, - Items: fileinfos, - NumDirs: dirCount, - NumFiles: fileCount, - }, nil -} - -// ApplySort applies the sort order using .Order and .Sort -func (l listing) ApplySort() { - // Check '.Order' to know how to sort - if l.Order == "desc" { - switch l.Sort { - case "name": - sort.Sort(sort.Reverse(byName(l))) - case "size": - sort.Sort(sort.Reverse(bySize(l))) - case "time": - sort.Sort(sort.Reverse(byTime(l))) - default: - // If not one of the above, do nothing - return - } - } else { // If we had more Orderings we could add them here - switch l.Sort { - case "name": - sort.Sort(byName(l)) - case "size": - sort.Sort(bySize(l)) - case "time": - sort.Sort(byTime(l)) - default: - sort.Sort(byName(l)) - return - } - } -} - -// Implement sorting for listing -type byName listing -type bySize listing -type byTime listing - -// By Name -func (l byName) Len() int { - return len(l.Items) -} - -func (l byName) Swap(i, j int) { - l.Items[i], l.Items[j] = l.Items[j], l.Items[i] -} - -// Treat upper and lower case equally -func (l byName) Less(i, j int) bool { - if l.Items[i].IsDir && !l.Items[j].IsDir { - return true - } - - if !l.Items[i].IsDir && l.Items[j].IsDir { - return false - } - - return strings.ToLower(l.Items[i].Name) < strings.ToLower(l.Items[j].Name) -} - -// By Size -func (l bySize) Len() int { - return len(l.Items) -} - -func (l bySize) Swap(i, j int) { - l.Items[i], l.Items[j] = l.Items[j], l.Items[i] -} - -const directoryOffset = -1 << 31 // = math.MinInt32 -func (l bySize) Less(i, j int) bool { - iSize, jSize := l.Items[i].Size, l.Items[j].Size - if l.Items[i].IsDir { - iSize = directoryOffset + iSize - } - if l.Items[j].IsDir { - jSize = directoryOffset + jSize - } - return iSize < jSize -} - -// By Time -func (l byTime) Len() int { - return len(l.Items) -} -func (l byTime) Swap(i, j int) { - l.Items[i], l.Items[j] = l.Items[j], l.Items[i] -} -func (l byTime) Less(i, j int) bool { - return l.Items[i].ModTime.Before(l.Items[j].ModTime) -} diff --git a/page.go b/page.go deleted file mode 100644 index 0e44acd6..00000000 --- a/page.go +++ /dev/null @@ -1,219 +0,0 @@ -package filemanager - -import ( - "bytes" - "encoding/json" - "errors" - "html/template" - "log" - "net/http" - "strconv" - "strings" -) - -// Create the functions map, then the template, check for erros and -// execute the template if there aren't errors -var functionMap = template.FuncMap{ - "Defined": defined, - "CSS": css, - "Marshal": marshal, - "EncodeBase64": encodeBase64, -} - -// page contains the informations and functions needed to show the Page -type page struct { - Info *pageInfo - Minimal bool -} - -// pageInfo contains the information of a Page -type pageInfo struct { - Name string - Path string - IsDir bool - User *User - Config *FileManager - Data interface{} - Editor bool - Display string -} - -// BreadcrumbMapItem ... -type BreadcrumbMapItem struct { - Name string - URL string -} - -// BreadcrumbMap returns p.Path where every element is a map -// of URLs and path segment names. -func (i pageInfo) BreadcrumbMap() []BreadcrumbMapItem { - result := []BreadcrumbMapItem{} - - if len(i.Path) == 0 { - return result - } - - // skip trailing slash - lpath := i.Path - if lpath[len(lpath)-1] == '/' { - lpath = lpath[:len(lpath)-1] - } - - parts := strings.Split(lpath, "/") - for i, part := range parts { - if i == len(parts)-1 { - continue - } - - if i == 0 && part == "" { - result = append([]BreadcrumbMapItem{{ - Name: "/", - URL: "/", - }}, result...) - continue - } - - result = append([]BreadcrumbMapItem{{ - Name: part, - URL: strings.Join(parts[:i+1], "/") + "/", - }}, result...) - } - - return result -} - -// PreviousLink returns the path of the previous folder -func (i pageInfo) PreviousLink() string { - path := strings.TrimSuffix(i.Path, "/") - path = strings.TrimPrefix(path, "/") - path = i.Config.AbsoluteURL() + "/" + path - path = path[0 : len(path)-len(i.Name)] - - if len(path) < len(i.Config.AbsoluteURL()+"/") { - return "" - } - - return path -} - -// PrintHTML formats the page in HTML and executes the template -func (p page) PrintHTML(w http.ResponseWriter, templates ...string) (int, error) { - - if p.Minimal { - templates = append(templates, "minimal") - } else { - templates = append(templates, "base") - } - - var tpl *template.Template - - // For each template, add it to the the tpl variable - for i, t := range templates { - // Get the template from the assets - //Page, err := assets.Asset("templates/" + t + ".tmpl") - Page, err := []byte("Shit"), errors.New("Hello") - - // Check if there is some error. If so, the template doesn't exist - if err != nil { - log.Print(err) - return http.StatusInternalServerError, err - } - - // If it's the first iteration, creates a new template and add the - // functions map - if i == 0 { - tpl, err = template.New(t).Funcs(functionMap).Parse(string(Page)) - } else { - tpl, err = tpl.Parse(string(Page)) - } - - if err != nil { - log.Print(err) - return http.StatusInternalServerError, err - } - } - - buf := &bytes.Buffer{} - err := tpl.Execute(buf, p.Info) - - if err != nil { - return http.StatusInternalServerError, err - } - - w.Header().Set("Content-Type", "text/html; charset=utf-8") - _, err = buf.WriteTo(w) - return http.StatusOK, err -} - -// PrintJSON prints the current Page information in JSON -func (p page) PrintJSON(w http.ResponseWriter) (int, error) { - marsh, err := json.MarshalIndent(p.Info.Data, "", " ") - if err != nil { - return http.StatusInternalServerError, err - } - - w.Header().Set("Content-Type", "application/json; charset=utf-8") - if _, err := w.Write(marsh); err != nil { - return http.StatusInternalServerError, err - } - - return http.StatusOK, nil -} - -// printError prints the error page -func printError(w http.ResponseWriter, code int, err error) (int, error) { - tpl := errorTemplate - tpl = strings.Replace(tpl, "TITLE", strconv.Itoa(code)+" "+http.StatusText(code), -1) - tpl = strings.Replace(tpl, "CODE", err.Error(), -1) - - _, err = w.Write([]byte(tpl)) - - if err != nil { - return http.StatusInternalServerError, err - } - return http.StatusOK, nil -} - -const errorTemplate = ` - - - TITLE - - - - - - -
      -

      TITLE

      - -

      Try reloading the page or hitting the back button. If this error persists, it seems that you may have found a bug! Please create an issue at hacdias/caddy-filemanager repository on GitHub with the code below.

      - - CODE -
      -` diff --git a/pre-build.sh b/pre-build.sh deleted file mode 100644 index 493b588b..00000000 --- a/pre-build.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -go get github.com/jteeuwen/go-bindata/go-bindata - -go-bindata -debug -pkg assets -prefix "_embed" \ - -o assets/binary.go -ignore "^.*theme-([^g]|g[^i]|gi[^t]|git[^h]|gith[^u]|githu[^b]).*\.js$" \ - _embed/templates/... _embed/public/js/... _embed/public/css/... _embed/public/ace/src-min/... \ \ No newline at end of file diff --git a/response_writer.go b/response_writer.go deleted file mode 100644 index 496971d4..00000000 --- a/response_writer.go +++ /dev/null @@ -1,29 +0,0 @@ -package filemanager - -import "net/http" - -// ResponseWriterNoBody is a wrapper used to suprress the body of the response -// to a request. Mainly used for HEAD requests. -type ResponseWriterNoBody struct { - http.ResponseWriter -} - -// NewResponseWriterNoBody creates a new ResponseWriterNoBody. -func NewResponseWriterNoBody(w http.ResponseWriter) *ResponseWriterNoBody { - return &ResponseWriterNoBody{w} -} - -// Header executes the Header method from the http.ResponseWriter. -func (w ResponseWriterNoBody) Header() http.Header { - return w.ResponseWriter.Header() -} - -// Write suprresses the body. -func (w ResponseWriterNoBody) Write(data []byte) (int, error) { - return 0, nil -} - -// WriteHeader writes the header to the http.ResponseWriter. -func (w ResponseWriterNoBody) WriteHeader(statusCode int) { - w.ResponseWriter.WriteHeader(statusCode) -} diff --git a/utils.go b/utils.go deleted file mode 100644 index bb8592ce..00000000 --- a/utils.go +++ /dev/null @@ -1,58 +0,0 @@ -package filemanager - -import ( - "encoding/base64" - "encoding/json" - "html/template" - "log" - "net/http" - "os" - "reflect" -) - -// defined checks if variable is defined in a struct -func defined(data interface{}, field string) bool { - t := reflect.Indirect(reflect.ValueOf(data)).Type() - - if t.Kind() != reflect.Struct { - log.Print("Non-struct type not allowed.") - return false - } - - _, b := t.FieldByName(field) - return b -} - -// css returns the sanitized and safe css -func css(s string) template.CSS { - return template.CSS(s) -} - -// marshal converts an interface to json and sanitizes it -func marshal(v interface{}) template.JS { - a, _ := json.Marshal(v) - return template.JS(a) -} - -// encodeBase64 encodes a string in base 64 -func encodeBase64(s string) string { - return base64.StdEncoding.EncodeToString([]byte(s)) -} - -// errorToHTTPCode converts errors to HTTP Status Code. -func errorToHTTPCode(err error, gone bool) int { - switch { - case os.IsPermission(err): - return http.StatusForbidden - case os.IsNotExist(err): - if !gone { - return http.StatusNotFound - } - - return http.StatusGone - case os.IsExist(err): - return http.StatusGone - default: - return http.StatusInternalServerError - } -} diff --git a/utils_test.go b/utils_test.go deleted file mode 100644 index 7c5b5c8a..00000000 --- a/utils_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package filemanager - -import "testing" - -type testDefinedData struct { - f1 string - f2 bool - f3 int - f4 func() -} - -type testDefined struct { - data interface{} - field string - result bool -} - -var testDefinedCases = []testDefined{ - {testDefinedData{}, "f1", true}, - {testDefinedData{}, "f2", true}, - {testDefinedData{}, "f3", true}, - {testDefinedData{}, "f4", true}, - {testDefinedData{}, "f5", false}, - {[]string{}, "", false}, - {map[string]int{"oi": 4}, "", false}, - {"asa", "", false}, - {"int", "", false}, -} - -func TestDefined(t *testing.T) { - for _, pair := range testDefinedCases { - v := defined(pair.data, pair.field) - if v != pair.result { - t.Error( - "For", pair.data, - "expected", pair.result, - "got", v, - ) - } - } -} From b0e81a80a0560ddacb7b7e1d7d132ca68692f9f9 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 20 Jun 2017 11:40:52 +0100 Subject: [PATCH 10/40] start a new life Former-commit-id: 780f1bc16e4e5270fed2a6b7da442a47084d8c4b --- filemanager.go | 1 + 1 file changed, 1 insertion(+) create mode 100644 filemanager.go diff --git a/filemanager.go b/filemanager.go new file mode 100644 index 00000000..2e5b8ff3 --- /dev/null +++ b/filemanager.go @@ -0,0 +1 @@ +package filemanager From 850c4a10e1f93c9017a59bfa1d196bac0bcbc6a4 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sat, 24 Jun 2017 12:12:15 +0100 Subject: [PATCH 11/40] updates Former-commit-id: 9c36dea485ddd16a90f0a615e20baddaee6b9cde --- editor.go | 120 ++++++++++++++++ error.go | 65 +++++++++ filemanager.go | 98 +++++++++++++ frontmatter/frontmatter.go | 276 ++++++++++++++++++++++++++++++++++++ frontmatter/runes.go | 58 ++++++++ frontmatter/runes_test.go | 131 +++++++++++++++++ http.go | 167 ++++++++++++++++++++++ http_assets.go | 49 +++++++ http_checksum.go | 50 +++++++ http_command.go | 135 ++++++++++++++++++ http_download.go | 95 +++++++++++++ http_listing.go | 144 +++++++++++++++++++ http_put.go | 138 ++++++++++++++++++ http_search.go | 117 +++++++++++++++ http_single.go | 50 +++++++ http_utils.go | 50 +++++++ info.go | 163 +++++++++++++++++++++ listing.go | 184 ++++++++++++++++++++++++ page.go | 168 ++++++++++++++++++++++ variables/types.go | 13 ++ variables/types_test.go | 49 +++++++ variables/variables.go | 47 ++++++ variables/variables_test.go | 41 ++++++ 23 files changed, 2408 insertions(+) create mode 100644 editor.go create mode 100644 error.go create mode 100644 frontmatter/frontmatter.go create mode 100644 frontmatter/runes.go create mode 100644 frontmatter/runes_test.go create mode 100644 http.go create mode 100644 http_assets.go create mode 100644 http_checksum.go create mode 100644 http_command.go create mode 100644 http_download.go create mode 100644 http_listing.go create mode 100644 http_put.go create mode 100644 http_search.go create mode 100644 http_single.go create mode 100644 http_utils.go create mode 100644 info.go create mode 100644 listing.go create mode 100644 page.go create mode 100644 variables/types.go create mode 100644 variables/types_test.go create mode 100644 variables/variables.go create mode 100644 variables/variables_test.go diff --git a/editor.go b/editor.go new file mode 100644 index 00000000..d2b591d2 --- /dev/null +++ b/editor.go @@ -0,0 +1,120 @@ +package filemanager + +import ( + "bytes" + "errors" + "net/http" + "path/filepath" + "strings" + + "github.com/hacdias/filemanager/frontmatter" + "github.com/spf13/hugo/parser" +) + +// Editor contains the information for the editor page +type Editor struct { + Class string + Mode string + Visual bool + Content string + FrontMatter struct { + Content *frontmatter.Content + Rune rune + } +} + +// GetEditor gets the editor based on a Info struct +func GetEditor(r *http.Request, i *FileInfo) (*Editor, error) { + var err error + + // Create a new editor variable and set the mode + e := new(Editor) + e.Mode = editorMode(i.Name) + e.Class = editorClass(e.Mode) + + if e.Class == "frontmatter-only" || e.Class == "complete" { + e.Visual = true + } + + if r.URL.Query().Get("visual") == "false" { + e.Class = "content-only" + } + + hasRune := frontmatter.HasRune(i.content) + + if e.Class == "frontmatter-only" && !hasRune { + e.FrontMatter.Rune, err = frontmatter.StringFormatToRune(e.Mode) + if err != nil { + goto Error + } + i.content = frontmatter.AppendRune(i.content, e.FrontMatter.Rune) + hasRune = true + } + + if e.Class == "frontmatter-only" && hasRune { + e.FrontMatter.Content, _, err = frontmatter.Pretty(i.content) + if err != nil { + goto Error + } + } + + if e.Class == "complete" && hasRune { + var page parser.Page + // Starts a new buffer and parses the file using Hugo's functions + buffer := bytes.NewBuffer(i.content) + page, err = parser.ReadFrom(buffer) + + if err != nil { + goto Error + } + + // Parses the page content and the frontmatter + e.Content = strings.TrimSpace(string(page.Content())) + e.FrontMatter.Rune = rune(i.content[0]) + e.FrontMatter.Content, _, err = frontmatter.Pretty(page.FrontMatter()) + } + + if e.Class == "complete" && !hasRune { + err = errors.New("Complete but without rune") + } + +Error: + if e.Class == "content-only" || err != nil { + e.Class = "content-only" + e.Content = i.StringifyContent() + } + + return e, nil +} + +func editorClass(mode string) string { + switch mode { + case "json", "toml", "yaml": + return "frontmatter-only" + case "markdown", "asciidoc", "rst": + return "complete" + } + + return "content-only" +} + +func editorMode(filename string) string { + mode := strings.TrimPrefix(filepath.Ext(filename), ".") + + switch mode { + case "md", "markdown", "mdown", "mmark": + mode = "markdown" + case "asciidoc", "adoc", "ad": + mode = "asciidoc" + case "rst": + mode = "rst" + case "html", "htm": + mode = "html" + case "js": + mode = "javascript" + case "go": + mode = "golang" + } + + return mode +} diff --git a/error.go b/error.go new file mode 100644 index 00000000..1a77cc97 --- /dev/null +++ b/error.go @@ -0,0 +1,65 @@ +package filemanager + +import ( + "net/http" + "strconv" + "strings" +) + +const errTemplate = ` + + + TITLE + + + + + + +
      +

      TITLE

      + +

      Try reloading the page or hitting the back button. If this error persists, it seems that you may have found a bug! Please create an issue at hacdias/caddy-filemanager repository on GitHub with the code below.

      + + CODE +
      +` + +// PrintErrorHTML prints the error page +func PrintErrorHTML(w http.ResponseWriter, code int, err error) (int, error) { + tpl := errTemplate + tpl = strings.Replace(tpl, "TITLE", strconv.Itoa(code)+" "+http.StatusText(code), -1) + tpl = strings.Replace(tpl, "CODE", err.Error(), -1) + + _, err = w.Write([]byte(tpl)) + + if err != nil { + return http.StatusInternalServerError, err + } + return http.StatusOK, nil +} diff --git a/filemanager.go b/filemanager.go index 2e5b8ff3..f65c3362 100644 --- a/filemanager.go +++ b/filemanager.go @@ -1 +1,99 @@ package filemanager + +import ( + "net/http" + "regexp" + "strings" + + rice "github.com/GeertJohan/go.rice" + "golang.org/x/net/webdav" +) + +// FileManager is a file manager instance. +type FileManager struct { + *User `json:"-"` + Assets *Assets `json:"-"` + + // PrefixURL is a part of the URL that is trimmed from the http.Request.URL before + // it arrives to our handlers. It may be useful when using FileManager as a middleware + // such as in caddy-filemanager plugin. + PrefixURL string + + // BaseURL is the path where the GUI will be accessible. + BaseURL string + + // WebDavURL is the path where the WebDAV will be accessible. It can be set to "/" + // in order to override the GUI and only use the WebDAV. + WebDavURL string + + // Users is a map with the different configurations for each user. + Users map[string]*User `json:"-"` + + // TODO: event-based? + BeforeSave CommandFunc `json:"-"` + AfterSave CommandFunc `json:"-"` +} + +// User contains the configuration for each user. +type User struct { + Scope string `json:"-"` // Path the user have access + FileSystem webdav.FileSystem `json:"-"` // The virtual file system the user have access + Handler *webdav.Handler `json:"-"` // The WebDav HTTP Handler + Rules []*Rule `json:"-"` // Access rules + StyleSheet string `json:"-"` // Costum stylesheet + AllowNew bool // Can create files and folders + AllowEdit bool // Can edit/rename files + AllowCommands bool // Can execute commands + Commands []string // Available Commands +} + +// Assets are the static and front-end assets, such as JS, CSS and HTML templates. +type Assets struct { + requiredJS rice.Box // JS that is always required to have in order to be usable. + Templates rice.Box + CSS rice.Box + JS rice.Box +} + +// Rule is a dissalow/allow rule. +type Rule struct { + Regex bool + Allow bool + Path string + Regexp *regexp.Regexp +} + +// CommandFunc ... +type CommandFunc func(r *http.Request, c *FileManager, u *User) error + +// AbsoluteURL ... +func (m FileManager) AbsoluteURL() string { + return m.PrefixURL + m.BaseURL +} + +// AbsoluteWebdavURL ... +func (m FileManager) AbsoluteWebdavURL() string { + return m.PrefixURL + m.WebDavURL +} + +// Allowed checks if the user has permission to access a directory/file. +func (u User) Allowed(url string) bool { + var rule *Rule + i := len(u.Rules) - 1 + + for i >= 0 { + rule = u.Rules[i] + + if rule.Regex { + if rule.Regexp.MatchString(url) { + return rule.Allow + } + } else if strings.HasPrefix(url, rule.Path) { + return rule.Allow + } + + i-- + } + + return true +} diff --git a/frontmatter/frontmatter.go b/frontmatter/frontmatter.go new file mode 100644 index 00000000..ba28af20 --- /dev/null +++ b/frontmatter/frontmatter.go @@ -0,0 +1,276 @@ +package frontmatter + +import ( + "bytes" + "encoding/json" + "errors" + "log" + "reflect" + "sort" + "strconv" + "strings" + + "gopkg.in/yaml.v2" + + "github.com/BurntSushi/toml" + "github.com/hacdias/filemanager/variables" + + "github.com/spf13/cast" +) + +const ( + mainName = "#MAIN#" + objectType = "object" + arrayType = "array" +) + +var mainTitle = "" + +// Pretty creates a new FrontMatter object +func Pretty(content []byte) (*Content, string, error) { + data, err := Unmarshal(content) + + if err != nil { + return &Content{}, "", err + } + + kind := reflect.ValueOf(data).Kind() + + if kind == reflect.Invalid { + return &Content{}, "", nil + } + + object := new(Block) + object.Type = objectType + object.Name = mainName + + if kind == reflect.Map { + object.Type = objectType + } else if kind == reflect.Slice || kind == reflect.Array { + object.Type = arrayType + } + + return rawToPretty(data, object), mainTitle, nil +} + +// Unmarshal returns the data of the frontmatter +func Unmarshal(content []byte) (interface{}, error) { + mark := rune(content[0]) + var data interface{} + + switch mark { + case '-': + // If it's YAML + if err := yaml.Unmarshal(content, &data); err != nil { + return nil, err + } + case '+': + // If it's TOML + content = bytes.Replace(content, []byte("+"), []byte(""), -1) + if _, err := toml.Decode(string(content), &data); err != nil { + return nil, err + } + case '{', '[': + // If it's JSON + if err := json.Unmarshal(content, &data); err != nil { + return nil, err + } + default: + return nil, errors.New("Invalid frontmatter type") + } + + return data, nil +} + +// Marshal encodes the interface in a specific format +func Marshal(data interface{}, mark rune) ([]byte, error) { + b := new(bytes.Buffer) + + switch mark { + case '+': + enc := toml.NewEncoder(b) + err := enc.Encode(data) + if err != nil { + return nil, err + } + return b.Bytes(), nil + case '{': + by, err := json.MarshalIndent(data, "", " ") + if err != nil { + return nil, err + } + b.Write(by) + _, err = b.Write([]byte("\n")) + if err != nil { + return nil, err + } + return b.Bytes(), nil + case '-': + by, err := yaml.Marshal(data) + if err != nil { + return nil, err + } + b.Write(by) + _, err = b.Write([]byte("...")) + if err != nil { + return nil, err + } + return b.Bytes(), nil + default: + return nil, errors.New("Unsupported Format provided") + } +} + +// Content is the block content +type Content struct { + Other interface{} + Fields []*Block + Arrays []*Block + Objects []*Block +} + +// Block is a block +type Block struct { + Name string + Title string + Type string + HTMLType string + Content *Content + Parent *Block +} + +func rawToPretty(config interface{}, parent *Block) *Content { + objects := []*Block{} + arrays := []*Block{} + fields := []*Block{} + + cnf := map[string]interface{}{} + kind := reflect.TypeOf(config) + + switch kind { + case reflect.TypeOf(map[interface{}]interface{}{}): + for key, value := range config.(map[interface{}]interface{}) { + cnf[key.(string)] = value + } + case reflect.TypeOf([]map[string]interface{}{}): + for index, value := range config.([]map[string]interface{}) { + cnf[strconv.Itoa(index)] = value + } + case reflect.TypeOf([]map[interface{}]interface{}{}): + for index, value := range config.([]map[interface{}]interface{}) { + cnf[strconv.Itoa(index)] = value + } + case reflect.TypeOf([]interface{}{}): + for index, value := range config.([]interface{}) { + cnf[strconv.Itoa(index)] = value + } + default: + cnf = config.(map[string]interface{}) + } + + for name, element := range cnf { + if variables.IsMap(element) { + objects = append(objects, handleObjects(element, parent, name)) + } else if variables.IsSlice(element) { + arrays = append(arrays, handleArrays(element, parent, name)) + } else { + if name == "title" && parent.Name == mainName { + mainTitle = element.(string) + } + fields = append(fields, handleFlatValues(element, parent, name)) + } + } + + sort.Sort(sortByTitle(fields)) + sort.Sort(sortByTitle(arrays)) + sort.Sort(sortByTitle(objects)) + return &Content{ + Fields: fields, + Arrays: arrays, + Objects: objects, + } +} + +type sortByTitle []*Block + +func (f sortByTitle) Len() int { return len(f) } +func (f sortByTitle) Swap(i, j int) { f[i], f[j] = f[j], f[i] } +func (f sortByTitle) Less(i, j int) bool { + return strings.ToLower(f[i].Name) < strings.ToLower(f[j].Name) +} + +func handleObjects(content interface{}, parent *Block, name string) *Block { + c := new(Block) + c.Parent = parent + c.Type = objectType + c.Title = name + + if parent.Name == mainName { + c.Name = c.Title + } else if parent.Type == arrayType { + c.Name = parent.Name + "[" + name + "]" + } else { + c.Name = parent.Name + "." + c.Title + } + + c.Content = rawToPretty(content, c) + return c +} + +func handleArrays(content interface{}, parent *Block, name string) *Block { + c := new(Block) + c.Parent = parent + c.Type = arrayType + c.Title = name + + if parent.Name == mainName { + c.Name = name + } else { + c.Name = parent.Name + "." + name + } + + c.Content = rawToPretty(content, c) + return c +} + +func handleFlatValues(content interface{}, parent *Block, name string) *Block { + c := new(Block) + c.Parent = parent + + switch content.(type) { + case bool: + c.Type = "boolean" + case int, float32, float64: + c.Type = "number" + default: + c.Type = "string" + } + + c.Content = &Content{Other: content} + + switch strings.ToLower(name) { + case "description": + c.HTMLType = "textarea" + case "date", "publishdate": + c.HTMLType = "datetime" + c.Content = &Content{Other: cast.ToTime(content)} + default: + c.HTMLType = "text" + } + + if parent.Type == arrayType { + c.Name = parent.Name + "[]" + c.Title = content.(string) + } else if parent.Type == objectType { + c.Title = name + c.Name = parent.Name + "." + name + + if parent.Name == mainName { + c.Name = name + } + } else { + log.Panic("Parent type not allowed in handleFlatValues.") + } + + return c +} diff --git a/frontmatter/runes.go b/frontmatter/runes.go new file mode 100644 index 00000000..b4ad1dc2 --- /dev/null +++ b/frontmatter/runes.go @@ -0,0 +1,58 @@ +package frontmatter + +import ( + "bytes" + "errors" + "strings" +) + +// HasRune checks if the file has the frontmatter rune +func HasRune(file []byte) bool { + return strings.HasPrefix(string(file), "---") || + strings.HasPrefix(string(file), "+++") || + strings.HasPrefix(string(file), "{") +} + +// AppendRune appends the frontmatter rune to a file +func AppendRune(frontmatter []byte, mark rune) []byte { + frontmatter = bytes.TrimSpace(frontmatter) + + switch mark { + case '-': + return []byte("---\n" + string(frontmatter) + "\n---") + case '+': + return []byte("+++\n" + string(frontmatter) + "\n+++") + case '{': + return []byte("{\n" + string(frontmatter) + "\n}") + } + + return frontmatter +} + +// RuneToStringFormat converts the rune to a string with the format +func RuneToStringFormat(mark rune) (string, error) { + switch mark { + case '-': + return "yaml", nil + case '+': + return "toml", nil + case '{', '}': + return "json", nil + default: + return "", errors.New("Unsupported format type") + } +} + +// StringFormatToRune converts the format name to its rune +func StringFormatToRune(format string) (rune, error) { + switch format { + case "yaml": + return '-', nil + case "toml": + return '+', nil + case "json": + return '{', nil + default: + return '0', errors.New("Unsupported format type") + } +} diff --git a/frontmatter/runes_test.go b/frontmatter/runes_test.go new file mode 100644 index 00000000..6d120948 --- /dev/null +++ b/frontmatter/runes_test.go @@ -0,0 +1,131 @@ +package frontmatter + +import "testing" + +type hasRuneTest struct { + File []byte + Return bool +} + +var testHasRune = []hasRuneTest{ + hasRuneTest{ + File: []byte(`--- +Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Sed auctor libero eget ante fermentum commodo. +---`), + Return: true, + }, + hasRuneTest{ + File: []byte(`+++ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Sed auctor libero eget ante fermentum commodo. ++++`), + Return: true, + }, + hasRuneTest{ + File: []byte(`{ + "json": "Lorem ipsum dolor sit amet" +}`), + Return: true, + }, + hasRuneTest{ + File: []byte(`+`), + Return: false, + }, + hasRuneTest{ + File: []byte(`++`), + Return: false, + }, + hasRuneTest{ + File: []byte(`-`), + Return: false, + }, + hasRuneTest{ + File: []byte(`--`), + Return: false, + }, + hasRuneTest{ + File: []byte(`Lorem ipsum`), + Return: false, + }, +} + +func TestHasRune(t *testing.T) { + for _, test := range testHasRune { + if HasRune(test.File) != test.Return { + t.Error("Incorrect value on HasRune") + } + } +} + +type appendRuneTest struct { + Before []byte + After []byte + Mark rune +} + +var testAppendRuneTest = []appendRuneTest{} + +func TestAppendRune(t *testing.T) { + for i, test := range testAppendRuneTest { + if !compareByte(AppendRune(test.Before, test.Mark), test.After) { + t.Errorf("Incorrect value on AppendRune of Test %d", i) + } + } +} + +func compareByte(a, b []byte) bool { + if a == nil && b == nil { + return true + } + + if a == nil || b == nil { + return false + } + + if len(a) != len(b) { + return false + } + + for i := range a { + if a[i] != b[i] { + return false + } + } + + return true +} + +var testRuneToStringFormat = map[rune]string{ + '-': "yaml", + '+': "toml", + '{': "json", + '}': "json", + '1': "", + 'a': "", +} + +func TestRuneToStringFormat(t *testing.T) { + for mark, format := range testRuneToStringFormat { + val, _ := RuneToStringFormat(mark) + if val != format { + t.Errorf("Incorrect value on RuneToStringFormat of %v; want: %s; got: %s", mark, format, val) + } + } +} + +var testStringFormatToRune = map[string]rune{ + "yaml": '-', + "toml": '+', + "json": '{', + "lorem": '0', +} + +func TestStringFormatToRune(t *testing.T) { + for format, mark := range testStringFormatToRune { + val, _ := StringFormatToRune(format) + if val != mark { + t.Errorf("Incorrect value on StringFormatToRune of %s; want: %v; got: %v", format, mark, val) + } + } +} diff --git a/http.go b/http.go new file mode 100644 index 00000000..cfe4b852 --- /dev/null +++ b/http.go @@ -0,0 +1,167 @@ +package filemanager + +import ( + "errors" + "net/http" + "os" + "path/filepath" + "strings" + + "github.com/mholt/caddy/caddyhttp/httpserver" +) + +// ServeHTTP determines if the request is for this plugin, and if all prerequisites are met. +func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { + var ( + fi *FileInfo + code int + err error + user *User + ) + + // Checks if the URL matches the Assets URL. Returns the asset if the + // method is GET and Status Forbidden otherwise. + if httpserver.Path(r.URL.Path).Matches(c.BaseURL + AssetsURL) { + if r.Method == http.MethodGet { + return serveAssets(w, r, c) + } + + return http.StatusForbidden, nil + } + + username, _, _ := r.BasicAuth() + if _, ok := c.Users[username]; ok { + user = c.Users[username] + } else { + user = c.User + } + + // Checks if the request URL is for the WebDav server + if httpserver.Path(r.URL.Path).Matches(c.WebDavURL) { + // Checks for user permissions relatively to this PATH + if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.WebDavURL)) { + return http.StatusForbidden, nil + } + + switch r.Method { + case "GET", "HEAD": + // Excerpt from RFC4918, section 9.4: + // + // GET, when applied to a collection, may return the contents of an + // "index.html" resource, a human-readable view of the contents of + // the collection, or something else altogether. + // + // It was decided on https://github.com/hacdias/caddy-filemanager/issues/85 + // that GET, for collections, will return the same as PROPFIND method. + path := strings.Replace(r.URL.Path, c.WebDavURL, "", 1) + path = user.Scope + "/" + path + path = filepath.Clean(path) + + var i os.FileInfo + i, err = os.Stat(path) + if err != nil { + // Is there any error? WebDav will handle it... no worries. + break + } + + if i.IsDir() { + r.Method = "PROPFIND" + + if r.Method == "HEAD" { + w = newResponseWriterNoBody(w) + } + } + case "PROPPATCH", "MOVE", "PATCH", "PUT", "DELETE": + if !user.AllowEdit { + return http.StatusForbidden, nil + } + case "MKCOL", "COPY": + if !user.AllowNew { + return http.StatusForbidden, nil + } + } + + // Preprocess the PUT request if it's the case + if r.Method == http.MethodPut { + if err = c.BeforeSave(r, c, user); err != nil { + return http.StatusInternalServerError, err + } + + if put(w, r, c, user) != nil { + return http.StatusInternalServerError, err + } + } + + c.Handler.ServeHTTP(w, r) + if err = c.AfterSave(r, c, user); err != nil { + return http.StatusInternalServerError, err + } + + return 0, nil + } + + w.Header().Set("x-frame-options", "SAMEORIGIN") + w.Header().Set("x-content-type", "nosniff") + w.Header().Set("x-xss-protection", "1; mode=block") + + // Checks if the User is allowed to access this file + if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.BaseURL)) { + if r.Method == http.MethodGet { + return PrintErrorHTML( + w, http.StatusForbidden, + errors.New("You don't have permission to access this page"), + ) + } + + return http.StatusForbidden, nil + } + + if r.URL.Query().Get("search") != "" { + return search(w, r, c, user) + } + + if r.URL.Query().Get("command") != "" { + return command(w, r, c, user) + } + + if r.Method == http.MethodGet { + // Gets the information of the directory/file + fi, err = GetInfo(r.URL, c, user) + if err != nil { + if r.Method == http.MethodGet { + return PrintErrorHTML(w, code, err) + } + code = errorToHTTP(err, false) + return code, err + } + + // If it's a dir and the path doesn't end with a trailing slash, + // redirect the user. + if fi.IsDir && !strings.HasSuffix(r.URL.Path, "/") { + http.Redirect(w, r, c.PrefixURL+r.URL.Path+"/", http.StatusTemporaryRedirect) + return 0, nil + } + + switch { + case r.URL.Query().Get("download") != "": + code, err = download(w, r, fi) + case r.URL.Query().Get("raw") == "true" && !fi.IsDir: + http.ServeFile(w, r, fi.Path) + code, err = 0, nil + case !fi.IsDir && r.URL.Query().Get("checksum") != "": + code, err = checksum(w, r, fi) + case fi.IsDir: + code, err = serveListing(w, r, c, user, fi) + default: + code, err = serveSingle(w, r, c, user, fi) + } + + if err != nil { + code, err = PrintErrorHTML(w, code, err) + } + + return code, err + } + + return http.StatusNotImplemented, nil +} diff --git a/http_assets.go b/http_assets.go new file mode 100644 index 00000000..b15513d6 --- /dev/null +++ b/http_assets.go @@ -0,0 +1,49 @@ +package filemanager + +import ( + "errors" + "mime" + "net/http" + "path/filepath" + "strings" +) + +// AssetsURL is the url of the assets +const AssetsURL = "/_filemanagerinternal" + +// Serve provides the needed assets for the front-end +func serveAssets(w http.ResponseWriter, r *http.Request, m *FileManager) (int, error) { + // gets the filename to be used with Assets function + filename := strings.Replace(r.URL.Path, m.BaseURL+AssetsURL, "", 1) + + var file []byte + var err error + + switch { + case strings.HasPrefix(filename, "/css"): + filename = strings.Replace(filename, "/css/", "", 1) + file, err = m.Assets.CSS.Bytes(filename) + case strings.HasPrefix(filename, "/js"): + filename = strings.Replace(filename, "/js/", "", 1) + file, err = m.Assets.requiredJS.Bytes(filename) + case strings.HasPrefix(filename, "/vendor"): + filename = strings.Replace(filename, "/vendor/", "", 1) + file, err = m.Assets.JS.Bytes(filename) + default: + err = errors.New("not found") + } + + if err != nil { + return http.StatusNotFound, nil + } + + // Get the file extension and its mimetype + extension := filepath.Ext(filename) + mediatype := mime.TypeByExtension(extension) + + // Write the header with the Content-Type and write the file + // content to the buffer + w.Header().Set("Content-Type", mediatype) + w.Write(file) + return 200, nil +} diff --git a/http_checksum.go b/http_checksum.go new file mode 100644 index 00000000..eeeddcbc --- /dev/null +++ b/http_checksum.go @@ -0,0 +1,50 @@ +package filemanager + +import ( + "crypto/md5" + "crypto/sha1" + "crypto/sha256" + "crypto/sha512" + "encoding/hex" + e "errors" + "hash" + "io" + "net/http" + "os" +) + +// checksum calculates the hash of a file. Supports MD5, SHA1, SHA256 and SHA512. +func checksum(w http.ResponseWriter, r *http.Request, i *FileInfo) (int, error) { + query := r.URL.Query().Get("checksum") + + file, err := os.Open(i.Path) + if err != nil { + return errorToHTTP(err, true), err + } + + defer file.Close() + + var h hash.Hash + + switch query { + case "md5": + h = md5.New() + case "sha1": + h = sha1.New() + case "sha256": + h = sha256.New() + case "sha512": + h = sha512.New() + default: + return http.StatusBadRequest, e.New("Unknown HASH type") + } + + _, err = io.Copy(h, file) + if err != nil { + return http.StatusInternalServerError, err + } + + val := hex.EncodeToString(h.Sum(nil)) + w.Write([]byte(val)) + return http.StatusOK, nil +} diff --git a/http_command.go b/http_command.go new file mode 100644 index 00000000..eea6fa48 --- /dev/null +++ b/http_command.go @@ -0,0 +1,135 @@ +package filemanager + +import ( + "bytes" + "net/http" + "os/exec" + "path/filepath" + "strings" + "time" + + "github.com/gorilla/websocket" +) + +var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, +} + +var ( + cmdNotImplemented = []byte("Command not implemented.") + cmdNotAllowed = []byte("Command not allowed.") +) + +// command handles the requests for VCS related commands: git, svn and mercurial +func command(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (int, error) { + // Upgrades the connection to a websocket and checks for errors. + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + return 0, err + } + defer conn.Close() + + var ( + message []byte + command []string + ) + + // Starts an infinite loop until a valid command is captured. + for { + _, message, err = conn.ReadMessage() + if err != nil { + return http.StatusInternalServerError, err + } + + command = strings.Split(string(message), " ") + if len(command) != 0 { + break + } + } + + // Check if the command is allowed + allowed := false + + for _, cmd := range u.Commands { + if cmd == command[0] { + allowed = true + } + } + + if !allowed { + err = conn.WriteMessage(websocket.BinaryMessage, cmdNotAllowed) + if err != nil { + return http.StatusInternalServerError, err + } + + return 0, nil + } + + // Check if the program is talled is installed on the computer. + if _, err = exec.LookPath(command[0]); err != nil { + err = conn.WriteMessage(websocket.BinaryMessage, cmdNotImplemented) + if err != nil { + return http.StatusInternalServerError, err + } + + return http.StatusNotImplemented, nil + } + + // Gets the path and initializes a buffer. + path := strings.Replace(r.URL.Path, c.BaseURL, c.Scope, 1) + path = filepath.Clean(path) + buff := new(bytes.Buffer) + + // Sets up the command executation. + cmd := exec.Command(command[0], command[1:]...) + cmd.Dir = path + cmd.Stderr = buff + cmd.Stdout = buff + + // Starts the command and checks for errors. + err = cmd.Start() + if err != nil { + return http.StatusInternalServerError, err + } + + // Set a 'done' variable to check whetever the command has already finished + // running or not. This verification is done using a goroutine that uses the + // method .Wait() from the command. + done := false + go func() { + err = cmd.Wait() + done = true + }() + + // Function to print the current information on the buffer to the connection. + print := func() error { + by := buff.Bytes() + if len(by) > 0 { + err = conn.WriteMessage(websocket.TextMessage, by) + if err != nil { + return err + } + } + + return nil + } + + // While the command hasn't finished running, continue sending the output + // to the client in intervals of 100 milliseconds. + for !done { + if err = print(); err != nil { + return http.StatusInternalServerError, err + } + + time.Sleep(100 * time.Millisecond) + } + + // After the command is done executing, send the output one more time to the + // browser to make sure it gets the latest information. + if err = print(); err != nil { + return http.StatusInternalServerError, err + } + + return 0, nil +} diff --git a/http_download.go b/http_download.go new file mode 100644 index 00000000..dc028dc2 --- /dev/null +++ b/http_download.go @@ -0,0 +1,95 @@ +package filemanager + +import ( + "io" + "io/ioutil" + "net/http" + "net/url" + "os" + "path/filepath" + "strings" + + "github.com/mholt/archiver" +) + +// download creates an archive in one of the supported formats (zip, tar, +// tar.gz or tar.bz2) and sends it to be downloaded. +func download(w http.ResponseWriter, r *http.Request, i *FileInfo) (int, error) { + query := r.URL.Query().Get("download") + + if !i.IsDir { + w.Header().Set("Content-Disposition", "attachment; filename="+i.Name) + http.ServeFile(w, r, i.Path) + return 0, nil + } + + files := []string{} + names := strings.Split(r.URL.Query().Get("files"), ",") + + if len(names) != 0 { + for _, name := range names { + name, err := url.QueryUnescape(name) + + if err != nil { + return http.StatusInternalServerError, err + } + + files = append(files, filepath.Join(i.Path, name)) + } + + } else { + files = append(files, i.Path) + } + + if query == "true" { + query = "zip" + } + + var ( + extension string + temp string + err error + tempfile string + ) + + temp, err = ioutil.TempDir("", "") + if err != nil { + return http.StatusInternalServerError, err + } + + defer os.RemoveAll(temp) + tempfile = filepath.Join(temp, "temp") + + switch query { + case "zip": + extension, err = ".zip", archiver.Zip.Make(tempfile, files) + case "tar": + extension, err = ".tar", archiver.Tar.Make(tempfile, files) + case "targz": + extension, err = ".tar.gz", archiver.TarGz.Make(tempfile, files) + case "tarbz2": + extension, err = ".tar.bz2", archiver.TarBz2.Make(tempfile, files) + case "tarxz": + extension, err = ".tar.xz", archiver.TarXZ.Make(tempfile, files) + default: + return http.StatusNotImplemented, nil + } + + if err != nil { + return http.StatusInternalServerError, err + } + + file, err := os.Open(temp + "/temp") + if err != nil { + return http.StatusInternalServerError, err + } + + name := i.Name + if name == "." || name == "" { + name = "download" + } + + w.Header().Set("Content-Disposition", "attachment; filename="+name+extension) + io.Copy(w, file) + return http.StatusOK, nil +} diff --git a/http_listing.go b/http_listing.go new file mode 100644 index 00000000..c4ea51b1 --- /dev/null +++ b/http_listing.go @@ -0,0 +1,144 @@ +package filemanager + +import ( + "encoding/json" + "net/http" + "strconv" + "strings" + + "github.com/mholt/caddy/caddyhttp/httpserver" +) + +// serveListing presents the user with a listage of a directory folder. +func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *User, i *FileInfo) (int, error) { + var err error + + // Loads the content of the directory + listing, err := GetListing(u, i.VirtualPath, c.PrefixURL+r.URL.Path) + if err != nil { + return errorToHTTP(err, true), err + } + + listing.Context = httpserver.Context{ + Root: http.Dir(u.Scope), + Req: r, + URL: r.URL, + } + + cookieScope := c.BaseURL + if cookieScope == "" { + cookieScope = "/" + } + + // Copy the query values into the Listing struct + var limit int + listing.Sort, listing.Order, limit, err = handleSortOrder(w, r, cookieScope) + if err != nil { + return http.StatusBadRequest, err + } + + listing.ApplySort() + + if limit > 0 && limit <= len(listing.Items) { + listing.Items = listing.Items[:limit] + listing.ItemsLimitedTo = limit + } + + if strings.Contains(r.Header.Get("Accept"), "application/json") { + marsh, err := json.Marshal(listing.Items) + if err != nil { + return http.StatusInternalServerError, err + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + if _, err := w.Write(marsh); err != nil { + return http.StatusInternalServerError, err + } + + return http.StatusOK, nil + } + + displayMode := r.URL.Query().Get("display") + + if displayMode == "" { + if displayCookie, err := r.Cookie("display"); err == nil { + displayMode = displayCookie.Value + } + } + + if displayMode == "" || (displayMode != "mosaic" && displayMode != "list") { + displayMode = "mosaic" + } + + http.SetCookie(w, &http.Cookie{ + Name: "display", + Value: displayMode, + Path: cookieScope, + Secure: r.TLS != nil, + }) + + page := &Page{ + Minimal: r.Header.Get("Minimal") == "true", + PageInfo: &PageInfo{ + Name: listing.Name, + Path: i.VirtualPath, + IsDir: true, + User: u, + Config: c, + Display: displayMode, + Data: listing, + }, + } + + return page.PrintAsHTML(w, "listing") +} + +// handleSortOrder gets and stores for a Listing the 'sort' and 'order', +// and reads 'limit' if given. The latter is 0 if not given. Sets cookies. +func handleSortOrder(w http.ResponseWriter, r *http.Request, scope string) (sort string, order string, limit int, err error) { + sort = r.URL.Query().Get("sort") + order = r.URL.Query().Get("order") + limitQuery := r.URL.Query().Get("limit") + + // If the query 'sort' or 'order' is empty, use defaults or any values + // previously saved in Cookies. + switch sort { + case "": + sort = "name" + if sortCookie, sortErr := r.Cookie("sort"); sortErr == nil { + sort = sortCookie.Value + } + case "name", "size", "type": + http.SetCookie(w, &http.Cookie{ + Name: "sort", + Value: sort, + Path: scope, + Secure: r.TLS != nil, + }) + } + + switch order { + case "": + order = "asc" + if orderCookie, orderErr := r.Cookie("order"); orderErr == nil { + order = orderCookie.Value + } + case "asc", "desc": + http.SetCookie(w, &http.Cookie{ + Name: "order", + Value: order, + Path: scope, + Secure: r.TLS != nil, + }) + } + + if limitQuery != "" { + limit, err = strconv.Atoi(limitQuery) + // If the 'limit' query can't be interpreted as a number, return err. + if err != nil { + return + } + } + + return +} diff --git a/http_put.go b/http_put.go new file mode 100644 index 00000000..67164119 --- /dev/null +++ b/http_put.go @@ -0,0 +1,138 @@ +package filemanager + +import ( + "bytes" + "encoding/json" + "errors" + "io/ioutil" + "net/http" + "path/filepath" + "strconv" + "strings" + + "github.com/hacdias/filemanager/frontmatter" +) + +// put is used to update a file that was edited +func put(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (err error) { + var ( + data = map[string]interface{}{} + file []byte + kind string + rawBuffer = new(bytes.Buffer) + ) + + kind = r.Header.Get("kind") + rawBuffer.ReadFrom(r.Body) + + if kind != "" { + err = json.Unmarshal(rawBuffer.Bytes(), &data) + + if err != nil { + return + } + } + + switch kind { + case "frontmatter-only": + if file, err = parseFrontMatterOnlyFile(data, r.URL.Path); err != nil { + return + } + case "content-only": + mainContent := data["content"].(string) + mainContent = strings.TrimSpace(mainContent) + file = []byte(mainContent) + case "complete": + var mark rune + + if v := r.Header.Get("Rune"); v != "" { + var n int + n, err = strconv.Atoi(v) + if err != nil { + return err + } + + mark = rune(n) + } + + if file, err = parseCompleteFile(data, r.URL.Path, mark); err != nil { + return + } + default: + file = rawBuffer.Bytes() + } + + // Overwrite the request Body + r.Body = ioutil.NopCloser(bytes.NewReader(file)) + return +} + +// parseFrontMatterOnlyFile parses a frontmatter only file +func parseFrontMatterOnlyFile(data interface{}, filename string) ([]byte, error) { + frontmatter := strings.TrimPrefix(filepath.Ext(filename), ".") + f, err := parseFrontMatter(data, frontmatter) + fString := string(f) + + // If it's toml or yaml, strip frontmatter identifier + if frontmatter == "toml" { + fString = strings.TrimSuffix(fString, "+++\n") + fString = strings.TrimPrefix(fString, "+++\n") + } + + if frontmatter == "yaml" { + fString = strings.TrimSuffix(fString, "---\n") + fString = strings.TrimPrefix(fString, "---\n") + } + + f = []byte(fString) + return f, err +} + +// parseFrontMatter is the frontmatter parser +func parseFrontMatter(data interface{}, front string) ([]byte, error) { + var mark rune + + switch front { + case "toml": + mark = '+' + case "json": + mark = '{' + case "yaml": + mark = '-' + default: + return nil, errors.New("Unsupported Format provided") + } + + return frontmatter.Marshal(data, mark) +} + +// parseCompleteFile parses a complete file +func parseCompleteFile(data map[string]interface{}, filename string, mark rune) ([]byte, error) { + mainContent := "" + + if _, ok := data["content"]; ok { + // The main content of the file + mainContent = data["content"].(string) + mainContent = "\n\n" + strings.TrimSpace(mainContent) + "\n" + + // Removes the main content from the rest of the frontmatter + delete(data, "content") + } + + if _, ok := data["date"]; ok { + data["date"] = data["date"].(string) + ":00" + } + + front, err := frontmatter.Marshal(data, mark) + if err != nil { + return []byte{}, err + } + + front = frontmatter.AppendRune(front, mark) + + // Generates the final file + f := new(bytes.Buffer) + f.Write(front) + f.Write([]byte(mainContent)) + return f.Bytes(), nil +} diff --git a/http_search.go b/http_search.go new file mode 100644 index 00000000..e35918c8 --- /dev/null +++ b/http_search.go @@ -0,0 +1,117 @@ +package filemanager + +import ( + "net/http" + "os" + "path/filepath" + "strings" + + "github.com/gorilla/websocket" +) + +type searchOptions struct { + CaseInsensitive bool + Terms []string +} + +func parseSearch(value string) *searchOptions { + opts := &searchOptions{ + CaseInsensitive: strings.Contains(value, "case:insensitive"), + } + + // removes the options from the value + value = strings.Replace(value, "case:insensitive", "", -1) + value = strings.Replace(value, "case:sensitive", "", -1) + value = strings.TrimSpace(value) + + if opts.CaseInsensitive { + value = strings.ToLower(value) + } + + // if the value starts with " and finishes what that character, we will + // only search for that term + if value[0] == '"' && value[len(value)-1] == '"' { + unique := strings.TrimPrefix(value, "\"") + unique = strings.TrimSuffix(unique, "\"") + + opts.Terms = []string{unique} + return opts + } + + opts.Terms = strings.Split(value, " ") + return opts +} + +// search searches for a file or directory. +func search(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (int, error) { + // Upgrades the connection to a websocket and checks for errors. + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + return 0, err + } + defer conn.Close() + + var ( + value string + search *searchOptions + message []byte + ) + + // Starts an infinite loop until a valid command is captured. + for { + _, message, err = conn.ReadMessage() + if err != nil { + return http.StatusInternalServerError, err + } + + if len(message) != 0 { + value = string(message) + break + } + } + + search = parseSearch(value) + scope := strings.Replace(r.URL.Path, c.BaseURL, "", 1) + scope = strings.TrimPrefix(scope, "/") + scope = "/" + scope + scope = u.Scope + scope + scope = strings.Replace(scope, "\\", "/", -1) + scope = filepath.Clean(scope) + + err = filepath.Walk(scope, func(path string, f os.FileInfo, err error) error { + if search.CaseInsensitive { + path = strings.ToLower(path) + } + + path = strings.Replace(path, "\\", "/", -1) + is := false + + for _, term := range search.Terms { + if is { + break + } + + if strings.Contains(path, term) { + if !u.Allowed(path) { + return nil + } + + is = true + } + } + + if !is { + return nil + } + + path = strings.TrimPrefix(path, scope) + path = strings.TrimPrefix(path, "/") + return conn.WriteMessage(websocket.TextMessage, []byte(path)) + }) + + if err != nil { + return http.StatusInternalServerError, err + } + + return http.StatusOK, nil +} diff --git a/http_single.go b/http_single.go new file mode 100644 index 00000000..87f01315 --- /dev/null +++ b/http_single.go @@ -0,0 +1,50 @@ +package filemanager + +import ( + "net/http" + "strings" +) + +// serveSingle serves a single file in an editor (if it is editable), shows the +// plain file, or downloads it if it can't be shown. +func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *User, i *FileInfo) (int, error) { + var err error + + if err = i.RetrieveFileType(); err != nil { + return errorToHTTP(err, true), err + } + + p := &Page{ + PageInfo: &PageInfo{ + Name: i.Name, + Path: i.VirtualPath, + IsDir: false, + Data: i, + User: u, + Config: c, + }, + } + + // If the request accepts JSON, we send the file information. + if strings.Contains(r.Header.Get("Accept"), "application/json") { + return p.PrintAsJSON(w) + } + + if i.Type == "text" { + if err = i.Read(); err != nil { + return errorToHTTP(err, true), err + } + } + + if i.CanBeEdited() && u.AllowEdit { + p.Data, err = GetEditor(r, i) + p.Editor = true + if err != nil { + return http.StatusInternalServerError, err + } + + return p.PrintAsHTML(w, "frontmatter", "editor") + } + + return p.PrintAsHTML(w, "single") +} diff --git a/http_utils.go b/http_utils.go new file mode 100644 index 00000000..cbb9fa3a --- /dev/null +++ b/http_utils.go @@ -0,0 +1,50 @@ +package filemanager + +import ( + "net/http" + "os" +) + +// responseWriterNoBody is a wrapper used to suprress the body of the response +// to a request. Mainly used for HEAD requests. +type responseWriterNoBody struct { + http.ResponseWriter +} + +// newResponseWriterNoBody creates a new responseWriterNoBody. +func newResponseWriterNoBody(w http.ResponseWriter) *responseWriterNoBody { + return &responseWriterNoBody{w} +} + +// Header executes the Header method from the http.ResponseWriter. +func (w responseWriterNoBody) Header() http.Header { + return w.ResponseWriter.Header() +} + +// Write suprresses the body. +func (w responseWriterNoBody) Write(data []byte) (int, error) { + return 0, nil +} + +// WriteHeader writes the header to the http.ResponseWriter. +func (w responseWriterNoBody) WriteHeader(statusCode int) { + w.ResponseWriter.WriteHeader(statusCode) +} + +// errorToHTTP converts errors to HTTP Status Code. +func errorToHTTP(err error, gone bool) int { + switch { + case os.IsPermission(err): + return http.StatusForbidden + case os.IsNotExist(err): + if !gone { + return http.StatusNotFound + } + + return http.StatusGone + case os.IsExist(err): + return http.StatusGone + default: + return http.StatusInternalServerError + } +} diff --git a/info.go b/info.go new file mode 100644 index 00000000..741f03bd --- /dev/null +++ b/info.go @@ -0,0 +1,163 @@ +package filemanager + +import ( + "io/ioutil" + "mime" + "net/http" + "net/url" + "os" + "path/filepath" + "strings" + "time" + + humanize "github.com/dustin/go-humanize" +) + +// FileInfo contains the information about a particular file or directory +type FileInfo struct { + Name string + Size int64 + URL string + Extension string + ModTime time.Time + Mode os.FileMode + IsDir bool + Path string // Relative path to Current Working Directory + VirtualPath string // Relative path to user's virtual File System + Mimetype string + Type string + UserAllowed bool // Indicates if the user has enough permissions + + content []byte +} + +// GetInfo gets the file information and, in case of error, returns the +// respective HTTP error code +func GetInfo(url *url.URL, c *FileManager, u *User) (*FileInfo, error) { + var err error + + i := &FileInfo{URL: c.PrefixURL + url.Path} + i.VirtualPath = strings.Replace(url.Path, c.BaseURL, "", 1) + i.VirtualPath = strings.TrimPrefix(i.VirtualPath, "/") + i.VirtualPath = "/" + i.VirtualPath + + i.Path = u.Scope + i.VirtualPath + i.Path = filepath.Clean(i.Path) + + info, err := os.Stat(i.Path) + if err != nil { + return i, err + } + + i.Name = info.Name() + i.ModTime = info.ModTime() + i.Mode = info.Mode() + i.IsDir = info.IsDir() + i.Size = info.Size() + i.Extension = filepath.Ext(i.Name) + return i, nil +} + +var textExtensions = [...]string{ + ".md", ".markdown", ".mdown", ".mmark", + ".asciidoc", ".adoc", ".ad", + ".rst", + ".json", ".toml", ".yaml", ".csv", ".xml", ".rss", ".conf", ".ini", + ".tex", ".sty", + ".css", ".sass", ".scss", + ".js", + ".html", + ".txt", ".rtf", + ".sh", ".bash", ".ps1", ".bat", ".cmd", + ".php", ".pl", ".py", + "Caddyfile", + ".c", ".cc", ".h", ".hh", ".cpp", ".hpp", ".f90", + ".f", ".bas", ".d", ".ada", ".nim", ".cr", ".java", ".cs", ".vala", ".vapi", +} + +// RetrieveFileType obtains the mimetype and a simplified internal Type +// using the first 512 bytes from the file. +func (i FileInfo) RetrieveFileType() error { + i.Mimetype = mime.TypeByExtension(i.Extension) + + if i.Mimetype == "" { + err := i.Read() + if err != nil { + return err + } + + i.Mimetype = http.DetectContentType(i.content) + } + + if strings.HasPrefix(i.Mimetype, "video") { + i.Type = "video" + return nil + } + + if strings.HasPrefix(i.Mimetype, "audio") { + i.Type = "audio" + return nil + } + + if strings.HasPrefix(i.Mimetype, "image") { + i.Type = "image" + return nil + } + + if strings.HasPrefix(i.Mimetype, "text") { + i.Type = "text" + return nil + } + + if strings.HasPrefix(i.Mimetype, "application/javascript") { + i.Type = "text" + return nil + } + + // If the type isn't text (and is blob for example), it will check some + // common types that are mistaken not to be text. + for _, extension := range textExtensions { + if strings.HasSuffix(i.Name, extension) { + i.Type = "text" + return nil + } + } + + i.Type = "blob" + return nil +} + +// Reads the file. +func (i FileInfo) Read() error { + if len(i.content) != 0 { + return nil + } + + var err error + i.content, err = ioutil.ReadFile(i.Path) + if err != nil { + return err + } + return nil +} + +// StringifyContent returns the string version of Raw +func (i FileInfo) StringifyContent() string { + return string(i.content) +} + +// HumanSize returns the size of the file as a human-readable string +// in IEC format (i.e. power of 2 or base 1024). +func (i FileInfo) HumanSize() string { + return humanize.IBytes(uint64(i.Size)) +} + +// HumanModTime returns the modified time of the file as a human-readable string. +func (i FileInfo) HumanModTime(format string) string { + return i.ModTime.Format(format) +} + +// CanBeEdited checks if the extension of a file is supported by the editor +func (i FileInfo) CanBeEdited() bool { + return i.Type == "text" +} diff --git a/listing.go b/listing.go new file mode 100644 index 00000000..b272c2af --- /dev/null +++ b/listing.go @@ -0,0 +1,184 @@ +package filemanager + +import ( + "context" + "net/url" + "os" + "path" + "sort" + "strings" + + "github.com/mholt/caddy/caddyhttp/httpserver" +) + +// A Listing is the context used to fill out a template. +type Listing struct { + // The name of the directory (the last element of the path) + Name string + // The full path of the request relatively to a File System + Path string + // The items (files and folders) in the path + Items []FileInfo + // The number of directories in the listing + NumDirs int + // The number of files (items that aren't directories) in the listing + NumFiles int + // Which sorting order is used + Sort string + // And which order + Order string + // If ≠0 then Items have been limited to that many elements + ItemsLimitedTo int + httpserver.Context `json:"-"` +} + +// GetListing gets the information about a specific directory and its files. +func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { + // Gets the directory information using the Virtual File System of + // the user configuration. + file, err := u.FileSystem.OpenFile(context.TODO(), filePath, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + defer file.Close() + + // Reads the directory and gets the information about the files. + files, err := file.Readdir(-1) + if err != nil { + return nil, err + } + + var ( + fileinfos []FileInfo + dirCount, fileCount int + ) + + for _, f := range files { + name := f.Name() + allowed := u.Allowed("/" + name) + + if !allowed { + continue + } + + if f.IsDir() { + name += "/" + dirCount++ + } else { + fileCount++ + } + + // Absolute URL + url := url.URL{Path: baseURL + name} + + i := FileInfo{ + Name: f.Name(), + Size: f.Size(), + ModTime: f.ModTime(), + Mode: f.Mode(), + IsDir: f.IsDir(), + URL: url.String(), + UserAllowed: allowed, + } + i.RetrieveFileType() + + fileinfos = append(fileinfos, i) + } + + return &Listing{ + Name: path.Base(filePath), + Path: filePath, + Items: fileinfos, + NumDirs: dirCount, + NumFiles: fileCount, + }, nil +} + +// ApplySort applies the sort order using .Order and .Sort +func (l Listing) ApplySort() { + // Check '.Order' to know how to sort + if l.Order == "desc" { + switch l.Sort { + case "name": + sort.Sort(sort.Reverse(byName(l))) + case "size": + sort.Sort(sort.Reverse(bySize(l))) + case "time": + sort.Sort(sort.Reverse(byTime(l))) + default: + // If not one of the above, do nothing + return + } + } else { // If we had more Orderings we could add them here + switch l.Sort { + case "name": + sort.Sort(byName(l)) + case "size": + sort.Sort(bySize(l)) + case "time": + sort.Sort(byTime(l)) + default: + sort.Sort(byName(l)) + return + } + } +} + +// Implement sorting for Listing +type byName Listing +type bySize Listing +type byTime Listing + +// By Name +func (l byName) Len() int { + return len(l.Items) +} + +func (l byName) Swap(i, j int) { + l.Items[i], l.Items[j] = l.Items[j], l.Items[i] +} + +// Treat upper and lower case equally +func (l byName) Less(i, j int) bool { + if l.Items[i].IsDir && !l.Items[j].IsDir { + return true + } + + if !l.Items[i].IsDir && l.Items[j].IsDir { + return false + } + + return strings.ToLower(l.Items[i].Name) < strings.ToLower(l.Items[j].Name) +} + +// By Size +func (l bySize) Len() int { + return len(l.Items) +} + +func (l bySize) Swap(i, j int) { + l.Items[i], l.Items[j] = l.Items[j], l.Items[i] +} + +const directoryOffset = -1 << 31 // = math.MinInt32 +func (l bySize) Less(i, j int) bool { + iSize, jSize := l.Items[i].Size, l.Items[j].Size + if l.Items[i].IsDir { + iSize = directoryOffset + iSize + } + if l.Items[j].IsDir { + jSize = directoryOffset + jSize + } + return iSize < jSize +} + +// By Time +func (l byTime) Len() int { + return len(l.Items) +} +func (l byTime) Swap(i, j int) { + l.Items[i], l.Items[j] = l.Items[j], l.Items[i] +} +func (l byTime) Less(i, j int) bool { + return l.Items[i].ModTime.Before(l.Items[j].ModTime) +} diff --git a/page.go b/page.go new file mode 100644 index 00000000..b65a7365 --- /dev/null +++ b/page.go @@ -0,0 +1,168 @@ +package filemanager + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "html/template" + "log" + "net/http" + "strings" + + "github.com/hacdias/filemanager/variables" +) + +// Page contains the informations and functions needed to show the Page +type Page struct { + *PageInfo + Minimal bool +} + +// PageInfo contains the information of a Page +type PageInfo struct { + Name string + Path string + IsDir bool + User *User + Config *FileManager + Data interface{} + Editor bool + Display string +} + +// BreadcrumbMapItem ... +type BreadcrumbMapItem struct { + Name string + URL string +} + +// BreadcrumbMap returns p.Path where every element is a map +// of URLs and path segment names. +func (i PageInfo) BreadcrumbMap() []BreadcrumbMapItem { + result := []BreadcrumbMapItem{} + + if len(i.Path) == 0 { + return result + } + + // skip trailing slash + lpath := i.Path + if lpath[len(lpath)-1] == '/' { + lpath = lpath[:len(lpath)-1] + } + + parts := strings.Split(lpath, "/") + for i, part := range parts { + if i == len(parts)-1 { + continue + } + + if i == 0 && part == "" { + result = append([]BreadcrumbMapItem{{ + Name: "/", + URL: "/", + }}, result...) + continue + } + + result = append([]BreadcrumbMapItem{{ + Name: part, + URL: strings.Join(parts[:i+1], "/") + "/", + }}, result...) + } + + return result +} + +// PreviousLink returns the path of the previous folder +func (i PageInfo) PreviousLink() string { + path := strings.TrimSuffix(i.Path, "/") + path = strings.TrimPrefix(path, "/") + path = i.Config.AbsoluteURL() + "/" + path + path = path[0 : len(path)-len(i.Name)] + + if len(path) < len(i.Config.AbsoluteURL()+"/") { + return "" + } + + return path +} + +// Create the functions map, then the template, check for erros and +// execute the template if there aren't errors +var functions = template.FuncMap{ + "Defined": variables.FieldInStruct, + "CSS": func(s string) template.CSS { + return template.CSS(s) + }, + "Marshal": func(v interface{}) template.JS { + a, _ := json.Marshal(v) + return template.JS(a) + }, + "EncodeBase64": func(s string) string { + return base64.StdEncoding.EncodeToString([]byte(s)) + }, +} + +// PrintAsHTML formats the page in HTML and executes the template +func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, error) { + + if p.Minimal { + templates = append(templates, "minimal") + } else { + templates = append(templates, "base") + } + + var tpl *template.Template + + // For each template, add it to the the tpl variable + for i, t := range templates { + // Get the template from the assets + Page, err := p.Config.Assets.Templates.String(t + ".tmpl") + + // Check if there is some error. If so, the template doesn't exist + if err != nil { + log.Print(err) + return http.StatusInternalServerError, err + } + + // If it's the first iteration, creates a new template and add the + // functions map + if i == 0 { + tpl, err = template.New(t).Funcs(functions).Parse(Page) + } else { + tpl, err = tpl.Parse(string(Page)) + } + + if err != nil { + log.Print(err) + return http.StatusInternalServerError, err + } + } + + buf := &bytes.Buffer{} + err := tpl.Execute(buf, p.PageInfo) + + if err != nil { + return http.StatusInternalServerError, err + } + + w.Header().Set("Content-Type", "text/html; charset=utf-8") + _, err = buf.WriteTo(w) + return http.StatusOK, err +} + +// PrintAsJSON prints the current Page information in JSON +func (p Page) PrintAsJSON(w http.ResponseWriter) (int, error) { + marsh, err := json.MarshalIndent(p.PageInfo.Data, "", " ") + if err != nil { + return http.StatusInternalServerError, err + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + if _, err := w.Write(marsh); err != nil { + return http.StatusInternalServerError, err + } + + return http.StatusOK, nil +} diff --git a/variables/types.go b/variables/types.go new file mode 100644 index 00000000..ee43dad3 --- /dev/null +++ b/variables/types.go @@ -0,0 +1,13 @@ +package variables + +import "reflect" + +// IsMap checks if some variable is a map +func IsMap(sth interface{}) bool { + return reflect.ValueOf(sth).Kind() == reflect.Map +} + +// IsSlice checks if some variable is a slice +func IsSlice(sth interface{}) bool { + return reflect.ValueOf(sth).Kind() == reflect.Slice +} diff --git a/variables/types_test.go b/variables/types_test.go new file mode 100644 index 00000000..9955b9b2 --- /dev/null +++ b/variables/types_test.go @@ -0,0 +1,49 @@ +package variables + +import "testing" + +type interfaceToBool struct { + Value interface{} + Result bool +} + +var testIsMap = []*interfaceToBool{ + &interfaceToBool{"teste", false}, + &interfaceToBool{453478, false}, + &interfaceToBool{-984512, false}, + &interfaceToBool{true, false}, + &interfaceToBool{map[string]bool{}, true}, + &interfaceToBool{map[int]bool{}, true}, + &interfaceToBool{map[interface{}]bool{}, true}, + &interfaceToBool{[]string{}, false}, +} + +func TestIsMap(t *testing.T) { + for _, test := range testIsMap { + if IsMap(test.Value) != test.Result { + t.Errorf("Incorrect value on IsMap for %v; want: %v; got: %v", test.Value, test.Result, !test.Result) + } + } +} + +var testIsSlice = []*interfaceToBool{ + &interfaceToBool{"teste", false}, + &interfaceToBool{453478, false}, + &interfaceToBool{-984512, false}, + &interfaceToBool{true, false}, + &interfaceToBool{map[string]bool{}, false}, + &interfaceToBool{map[int]bool{}, false}, + &interfaceToBool{map[interface{}]bool{}, false}, + &interfaceToBool{[]string{}, true}, + &interfaceToBool{[]int{}, true}, + &interfaceToBool{[]bool{}, true}, + &interfaceToBool{[]interface{}{}, true}, +} + +func TestIsSlice(t *testing.T) { + for _, test := range testIsSlice { + if IsSlice(test.Value) != test.Result { + t.Errorf("Incorrect value on IsSlice for %v; want: %v; got: %v", test.Value, test.Result, !test.Result) + } + } +} diff --git a/variables/variables.go b/variables/variables.go new file mode 100644 index 00000000..37782c74 --- /dev/null +++ b/variables/variables.go @@ -0,0 +1,47 @@ +package variables + +import ( + "errors" + "log" + "reflect" +) + +// Dict allows to send more than one variable into a template. +func Dict(values ...interface{}) (map[string]interface{}, error) { + if len(values)%2 != 0 { + return nil, errors.New("invalid dict call") + } + dict := make(map[string]interface{}, len(values)/2) + for i := 0; i < len(values); i += 2 { + key, ok := values[i].(string) + if !ok { + return nil, errors.New("dict keys must be strings") + } + dict[key] = values[i+1] + } + + return dict, nil +} + +// FieldInStruct checks if variable is defined in a struct. +func FieldInStruct(data interface{}, field string) bool { + t := reflect.Indirect(reflect.ValueOf(data)).Type() + + if t.Kind() != reflect.Struct { + log.Print("Non-struct type not allowed.") + return false + } + + _, b := t.FieldByName(field) + return b +} + +// StringInSlice checks if a slice contains a string. +func StringInSlice(a string, list []string) (bool, int) { + for i, b := range list { + if b == a { + return true, i + } + } + return false, 0 +} diff --git a/variables/variables_test.go b/variables/variables_test.go new file mode 100644 index 00000000..95dcd5ab --- /dev/null +++ b/variables/variables_test.go @@ -0,0 +1,41 @@ +package variables + +import "testing" + +type testFieldInStructData struct { + f1 string + f2 bool + f3 int + f4 func() +} + +type testFieldInStruct struct { + data interface{} + field string + result bool +} + +var testFieldInStructCases = []testFieldInStruct{ + {testFieldInStructData{}, "f1", true}, + {testFieldInStructData{}, "f2", true}, + {testFieldInStructData{}, "f3", true}, + {testFieldInStructData{}, "f4", true}, + {testFieldInStructData{}, "f5", false}, + {[]string{}, "", false}, + {map[string]int{"oi": 4}, "", false}, + {"asa", "", false}, + {"int", "", false}, +} + +func TestFieldInStruct(t *testing.T) { + for _, pair := range testFieldInStructCases { + v := FieldInStruct(pair.data, pair.field) + if v != pair.result { + t.Error( + "For", pair.data, + "expected", pair.result, + "got", v, + ) + } + } +} From 61a9a30c0ea1a7527c9677d58e2974227dccd829 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sat, 24 Jun 2017 12:13:07 +0100 Subject: [PATCH 12/40] License Former-commit-id: bab6c81397b5a9fee41ffcc20d5cf592f49d283d --- LICENSE.md | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..5e0fd33c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,201 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all +other entities that control, are controlled by, or are under common +control with that entity. For the purposes of this definition, +"control" means (i) the power, direct or indirect, to cause the +direction or management of such entity, whether by contract or +otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation +source, and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or +Object form, made available under the License, as indicated by a +copyright notice that is included in or attached to the work +(an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object +form, that is based on (or derived from) the Work and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. For the purposes +of this License, Derivative Works shall not include works that remain +separable from, or merely link (or bind by name) to the interfaces of, +the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including +the original version of the Work and any modifications or additions +to that Work or Derivative Works thereof, that is intentionally +submitted to Licensor for inclusion in the Work by the copyright owner +or by an individual or Legal Entity authorized to submit on behalf of +the copyright owner. For the purposes of this definition, "submitted" +means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, +and issue tracking systems that are managed by, or on behalf of, the +Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise +designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work, +where such license applies only to those patent claims licensable +by such Contributor that are necessarily infringed by their +Contribution(s) alone or by combination of their Contribution(s) +with the Work to which such Contribution(s) was submitted. If You +institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work +or a Contribution incorporated within the Work constitutes direct +or contributory patent infringement, then any patent licenses +granted to You under this License for that Work shall terminate +as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You +meet the following conditions: + +(a) You must give any other recipients of the Work or +Derivative Works a copy of this License; and + +(b) You must cause any modified files to carry prominent notices +stating that You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works +that You distribute, all copyright, patent, trademark, and +attribution notices from the Source form of the Work, +excluding those notices that do not pertain to any part of +the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its +distribution, then any Derivative Works that You distribute must +include a readable copy of the attribution notices contained +within such NOTICE file, excluding those notices that do not +pertain to any part of the Derivative Works, in at least one +of the following places: within a NOTICE text file distributed +as part of the Derivative Works; within the Source form or +documentation, if provided along with the Derivative Works; or, +within a display generated by the Derivative Works, if and +wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and +do not modify the License. You may add Your own attribution +notices within Derivative Works that You distribute, alongside +or as an addendum to the NOTICE text from the Work, provided +that such additional attribution notices cannot be construed +as modifying the License. + +You may add Your own copyright statement to Your modifications and +may provide additional or different license terms and conditions +for use, reproduction, or distribution of Your modifications, or +for any such Derivative Works as a whole, provided Your use, +reproduction, and distribution of the Work otherwise complies with +the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "{}" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + +Copyright {yyyy} {name of copyright owner} + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. From 048c69af22b53f0ace75f41d1a45fb84685a0095 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 09:11:25 +0100 Subject: [PATCH 13/40] improvements Former-commit-id: e648350a0ca0af302ba8b929ac653433beb0e61c --- .gitmodules | 3 + _assets/css/fonts.css | 137 ++ _assets/css/material/icons.woff2 | Bin 0 -> 44300 bytes _assets/css/normalize.css | 461 +++++++ _assets/css/roboto/medium-cyrillic-ext.woff2 | Bin 0 -> 15292 bytes _assets/css/roboto/medium-cyrillic.woff2 | Bin 0 -> 10060 bytes _assets/css/roboto/medium-greek-ext.woff2 | Bin 0 -> 1412 bytes _assets/css/roboto/medium-greek.woff2 | Bin 0 -> 7176 bytes _assets/css/roboto/medium-latin-ext.woff2 | Bin 0 -> 11912 bytes _assets/css/roboto/medium-latin.woff2 | Bin 0 -> 14596 bytes _assets/css/roboto/medium-vietnamese.woff2 | Bin 0 -> 4780 bytes _assets/css/roboto/normal-cyrillic-ext.woff2 | Bin 0 -> 15832 bytes _assets/css/roboto/normal-cyrillic.woff2 | Bin 0 -> 9996 bytes _assets/css/roboto/normal-greek-ext.woff2 | Bin 0 -> 1432 bytes _assets/css/roboto/normal-greek.woff2 | Bin 0 -> 7208 bytes _assets/css/roboto/normal-latin-ext.woff2 | Bin 0 -> 12008 bytes _assets/css/roboto/normal-latin.woff2 | Bin 0 -> 14584 bytes _assets/css/roboto/normal-vietnamese.woff2 | Bin 0 -> 4896 bytes _assets/css/styles.css | 1207 ++++++++++++++++++ _assets/js/common.js | 685 ++++++++++ _assets/js/editor.js | 278 ++++ _assets/js/listing.js | 580 +++++++++ _assets/js/vendor/ace | 1 + _assets/js/vendor/form2js.js | 356 ++++++ _assets/templates/base.tmpl | 289 +++++ _assets/templates/editor.tmpl | 57 + _assets/templates/frontmatter.tmpl | 56 + _assets/templates/listing.tmpl | 103 ++ _assets/templates/minimal.tmpl | 1 + _assets/templates/single.tmpl | 23 + cmd/filemanager/main.go | 24 + filemanager.go | 61 +- http.go | 13 +- http_assets.go | 11 +- info.go | 4 +- 35 files changed, 4335 insertions(+), 15 deletions(-) create mode 100644 .gitmodules create mode 100644 _assets/css/fonts.css create mode 100644 _assets/css/material/icons.woff2 create mode 100644 _assets/css/normalize.css create mode 100644 _assets/css/roboto/medium-cyrillic-ext.woff2 create mode 100644 _assets/css/roboto/medium-cyrillic.woff2 create mode 100644 _assets/css/roboto/medium-greek-ext.woff2 create mode 100644 _assets/css/roboto/medium-greek.woff2 create mode 100644 _assets/css/roboto/medium-latin-ext.woff2 create mode 100644 _assets/css/roboto/medium-latin.woff2 create mode 100644 _assets/css/roboto/medium-vietnamese.woff2 create mode 100644 _assets/css/roboto/normal-cyrillic-ext.woff2 create mode 100644 _assets/css/roboto/normal-cyrillic.woff2 create mode 100644 _assets/css/roboto/normal-greek-ext.woff2 create mode 100644 _assets/css/roboto/normal-greek.woff2 create mode 100644 _assets/css/roboto/normal-latin-ext.woff2 create mode 100644 _assets/css/roboto/normal-latin.woff2 create mode 100644 _assets/css/roboto/normal-vietnamese.woff2 create mode 100644 _assets/css/styles.css create mode 100644 _assets/js/common.js create mode 100644 _assets/js/editor.js create mode 100644 _assets/js/listing.js create mode 160000 _assets/js/vendor/ace create mode 100644 _assets/js/vendor/form2js.js create mode 100644 _assets/templates/base.tmpl create mode 100644 _assets/templates/editor.tmpl create mode 100644 _assets/templates/frontmatter.tmpl create mode 100644 _assets/templates/listing.tmpl create mode 100644 _assets/templates/minimal.tmpl create mode 100644 _assets/templates/single.tmpl create mode 100644 cmd/filemanager/main.go diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..7a8f771e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "_assets/js/vendor/ace"] + path = _assets/js/vendor/ace + url = https://github.com/ajaxorg/ace-builds diff --git a/_assets/css/fonts.css b/_assets/css/fonts.css new file mode 100644 index 00000000..1911d377 --- /dev/null +++ b/_assets/css/fonts.css @@ -0,0 +1,137 @@ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-cyrillic-ext.woff2) format('woff2'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-cyrillic.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-greek-ext.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-greek.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-vietnamese.woff2) format('woff2'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url(roboto/normal-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-cyrillic-ext.woff2) format('woff2'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-cyrillic.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-greek-ext.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-greek.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-vietnamese.woff2) format('woff2'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-latin-ext.woff2) format('woff2'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url(roboto/medium-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} + +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: local('Material Icons'), local('MaterialIcons-Regular'), url(material/icons.woff2) format('woff2'); +} + +.prompt .file-list ul li:before, +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + -moz-osx-font-smoothing: grayscale; + font-feature-settings: 'liga'; +} diff --git a/_assets/css/material/icons.woff2 b/_assets/css/material/icons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/_assets/css/normalize.css b/_assets/css/normalize.css new file mode 100644 index 00000000..9b77e0eb --- /dev/null +++ b/_assets/css/normalize.css @@ -0,0 +1,461 @@ +/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */ + +/** + * 1. Change the default font family in all browsers (opinionated). + * 2. Correct the line height in all browsers. + * 3. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + +/* Document + ========================================================================== */ + +html { + font-family: sans-serif; /* 1 */ + line-height: 1.15; /* 2 */ + -ms-text-size-adjust: 100%; /* 3 */ + -webkit-text-size-adjust: 100%; /* 3 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers (opinionated). + */ + +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ + +figcaption, +figure, +main { /* 1 */ + display: block; +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/** + * Remove the outline on focused links when they are also active or hovered + * in all browsers (opinionated). + */ + +a:active, +a:hover { + outline-width: 0; +} + +/** + * 1. Remove the bottom border in Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Change the border, margin, and padding in all browsers (opinionated). + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ + +details, /* 1 */ +menu { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Scripting + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ + +template { + display: none; +} + +/* Hidden + ========================================================================== */ + +/** + * Add the correct display in IE 10-. + */ + +[hidden] { + display: none; +} diff --git a/_assets/css/roboto/medium-cyrillic-ext.woff2 b/_assets/css/roboto/medium-cyrillic-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f63bc9a1934f40bbbc109e7697aacb18ebb2f284 GIT binary patch literal 15292 zcmV;tJ43{GPew8T0RR9106V+@5dZ)H0E=J%06SR#0ssI200000000000000000000 z0000RlRz8{24Db)QV3QFgFF!o3W4DqfypNlfp`Hn0we>6FbjiP00bZff*c1R41r7= zYu2VO+AhK$B1#O4v;OYi_X;kSZANhn`RgpQ};VzH+tFB+XZU#$i8x+}A4X8D*Mp=6-&Na0uB zIbg*sk^2wvbNhQsM$~ALl5BOT&=LY7A@pD{G6!r#lpmyO)Br(1QX;wBI0g@n*cSqUaZKY8HRpI-;cQRZa7=;l%_|Eb2mn$`{2xB^u+&>4z_xt_s z`(lcyMM8wse+|pd8GPU6-WdlweP@?Pw`Hz`xrE1|;?%D@Z?I3DpJb9{2R48&7YFF$ z9$^VZQ(n)|`y@Gc z&pGz8_Yf+EvLYz@>xx5$obUm$MHG+(|I>y%(93q|M@nn-uw;IWrC%PJ*dysTpS9*< zl`27s6SQ<{+4DSx(?;5fy*Cq!32`{=E|j0yaMa}P#ic4h30Wk28{h(Vq9E>ek4tty z=&7ZMARztBv`-*Ve_kpo1YCds$Ui{f(U4)l!*ib=5dwrNy9i(tE(920W!^6b@w06C z7FK-S&TNO9)$XMUwx#XRu7~&h?QVtjvVZ_Z-PBE(GwSBJl`=3OUWSxX5CK~-^8UU- zgR=_(M1_tE%vf-P=Y^z1rTL~~YoumINQ$8N2u_C35JmRuqH}7%SYC?Hg!H_Xg$p-al30ewMytCeMMTL688k)>_K8AMEi6Hzvu%}qAWBLlr$>4c zWZ{sV5;-{lvCLPPf;`)zN9ZY?i=4Ay!5=|JY}y^N;_L8uCEQ2#HiXe}Wk<11$59O_mTsf^GaJO4cMx zH)u8bKa?O%G&oyA>qK%kB;|vwE%rYJHeLh)jNi680o*{cb2sz(oL1$$+|OY?nf|te z3CLYsS;n2WtL0?FI{4}Q*sgrc6Cm#!BOj0U7x{i&86ewA$rb&~%O>Co)iqq%0+{~z zHjpjnyYsvrY3@3d9mllqcd2F*=f|Wst3W78#D@(68Op;v2C5R>qV-W&AGZzUQ+5EC z1ax06z!mafGe00RnaXo%ZE&@dJDmXv8D-`(4CLK>us;OeqkKumU8&^r7`xN)JFxD2)%vGLY8vWg^ZC zC$fhdkgp>vKyF2VQYrA+H?=u3BuX2;nvgSzI%r;4#l=%qxt6fso-JCn>qy+emj!Mx zr|InRy8vQ_lQ||9xVT}3hvEf=gikRhCAd_Aslw(OX8++*4XFmkb=+zp)q&Jw(E!qj zMGJ)1vWFD*Vx2Ik0=Ir}12_%iG=kMAUSqi2!fPCt3A`q8nT0Wj+Y*!&NNdpU!nlXq zV^~k{c?#nhZZC0ojmJ8yw@@}9Z5<@YSu`l+_IrelbwXmoY*019>n01jpp>lwR~yLY ztmEv%ng2qsjd}nYA_1}J41*bP87{yECPgU2rKp#@&PbbYu!^tjDy@P11NiTA>3_%zA7>)jC^w`k0B|QbuN5j{y8L0; zZ%dg{PMp2>!7DCYxmovyJCB9DFUnO|vJB7DTkm)wSh32R4+SvJ_2V<;n9Eh#A-O`?EIQlU&nq}MJUUKA zpYH7Z;_@mbnb$X4>+M}pDMjtcpWm{_imIBrhGwhX>Gt}A;pp$_IjaRCh}7Nd+?-GB*__9NqrXC|_k%^c(~mw9+){;Ff{S->I` z&~~qt;gRL6Kp87pg)3g;f9N`L)vUn|ud^0atYbZ%*}z8BVH2CNx8k?36Ag8!?1B$| zH+yhUrs zJbwY-T;wmI3zzvTc;_mA4QIT=zl%@ayZtlF@c9ks!524RjxVppEMM{8VxI5#@6n4N z_(xdbcm5At@F)KlR{5L%2mQzh|3wJxAM+o-0>BLzBtX|rAT zlk|bP%mIQ5rGWnR_|*dj?r}%~DH6H21%yulQv@V$Qot3-11{xf91E!eX17Z6^g7>w zkg9R3&0U>x0+{o=ntZ_qdQv^ryoi9M3zweol#y(! z(6drCh8(6Re0l9NUL*yI9RV z3ka<5qKAX8b_J9?(R!0hu4e9b3zM@En*yWQpR-#dGn!cuaxNGaB%dCuVvvc3q_!N~ zs2&30GfW`+VNW8E8@n%ZIzc-%@OZJ|h}VPwgKUbI>wWjZg!7~Nqu#JyXsXW0_E4oGfqSiqi>=Ud zP@PkSh`rKYO5*Xh5+n#sR%x?RZdS#1l=wu;2`e@uV)@I*3z)h!TYDCCEDbndG z;aFYLC!`!H?|(Cx75{TFg|suuC4f}9KqMW@gFW$~wij|c4hcJ+%X+mr5{r(>9&RZ) zZjnfu{^R7DN8PVskmV>v*IMC7-f|fC3+4Ct z$kXzpL`#N3Q^{?5NRSSCve#ErjptA6d9rq*PsDjp-fS)ygGWBL<{|@f@{{Wt1s+E# zZ<`8HyUaATS&9i@WVKA5BYHOgN#7e^^pC9tJVNH0DA=-^@c%eXrB~@miI#vKVjkUcrYTz#6YI8V_tn~lp zzMG5=Kbt}hxwKMppx5lO!*BX?VkMES(?Kdhr7#FJsy?3LRD^tV=9t=B5^l+%1-1W6 zS`y)7_0Xc>yCx|p$wY6tV$y5J9NfgM_ZP0zQ8J#e72gcILB0N$X!vJoh4b%rp3!^V=Zc` z?)X*nL>?KO7j2S!;80s%OSUpIw9Wp9HWm85zz+OG(_l>A@VcJ_s?9KlU*=Kd!py|# zL<;rJq%~e~VU@SJMY*)C4^`rnFZFcUnF%9BS?o_EoQQJ0vVwlC5w4R(M1!gdg_FsQ z)``Bd(;g+i+VFX(qxOtsJMUr5>XvmaNh(QtyTI4#z0w*QQcqiu+!64M1x`E zwP{Ey4O?P6Bf5@%dM?3b${PCM+6x24SR-2avmRZ6kTGD5kqn!G^6V^B3GR*jgKJlV z5a}+*I*ir)c`ktC4SaRH_`9L^DKOKghd$8Q&4Zj26h3dzUJ_%j&~X=642`FJTbbXeGqaWgRF0?wUh z!D_(dyYc~0ZoBs=UlC@m&{20*ACMuHV?*2t9Jc2>Dj0(x?h`iS1M!6<=!XgjKNwOU zJtjL`+5WyWa5NEjWtR(BMG>EC6~D{z>nA8)$Ax@;98CCXPNK0?xvRF3fQdX4LQ;%( zy(w=4Lav7dIS7NqM1~>B@LA0KRsO*IlUY!5dpMtS)jr2ri~85kF?+b{admY4=+xu} zT04L4#xYE`*G+INH%`OR_NI}Uo_L@i_2T<`L0^=U9*|sx40;>eI3ynb@#tfwq`})Q zcTkot9!w-^9`q>U&`i5bjq|m&Dp$OiD6G#NYd*16Ngz`Ie>+jBkS_`n3`oV<3Hn#I zG&XiCu>%6ae2pC*4Bm*777|1w3@mvd~WFwtSJYbmP0N5rsbJme=MM?~{Fv5PCq4ZgS&et9xQq{4LvT)gd7&cT2CQ zWZSVQmv4j%;H$jPZ>C{kr*=o3!HeeJiLY`ZxD&#{&4i`}dr%Xolg}H%m{WOg?kNC< zz8=1k4{j=Q*{lhkZ==d!`7B4<-%jeX(7>XBUMX~yvfxWOR!_@)^sXz`D>>I9;wf-dCWXWfx2|wK?nVCMlPD3j=PpS36^Y#)~>=m;n2(bkDH=hZgGvM zHp7($r391Q;^7tQX|_sbM!@0GEa@LAT58S{s4+!ohG+r83UvjJkyQ+@*5E3mG{Z}o zlu5(xI#v@Iu4AtTOHc(5O;fo>W_7ffj}g&NZG;Dgizl3I6kJ{2nbAi@Bp8bg$_GPV z8_qnKaBe6B#t~F{PL-PzYDTKmA3N|X?Hl|;a+c8WGI`1h5tF0@%7Oe9~7g2=C>`p4ZtGi)KB&*6l=+VUNYr|*P+B%f(8J=D>wNfv5 z;W@dC>}R_y)L=&ZfH{3_Gg!*|$g}Ag&;)T4K=XtxKCeiGhRih3=~CfxAm~OwmW2t# z0SuXGE+2VSI1M9iTqevyb3cVFAGdg+djmaVzb0ho0FpKb_i+VCG*_x|%>OL08;x+t zEjzys@X)%8sg`G*yWK6m_RuBgbs*63Y`$aR>$wKCFg zivG15r4Cj$$$*iSm-Y8k!e941cgCf9#%rsLlPBkCLPoAanywcgT7M^yBDCo>B=p!* zAo*QpdLcF+2A-A~aCZ;(^K@70g8NsVR2qLy7jJHAg&ug!KpYH19W5gO`e^rU4B6Ik zuA0+n$rVD{;#-b=jM&K^}nJ=cZ#lFxk{dVKMCvJEtPfPg7unGjDN4C zWo5ZJn7CfaIMd@2>kqfwf_q2zF8f4pV5H!JKhUz9GY9XG!&`9InArSgCQ(6;42{xl zVI}!{M|rl}KUSU&P~dl#(4e&8$&YFW`>m9b=nA9sy9Oy0F-c?Ij@TU$i35?Q#N+n` zdF$TgIm6C~+*$fq7~a*r z^kNFK^~3nTft7SU`FJC{{1vAl^Da|E{GZL7$}Miy;{&Globm73Q=={UQ>56uaYOLr z4uRdA$6k{4S@_d%_O<)Wcvx+}yS!S53vIsf;{2kuKmO3w)j-Hf!j*qc3#E&E;-GF| z7-MMY?cSI@a#2;?@PnIw1rl0Y+|TNsaYcuLRCe3%H*F;}wP^3=GdZgy=Y_G$RW@qA zB%!QWD?HENyav5XPi!-3i+$JYzI5$PU376LI=VzS8tikIGDha#hNP!vE<%sLz&_>N zWXi3o&CCfnJ7d~veEPnwcJc@=3%BxM&KHVxH_>;sQXkkMP;xjZb0XnEq?J@Uj($=M zVZDh}_%2!<|NBLL26*xne95LVXB9TYI^;@QYFgDApMPM0!8SO=7H~%n35JG|+*O9Q zDSb84u{SBh2Ii*eW~K%z(i#80N~QTCrM-2fQ9aS}&HM5glsIPg5cB)AVbo^Bri>nr z>k68;4O97wCffJ^{)Qd#sU8W$FrxqG<5z(n{$m`0>xDB({6P#?Hr%JQvNB?sq7R!;8Wmvqm0nENmGJa_;r(@k_BdZjoT z9Mr%^SD&E!^Ry&!X{ADKcUlndL$P1uK41|dTC9S1>G$C$nbiU23w_sJSSQuU`XH(~ ziV;Qij?_76iyrDwck!sjGw_v;9%}tRUHvmSaUy}?UXvV`*+lk9C=AK%T54j=)K_By{zlkj4%wbv?8cX$ z(2gBrb5c;99qlD?E2B8IAO#nV zcu`479y6=0ihJpNqbv={vITbTGVX(1a&%R1vs}Bbz@s$zhA+Vh%Nc7tKfXdreVr$N zew9lu%#94mOGKTjQ#X)LVQVn-GulQ&et8~OErb7yB>G^GqrLPrSWCE9 zc!s5&_EQ1DyOX5(DCTL*0d7gb&}J}YkUp6Fb3mS`Zi|vT?1<>3cSas{$X$W^X(^}b zz`0Ew;;c@M>Wx+G(^eB#uY_OoKQM@PbawK)VrcDRjPLEc(FCO%xS3tK9Bg&&py>bM z(dD}|GN9`Tm z-;LMr&EDh1OY}=Iex5;I1U^=}Y0CSr8S^g0){yp3%d=nuM?c~A#fj+H;_Yq^EXA;S z_R)UUTi%hq%f1n>nUxrVHF1AlWtAi>5`#yhx7?y*9Ejv=EZKG)wrpwSLUIr<4SM?X z%fqdpmavw+dk0^iKz|X@#1wb`@Z?xHgop}CC3pr?NN~LSW846ke(`Ez(WAhpV0Gm2 z>)AefUxaO-iLFmyMBiawgiD~cx%2B^5ihTalQ{ij7Pfh(w`cR=6#Of$x2so!t|1}b zLiyt2?d@dm<>vr}3mRGvF;7$oGgWt4oVFXOubEf(W*! zV9Pi1?aPrUj0>y9uEUQX&K$mn4{f46qN7}12?{25C17$A3qqV?eUa9iFrV1IWkS>= z*kA0cx`p{Y9HnQ}s1)jZYGh$2O3a6LB!;A+M15`Be>iOLx$)2PyZG|`5Gu#*2;IQ_ zXrBE^Knf6Kb!aF0aSxgmj4$YK=3^Y})b zw8xFD)eduaAi#ePa!}`+dd(6CiRXqHdyX}#G&qbK{3y<=@{?SrkjgN6S^<2NZ z@~HQ|HW}^}SfqEkI7Ovm2nr>4WHtb;pcrf2a&$>&#RuPLH6_*eS@?J>dH9&`RMl@ z$t}RVwoRAv$RoZ@+#eJE(vW72+LfRz zP`AbaWEjZ1DTlEV_yx~6iS)yJmlo3)@sbDQv1Lg|_w22t zU%r+a7YP{&o)md4v(EMEjr62&;7HJzr7yK^?Pzn-=|)wmQ@^zcegtnNcD27E&Aw-) z<2T}HZA`nn{|mh4TmSa^{ziDM(%88B{}KGL*!ltE-kOI`K{7VEWDkgcOzKet2%#?WjNy?ag$tpzfX`G&of?ubvnn!H!m|@Gsu~(a5_2=57 z?V)*mu~+f!froG5bMQN_wr|avIY%WPC0>a#yzCYV{8v7&xO*Em2DT~j&QWIL+nJKh z_nWpD;pMWPVa_sC=wAH7=`&1!NawpU&ibumez^Tvg~cLicplO##%vadMRG)00sV%)t^{yvNr z6wywsa)lU$2EZ2y5J&^BxdixlzrL2p=JX5DJ{gk>@plxEPRrZoZU)?B7YyuM8%LYg9up_aoW_M z1~<%Oit@?OX@;tGMMP3C!O{@MeHdKnPYUt!jdj!t8wiMk=m7ch9VR#+Wn|%`Vz1=6`_2Y_@xP|c3X5r-y*%d@gD2jGXk(~P zoP=={1#;(F%w+p01PBg2(fBca)4@p>JwSWp&aDJ*F*&j?2I57RLK_ zz@*IN<}HPu4lUT^a$n-fcMbWEiR5<^BhOx<2Gla&uNbX<`>Z)~`#=x1AU(G1f(-~4 zNcVp1b+NG!^Q6~<>S*WI+n8~wn0u^Li*%-VOF3>( zt)ad0%JJhnv5%6=E^#{U7gA#by}UXT0?%ctspDb;@&z7$#?MX8c}k>gGd5{h`5g}x zYp%iAquH^|uZG&<=y7FO*t)*51^*M;W2nmNj7cy;p;w95yVL05_hOEXt%4=dd!1GjdsmmPTU?w!9~lk?O3 z%J#Mj=c@VJ9#Mye^W}QWPN3^+0h2i4V!EH!%F5G;{w`zHIRlwzN}_{7L82r7O_dk+ zz4m^FeJuDJdtW?7IAgl3v%*(JWDa$3%OC95LCj1W{vx2X!V^qdA?4+lhcSh7e@tA% z`(4!6qjyFA-TuwSp?C;pFrg612FXNR!}rSG`p|=S8|}=BIAPcQ)&yFP$xqK^>J=_K zd%Zp-C&6eMIf>jzhr2f?<~xmPYzsOU62`72`Ab4Lik}BZKs!nR1EbSz#>MQDK{|=k zJ7RRv2$tcU(+i3;51gq#FHGwIk_H}TIrkB7-~7MUUa6t3I^W%D#$AD^oOr=C{y=ne zbkbera5H4B1T>Loi~KM4ZqEzte9U`KBu}O>JTjB~NJSLy@@wfO`Q3pkhA}>K`Jg&> zd_~~t?$mAGy-ztCzVVYObbNMtP<&aEf8~FvWkp@CX9zXC z<336*u_QY>Dz`Web~)nnNyekQJik7|GA7w2{x)>yg^&cYFF}>_6Li(e z3Gyg}QQ#GN9iJ65_>-96tGoN-wXpgybgF4m(>64Idjy_Vx%v-z$Fl-$v}*U6ji?~I z@Rcs$_T6HT91;47mk)MZ`6~?eYWeMk&j%A2Ci6}=f$+@9JoVC<(=lk%W*Ur^9!^e= z@))QF1MeReng?7Vh{C7EHew0>j-_?oRx};xw&bmDAKw>tCaITPPm_^WZ9O2>u5H#s zFKVNnUz81lR~*Tyfy`GTNKC$O*iW2zQ)qO>f}k5h8HBgN$Ml|kKj9<00Qo>|l;3aD z@@MC#C%n`mqcGe)oP6!{ZkR3P6CH#1Pk_y3g0Um99)1meLwE5rueAydmH<_UZY?B` zZ!b)M5wFXwG$V&g9v4C(@<GacN`PPWb*lvv3T4dy47yKZ+RJFvt|Lk6PmxZA=Gl z&jf9P{s^+M@iB3O2(7SUc(3lAPlB%UlMp_s^Y1Vv8qJ*+H^$S=Q&Y_kb#wInC(Kvd z^ES)z!p#iBrrNpfaWFi)TbBr>ro$p(<(jKU(lqX?;3|}xytWs7(W&<`WMlxD#Bviq z3FkpJ@cIXRLpvu`e~MHk{Cb~Tddov!Y252+f`#_c=FcW#sHLIF-- zs7FF5ff1P|ialZ}P!?-En>TCAX=g()c7wdqV3F`r-P%tI2?AskeD&M@?U<3DS$^@mxt)LJfs(C)C=G`#b=zAIuxLymlW z*b*wr2dQ>bioqP;EdBW6ySbm(|HO;a)aj|eQ}5oM`PuzK2{GCF{JQV;jQTEWm+$qp zhMMnYl>1B%4jwd9o2QoMp8jDnbD+2)-8JgkB4hCh^$DHm{)jqy9{S?o)(&;2=AdSd zIw$JSUMr0MT4*j5g~gs9sK_cW|3$oH*H8!;;nHWYQXoWwkkb3${XEu^g zbE&DEBdp7WUs1E+8p$UFBTeifs#fwpy#+0I)1tJc^l;#2@>835O(IKmR+7L-qsTA#H^NvnT8O1n||1LXLB+RiL7^fr2)t zx7<^1p>c1SL6O3;qsTB69%w0G$3A2qDW)dfun>-#p&&#$6!i`05`1U0U7Qp- zGHfHqSH_Ki8NdUG=o1V;pB_@diUAtHPLcOdIpEVqS6@1qR)K}=0k|1VeYUgj?d<~X zG)=D)b&*B|+m{Vs=8jo+K3=70UlNq7$;lQ~sNmF{gTxl}$SW02%{d|!COw<)&=h&g zu@>!?P_#g|!Lcnq9+9cc+nlZ9x%JSTv_p>NE2J&N<8}JKKi~ z?YDnPCl{8q9i@9m!Gg-nXyD`~avoz4^`TBD956FW3e-)|bR!$Z9` zPBXB5Y;AnN`p`N>1elNO7uo8#fxgQU=A6&tPjABki(kukU_CPPnqo84>#}m7?&rd5 zi&`wEe4Bh~k@<>K`OmVhOZtv42gYuSS-w=#;%C`q%=Ma!cKhP_XPH1A`1e7gQ7ZVt&{Uty}|2%d@^lU!Wy6f7k$9?hBz5xsojy3jN z;`jaso(Jj=T~QBU{L;654KN?Im=yv2b&)7{SWug$5sjVcP&l7De2SrNLH`OOUK2E? ztT}E<(-fiBZ55THS11!bAxa=LFsJgzeMYXRC0ur^E*Vk?)Pp>_x0KE$^)-LI!>;q| zG|2$51jCnqLNX#n^9C|Aq~kr8)#Em{A&UVE_8jJszx^Z1?V0nH*|xdiK|mK zF@2a6`Z}a;6tYe5p|-?Y_y3GlqucF0(*{5}%UIc|Q3CvC5a)lW`}n;;AP)>fk_=cC zOEZqMVhmAIe~UAA2-tKrl#SY~IuTLYk9K~x@BGWv@PP>RX9#`8^boTIQ)Geeg`~h= z>ln3YjyL1&n)JtdSPz780w2&Yz3O#>VeJV}KL+S{G)${1@~V023J63BVoMN?a3qZ; zk>jH&D{ymi<3qnPjq=BxpM_mcN1K{m(JLks9;T1Ao=IgHspaC@KZ*BLoLtc;+Iwe3Zl0hyF^%%ZsTQE2?ayax?-t zb~qVj6aD&d9_2lqTCNq3j+n9`9cR>KSg!^2mG&dxvR?b}P#V$DwUhqIHDkEUCmAcR zD^@SR`ljpk{XIvYul?vm;<9tHq=D@ZNCyr|p=J?h8oaPo6gm}&j-ZsmS8ZFvBt}#8 zwMuT-5iTNi==LXJ>T)>31Y@{rD4`LmVUev5*?dcFJ3?bFD@y0GAH@yHM0(xRj_#^-Vu?R%;H!i0* z9*#@nLM#lp@eV6f&7YdL1){TbyMwYA7gkO?euM%(RgeI^ck|xO56aXDW>dF1R;Qb9GB1)khTL>DXr!NNGg! zW=&mZ8Lg$G4Wv~wdZCaf?0|y!Fym$$78PxNi2jz1ad`VWn%mmdEn?-T&HvM~TYdop z%Q}tteB=P#4)^)C=QTorqzW=PVMG7aByN;Vr6Z)<$+!>Op>kzZrL#;AU`j*+L?!cF zoiFY1aR(SO)&&W(Wf!EW+_>O68^fB`df8N$rE~~&I~ygD9=tZln8>sssxnbP1zQ14 zLlbznJtCZDQrsrmx|}T57RkeL6{8B8vV0dShw!O|q z=+1rV951z|>X2tQmSsj`ul$cw21T&fFw~^*okP7kSE59vu9%KhFAiI<-Sa6?3i-ei z^ScG^r%iN|6P(owr(UN`=i8^-uiH?7y!E3W)kuY91vK{%A;Jcj`L45!j1aS(zp;%{ z^-eY8s%a$!SvY6pnF_jL1BVME*X{^1i9m#2mVxpmwcRFv+g(awwPwhsaZ*5n<&6{l zc#P?0I6WMc;WD?YsC}{*!2WEFQ#FUrFQGU*^B8MW8*|4YDVLO0z+g zz+UPX*U=b~*WO?_kzC)}bO^`n+S{~gL{vy@_xl|vN0cMN1Tm5s``X{*e#gx%s~Pb& zx!Ocd{skIJCwOAtFgLrqc{UhY48?hwR=7vT`Qmf$+>!0NL&j5VTdVCn%d;C`#b-*s zSysq>Lgr$md)cieL&=_(P+%ZzlwcuL_Y0LsfDtI*BFM7>WZm~(4o8C*kws@LxORX> zc!pr>16 zX>olf@?pM%fhU}trQ|#mglM;UMo4-N`Qi3w!xCBB64v~u@(lce0SuIdTX-Ur^HHLT)^5F8-4Z>u+qcf(lab*aCLM;3Z z7=b}6f}G}eDLCUP)fMWzo%HEt+4lN{;%yVXy9r_pZL&7I)NpiXBOUcEQW{%dm9d6F ztNHp%HhS~ltH;$P4m1WOrq#!To}L%OF5v^*b2hRIwv_W2?qPjgp}hHwC*O1q#UXht zY7}4tEQf4fj*I5f3~oBJ-{B%~rf-grFpnXvdpLsu=W?vmlFG1iHl8snG#@DA1m$|j zV0&)WCQ5{e<$G9sINKNSKhllaOjI%E*_3n$&xr;R3593Vpf|_*sKK6NyzdsmBHRVn z26`aanl@^}(!w_{vZybiCGBP!K@Xpy*cm3woCxMWCS`)ihg^IzryFHqd#YHeCxaYP?dv$9Cm(GvCW@3(dM?UZ(EcTW@xIvXR9%JCeU(s9uf(=fYhR8#hC z^6(JmA_dzd2Av-~C%einx>Jkn=&@KyU;8?GTkK%o7Xg$l2aRO;hEApX4B98AnJWo` zZhtW-z@;45c^%zTLRM@KosZrUF4kbzBXMKK6G{ZLo%bM;)y9i-lgNVx`x$J`^r2SW#W0k?Z==`7!-u!Ne%p z;s+c^Bo>@i*i)lE=o06&jX|S9S?~I2^Q=!D0PMJtk(^dkh(sZ@M8>e5x%L7X`KY{~ z6e@dwPGg?S_#>~GWjQJD;3D`CjVjF85F`x8zV>aIf4xD@{O)_@Ti@On2fnA!cmD7P z5m4K0fu$8N)PwNDPZtusq0L>5qg{+AQwuZt#pHP#PGn<*P8`YDfV1)_$q|c)P;1si z$X%t@Mk#SKZ3GjWv_aYMz|093mDvPih zGms7Qh^5FnZ#fEro%A4c;Dfs==-V2}HI2ZwGJ%-^|2>0&h+vRv!ctEInm8z+nJ>SY z4uHx37pcz1jH@cKP0MFX@Px1nsp5R_f?QONcn3^lSo$1lW}tXxXmB_6eRJ;{vKiN( z4~%_4N5ieBZtu)zv}Z|0P4qJr1-LSqmDuX!up5{N4`|U@{c7u)Lv6&o*4`J26LsT@ zvCZYXs;^o}UHiMO&yhHEAk(_xp&csfGH}w5QoaOjJd@Gh@jOSaWUFrA=4mGgzN|GQ zdf!^c3tS||Lc!n&eTFuVDV6RTedf|HL`wU=i%z;g0ucr&9RKP49hyOg;BMq-Ky9Tgw+x-6N< zg9gUXQ;s(+iXdpRj;+Et+$iPAX1n)Rf#PTHN*bH^r$UPRhi9e(BsHGs!A z#OiTWJuo+8^TUaFyGm%Ak0_Z;!KIk;ln_PC#%$f<-AN|}Ju@Ra8 zmN=(@s@s%I9I`bShq1l6J|X30E$b-(;`1Fm$cGe1oB`_%h_8g9*RzJMIXAkCX^|W% zjYsftvZ!kpX#b=1vC2lVZQKMiEi*JpFss1SFd$R|tX+{VIJWOPX}OcM27*mF>FLP8 zQ?{lbPS-Ux^)r80zOCL2yaU4&>XX0QBux|+OdZ@;j7x};b4tJoNV{N~3Z>pS7o-8} z*Q9N#0TIjiCoO~ZGSRe)T+0@R*6r`#&7@9C2-m{_td3v^e^>6}JZER#Y zxW1UzR{|{-`u)j9uim%|ofMWYXZ7bj{sq)yjpnp!ZZjUZpoRWut@2O+Wp z2}G4f1G>TGL$B-inaJd6JG48?anN$`^iRj*M6RDO?`JSY5@bF3yZ9=F`mS$TFGnmf zA=YB=FRq>>8a+JEQR0T=k9R5Q8b3`~hus^J9=sX9B zb%uFFb%|xo;#K+!Cr(J7HyrpAh6P~XnT;8oaaMNz4lT3$EI#FIq~s8V?Fo z4{*nz5S{2J#f?z7NO2tYckq@0oxzIunY3b%*qWe;WQz!)Veh8Y{t*fUDD9AjlA;zv zs>9HKpp&JO0+ywmEGB{@`2V!D*d&15+65SPSteWLt;F)as?JO$LKoBVwo@!~Zrkbw zYx4%&qIL&_{}vA#O)@#>H1Sr2(Q>bw^3z^%Wc-a1$go-%o88l-!2{GOo zHu=FM7co6jnzmR3q99uR4X~nvLWA@`AMoFreF-J-Ck#sg`#xvSar&mzW&cd+r_=r{ zYev?&r_gG>ps%h>J*}@~!maQH=dLS71=mz53^jW8nrGoQ`Q)K^buav+&C{1~pVzs+ zdqnrW<~*4fT-Yy0#(52Q^rTjtSKE2^YzZTf2J}1zx&Xu3=9q*wPrx1Rz&G;qiI*Jb z{tix@KUZ_M1P6mH+PlPo(Q95^(;%$6DHe^}K@>fb(S2;!Hi=?n$2S@s@1kZl>lVUEPg2!o z?5@&Clv~_oPb_n;^$(l^{zsIqNC5ty;A#c_BPm<@wr#BP%9L0))wn-XD6Octx)ja| zn%(03y05&cD5r~R<`K%2=Ue~4c&Sn9Fwz|*xgte%mW(NhuV%B_;`U6O+I{X&c6>IQ zYU3i~-D;8Mu(jK>XjkSwzq!tR+B(;=R4RdKT@bY<8O&OG>#y=zC$uLi$xO1BYTz<(Q=%)y2bM*+(YY_zTG9D7ob#d2WuuJJ8-m9@ zEHmJ7p?`@IUK*^dSDtsE-hl6^Y#1U1G+NF)OxE zl>Dm){tL=b0@5AGzI0qPRs|YR00R&kOaU5ThgLu0COb}5>I5fXQUEuhGs==eT&IOM zVODzTr+D)|a8n&+ah?%Gvky{LR+Nvu4~k%;t8}7?*3-1>!{lO)lN0QNN%OYCo$A9J z>vc(6e3qpo))jqNWAGN*C$Gh(C@IXt`Y0#f&ZrL^ literal 0 HcmV?d00001 diff --git a/_assets/css/roboto/medium-cyrillic.woff2 b/_assets/css/roboto/medium-cyrillic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b3ca824db64d0186f7e52b1f7464413a638f9f18 GIT binary patch literal 10060 zcmV-SC$rdhPew8T0RR9104GcU5dZ)H09up)04D1I0ssI200000000000000000000 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 mb=gU~>F$4Gvd<#C<9HE{ARVQ^Cs&+nPJhBM@ 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 literal 0 HcmV?d00001 diff --git a/_assets/css/roboto/medium-greek-ext.woff2 b/_assets/css/roboto/medium-greek-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7e1a807819496f6e3e52ce083544104841602e05 GIT binary patch literal 1412 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 K>W@?d0002eJ=}u; literal 0 HcmV?d00001 diff --git a/_assets/css/roboto/medium-latin-ext.woff2 b/_assets/css/roboto/medium-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..604b89354421a545b529e76acaacb9c7f5d50988 GIT binary patch literal 11912 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 OA2`Fug|G}F3IG6(|K7_0 literal 0 HcmV?d00001 diff --git a/_assets/css/roboto/medium-latin.woff2 b/_assets/css/roboto/medium-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5f96609d81a812b8f2557a4e9bba6db29205ae0e GIT binary patch literal 14596 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 literal 0 HcmV?d00001 diff --git a/_assets/css/roboto/medium-vietnamese.woff2 b/_assets/css/roboto/medium-vietnamese.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d92b712507a5d24f7910ccd4c2394570d4f405b5 GIT binary patch literal 4780 zcmV;d5>xGWPew8T0RR9101~VK5dZ)H04pE>01`_80ssI200000000000000000000 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 ilgW1vW5`h!}HUcCAgd7Wk5C8-q1%eOcS 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 WCa?E`${Nr6J&WjV<7!di4FCYRVoq}a literal 0 HcmV?d00001 diff --git a/_assets/css/roboto/normal-greek-ext.woff2 b/_assets/css/roboto/normal-greek-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ed0b13ca09d1372918d42c2a7e3f944b762d80dc GIT binary patch literal 1432 zcmV;J1!wwqPew8T0RR9100o!;5&!@I010pa00le%0ssI200000000000000000000 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�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 literal 0 HcmV?d00001 diff --git a/_assets/css/roboto/normal-latin-ext.woff2 b/_assets/css/roboto/normal-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0c7aec28f513926a7e749abc12863001e2f1b65c GIT binary patch literal 12008 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 GC;$N0_xDr) literal 0 HcmV?d00001 diff --git a/_assets/css/roboto/normal-latin.woff2 b/_assets/css/roboto/normal-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..120796bb71997275eafef44818771a32bd857e12 GIT binary patch literal 14584 zcmV15CQjNSurBO+4DXC^kqXZgn z_I=ZQXLn~?kyfRibdr7YFRcKU#|>Zr4PXJ#goYWw4`Hs?<-4mp-Pya+DL_;sbwCde z{7s|)3pSu_RH>GX$>QOVk3|M^Mn8Q_j|KlIYqgJEW%A1 z|BbAYudjG>OLPmW3KfEI6{@8ePm;0*j%6w z3(LruyOU0l&PvfKgt#RAx8l%3)t&r7Cx3X7Oo>hNH@%Lf_6?Se$H-Lb{7-ZCCTn#& z#*C3H-Qi6BPwuWixin38t}}P6-~D^XXm^ek=FkWWZs)EmW!YD3r5Ftu}BpGt#DN=%?OOG)Vc;>9xDNv|Lv1Sx4 z?rYWNfp%0KI(4C;8!%|dxOoc}Em^f@-G)t%ZTG-UnD7BH&kGQnj5Tjw55^LQgj7R9 zWQ%!v*kp#^vLD3cn)O}ur6xyuY9X-WqKcDw4mrUXoPv$lfg|A5|KO~EW(ZDqoh5NL zI5`WjUUWGVEc1>{_PF_Zk)O}aMkmZUdCMlRKoT5t99VJ~Y=R>X1FqN2E9Ti^snX!T zf?pnp$&!TBNX?k^j4I6tKUT9v5!ql_xyqS>bk$>^unrnQV~DbMiT% zm>uK7BP>w;8-tbgD;NpqEm>li5k?uS%!v^SYoT_I=z!x+Fv}}ZSOBGvB8m&=a%7$b z7Fqgo5H1M7M1T=*F^WJK7_wx;K_OP!IiVxKaR)Q9nPZ*>7Fmjn@RBvw+3=g-ab*Nl zlA$3}l1ffE;e-=T)}LUZhmRpJT8~dWi{x5UejRME$>V=^*mMyBm_FN(oOc$;a=z5N z5c9bPayMUK3ng``Jf8oXJK`vFT<1Ua=sbtU8G7*Spy z`VIG({ycxNN~fSwn@K3z*#Sh*^1G%hXR9FZip+ad2}b3t?xTF7^GR3^mV^IZJZ<>`h)e+v?Ul9s#eXWRy`;<4JwPr2QVTtE zts)0`xjX*4iCQgJgJs~WoaDdM02#rFGf#2|4V^md5wg5wj`rhV(;a}A&6W(#lr}B0Gh7sTHV*k30FzEZKY+)A*UuSfhji)9VZfUCiHINanDqQ zCRq;k5Mr*HX)qWk0#+6TB^dOZz+qj7aEl~nGL)cc(sm9`=sZ350%N8wGM4~r_cB}d zuE=|(L|r5? z;$S4E;3U&bh>@&V$cdG_I4FpXqSz_v6iuOM2~9h2=4F_CF5aZ^c+zR60iC0rfjgnI z?8MDJoXa;KZKe3)?$tsxJfvZ%;WN>3KMq|%p z^{3?w4$2)0sPY)b7$Sxlgkq8KRtU&a8DyLW1?EvpgvlboWG|rP$uFKEjKdI-LlYLG zQ9Qs_!q&1G%;3h#X}=`Xf*EEpgDuY>seL3gcZ&{a+_N5u1$63ZCVbRB`e`5eEQVcs zm4_4HXjX6onvo4qWW=|-9VkeUTk3d(8Zi3SJT$ez$n$x0!N=Xo#Q;n%nW z;NC8$wfZhU#}Xs_cL87vfFn*Y)CMX*{v`MdTs|*rfDiO)fN@|@@!@OR-Rp%-z(MMA z7N9PKsH1>=Q{T)DSXG>wG0nFeG3}uj-uVZ;5PX}~r@Fn$wGQiP-PVumZ@v(|)(!pt zKltSH$**>H~cP0*}=oc8wPT@s1i^1#G!i=z>?fVgKUsGDKMC%7C>r zj?76m1qMw5)>%6GhOHc5=ZAG1fNNw!O;lX7vz)F*oU-!wGsvHo^bGn%u0?W2jnrMg zutWW636n$D}KWOU||4i)Ye^A>r;VI*W^>NUOZwxv7o^TtrbDv0t zOb@Br_w6ML+C**}<-z+E=8S_r5PhVrNephN`kFjFF7mr;BWxEOMA`3hjoi3s9lg3Oq}7ozxDe2{%!bx^_d-5ps_Ixu>I(0LI47T1k1ni%K!gUfch}t zm%u7-1J?cm0R3s8?F`uUUx48m6`oWf4EMQGgkcKTHaxuX=9&Zfh2b3OF%3Lu2PYyd zh!&cue0SJyZ%`6EEUmpELU_1BDwjiqHv)X&$;6eR0L?sMTozS&9B};^sir!60p24P z{nmKFyMT*!yey;BXfOoX9TrcuKTC}1j{Xp3uitvbqSCW7`7o=);sta5RPVE}0(t4)wN8u|<57w7%X+oQ#O6(dewh z_P}gSls@z(G1qAw^rJ^sodO!uD4i^J?(9M`)(%K7NQqb2U@P0S2PcIh=m8R?vb{SO zFGRZ-kG3f1)P1T~@hsmmrWvoCOK$|*m@u3L^)wzQFpxxxmWL3>rft!QMTUle98-x< z(4Uv>5CtkAJg3hEaV6q}D}rM+R5I$9Xo!wWgv`m|_dN~@hy*Vi(KFag3$QMLD65U` zX#mh<>YB=Wr81j$cNdZu%645X2LJcC)lU>ddhJ(%RXcCq^OQoOUe&EVYOndpt>vgX- zqWNWfh0i|+XEm$HDljn7#pRdPL7 z-vBods-6dX?J^;EvO2yTucnr%v;c)e1ZzHIb*!PVf2e$ptAOadkx@T_ zbL3nYdC|WDZ2=U}7i4G)YJ_S!iAy_1(c*<(fRT`Y8^Qg^=kRZt@Eo04uKI1FybDbd zelw#r)IOH1|AfDkQhuh9B9zZPDcL+rU)XNEZr}=-eUGzU$-%}qmPA#hu%t0s%(*J8 zT2ZTYlLd#tCV?$fQ0)NWT;I8b%iz}V3JfuDf4NP^5@aL+o-c#CRgafHGvvW>jKf!i z2cYnlwta_xz@B6jcodeHw|8iFo8nzgVov+y=e%|g5`;2_KtducFJTrS3pu8k zcPP6QDzwSxerUv1@La>JPDG}5X|GTqj+1oo;!5#gD*`Wd8|P`I3*M9U%IgHz#iddR z^kxJ=w8%^}a;1FEsFkv}K(6UM*)Qo5RRDL?e12Q2>%2r2Vaq%uWCf~D)LBT&3^aIl zEayFA%^5}-vc(SR_%NXZ!Qge&fP_Pu=c#%$&h5qJ6hEtH&7UaqhHZ(@>Ve(j^&OJ0 zi|LLl)j`TS{5Bbt=jM=$wW+akIMs}6SDdKnK2XaJ7Y#?U^(44r8a_qA;r z4Mh)1YH%eFx=b+D{{x#RZmc?7`fdyDF>4GtBCc(>M|8pU`DN)3jCBE#IuH2^v1kZ+ zN{fX_2=X$om9dtbF_wRCW3_6a0Il+Zn#ytDja}=`wh#jFOBVi~+2x7eU3^GBO94u{ zk4=l#f4FUn*3jutRba5YdAT+94!ft7F%h}3wKts#5y(WtnY`r7h5PfcIYsCHB2$gb zjCEKT=Bl22+IKFC%;@Tr4TQ^kg<7rTcBFRgm1j#icd4Fbp~kq{EUkDnwCgr7=;ek$ zpRR}281BAZf@Fk|xX`UsvKHb*L0%l2kcDJ~TW6fN-C&2_sH#FCRMguSD`2rl;NoKI zB>jdY(l(6S;gLi>#+bHqVYU<;@bH?ZwrTVW?#9OCD_rByM;hSFsHFbksVfdWuIYxI zr#*vZBh-qVGj(;J_*@uGA{d>C@^EpswP`oD^!kR{Tz3=~(TZ%_dwmIISv8ZiP~ztr zROWQrxQu1-!b(yQWtL^q55LTYG(U1I5XSdo@3lV=G1AF;|891mYu1K%!?c0Ch6ARW z`^qYLfzkOSwzAf-9D7E`9aZG3Rs-mo+i2zKbzcf7Y!iA0@pY1lgROU|791V#pE1%W#(f!wi9+xlZewz_GJvG zdw3EMHf1){Qr4 z6Sr74V4Vb_!HAZim&9*M$oM<=^e<1Tf>(wFQnridVo$Pwizowj*@CCbaP;eD8HIwp zACV%hg{=YKU?3n2Ow8-tyM?X3#t*>crNG;sV(-tsm0pKp5`3*ZmW-FxEg|2g^F z$3QI{vLj;a6T^e7%bLLY>2WqPUdY!s#yZN^TZGdr;(}WMc$3ARrW&97U5Yd;CAreO zbY=}FSmp)eYEoE`mfUR?Ghb>r9i;#IQxxGa6X9>S~)inc)n~+zJ<6lgnKqNsY~nO--5FibJ@kG8o3B zW9Dq8YiRC*)3$Ur{r=HY^;QU>k7p6Csa_%N^&yU-swC~kiGk*#i3cf`mWBSt-UjN4 z>Iv0N|MI4X-*+7eIMrzlj}7QxQ@0>8z`2>JF)A^vBpY`5f5%W#sEN9Wn7NX=i>024 zgMZ4YjXbV^1h7j+B^w+@RKLT=Yhokw0_Y3K^T0GQi`SGA;(!fI#znNf#xqN6?1hxP zw@T6x3@i<$zlVhRRxLa$E;t#!%}&yJYZg|{%ysXvkd;u8Pyo`Rl-c&0pHQ*5^%O_6 z9qm%r*%)iS>;JJAwHGbY7n}bV6gp1|zo)icB0Qt1C(q4!?hM<-qv9h@lA|bz&@L+6 zM#$!+##9S33RPiL>ijf!UI%$)Xldu8pTstA|XQn5w z!TytdLVpxOZ04N4AS*#n`6dz&XIf=ONY4w-D5=Pz&B4AsS$MtP@tE^kO5-#Avo7M9 zi4Zx30RE*p#2{MR@8=WC$4|x`qB^{8hGP@k?@s>vmVupKdN4UXE;Tzd>27&iK9m_D z<8(Y`Zu$@m54LPjQa;4VNb_CZJ-9*Q8A>r zu!Q{f^86}la-@bNlau6^j!J>Y@PFU(J|Ssl_>gt|;4}O3Be=>R?R@iQ6T~BuLv_$a zGmY-rXOXcvedMCtegic#9c+)zIF@{tt7J=DX;RXUKyeZY5=|ZmANsquvif^}Ff4wE zS&kwB6yN^WkH|;9ix&_gGZkO$mLSJK4LQCFwDm;pDCPq&S zOi`N!HmFmb=iYs5)}jCg>h_zr6Ql0I6)rbI-y$42@soe{j%1qI6jRGGqL?l!mkPuc z#rj5M`jXC@=_f4nytw%DElfH{I%^?Ug1Nr^=nRbe`PkXE#`2>6l~cd6-%Oq9tZB*R z?b7V_3gyF>o2sP1tljeQP=XB;5W5sQbbj|M=AYU3BlHF&s|2eJN9=`$3U!bGlr3US4ovy#(!e zy9H-;S=B=8&dy`Z4=VK8!(&9xD4()PQetYNwlX*8%RozBt9hy{Ev@Y=%_NnLVF><^ zYoK?93--n5*Xl(YeSrh^Th>!nF3>mQ+&hj>bL+_G-^?ql%I@W+C*CX1fw}4%p($%A zq7i2Bg~SN)PuiSDokpj!P)JG}BLG_D9_|tTpDUL_wyO1q_008?8s>*zk$aoO{JBIi zGcUH~yyL5+=7N~C8d5P3bTT7;)!JV!X+`gE7rhFOUx*w_ZYnCxsfr1(DvI)UTa0qP z7tn!Oe^~@4WX;?iOCB$|S5h0jNe*$sg`(F11A3$$Vry0I!nzIAU9bcgo}J=<#|uFR z`@>JG+8)&2Yi+A~rjYTM2hp+0KSgcf@1Z`DIh^Mmxz>t?f3M>#_Y93@tw5Ilr2G;2CdmqVI3)JTi2d|!rJj^xc&~jx^ptaIn7X9HP9k$1syyeSX{@Mf02VJE3M4y z<^B7l`vDJVLoF)%%;X~}YbQ@=un{d0U{Y}!8)8BXC_{r+J!bk9Z3+`&IA zzcsC>IK$5W?&$CsM@d}xzNn%p3s~X;Z4rcc1_W5AIbikS zn><)FoEc4yHgi$P&o|aO+Sf;kt6Q#5hF4Ln@SCKPiW+_ZeessRl(aqA21olG91-IY zz1BI*$mO7ZVk7iPsG0FgxPYmbLxhKA&i`lJCZ*r%5a!Adu|b;;@gl@}q(!lKEYqh> zUiPY$ant0&G2L4g$;2p!w-&69`Lml&+Cho^Wv`0(xu2Q8{S2SqG-P+KCbiC(dm(qNv4w#cbVtz7rH9$Z)?)~iwmXmZ`K z80*|7=^-sq{!4cPP0q^K;|+q1Quh1W`=1XL()Hr~oZW&fwAH=TxfJi4nM7FRy?j7R zoUsY4ccdX~GkghNai&gZLsb~(N%PgJQYxx^(M38K&6rqnM)eeFiqSzl-p42IQCs&c zm>i`Ie4Sm_ti;gdsQC9kQ4`8TXEo%q&nC+a$!OI43*qv#Vl^v51xupfl0_wst)Cr# zIlWTJB#m%Cs#xdq!I@9%dFvlnpxy`jo#I%+iW<-Se~p%nR{t-< z&`YXf>g;5|I84T%f6l8gGH<`^#&;VZFYv6WVF^^Rj(yO-`p)-#e3~EZK6oG|X7Gu* zioTVub62vt0C)L@0p8ob2CC^>%GAqLZm;<Wt4{tI-tEilbLXjihqOI1_sALpS^dUf*__F!AJelkMe7|4E@Y3{VV;fc3%4s%~V5F zJI%EjKK(p!_O_->M&J?+O6)4CAU1?JT4j5#DE5eq_}i8R(0eRYMYYmg8(C&{kKhMO zwAiMy%$yp6v*vBXRF#W{&Dw#Evhf#Ntj_527@~DuHMOJ+lT~?*srnfFN3dmvZ#<)$ zO&9}+S=4retPgxa^P^d5YfV+<;A*cwb$GSB=Kei$zKgx7jlEBLbWlX^&)(J+@AfyT zwfYLWL4~tn#Ms(W$&YTVt-;h+T_#ZG=~lYa@wn;utuQ~;Wudz=J*B(cV?p*B?J&Dz z79XAv?Gexz-s&rv7Ncn(B~iobaX%qFr8Fm1!ReflP1H?`tMr^e6JV(%Vecz{5Kc#? z)GG5>Z6VAjO!uItnp#YA1%K=P3O>xnk+C>yB(Cp|Jp28t3on z?Tt5R&n20n3f)X~wG~8#jD+O^G2UH^ll>2^q+% zYw5^K1eHUU>6od%`>a^<<kge2IewiFoYY?!dyF-k?6zCixj z++hCuf*mkWZ{}~!NQQ>U140h>g{~5we5dL_5~H`FxrE5AA5O?iDXMR4E3F>O#5;$e zRha5sss_f($_GXpb*t%Pl0#z+bqubKL8f?nf}4TMwGH0b!4Gm&K^3#^Gy$(`aSow< zqb$x`e!&Dk*O)*X8dS5t&^Ng;+tpV6z&B7;KR+x65+n)T+L&n(8VG_p93>YW4{tM2 z`%1bnn+C-?r_p0(oDs7Zx5F)UaE96jVNp5;IwgJ6FM7$BWC&Svq;Pr40(4&Z#bnh;IKrX~05*X0fvTirzihSsi7k~oLKeDic;tBhq+dk=5Rr&uq8eJ+NyE)}x_yX>Zc z*5b;;ww*mQAHOJ1uS`GVJ~Zh=_dsyFiI|C!L7TbP>Pv7Oyv5kwHcT#zxbs#ytujJ6 zut=v8clyoq5Gd0RukU3m1(ysiY(Zu4TuM&KpO(-({hg`Qt}5jBV^V6`v-pU;)PjJc z<%EQL5kVs3Sy@jCbeu;LldOA1WvbpvJ;)f0*KuJ?Vn4%{p<|m@JKU7jIFT6W?x5dP zZPoHc{|g6MsQ`0T9=1io@_`I|=XV|Tdq0EZZ+Bg%AjWNRyi}zs`p+IQ*V9Y@R~X|m zzgXBWJ?`jl-m|BZ(e%WvyVu+w-|nfF+4z*^qDJtiXUkMWlMYN8FCNv^j4nsN5SR;$ zI=BdRf5@2}phc=R1NEnBjlars6s(E( z^OTsAJ{zLoqT)6|2z+?_=XJ<3Bjw&?>R`AJE|!?|C2cW4$wkq5IxuycN#t)ovakAa zW_tDJa&OI6Mq2HL+RCO2x$bm22ag9O7m2#QWho_73Mr**Urq%|3WUa6M2FbeMuoOU zMfTTWu4^WurYc|+p=ZQrOA+v{D9imm6bSBXV4`b1>fT@H4T<-c@O zMqNk=^#bFiZ5s#6C-#T9JI?Sk7jk=Q+a|zBxqXSi#c`THi^o&PIu4c>Msr;{xcApJbb+CQA3CuKc+hTLd5s;R~T43V>;72 zV>_7{&R_iGoq7>d>nq@2Pn~BNxEmXv9-pSvnWhqQAa$F>Mb5)3ZU7`@q5pOBKHU3sH0&^prB;dVm-Fl^Cm-M0Gfl&Hw$)ES@wux1hon{O)dM+UsYwL5m-?9szAf#~HAeL>s7{SSzQc`UgPoD-Um$c0X{x zJmR(rRsdkGpwwy83RfWtOBv8(Tm@)PH%2&twk_B&4H_jX(v&{5M$+e)Tb668zKxy!)ub7?IHmm(f-hh7wri^bLG)txtH=2yp;%6-r5qqB- zY11YNr?f+$Fn{TvE>HMU!?$7*3NQ|ztH7y7GSxm%_t-X3fp(IqIR-8%o5;QZbGFCgxaSlykphLu!u6l158vVc?Jkz^8!mA)CeT4E3KI}H1^4ofQHiB(r>>?t3sYNH0&9!u2)J1qzTD1l-X12m(6b;kHNh9L-0+6J^S@d9cgzef?rJXjFyH@a?8LE_E^L>J z73F+!xu;w+S=z@0mmHU$4})tf>5D6l{|^Qu*89v5oZ=0E$Z!+aXo(7(qZQEDHQ8yw zoeql{ChMFS%_R`<3ZV5@N{A07lU!Bfag}mSZ-i#dkc{vRg9jQ|SSHEafV>4)xs8V3 z52TD*b?SRnkt=~&E8Gg(PRTHX(UYJ)Whe3MwO;ihK|kbSpXoXDJbMeEf1rSOV5`rz z;I^~jiOak#=>d4bHkZ$&1L(n|($D!|NhAD3U{R90COw2w=!-%SrCm~`nYkfXP$-ZL z5i$}4?gxR0iza*Tk#sns@#?z6gFev0n9Kj$Y!mt_=SVt zs+l~ZIJaflOX!qR-i?}npO688I#k*Y8fR)x;DeuwqI1FZ0B_H!6mZR~q0!~!VB5cY zB9dYZ8NQFNP;FFbU@~5>H))8J*DG*81wS~#K92Abj_F*gx_N*K6@s0 zYfxmwCLI!Jy4%38huN`Kv6JE)3(Ecs4{6O4NAXv+nLlW z+|{sqZ~%SBWax4Wq1iB~Rz{KtdvVX9vLx=Wb{$nQq8n7up($hUJt@zNpP1vYv0fy9 z8@{WX;5=5*tC$oMsDM6I(8Bxq@3d_`%MJm8BQc61*s>9A!~j85IA?+_7x9t75^IKg zE;uXp5kCjIX=+!l-?A*jzvSi#8HUj z^^rEfjiGDOfdLmTVp@ACwiNUehyy z!o)1K@vsY;IXHVrdr>cFxX%&ce2;(ul6Kit)r+%YL(JWBaDF0E6XOx0F|ak(>Dd?; zQPjjphH8)>A3Thssy8Ijqd+=-kc)?yGa!ni2$Qz0yiD(i!-vS@5X zg)zfn7c7rn?6Z-|Q(p6tpufiZQ>EvNe3xG`$BejJ>SXPRc7p-~u^59ltMt`qr06^n z^16el86g)PpHC72BhL#n}ZDXM z48&H7wo6;a7^}ocD_(YI$f6vApW9CFyKEM-MM6s$sT2?HOm~Rj=~T;{w76=CArD`l z#sa6#q%7E~W;z;S${fRZG5EkcFoZ$`@c<|^P;#PQJ{1HYO0Ona#^|z1LPYWNR`UtK z-2s&38%+HnWQ9X~|Ijr}F|1Su3A-L8DB4s<*NI$up81uUFUGk5aQL?>5!4kQ;-Y4W ztPPOasDc&Qfz?n2M>tj`^~{^`Dv6pl*qvNCmZ|bK#ZIWLkoqS$JOBnQd+TnuwsfiF z;6kd`g61k1tsqd&)*+N5Cy~d*Ym5DgoVwvO-Wj!K?S#Y@9fWR?Z;{hsh*qiTmpL4* zNKIH5%wbcT6gxMn)a_@4AgrS+kq$KZH!ItvHZxvexyoYJ9TPaKOn8N3I2bfY5~L&< zT9ic_Ju!#g{Ej-o&*eCluCYsj>tZIu=uku!tbj0OQ`qcG)`?fJcBYgi z^LiPR`%e?#a+1p*nmi!G(k&E&Xv;EYI2JdO6*|}3A-7q2ukA-) zU=O{CcFC#>zJfP(mZZ0V-;(iD%a3?)GN=>+Anp0dI(Qy>ccebwxrARigzSts{CML! z!$nvjK{te%cHDnq$2d{xyd^MvI`))8@NMR8jom&^*uGSb{#6PzSMJ{da}qS`CJQTV zofgiin0x#4e z`rDTOE5pc`t-XI^$#AQGcOtaVOS?JT{YEQzCOjh>{Nkp1H;(!&--J``q?#LQ*)*lo zL$=k(a$(?K0@=hzyRwb9%50LUXg8E>yO_GN<{;U)^&@X|WN=J%iiK5}YPIY>#$7`P z5go}RVNip07ks3}-}b%_@c7Nxx`<{;+#~rU)WWc=HKW|qI(T6YtJae|XH@9(*;cnp zX>_w`RM;8ugag)?$`Y0322=Hk8>Ki(r9=ji(*-MkCaGqt#kjlBc0N^;r`>DBsOub- zLR?UWf>QnWw;ff=c#TaIV$dt*oPO0n;;W}Z*7G19H!g`%0&Si&O!NN(!^A z*_LcZhsl4tQLRr0OIP*iK0Ig7o_gUC=;=w5KXM6y1p!-MZjx+eW<6(Qbb=S~f)nN3 zf`qq?f~y3xt;s7$ChmD*yi8~<8`Tqnotm1wT@?MKVkFjj6&T=BhUt(=u%O|E6NYQ` zsBCvp?#jeCH=xYjD*$IqfT(j))4qb@&%RvP+X=Bt>jG>u`M7@Kb`r)?sU=qUtC znC$H7{alY4vW61r&zV_e#SnM-Lw}aCyq+G|0T16icv8a-D0qs>mLC#eaBe#nhMPf; zOZT9vi^~$0TbMc8{coqxCS&aGoab;Q`&do#5gh&Tf0^_w2zl4#n{QA2NO16(tlDq+ ztjSAfKsq;lCq^-H2+`|tUCS%7V(VWnK{X{*Da(XAllC8#X@x$-um?prI}ruKP6|O%Hkwffnb`#e5_yuo;eHF5z7@r-`}u-=TdGFCNw*cDhu<%FqGY+H*Bv=lubRlaJjmgTEx|d5 zXo*VxaztD}PGa|Q#9|7)W3_ktt#Xc3k(i~EGeB7i@lyS&$5(PE)&o&6I+#$kw-7QQ#r?V?ahi(#06-TS+Wj*0Zd5=)~iX5iN0PLI-k0GnMlz5m<_MMtQ1L0b8--+DlNwu61Xk$sn(#)V1CrEZdgD zavCL*1Z`ybv4D^SBy-qFP$Uz%%&T_C=podtq6(-Zm+nukL9SYK?~ZJ=kE{eAuw=Zk;f39s-3&PN(q%t<2V-t(Ewq!OXqp)T*nD&@|l9S-V4Z4G}A@!216 zr&N}+;vO=!Oh)953f@mbSDE{Ut3@9*7Tz>D=MvMogfLoY!+06hkn|e2bj{sw_L@~{h zYYA&zBlW4CzVr>A^{Ki3A+k7alraCB~L*otrmbioyTtm_l+{^ zGl8+lWODqQXAEIs^k&{3H6`zJU3)OEv&jJnBEZe|5X)ud?s`NzdZC_a=RWh*9rz~fp*XyO2IOi4E15) zkL_CTNv#go2PZniRml)0wa;*8E`s+Y!};+G$|Objqzq+b3E=x7reIN1H%b$tZ+MfM z5H?^iG5ZZ;)f6vmVpEo1+CN_N7-2M~5t~HGn$B>3eh$S6f$Ui3)cAvWyF`B1aSboV z+%Hk-6%g&3%d+pW)c_0tI~xG5p<~>Dr81M6^F74lPdY9cp!aN-a_JAS&y}s5fp3 z>K7r9qxwC_qqz5FbF-NgMl)Fg(rBqMkIF~aU{$)f23_MACv!H2!Jvv8d9=frXEQ30 z>nG*&TAp(aPJI$eYZKY0iJnx{&6LTlQjWEeXcfEC*70o5P-tTdvQtKL=L=*NKOXt^ z4(SocVdQHb{w|G74oJw>KwSLyLM3F)dArAI^Sb%<40Rl`&2=G&+S-B~OTV(6ifCjb>jC%7q zYjDu$JLPP^jts*A7FxJXi@*{Fx9}`sbe>jo4yK%$2x#O0A+==U)~q9xFDC@%nlV8z zF9H1V5hqM^Viki8FK@!xo{|CfCbWw@Ep#pjBuB&^j)bi!utqKpO1Rjumd70Ra zzu*Q1AL;4AQK!iO9)eH;t{=f27Vmp1l{9?MDmP!lO`XM|+of}LNW{^%y4;@YF#&QX z`by^@;d3<)`a~^{l)1J=VJ3%2VjBwDAE$7$r*P>VTOTPR=sYcPUW&}SV?pjRMa5lV zB+En5riV!jwiFX~;T`D<>ul1cPje{l$=eK<`zfAl-ZSS4L1Eu96>aETgN14PYxs5k iW}TvF68t_Y*SW=LUda36ErCkt`%axV{Q*}%p#T635GXkS literal 0 HcmV?d00001 diff --git a/_assets/css/roboto/normal-vietnamese.woff2 b/_assets/css/roboto/normal-vietnamese.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7936b665b54003fab3aafced6d6ae16c751d3736 GIT binary patch literal 4896 zcmV+*6W{E2Pew8T0RR91023ep5&!@I04{U@0206e0ssI200000000000000000000 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 Stqovy*8;1vBH2AlK^6c6HeG@M literal 0 HcmV?d00001 diff --git a/_assets/css/styles.css b/_assets/css/styles.css new file mode 100644 index 00000000..eb9d8a5b --- /dev/null +++ b/_assets/css/styles.css @@ -0,0 +1,1207 @@ +body { + font-family: 'Roboto', sans-serif; + padding-top: 7.8em; + background-color: #f8f8f8; +} + +* { + box-sizing: border-box; +} + +*, +*:hover, +*:active, +*:focus { + outline: 0 +} + +a { + text-decoration: none; +} + +img { + max-width: 100%; +} + +audio, +video { + width: 100%; +} + +pre { + padding: 1em; + border: 1px solid #e6e6e6; + border-radius: 0.5em; + background-color: #f5f5f5; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; +} + +button { + border: 0; + padding: .5em 1em; + margin-left: .5em; + border-radius: .1em; + cursor: pointer; + background: #2196f3; + color: #fff; + border: 1px solid rgba(0, 0, 0, 0.05); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.05); + transition: .1s ease all; +} + +button:hover { + background-color: #1E88E5; +} + +.mobile-only { + display: none !important; +} + +.container { + width: 95%; + max-width: 960px; + margin: 1em auto 0; +} + +i.spin { + animation: 1s spin linear infinite; +} + +.pdf { + width: 100%; + height: calc(100vh - 13em); +} + + +/* * * * * * * * * * * * * * * * + * EDITOR * + * * * * * * * * * * * * * * * */ + +#editor .source { + display: none; +} + +#editor .content { + background: #fff; + padding: 1em 0; +} + +#editor #ace, +#editor h2, +#editor .frontmatter { + width: 95%; + max-width: 960px; + margin: 1em auto 0; +} + +#editor h2 { + margin: 1.5em auto 1em; + color: rgba(0, 0, 0, 0.3); + font-weight: 500; +} + +#editor .ace_gutter { + background-color: #fff; +} + + +/* * * * * * * * * * * * * * * * + * EDITOR - MARKDOWN * + * * * * * * * * * * * * * * * */ + +.frontmatter { + column-count: 3; + column-gap: 1em; + column-fill: balance; + /* display: flex; */ + /* flex-wrap: wrap; */ + /* justify-content: space-between; */ + /* flex-grow: 1; */ +} + +.frontmatter label { + display: block; + width: calc(100% - 1em); + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.frontmatter label, +.frontmatter h3 { + font-weight: 500; + margin: 0 0; + color: rgba(0, 0, 0, 0.6); +} + +.frontmatter input, +.frontmatter textarea { + display: block; + width: 100%; + border: 0; + margin-top: .5em; + padding: 0; + line-height: 1; +} + +.frontmatter .block, +.frontmatter fieldset[data-type="array"], +.button { + position: relative; + background: #fff; + border-radius: .2em; + border: 1px solid rgba(0, 0, 0, 0.075); + padding: .5em; + break-inside: avoid; + margin: 0 0 1em; + width: 100%; + display: inline-block; +} + +.frontmatter fieldset[data-type="object"] { + position: relative; + margin: 0; +} + +.frontmatter .button { + background-color: #2196f3; + color: #fff; + cursor: pointer; + text-align: center; +} + +[data-type="array-item"] { + position: relative; +} + +[data-type="array-item"] .action { + top: 0; + right: 0; +} + +.frontmatter textarea { + resize: none; +} + +[data-type="array-item"] input { + width: calc(100% - 1em); +} + +.block .action, +fieldset .action { + position: absolute; + top: .5em; + right: .5em; +} + +.block>.action, +fieldset>.action { + opacity: 0; +} + +.block:hover>.action, +fieldset:hover>.action { + opacity: 1; +} + +.block .action.add, +fieldset .action.add { + right: 1.5em; +} + +.frontmatter .action i { + padding: 0; + font-size: 1em; +} + +fieldset { + border: 0; + padding: 0; +} + +.frontmatter>fieldset h3, +.frontmatter>.group h3 { + font-size: 1.5em; + margin-bottom: .5em; +} + +fieldset h3, +.group h3 { + font-size: 0.9em; +} + + +/* * * * * * * * * * * * * * * * + * ACTION * + * * * * * * * * * * * * * * * */ + +.action { + display: inline-block; + cursor: pointer; + -webkit-transition: 0.2s ease all; + transition: 0.2s ease all; + border: 0; + margin: 0; + color: #546E7A; + border-radius: 50%; +} + +.action.disabled { + opacity: 0.2; + cursor: not-allowed; +} + +.action i { + padding: 0.4em; + -webkit-transition: 0.2s ease-in-out all; + transition: 0.2s ease-in-out all; + border-radius: 50%; +} + +.action:hover i { + background-color: rgba(0, 0, 0, .1); +} + +.action ul { + position: absolute; + top: 0; + color: #7d7d7d; + list-style: none; + margin: 0; + padding: 0; + flex-direction: column; + display: flex; +} + +.action ul li { + line-height: 1; + padding: .7em; + transition: .1s ease background-color; +} + +.action ul li:hover { + background-color: rgba(0, 0, 0, 0.04); +} + + +/* * * * * * * * * * * * * * * * + * NEW FILE/DIR * + * * * * * * * * * * * * * * * */ + +.floating { + position: fixed; + bottom: 1em; + right: 1em; +} + +.floating .action { + background-color: #2196f3 !important; + color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); +} + +#newdir { + position: fixed; + bottom: 1.3em; + right: 5em; + transition: .2s ease all; + opacity: 0; + border: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24); + padding: .5em; + width: 22em; + border-radius: .2em; +} + +#newdir.enabled { + opacity: 1; +} + + +/* * * * * * * * * * * * * * * * + * HEADER * + * * * * * * * * * * * * * * * */ + +header { + z-index: 1000; + background-color: #fff; + border-bottom: 1px solid rgba(0, 0, 0, 0.075); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + position: fixed; + top: 0; + left: 0; + width: 100%; + padding: 0; +} + +header a, +header a:hover { + color: inherit; +} + +header p i { + font-size: 1em !important; + color: rgba(255, 255, 255, .31); +} + +header>div { + display: flex; + width: 100%; + padding: 0.5em 0.5em 0.5em 1em; + align-items: center; +} + +header p { + display: inline-block; + margin: 0; + vertical-align: middle; +} + +header p a, +header p a:hover { + color: inherit; +} + +header .action span { + display: none; +} + +header>div div { + vertical-align: middle; + position: relative; +} + +#logout { + border-radius: 0; + margin-left: auto; + padding: .15em; +} + +#click-overlay { + display: none; + position: fixed; + cursor: pointer; + top: 0; + left: 0; + height: 100%; + width: 100%; +} + +#click-overlay.active { + display: block; +} + + +/* * * * * * * * * * * * * * * * + * TOP BAR * + * * * * * * * * * * * * * * * */ + +#top-bar { + height: 4em; +} + +#top-bar>div:nth-child(1) { + margin-right: 1em; + font-weight: 500; + font-size: 1.5em; + line-height: 2; +} + + +/* * * * * * * * * * * * * * * * + * SEARCH BAR * + * * * * * * * * * * * * * * * */ + +#search { + position: relative; + display: flex; + height: 100%; + padding: 0.75em; + vertical-align: middle; + border-radius: 0.3em; + background-color: #f5f5f5; + transition: .1s ease all; + width: 100%; + max-width: 25em; +} + +#search.active { + background-color: #fff; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); +} + +#search.active i, +#search.active input { + color: #212121; +} + +#search i, +#search input { + vertical-align: middle; +} + +#search i { + margin-right: 0.3em; + user-select: none; +} + +#search input { + width: 100%; + border: 0; + outline: 0; + background-color: transparent; +} + +#search.active div { + visibility: visible; + opacity: 1; + top: 100%; +} + +#search ul { + padding: 0; + margin: 0; + list-style: none; +} + +#search li { + margin-bottom: .5em; +} + +#search>div { + position: absolute; + top: 0; + width: 100%; + left: 0; + z-index: 999999; + background-color: #fff; + text-align: left; + color: #ccc; + box-shadow: 0 2px 3px rgba(0, 0, 0, .06), 0 2px 2px rgba(0, 0, 0, .12); + padding: .5em; + border-bottom-left-radius: .3em; + border-bottom-right-radius: .3em; + transition: .1s ease all; + visibility: hidden; + opacity: 0; + overflow-x: hidden; + overflow-y: auto; + max-height: 50vh; +} + +#search>div div { + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; +} + +#search>div p { + width: 100%; + text-align: center; + display: none; + margin: 0; + max-width: none; +} + +#search.ongoing p { + display: block; +} + +#search.active div i, +#sidebar #search.active div i { + color: #ccc; + text-align: center; + margin: 0 auto; + display: table; +} + +#search::-webkit-input-placeholder { + color: rgba(255, 255, 255, .5); +} + +#search:-moz-placeholder { + opacity: 1; + color: rgba(255, 255, 255, .5); +} + +#search::-moz-placeholder { + opacity: 1; + color: rgba(255, 255, 255, .5); +} + +#search:-ms-input-placeholder { + color: rgba(255, 255, 255, .5); +} + + +/* * * * * * * * * * * * * * * * + * BOTTOM BAR * + * * * * * * * * * * * * * * * */ + +#bottom-bar { + background-color: #fafafa; + border-top: 1px solid rgba(0, 0, 0, 0.075); + border-bottom: 1px solid rgba(0, 0, 0, 0.075); + height: 3.8em; +} + +#bottom-bar>div:first-child>* { + display: inline-block; + vertical-align: middle; +} + +#bottom-bar>div:first-child>i { + margin-right: .3em; +} + +#bottom-bar>*:first-child { + margin-right: auto; + max-width: calc(100% - 25em); + width: 100%; +} + +#bottom-bar p { + text-overflow: ellipsis; + overflow: hidden; + width: calc(100% - 3em); + white-space: nowrap; +} + +#more { + display: none; +} + +#file-only { + display: inline-block; + border-right: 1px solid rgba(0, 0, 0, 0.075); + padding-right: .3em; + margin-right: .3em; + transition: .2s ease opacity, visibility; + visibility: visible; +} + +#file-only.disabled { + opacity: 0; + visibility: hidden; +} + +#download ul.active { + top: 0; + right: 0; +} + +#more ul.active { + right: .5em; + top: 4.5em; +} + + +/* * * * * * * * * * * * * * * * + * DROPDOWN * + * * * * * * * * * * * * * * * */ + +.dropdown { + position: fixed; + top: -100%; + right: -100%; + visibility: hidden; + display: flex; + flex-direction: column; + border-radius: .1em; + border-top-left-radius: 0; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + background: #fff; + z-index: 9999999; +} + +.dropdown.active { + visibility: visible; +} + +.dropdown .action { + padding: .7em; +} + +.dropdown i { + padding: 0; + vertical-align: middle; +} + +.dropdown span { + display: inline-block; + margin-left: .5em; + font-size: .9em; +} + + +/* * * * * * * * * * * * * * * * + * BREADCRUMBS * + * * * * * * * * * * * * * * * */ + +#previous { + margin-left: -.5em; +} + +#breadcrumbs { + min-width: 7em; +} + +#breadcrumbs.active { + top: 0; + left: 0; + right: auto; +} + + +/* * * * * * * * * * * * * * * * + * LISTING * + * * * * * * * * * * * * * * * */ + +#listing { + max-width: calc(100% - 1.2em); + width: 100%; +} + +#listing h2 { + margin: 0 0 0 0.5em; + font-size: 1em; + color: rgba(0, 0, 0, 0.2); + font-weight: 500; +} + +#listing .item div:last-of-type * { + text-overflow: ellipsis; + overflow: hidden; +} + +#listing>div { + display: flex; + padding: 0; + flex-wrap: wrap; + justify-content: flex-start; + position: relative; +} + +#listing .item { + background-color: #fff; + position: relative; + display: flex; + flex-wrap: nowrap; + color: #6f6f6f; + transition: .1s ease all; + align-items: center; + cursor: pointer; +} + +#listing .item div:last-of-type { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +#listing .item p { + margin: 0; +} + +#listing .item .size, +#listing .item .modified { + font-size: 0.9em; +} + +#listing .item .name { + font-weight: bold; +} + +#listing .item i { + font-size: 4em; + margin-right: 0.1em; + vertical-align: bottom; +} + +#listing h2.message, +.message { + text-align: center; + font-size: 3em; + margin: 1em auto; + display: block !important; + width: 95%; + color: rgba(0, 0, 0, 0.2); + font-weight: 500; +} + +.message i { + font-size: inherit; + vertical-align: middle; +} + + +/* * * * * * * * * * * * * * * * + * LISTING - MOSAIC * + * * * * * * * * * * * * * * * */ + +#listing.mosaic { + margin-top: 1em; +} + +#listing.mosaic .item { + width: calc(33% - 1em); + margin: .5em; + padding: 0.5em; + border-radius: 0.2em; + box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); +} + +#listing.mosaic .item:hover { + box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24) !important; +} + +#listing.mosaic .header { + display: none; +} + +#listing.mosaic .item div:first-of-type { + width: 5em; +} + +#listing.mosaic .item div:last-of-type { + width: calc(100% - 5vw); +} + + +/* * * * * * * * * * * * * * * * + * LISTING - DETAIL * + * * * * * * * * * * * * * * * */ + +#listing.list { + flex-direction: column; + padding-top: 3.25em; + width: 100%; + max-width: 100%; + margin: 0; +} + +#listing.list .item { + width: 100%; + margin: 0; + border: 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + padding: 1em; +} + +#listing.list h2 { + display: none; +} + +#listing .item[aria-selected=true] { + background: #2196f3 !important; + color: #fff !important; +} + +#listing.list .item div:first-of-type { + width: 3em; +} + +#listing.list .item div:first-of-type i { + font-size: 2em; +} + +#listing.list .item div:last-of-type { + width: calc(100% - 3em); + display: flex; + align-items: center; +} + +#listing.list .item .name { + width: 50%; +} + +#listing.list .item .size { + width: 25%; +} + +#listing .item.header { + display: none !important; + background-color: #ccc; +} + +#listing.list .header i { + font-size: 1.5em; + vertical-align: middle; + margin-left: .2em; +} + +#listing.list .item.header { + display: flex !important; + background: #fafafa; + position: fixed; + width: 100%; + top: 7.8em; + left: 0; + z-index: 999; + padding: .85em; +} + +#listing.list .item.header>div:first-child { + width: 0; +} + +#listing.list .item.header .name { + margin-right: 3em; +} + +#listing.list .header { + display: flex; + background: #fafafa; + position: fixed; + width: 100%; + top: 7.8em; + left: 0; + z-index: 999; +} + +#listing.list .header a { + color: inherit; +} + +#listing.list .item.header>div:first-child { + width: 0; +} + +#listing.list .name { + font-weight: normal; +} + +#listing.list .item.header .name { + margin-right: 3em; +} + +#listing.list .header span { + vertical-align: middle; +} + +#listing.list .header i { + opacity: 0; + transition: .1s ease all; +} + +#listing.list .header p:hover i, +#listing.list .header .active i { + opacity: 1; +} + +#listing.list .item.header .active { + font-weight: bold; +} + + +/* * * * * * * * * * * * * * * * + * MULTIPLE SELECTION DIALOG * + * * * * * * * * * * * * * * * */ + +#multiple-selection { + position: fixed; + bottom: -4em; + left: 0; + z-index: 99999999; + width: 100%; + background-color: #2196f3; + height: 4em; + display: flex !important; + padding: 0.5em 0.5em 0.5em 1em; + justify-content: space-between; + align-items: center; + transition: .2s ease all; +} + +#multiple-selection.active { + bottom: 0; +} + +#multiple-selection * { + margin: 0; +} + +#multiple-selection p, +#multiple-selection i { + color: #fff; +} + + +/* * * * * * * * * * * * * * * * + * PROMPT * + * * * * * * * * * * * * * * * */ + +.overlay, +.prompt, +.help { + opacity: 0; + z-index: -1; + transition: .1s ease opacity, z-index; +} + +.overlay.active, +.prompt.active, +.help.active { + z-index: 9999999; + opacity: 1; +} + +.overlay { + background-color: rgba(0, 0, 0, 0.5); + position: fixed; + top: 0; + left: 0; + height: 0; + width: 0; +} + +.overlay.active { + height: 100%; + width: 100%; +} + +.prompt, +.help { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 99999999; + background: #fff; + border: 1px solid rgba(0, 0, 0, 0.075); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + padding: 2em; + max-width: 25em; + width: 90%; + max-height: 95%; +} + +.prompt h3, +.help h3 { + margin: 0; + font-weight: 500; + font-size: 1.5em; +} + +.prompt p, +.help p { + font-size: .9em; + color: rgba(0, 0, 0, 0.8); + margin: .5em 0 1em; +} + +.prompt input { + width: 100%; + border: 1px solid #dadada; + line-height: 1; + padding: .3em; +} + +.prompt code { + word-wrap: break-word; +} + +.prompt div, +.help div { + margin-top: 1em; + display: flex; + justify-content: flex-start; + flex-direction: row-reverse; +} + +.prompt .cancel { + background-color: #ECEFF1; + color: #37474F; +} + +.prompt .cancel:hover { + background-color: #e9eaeb; +} + + +/* * * * * * * * * * * * * * * * + * PROMPT - MOVE * + * * * * * * * * * * * * * * * */ + +.prompt .file-list { + flex-direction: initial; + max-height: 50vh; + overflow: auto; +} + +.prompt .file-list ul { + list-style: none; + margin: 0; + padding: 0; + width: 100%; +} + +.prompt .file-list ul li { + width: 100%; + user-select: none; +} + +.prompt .file-list ul li[aria-selected=true] { + background: #2196f3 !important; + color: #fff !important; + transition: .1s ease all; +} + +.prompt .file-list ul li:hover { + background-color: #e9eaeb; + cursor: pointer; +} + +.prompt .file-list ul li:before { + content: "folder"; + color: #6f6f6f; + vertical-align: middle; + padding: 0 .25em; + line-height: 2em; +} + +.prompt .file-list ul li[aria-selected=true]:before { + color: white; +} + + +/* * * * * * * * * * * * * * * * + * HELP * + * * * * * * * * * * * * * * * */ + +.help { + max-width: 24em; + visibility: hidden; + top: -100%; + left: -100%; +} + +.help.active { + visibility: visible; + top: 50%; + left: 50%; +} + +.help ul { + padding: 0; + margin: 1em 0; + list-style: none; +} + + +/* * * * * * * * * * * * * * * * + * FOOTER * + * * * * * * * * * * * * * * * */ + +footer { + font-size: 0.6em; + margin: 2em 0 2em; + text-align: center; + color: grey; +} + +footer a, +footer a:hover { + color: inherit; +} + + +/* * * * * * * * * * * * * * * * + * MEDIA QUERIES * + * * * * * * * * * * * * * * * */ + +@media screen and (max-width: 850px) { + .frontmatter { + column-count: 2; + } +} + +@media screen and (max-width: 650px) { + body { + transition: .2s ease padding; + } + .mobile-only { + display: inherit !important; + } + #top-bar>div:nth-child(1) { + display: none; + } + #bottom-bar>*:first-child { + max-width: calc(100% - 16em) !important; + } + #main-actions { + position: fixed; + top: -100%; + right: -100%; + visibility: hidden; + display: flex; + flex-direction: column; + border-radius: .1em; + border-top-left-radius: 0; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + background: #fff; + z-index: 9999999; + } + #main-actions.active { + right: .5em; + top: 4.5em; + visibility: visible; + } + #main-actions .action { + padding: .7em; + border-radius: 0; + align-items: center; + } + #main-actions .action:hover { + background-color: rgba(0, 0, 0, 0.04); + } + #main-actions i { + padding: 0; + vertical-align: middle; + } + #main-actions .action:hover i { + padding: 0; + background-color: transparent; + } + #main-actions span { + display: inline-block; + margin-left: .5em; + font-size: .9em; + } + #listing.list .item .size, + #listing.list .item .modified { + display: none; + } + #listing.list .item .name { + width: 100%; + } + .frontmatter { + column-count: 1; + } +} + +@media screen and (max-width: 450px) { + #bottom-bar p { + display: none !important; + } +} + + +/* * * * * * * * * * * * * * * * + * ANIMATIONS * + * * * * * * * * * * * * * * * */ + +@keyframes spin { + 100% { + -webkit-transform: rotate(-360deg); + transform: rotate(-360deg); + } +} diff --git a/_assets/js/common.js b/_assets/js/common.js new file mode 100644 index 00000000..76cae2a3 --- /dev/null +++ b/_assets/js/common.js @@ -0,0 +1,685 @@ +'use strict' + +var tempID = '_fm_internal_temporary_id' +var ssl = (window.location.protocol === 'https:') +var templates = {} +var selectedItems = [] +var overlay +var clickOverlay + +// Removes an element, if exists, from an array +Array.prototype.removeElement = function (element) { + var i = this.indexOf(element) + if (i !== -1) { + this.splice(i, 1) + } +} + +// Replaces an element inside an array by another +Array.prototype.replaceElement = function (oldElement, newElement) { + var i = this.indexOf(oldElement) + if (i !== -1) { + this[i] = newElement + } +} + +// Sends a costum event to itself +Document.prototype.sendCostumEvent = function (text) { + this.dispatchEvent(new window.CustomEvent(text)) +} + +// Gets the content of a cookie +Document.prototype.getCookie = function (name) { + var re = new RegExp('(?:(?:^|.*;\\s*)' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$') + return document.cookie.replace(re, '$1') +} + +// Remove the last directory of an url +var removeLastDirectoryPartOf = function (url) { + var arr = url.split('/') + if (arr.pop() === '') { + arr.pop() + } + return (arr.join('/')) +} + +function getCSSRule (rules) { + for (let i = 0; i < rules.length; i++) { + rules[i] = rules[i].toLowerCase() + } + + let result = null + let find = Array.prototype.find + + find.call(document.styleSheets, styleSheet => { + result = find.call(styleSheet.cssRules, cssRule => { + let found = false + + if (cssRule instanceof CSSStyleRule) { + for (let i = 0; i < rules.length; i++) { + if (cssRule.selectorText.toLowerCase() === rules[i]) { + found = true + } + } + } + + return found + }) + + return result != null + }) + + return result +} + +/* * * * * * * * * * * * * * * * + * * + * BUTTONS * + * * + * * * * * * * * * * * * * * * */ +var buttons = { + previousState: {} +} + +buttons.setLoading = function (name) { + if (typeof this[name] === 'undefined') return + let i = this[name].querySelector('i') + + this.previousState[name] = i.innerHTML + i.style.opacity = 0 + + setTimeout(function () { + i.classList.add('spin') + i.innerHTML = 'autorenew' + i.style.opacity = 1 + }, 200) +} + +// Changes an element to done animation +buttons.setDone = function (name, success = true) { + let i = this[name].querySelector('i') + + i.style.opacity = 0 + + let thirdStep = () => { + i.innerHTML = this.previousState[name] + i.style.opacity = null + + if (selectedItems.length === 0 && document.getElementById('listing')) { + document.sendCostumEvent('changed-selected') + } + } + + let secondStep = () => { + i.style.opacity = 0 + setTimeout(thirdStep, 200) + } + + let firstStep = () => { + i.classList.remove('spin') + i.innerHTML = success + ? 'done' + : 'close' + i.style.opacity = 1 + setTimeout(secondStep, 1000) + } + + setTimeout(firstStep, 200) + return false +} + +/* * * * * * * * * * * * * * * * + * * + * WEBDAV * + * * + * * * * * * * * * * * * * * * */ +var webdav = {} + +webdav.convertURL = function (url) { + return window.location.origin + url.replace(baseURL + '/', webdavURL + '/') +} + +webdav.move = function (oldLink, newLink) { + return new Promise((resolve, reject) => { + let request = new window.XMLHttpRequest() + let destination = newLink.replace(baseURL + '/', webdavURL + '/') + + destination = window.location.origin + destination.substring(prefixURL.length) + + request.open('MOVE', webdav.convertURL(oldLink), true) + request.setRequestHeader('Destination', destination) + request.onload = () => { + if (request.status === 201 || request.status === 204) { + resolve() + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send() + }) +} + +webdav.put = function (link, body, headers = {}) { + return new Promise((resolve, reject) => { + let request = new window.XMLHttpRequest() + request.open('PUT', webdav.convertURL(link), true) + + for (let key in headers) { + request.setRequestHeader(key, headers[key]) + } + + request.onload = () => { + if (request.status == 201) { + resolve() + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send(body) + }) +} + +webdav.propfind = function (link, body, headers = {}) { + return new Promise((resolve, reject) => { + let request = new window.XMLHttpRequest() + request.open('PROPFIND', webdav.convertURL(link), true) + + for (let key in headers) { + request.setRequestHeader(key, headers[key]) + } + + request.onload = () => { + if (request.status < 300) { + resolve(request.responseText) + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send(body) + }) +} + +webdav.delete = function (link) { + return new Promise((resolve, reject) => { + let request = new window.XMLHttpRequest() + request.open('DELETE', webdav.convertURL(link), true) + request.onload = () => { + if (request.status === 204) { + resolve() + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send() + }) +} + +webdav.new = function (link) { + return new Promise((resolve, reject) => { + let request = new window.XMLHttpRequest() + request.open((link.endsWith('/') ? 'MKCOL' : 'PUT'), webdav.convertURL(link), true) + request.onload = () => { + if (request.status === 201) { + resolve() + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send() + }) +} + +/* * * * * * * * * * * * * * * * + * * + * EVENTS * + * * + * * * * * * * * * * * * * * * */ +function closePrompt (event) { + let prompt = document.querySelector('.prompt') + + if (!prompt) return + + if (typeof event !== 'undefined') { + event.preventDefault() + } + + document.querySelector('.overlay').classList.remove('active') + prompt.classList.remove('active') + + setTimeout(() => { + prompt.remove() + }, 100) +} + +function notImplemented (event) { + event.preventDefault() + clickOverlay.click() + + let clone = document.importNode(templates.message.content, true) + clone.querySelector('h3').innerHTML = 'Not implemented' + clone.querySelector('p').innerHTML = "Sorry, but this feature wasn't implemented yet." + + document.querySelector('body').appendChild(clone) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') +} + +// Prevent Default event +var preventDefault = function (event) { + event.preventDefault() +} + +function logoutEvent (event) { + let request = new window.XMLHttpRequest() + request.open('GET', window.location.pathname, true, 'username', 'password') + request.send() + request.onreadystatechange = function () { + if (request.readyState === 4) { + window.location = '/' + } + } +} + +function openEvent (event) { + if (event.currentTarget.classList.contains('disabled')) { + return false + } + + let link = '?raw=true' + + if (selectedItems.length) { + link = document.getElementById(selectedItems[0]).dataset.url + link + } else { + link = window.location.pathname + link + } + + window.open(link) + return false +} + +function getHash (event, hash) { + event.preventDefault() + + let request = new window.XMLHttpRequest() + let link + + if (selectedItems.length) { + link = document.getElementById(selectedItems[0]).dataset.url + } else { + link = window.location.pathname + } + + request.open('GET', `${link}?checksum=${hash}`, true) + + request.onload = () => { + if (request.status >= 300) { + console.log(request.statusText) + return + } + event.target.parentElement.innerHTML = request.responseText + } + request.onerror = (e) => console.log(e) + request.send() +} + +function infoEvent (event) { + event.preventDefault() + if (event.currentTarget.classList.contains('disabled')) { + return + } + + let dir = false + let link + + if (selectedItems.length) { + link = document.getElementById(selectedItems[0]).dataset.url + dir = document.getElementById(selectedItems[0]).dataset.dir + } else { + if (document.getElementById('listing') !== null) { + dir = true + } + + link = window.location.pathname + } + + buttons.setLoading('info', false) + + webdav.propfind(link) + .then((text) => { + let parser = new window.DOMParser() + let xml = parser.parseFromString(text, 'text/xml') + let clone = document.importNode(templates.info.content, true) + + let value = xml.getElementsByTagName('displayname') + if (value.length > 0) { + clone.getElementById('display_name').innerHTML = value[0].innerHTML + } else { + clone.getElementById('display_name').innerHTML = xml.getElementsByTagName('D:displayname')[0].innerHTML + } + + value = xml.getElementsByTagName('getcontentlength') + if (value.length > 0) { + clone.getElementById('content_length').innerHTML = value[0].innerHTML + } else { + clone.getElementById('content_length').innerHTML = xml.getElementsByTagName('D:getcontentlength')[0].innerHTML + } + + value = xml.getElementsByTagName('getlastmodified') + if (value.length > 0) { + clone.getElementById('last_modified').innerHTML = value[0].innerHTML + } else { + clone.getElementById('last_modified').innerHTML = xml.getElementsByTagName('D:getlastmodified')[0].innerHTML + } + + if (dir === true || dir === 'true') { + clone.querySelector('.file-only').style.display = 'none' + } + + document.querySelector('body').appendChild(clone) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') + buttons.setDone('info', true) + }) + .catch(e => { + buttons.setDone('info', false) + console.log(e) + }) +} + +function deleteOnSingleFile () { + closePrompt() + buttons.setLoading('delete') + + webdav.delete(window.location.pathname) + .then(() => { + window.location.pathname = removeLastDirectoryPartOf(window.location.pathname) + }) + .catch(e => { + buttons.setDone('delete', false) + console.log(e) + }) +} + +function deleteOnListing () { + closePrompt() + buttons.setLoading('delete') + + let promises = [] + + for (let id of selectedItems) { + promises.push(webdav.delete(document.getElementById(id).dataset.url)) + } + + Promise.all(promises) + .then(() => { + listing.reload() + buttons.setDone('delete') + }) + .catch(e => { + console.log(e) + buttons.setDone('delete', false) + }) +} + +// Handles the delete button event +function deleteEvent (event) { + let single = false + + if (!selectedItems.length) { + selectedItems = ['placeholder'] + single = true + } + + let clone = document.importNode(templates.question.content, true) + clone.querySelector('h3').innerHTML = 'Delete files' + + if (single) { + clone.querySelector('form').addEventListener('submit', deleteOnSingleFile) + clone.querySelector('p').innerHTML = `Are you sure you want to delete this file/folder?` + } else { + clone.querySelector('form').addEventListener('submit', deleteOnListing) + clone.querySelector('p').innerHTML = `Are you sure you want to delete ${selectedItems.length} file(s)?` + } + + clone.querySelector('input').remove() + clone.querySelector('.ok').innerHTML = 'Delete' + + document.body.appendChild(clone) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') + + return false +} + +function resetSearchText () { + let box = document.querySelector('#search > div div') + + if (user.AllowCommands) { + box.innerHTML = `Search or use one of your supported commands: ${user.Commands.join(", ")}.` + } else { + box.innerHTML = 'Type and press enter to search.' + } +} + +function searchEvent (event) { + if (this.value.length === 0) { + resetSearchText() + return + } + + let value = this.value, + search = document.getElementById('search'), + scrollable = document.querySelector('#search > div'), + box = document.querySelector('#search > div div'), + pieces = value.split(' '), + supported = false + + user.Commands.forEach(function (cmd) { + if (cmd == pieces[0]) { + supported = true + } + }) + + if (!supported || !user.AllowCommands) { + box.innerHTML = 'Press enter to search.' + } else { + box.innerHTML = 'Press enter to execute.' + } + + if (event.keyCode === 13) { + box.innerHTML = '' + search.classList.add('ongoing') + + let url = window.location.host + window.location.pathname + + if (document.getElementById('editor')) { + url = removeLastDirectoryPartOf(url) + } + + let protocol = ssl ? 'wss:' : 'ws:' + + if (supported && user.AllowCommands) { + let conn = new window.WebSocket(`${protocol}//${url}?command=true`) + + conn.onopen = function () { + conn.send(value) + } + + conn.onmessage = function (event) { + box.innerHTML = event.data + scrollable.scrollTop = scrollable.scrollHeight + } + + conn.onclose = function (event) { + search.classList.remove('ongoing') + listing.reload() + } + + return + } + + box.innerHTML = '
        ' + + let ul = box.querySelector('ul') + let conn = new window.WebSocket(`${protocol}//${url}?search=true`) + + conn.onopen = function () { + conn.send(value) + } + + conn.onmessage = function (event) { + ul.innerHTML += '
      • ' + event.data + '
      • ' + scrollable.scrollTop = scrollable.scrollHeight + } + + conn.onclose = function (event) { + search.classList.remove('ongoing') + } + } +} + +function setupSearch () { + let search = document.getElementById('search') + let searchInput = search.querySelector('input') + let searchDiv = search.querySelector('div') + let hover = false + let focus = false + + resetSearchText() + + searchInput.addEventListener('focus', event => { + focus = true + search.classList.add('active') + }) + + searchDiv.addEventListener('mouseover', event => { + hover = true + search.classList.add('active') + }) + + searchInput.addEventListener('blur', event => { + focus = false + if (hover) return + search.classList.remove('active') + }) + + search.addEventListener('mouseleave', event => { + hover = false + if (focus) return + search.classList.remove('active') + }) + + search.addEventListener('click', event => { + search.classList.add('active') + search.querySelector('input').focus() + }) + + searchInput.addEventListener('keyup', searchEvent) +} + +function closeHelp (event) { + event.preventDefault() + + document.querySelector('.help').classList.remove('active') + document.querySelector('.overlay').classList.remove('active') +} + +function openHelp (event) { + closePrompt(event) + + document.querySelector('.help').classList.add('active') + document.querySelector('.overlay').classList.add('active') +} + +window.addEventListener('keydown', (event) => { + if (event.keyCode === 27) { + if (document.querySelector('.help.active')) { + closeHelp(event) + } + } + + if (event.keyCode === 46) { + deleteEvent(event) + } + + if (event.keyCode === 112) { + event.preventDefault() + openHelp(event) + } +}) + +/* * * * * * * * * * * * * * * * + * * + * BOOTSTRAP * + * * + * * * * * * * * * * * * * * * */ + +document.addEventListener('DOMContentLoaded', function (event) { + overlay = document.querySelector('.overlay') + clickOverlay = document.querySelector('#click-overlay') + + buttons.logout = document.getElementById('logout') + buttons.open = document.getElementById('open') + buttons.delete = document.getElementById('delete') + buttons.previous = document.getElementById('previous') + buttons.info = document.getElementById('info') + + // Attach event listeners + buttons.logout.addEventListener('click', logoutEvent) + buttons.open.addEventListener('click', openEvent) + buttons.info.addEventListener('click', infoEvent) + + templates.question = document.querySelector('#question-template') + templates.info = document.querySelector('#info-template') + templates.message = document.querySelector('#message-template') + templates.move = document.querySelector('#move-template') + + if (user.AllowEdit) { + buttons.delete.addEventListener('click', deleteEvent) + } + + let dropdownButtons = document.querySelectorAll('.action[data-dropdown]') + Array.from(dropdownButtons).forEach(button => { + button.addEventListener('click', event => { + button.querySelector('ul').classList.toggle('active') + clickOverlay.classList.add('active') + + clickOverlay.addEventListener('click', event => { + button.querySelector('ul').classList.remove('active') + clickOverlay.classList.remove('active') + }) + }) + }) + + overlay.addEventListener('click', event => { + if (document.querySelector('.help.active')) { + closeHelp(event) + return + } + + closePrompt(event) + }) + + let mainActions = document.getElementById('main-actions') + + document.getElementById('more').addEventListener('click', event => { + event.preventDefault() + event.stopPropagation() + + clickOverlay.classList.add('active') + mainActions.classList.add('active') + + clickOverlay.addEventListener('click', event => { + mainActions.classList.remove('active') + clickOverlay.classList.remove('active') + }) + }) + + setupSearch() + return false +}) diff --git a/_assets/js/editor.js b/_assets/js/editor.js new file mode 100644 index 00000000..38ff40c7 --- /dev/null +++ b/_assets/js/editor.js @@ -0,0 +1,278 @@ +'use strict' + +var editor = {} + +editor.textareaAutoGrow = function () { + let autogrow = function () { + console.log(this.style.height) + this.style.height = 'auto' + this.style.height = (this.scrollHeight) + 'px' + } + + let textareas = document.getElementsByTagName('textarea') + + let addAutoGrow = () => { + Array.from(textareas).forEach(textarea => { + autogrow.bind(textarea)() + textarea.addEventListener('keyup', autogrow) + }) + } + + addAutoGrow() + window.addEventListener('resize', addAutoGrow) +} + +editor.toggleSourceEditor = function (event) { + event.preventDefault() + + if (document.querySelector('[data-kind="content-only"]')) { + window.location = window.location.pathname + '?visual=true' + return + } + + window.location = window.location.pathname + '?visual=false' +} + +function deleteFrontMatterItem (event) { + event.preventDefault() + document.getElementById(this.dataset.delete).remove() +} + +function makeFromBaseTemplate (id, type, name, parent) { + let clone = document.importNode(templates.base.content, true) + clone.querySelector('fieldset').id = id + clone.querySelector('fieldset').dataset.type = type + clone.querySelector('h3').innerHTML = name + clone.querySelector('.delete').dataset.delete = id + clone.querySelector('.delete').addEventListener('click', deleteFrontMatterItem) + clone.querySelector('.add').addEventListener('click', addFrontMatterItem) + + if (parent.classList.contains('frontmatter')) { + parent.insertBefore(clone, document.querySelector('div.button.add')) + return + } + + parent.appendChild(clone) +} + +function makeFromArrayItemTemplate (id, number, parent) { + let clone = document.importNode(templates.arrayItem.content, true) + clone.querySelector('[data-type="array-item"]').id = `${id}-${number}` + clone.querySelector('input').name = id + clone.querySelector('input').id = id + clone.querySelector('div.action').dataset.delete = `${id}-${number}` + clone.querySelector('div.action').addEventListener('click', deleteFrontMatterItem) + parent.querySelector('.group').appendChild(clone) + document.getElementById(`${id}-${number}`).querySelector('input').focus() +} + +function makeFromObjectItemTemplate (id, name, parent) { + let clone = document.importNode(templates.objectItem.content, true) + clone.querySelector('.block').id = `block-${id}` + clone.querySelector('.block').dataset.content = id + clone.querySelector('label').for = id + clone.querySelector('label').innerHTML = name + clone.querySelector('input').name = id + clone.querySelector('input').id = id + clone.querySelector('.action').dataset.delete = `block-${id}` + clone.querySelector('.action').addEventListener('click', deleteFrontMatterItem) + + parent.appendChild(clone) + document.getElementById(id).focus() +} + +function addFrontMatterItemPrompt (parent) { + return function (event) { + event.preventDefault() + + let value = event.currentTarget.querySelector('input').value + if (value === '') { + return true + } + + closePrompt(event) + + let name = value.substring(0, value.lastIndexOf(':')), + type = value.substring(value.lastIndexOf(':') + 1, value.length) + + if (type !== '' && type !== 'array' && type !== 'object') { + name = value + } + + name = name.replace(' ', '_') + + let id = name + + if (parent.id != '') { + id = parent.id + '.' + id + } + + if (type == 'array' || type == 'object') { + if (parent.dataset.type == 'parent') { + makeFromBaseTemplate(id, type, name, document.querySelector('.frontmatter')) + return + } + + makeFromBaseTemplate(id, type, name, block) + return + } + + let group = parent.querySelector('.group') + + if (group == null) { + parent.insertAdjacentHTML('afterbegin', '
        ') + group = parent.querySelector('.group') + } + + makeFromObjectItemTemplate(id, name, group) + } +} + +function addFrontMatterItem (event) { + event.preventDefault() + + let parent = event.currentTarget.parentNode, + type = parent.dataset.type + + // If the block is an array + if (type === 'array') { + let id = parent.id + '[]', + count = parent.querySelectorAll('.group > div').length, + fieldsets = parent.getElementsByTagName('fieldset') + + if (fieldsets.length > 0) { + let itemType = fieldsets[0].dataset.type, + itemID = parent.id + '[' + fieldsets.length + ']', + itemName = fieldsets.length + + makeFromBaseTemplate(itemID, itemType, itemName, parent) + } else { + makeFromArrayItemTemplate(id, count, parent) + } + + return + } + + if (type == 'object' || type == 'parent') { + let clone = document.importNode(templates.question.content, true) + clone.querySelector('form').id = tempID + clone.querySelector('h3').innerHTML = 'New field' + clone.querySelector('p').innerHTML = 'Write the field name and then press enter. If you want to create an array or an object, end the name with :array or :object.' + clone.querySelector('.ok').innerHTML = 'Create' + clone.querySelector('form').addEventListener('submit', addFrontMatterItemPrompt(parent)) + clone.querySelector('form').classList.add('active') + document.querySelector('body').appendChild(clone) + + document.querySelector('.overlay').classList.add('active') + document.getElementById(tempID).classList.add('active') + } + + return false +} + +document.addEventListener('DOMContentLoaded', (event) => { + if (!document.getElementById('editor')) return + + editor.textareaAutoGrow() + + templates.arrayItem = document.getElementById('array-item-template') + templates.base = document.getElementById('base-template') + templates.objectItem = document.getElementById('object-item-template') + templates.temporary = document.getElementById('temporary-template') + + buttons.save = document.querySelector('#save') + buttons.editSource = document.querySelector('#edit-source') + + if (buttons.editSource) { + buttons.editSource.addEventListener('click', editor.toggleSourceEditor) + } + + let container = document.getElementById('editor'), + kind = container.dataset.kind, + rune = container.dataset.rune + + if (kind != 'frontmatter-only') { + let editor = document.querySelector('.content #ace'), + mode = editor.dataset.mode, + textarea = document.querySelector('textarea[name="content"]'), + aceEditor = ace.edit('ace'), + options = { + wrap: true, + maxLines: Infinity, + theme: 'ace/theme/github', + showPrintMargin: false, + fontSize: '1em', + minLines: 20 + } + + aceEditor.getSession().setMode('ace/mode/' + mode) + aceEditor.getSession().setValue(textarea.value) + aceEditor.getSession().on('change', function () { + textarea.value = aceEditor.getSession().getValue() + }) + + if (mode == 'markdown') options.showGutter = false + aceEditor.setOptions(options) + } + + let deleteFrontMatterItemButtons = document.getElementsByClassName('delete') + Array.from(deleteFrontMatterItemButtons).forEach(button => { + button.addEventListener('click', deleteFrontMatterItem) + }) + + let addFrontMatterItemButtons = document.getElementsByClassName('add') + Array.from(addFrontMatterItemButtons).forEach(button => { + button.addEventListener('click', addFrontMatterItem) + }) + + let saveContent = function () { + let data = form2js(document.querySelector('form')) + + if (typeof data.content === 'undefined' && kind !== 'frontmatter-only') { + data.content = '' + } + + if (typeof data.content === 'number') { + data.content = data.content.toString() + } + + let request = new XMLHttpRequest() + + buttons.setLoading('save') + + webdav.put(window.location.pathname, JSON.stringify(data), { + 'Kind': kind, + 'Rune': rune + }) + .then(() => { + buttons.setDone('save') + }) + .catch(e => { + console.log(e) + buttons.setDone('save', false) + }) + } + + document.querySelector('#save').addEventListener('click', event => { + event.preventDefault() + saveContent() + }) + + document.querySelector('form').addEventListener('submit', (event) => { + event.preventDefault() + saveContent() + }) + + window.addEventListener('keydown', (event) => { + if (event.ctrlKey || event.metaKey) { + switch (String.fromCharCode(event.which).toLowerCase()) { + case 's': + event.preventDefault() + saveContent() + break + } + } + }) + + return false +}) diff --git a/_assets/js/listing.js b/_assets/js/listing.js new file mode 100644 index 00000000..baef101d --- /dev/null +++ b/_assets/js/listing.js @@ -0,0 +1,580 @@ +'use strict' + +var listing = { + selectMultiple: false +} + +listing.reload = function (callback) { + let request = new XMLHttpRequest() + + request.open('GET', window.location) + request.setRequestHeader('Minimal', 'true') + request.send() + request.onreadystatechange = function () { + if (request.readyState === 4) { + if (request.status === 200) { + document.querySelector('body main').innerHTML = request.responseText + listing.addDoubleTapEvent() + + if (typeof callback === 'function') { + callback() + } + } + } + } +} + +listing.itemDragStart = function (event) { + let el = event.target + + for (let i = 0; i < 5; i++) { + if (!el.classList.contains('item')) { + el = el.parentElement + } + } + + event.dataTransfer.setData('id', el.id) + event.dataTransfer.setData('name', el.querySelector('.name').innerHTML) +} + +listing.itemDragOver = function (event) { + event.preventDefault() + let el = event.target + + for (let i = 0; i < 5; i++) { + if (!el.classList.contains('item')) { + el = el.parentElement + } + } + + el.style.opacity = 1 +} + +listing.itemDrop = function (e) { + e.preventDefault() + + let el = e.target, + id = e.dataTransfer.getData('id'), + name = e.dataTransfer.getData('name') + + if (id == '' || name == '') return + + for (let i = 0; i < 5; i++) { + if (!el.classList.contains('item')) { + el = el.parentElement + } + } + + if (el.id === id) return + + let oldLink = document.getElementById(id).dataset.url, + newLink = el.dataset.url + name + + webdav.move(oldLink, newLink) + .then(() => listing.reload()) + .catch(e => console.log(e)) +} + +listing.documentDrop = function (event) { + event.preventDefault() + let dt = event.dataTransfer, + files = dt.files, + el = event.target, + items = document.getElementsByClassName('item') + + for (let i = 0; i < 5; i++) { + if (el != null && !el.classList.contains('item')) { + el = el.parentElement + } + } + + if (files.length > 0) { + if (el != null && el.classList.contains('item') && el.dataset.dir == 'true') { + listing.handleFiles(files, el.querySelector('.name').innerHTML + '/') + return + } + + listing.handleFiles(files, '') + } else { + Array.from(items).forEach(file => { + file.style.opacity = 1 + }) + } +} + +listing.rename = function (event) { + if (!selectedItems.length || selectedItems.length > 1) { + return false + } + + let item = document.getElementById(selectedItems[0]) + + if (item.classList.contains('disabled')) { + return false + } + + let link = item.dataset.url, + field = item.querySelector('.name'), + name = field.innerHTML + + let submit = (event) => { + event.preventDefault() + + let newName = event.currentTarget.querySelector('input').value, + newLink = removeLastDirectoryPartOf(link) + '/' + newName + + closePrompt(event) + buttons.setLoading('rename') + + webdav.move(link, newLink).then(() => { + listing.reload(() => { + newName = btoa(newName) + selectedItems = [newName] + document.getElementById(newName).setAttribute('aria-selected', true) + listing.handleSelectionChange() + }) + + buttons.setDone('rename') + }).catch(error => { + field.innerHTML = name + buttons.setDone('rename', false) + console.log(error) + }) + + return false + } + + let clone = document.importNode(templates.question.content, true) + clone.querySelector('h3').innerHTML = 'Rename' + clone.querySelector('input').value = name + clone.querySelector('.ok').innerHTML = 'Rename' + clone.querySelector('form').addEventListener('submit', submit) + + document.querySelector('body').appendChild(clone) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') + + return false +} + +listing.handleFiles = function (files, base) { + buttons.setLoading('upload') + + let promises = [] + + for (let file of files) { + promises.push(webdav.put(window.location.pathname + base + file.name, file)) + } + + Promise.all(promises) + .then(() => { + listing.reload() + buttons.setDone('upload') + }) + .catch(e => { + console.log(e) + buttons.setDone('upload', false) + }) + + return false +} + +listing.unselectAll = function () { + let items = document.getElementsByClassName('item') + Array.from(items).forEach(link => { + link.setAttribute('aria-selected', false) + }) + + selectedItems = [] + + listing.handleSelectionChange() + return false +} + +listing.handleSelectionChange = function (event) { + listing.redefineDownloadURLs() + + let selectedNumber = selectedItems.length, + fileAction = document.getElementById('file-only') + + if (selectedNumber) { + fileAction.classList.remove('disabled') + + if (selectedNumber > 1) { + buttons.open.classList.add('disabled') + buttons.rename.classList.add('disabled') + buttons.info.classList.add('disabled') + } + + if (selectedNumber == 1) { + if (document.getElementById(selectedItems[0]).dataset.dir == 'true') { + buttons.open.classList.add('disabled') + } else { + buttons.open.classList.remove('disabled') + } + + buttons.info.classList.remove('disabled') + buttons.rename.classList.remove('disabled') + } + + return false + } + + buttons.info.classList.remove('disabled') + fileAction.classList.add('disabled') + return false +} + +listing.redefineDownloadURLs = function () { + let files = '' + + for (let i = 0; i < selectedItems.length; i++) { + let url = document.getElementById(selectedItems[i]).dataset.url + files += url.replace(window.location.pathname, '') + ',' + } + + files = files.substring(0, files.length - 1) + files = encodeURIComponent(files) + + let links = document.querySelectorAll('#download ul a') + Array.from(links).forEach(link => { + link.href = '?download=' + link.dataset.format + '&files=' + files + }) +} + +listing.openItem = function (event) { + window.location = event.currentTarget.dataset.url +} + +listing.selectItem = function (event) { + let el = event.currentTarget + + if (selectedItems.length != 0) event.preventDefault() + if (selectedItems.indexOf(el.id) == -1) { + if (!event.ctrlKey && !listing.selectMultiple) listing.unselectAll() + + el.setAttribute('aria-selected', true) + selectedItems.push(el.id) + } else { + el.setAttribute('aria-selected', false) + selectedItems.removeElement(el.id) + } + + listing.handleSelectionChange() + return false +} + +listing.newFileButton = function (event) { + event.preventDefault() + + let clone = document.importNode(templates.question.content, true) + clone.querySelector('h3').innerHTML = 'New file' + clone.querySelector('p').innerHTML = 'End with a trailing slash to create a dir.' + clone.querySelector('.ok').innerHTML = 'Create' + clone.querySelector('form').addEventListener('submit', listing.newFilePrompt) + + document.querySelector('body').appendChild(clone) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') +} + +listing.newFilePrompt = function (event) { + event.preventDefault() + buttons.setLoading('new') + + let name = event.currentTarget.querySelector('input').value + + webdav.new(window.location.pathname + name) + .then(() => { + buttons.setDone('new') + listing.reload() + }) + .catch(e => { + console.log(e) + buttons.setDone('new', false) + }) + + closePrompt(event) + return false +} + +listing.updateColumns = function (event) { + let columns = Math.floor(document.getElementById('listing').offsetWidth / 300), + items = getCSSRule(['#listing.mosaic .item', '.mosaic#listing .item']) + + items.style.width = `calc(${100/columns}% - 1em)` +} + +listing.addDoubleTapEvent = function () { + let items = document.getElementsByClassName('item'), + touches = { + id: '', + count: 0 + } + + Array.from(items).forEach(file => { + file.addEventListener('touchstart', event => { + if (touches.id != file.id) { + touches.id = file.id + touches.count = 1 + + setTimeout(() => { + touches.count = 0 + }, 300) + + return + } + + touches.count++ + + if (touches.count > 1) { + window.location = file.dataset.url + } + }) + }) +} + +// Keydown events +window.addEventListener('keydown', (event) => { + if (event.keyCode == 27) { + listing.unselectAll() + + if (document.querySelectorAll('.prompt').length) { + closePrompt(event) + } + } + + if (event.keyCode == 113) { + listing.rename() + } + + if (event.ctrlKey || event.metaKey) { + switch (String.fromCharCode(event.which).toLowerCase()) { + case 's': + event.preventDefault() + window.location = '?download=true' + } + } +}) + +window.addEventListener('resize', () => { + listing.updateColumns() +}) + +listing.selectMoveFolder = function (event) { + if (event.target.getAttribute('aria-selected') === 'true') { + event.target.setAttribute('aria-selected', false) + return + } else { + if (document.querySelector('.file-list li[aria-selected=true]')) { + document.querySelector('.file-list li[aria-selected=true]').setAttribute('aria-selected', false) + } + event.target.setAttribute('aria-selected', true) + return + } +} + +listing.getJSON = function (link) { + return new Promise((resolve, reject) => { + let request = new XMLHttpRequest() + request.open('GET', link) + request.setRequestHeader('Accept', 'application/json') + request.onload = () => { + if (request.status == 200) { + resolve(request.responseText) + } else { + reject(request.statusText) + } + } + request.onerror = () => reject(request.statusText) + request.send() + }) +} + +listing.moveMakeItem = function (url, name) { + let node = document.createElement('li'), + count = 0 + + node.dataset.url = url + node.innerHTML = name + node.setAttribute('aria-selected', false) + + node.addEventListener('dblclick', listing.moveDialogNext) + node.addEventListener('click', listing.selectMoveFolder) + node.addEventListener('touchstart', event => { + count++ + + setTimeout(() => { + count = 0 + }, 300) + + if (count > 1) { + listing.moveDialogNext(event) + } + }) + + return node +} + +listing.moveDialogNext = function (event) { + let request = new XMLHttpRequest(), + prompt = document.querySelector('form.prompt.active'), + list = prompt.querySelector('div.file-list ul') + + prompt.addEventListener('submit', listing.moveSelected) + + listing.getJSON(event.target.dataset.url) + .then((data) => { + let dirs = 0 + + prompt.querySelector('ul').innerHTML = '' + prompt.querySelector('code').innerHTML = event.target.dataset.url + + if (event.target.dataset.url != baseURL + '/') { + let node = listing.moveMakeItem(removeLastDirectoryPartOf(event.target.dataset.url) + '/', '..') + list.appendChild(node) + } + + if (JSON.parse(data) == null) { + prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.` + return + } + + for (let f of JSON.parse(data)) { + if (f.IsDir === true) { + dirs++ + list.appendChild(listing.moveMakeItem(f.URL, f.Name)) + } + } + + if (dirs === 0) + prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.` + }) + .catch(e => console.log(e)) +} + +listing.moveSelected = function (event) { + event.preventDefault() + + let promises = [] + buttons.setLoading('move') + + for (let file of selectedItems) { + let fileElement = document.getElementById(file), + destFolder = event.target.querySelector('p code').innerHTML + + if (event.currentTarget.querySelector('li[aria-selected=true]') != null) { + destFolder = event.currentTarget.querySelector('li[aria-selected=true]').dataset.url + } + + let destPath = '/' + destFolder + '/' + fileElement.querySelector('.name').innerHTML + destPath = destPath.replace('//', '/') + + promises.push(webdav.move(fileElement.dataset.url, destPath)) + } + + Promise.all(promises) + .then(() => { + closePrompt(event) + buttons.setDone('move') + listing.reload() + }) + .catch(e => { + console.log(e) + }) +} + +listing.moveEvent = function (event) { + if (event.currentTarget.classList.contains('disabled')) + return + + listing.getJSON(window.location.pathname) + .then((data) => { + let prompt = document.importNode(templates.move.content, true), + list = prompt.querySelector('div.file-list ul'), + dirs = 0 + + prompt.querySelector('form').addEventListener('submit', listing.moveSelected) + prompt.querySelector('code').innerHTML = window.location.pathname + + if (window.location.pathname !== baseURL + '/') { + list.appendChild(listing.moveMakeItem(removeLastDirectoryPartOf(window.location.pathname) + '/', '..')) + } + + for (let f of JSON.parse(data)) { + if (f.IsDir === true) { + dirs++ + list.appendChild(listing.moveMakeItem(f.URL, f.Name)) + } + } + + if (dirs === 0) { + prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.` + } + + document.body.appendChild(prompt) + document.querySelector('.overlay').classList.add('active') + document.querySelector('.prompt').classList.add('active') + }) + .catch(e => console.log(e)) +} + +document.addEventListener('DOMContentLoaded', event => { + listing.updateColumns() + listing.addDoubleTapEvent() + + buttons.rename = document.getElementById('rename') + buttons.upload = document.getElementById('upload') + buttons.new = document.getElementById('new') + buttons.download = document.getElementById('download') + buttons.move = document.getElementById('move') + + document.getElementById('multiple-selection-activate').addEventListener('click', event => { + listing.selectMultiple = true + clickOverlay.click() + + document.getElementById('multiple-selection').classList.add('active') + document.querySelector('body').style.paddingBottom = '4em' + }) + + document.getElementById('multiple-selection-cancel').addEventListener('click', event => { + listing.selectMultiple = false + + document.querySelector('body').style.paddingBottom = '0' + document.getElementById('multiple-selection').classList.remove('active') + }) + + if (user.AllowEdit) { + buttons.move.addEventListener('click', listing.moveEvent) + buttons.rename.addEventListener('click', listing.rename) + } + + let items = document.getElementsByClassName('item') + + if (user.AllowNew) { + buttons.upload.addEventListener('click', (event) => { + document.getElementById('upload-input').click() + }) + + buttons.new.addEventListener('click', listing.newFileButton) + + // Drag and Drop + document.addEventListener('dragover', function (event) { + event.preventDefault() + }, false) + + document.addEventListener('dragenter', (event) => { + Array.from(items).forEach(file => { + file.style.opacity = 0.5 + }) + }, false) + + document.addEventListener('dragend', (event) => { + Array.from(items).forEach(file => { + file.style.opacity = 1 + }) + }, false) + + document.addEventListener('drop', listing.documentDrop, false) + } +}) diff --git a/_assets/js/vendor/ace b/_assets/js/vendor/ace new file mode 160000 index 00000000..0b01260b --- /dev/null +++ b/_assets/js/vendor/ace @@ -0,0 +1 @@ +Subproject commit 0b01260b38f4db87b2b862e0c7f12e7e2e2905fd diff --git a/_assets/js/vendor/form2js.js b/_assets/js/vendor/form2js.js new file mode 100644 index 00000000..2614c194 --- /dev/null +++ b/_assets/js/vendor/form2js.js @@ -0,0 +1,356 @@ +/** + * Copyright (c) 2010 Maxim Vasiliev + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author Maxim Vasiliev + * Date: 09.09.2010 + * Time: 19:02:33 + */ + + +(function (root, factory) +{ + if (typeof exports !== 'undefined' && typeof module !== 'undefined' && module.exports) { + // NodeJS + module.exports = factory(); + } + else if (typeof define === 'function' && define.amd) + { + // AMD. Register as an anonymous module. + define(factory); + } + else + { + // Browser globals + root.form2js = factory(); + } +}(this, function () +{ + "use strict"; + + /** + * Returns form values represented as Javascript object + * "name" attribute defines structure of resulting object + * + * @param rootNode {Element|String} root form element (or it's id) or array of root elements + * @param delimiter {String} structure parts delimiter defaults to '.' + * @param skipEmpty {Boolean} should skip empty text values, defaults to true + * @param nodeCallback {Function} custom function to get node value + * @param useIdIfEmptyName {Boolean} if true value of id attribute of field will be used if name of field is empty + */ + function form2js(rootNode, delimiter, skipEmpty, nodeCallback, useIdIfEmptyName, getDisabled) + { + getDisabled = getDisabled ? true : false; + if (typeof skipEmpty == 'undefined' || skipEmpty == null) skipEmpty = true; + if (typeof delimiter == 'undefined' || delimiter == null) delimiter = '.'; + if (arguments.length < 5) useIdIfEmptyName = false; + + rootNode = typeof rootNode == 'string' ? document.getElementById(rootNode) : rootNode; + + var formValues = [], + currNode, + i = 0; + + /* If rootNode is array - combine values */ + if (rootNode.constructor == Array || (typeof NodeList != "undefined" && rootNode.constructor == NodeList)) + { + while(currNode = rootNode[i++]) + { + formValues = formValues.concat(getFormValues(currNode, nodeCallback, useIdIfEmptyName, getDisabled)); + } + } + else + { + formValues = getFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled); + } + + return processNameValues(formValues, skipEmpty, delimiter); + } + + /** + * Processes collection of { name: 'name', value: 'value' } objects. + * @param nameValues + * @param skipEmpty if true skips elements with value == '' or value == null + * @param delimiter + */ + function processNameValues(nameValues, skipEmpty, delimiter) + { + var result = {}, + arrays = {}, + i, j, k, l, + value, + nameParts, + currResult, + arrNameFull, + arrName, + arrIdx, + namePart, + name, + _nameParts; + + for (i = 0; i < nameValues.length; i++) + { + value = nameValues[i].value; + + if (skipEmpty && (value === '' || value === null)) continue; + + name = nameValues[i].name; + _nameParts = name.split(delimiter); + nameParts = []; + currResult = result; + arrNameFull = ''; + + for(j = 0; j < _nameParts.length; j++) + { + namePart = _nameParts[j].split(']['); + if (namePart.length > 1) + { + for(k = 0; k < namePart.length; k++) + { + if (k == 0) + { + namePart[k] = namePart[k] + ']'; + } + else if (k == namePart.length - 1) + { + namePart[k] = '[' + namePart[k]; + } + else + { + namePart[k] = '[' + namePart[k] + ']'; + } + + arrIdx = namePart[k].match(/([a-z_]+)?\[([a-z_][a-z0-9_]+?)\]/i); + if (arrIdx) + { + for(l = 1; l < arrIdx.length; l++) + { + if (arrIdx[l]) nameParts.push(arrIdx[l]); + } + } + else{ + nameParts.push(namePart[k]); + } + } + } + else + nameParts = nameParts.concat(namePart); + } + + for (j = 0; j < nameParts.length; j++) + { + namePart = nameParts[j]; + + if (namePart.indexOf('[]') > -1 && j == nameParts.length - 1) + { + arrName = namePart.substr(0, namePart.indexOf('[')); + arrNameFull += arrName; + + if (!currResult[arrName]) currResult[arrName] = []; + currResult[arrName].push(value); + } + else if (namePart.indexOf('[') > -1) + { + arrName = namePart.substr(0, namePart.indexOf('[')); + arrIdx = namePart.replace(/(^([a-z_]+)?\[)|(\]$)/gi, ''); + + /* Unique array name */ + arrNameFull += '_' + arrName + '_' + arrIdx; + + /* + * Because arrIdx in field name can be not zero-based and step can be + * other than 1, we can't use them in target array directly. + * Instead we're making a hash where key is arrIdx and value is a reference to + * added array element + */ + + if (!arrays[arrNameFull]) arrays[arrNameFull] = {}; + if (arrName != '' && !currResult[arrName]) currResult[arrName] = []; + + if (j == nameParts.length - 1) + { + if (arrName == '') + { + currResult.push(value); + arrays[arrNameFull][arrIdx] = convertValue(currResult[currResult.length - 1]); + } + else + { + currResult[arrName].push(value); + arrays[arrNameFull][arrIdx] = convertValue(currResult[arrName][currResult[arrName].length - 1]); + } + } + else + { + if (!arrays[arrNameFull][arrIdx]) + { + if ((/^[0-9a-z_]+\[?/i).test(nameParts[j+1])) currResult[arrName].push({}); + else currResult[arrName].push([]); + + arrays[arrNameFull][arrIdx] = convertValue(currResult[arrName][currResult[arrName].length - 1]); + } + } + + currResult = convertValue(arrays[arrNameFull][arrIdx]); + } + else + { + arrNameFull += namePart; + + if (j < nameParts.length - 1) /* Not the last part of name - means object */ + { + if (!currResult[namePart]) currResult[namePart] = {}; + currResult = convertValue(currResult[namePart]); + } + else + { + currResult[namePart] = convertValue(value); + } + } + } + } + + return result; + } + + function convertValue(value) { + if (value == "true") return true; + if (value == "false") return false; + if (!isNaN(value)) return parseInt(value); + return value; + } + + function getFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled) + { + var result = extractNodeValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled); + return result.length > 0 ? result : getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled); + } + + function getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled) + { + var result = [], + currentNode = rootNode.firstChild; + + while (currentNode) + { + result = result.concat(extractNodeValues(currentNode, nodeCallback, useIdIfEmptyName, getDisabled)); + currentNode = currentNode.nextSibling; + } + + return result; + } + + function extractNodeValues(node, nodeCallback, useIdIfEmptyName, getDisabled) { + if (node.disabled && !getDisabled) return []; + + var callbackResult, fieldValue, result, fieldName = getFieldName(node, useIdIfEmptyName); + + callbackResult = nodeCallback && nodeCallback(node); + + if (callbackResult && callbackResult.name) { + result = [callbackResult]; + } + else if (fieldName != '' && node.nodeName.match(/INPUT|TEXTAREA/i)) { + fieldValue = getFieldValue(node, getDisabled); + if (null === fieldValue) { + result = []; + } else { + result = [ { name: fieldName, value: fieldValue} ]; + } + } + else if (fieldName != '' && node.nodeName.match(/SELECT/i)) { + fieldValue = getFieldValue(node, getDisabled); + result = [ { name: fieldName.replace(/\[\]$/, ''), value: fieldValue } ]; + } + else { + result = getSubFormValues(node, nodeCallback, useIdIfEmptyName, getDisabled); + } + + return result; + } + + function getFieldName(node, useIdIfEmptyName) + { + if (node.name && node.name != '') return node.name; + else if (useIdIfEmptyName && node.id && node.id != '') return node.id; + else return ''; + } + + + function getFieldValue(fieldNode, getDisabled) + { + if (fieldNode.disabled && !getDisabled) return null; + + switch (fieldNode.nodeName) { + case 'INPUT': + case 'TEXTAREA': + switch (fieldNode.type.toLowerCase()) { + case 'radio': + if (fieldNode.checked && fieldNode.value === "false") return false; + case 'checkbox': + if (fieldNode.checked && fieldNode.value === "true") return true; + if (!fieldNode.checked && fieldNode.value === "true") return false; + if (fieldNode.checked) return fieldNode.value; + break; + + case 'button': + case 'reset': + case 'submit': + case 'image': + return ''; + break; + + default: + return fieldNode.value; + break; + } + break; + + case 'SELECT': + return getSelectedOptionValue(fieldNode); + break; + + default: + break; + } + + return null; + } + + function getSelectedOptionValue(selectNode) + { + var multiple = selectNode.multiple, + result = [], + options, + i, l; + + if (!multiple) return selectNode.value; + + for (options = selectNode.getElementsByTagName("option"), i = 0, l = options.length; i < l; i++) + { + if (options[i].selected) result.push(options[i].value); + } + + return result; + } + + return form2js; + +})); diff --git a/_assets/templates/base.tmpl b/_assets/templates/base.tmpl new file mode 100644 index 00000000..85b9a3ef --- /dev/null +++ b/_assets/templates/base.tmpl @@ -0,0 +1,289 @@ + + +{{ $absURL := .Config.AbsoluteURL }} + + {{.Name}} + + + + + + {{- if ne .User.StyleSheet "" -}} + + {{- end -}} + + + + {{- if .IsDir }} + + {{- else }} + + + + {{- end }} + + +
        +
        +

        File Manager

        + + +
        + exit_to_app +
        +
        + +
        +
        + {{- if ne .Name "/"}} + + {{- end }} + + {{ if ne .Name "/"}}

        {{ .Name }}

        {{ end }} +
        + +
        + {{- if and (not .IsDir) (.User.AllowEdit) }} + {{- if .Editor}} + + {{- if eq .Data.Mode "markdown" }} +
        + remove_red_eye +
        + {{- end }} + + {{- if eq .Data.Visual true }} +
        + code +
        + {{- end }} + {{- end }} + +
        + save +
        + {{- end }} + + {{- if .IsDir }} +
        + open_in_new + See raw +
        + {{- end }} + + {{- if and (.User.AllowEdit) (.IsDir) }} +
        + forward + Move file +
        + {{- end }} + + {{- if and .IsDir .User.AllowEdit }} +
        + mode_edit +
        + {{- end }} + + {{- if and .User.AllowEdit .IsDir }} +
        + deleteDelete +
        + {{- end }} +
        + +
        + more_vert +
        + +
        + {{- if .IsDir }} +
        + {{- if eq .Display "mosaic" }} + + view_listSwitch view + + {{- else }} + + view_moduleSwitch view + + {{- end }} +
        + +
        + check_circleSelect +
        + {{- end }} + + {{- if and (.User.AllowNew) (.IsDir) }} +
        + file_uploadUpload +
        + {{- end }} + + {{- if not .IsDir }} +
        + open_in_new + See raw +
        + {{- end }} + + {{- if and .User.AllowEdit (not .IsDir) }} +
        + deleteDelete +
        + {{- end }} + +
        + {{- if not .IsDir}}{{ end }} + file_downloadDownload + {{- if not .IsDir}}{{ end }} + + {{- if .IsDir }} + + {{- end }} +
        + +
        + infoInfo +
        +
        +
        + +
        +
        + +
        +

        Multiple selection enabled

        +
        + clear +
        +
        + +
        + {{- template "content" . }} +
        + +
        + + {{- if and (.User.AllowNew) (.IsDir) }} +
        +
        + add +
        +
        + {{- end }} + + + + + + + + + +
        +

        Help

        + +
          +
        • F1 - this information
        • +
        • F2 - rename file
        • +
        • DEL - delete selected items
        • +
        • ESC - clear selection and/or close the prompt
        • +
        • CTRL + S - save a file or download the directory where you are
        • +
        • CTRL + Click - select multiple files or directories
        • +
        • Double click - open a file or directory
        • +
        • Click - select file or directory
        • +
        + +

        Not available yet

        + +
          +
        • Alt + Click - select a group of files
        • +
        + +
        + +
        +
        + + + + diff --git a/_assets/templates/editor.tmpl b/_assets/templates/editor.tmpl new file mode 100644 index 00000000..d02238d8 --- /dev/null +++ b/_assets/templates/editor.tmpl @@ -0,0 +1,57 @@ +{{ define "content" }} +{{- with .Data }} +
        + {{- if or (eq .Class "frontmatter-only") (eq .Class "complete") }} + {{- if (eq .Class "complete")}} +

        Metadata

        + {{- end }} +
        + {{- template "blocks" .FrontMatter.Content }} +
        Add field
        +
        + {{- end }} + + {{ if or (eq .Class "content-only") (eq .Class "complete") }} + {{ if (eq .Class "complete")}} +

        Body

        + {{ end }} +
        +
        + +
        + {{ end }} +
        +{{- end }} + + + + + + +{{ end }} diff --git a/_assets/templates/frontmatter.tmpl b/_assets/templates/frontmatter.tmpl new file mode 100644 index 00000000..3389da90 --- /dev/null +++ b/_assets/templates/frontmatter.tmpl @@ -0,0 +1,56 @@ +{{ define "blocks" }} +{{ if .Fields }}
        {{ end }} +{{- range $key, $value := .Fields }} + {{- if eq $value.Parent.Type "array" }} +
        + {{- template "value" $value }} +
        + close +
        +
        + {{- else }} +
        + + {{ template "value" $value }} +
        + close +
        +
        + {{- end }} +{{- end }} +{{- if .Fields }}
        {{ end }} + +{{- range $key, $value := .Arrays }} +{{- template "fielset" $value }} +{{- end }} + +{{- range $key, $value := .Objects }} +{{- template "fielset" $value }} +{{- end }} + +{{ end }} + +{{ define "value" }} +{{- if eq .HTMLType "textarea" }} + +{{- else if eq .HTMLType "datetime" }} + +{{- else }} + +{{- end }} +{{ end }} + +{{ define "fielset" }} +
        + {{- if not (eq .Title "") }} +

        {{ .Name }}

        + {{- end }} +
        + add +
        +
        + close +
        + {{- template "blocks" .Content }} +
        +{{ end }} diff --git a/_assets/templates/listing.tmpl b/_assets/templates/listing.tmpl new file mode 100644 index 00000000..da94b962 --- /dev/null +++ b/_assets/templates/listing.tmpl @@ -0,0 +1,103 @@ +{{ define "content" }} +
        +{{- with .Data -}} +
        +
        +
        +
        +

        Name + {{- if eq .Sort "name" -}} + {{- if eq .Order "asc" -}} + arrow_downward + {{- else -}} + arrow_upward + {{- end -}} + {{- else -}} + arrow_downward + {{- end -}} +

        +

        File Size + {{- if eq .Sort "size" -}} + {{- if eq .Order "asc" -}} + arrow_downward + {{- else -}} + arrow_upward + {{- end -}} + {{- else -}} + arrow_downward + {{- end -}} +

        +

        Last modified

        +
        +
        +
        + + {{ if and (eq .NumDirs 0) (eq .NumFiles 0) }} +

        It feels lonely here :'(

        + {{ end }} + + {{- if not (eq .NumDirs 0)}} +

        Folders

        +
        + {{- range .Items }} + {{- if (.IsDir) }} + {{ template "item" .}} + {{- end }} + {{- end }} +
        + {{- end }} + + {{- if not (eq .NumFiles 0)}} +

        Files

        +
        + {{- range .Items }} + {{- if (not .IsDir) }} + {{ template "item" .}} + {{- end }} + {{- end }} +
        + {{- end }} +
        + + +{{- end -}} +{{- end -}} + +{{ define "item" }} +
        +
        + {{- if .IsDir}} + folder + {{- else}} + {{ if eq .Type "image" }} + insert_photo + {{ else if eq .Type "audio" }} + volume_up + {{ else if eq .Type "video" }} + movie + {{ else }} + insert_drive_file + {{ end }} + {{- end}} +
        +
        +

        {{.Name}}

        + {{- if .IsDir}} +

        + {{- else}} +

        {{.HumanSize}}

        + {{- end}} +

        + +

        +
        +
        +{{ end }} diff --git a/_assets/templates/minimal.tmpl b/_assets/templates/minimal.tmpl new file mode 100644 index 00000000..66e0068d --- /dev/null +++ b/_assets/templates/minimal.tmpl @@ -0,0 +1 @@ +{{ template "content" . }} diff --git a/_assets/templates/single.tmpl b/_assets/templates/single.tmpl new file mode 100644 index 00000000..c85ab5a4 --- /dev/null +++ b/_assets/templates/single.tmpl @@ -0,0 +1,23 @@ +{{ define "content" }} +{{ with .Data}} +
        + {{ if eq .Type "image" }} +
        + {{ else if eq .Type "audio" }} + + {{ else if eq .Type "video" }} + + {{ else if eq .Extension ".pdf" }} + + {{ else if eq .Type "blob" }} +

        Download file_download

        + {{ else}} +
        {{ .StringifyContent }}
        + {{ end }} +
        +{{ end }} +{{ end }} diff --git a/cmd/filemanager/main.go b/cmd/filemanager/main.go new file mode 100644 index 00000000..bb0f3407 --- /dev/null +++ b/cmd/filemanager/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "log" + "net/http" + + "github.com/hacdias/filemanager" +) + + +var m *filemanager.FileManager + +func handler(w http.ResponseWriter, r *http.Request) { + _, err := m.ServeHTTP(w, r) + if err != nil { + log.Print(err) + } +} + +func main() { + m = filemanager.New() + http.HandleFunc("/", handler) + http.ListenAndServe(":8080", nil) +} \ No newline at end of file diff --git a/filemanager.go b/filemanager.go index f65c3362..022bc9ab 100644 --- a/filemanager.go +++ b/filemanager.go @@ -49,10 +49,10 @@ type User struct { // Assets are the static and front-end assets, such as JS, CSS and HTML templates. type Assets struct { - requiredJS rice.Box // JS that is always required to have in order to be usable. - Templates rice.Box - CSS rice.Box - JS rice.Box + requiredJS *rice.Box // JS that is always required to have in order to be usable. + Templates *rice.Box + CSS *rice.Box + JS *rice.Box } // Rule is a dissalow/allow rule. @@ -66,16 +66,65 @@ type Rule struct { // CommandFunc ... type CommandFunc func(r *http.Request, c *FileManager, u *User) error -// AbsoluteURL ... +func New() *FileManager { + m := &FileManager{ + User: &User{ + AllowCommands: true, + AllowEdit: true, + AllowNew: true, + Commands: []string{"git", "svn", "hg"}, + Rules: []*Rule{{ + Regex: true, + Allow: false, + Regexp: regexp.MustCompile("\\/\\..+"), + }}, + }, + Users: map[string]*User{}, + BeforeSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, + AfterSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, + Assets: &Assets{ + Templates: rice.MustFindBox("./_assets/templates"), + CSS: rice.MustFindBox("./_assets/css"), + requiredJS: rice.MustFindBox("./_assets/js"), + }, + } + + m.SetScope(".") + m.SetBaseURL("/") + m.SetWebDavURL("/webdav") + + return m +} + func (m FileManager) AbsoluteURL() string { return m.PrefixURL + m.BaseURL } -// AbsoluteWebdavURL ... func (m FileManager) AbsoluteWebdavURL() string { return m.PrefixURL + m.WebDavURL } +func (m *FileManager) SetBaseURL(url string) { + url = strings.TrimPrefix(url, "/") + url = strings.TrimSuffix(url, "/") + url = "/" + url + m.BaseURL = strings.TrimSuffix(url, "/") +} + +func (m *FileManager) SetWebDavURL(url string) { + m.WebDavURL = m.BaseURL + "/" + strings.TrimPrefix(url, "/") + m.User.Handler = &webdav.Handler{ + Prefix: m.WebDavURL, + FileSystem: m.FileSystem, + LockSystem: webdav.NewMemLS(), + } +} + +func (u *User) SetScope(scope string) { + u.Scope = strings.TrimSuffix(scope, "/") + u.FileSystem = webdav.Dir(u.Scope) +} + // Allowed checks if the user has permission to access a directory/file. func (u User) Allowed(url string) bool { var rule *Rule diff --git a/http.go b/http.go index cfe4b852..faa6c140 100644 --- a/http.go +++ b/http.go @@ -6,10 +6,15 @@ import ( "os" "path/filepath" "strings" - - "github.com/mholt/caddy/caddyhttp/httpserver" ) +func matchURL(first, second string) bool { + first = strings.ToLower(first) + second = strings.ToLower(second) + + return strings.HasPrefix(first, second) +} + // ServeHTTP determines if the request is for this plugin, and if all prerequisites are met. func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { var ( @@ -21,7 +26,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er // Checks if the URL matches the Assets URL. Returns the asset if the // method is GET and Status Forbidden otherwise. - if httpserver.Path(r.URL.Path).Matches(c.BaseURL + AssetsURL) { + if matchURL(r.URL.Path, c.BaseURL+AssetsURL) { if r.Method == http.MethodGet { return serveAssets(w, r, c) } @@ -37,7 +42,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er } // Checks if the request URL is for the WebDav server - if httpserver.Path(r.URL.Path).Matches(c.WebDavURL) { + if matchURL(r.URL.Path, c.WebDavURL) { // Checks for user permissions relatively to this PATH if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.WebDavURL)) { return http.StatusForbidden, nil diff --git a/http_assets.go b/http_assets.go index b15513d6..8cf5e564 100644 --- a/http_assets.go +++ b/http_assets.go @@ -9,7 +9,7 @@ import ( ) // AssetsURL is the url of the assets -const AssetsURL = "/_filemanagerinternal" +const AssetsURL = "/_internal" // Serve provides the needed assets for the front-end func serveAssets(w http.ResponseWriter, r *http.Request, m *FileManager) (int, error) { @@ -27,8 +27,13 @@ func serveAssets(w http.ResponseWriter, r *http.Request, m *FileManager) (int, e filename = strings.Replace(filename, "/js/", "", 1) file, err = m.Assets.requiredJS.Bytes(filename) case strings.HasPrefix(filename, "/vendor"): - filename = strings.Replace(filename, "/vendor/", "", 1) - file, err = m.Assets.JS.Bytes(filename) + if m.Assets.JS != nil { + filename = strings.Replace(filename, "/vendor/", "", 1) + file, err = m.Assets.JS.Bytes(filename) + break + } + + fallthrough default: err = errors.New("not found") } diff --git a/info.go b/info.go index 741f03bd..b828476c 100644 --- a/info.go +++ b/info.go @@ -77,7 +77,7 @@ var textExtensions = [...]string{ // RetrieveFileType obtains the mimetype and a simplified internal Type // using the first 512 bytes from the file. -func (i FileInfo) RetrieveFileType() error { +func (i *FileInfo) RetrieveFileType() error { i.Mimetype = mime.TypeByExtension(i.Extension) if i.Mimetype == "" { @@ -128,7 +128,7 @@ func (i FileInfo) RetrieveFileType() error { } // Reads the file. -func (i FileInfo) Read() error { +func (i *FileInfo) Read() error { if len(i.content) != 0 { return nil } From 3a941e4165501f583066d566b98320184033b802 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 09:59:08 +0100 Subject: [PATCH 14/40] travis Former-commit-id: 5c5fe0102b82e1437590033ffd725facec589675 --- .travis.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..b0415ea0 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,13 @@ +language: go + +go: + - tip + +install: + - go get -u -v $(go list -f '{{join .Imports "\n"}}' ./... | sort | uniq | grep -v filemanager) + - go get -u -v github.com/mholt/caddy/caddyhttp + - go get github.com/gordonklaus/ineffassign + +script: + - go build github.com/hacdias/filemanager + - ineffassign . \ No newline at end of file From a692abba9e83e43a18e8d4101d463bfbcc0a5dee Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 10:02:16 +0100 Subject: [PATCH 15/40] gofmt Former-commit-id: a3c30e013894ae4f8ea8faff06127055eef2c977 --- README.md | 4 ++++ cmd/filemanager/main.go | 3 +-- frontmatter/runes_test.go | 16 ++++++++-------- variables/types_test.go | 38 +++++++++++++++++++------------------- 4 files changed, 32 insertions(+), 29 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..f483904e --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# filemanager + +[![Build](https://img.shields.io/travis/hacdias/filemanager.svg?style=flat-square)](https://travis-ci.org/hacdias/filemanager) +[![Go Report Card](https://goreportcard.com/badge/github.com/hacdias/filemanager?style=flat-square)](https://goreportcard.com/report/hacdias/filemanager) diff --git a/cmd/filemanager/main.go b/cmd/filemanager/main.go index bb0f3407..f5ad1ac6 100644 --- a/cmd/filemanager/main.go +++ b/cmd/filemanager/main.go @@ -7,7 +7,6 @@ import ( "github.com/hacdias/filemanager" ) - var m *filemanager.FileManager func handler(w http.ResponseWriter, r *http.Request) { @@ -21,4 +20,4 @@ func main() { m = filemanager.New() http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) -} \ No newline at end of file +} diff --git a/frontmatter/runes_test.go b/frontmatter/runes_test.go index 6d120948..c8abc066 100644 --- a/frontmatter/runes_test.go +++ b/frontmatter/runes_test.go @@ -8,43 +8,43 @@ type hasRuneTest struct { } var testHasRune = []hasRuneTest{ - hasRuneTest{ + { File: []byte(`--- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed auctor libero eget ante fermentum commodo. ---`), Return: true, }, - hasRuneTest{ + { File: []byte(`+++ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed auctor libero eget ante fermentum commodo. +++`), Return: true, }, - hasRuneTest{ + { File: []byte(`{ "json": "Lorem ipsum dolor sit amet" }`), Return: true, }, - hasRuneTest{ + { File: []byte(`+`), Return: false, }, - hasRuneTest{ + { File: []byte(`++`), Return: false, }, - hasRuneTest{ + { File: []byte(`-`), Return: false, }, - hasRuneTest{ + { File: []byte(`--`), Return: false, }, - hasRuneTest{ + { File: []byte(`Lorem ipsum`), Return: false, }, diff --git a/variables/types_test.go b/variables/types_test.go index 9955b9b2..d2d5e37b 100644 --- a/variables/types_test.go +++ b/variables/types_test.go @@ -8,14 +8,14 @@ type interfaceToBool struct { } var testIsMap = []*interfaceToBool{ - &interfaceToBool{"teste", false}, - &interfaceToBool{453478, false}, - &interfaceToBool{-984512, false}, - &interfaceToBool{true, false}, - &interfaceToBool{map[string]bool{}, true}, - &interfaceToBool{map[int]bool{}, true}, - &interfaceToBool{map[interface{}]bool{}, true}, - &interfaceToBool{[]string{}, false}, + {"teste", false}, + {453478, false}, + {-984512, false}, + {true, false}, + {map[string]bool{}, true}, + {map[int]bool{}, true}, + {map[interface{}]bool{}, true}, + {[]string{}, false}, } func TestIsMap(t *testing.T) { @@ -27,17 +27,17 @@ func TestIsMap(t *testing.T) { } var testIsSlice = []*interfaceToBool{ - &interfaceToBool{"teste", false}, - &interfaceToBool{453478, false}, - &interfaceToBool{-984512, false}, - &interfaceToBool{true, false}, - &interfaceToBool{map[string]bool{}, false}, - &interfaceToBool{map[int]bool{}, false}, - &interfaceToBool{map[interface{}]bool{}, false}, - &interfaceToBool{[]string{}, true}, - &interfaceToBool{[]int{}, true}, - &interfaceToBool{[]bool{}, true}, - &interfaceToBool{[]interface{}{}, true}, + {"teste", false}, + {453478, false}, + {-984512, false}, + {true, false}, + {map[string]bool{}, false}, + {map[int]bool{}, false}, + {map[interface{}]bool{}, false}, + {[]string{}, true}, + {[]int{}, true}, + {[]bool{}, true}, + {[]interface{}{}, true}, } func TestIsSlice(t *testing.T) { From 36c78f7b27207e9302ad5a36d625314aab0cb934 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 10:08:43 +0100 Subject: [PATCH 16/40] add docs Former-commit-id: bf07b82e52452f2effce02f545881ab24060f9b2 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f483904e..dc54a845 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,5 @@ [![Build](https://img.shields.io/travis/hacdias/filemanager.svg?style=flat-square)](https://travis-ci.org/hacdias/filemanager) [![Go Report Card](https://goreportcard.com/badge/github.com/hacdias/filemanager?style=flat-square)](https://goreportcard.com/report/hacdias/filemanager) +[![Documentation](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/hacdias/filemanager) +[![Sourcegraph](https://img.shields.io/sourcegraph/rrc//github.com/hacdias/filemanager.svg?style=flat-square)](https://sourcegraph.com/github.com/hacdias/filemanager) From f3c8ea21e68809b7f65633e96fc5caf744aef321 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 10:09:39 +0100 Subject: [PATCH 17/40] change badge style Former-commit-id: bcb8f091c693b12b71d8a7d2fa53fcb2d6bbaa7a --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dc54a845..3f2fb54b 100644 --- a/README.md +++ b/README.md @@ -2,5 +2,5 @@ [![Build](https://img.shields.io/travis/hacdias/filemanager.svg?style=flat-square)](https://travis-ci.org/hacdias/filemanager) [![Go Report Card](https://goreportcard.com/badge/github.com/hacdias/filemanager?style=flat-square)](https://goreportcard.com/report/hacdias/filemanager) -[![Documentation](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/hacdias/filemanager) +[![Documentation](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square)](http://godoc.org/github.com/hacdias/filemanager) [![Sourcegraph](https://img.shields.io/sourcegraph/rrc//github.com/hacdias/filemanager.svg?style=flat-square)](https://sourcegraph.com/github.com/hacdias/filemanager) From 5ed05270927d8eb8afeb1909c36bb72282f4dd20 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 10:52:34 +0100 Subject: [PATCH 18/40] update comments and unexport some fields Former-commit-id: 716d6d7e7a1e3c676dbc4a56d1576eee1aabb0a3 --- _assets/templates/base.tmpl | 2 +- filemanager.go | 93 +++++++++++++++++++++++++------------ http.go | 4 +- http_command.go | 2 +- http_listing.go | 2 +- http_search.go | 2 +- info.go | 2 +- listing.go | 2 +- 8 files changed, 71 insertions(+), 38 deletions(-) diff --git a/_assets/templates/base.tmpl b/_assets/templates/base.tmpl index 85b9a3ef..579e01bd 100644 --- a/_assets/templates/base.tmpl +++ b/_assets/templates/base.tmpl @@ -14,7 +14,7 @@ diff --git a/filemanager.go b/filemanager.go index 022bc9ab..4cc00080 100644 --- a/filemanager.go +++ b/filemanager.go @@ -11,44 +11,59 @@ import ( // FileManager is a file manager instance. type FileManager struct { - *User `json:"-"` - Assets *Assets `json:"-"` + *User + Assets *assets // PrefixURL is a part of the URL that is trimmed from the http.Request.URL before // it arrives to our handlers. It may be useful when using FileManager as a middleware - // such as in caddy-filemanager plugin. + // such as in caddy-filemanager plugin. It musn't end with a trailing slash. PrefixURL string - // BaseURL is the path where the GUI will be accessible. + // BaseURL is the path where the GUI will be accessible. It musn't end with + // a trailing slash and mustn't contain PrefixURL, if set. BaseURL string - // WebDavURL is the path where the WebDAV will be accessible. It can be set to "/" - // in order to override the GUI and only use the WebDAV. + // WebDavURL is the path where the WebDAV will be accessible. It can be set to "" + // in order to override the GUI and only use the WebDAV. It musn't end with + // a trailing slash. WebDavURL string // Users is a map with the different configurations for each user. - Users map[string]*User `json:"-"` + Users map[string]*User // TODO: event-based? - BeforeSave CommandFunc `json:"-"` - AfterSave CommandFunc `json:"-"` + BeforeSave CommandFunc + AfterSave CommandFunc } // User contains the configuration for each user. type User struct { - Scope string `json:"-"` // Path the user have access - FileSystem webdav.FileSystem `json:"-"` // The virtual file system the user have access - Handler *webdav.Handler `json:"-"` // The WebDav HTTP Handler - Rules []*Rule `json:"-"` // Access rules - StyleSheet string `json:"-"` // Costum stylesheet - AllowNew bool // Can create files and folders - AllowEdit bool // Can edit/rename files - AllowCommands bool // Can execute commands - Commands []string // Available Commands + // scope is the physical path the user has access to. + scope string + + // fileSystem is the virtual file system the user has access. + fileSystem webdav.FileSystem + + // handler handles incoming requests to the WebDAV backend. + handler *webdav.Handler + + // Rules is an array of access and deny rules. + Rules []*Rule `json:"-"` + + // TODO: this MUST be done in another way + StyleSheet string `json:"-"` + + // These indicate if the user can perform certain actions. + AllowNew bool // Create files and folders + AllowEdit bool // Edit/rename files + AllowCommands bool // Execute commands + + // Commands is the list of commands the user can execute. + Commands []string } -// Assets are the static and front-end assets, such as JS, CSS and HTML templates. -type Assets struct { +// assets are the static and front-end assets, such as JS, CSS and HTML templates. +type assets struct { requiredJS *rice.Box // JS that is always required to have in order to be usable. Templates *rice.Box CSS *rice.Box @@ -57,9 +72,16 @@ type Assets struct { // Rule is a dissalow/allow rule. type Rule struct { - Regex bool - Allow bool - Path string + // Regex indicates if this rule uses Regular Expressions or not. + Regex bool + + // Allow indicates if this is an allow rule. Set 'false' to be a disallow rule. + Allow bool + + // Path is the corresponding URL path for this rule. + Path string + + // Regexp is the regular expression. Only use this when 'Regex' was set to true. Regexp *regexp.Regexp } @@ -82,7 +104,7 @@ func New() *FileManager { Users: map[string]*User{}, BeforeSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, AfterSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, - Assets: &Assets{ + Assets: &assets{ Templates: rice.MustFindBox("./_assets/templates"), CSS: rice.MustFindBox("./_assets/css"), requiredJS: rice.MustFindBox("./_assets/js"), @@ -96,14 +118,20 @@ func New() *FileManager { return m } +// AbsoluteURL returns the actual URL where +// File Manager interface can be accessed. func (m FileManager) AbsoluteURL() string { return m.PrefixURL + m.BaseURL } -func (m FileManager) AbsoluteWebdavURL() string { +// AbsoluteWebDavURL returns the actual URL +// where WebDAV can be accessed. +func (m FileManager) AbsoluteWebDavURL() string { return m.PrefixURL + m.WebDavURL } +// SetBaseURL updates the BaseURL of a File Manager +// object. func (m *FileManager) SetBaseURL(url string) { url = strings.TrimPrefix(url, "/") url = strings.TrimSuffix(url, "/") @@ -111,18 +139,23 @@ func (m *FileManager) SetBaseURL(url string) { m.BaseURL = strings.TrimSuffix(url, "/") } +// SetWebDavURL updates the WebDavURL of a File Manager +// object and updates it's main handler. func (m *FileManager) SetWebDavURL(url string) { - m.WebDavURL = m.BaseURL + "/" + strings.TrimPrefix(url, "/") - m.User.Handler = &webdav.Handler{ + url = strings.TrimPrefix(url, "/") + url = strings.TrimSuffix(url, "/") + + m.WebDavURL = m.BaseURL + "/" + url + m.User.handler = &webdav.Handler{ Prefix: m.WebDavURL, - FileSystem: m.FileSystem, + FileSystem: m.fileSystem, LockSystem: webdav.NewMemLS(), } } func (u *User) SetScope(scope string) { - u.Scope = strings.TrimSuffix(scope, "/") - u.FileSystem = webdav.Dir(u.Scope) + u.scope = strings.TrimSuffix(scope, "/") + u.fileSystem = webdav.Dir(u.scope) } // Allowed checks if the user has permission to access a directory/file. diff --git a/http.go b/http.go index faa6c140..e1e870d5 100644 --- a/http.go +++ b/http.go @@ -59,7 +59,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er // It was decided on https://github.com/hacdias/caddy-filemanager/issues/85 // that GET, for collections, will return the same as PROPFIND method. path := strings.Replace(r.URL.Path, c.WebDavURL, "", 1) - path = user.Scope + "/" + path + path = user.scope + "/" + path path = filepath.Clean(path) var i os.FileInfo @@ -97,7 +97,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er } } - c.Handler.ServeHTTP(w, r) + c.handler.ServeHTTP(w, r) if err = c.AfterSave(r, c, user); err != nil { return http.StatusInternalServerError, err } diff --git a/http_command.go b/http_command.go index eea6fa48..e95071b7 100644 --- a/http_command.go +++ b/http_command.go @@ -77,7 +77,7 @@ func command(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (i } // Gets the path and initializes a buffer. - path := strings.Replace(r.URL.Path, c.BaseURL, c.Scope, 1) + path := strings.Replace(r.URL.Path, c.BaseURL, c.scope, 1) path = filepath.Clean(path) buff := new(bytes.Buffer) diff --git a/http_listing.go b/http_listing.go index c4ea51b1..5b2a663b 100644 --- a/http_listing.go +++ b/http_listing.go @@ -20,7 +20,7 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *Use } listing.Context = httpserver.Context{ - Root: http.Dir(u.Scope), + Root: http.Dir(u.scope), Req: r, URL: r.URL, } diff --git a/http_search.go b/http_search.go index e35918c8..5cf27699 100644 --- a/http_search.go +++ b/http_search.go @@ -74,7 +74,7 @@ func search(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (in scope := strings.Replace(r.URL.Path, c.BaseURL, "", 1) scope = strings.TrimPrefix(scope, "/") scope = "/" + scope - scope = u.Scope + scope + scope = u.scope + scope scope = strings.Replace(scope, "\\", "/", -1) scope = filepath.Clean(scope) diff --git a/info.go b/info.go index b828476c..335ccbc3 100644 --- a/info.go +++ b/info.go @@ -41,7 +41,7 @@ func GetInfo(url *url.URL, c *FileManager, u *User) (*FileInfo, error) { i.VirtualPath = strings.TrimPrefix(i.VirtualPath, "/") i.VirtualPath = "/" + i.VirtualPath - i.Path = u.Scope + i.VirtualPath + i.Path = u.scope + i.VirtualPath i.Path = filepath.Clean(i.Path) info, err := os.Stat(i.Path) diff --git a/listing.go b/listing.go index b272c2af..5cb0d878 100644 --- a/listing.go +++ b/listing.go @@ -36,7 +36,7 @@ type Listing struct { func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { // Gets the directory information using the Virtual File System of // the user configuration. - file, err := u.FileSystem.OpenFile(context.TODO(), filePath, os.O_RDONLY, 0) + file, err := u.fileSystem.OpenFile(context.TODO(), filePath, os.O_RDONLY, 0) if err != nil { return nil, err } From 7ba14ada7bc7a3f4335a4f9725d54c1113097244 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 11:21:42 +0100 Subject: [PATCH 19/40] updates Former-commit-id: 761f6a6e3040a710fa1e5cb8318f75d12afa9daa --- filemanager.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/filemanager.go b/filemanager.go index 4cc00080..6343d7e5 100644 --- a/filemanager.go +++ b/filemanager.go @@ -28,6 +28,8 @@ type FileManager struct { // a trailing slash. WebDavURL string + scopes map[string]*scope + // Users is a map with the different configurations for each user. Users map[string]*User @@ -36,10 +38,16 @@ type FileManager struct { AfterSave CommandFunc } +type scope struct { + path string + fileSystem webdav.FileSystem + handler *webdav.Handler +} + // User contains the configuration for each user. type User struct { // scope is the physical path the user has access to. - scope string + scope *scope // fileSystem is the virtual file system the user has access. fileSystem webdav.FileSystem @@ -153,9 +161,10 @@ func (m *FileManager) SetWebDavURL(url string) { } } -func (u *User) SetScope(scope string) { - u.scope = strings.TrimSuffix(scope, "/") - u.fileSystem = webdav.Dir(u.scope) +// SetScope updates a user scope and its virtual file system. +func (m *FileManager) SetScope(scope string, user string) { + m.scope = strings.TrimSuffix(scope, "/") + m.fileSystem = webdav.Dir(m.scope) } // Allowed checks if the user has permission to access a directory/file. From 00be335a7c17e84f0219d32e2476cfee6ada7614 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 11:40:23 +0100 Subject: [PATCH 20/40] unexport user Former-commit-id: 2ee4d9622c110533cdcdaa45383b694a3223fe02 --- filemanager.go | 79 +++++++++++++++++++++++++++++++++---------------- http.go | 4 +-- http_command.go | 2 +- http_listing.go | 2 +- http_put.go | 2 +- http_search.go | 2 +- http_single.go | 2 +- info.go | 2 +- listing.go | 2 +- page.go | 2 +- 10 files changed, 64 insertions(+), 35 deletions(-) diff --git a/filemanager.go b/filemanager.go index 6343d7e5..0be50ccf 100644 --- a/filemanager.go +++ b/filemanager.go @@ -1,6 +1,7 @@ package filemanager import ( + "errors" "net/http" "regexp" "strings" @@ -11,7 +12,7 @@ import ( // FileManager is a file manager instance. type FileManager struct { - *User + *user Assets *assets // PrefixURL is a part of the URL that is trimmed from the http.Request.URL before @@ -28,26 +29,18 @@ type FileManager struct { // a trailing slash. WebDavURL string - scopes map[string]*scope - // Users is a map with the different configurations for each user. - Users map[string]*User + Users map[string]*user // TODO: event-based? BeforeSave CommandFunc AfterSave CommandFunc } -type scope struct { - path string - fileSystem webdav.FileSystem - handler *webdav.Handler -} - -// User contains the configuration for each user. -type User struct { +// user contains the configuration for each user. +type user struct { // scope is the physical path the user has access to. - scope *scope + scope string // fileSystem is the virtual file system the user has access. fileSystem webdav.FileSystem @@ -93,12 +86,11 @@ type Rule struct { Regexp *regexp.Regexp } -// CommandFunc ... -type CommandFunc func(r *http.Request, c *FileManager, u *User) error +type CommandFunc func(r *http.Request, c *FileManager, u *user) error func New() *FileManager { m := &FileManager{ - User: &User{ + user: &user{ AllowCommands: true, AllowEdit: true, AllowNew: true, @@ -109,9 +101,9 @@ func New() *FileManager { Regexp: regexp.MustCompile("\\/\\..+"), }}, }, - Users: map[string]*User{}, - BeforeSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, - AfterSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, + Users: map[string]*user{}, + BeforeSave: func(r *http.Request, c *FileManager, u *user) error { return nil }, + AfterSave: func(r *http.Request, c *FileManager, u *user) error { return nil }, Assets: &assets{ Templates: rice.MustFindBox("./_assets/templates"), CSS: rice.MustFindBox("./_assets/css"), @@ -119,7 +111,7 @@ func New() *FileManager { }, } - m.SetScope(".") + m.SetScope(".", "") m.SetBaseURL("/") m.SetWebDavURL("/webdav") @@ -154,21 +146,58 @@ func (m *FileManager) SetWebDavURL(url string) { url = strings.TrimSuffix(url, "/") m.WebDavURL = m.BaseURL + "/" + url - m.User.handler = &webdav.Handler{ + + // update base user webdav handler + m.handler = &webdav.Handler{ Prefix: m.WebDavURL, FileSystem: m.fileSystem, LockSystem: webdav.NewMemLS(), } + + // update other users' handlers to match + // the new URL + for _, u := range m.Users { + u.handler = &webdav.Handler{ + Prefix: m.WebDavURL, + FileSystem: u.fileSystem, + LockSystem: webdav.NewMemLS(), + } + } } // SetScope updates a user scope and its virtual file system. -func (m *FileManager) SetScope(scope string, user string) { - m.scope = strings.TrimSuffix(scope, "/") - m.fileSystem = webdav.Dir(m.scope) +// If the user string is blank, it will change the base scope. +func (m *FileManager) SetScope(scope string, username string) error { + var u *user + + if username == "" { + u = m.user + } else { + var ok bool + u, ok = m.Users[username] + if !ok { + return errors.New("Inexistent user") + } + } + + u.scope = strings.TrimSuffix(scope, "/") + u.fileSystem = webdav.Dir(u.scope) + + u.handler = &webdav.Handler{ + Prefix: m.WebDavURL, + FileSystem: u.fileSystem, + LockSystem: webdav.NewMemLS(), + } + + return nil +} + +func (m *FileManager) NewUser(name string) { + } // Allowed checks if the user has permission to access a directory/file. -func (u User) Allowed(url string) bool { +func (u user) Allowed(url string) bool { var rule *Rule i := len(u.Rules) - 1 diff --git a/http.go b/http.go index e1e870d5..606f0960 100644 --- a/http.go +++ b/http.go @@ -21,7 +21,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er fi *FileInfo code int err error - user *User + user *user ) // Checks if the URL matches the Assets URL. Returns the asset if the @@ -38,7 +38,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er if _, ok := c.Users[username]; ok { user = c.Users[username] } else { - user = c.User + user = c.user } // Checks if the request URL is for the WebDav server diff --git a/http_command.go b/http_command.go index e95071b7..1124903c 100644 --- a/http_command.go +++ b/http_command.go @@ -22,7 +22,7 @@ var ( ) // command handles the requests for VCS related commands: git, svn and mercurial -func command(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (int, error) { +func command(w http.ResponseWriter, r *http.Request, c *FileManager, u *user) (int, error) { // Upgrades the connection to a websocket and checks for errors. conn, err := upgrader.Upgrade(w, r, nil) if err != nil { diff --git a/http_listing.go b/http_listing.go index 5b2a663b..327adccb 100644 --- a/http_listing.go +++ b/http_listing.go @@ -10,7 +10,7 @@ import ( ) // serveListing presents the user with a listage of a directory folder. -func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *User, i *FileInfo) (int, error) { +func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *user, i *FileInfo) (int, error) { var err error // Loads the content of the directory diff --git a/http_put.go b/http_put.go index 67164119..360e4b74 100644 --- a/http_put.go +++ b/http_put.go @@ -14,7 +14,7 @@ import ( ) // put is used to update a file that was edited -func put(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (err error) { +func put(w http.ResponseWriter, r *http.Request, c *FileManager, u *user) (err error) { var ( data = map[string]interface{}{} file []byte diff --git a/http_search.go b/http_search.go index 5cf27699..183331b8 100644 --- a/http_search.go +++ b/http_search.go @@ -43,7 +43,7 @@ func parseSearch(value string) *searchOptions { } // search searches for a file or directory. -func search(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (int, error) { +func search(w http.ResponseWriter, r *http.Request, c *FileManager, u *user) (int, error) { // Upgrades the connection to a websocket and checks for errors. conn, err := upgrader.Upgrade(w, r, nil) if err != nil { diff --git a/http_single.go b/http_single.go index 87f01315..77a0a410 100644 --- a/http_single.go +++ b/http_single.go @@ -7,7 +7,7 @@ import ( // serveSingle serves a single file in an editor (if it is editable), shows the // plain file, or downloads it if it can't be shown. -func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *User, i *FileInfo) (int, error) { +func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *user, i *FileInfo) (int, error) { var err error if err = i.RetrieveFileType(); err != nil { diff --git a/info.go b/info.go index 335ccbc3..382b23a6 100644 --- a/info.go +++ b/info.go @@ -33,7 +33,7 @@ type FileInfo struct { // GetInfo gets the file information and, in case of error, returns the // respective HTTP error code -func GetInfo(url *url.URL, c *FileManager, u *User) (*FileInfo, error) { +func GetInfo(url *url.URL, c *FileManager, u *user) (*FileInfo, error) { var err error i := &FileInfo{URL: c.PrefixURL + url.Path} diff --git a/listing.go b/listing.go index 5cb0d878..7a176d4f 100644 --- a/listing.go +++ b/listing.go @@ -33,7 +33,7 @@ type Listing struct { } // GetListing gets the information about a specific directory and its files. -func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { +func GetListing(u *user, filePath string, baseURL string) (*Listing, error) { // Gets the directory information using the Virtual File System of // the user configuration. file, err := u.fileSystem.OpenFile(context.TODO(), filePath, os.O_RDONLY, 0) diff --git a/page.go b/page.go index b65a7365..571bc5c4 100644 --- a/page.go +++ b/page.go @@ -23,7 +23,7 @@ type PageInfo struct { Name string Path string IsDir bool - User *User + User *user Config *FileManager Data interface{} Editor bool From 7b33975f7b2b1fd97e14accdf8e8f4731d9ff78f Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 12:53:49 +0100 Subject: [PATCH 21/40] finish new user function Former-commit-id: 4fa7426b99d1750288c595a5fb7375a7afbeeb30 --- filemanager.go | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/filemanager.go b/filemanager.go index 0be50ccf..33739cc3 100644 --- a/filemanager.go +++ b/filemanager.go @@ -10,6 +10,11 @@ import ( "golang.org/x/net/webdav" ) +var ( + // ErrDuplicated occurs when you try to create a user that already exists. + ErrDuplicated = errors.New("Duplicated user") +) + // FileManager is a file manager instance. type FileManager struct { *user @@ -88,7 +93,7 @@ type Rule struct { type CommandFunc func(r *http.Request, c *FileManager, u *user) error -func New() *FileManager { +func New(scope string) *FileManager { m := &FileManager{ user: &user{ AllowCommands: true, @@ -111,7 +116,7 @@ func New() *FileManager { }, } - m.SetScope(".", "") + m.SetScope(scope, "") m.SetBaseURL("/") m.SetWebDavURL("/webdav") @@ -192,8 +197,25 @@ func (m *FileManager) SetScope(scope string, username string) error { return nil } -func (m *FileManager) NewUser(name string) { +// NewUser creates a new user on a File Manager struct +// which inherits its configuration from the main user. +func (m *FileManager) NewUser(username string) error { + if _, ok := m.Users[username]; ok { + return ErrDuplicated + } + m.Users[username] = &user{ + scope: m.user.scope, + fileSystem: m.user.fileSystem, + handler: m.user.handler, + Rules: m.user.Rules, + AllowNew: m.user.AllowNew, + AllowEdit: m.user.AllowEdit, + AllowCommands: m.user.AllowCommands, + Commands: m.user.Commands, + } + + return nil } // Allowed checks if the user has permission to access a directory/file. From a4fe27a6d6311a54d6f1730cdc6ec309aa356e0f Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 13:00:33 +0100 Subject: [PATCH 22/40] unexport page Former-commit-id: 1ba9608a9c27334a337d3f919458c6f6116be0f9 --- error.go | 4 +- http.go | 6 +- http_listing.go | 20 +++--- http_single.go | 16 +++-- page.go | 160 +++++++++++++++++++++++------------------------- 5 files changed, 98 insertions(+), 108 deletions(-) diff --git a/error.go b/error.go index 1a77cc97..438852c6 100644 --- a/error.go +++ b/error.go @@ -50,8 +50,8 @@ const errTemplate = ` ` -// PrintErrorHTML prints the error page -func PrintErrorHTML(w http.ResponseWriter, code int, err error) (int, error) { +// htmlError prints the error page +func htmlError(w http.ResponseWriter, code int, err error) (int, error) { tpl := errTemplate tpl = strings.Replace(tpl, "TITLE", strconv.Itoa(code)+" "+http.StatusText(code), -1) tpl = strings.Replace(tpl, "CODE", err.Error(), -1) diff --git a/http.go b/http.go index 606f0960..206e14d8 100644 --- a/http.go +++ b/http.go @@ -112,7 +112,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er // Checks if the User is allowed to access this file if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.BaseURL)) { if r.Method == http.MethodGet { - return PrintErrorHTML( + return htmlError( w, http.StatusForbidden, errors.New("You don't have permission to access this page"), ) @@ -134,7 +134,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er fi, err = GetInfo(r.URL, c, user) if err != nil { if r.Method == http.MethodGet { - return PrintErrorHTML(w, code, err) + return htmlError(w, code, err) } code = errorToHTTP(err, false) return code, err @@ -162,7 +162,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er } if err != nil { - code, err = PrintErrorHTML(w, code, err) + code, err = htmlError(w, code, err) } return code, err diff --git a/http_listing.go b/http_listing.go index 327adccb..32d881e1 100644 --- a/http_listing.go +++ b/http_listing.go @@ -77,20 +77,18 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *use Secure: r.TLS != nil, }) - page := &Page{ + p := &page{ Minimal: r.Header.Get("Minimal") == "true", - PageInfo: &PageInfo{ - Name: listing.Name, - Path: i.VirtualPath, - IsDir: true, - User: u, - Config: c, - Display: displayMode, - Data: listing, - }, + Name: listing.Name, + Path: i.VirtualPath, + IsDir: true, + User: u, + Config: c, + Display: displayMode, + Data: listing, } - return page.PrintAsHTML(w, "listing") + return p.PrintAsHTML(w, "listing") } // handleSortOrder gets and stores for a Listing the 'sort' and 'order', diff --git a/http_single.go b/http_single.go index 77a0a410..3296b4dd 100644 --- a/http_single.go +++ b/http_single.go @@ -14,15 +14,13 @@ func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *user return errorToHTTP(err, true), err } - p := &Page{ - PageInfo: &PageInfo{ - Name: i.Name, - Path: i.VirtualPath, - IsDir: false, - Data: i, - User: u, - Config: c, - }, + p := &page{ + Name: i.Name, + Path: i.VirtualPath, + IsDir: false, + Data: i, + User: u, + Config: c, } // If the request accepts JSON, we send the file information. diff --git a/page.go b/page.go index 571bc5c4..a873dca4 100644 --- a/page.go +++ b/page.go @@ -12,84 +12,8 @@ import ( "github.com/hacdias/filemanager/variables" ) -// Page contains the informations and functions needed to show the Page -type Page struct { - *PageInfo - Minimal bool -} - -// PageInfo contains the information of a Page -type PageInfo struct { - Name string - Path string - IsDir bool - User *user - Config *FileManager - Data interface{} - Editor bool - Display string -} - -// BreadcrumbMapItem ... -type BreadcrumbMapItem struct { - Name string - URL string -} - -// BreadcrumbMap returns p.Path where every element is a map -// of URLs and path segment names. -func (i PageInfo) BreadcrumbMap() []BreadcrumbMapItem { - result := []BreadcrumbMapItem{} - - if len(i.Path) == 0 { - return result - } - - // skip trailing slash - lpath := i.Path - if lpath[len(lpath)-1] == '/' { - lpath = lpath[:len(lpath)-1] - } - - parts := strings.Split(lpath, "/") - for i, part := range parts { - if i == len(parts)-1 { - continue - } - - if i == 0 && part == "" { - result = append([]BreadcrumbMapItem{{ - Name: "/", - URL: "/", - }}, result...) - continue - } - - result = append([]BreadcrumbMapItem{{ - Name: part, - URL: strings.Join(parts[:i+1], "/") + "/", - }}, result...) - } - - return result -} - -// PreviousLink returns the path of the previous folder -func (i PageInfo) PreviousLink() string { - path := strings.TrimSuffix(i.Path, "/") - path = strings.TrimPrefix(path, "/") - path = i.Config.AbsoluteURL() + "/" + path - path = path[0 : len(path)-len(i.Name)] - - if len(path) < len(i.Config.AbsoluteURL()+"/") { - return "" - } - - return path -} - -// Create the functions map, then the template, check for erros and -// execute the template if there aren't errors +// functions contains the non-standard functions that are available +// to use on the HTML templates. var functions = template.FuncMap{ "Defined": variables.FieldInStruct, "CSS": func(s string) template.CSS { @@ -104,9 +28,79 @@ var functions = template.FuncMap{ }, } -// PrintAsHTML formats the page in HTML and executes the template -func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, error) { +// page contains the information needed to fill a page template. +type page struct { + Minimal bool + Name string + Path string + IsDir bool + User *user + Config *FileManager + Data interface{} + Editor bool + Display string +} +// breadcrumbItem contains the Name and the URL of a breadcrumb piece. +type breadcrumbItem struct { + Name string + URL string +} + +// BreadcrumbMap returns p.Path where every element is a map +// of URLs and path segment names. +func (p page) BreadcrumbMap() []breadcrumbItem { + result := []breadcrumbItem{} + + if len(p.Path) == 0 { + return result + } + + // skip trailing slash + lpath := p.Path + if lpath[len(lpath)-1] == '/' { + lpath = lpath[:len(lpath)-1] + } + + parts := strings.Split(lpath, "/") + for i, part := range parts { + if i == len(parts)-1 { + continue + } + + if i == 0 && part == "" { + result = append([]breadcrumbItem{{ + Name: "/", + URL: "/", + }}, result...) + continue + } + + result = append([]breadcrumbItem{{ + Name: part, + URL: strings.Join(parts[:i+1], "/") + "/", + }}, result...) + } + + return result +} + +// PreviousLink returns the URL of the previous folder. +func (p page) PreviousLink() string { + path := strings.TrimSuffix(p.Path, "/") + path = strings.TrimPrefix(path, "/") + path = p.Config.AbsoluteURL() + "/" + path + path = path[0 : len(path)-len(p.Name)] + + if len(path) < len(p.Config.AbsoluteURL()+"/") { + return "" + } + + return path +} + +// PrintAsHTML formats the page in HTML and executes the template +func (p page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, error) { if p.Minimal { templates = append(templates, "minimal") } else { @@ -141,7 +135,7 @@ func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, erro } buf := &bytes.Buffer{} - err := tpl.Execute(buf, p.PageInfo) + err := tpl.Execute(buf, p) if err != nil { return http.StatusInternalServerError, err @@ -153,8 +147,8 @@ func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, erro } // PrintAsJSON prints the current Page information in JSON -func (p Page) PrintAsJSON(w http.ResponseWriter) (int, error) { - marsh, err := json.MarshalIndent(p.PageInfo.Data, "", " ") +func (p page) PrintAsJSON(w http.ResponseWriter) (int, error) { + marsh, err := json.MarshalIndent(p.Data, "", " ") if err != nil { return http.StatusInternalServerError, err } From f917b4222cf0171e84d20e894ecae4d542ee123e Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 13:03:59 +0100 Subject: [PATCH 23/40] unexport fileInfo Former-commit-id: e6492286dba14bb758f36da9a3f14d223e5b2d32 --- editor.go | 2 +- http.go | 4 ++-- http_checksum.go | 2 +- http_download.go | 2 +- http_listing.go | 2 +- http_single.go | 2 +- info.go | 22 +++++++++++----------- listing.go | 6 +++--- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/editor.go b/editor.go index d2b591d2..cfc3eeee 100644 --- a/editor.go +++ b/editor.go @@ -24,7 +24,7 @@ type Editor struct { } // GetEditor gets the editor based on a Info struct -func GetEditor(r *http.Request, i *FileInfo) (*Editor, error) { +func GetEditor(r *http.Request, i *fileInfo) (*Editor, error) { var err error // Create a new editor variable and set the mode diff --git a/http.go b/http.go index 206e14d8..54f62645 100644 --- a/http.go +++ b/http.go @@ -18,7 +18,7 @@ func matchURL(first, second string) bool { // ServeHTTP determines if the request is for this plugin, and if all prerequisites are met. func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { var ( - fi *FileInfo + fi *fileInfo code int err error user *user @@ -131,7 +131,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er if r.Method == http.MethodGet { // Gets the information of the directory/file - fi, err = GetInfo(r.URL, c, user) + fi, err = getInfo(r.URL, c, user) if err != nil { if r.Method == http.MethodGet { return htmlError(w, code, err) diff --git a/http_checksum.go b/http_checksum.go index eeeddcbc..ee418a17 100644 --- a/http_checksum.go +++ b/http_checksum.go @@ -14,7 +14,7 @@ import ( ) // checksum calculates the hash of a file. Supports MD5, SHA1, SHA256 and SHA512. -func checksum(w http.ResponseWriter, r *http.Request, i *FileInfo) (int, error) { +func checksum(w http.ResponseWriter, r *http.Request, i *fileInfo) (int, error) { query := r.URL.Query().Get("checksum") file, err := os.Open(i.Path) diff --git a/http_download.go b/http_download.go index dc028dc2..8f5ddaa7 100644 --- a/http_download.go +++ b/http_download.go @@ -14,7 +14,7 @@ import ( // download creates an archive in one of the supported formats (zip, tar, // tar.gz or tar.bz2) and sends it to be downloaded. -func download(w http.ResponseWriter, r *http.Request, i *FileInfo) (int, error) { +func download(w http.ResponseWriter, r *http.Request, i *fileInfo) (int, error) { query := r.URL.Query().Get("download") if !i.IsDir { diff --git a/http_listing.go b/http_listing.go index 32d881e1..9e7ec555 100644 --- a/http_listing.go +++ b/http_listing.go @@ -10,7 +10,7 @@ import ( ) // serveListing presents the user with a listage of a directory folder. -func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *user, i *FileInfo) (int, error) { +func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *user, i *fileInfo) (int, error) { var err error // Loads the content of the directory diff --git a/http_single.go b/http_single.go index 3296b4dd..55943e28 100644 --- a/http_single.go +++ b/http_single.go @@ -7,7 +7,7 @@ import ( // serveSingle serves a single file in an editor (if it is editable), shows the // plain file, or downloads it if it can't be shown. -func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *user, i *FileInfo) (int, error) { +func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *user, i *fileInfo) (int, error) { var err error if err = i.RetrieveFileType(); err != nil { diff --git a/info.go b/info.go index 382b23a6..a0741a76 100644 --- a/info.go +++ b/info.go @@ -13,8 +13,8 @@ import ( humanize "github.com/dustin/go-humanize" ) -// FileInfo contains the information about a particular file or directory -type FileInfo struct { +// fileInfo contains the information about a particular file or directory. +type fileInfo struct { Name string Size int64 URL string @@ -31,12 +31,12 @@ type FileInfo struct { content []byte } -// GetInfo gets the file information and, in case of error, returns the +// getInfo gets the file information and, in case of error, returns the // respective HTTP error code -func GetInfo(url *url.URL, c *FileManager, u *user) (*FileInfo, error) { +func getInfo(url *url.URL, c *FileManager, u *user) (*fileInfo, error) { var err error - i := &FileInfo{URL: c.PrefixURL + url.Path} + i := &fileInfo{URL: c.PrefixURL + url.Path} i.VirtualPath = strings.Replace(url.Path, c.BaseURL, "", 1) i.VirtualPath = strings.TrimPrefix(i.VirtualPath, "/") i.VirtualPath = "/" + i.VirtualPath @@ -77,7 +77,7 @@ var textExtensions = [...]string{ // RetrieveFileType obtains the mimetype and a simplified internal Type // using the first 512 bytes from the file. -func (i *FileInfo) RetrieveFileType() error { +func (i *fileInfo) RetrieveFileType() error { i.Mimetype = mime.TypeByExtension(i.Extension) if i.Mimetype == "" { @@ -128,7 +128,7 @@ func (i *FileInfo) RetrieveFileType() error { } // Reads the file. -func (i *FileInfo) Read() error { +func (i *fileInfo) Read() error { if len(i.content) != 0 { return nil } @@ -142,22 +142,22 @@ func (i *FileInfo) Read() error { } // StringifyContent returns the string version of Raw -func (i FileInfo) StringifyContent() string { +func (i fileInfo) StringifyContent() string { return string(i.content) } // HumanSize returns the size of the file as a human-readable string // in IEC format (i.e. power of 2 or base 1024). -func (i FileInfo) HumanSize() string { +func (i fileInfo) HumanSize() string { return humanize.IBytes(uint64(i.Size)) } // HumanModTime returns the modified time of the file as a human-readable string. -func (i FileInfo) HumanModTime(format string) string { +func (i fileInfo) HumanModTime(format string) string { return i.ModTime.Format(format) } // CanBeEdited checks if the extension of a file is supported by the editor -func (i FileInfo) CanBeEdited() bool { +func (i fileInfo) CanBeEdited() bool { return i.Type == "text" } diff --git a/listing.go b/listing.go index 7a176d4f..15930f23 100644 --- a/listing.go +++ b/listing.go @@ -18,7 +18,7 @@ type Listing struct { // The full path of the request relatively to a File System Path string // The items (files and folders) in the path - Items []FileInfo + Items []fileInfo // The number of directories in the listing NumDirs int // The number of files (items that aren't directories) in the listing @@ -49,7 +49,7 @@ func GetListing(u *user, filePath string, baseURL string) (*Listing, error) { } var ( - fileinfos []FileInfo + fileinfos []fileInfo dirCount, fileCount int ) @@ -71,7 +71,7 @@ func GetListing(u *user, filePath string, baseURL string) (*Listing, error) { // Absolute URL url := url.URL{Path: baseURL + name} - i := FileInfo{ + i := fileInfo{ Name: f.Name(), Size: f.Size(), ModTime: f.ModTime(), From 475a07671de4537bbeb878cf0da44095cdd4afb9 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 13:09:49 +0100 Subject: [PATCH 24/40] unexport baseURL and webDavURL Former-commit-id: b93158b291d88b0237f28a5322b2df9d62331e57 --- cmd/filemanager/main.go | 2 +- filemanager.go | 28 ++++++++++++++-------------- http.go | 10 +++++----- http_assets.go | 2 +- http_command.go | 2 +- http_listing.go | 2 +- http_search.go | 2 +- info.go | 2 +- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/cmd/filemanager/main.go b/cmd/filemanager/main.go index f5ad1ac6..6136d72e 100644 --- a/cmd/filemanager/main.go +++ b/cmd/filemanager/main.go @@ -17,7 +17,7 @@ func handler(w http.ResponseWriter, r *http.Request) { } func main() { - m = filemanager.New() + m = filemanager.New("D:\\TEST") http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } diff --git a/filemanager.go b/filemanager.go index 33739cc3..3eb7a572 100644 --- a/filemanager.go +++ b/filemanager.go @@ -20,19 +20,19 @@ type FileManager struct { *user Assets *assets - // PrefixURL is a part of the URL that is trimmed from the http.Request.URL before - // it arrives to our handlers. It may be useful when using FileManager as a middleware - // such as in caddy-filemanager plugin. It musn't end with a trailing slash. - PrefixURL string - // BaseURL is the path where the GUI will be accessible. It musn't end with // a trailing slash and mustn't contain PrefixURL, if set. - BaseURL string + baseURL string // WebDavURL is the path where the WebDAV will be accessible. It can be set to "" // in order to override the GUI and only use the WebDAV. It musn't end with // a trailing slash. - WebDavURL string + webDavURL string + + // PrefixURL is a part of the URL that is trimmed from the http.Request.URL before + // it arrives to our handlers. It may be useful when using FileManager as a middleware + // such as in caddy-filemanager plugin. It musn't end with a trailing slash. + PrefixURL string // Users is a map with the different configurations for each user. Users map[string]*user @@ -126,13 +126,13 @@ func New(scope string) *FileManager { // AbsoluteURL returns the actual URL where // File Manager interface can be accessed. func (m FileManager) AbsoluteURL() string { - return m.PrefixURL + m.BaseURL + return m.PrefixURL + m.baseURL } // AbsoluteWebDavURL returns the actual URL // where WebDAV can be accessed. func (m FileManager) AbsoluteWebDavURL() string { - return m.PrefixURL + m.WebDavURL + return m.PrefixURL + m.webDavURL } // SetBaseURL updates the BaseURL of a File Manager @@ -141,7 +141,7 @@ func (m *FileManager) SetBaseURL(url string) { url = strings.TrimPrefix(url, "/") url = strings.TrimSuffix(url, "/") url = "/" + url - m.BaseURL = strings.TrimSuffix(url, "/") + m.baseURL = strings.TrimSuffix(url, "/") } // SetWebDavURL updates the WebDavURL of a File Manager @@ -150,11 +150,11 @@ func (m *FileManager) SetWebDavURL(url string) { url = strings.TrimPrefix(url, "/") url = strings.TrimSuffix(url, "/") - m.WebDavURL = m.BaseURL + "/" + url + m.webDavURL = m.baseURL + "/" + url // update base user webdav handler m.handler = &webdav.Handler{ - Prefix: m.WebDavURL, + Prefix: m.webDavURL, FileSystem: m.fileSystem, LockSystem: webdav.NewMemLS(), } @@ -163,7 +163,7 @@ func (m *FileManager) SetWebDavURL(url string) { // the new URL for _, u := range m.Users { u.handler = &webdav.Handler{ - Prefix: m.WebDavURL, + Prefix: m.webDavURL, FileSystem: u.fileSystem, LockSystem: webdav.NewMemLS(), } @@ -189,7 +189,7 @@ func (m *FileManager) SetScope(scope string, username string) error { u.fileSystem = webdav.Dir(u.scope) u.handler = &webdav.Handler{ - Prefix: m.WebDavURL, + Prefix: m.webDavURL, FileSystem: u.fileSystem, LockSystem: webdav.NewMemLS(), } diff --git a/http.go b/http.go index 54f62645..1e12cd35 100644 --- a/http.go +++ b/http.go @@ -26,7 +26,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er // Checks if the URL matches the Assets URL. Returns the asset if the // method is GET and Status Forbidden otherwise. - if matchURL(r.URL.Path, c.BaseURL+AssetsURL) { + if matchURL(r.URL.Path, c.baseURL+AssetsURL) { if r.Method == http.MethodGet { return serveAssets(w, r, c) } @@ -42,9 +42,9 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er } // Checks if the request URL is for the WebDav server - if matchURL(r.URL.Path, c.WebDavURL) { + if matchURL(r.URL.Path, c.webDavURL) { // Checks for user permissions relatively to this PATH - if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.WebDavURL)) { + if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.webDavURL)) { return http.StatusForbidden, nil } @@ -58,7 +58,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er // // It was decided on https://github.com/hacdias/caddy-filemanager/issues/85 // that GET, for collections, will return the same as PROPFIND method. - path := strings.Replace(r.URL.Path, c.WebDavURL, "", 1) + path := strings.Replace(r.URL.Path, c.webDavURL, "", 1) path = user.scope + "/" + path path = filepath.Clean(path) @@ -110,7 +110,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er w.Header().Set("x-xss-protection", "1; mode=block") // Checks if the User is allowed to access this file - if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.BaseURL)) { + if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.baseURL)) { if r.Method == http.MethodGet { return htmlError( w, http.StatusForbidden, diff --git a/http_assets.go b/http_assets.go index 8cf5e564..5e2df954 100644 --- a/http_assets.go +++ b/http_assets.go @@ -14,7 +14,7 @@ const AssetsURL = "/_internal" // Serve provides the needed assets for the front-end func serveAssets(w http.ResponseWriter, r *http.Request, m *FileManager) (int, error) { // gets the filename to be used with Assets function - filename := strings.Replace(r.URL.Path, m.BaseURL+AssetsURL, "", 1) + filename := strings.Replace(r.URL.Path, m.baseURL+AssetsURL, "", 1) var file []byte var err error diff --git a/http_command.go b/http_command.go index 1124903c..7d7ac6fc 100644 --- a/http_command.go +++ b/http_command.go @@ -77,7 +77,7 @@ func command(w http.ResponseWriter, r *http.Request, c *FileManager, u *user) (i } // Gets the path and initializes a buffer. - path := strings.Replace(r.URL.Path, c.BaseURL, c.scope, 1) + path := strings.Replace(r.URL.Path, c.baseURL, c.scope, 1) path = filepath.Clean(path) buff := new(bytes.Buffer) diff --git a/http_listing.go b/http_listing.go index 9e7ec555..2cb28315 100644 --- a/http_listing.go +++ b/http_listing.go @@ -25,7 +25,7 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *use URL: r.URL, } - cookieScope := c.BaseURL + cookieScope := c.baseURL if cookieScope == "" { cookieScope = "/" } diff --git a/http_search.go b/http_search.go index 183331b8..c4b48a24 100644 --- a/http_search.go +++ b/http_search.go @@ -71,7 +71,7 @@ func search(w http.ResponseWriter, r *http.Request, c *FileManager, u *user) (in } search = parseSearch(value) - scope := strings.Replace(r.URL.Path, c.BaseURL, "", 1) + scope := strings.Replace(r.URL.Path, c.baseURL, "", 1) scope = strings.TrimPrefix(scope, "/") scope = "/" + scope scope = u.scope + scope diff --git a/info.go b/info.go index a0741a76..51cc38fc 100644 --- a/info.go +++ b/info.go @@ -37,7 +37,7 @@ func getInfo(url *url.URL, c *FileManager, u *user) (*fileInfo, error) { var err error i := &fileInfo{URL: c.PrefixURL + url.Path} - i.VirtualPath = strings.Replace(url.Path, c.BaseURL, "", 1) + i.VirtualPath = strings.Replace(url.Path, c.baseURL, "", 1) i.VirtualPath = strings.TrimPrefix(i.VirtualPath, "/") i.VirtualPath = "/" + i.VirtualPath From 99d99843b70e454ec8f6153c695a324467d94ff2 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 14:24:26 +0100 Subject: [PATCH 25/40] add comments and unexport some fields Former-commit-id: fffbcc7098e7eab38351dc7e202983f4749a74eb --- _assets/templates/base.tmpl | 24 +++++++-------- editor.go | 10 +++---- http.go | 2 +- http_assets.go | 6 ++-- http_listing.go | 20 +++++++------ http_single.go | 18 ++++++----- info.go | 59 ++++++++++++++++++++++--------------- page.go | 31 ++++++++++--------- 8 files changed, 94 insertions(+), 76 deletions(-) diff --git a/_assets/templates/base.tmpl b/_assets/templates/base.tmpl index 579e01bd..e72a29f6 100644 --- a/_assets/templates/base.tmpl +++ b/_assets/templates/base.tmpl @@ -1,30 +1,30 @@ -{{ $absURL := .Config.AbsoluteURL }} +{{ $absURL := .BaseURL }} {{.Name}} - - - + + + {{- if ne .User.StyleSheet "" -}} {{- end -}} - + {{- if .IsDir }} - + {{- else }} - - - + + + {{- end }} diff --git a/editor.go b/editor.go index cfc3eeee..57946578 100644 --- a/editor.go +++ b/editor.go @@ -11,8 +11,8 @@ import ( "github.com/spf13/hugo/parser" ) -// Editor contains the information for the editor page -type Editor struct { +// editor contains the information to fill the editor template. +type editor struct { Class string Mode string Visual bool @@ -23,12 +23,12 @@ type Editor struct { } } -// GetEditor gets the editor based on a Info struct -func GetEditor(r *http.Request, i *fileInfo) (*Editor, error) { +// getEditor gets the editor based on a Info struct +func (i *fileInfo) getEditor(r *http.Request) (*editor, error) { var err error // Create a new editor variable and set the mode - e := new(Editor) + e := &editor{} e.Mode = editorMode(i.Name) e.Class = editorClass(e.Mode) diff --git a/http.go b/http.go index 1e12cd35..0e833eee 100644 --- a/http.go +++ b/http.go @@ -26,7 +26,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er // Checks if the URL matches the Assets URL. Returns the asset if the // method is GET and Status Forbidden otherwise. - if matchURL(r.URL.Path, c.baseURL+AssetsURL) { + if matchURL(r.URL.Path, c.baseURL+assetsURL) { if r.Method == http.MethodGet { return serveAssets(w, r, c) } diff --git a/http_assets.go b/http_assets.go index 5e2df954..c2046a44 100644 --- a/http_assets.go +++ b/http_assets.go @@ -8,13 +8,13 @@ import ( "strings" ) -// AssetsURL is the url of the assets -const AssetsURL = "/_internal" +// assetsURL is the url where static assets are served. +const assetsURL = "/_internal" // Serve provides the needed assets for the front-end func serveAssets(w http.ResponseWriter, r *http.Request, m *FileManager) (int, error) { // gets the filename to be used with Assets function - filename := strings.Replace(r.URL.Path, m.baseURL+AssetsURL, "", 1) + filename := strings.Replace(r.URL.Path, m.baseURL+assetsURL, "", 1) var file []byte var err error diff --git a/http_listing.go b/http_listing.go index 2cb28315..3d430e4a 100644 --- a/http_listing.go +++ b/http_listing.go @@ -78,17 +78,19 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *use }) p := &page{ - Minimal: r.Header.Get("Minimal") == "true", - Name: listing.Name, - Path: i.VirtualPath, - IsDir: true, - User: u, - Config: c, - Display: displayMode, - Data: listing, + minimal: r.Header.Get("Minimal") == "true", + Name: listing.Name, + Path: i.VirtualPath, + IsDir: true, + User: u, + PrefixURL: c.PrefixURL, + BaseURL: c.AbsoluteURL(), + WebDavURL: c.AbsoluteWebDavURL(), + Display: displayMode, + Data: listing, } - return p.PrintAsHTML(w, "listing") + return p.PrintAsHTML(w, c.Assets.Templates, "listing") } // handleSortOrder gets and stores for a Listing the 'sort' and 'order', diff --git a/http_single.go b/http_single.go index 55943e28..853daf58 100644 --- a/http_single.go +++ b/http_single.go @@ -15,12 +15,14 @@ func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *user } p := &page{ - Name: i.Name, - Path: i.VirtualPath, - IsDir: false, - Data: i, - User: u, - Config: c, + Name: i.Name, + Path: i.VirtualPath, + IsDir: false, + Data: i, + User: u, + PrefixURL: c.PrefixURL, + BaseURL: c.AbsoluteURL(), + WebDavURL: c.AbsoluteWebDavURL(), } // If the request accepts JSON, we send the file information. @@ -41,8 +43,8 @@ func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *user return http.StatusInternalServerError, err } - return p.PrintAsHTML(w, "frontmatter", "editor") + return p.PrintAsHTML(w, c.Assets.Templates, "frontmatter", "editor") } - return p.PrintAsHTML(w, "single") + return p.PrintAsHTML(w, c.Assets.Templates, "single") } diff --git a/info.go b/info.go index 51cc38fc..a99fe3f0 100644 --- a/info.go +++ b/info.go @@ -15,20 +15,28 @@ import ( // fileInfo contains the information about a particular file or directory. type fileInfo struct { - Name string - Size int64 - URL string - Extension string - ModTime time.Time - Mode os.FileMode - IsDir bool - Path string // Relative path to Current Working Directory - VirtualPath string // Relative path to user's virtual File System - Mimetype string - Type string - UserAllowed bool // Indicates if the user has enough permissions - + // Used to store the file's content temporarily. content []byte + + Name string + Size int64 + URL string + Extension string + ModTime time.Time + Mode os.FileMode + IsDir bool + + // Absolute path. + Path string + + // Relative path to user's virtual File System. + VirtualPath string + + // Indicates the file content type: video, text, image, music or blob. + Type string + + // Indicates if the user has enough permissions to edit the file. + UserAllowed bool } // getInfo gets the file information and, in case of error, returns the @@ -75,41 +83,44 @@ var textExtensions = [...]string{ ".f", ".bas", ".d", ".ada", ".nim", ".cr", ".java", ".cs", ".vala", ".vapi", } -// RetrieveFileType obtains the mimetype and a simplified internal Type -// using the first 512 bytes from the file. +// RetrieveFileType obtains the mimetype and converts it to a simple +// type nomenclature. func (i *fileInfo) RetrieveFileType() error { - i.Mimetype = mime.TypeByExtension(i.Extension) + // Tries to get the file mimetype using its extension. + mimetype := mime.TypeByExtension(i.Extension) - if i.Mimetype == "" { + if mimetype == "" { err := i.Read() if err != nil { return err } - i.Mimetype = http.DetectContentType(i.content) + // Tries to get the file mimetype using its first + // 512 bytes. + mimetype = http.DetectContentType(i.content) } - if strings.HasPrefix(i.Mimetype, "video") { + if strings.HasPrefix(mimetype, "video") { i.Type = "video" return nil } - if strings.HasPrefix(i.Mimetype, "audio") { + if strings.HasPrefix(mimetype, "audio") { i.Type = "audio" return nil } - if strings.HasPrefix(i.Mimetype, "image") { + if strings.HasPrefix(mimetype, "image") { i.Type = "image" return nil } - if strings.HasPrefix(i.Mimetype, "text") { + if strings.HasPrefix(mimetype, "text") { i.Type = "text" return nil } - if strings.HasPrefix(i.Mimetype, "application/javascript") { + if strings.HasPrefix(mimetype, "application/javascript") { i.Type = "text" return nil } @@ -141,7 +152,7 @@ func (i *fileInfo) Read() error { return nil } -// StringifyContent returns the string version of Raw +// StringifyContent returns a string with the file content. func (i fileInfo) StringifyContent() string { return string(i.content) } diff --git a/page.go b/page.go index a873dca4..4d91ecb3 100644 --- a/page.go +++ b/page.go @@ -9,6 +9,7 @@ import ( "net/http" "strings" + rice "github.com/GeertJohan/go.rice" "github.com/hacdias/filemanager/variables" ) @@ -30,15 +31,17 @@ var functions = template.FuncMap{ // page contains the information needed to fill a page template. type page struct { - Minimal bool - Name string - Path string - IsDir bool - User *user - Config *FileManager - Data interface{} - Editor bool - Display string + minimal bool + Name string + Path string + IsDir bool + User *user + PrefixURL string + BaseURL string + WebDavURL string + Data interface{} + Editor bool + Display string } // breadcrumbItem contains the Name and the URL of a breadcrumb piece. @@ -89,10 +92,10 @@ func (p page) BreadcrumbMap() []breadcrumbItem { func (p page) PreviousLink() string { path := strings.TrimSuffix(p.Path, "/") path = strings.TrimPrefix(path, "/") - path = p.Config.AbsoluteURL() + "/" + path + path = p.BaseURL + "/" + path path = path[0 : len(path)-len(p.Name)] - if len(path) < len(p.Config.AbsoluteURL()+"/") { + if len(path) < len(p.BaseURL+"/") { return "" } @@ -100,8 +103,8 @@ func (p page) PreviousLink() string { } // PrintAsHTML formats the page in HTML and executes the template -func (p page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, error) { - if p.Minimal { +func (p page) PrintAsHTML(w http.ResponseWriter, box *rice.Box, templates ...string) (int, error) { + if p.minimal { templates = append(templates, "minimal") } else { templates = append(templates, "base") @@ -112,7 +115,7 @@ func (p page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, erro // For each template, add it to the the tpl variable for i, t := range templates { // Get the template from the assets - Page, err := p.Config.Assets.Templates.String(t + ".tmpl") + Page, err := box.String(t + ".tmpl") // Check if there is some error. If so, the template doesn't exist if err != nil { From a72f25701a45c5ba21bc5cfb0b227f7e0ffb3940 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 14:48:34 +0100 Subject: [PATCH 26/40] unexport and rework some more things Former-commit-id: e1bee6d07e435ce17fd0fb9da0624d614918208b --- editor.go | 2 +- info.go => file.go | 3 --- http_listing.go | 2 +- http_single.go | 2 +- listing.go | 49 +++++++++++++++++++++++----------------------- 5 files changed, 27 insertions(+), 31 deletions(-) rename info.go => file.go (97%) diff --git a/editor.go b/editor.go index 57946578..3ffcf872 100644 --- a/editor.go +++ b/editor.go @@ -24,7 +24,7 @@ type editor struct { } // getEditor gets the editor based on a Info struct -func (i *fileInfo) getEditor(r *http.Request) (*editor, error) { +func getEditor(r *http.Request, i *fileInfo) (*editor, error) { var err error // Create a new editor variable and set the mode diff --git a/info.go b/file.go similarity index 97% rename from info.go rename to file.go index a99fe3f0..e5b58571 100644 --- a/info.go +++ b/file.go @@ -34,9 +34,6 @@ type fileInfo struct { // Indicates the file content type: video, text, image, music or blob. Type string - - // Indicates if the user has enough permissions to edit the file. - UserAllowed bool } // getInfo gets the file information and, in case of error, returns the diff --git a/http_listing.go b/http_listing.go index 3d430e4a..cd881f86 100644 --- a/http_listing.go +++ b/http_listing.go @@ -14,7 +14,7 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *use var err error // Loads the content of the directory - listing, err := GetListing(u, i.VirtualPath, c.PrefixURL+r.URL.Path) + listing, err := getListing(u, i.VirtualPath, c.PrefixURL+r.URL.Path) if err != nil { return errorToHTTP(err, true), err } diff --git a/http_single.go b/http_single.go index 853daf58..2496a2ea 100644 --- a/http_single.go +++ b/http_single.go @@ -37,7 +37,7 @@ func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *user } if i.CanBeEdited() && u.AllowEdit { - p.Data, err = GetEditor(r, i) + p.Data, err = getEditor(r, i) p.Editor = true if err != nil { return http.StatusInternalServerError, err diff --git a/listing.go b/listing.go index 15930f23..1863b18a 100644 --- a/listing.go +++ b/listing.go @@ -11,29 +11,29 @@ import ( "github.com/mholt/caddy/caddyhttp/httpserver" ) -// A Listing is the context used to fill out a template. -type Listing struct { - // The name of the directory (the last element of the path) +// A listing is the context used to fill out a template. +type listing struct { + // The name of the directory (the last element of the path). Name string - // The full path of the request relatively to a File System + // The full path of the request relatively to a File System. Path string - // The items (files and folders) in the path + // The items (files and folders) in the path. Items []fileInfo - // The number of directories in the listing + // The number of directories in the listing. NumDirs int - // The number of files (items that aren't directories) in the listing + // The number of files (items that aren't directories) in the listing. NumFiles int - // Which sorting order is used + // Which sorting order is used. Sort string - // And which order + // And which order. Order string - // If ≠0 then Items have been limited to that many elements + // If ≠0 then Items have been limited to that many elements. ItemsLimitedTo int httpserver.Context `json:"-"` } -// GetListing gets the information about a specific directory and its files. -func GetListing(u *user, filePath string, baseURL string) (*Listing, error) { +// getListing gets the information about a specific directory and its files. +func getListing(u *user, filePath string, baseURL string) (*listing, error) { // Gets the directory information using the Virtual File System of // the user configuration. file, err := u.fileSystem.OpenFile(context.TODO(), filePath, os.O_RDONLY, 0) @@ -72,20 +72,19 @@ func GetListing(u *user, filePath string, baseURL string) (*Listing, error) { url := url.URL{Path: baseURL + name} i := fileInfo{ - Name: f.Name(), - Size: f.Size(), - ModTime: f.ModTime(), - Mode: f.Mode(), - IsDir: f.IsDir(), - URL: url.String(), - UserAllowed: allowed, + Name: f.Name(), + Size: f.Size(), + ModTime: f.ModTime(), + Mode: f.Mode(), + IsDir: f.IsDir(), + URL: url.String(), } i.RetrieveFileType() fileinfos = append(fileinfos, i) } - return &Listing{ + return &listing{ Name: path.Base(filePath), Path: filePath, Items: fileinfos, @@ -95,7 +94,7 @@ func GetListing(u *user, filePath string, baseURL string) (*Listing, error) { } // ApplySort applies the sort order using .Order and .Sort -func (l Listing) ApplySort() { +func (l listing) ApplySort() { // Check '.Order' to know how to sort if l.Order == "desc" { switch l.Sort { @@ -124,10 +123,10 @@ func (l Listing) ApplySort() { } } -// Implement sorting for Listing -type byName Listing -type bySize Listing -type byTime Listing +// Implement sorting for listing +type byName listing +type bySize listing +type byTime listing // By Name func (l byName) Len() int { From a74ad79dd638efa6780b39d2f95607997225b2f1 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 15:19:23 +0100 Subject: [PATCH 27/40] more updates Former-commit-id: 70c00db16b5d30f23ca86ee9c6bca74d76fd333c --- filemanager.go | 27 ++++---- http.go | 177 ++++++++++++++++++++++++++----------------------- 2 files changed, 107 insertions(+), 97 deletions(-) diff --git a/filemanager.go b/filemanager.go index 3eb7a572..195c63cd 100644 --- a/filemanager.go +++ b/filemanager.go @@ -37,11 +37,16 @@ type FileManager struct { // Users is a map with the different configurations for each user. Users map[string]*user - // TODO: event-based? - BeforeSave CommandFunc - AfterSave CommandFunc + // BeforeSave is a function that is called before saving a file. + BeforeSave Command + + // AfterSave is a function that is called before saving a file. + AfterSave Command } +// Command is a command function. +type Command func(r *http.Request, m *FileManager, u *user) error + // user contains the configuration for each user. type user struct { // scope is the physical path the user has access to. @@ -91,24 +96,20 @@ type Rule struct { Regexp *regexp.Regexp } -type CommandFunc func(r *http.Request, c *FileManager, u *user) error - +// New creates a new File Manager instance with the needed +// configuration to work. func New(scope string) *FileManager { m := &FileManager{ user: &user{ AllowCommands: true, AllowEdit: true, AllowNew: true, - Commands: []string{"git", "svn", "hg"}, - Rules: []*Rule{{ - Regex: true, - Allow: false, - Regexp: regexp.MustCompile("\\/\\..+"), - }}, + Commands: []string{}, + Rules: []*Rule{}, }, Users: map[string]*user{}, - BeforeSave: func(r *http.Request, c *FileManager, u *user) error { return nil }, - AfterSave: func(r *http.Request, c *FileManager, u *user) error { return nil }, + BeforeSave: func(r *http.Request, m *FileManager, u *user) error { return nil }, + AfterSave: func(r *http.Request, m *FileManager, u *user) error { return nil }, Assets: &assets{ Templates: rice.MustFindBox("./_assets/templates"), CSS: rice.MustFindBox("./_assets/css"), diff --git a/http.go b/http.go index 0e833eee..3ede6dfb 100644 --- a/http.go +++ b/http.go @@ -16,93 +16,33 @@ func matchURL(first, second string) bool { } // ServeHTTP determines if the request is for this plugin, and if all prerequisites are met. -func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { +func (m *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { var ( - fi *fileInfo + u *user code int err error - user *user ) // Checks if the URL matches the Assets URL. Returns the asset if the // method is GET and Status Forbidden otherwise. - if matchURL(r.URL.Path, c.baseURL+assetsURL) { + if matchURL(r.URL.Path, m.baseURL+assetsURL) { if r.Method == http.MethodGet { - return serveAssets(w, r, c) + return serveAssets(w, r, m) } return http.StatusForbidden, nil } username, _, _ := r.BasicAuth() - if _, ok := c.Users[username]; ok { - user = c.Users[username] + if _, ok := m.Users[username]; ok { + u = m.Users[username] } else { - user = c.user + u = m.user } // Checks if the request URL is for the WebDav server - if matchURL(r.URL.Path, c.webDavURL) { - // Checks for user permissions relatively to this PATH - if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.webDavURL)) { - return http.StatusForbidden, nil - } - - switch r.Method { - case "GET", "HEAD": - // Excerpt from RFC4918, section 9.4: - // - // GET, when applied to a collection, may return the contents of an - // "index.html" resource, a human-readable view of the contents of - // the collection, or something else altogether. - // - // It was decided on https://github.com/hacdias/caddy-filemanager/issues/85 - // that GET, for collections, will return the same as PROPFIND method. - path := strings.Replace(r.URL.Path, c.webDavURL, "", 1) - path = user.scope + "/" + path - path = filepath.Clean(path) - - var i os.FileInfo - i, err = os.Stat(path) - if err != nil { - // Is there any error? WebDav will handle it... no worries. - break - } - - if i.IsDir() { - r.Method = "PROPFIND" - - if r.Method == "HEAD" { - w = newResponseWriterNoBody(w) - } - } - case "PROPPATCH", "MOVE", "PATCH", "PUT", "DELETE": - if !user.AllowEdit { - return http.StatusForbidden, nil - } - case "MKCOL", "COPY": - if !user.AllowNew { - return http.StatusForbidden, nil - } - } - - // Preprocess the PUT request if it's the case - if r.Method == http.MethodPut { - if err = c.BeforeSave(r, c, user); err != nil { - return http.StatusInternalServerError, err - } - - if put(w, r, c, user) != nil { - return http.StatusInternalServerError, err - } - } - - c.handler.ServeHTTP(w, r) - if err = c.AfterSave(r, c, user); err != nil { - return http.StatusInternalServerError, err - } - - return 0, nil + if matchURL(r.URL.Path, m.webDavURL) { + return serveWebDAV(w, r, m, u) } w.Header().Set("x-frame-options", "SAMEORIGIN") @@ -110,7 +50,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er w.Header().Set("x-xss-protection", "1; mode=block") // Checks if the User is allowed to access this file - if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.baseURL)) { + if !u.Allowed(strings.TrimPrefix(r.URL.Path, m.baseURL)) { if r.Method == http.MethodGet { return htmlError( w, http.StatusForbidden, @@ -122,43 +62,46 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er } if r.URL.Query().Get("search") != "" { - return search(w, r, c, user) + return search(w, r, m, u) } if r.URL.Query().Get("command") != "" { - return command(w, r, c, user) + return command(w, r, m, u) } if r.Method == http.MethodGet { - // Gets the information of the directory/file - fi, err = getInfo(r.URL, c, user) + var f *fileInfo + + // Obtains the information of the directory/file. + f, err = getInfo(r.URL, m, u) if err != nil { if r.Method == http.MethodGet { return htmlError(w, code, err) } + code = errorToHTTP(err, false) return code, err } // If it's a dir and the path doesn't end with a trailing slash, // redirect the user. - if fi.IsDir && !strings.HasSuffix(r.URL.Path, "/") { - http.Redirect(w, r, c.PrefixURL+r.URL.Path+"/", http.StatusTemporaryRedirect) + if f.IsDir && !strings.HasSuffix(r.URL.Path, "/") { + http.Redirect(w, r, m.PrefixURL+r.URL.Path+"/", http.StatusTemporaryRedirect) return 0, nil } switch { case r.URL.Query().Get("download") != "": - code, err = download(w, r, fi) - case r.URL.Query().Get("raw") == "true" && !fi.IsDir: - http.ServeFile(w, r, fi.Path) + code, err = download(w, r, f) + case r.URL.Query().Get("raw") == "true" && !f.IsDir: + http.ServeFile(w, r, f.Path) code, err = 0, nil - case !fi.IsDir && r.URL.Query().Get("checksum") != "": - code, err = checksum(w, r, fi) - case fi.IsDir: - code, err = serveListing(w, r, c, user, fi) + case !f.IsDir && r.URL.Query().Get("checksum") != "": + code, err = checksum(w, r, f) + case f.IsDir: + code, err = serveListing(w, r, m, u, f) default: - code, err = serveSingle(w, r, c, user, fi) + code, err = serveSingle(w, r, m, u, f) } if err != nil { @@ -170,3 +113,69 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er return http.StatusNotImplemented, nil } + +// serveWebDAV handles the webDAV route of the File Manager. +func serveWebDAV(w http.ResponseWriter, r *http.Request, m *FileManager, u *user) (int, error) { + var err error + + // Checks for user permissions relatively to this path. + if !u.Allowed(strings.TrimPrefix(r.URL.Path, m.webDavURL)) { + return http.StatusForbidden, nil + } + + switch r.Method { + case "GET", "HEAD": + // Excerpt from RFC4918, section 9.4: + // + // GET, when applied to a collection, may return the contents of an + // "index.html" resource, a human-readable view of the contents of + // the collection, or something else altogether. + // + // It was decided on https://github.com/hacdias/caddy-filemanager/issues/85 + // that GET, for collections, will return the same as PROPFIND method. + path := strings.Replace(r.URL.Path, m.webDavURL, "", 1) + path = u.scope + "/" + path + path = filepath.Clean(path) + + var i os.FileInfo + i, err = os.Stat(path) + if err != nil { + // Is there any error? WebDav will handle it... no worries. + break + } + + if i.IsDir() { + r.Method = "PROPFIND" + + if r.Method == "HEAD" { + w = newResponseWriterNoBody(w) + } + } + case "PROPPATCH", "MOVE", "PATCH", "PUT", "DELETE": + if !u.AllowEdit { + return http.StatusForbidden, nil + } + case "MKCOL", "COPY": + if !u.AllowNew { + return http.StatusForbidden, nil + } + } + + // Preprocess the PUT request if it's the case + if r.Method == http.MethodPut { + if err = m.BeforeSave(r, m, u); err != nil { + return http.StatusInternalServerError, err + } + + if put(w, r, m, u) != nil { + return http.StatusInternalServerError, err + } + } + + m.handler.ServeHTTP(w, r) + if err = m.AfterSave(r, m, u); err != nil { + return http.StatusInternalServerError, err + } + + return 0, nil +} From 224151e814a336a177046315dd6ad4238ef88b74 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 15:24:16 +0100 Subject: [PATCH 28/40] Export user Former-commit-id: 3ac186305dcd855b853a5c80ee8f90b50abd19cd --- file.go | 2 +- filemanager.go | 46 ++++++++++++++++++++++++---------------------- http.go | 6 +++--- http_command.go | 2 +- http_listing.go | 2 +- http_put.go | 2 +- http_search.go | 2 +- http_single.go | 2 +- listing.go | 2 +- page.go | 2 +- 10 files changed, 35 insertions(+), 33 deletions(-) diff --git a/file.go b/file.go index e5b58571..4428c0a5 100644 --- a/file.go +++ b/file.go @@ -38,7 +38,7 @@ type fileInfo struct { // getInfo gets the file information and, in case of error, returns the // respective HTTP error code -func getInfo(url *url.URL, c *FileManager, u *user) (*fileInfo, error) { +func getInfo(url *url.URL, c *FileManager, u *User) (*fileInfo, error) { var err error i := &fileInfo{URL: c.PrefixURL + url.Path} diff --git a/filemanager.go b/filemanager.go index 195c63cd..afefbb41 100644 --- a/filemanager.go +++ b/filemanager.go @@ -15,9 +15,10 @@ var ( ErrDuplicated = errors.New("Duplicated user") ) -// FileManager is a file manager instance. +// FileManager is a file manager instance. It should be creating using the +// 'New' function and not directly. type FileManager struct { - *user + *User Assets *assets // BaseURL is the path where the GUI will be accessible. It musn't end with @@ -35,7 +36,7 @@ type FileManager struct { PrefixURL string // Users is a map with the different configurations for each user. - Users map[string]*user + Users map[string]*User // BeforeSave is a function that is called before saving a file. BeforeSave Command @@ -45,10 +46,11 @@ type FileManager struct { } // Command is a command function. -type Command func(r *http.Request, m *FileManager, u *user) error +type Command func(r *http.Request, m *FileManager, u *User) error -// user contains the configuration for each user. -type user struct { +// User contains the configuration for each user. It should be created +// using NewUser on a File Manager instance. +type User struct { // scope is the physical path the user has access to. scope string @@ -100,16 +102,16 @@ type Rule struct { // configuration to work. func New(scope string) *FileManager { m := &FileManager{ - user: &user{ + User: &User{ AllowCommands: true, AllowEdit: true, AllowNew: true, Commands: []string{}, Rules: []*Rule{}, }, - Users: map[string]*user{}, - BeforeSave: func(r *http.Request, m *FileManager, u *user) error { return nil }, - AfterSave: func(r *http.Request, m *FileManager, u *user) error { return nil }, + Users: map[string]*User{}, + BeforeSave: func(r *http.Request, m *FileManager, u *User) error { return nil }, + AfterSave: func(r *http.Request, m *FileManager, u *User) error { return nil }, Assets: &assets{ Templates: rice.MustFindBox("./_assets/templates"), CSS: rice.MustFindBox("./_assets/css"), @@ -174,10 +176,10 @@ func (m *FileManager) SetWebDavURL(url string) { // SetScope updates a user scope and its virtual file system. // If the user string is blank, it will change the base scope. func (m *FileManager) SetScope(scope string, username string) error { - var u *user + var u *User if username == "" { - u = m.user + u = m.User } else { var ok bool u, ok = m.Users[username] @@ -205,22 +207,22 @@ func (m *FileManager) NewUser(username string) error { return ErrDuplicated } - m.Users[username] = &user{ - scope: m.user.scope, - fileSystem: m.user.fileSystem, - handler: m.user.handler, - Rules: m.user.Rules, - AllowNew: m.user.AllowNew, - AllowEdit: m.user.AllowEdit, - AllowCommands: m.user.AllowCommands, - Commands: m.user.Commands, + m.Users[username] = &User{ + scope: m.User.scope, + fileSystem: m.User.fileSystem, + handler: m.User.handler, + Rules: m.User.Rules, + AllowNew: m.User.AllowNew, + AllowEdit: m.User.AllowEdit, + AllowCommands: m.User.AllowCommands, + Commands: m.User.Commands, } return nil } // Allowed checks if the user has permission to access a directory/file. -func (u user) Allowed(url string) bool { +func (u User) Allowed(url string) bool { var rule *Rule i := len(u.Rules) - 1 diff --git a/http.go b/http.go index 3ede6dfb..3aca33aa 100644 --- a/http.go +++ b/http.go @@ -18,7 +18,7 @@ func matchURL(first, second string) bool { // ServeHTTP determines if the request is for this plugin, and if all prerequisites are met. func (m *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { var ( - u *user + u *User code int err error ) @@ -37,7 +37,7 @@ func (m *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er if _, ok := m.Users[username]; ok { u = m.Users[username] } else { - u = m.user + u = m.User } // Checks if the request URL is for the WebDav server @@ -115,7 +115,7 @@ func (m *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er } // serveWebDAV handles the webDAV route of the File Manager. -func serveWebDAV(w http.ResponseWriter, r *http.Request, m *FileManager, u *user) (int, error) { +func serveWebDAV(w http.ResponseWriter, r *http.Request, m *FileManager, u *User) (int, error) { var err error // Checks for user permissions relatively to this path. diff --git a/http_command.go b/http_command.go index 7d7ac6fc..f3b442c1 100644 --- a/http_command.go +++ b/http_command.go @@ -22,7 +22,7 @@ var ( ) // command handles the requests for VCS related commands: git, svn and mercurial -func command(w http.ResponseWriter, r *http.Request, c *FileManager, u *user) (int, error) { +func command(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (int, error) { // Upgrades the connection to a websocket and checks for errors. conn, err := upgrader.Upgrade(w, r, nil) if err != nil { diff --git a/http_listing.go b/http_listing.go index cd881f86..8aefce63 100644 --- a/http_listing.go +++ b/http_listing.go @@ -10,7 +10,7 @@ import ( ) // serveListing presents the user with a listage of a directory folder. -func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *user, i *fileInfo) (int, error) { +func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *User, i *fileInfo) (int, error) { var err error // Loads the content of the directory diff --git a/http_put.go b/http_put.go index 360e4b74..67164119 100644 --- a/http_put.go +++ b/http_put.go @@ -14,7 +14,7 @@ import ( ) // put is used to update a file that was edited -func put(w http.ResponseWriter, r *http.Request, c *FileManager, u *user) (err error) { +func put(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (err error) { var ( data = map[string]interface{}{} file []byte diff --git a/http_search.go b/http_search.go index c4b48a24..daccd795 100644 --- a/http_search.go +++ b/http_search.go @@ -43,7 +43,7 @@ func parseSearch(value string) *searchOptions { } // search searches for a file or directory. -func search(w http.ResponseWriter, r *http.Request, c *FileManager, u *user) (int, error) { +func search(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (int, error) { // Upgrades the connection to a websocket and checks for errors. conn, err := upgrader.Upgrade(w, r, nil) if err != nil { diff --git a/http_single.go b/http_single.go index 2496a2ea..5aa356b1 100644 --- a/http_single.go +++ b/http_single.go @@ -7,7 +7,7 @@ import ( // serveSingle serves a single file in an editor (if it is editable), shows the // plain file, or downloads it if it can't be shown. -func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *user, i *fileInfo) (int, error) { +func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *User, i *fileInfo) (int, error) { var err error if err = i.RetrieveFileType(); err != nil { diff --git a/listing.go b/listing.go index 1863b18a..b4cbbed7 100644 --- a/listing.go +++ b/listing.go @@ -33,7 +33,7 @@ type listing struct { } // getListing gets the information about a specific directory and its files. -func getListing(u *user, filePath string, baseURL string) (*listing, error) { +func getListing(u *User, filePath string, baseURL string) (*listing, error) { // Gets the directory information using the Virtual File System of // the user configuration. file, err := u.fileSystem.OpenFile(context.TODO(), filePath, os.O_RDONLY, 0) diff --git a/page.go b/page.go index 4d91ecb3..74c58011 100644 --- a/page.go +++ b/page.go @@ -35,7 +35,7 @@ type page struct { Name string Path string IsDir bool - User *user + User *User PrefixURL string BaseURL string WebDavURL string From 713e564a6e33507d8567e4476d9f8b5cc47df105 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 15:49:24 +0100 Subject: [PATCH 29/40] export baseURL again -_- Former-commit-id: ab9cf62450beaae87211a3c640dd3e448135be61 --- file.go | 2 +- filemanager.go | 24 +++++++++++++----------- http.go | 10 +++++----- http_assets.go | 2 +- http_command.go | 2 +- http_listing.go | 2 +- http_search.go | 2 +- 7 files changed, 23 insertions(+), 21 deletions(-) diff --git a/file.go b/file.go index 4428c0a5..fd2e612d 100644 --- a/file.go +++ b/file.go @@ -42,7 +42,7 @@ func getInfo(url *url.URL, c *FileManager, u *User) (*fileInfo, error) { var err error i := &fileInfo{URL: c.PrefixURL + url.Path} - i.VirtualPath = strings.Replace(url.Path, c.baseURL, "", 1) + i.VirtualPath = strings.Replace(url.Path, c.BaseURL, "", 1) i.VirtualPath = strings.TrimPrefix(i.VirtualPath, "/") i.VirtualPath = "/" + i.VirtualPath diff --git a/filemanager.go b/filemanager.go index afefbb41..5fce7f2f 100644 --- a/filemanager.go +++ b/filemanager.go @@ -22,13 +22,15 @@ type FileManager struct { Assets *assets // BaseURL is the path where the GUI will be accessible. It musn't end with - // a trailing slash and mustn't contain PrefixURL, if set. - baseURL string + // a trailing slash and mustn't contain PrefixURL, if set. Despite being + // exported, it should only be manipulated using SetBaseURL function. + BaseURL string // WebDavURL is the path where the WebDAV will be accessible. It can be set to "" // in order to override the GUI and only use the WebDAV. It musn't end with - // a trailing slash. - webDavURL string + // a trailing slash. Despite being exported, it should only be manipulated + // using SetWebDavURL function. + WebDavURL string // PrefixURL is a part of the URL that is trimmed from the http.Request.URL before // it arrives to our handlers. It may be useful when using FileManager as a middleware @@ -129,13 +131,13 @@ func New(scope string) *FileManager { // AbsoluteURL returns the actual URL where // File Manager interface can be accessed. func (m FileManager) AbsoluteURL() string { - return m.PrefixURL + m.baseURL + return m.PrefixURL + m.BaseURL } // AbsoluteWebDavURL returns the actual URL // where WebDAV can be accessed. func (m FileManager) AbsoluteWebDavURL() string { - return m.PrefixURL + m.webDavURL + return m.PrefixURL + m.WebDavURL } // SetBaseURL updates the BaseURL of a File Manager @@ -144,7 +146,7 @@ func (m *FileManager) SetBaseURL(url string) { url = strings.TrimPrefix(url, "/") url = strings.TrimSuffix(url, "/") url = "/" + url - m.baseURL = strings.TrimSuffix(url, "/") + m.BaseURL = strings.TrimSuffix(url, "/") } // SetWebDavURL updates the WebDavURL of a File Manager @@ -153,11 +155,11 @@ func (m *FileManager) SetWebDavURL(url string) { url = strings.TrimPrefix(url, "/") url = strings.TrimSuffix(url, "/") - m.webDavURL = m.baseURL + "/" + url + m.WebDavURL = m.BaseURL + "/" + url // update base user webdav handler m.handler = &webdav.Handler{ - Prefix: m.webDavURL, + Prefix: m.WebDavURL, FileSystem: m.fileSystem, LockSystem: webdav.NewMemLS(), } @@ -166,7 +168,7 @@ func (m *FileManager) SetWebDavURL(url string) { // the new URL for _, u := range m.Users { u.handler = &webdav.Handler{ - Prefix: m.webDavURL, + Prefix: m.WebDavURL, FileSystem: u.fileSystem, LockSystem: webdav.NewMemLS(), } @@ -192,7 +194,7 @@ func (m *FileManager) SetScope(scope string, username string) error { u.fileSystem = webdav.Dir(u.scope) u.handler = &webdav.Handler{ - Prefix: m.webDavURL, + Prefix: m.WebDavURL, FileSystem: u.fileSystem, LockSystem: webdav.NewMemLS(), } diff --git a/http.go b/http.go index 3aca33aa..bb11950e 100644 --- a/http.go +++ b/http.go @@ -25,7 +25,7 @@ func (m *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er // Checks if the URL matches the Assets URL. Returns the asset if the // method is GET and Status Forbidden otherwise. - if matchURL(r.URL.Path, m.baseURL+assetsURL) { + if matchURL(r.URL.Path, m.BaseURL+assetsURL) { if r.Method == http.MethodGet { return serveAssets(w, r, m) } @@ -41,7 +41,7 @@ func (m *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er } // Checks if the request URL is for the WebDav server - if matchURL(r.URL.Path, m.webDavURL) { + if matchURL(r.URL.Path, m.WebDavURL) { return serveWebDAV(w, r, m, u) } @@ -50,7 +50,7 @@ func (m *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er w.Header().Set("x-xss-protection", "1; mode=block") // Checks if the User is allowed to access this file - if !u.Allowed(strings.TrimPrefix(r.URL.Path, m.baseURL)) { + if !u.Allowed(strings.TrimPrefix(r.URL.Path, m.BaseURL)) { if r.Method == http.MethodGet { return htmlError( w, http.StatusForbidden, @@ -119,7 +119,7 @@ func serveWebDAV(w http.ResponseWriter, r *http.Request, m *FileManager, u *User var err error // Checks for user permissions relatively to this path. - if !u.Allowed(strings.TrimPrefix(r.URL.Path, m.webDavURL)) { + if !u.Allowed(strings.TrimPrefix(r.URL.Path, m.WebDavURL)) { return http.StatusForbidden, nil } @@ -133,7 +133,7 @@ func serveWebDAV(w http.ResponseWriter, r *http.Request, m *FileManager, u *User // // It was decided on https://github.com/hacdias/caddy-filemanager/issues/85 // that GET, for collections, will return the same as PROPFIND method. - path := strings.Replace(r.URL.Path, m.webDavURL, "", 1) + path := strings.Replace(r.URL.Path, m.WebDavURL, "", 1) path = u.scope + "/" + path path = filepath.Clean(path) diff --git a/http_assets.go b/http_assets.go index c2046a44..9a033187 100644 --- a/http_assets.go +++ b/http_assets.go @@ -14,7 +14,7 @@ const assetsURL = "/_internal" // Serve provides the needed assets for the front-end func serveAssets(w http.ResponseWriter, r *http.Request, m *FileManager) (int, error) { // gets the filename to be used with Assets function - filename := strings.Replace(r.URL.Path, m.baseURL+assetsURL, "", 1) + filename := strings.Replace(r.URL.Path, m.BaseURL+assetsURL, "", 1) var file []byte var err error diff --git a/http_command.go b/http_command.go index f3b442c1..e95071b7 100644 --- a/http_command.go +++ b/http_command.go @@ -77,7 +77,7 @@ func command(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (i } // Gets the path and initializes a buffer. - path := strings.Replace(r.URL.Path, c.baseURL, c.scope, 1) + path := strings.Replace(r.URL.Path, c.BaseURL, c.scope, 1) path = filepath.Clean(path) buff := new(bytes.Buffer) diff --git a/http_listing.go b/http_listing.go index 8aefce63..83aceadc 100644 --- a/http_listing.go +++ b/http_listing.go @@ -25,7 +25,7 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *Use URL: r.URL, } - cookieScope := c.baseURL + cookieScope := c.BaseURL if cookieScope == "" { cookieScope = "/" } diff --git a/http_search.go b/http_search.go index daccd795..5cf27699 100644 --- a/http_search.go +++ b/http_search.go @@ -71,7 +71,7 @@ func search(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (in } search = parseSearch(value) - scope := strings.Replace(r.URL.Path, c.baseURL, "", 1) + scope := strings.Replace(r.URL.Path, c.BaseURL, "", 1) scope = strings.TrimPrefix(scope, "/") scope = "/" + scope scope = u.scope + scope From ba4ea8e05cbb083ce7d0f3565687e05de342cf7d Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 20:52:06 +0100 Subject: [PATCH 30/40] Add scope function to user Former-commit-id: 08aaaa52217e5ad950951536b440ff4fb60b80c4 --- filemanager.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/filemanager.go b/filemanager.go index 5fce7f2f..421621e9 100644 --- a/filemanager.go +++ b/filemanager.go @@ -244,3 +244,8 @@ func (u User) Allowed(url string) bool { return true } + +// Scope returns the user scope. +func (u User) Scope() string { + return u.scope +} From 533fa3e0ca6a6b595df490056c6b9f480d68b6de Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 21:01:54 +0100 Subject: [PATCH 31/40] Create CODE_OF_CONDUCT.md Former-commit-id: 20ed536763b82a413f2168482ebd7ce01fe9f82f --- CODE_OF_CONDUCT.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..f0cc78e8 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hacdias@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ From e8b55b388d59bd385cffb9e4c26906ade9f97e45 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 21:04:34 +0100 Subject: [PATCH 32/40] Add Issue template Former-commit-id: 27eff7262845691a249443e6cb1e2a03edacda9a --- .github/ISSUE_TEMPLATE.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..94902d9d --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,15 @@ +### Instructions (remove before submitting): + +1. If you are filing a bug report, please answer the following questions. +2. If your issue is not a bug report, you do not need to use this template. + +### 1. What are you trying to do? + + +### 2. What did you expect to see? + + +### 3. What did you see instead (give full error messages and/or log)? + + +### 4. How can someone who is starting from scratch reproduce this behaviour as minimally as possible? From b02ac893ec7f5995281227a413c66c67ee1923ca Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 21:54:01 +0100 Subject: [PATCH 33/40] Updates on Templates assets Former-commit-id: 58946e691eb5d223e9e36126e7c192ade2518538 --- filemanager.go | 15 ++++++++------- http_listing.go | 2 +- http_single.go | 4 ++-- page.go | 15 ++++++++++++--- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/filemanager.go b/filemanager.go index 421621e9..02ddfed4 100644 --- a/filemanager.go +++ b/filemanager.go @@ -79,10 +79,11 @@ type User struct { // assets are the static and front-end assets, such as JS, CSS and HTML templates. type assets struct { - requiredJS *rice.Box // JS that is always required to have in order to be usable. - Templates *rice.Box - CSS *rice.Box - JS *rice.Box + requiredJS *rice.Box // JS that is always required to have in order to be usable. + baseTemplates *rice.Box + Templates *rice.Box + CSS *rice.Box + JS *rice.Box } // Rule is a dissalow/allow rule. @@ -115,9 +116,9 @@ func New(scope string) *FileManager { BeforeSave: func(r *http.Request, m *FileManager, u *User) error { return nil }, AfterSave: func(r *http.Request, m *FileManager, u *User) error { return nil }, Assets: &assets{ - Templates: rice.MustFindBox("./_assets/templates"), - CSS: rice.MustFindBox("./_assets/css"), - requiredJS: rice.MustFindBox("./_assets/js"), + baseTemplates: rice.MustFindBox("./_assets/templates"), + CSS: rice.MustFindBox("./_assets/css"), + requiredJS: rice.MustFindBox("./_assets/js"), }, } diff --git a/http_listing.go b/http_listing.go index 83aceadc..4e79eabd 100644 --- a/http_listing.go +++ b/http_listing.go @@ -90,7 +90,7 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *Use Data: listing, } - return p.PrintAsHTML(w, c.Assets.Templates, "listing") + return p.PrintAsHTML(w, c, "listing") } // handleSortOrder gets and stores for a Listing the 'sort' and 'order', diff --git a/http_single.go b/http_single.go index 5aa356b1..7d17f7d6 100644 --- a/http_single.go +++ b/http_single.go @@ -43,8 +43,8 @@ func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *User return http.StatusInternalServerError, err } - return p.PrintAsHTML(w, c.Assets.Templates, "frontmatter", "editor") + return p.PrintAsHTML(w, c, "frontmatter", "editor") } - return p.PrintAsHTML(w, c.Assets.Templates, "single") + return p.PrintAsHTML(w, c, "single") } diff --git a/page.go b/page.go index 74c58011..6a2f0fcc 100644 --- a/page.go +++ b/page.go @@ -9,7 +9,6 @@ import ( "net/http" "strings" - rice "github.com/GeertJohan/go.rice" "github.com/hacdias/filemanager/variables" ) @@ -103,7 +102,7 @@ func (p page) PreviousLink() string { } // PrintAsHTML formats the page in HTML and executes the template -func (p page) PrintAsHTML(w http.ResponseWriter, box *rice.Box, templates ...string) (int, error) { +func (p page) PrintAsHTML(w http.ResponseWriter, m *FileManager, templates ...string) (int, error) { if p.minimal { templates = append(templates, "minimal") } else { @@ -115,7 +114,7 @@ func (p page) PrintAsHTML(w http.ResponseWriter, box *rice.Box, templates ...str // For each template, add it to the the tpl variable for i, t := range templates { // Get the template from the assets - Page, err := box.String(t + ".tmpl") + Page, err := getTemplate(m, t+".tmpl") // Check if there is some error. If so, the template doesn't exist if err != nil { @@ -163,3 +162,13 @@ func (p page) PrintAsJSON(w http.ResponseWriter) (int, error) { return http.StatusOK, nil } + +func getTemplate(m *FileManager, template string) (string, error) { + if m.Assets.Templates != nil { + if tpl, err := m.Assets.Templates.String(template); err == nil { + return tpl, err + } + } + + return m.Assets.baseTemplates.String(template) +} From 20405bc29a84c8cab42665726d3315cbbe3dfb90 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 22:39:18 +0100 Subject: [PATCH 34/40] Updates on assets Former-commit-id: cca2d9c4c6b63346517dd1f422cbf927c06061e2 --- _assets/css/normalize.css | 42 +++++++++++++-------------------------- filemanager.go | 3 ++- http_assets.go | 10 +++++++++- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/_assets/css/normalize.css b/_assets/css/normalize.css index 9b77e0eb..57f93c84 100644 --- a/_assets/css/normalize.css +++ b/_assets/css/normalize.css @@ -1,20 +1,18 @@ -/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */ - -/** - * 1. Change the default font family in all browsers (opinionated). - * 2. Correct the line height in all browsers. - * 3. Prevent adjustments of font size after orientation changes in - * IE on Windows Phone and in iOS. - */ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ /* Document ========================================================================== */ +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + html { - font-family: sans-serif; /* 1 */ - line-height: 1.15; /* 2 */ - -ms-text-size-adjust: 100%; /* 3 */ - -webkit-text-size-adjust: 100%; /* 3 */ + line-height: 1.15; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ } /* Sections @@ -108,17 +106,7 @@ a { } /** - * Remove the outline on focused links when they are also active or hovered - * in all browsers (opinionated). - */ - -a:active, -a:hover { - outline-width: 0; -} - -/** - * 1. Remove the bottom border in Firefox 39-. + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. */ @@ -317,13 +305,11 @@ button:-moz-focusring, } /** - * Change the border, margin, and padding in all browsers (opinionated). + * Correct the padding in Firefox. */ fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; + padding: 0.35em 0.75em 0.625em; } /** @@ -458,4 +444,4 @@ template { [hidden] { display: none; -} +} \ No newline at end of file diff --git a/filemanager.go b/filemanager.go index 02ddfed4..12599057 100644 --- a/filemanager.go +++ b/filemanager.go @@ -81,6 +81,7 @@ type User struct { type assets struct { requiredJS *rice.Box // JS that is always required to have in order to be usable. baseTemplates *rice.Box + baseCSS *rice.Box Templates *rice.Box CSS *rice.Box JS *rice.Box @@ -117,7 +118,7 @@ func New(scope string) *FileManager { AfterSave: func(r *http.Request, m *FileManager, u *User) error { return nil }, Assets: &assets{ baseTemplates: rice.MustFindBox("./_assets/templates"), - CSS: rice.MustFindBox("./_assets/css"), + baseCSS: rice.MustFindBox("./_assets/css"), requiredJS: rice.MustFindBox("./_assets/js"), }, } diff --git a/http_assets.go b/http_assets.go index 9a033187..77d95bcf 100644 --- a/http_assets.go +++ b/http_assets.go @@ -22,7 +22,15 @@ func serveAssets(w http.ResponseWriter, r *http.Request, m *FileManager) (int, e switch { case strings.HasPrefix(filename, "/css"): filename = strings.Replace(filename, "/css/", "", 1) - file, err = m.Assets.CSS.Bytes(filename) + + if m.Assets.CSS != nil { + file, err = m.Assets.JS.Bytes(filename) + if err == nil { + break + } + } + + file, err = m.Assets.baseCSS.Bytes(filename) case strings.HasPrefix(filename, "/js"): filename = strings.Replace(filename, "/js/", "", 1) file, err = m.Assets.requiredJS.Bytes(filename) From a5f92beb958125db96b519405fff66bc974c90c3 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 22:43:43 +0100 Subject: [PATCH 35/40] move templates to separate file Former-commit-id: b466ad616c836dc08206cf0b5f706c343fc923f0 --- _assets/templates/base.tmpl | 86 +------------------------------ _assets/templates/templates.tmpl | 87 ++++++++++++++++++++++++++++++++ page.go | 2 + 3 files changed, 90 insertions(+), 85 deletions(-) create mode 100644 _assets/templates/templates.tmpl diff --git a/_assets/templates/base.tmpl b/_assets/templates/base.tmpl index e72a29f6..e56cbae6 100644 --- a/_assets/templates/base.tmpl +++ b/_assets/templates/base.tmpl @@ -198,91 +198,7 @@ {{- end }} - - - - - - - - -
        -

        Help

        - -
          -
        • F1 - this information
        • -
        • F2 - rename file
        • -
        • DEL - delete selected items
        • -
        • ESC - clear selection and/or close the prompt
        • -
        • CTRL + S - save a file or download the directory where you are
        • -
        • CTRL + Click - select multiple files or directories
        • -
        • Double click - open a file or directory
        • -
        • Click - select file or directory
        • -
        - -

        Not available yet

        - -
          -
        • Alt + Click - select a group of files
        • -
        - -
        - -
        -
        + {{ template "templates" . }} diff --git a/_assets/templates/templates.tmpl b/_assets/templates/templates.tmpl new file mode 100644 index 00000000..33bbabb5 --- /dev/null +++ b/_assets/templates/templates.tmpl @@ -0,0 +1,87 @@ +{{ define "templates" }} + + + + + + + + +
        +

        Help

        + +
          +
        • F1 - this information
        • +
        • F2 - rename file
        • +
        • DEL - delete selected items
        • +
        • ESC - clear selection and/or close the prompt
        • +
        • CTRL + S - save a file or download the directory where you are
        • +
        • CTRL + Click - select multiple files or directories
        • +
        • Double click - open a file or directory
        • +
        • Click - select file or directory
        • +
        + +

        Not available yet

        + +
          +
        • Alt + Click - select a group of files
        • +
        + +
        + +
        +
        +{{ end }} \ No newline at end of file diff --git a/page.go b/page.go index 6a2f0fcc..dec7a0a3 100644 --- a/page.go +++ b/page.go @@ -103,6 +103,8 @@ func (p page) PreviousLink() string { // PrintAsHTML formats the page in HTML and executes the template func (p page) PrintAsHTML(w http.ResponseWriter, m *FileManager, templates ...string) (int, error) { + templates = append(templates, "templates") + if p.minimal { templates = append(templates, "minimal") } else { From 88ff0d7a09fbd9956a86000e606ac93b25d30136 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 22:45:18 +0100 Subject: [PATCH 36/40] fix css bug Former-commit-id: 34a153d496d75e3120e2217feccc266ab986c709 --- http_assets.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/http_assets.go b/http_assets.go index 77d95bcf..57a23be6 100644 --- a/http_assets.go +++ b/http_assets.go @@ -24,7 +24,7 @@ func serveAssets(w http.ResponseWriter, r *http.Request, m *FileManager) (int, e filename = strings.Replace(filename, "/css/", "", 1) if m.Assets.CSS != nil { - file, err = m.Assets.JS.Bytes(filename) + file, err = m.Assets.CSS.Bytes(filename) if err == nil { break } From 5e622f1731db978e7bc89ec047184618b74fc5ab Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 26 Jun 2017 15:30:19 +0100 Subject: [PATCH 37/40] Update normalize and styles Former-commit-id: f2524f6813c136a884b888ef226f1c7570eb29f0 --- _assets/css/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_assets/css/styles.css b/_assets/css/styles.css index eb9d8a5b..502f7748 100644 --- a/_assets/css/styles.css +++ b/_assets/css/styles.css @@ -549,7 +549,7 @@ header>div div { #bottom-bar { background-color: #fafafa; border-top: 1px solid rgba(0, 0, 0, 0.075); - border-bottom: 1px solid rgba(0, 0, 0, 0.075); + /* border-bottom: 1px solid rgba(0, 0, 0, 0.075); */ height: 3.8em; } From 0b7a743c299c94cf542f9423530eeb8c6450e279 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 26 Jun 2017 15:39:35 +0100 Subject: [PATCH 38/40] add caddy plugin Former-commit-id: da7aa22ac54f646dc73f62cad9e3501a59cf503e --- .github/ISSUE_TEMPLATE.md | 21 ++- .travis.yml | 2 + _assets/css/styles.css | 4 +- caddy/README.md | 164 +++++++++++++++++++++++ caddy/filemanager.go | 268 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 451 insertions(+), 8 deletions(-) create mode 100644 caddy/README.md create mode 100644 caddy/filemanager.go diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 94902d9d..ad3cfc9a 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,15 +1,24 @@ ### Instructions (remove before submitting): -1. If you are filing a bug report, please answer the following questions. -2. If your issue is not a bug report, you do not need to use this template. +1. Are you asking for help with using Caddy or File Manager? Please use our forum instead: https://forum.caddyserver.com. +2. If you are filing a bug report, please answer the following questions. +3. If your issue is not a bug report, you do not need to use this template. +4. If not using with Caddy, ignore questions 1 and 2. -### 1. What are you trying to do? +### 1. Have you downloaded File Manager from caddyserver.com? If yes, when have you done that? If no, and you are running a custom build, which is the revision of File Manager's repository? + +### 2. What is your entire Caddyfile? +```text +(Put Caddyfile here) +``` + +### 3. What are you trying to do? -### 2. What did you expect to see? +### 4. What did you expect to see? -### 3. What did you see instead (give full error messages and/or log)? +### 5. What did you see instead (give full error messages and/or log)? -### 4. How can someone who is starting from scratch reproduce this behaviour as minimally as possible? +### 6. How can someone who is starting from scratch reproduce this behaviour as minimally as possible? diff --git a/.travis.yml b/.travis.yml index b0415ea0..10d4e4b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,5 +9,7 @@ install: - go get github.com/gordonklaus/ineffassign script: + - sed -i 's/\_ \"github.com\/mholt\/caddy\/caddyhttp\"/\_ \"github.com\/mholt\/caddy\/caddyhttp\"\n\_ \"github.com\/hacdias\/filemanager\/caddy\"/g' $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go + - go build github.com/mholt/caddy/caddy - go build github.com/hacdias/filemanager - ineffassign . \ No newline at end of file diff --git a/_assets/css/styles.css b/_assets/css/styles.css index 502f7748..eb1196a2 100644 --- a/_assets/css/styles.css +++ b/_assets/css/styles.css @@ -672,8 +672,8 @@ header>div div { #listing h2 { margin: 0 0 0 0.5em; - font-size: 1em; - color: rgba(0, 0, 0, 0.2); + font-size: .9em; + color: rgba(0, 0, 0, 0.38); font-weight: 500; } diff --git a/caddy/README.md b/caddy/README.md new file mode 100644 index 00000000..60072fc0 --- /dev/null +++ b/caddy/README.md @@ -0,0 +1,164 @@ +# filemanager - a caddy plugin + +filemanager provides WebDAV features and a file managing interface within the specified directory and it can be used to upload, delete, preview, rename and edit your files within that directory. It is an implementation of [hacdias/filemanager](https://github.com/hacdias/filemanager) library. + +It is extremely important for security reasons to cover the path of filemanager with some kind of authentication. You can use, for example, [`basicauth`](https://caddyserver.com/docs/basicauth) directive. + +Note that if you are handling large files you might run into troubles due to the defaults of [`timeouts`](https://caddyserver.com/docs/timeouts) plugin. Check its [documentation](https://caddyserver.com/docs/timeouts) to learn more about that plugin. + +## Get Started + +To start using this plugin you just need to go to the [download Caddy page](https://caddyserver.com/download) and choose `filemanager` in the directives section. For further information on how Caddy works refer to [its documentation](https://caddyserver.com/docs). + +If you want to build it from source, consult our [developers section](#developers). + +## Syntax + +``` +filemanager [baseurl] { + show directory + webdav [path] + styles filepath + allow_new [true|false] + allow_edit [true|false] + allow_commands [true|false] + allow_command command + block_command command + before_save command + after_save command + allow [url|dotfiles] + allow_r regex + block [url|dotfiles] + block_r regex +} +``` + +All of the options above are optional. + ++ **baseurl** is the URL where you will access the File Manager interface. Defaults to `/`. ++ **show** is the path, relative or absolute, to the directory you want to browse in. Defaults to `./`. ++ **webdav** is the path that will be appended to baseurl in which the [WebDAV](https://en.wikipedia.org/wiki/WebDAV) will be accessible. Defaults to `/webdav`. ++ **styles** is the relative or absolute path to the stylesheet file. This file doesn't need to be accessible from the web. ++ **allow_new** is the permission to create new files and directories. Defaults to `true`. ++ **allow_edit** is the permission to edit, rename and delete files or directories. Defaults to `true`. ++ **allow_commands** is the permission to execute commands. Defaults to `true`. ++ **allow_command** and **block_command** gives, or denies, permission to execute a certain command through the admin interface. By default `git`, `svn` and `hg` are enabled. ++ **before_save** and **after_save** allow you to set a custom command to be executed before saving and after saving a file. The placeholder `{path}` can be used and it will be replaced by the file path. ++ **allow** and **block** can be used to allow or deny the access to specific files or directories using their URL. You can use the magic word `dotfiles` to allow or block the access to dot-files. The blocked files won't show in the admin interface. By default, `block dotfiles` is activated. ++ **allow_r** and **block_r** and variations of the previous options but you are able to use regular expressions with them. These regular expressions are used to match the URL, **not** the internal file path. + + +So, by **default** we have: + +``` +filemanager / { + show ./ + webdav /webdav + allow_new true + allow_edit true + allow_commands true + allow_command git + allow_command svn + allow_command hg + block dotfiles +} +``` + +As already mentioned, this extension should be used with [`basicauth`](https://caddyserver.com/docs/basicauth). If you do that, you will also be able to set permissions for different users using the following syntax: + +``` +filemanager { + # You set the global configurations here and + # all the users will inherit them. + user1: + # Here you can set specific settings for the 'user1'. + # They will override the global ones for this specific user. +} +``` + +## Examples + +Show the directory where Caddy is being executed at the root of the domain: + +``` +filemanager +``` + +Use only WebDAV: + +``` +filemanager { + webdav / +} +``` + +Show the content of `foo` at the root of the domain: + +``` +filemanager { + show foo/ +} +``` + +Show the directory where Caddy is being executed at `/filemanager`: + +``` +filemanager /filemanager +``` + +Show the content of `foo` at `/bar`: + +``` +filemanager /bar{ + show foo/ +} +``` + +Now, a bit more complicated example. You have three users: an administrator, a manager and an editor. The administrator can do everything and has access to the commands `rm` and `mv` because he is a geeky. The manager, doesn't have access to commands, but can create and edit files. The editor can **only** edit files. He can't even create new ones, because he will only edit the files after the manager creates them for him. Both the editor and the manager won't have access to the financial folder. We would have: + +``` +basicauth /admin admin pass +basicauth /admin manager pass +basicauth /admin editor pass + +filemanager /admin { + show ./ + allow_commands false + admin: + allow_commands true + allow_command rm + allow_command mv + allow dotfiles + manager: + block /admin/financial + editor: + allow_new false + block /admin/financial +} +``` + +## About Search + +FileManager allows you to search through your files and it has some options. By default, your search will be something like this: + +``` +this are keywords +``` + +If you search for that it will look at every file that contains "this", "are" or "keywords" on their name. If you want to search for an exact term, you should surround your search by double quotes: + +``` +"this is the name" +``` + +That will search for any file that contains "this is the name" on its name. It won't search for each separated term this time. + +By default, every search will be case sensitive. Although, you can make a case insensitive search by adding `case:insensitive` to the search terms, like this: + +``` +this are keywords case:insensitive +``` + +## Developers + +If you are a developer and want to contribute, please go to the [filemanager library repository](https://github.com/hacdias/filemanager) where you can find the base code for this project. \ No newline at end of file diff --git a/caddy/filemanager.go b/caddy/filemanager.go new file mode 100644 index 00000000..53f1798f --- /dev/null +++ b/caddy/filemanager.go @@ -0,0 +1,268 @@ +// Package filemanager provides middleware for managing files in a directory +// when directory path is requested instead of a specific file. Based on browse +// middleware. +package filemanager + +import ( + "fmt" + "io/ioutil" + "log" + "net/http" + "os" + "os/exec" + "path/filepath" + "regexp" + "strconv" + "strings" + + "github.com/hacdias/filemanager" + "github.com/mholt/caddy" + "github.com/mholt/caddy/caddyhttp/httpserver" +) + +func init() { + caddy.RegisterPlugin("filemanager", caddy.Plugin{ + ServerType: "http", + Action: setup, + }) +} + +// FileManager is an http.Handler that can show a file listing when +// directories in the given paths are specified. +type FileManager struct { + Next httpserver.Handler + Configs []*filemanager.FileManager +} + +// ServeHTTP determines if the request is for this plugin, and if all prerequisites are met. +func (f FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { + for i := range f.Configs { + // Checks if this Path should be handled by File Manager. + if !httpserver.Path(r.URL.Path).Matches(f.Configs[i].BaseURL) { + continue + } + + return f.Configs[i].ServeHTTP(w, r) + } + + return f.Next.ServeHTTP(w, r) +} + +// setup configures a new FileManager middleware instance. +func setup(c *caddy.Controller) error { + configs, err := parse(c) + if err != nil { + return err + } + + httpserver.GetConfig(c).AddMiddleware(func(next httpserver.Handler) httpserver.Handler { + return FileManager{Configs: configs, Next: next} + }) + + return nil +} + +func parse(c *caddy.Controller) ([]*filemanager.FileManager, error) { + var ( + configs []*filemanager.FileManager + err error + ) + + for c.Next() { + var ( + m = filemanager.New(".") + u = m.User + name = "" + ) + + caddyConf := httpserver.GetConfig(c) + + m.PrefixURL = strings.TrimSuffix(caddyConf.Addr.Path, "/") + m.Commands = []string{"git", "svn", "hg"} + m.Rules = append(m.Rules, &filemanager.Rule{ + Regex: true, + Allow: false, + Regexp: regexp.MustCompile("\\/\\..+"), + }) + + // Get the baseURL + args := c.RemainingArgs() + + if len(args) > 0 { + m.SetBaseURL(args[0]) + m.SetWebDavURL("/webdav") + } + + for c.NextBlock() { + switch c.Val() { + case "before_save": + if m.BeforeSave, err = makeCommand(c); err != nil { + return configs, err + } + case "after_save": + if m.AfterSave, err = makeCommand(c); err != nil { + return configs, err + } + case "webdav": + if !c.NextArg() { + return configs, c.ArgErr() + } + + m.SetWebDavURL(c.Val()) + case "show": + if !c.NextArg() { + return configs, c.ArgErr() + } + + m.SetScope(c.Val(), name) + case "styles": + if !c.NextArg() { + return configs, c.ArgErr() + } + + var tplBytes []byte + tplBytes, err = ioutil.ReadFile(c.Val()) + if err != nil { + return configs, err + } + + u.StyleSheet = string(tplBytes) + case "allow_new": + if !c.NextArg() { + return configs, c.ArgErr() + } + + u.AllowNew, err = strconv.ParseBool(c.Val()) + if err != nil { + return configs, err + } + case "allow_edit": + if !c.NextArg() { + return configs, c.ArgErr() + } + + u.AllowEdit, err = strconv.ParseBool(c.Val()) + if err != nil { + return configs, err + } + case "allow_commands": + if !c.NextArg() { + return configs, c.ArgErr() + } + + u.AllowCommands, err = strconv.ParseBool(c.Val()) + if err != nil { + return configs, err + } + case "allow_command": + if !c.NextArg() { + return configs, c.ArgErr() + } + + u.Commands = append(u.Commands, c.Val()) + case "block_command": + if !c.NextArg() { + return configs, c.ArgErr() + } + + index := 0 + + for i, val := range u.Commands { + if val == c.Val() { + index = i + } + } + + u.Commands = append(u.Commands[:index], u.Commands[index+1:]...) + case "allow", "allow_r", "block", "block_r": + ruleType := c.Val() + + if !c.NextArg() { + return configs, c.ArgErr() + } + + if c.Val() == "dotfiles" && !strings.HasSuffix(ruleType, "_r") { + ruleType += "_r" + } + + rule := &filemanager.Rule{ + Allow: ruleType == "allow" || ruleType == "allow_r", + Regex: ruleType == "allow_r" || ruleType == "block_r", + } + + if rule.Regex && c.Val() == "dotfiles" { + rule.Regexp = regexp.MustCompile("\\/\\..+") + } else if rule.Regex { + rule.Regexp = regexp.MustCompile(c.Val()) + } else { + rule.Path = c.Val() + } + + u.Rules = append(u.Rules, rule) + default: + // Is it a new user? Is it? + val := c.Val() + + // Checks if it's a new user! + if !strings.HasSuffix(val, ":") { + fmt.Println("Unknown option " + val) + } + + // Get the username, sets the current user, and initializes it + val = strings.TrimSuffix(val, ":") + m.NewUser(val) + name = val + } + } + + configs = append(configs, m) + } + + return configs, nil +} + +func makeCommand(c *caddy.Controller) (filemanager.Command, error) { + fn := func(r *http.Request, c *filemanager.FileManager, u *filemanager.User) error { return nil } + + args := c.RemainingArgs() + if len(args) == 0 { + return fn, c.ArgErr() + } + + nonblock := false + if len(args) > 1 && args[len(args)-1] == "&" { + // Run command in background; non-blocking + nonblock = true + args = args[:len(args)-1] + } + + command, args, err := caddy.SplitCommandAndArgs(strings.Join(args, " ")) + if err != nil { + return fn, c.Err(err.Error()) + } + + fn = func(r *http.Request, c *filemanager.FileManager, u *filemanager.User) error { + path := strings.Replace(r.URL.Path, c.WebDavURL, "", 1) + path = u.Scope() + "/" + path + path = filepath.Clean(path) + + for i := range args { + args[i] = strings.Replace(args[i], "{path}", path, -1) + } + + cmd := exec.Command(command, args...) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + if nonblock { + log.Printf("[INFO] Nonblocking Command:\"%s %s\"", command, strings.Join(args, " ")) + return cmd.Start() + } + + log.Printf("[INFO] Blocking Command:\"%s %s\"", command, strings.Join(args, " ")) + return cmd.Run() + } + + return fn, nil +} From 5e25600c86f94c8ddb94ee7f0820d05be5497ca6 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 26 Jun 2017 15:44:39 +0100 Subject: [PATCH 39/40] update readme's Former-commit-id: 7c58acf8e5cf077bddcde0c4f237a5cbf0065675 --- README.md | 24 +++++++++++++++++++++++- caddy/README.md | 30 +++--------------------------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 3f2fb54b..0fde256c 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,26 @@ [![Build](https://img.shields.io/travis/hacdias/filemanager.svg?style=flat-square)](https://travis-ci.org/hacdias/filemanager) [![Go Report Card](https://goreportcard.com/badge/github.com/hacdias/filemanager?style=flat-square)](https://goreportcard.com/report/hacdias/filemanager) [![Documentation](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square)](http://godoc.org/github.com/hacdias/filemanager) -[![Sourcegraph](https://img.shields.io/sourcegraph/rrc//github.com/hacdias/filemanager.svg?style=flat-square)](https://sourcegraph.com/github.com/hacdias/filemanager) + + +## About Search + +FileManager allows you to search through your files and it has some options. By default, your search will be something like this: + +``` +this are keywords +``` + +If you search for that it will look at every file that contains "this", "are" or "keywords" on their name. If you want to search for an exact term, you should surround your search by double quotes: + +``` +"this is the name" +``` + +That will search for any file that contains "this is the name" on its name. It won't search for each separated term this time. + +By default, every search will be case sensitive. Although, you can make a case insensitive search by adding `case:insensitive` to the search terms, like this: + +``` +this are keywords case:insensitive +``` \ No newline at end of file diff --git a/caddy/README.md b/caddy/README.md index 60072fc0..c785f32d 100644 --- a/caddy/README.md +++ b/caddy/README.md @@ -6,6 +6,8 @@ It is extremely important for security reasons to cover the path of filemanager Note that if you are handling large files you might run into troubles due to the defaults of [`timeouts`](https://caddyserver.com/docs/timeouts) plugin. Check its [documentation](https://caddyserver.com/docs/timeouts) to learn more about that plugin. +For information about the working of filemanager itself, go to the [main repository](https://github.com/hacdias/filemanager). + ## Get Started To start using this plugin you just need to go to the [download Caddy page](https://caddyserver.com/download) and choose `filemanager` in the directives section. For further information on how Caddy works refer to [its documentation](https://caddyserver.com/docs). @@ -135,30 +137,4 @@ filemanager /admin { allow_new false block /admin/financial } -``` - -## About Search - -FileManager allows you to search through your files and it has some options. By default, your search will be something like this: - -``` -this are keywords -``` - -If you search for that it will look at every file that contains "this", "are" or "keywords" on their name. If you want to search for an exact term, you should surround your search by double quotes: - -``` -"this is the name" -``` - -That will search for any file that contains "this is the name" on its name. It won't search for each separated term this time. - -By default, every search will be case sensitive. Although, you can make a case insensitive search by adding `case:insensitive` to the search terms, like this: - -``` -this are keywords case:insensitive -``` - -## Developers - -If you are a developer and want to contribute, please go to the [filemanager library repository](https://github.com/hacdias/filemanager) where you can find the base code for this project. \ No newline at end of file +``` \ No newline at end of file From 0821d0e96a55c91cc8772ecd48f92cff4ea0efb8 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 26 Jun 2017 15:48:23 +0100 Subject: [PATCH 40/40] fix travis Former-commit-id: dbb2151eba6eab3243115475d21208915da8f26d --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 10d4e4b8..639bf1a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,6 @@ install: script: - sed -i 's/\_ \"github.com\/mholt\/caddy\/caddyhttp\"/\_ \"github.com\/mholt\/caddy\/caddyhttp\"\n\_ \"github.com\/hacdias\/filemanager\/caddy\"/g' $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go - - go build github.com/mholt/caddy/caddy + - go build github.com/mholt/caddy/caddy -o binary - go build github.com/hacdias/filemanager - ineffassign . \ No newline at end of file