package metadata import ( "bytes" "encoding/json" ) // JSONMetadataParser is the MetadataParser for JSON type JSONMetadataParser struct { metadata Metadata markdown *bytes.Buffer } func (j *JSONMetadataParser) Type() string { return "JSON" } // Parse metadata/markdown file func (j *JSONMetadataParser) Init(b *bytes.Buffer) bool { m := make(map[string]interface{}) err := json.Unmarshal(b.Bytes(), &m) if err != nil { var offset int if jerr, ok := err.(*json.SyntaxError); !ok { return false } else { offset = int(jerr.Offset) } m = make(map[string]interface{}) err = json.Unmarshal(b.Next(offset-1), &m) if err != nil { return false } } j.metadata = NewMetadata() j.metadata.load(m) j.markdown = bytes.NewBuffer(b.Bytes()) return true } // Parse the metadata func (j *JSONMetadataParser) Parse(b []byte) ([]byte, error) { b, markdown, err := extractMetadata(j, b) if err != nil { return markdown, err } m := make(map[string]interface{}) // Read the preceding JSON object decoder := json.NewDecoder(bytes.NewReader(b)) if err := decoder.Decode(&m); err != nil { return markdown, err } j.metadata.load(m) return markdown, nil } // Metadata returns parsed metadata. It should be called // only after a call to Parse returns without error. func (j *JSONMetadataParser) Metadata() Metadata { return j.metadata } func (j *JSONMetadataParser) Markdown() []byte { return j.markdown.Bytes() } // Opening returns the opening identifier JSON metadata func (j *JSONMetadataParser) Opening() []byte { return []byte("{") } // Closing returns the closing identifier JSON metadata func (j *JSONMetadataParser) Closing() []byte { return []byte("}") }