close #11
This commit is contained in:
		
							parent
							
								
									69efc2d70f
								
							
						
					
					
						commit
						6df32165b1
					
				
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -81,7 +81,7 @@ $(document).on('ready pjax:success', function() { | |||
|         var value = $(this).val(), | ||||
|           splited = value.split(":"), | ||||
|           filename = "", | ||||
|           archtype = ""; | ||||
|           archetype = ""; | ||||
| 
 | ||||
|         if (value == "") { | ||||
|           notification({ | ||||
|  | @ -95,17 +95,17 @@ $(document).on('ready pjax:success', function() { | |||
|           filename = value; | ||||
|         } else if (splited.length == 2) { | ||||
|           filename = splited[0]; | ||||
|           archtype = splited[1]; | ||||
|           archetype = splited[1]; | ||||
|         } else { | ||||
|           notification({ | ||||
|             text: "Hmm... I don't understand you. Try writing something like 'name[:archtype]'.", | ||||
|             text: "Hmm... I don't understand you. Try writing something like 'name[:archetype]'.", | ||||
|             type: 'error' | ||||
|           }); | ||||
| 
 | ||||
|           return false; | ||||
|         } | ||||
| 
 | ||||
|         var content = '{"filename": "' + filename + '", "archtype": "' + archtype + '"}'; | ||||
|         var content = '{"filename": "' + filename + '", "archetype": "' + archetype + '"}'; | ||||
| 
 | ||||
|         $.ajax({ | ||||
|           type: 'POST', | ||||
|  | @ -262,6 +262,10 @@ $(document).on('ready pjax:success', function() { | |||
|         type = "object"; | ||||
|       } | ||||
| 
 | ||||
|       if (title.is('h2')) { | ||||
|         type = "object" | ||||
|       } | ||||
| 
 | ||||
|       if (type == "object") { | ||||
|         title.after('<input id="new" placeholder="Write the field name and press enter..."></input>'); | ||||
|         element = $("#new"); | ||||
|  |  | |||
|  | @ -115,6 +115,7 @@ div[data-type="array-item"] { | |||
| 
 | ||||
| label:hover > .actions, | ||||
| h1:hover > .actions, | ||||
| h2:hover > .actions, | ||||
| h3:hover > .actions, | ||||
| div[data-type="array-item"]:hover .actions { | ||||
|   opacity: .7; | ||||
|  |  | |||
|  | @ -4,7 +4,6 @@ import ( | |||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | @ -22,12 +21,19 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *config.Config) (int, e | |||
| 	// Removes the page main path from the URL
 | ||||
| 	r.URL.Path = strings.Replace(r.URL.Path, "/admin/browse", "", 1) | ||||
| 
 | ||||
| 	// If the URL is blank now, replace it with a trailing slash
 | ||||
| 	if r.URL.Path == "" { | ||||
| 		r.URL.Path = "/" | ||||
| 	switch r.Method { | ||||
| 	case "DELETE": | ||||
| 		return delete(w, r) | ||||
| 	case "POST": | ||||
| 		return post(w, r) | ||||
| 	case "GET": | ||||
| 		return get(w, r, c) | ||||
| 	default: | ||||
| 		return 400, nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| 	if r.Method == "DELETE" { | ||||
| func delete(w http.ResponseWriter, r *http.Request) (int, error) { | ||||
| 	// Remove both beginning and trailing slashes
 | ||||
| 	r.URL.Path = strings.TrimPrefix(r.URL.Path, "/") | ||||
| 	r.URL.Path = strings.TrimSuffix(r.URL.Path, "/") | ||||
|  | @ -44,6 +50,7 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *config.Config) (int, e | |||
| 
 | ||||
| 		// Check for errors
 | ||||
| 		if err != nil { | ||||
| 			w.Write([]byte(err.Error())) | ||||
| 			return 500, err | ||||
| 		} | ||||
| 	} else { | ||||
|  | @ -52,7 +59,12 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *config.Config) (int, e | |||
| 
 | ||||
| 	w.Header().Set("Content-Type", "application/json") | ||||
| 	w.Write([]byte("{}")) | ||||
| 	} else if r.Method == "POST" { | ||||
| 	return 200, nil | ||||
| } | ||||
| 
 | ||||
| func post(w http.ResponseWriter, r *http.Request) (int, error) { | ||||
| 	// Remove both beginning  slashes
 | ||||
| 	r.URL.Path = strings.TrimPrefix(r.URL.Path, "/") | ||||
| 	// Get the JSON information sent using a buffer
 | ||||
| 	buffer := new(bytes.Buffer) | ||||
| 	buffer.ReadFrom(r.Body) | ||||
|  | @ -61,17 +73,79 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *config.Config) (int, e | |||
| 	var info map[string]interface{} | ||||
| 	json.Unmarshal(buffer.Bytes(), &info) | ||||
| 
 | ||||
| 		// Check if filename and archtype are specified in
 | ||||
| 	// Check if filename and archetype are specified in
 | ||||
| 	// the request
 | ||||
| 	if _, ok := info["filename"]; !ok { | ||||
| 		return 400, errors.New("Filename not specified.") | ||||
| 	} | ||||
| 
 | ||||
| 		if _, ok := info["archtype"]; !ok { | ||||
| 	if _, ok := info["archetype"]; !ok { | ||||
| 		return 400, errors.New("Archtype not specified.") | ||||
| 	} | ||||
| 
 | ||||
| 	} else { | ||||
| 	// Sanitize the file name path
 | ||||
| 	filename := info["filename"].(string) | ||||
| 	filename = strings.TrimPrefix(filename, "/") | ||||
| 	filename = strings.TrimSuffix(filename, "/") | ||||
| 	filename = r.URL.Path + filename | ||||
| 
 | ||||
| 	// Check if the archetype is defined
 | ||||
| 	if info["archetype"] != "" { | ||||
| 		// Sanitize the archetype path
 | ||||
| 		archetype := info["archetype"].(string) | ||||
| 		archetype = strings.Replace(archetype, "/archetypes", "", 1) | ||||
| 		archetype = strings.Replace(archetype, "archetypes", "", 1) | ||||
| 		archetype = strings.TrimPrefix(archetype, "/") | ||||
| 		archetype = strings.TrimSuffix(archetype, "/") | ||||
| 		archetype = "archetypes/" + archetype | ||||
| 
 | ||||
| 		// Check if the archetype ending with .markdown exists
 | ||||
| 		if _, err := os.Stat(archetype + ".markdown"); err == nil { | ||||
| 			err = utils.CopyFile(archetype+".markdown", filename) | ||||
| 
 | ||||
| 			if err != nil { | ||||
| 				w.Write([]byte(err.Error())) | ||||
| 				return 500, err | ||||
| 			} | ||||
| 
 | ||||
| 			w.Header().Set("Location", "/admin/edit/"+filename) | ||||
| 			w.Header().Set("Content-Type", "application/json") | ||||
| 			w.Write([]byte("{}")) | ||||
| 			return 201, nil | ||||
| 		} | ||||
| 
 | ||||
| 		// Check if the archetype ending with .md exists
 | ||||
| 		if _, err := os.Stat(archetype + ".md"); err == nil { | ||||
| 			err = utils.CopyFile(archetype+".md", filename) | ||||
| 
 | ||||
| 			if err != nil { | ||||
| 				w.Write([]byte(err.Error())) | ||||
| 				return 500, err | ||||
| 			} | ||||
| 
 | ||||
| 			w.Header().Set("Location", "/admin/edit/"+filename) | ||||
| 			w.Header().Set("Content-Type", "application/json") | ||||
| 			w.Write([]byte("{}")) | ||||
| 			return 201, nil | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	wf, err := os.Create(filename) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		w.Write([]byte(err.Error())) | ||||
| 		return 500, err | ||||
| 	} | ||||
| 
 | ||||
| 	defer wf.Close() | ||||
| 
 | ||||
| 	w.Header().Set("Location", "/admin/edit/"+filename) | ||||
| 	w.Header().Set("Content-Type", "application/json") | ||||
| 	w.Write([]byte("{}")) | ||||
| 	return 200, nil | ||||
| } | ||||
| 
 | ||||
| func get(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error) { | ||||
| 	functions := template.FuncMap{ | ||||
| 		"CanBeEdited": utils.CanBeEdited, | ||||
| 		"Defined":     utils.Defined, | ||||
|  | @ -80,7 +154,7 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *config.Config) (int, e | |||
| 	tpl, err := utils.GetTemplate(r, functions, "browse") | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 			log.Print(err) | ||||
| 		w.Write([]byte(err.Error())) | ||||
| 		return 500, err | ||||
| 	} | ||||
| 
 | ||||
|  | @ -100,7 +174,4 @@ func ServeHTTP(w http.ResponseWriter, r *http.Request, c *config.Config) (int, e | |||
| 	} | ||||
| 
 | ||||
| 	return b.ServeHTTP(w, r) | ||||
| 	} | ||||
| 
 | ||||
| 	return 200, nil | ||||
| } | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ import ( | |||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
|  | @ -83,7 +82,7 @@ func servePost(w http.ResponseWriter, r *http.Request, filename string) (int, er | |||
| 		f = []byte(fString) | ||||
| 
 | ||||
| 		if err != nil { | ||||
| 			log.Print(err) | ||||
| 			w.Write([]byte(err.Error())) | ||||
| 			return 500, err | ||||
| 		} | ||||
| 
 | ||||
|  | @ -106,7 +105,7 @@ func servePost(w http.ResponseWriter, r *http.Request, filename string) (int, er | |||
| 		jsonFrontmatter, err := json.Marshal(rawFile) | ||||
| 
 | ||||
| 		if err != nil { | ||||
| 			log.Print(err) | ||||
| 			w.Write([]byte(err.Error())) | ||||
| 			return 500, err | ||||
| 		} | ||||
| 
 | ||||
|  | @ -127,7 +126,7 @@ func servePost(w http.ResponseWriter, r *http.Request, filename string) (int, er | |||
| 	err := ioutil.WriteFile(filename, file, 0666) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		log.Print(err) | ||||
| 		w.Write([]byte(err.Error())) | ||||
| 		return 500, err | ||||
| 	} | ||||
| 
 | ||||
|  | @ -145,14 +144,14 @@ func serveGet(w http.ResponseWriter, r *http.Request, c *config.Config, filename | |||
| 
 | ||||
| 	// Check if the file exists. If it doesn't, send a "Not Found" message
 | ||||
| 	if _, err := os.Stat(filename); os.IsNotExist(err) { | ||||
| 		log.Print(err) | ||||
| 		w.Write([]byte(err.Error())) | ||||
| 		return 404, nil | ||||
| 	} | ||||
| 
 | ||||
| 	// Open the file and check if there was some error while opening
 | ||||
| 	file, err := ioutil.ReadFile(filename) | ||||
| 	if err != nil { | ||||
| 		log.Print(err) | ||||
| 		w.Write([]byte(err.Error())) | ||||
| 		return 500, err | ||||
| 	} | ||||
| 
 | ||||
|  | @ -173,7 +172,7 @@ func serveGet(w http.ResponseWriter, r *http.Request, c *config.Config, filename | |||
| 			buffer := bytes.NewBuffer(file) | ||||
| 			file, err := parser.ReadFrom(buffer) | ||||
| 			if err != nil { | ||||
| 				log.Print(err) | ||||
| 				w.Write([]byte(err.Error())) | ||||
| 				return 500, err | ||||
| 			} | ||||
| 
 | ||||
|  | @ -200,7 +199,7 @@ func serveGet(w http.ResponseWriter, r *http.Request, c *config.Config, filename | |||
| 
 | ||||
| 		// Check if there were any errors
 | ||||
| 		if err != nil { | ||||
| 			log.Print(err) | ||||
| 			w.Write([]byte(err.Error())) | ||||
| 			return 500, err | ||||
| 		} | ||||
| 	default: | ||||
|  | @ -217,8 +216,9 @@ func serveGet(w http.ResponseWriter, r *http.Request, c *config.Config, filename | |||
| 	} | ||||
| 
 | ||||
| 	tpl, err := utils.GetTemplate(r, functions, "editor", "frontmatter") | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		log.Print(err) | ||||
| 		w.Write([]byte(err.Error())) | ||||
| 		return 500, err | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -31,7 +31,11 @@ | |||
|           <div id="preview-area" class="scroll hidden"></div> | ||||
|         </div> | ||||
|         <div class="frontmatter scroll"> | ||||
|           <h2>Metadata</h2> | ||||
|           <h2>Metadata | ||||
|             <span class="actions"> | ||||
|               <button class="add"><i class="fa fa-plus"></i></button> | ||||
|             </span> | ||||
|           </h2> | ||||
|           {{ template "frontmatter" .FrontMatter }} | ||||
|         </div> | ||||
|         {{ end }} | ||||
|  |  | |||
|  | @ -2,8 +2,10 @@ package utils | |||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"text/template" | ||||
|  | @ -12,6 +14,30 @@ import ( | |||
| 	"github.com/hacdias/caddy-hugo/assets" | ||||
| ) | ||||
| 
 | ||||
| // CopyFile is used to copy a file
 | ||||
| func CopyFile(old, new string) error { | ||||
| 	// Open the file and create a new one
 | ||||
| 	r, err := os.Open(old) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer r.Close() | ||||
| 
 | ||||
| 	w, err := os.Create(new) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer w.Close() | ||||
| 
 | ||||
| 	// Copy the content
 | ||||
| 	_, err = io.Copy(w, r) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CanBeEdited checks if a filename has a supported extension
 | ||||
| func CanBeEdited(filename string) bool { | ||||
| 	extensions := [...]string{".markdown", ".md", | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue