diff --git a/package-lock.json b/package-lock.json index 4cf810c..65ad597 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "packages": { "": { "dependencies": { + "ace-builds": "^1.43.3", "bootstrap": "^5.3.8" } }, @@ -18,6 +19,11 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/ace-builds": { + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.43.3.tgz", + "integrity": "sha512-MCl9rALmXwIty/4Qboijo/yNysx1r6hBTzG+6n/TiOm5LFhZpEvEIcIITPFiEOEFDfgBOEmxu+a4f54LEFM6Sg==" + }, "node_modules/bootstrap": { "version": "5.3.8", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", diff --git a/package.json b/package.json index 719e5df..5374149 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "ace-builds": "^1.43.3", "bootstrap": "^5.3.8" } } diff --git a/src/cmd/collerd/README.md b/src/cmd/collerd/README.md index b33d207..1f62bab 100644 --- a/src/cmd/collerd/README.md +++ b/src/cmd/collerd/README.md @@ -35,11 +35,13 @@ The file format is **JSON**: * **prometheus_route** (string): Route to expose Prometheus metrics (default "/metrics") * **prometheus_notes_metric** (string): Name of the notes count metric (default "collerd_notes") * **observation_internal** (int): Number of seconds to wait between two observations (default 60) -* **languages** ([]string): List of supported [languages](https://github.com/microsoft/monaco-editor/tree/main/src/basic-languages) +* **languages** ([]string): List of supported [languages](https://github.com/ajaxorg/ace/tree/master/src/mode) * **language** (string): Default language (default "text") * **tls_cert_file** (string): Path to TLS certificate file to enable HTTPS * **tls_key_file** (string): Path to TLS key file to enable HTTPS +* **ace_directory** (string): Serve [Ace](hhttps://ace.c9.io/) assets from this local directory (ex: "./node_modules/ace-builds"). See **Dependencies** for details. * **bootstrap_directory** (string): Serve [Bootstrap](https://getbootstrap.com/) assets from this local directory (ex: "./node_modules/bootstrap/dist"). See **Dependencies** for details. +* **disable_editor** (bool): Disable Ace editor. The configuration file is not required but the service might not be exposed to the public. @@ -107,12 +109,12 @@ Errors return **500 Server Internal Error** with the **JSON** payload: The web interface depends on: +- [Ace](https://ace.c9.io/) - [Bootstrap](https://getbootstrap.com/) -- [Monaco Editor](https://github.com/microsoft/monaco-editor/) By default, those dependencies are fetched from **remote CDN** services by the client. -If you would like to download them to serve them locally: +If you would like to download and serve them locally: ``` npm install @@ -128,8 +130,7 @@ Then configure the local directories: ```json { + "ace_directory": "./node_modules/ace-builds", "bootstrap_directory": "./node_modules/bootstrap/dist" } -``` - -Downloading Monaco Editor is not supported yet. +``` \ No newline at end of file diff --git a/src/server/config.go b/src/server/config.go index ba9529c..bb27bd2 100644 --- a/src/server/config.go +++ b/src/server/config.go @@ -31,7 +31,9 @@ type Config struct { Language string `json:"language"` TLSCertFile string `json:"tls_cert_file"` TLSKeyFile string `json:"tls_key_file"` + AceDirectory string `json:"ace_directory"` BootstrapDirectory string `json:"bootstrap_directory"` + DisableEditor bool `json:"disable_editor"` } func NewConfig() *Config { @@ -59,22 +61,21 @@ func NewConfig() *Config { PrometheusNotesMetric: "collerd_notes", ObservationInterval: 60, Languages: []string{ - "Text", - "CSS", - "Dockerfile", - "Go", - "HCL", - "HTML", - "Javascript", - "JSON", - "Markdown", - "Perl", - "Python", - "Ruby", - "Rust", - "Shell", - "SQL", - "YAML", + "css", + "dockerfile", + "golang", + "html", + "javascript", + "json", + "markdown", + "perl", + "python", + "ruby", + "rust", + "sh", + "sql", + "text", + "yaml", }, Language: "text", EnableUploadFileButton: true, diff --git a/src/server/handlers_web.go b/src/server/handlers_web.go index c7a6087..aa91e59 100644 --- a/src/server/handlers_web.go +++ b/src/server/handlers_web.go @@ -23,6 +23,7 @@ type PageData struct { Expirations []int Expiration int Languages []string + Language string Err error URL string Note *Note @@ -30,7 +31,9 @@ type PageData struct { EnableUploadFileButton bool AllowClientEncryptionKey bool AllowNoEncryption bool + AceDirectory string BootstrapDirectory string + DisableEditor bool } type HomeHandler struct { diff --git a/src/server/server.go b/src/server/server.go index 431a620..025ffdf 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -120,6 +120,9 @@ func (s *Server) Start() error { Expirations: s.config.Expirations, Expiration: s.config.Expiration, Languages: s.config.Languages, + Language: s.config.Language, + AceDirectory: s.config.AceDirectory, + DisableEditor: s.config.DisableEditor, BootstrapDirectory: s.config.BootstrapDirectory, EnableUploadFileButton: s.config.EnableUploadFileButton, EnablePasswordProtection: s.config.EnablePasswordProtection, @@ -225,6 +228,10 @@ func (s *Server) Start() error { } r.Path("/{id:[a-zA-Z0-9]+}.html").Handler(protectedWebNoteHandler).Methods("POST") + if s.config.AceDirectory != "" { + r.PathPrefix("/static/ace-builds/").Handler(http.StripPrefix("/static/ace-builds/", http.FileServer(http.Dir(s.config.AceDirectory)))) + } + if s.config.BootstrapDirectory != "" { r.PathPrefix("/static/bootstrap/").Handler(http.StripPrefix("/static/bootstrap/", http.FileServer(http.Dir(s.config.BootstrapDirectory)))) } @@ -234,10 +241,10 @@ func (s *Server) Start() error { addr := fmt.Sprintf("%s:%d", s.config.ListenAddress, s.config.ListenPort) if s.config.HasTLS() { - s.logger.Info(fmt.Sprintf("listening to %s:%d (https)", s.config.ListenAddress, s.config.ListenPort)) + s.logger.Info(fmt.Sprintf("listening to %s:%d", s.config.ListenAddress, s.config.ListenPort), slog.Any("scheme", "http")) return http.ListenAndServeTLS(addr, s.config.TLSCertFile, s.config.TLSKeyFile, r) } else { - s.logger.Info(fmt.Sprintf("listening to %s:%d (http)", s.config.ListenAddress, s.config.ListenPort)) + s.logger.Info(fmt.Sprintf("listening to %s:%d", s.config.ListenAddress, s.config.ListenPort), slog.Any("scheme", "https")) return http.ListenAndServe(addr, r) } } diff --git a/src/server/templates/head.html b/src/server/templates/head.html index e5f3544..ab2edfd 100644 --- a/src/server/templates/head.html +++ b/src/server/templates/head.html @@ -4,6 +4,8 @@ {{.Title}} - + {{end}} \ No newline at end of file diff --git a/src/server/templates/index.html b/src/server/templates/index.html index b4b3c00..99da0cd 100644 --- a/src/server/templates/index.html +++ b/src/server/templates/index.html @@ -59,9 +59,10 @@
@@ -69,11 +70,15 @@
+ {{if .DisableEditor}} + + {{else}}
+ style="min-height: 300px; resize: vertical; overflow: auto;">
+ {{end}}
@@ -82,38 +87,40 @@
- + {{if eq false .DisableEditor}} + + {{end}} {{block "footer" .}}{{end}} diff --git a/src/server/templates/note.html b/src/server/templates/note.html index 344f38f..977705c 100644 --- a/src/server/templates/note.html +++ b/src/server/templates/note.html @@ -20,32 +20,44 @@ {{end}} + {{if .DisableEditor}}
-
+
+{{string .Note.Content}}
+            
+
+ {{else}} +
+
- + + {{end}}
{{end}} {{end}} \ No newline at end of file