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 b85139a..01fc7b0 100644 --- a/src/cmd/collerd/README.md +++ b/src/cmd/collerd/README.md @@ -31,12 +31,14 @@ 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") * **enable_upload_file_button** (bool): Display the upload file button in the UI (default true) * **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. @@ -85,12 +87,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 @@ -106,8 +108,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 97983f9..256104f 100644 --- a/src/server/config.go +++ b/src/server/config.go @@ -28,7 +28,9 @@ type Config struct { EnableUploadFileButton bool `json:"enable_upload_file_button"` 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 { @@ -56,22 +58,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 d059d7a..2eb9bea 100644 --- a/src/server/handlers_web.go +++ b/src/server/handlers_web.go @@ -21,12 +21,15 @@ type PageData struct { Version string Expirations []int Expiration int + Language string Languages []string Err error URL string Note *Note EnableUploadFileButton bool + AceDirectory string BootstrapDirectory string + DisableEditor bool } type HomeHandler struct { diff --git a/src/server/server.go b/src/server/server.go index f64e2cc..137aa49 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -113,8 +113,11 @@ func (s *Server) Start() error { Title: s.config.Title, Expirations: s.config.Expirations, Expiration: s.config.Expiration, + Language: s.config.Language, Languages: s.config.Languages, + AceDirectory: s.config.AceDirectory, BootstrapDirectory: s.config.BootstrapDirectory, + DisableEditor: s.config.DisableEditor, } if s.config.ShowVersion { @@ -159,6 +162,10 @@ func (s *Server) Start() error { } r.Path("/{id:[a-zA-Z0-9]+}.html").Handler(webNoteHandler).Methods("GET") + 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)))) } @@ -168,10 +175,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 4c18a78..9974972 100644 --- a/src/server/templates/index.html +++ b/src/server/templates/index.html @@ -40,15 +40,17 @@
@@ -56,11 +58,15 @@
+ {{if .DisableEditor}} + + {{else}}
+ {{end}}
@@ -69,38 +75,40 @@
- + {{if eq false .DisableEditor}} + + {{end}} {{block "footer" .}}{{end}} diff --git a/src/server/templates/note.html b/src/server/templates/note.html index 2570851..a7c93cd 100644 --- a/src/server/templates/note.html +++ b/src/server/templates/note.html @@ -28,32 +28,44 @@ + {{if .DisableEditor}} +
+
+{{string .Note.Content}}
+            
+
+ {{else}}
+ style="min-height: 300px; resize: vertical; overflow: auto;">
- + + {{end}} {{end}}