/* * Invokes a MIME type plugin based on current node's type attribute, passing src attribute's value * as argument. Subcommand's output is piped to Gokogiri through a buffer. */ func (gen *Generator) handleMIMETypePlugin(e xml.Node, doc *html.HtmlDocument) (err error) { src := e.Attribute("src").Value() typ := e.Attribute("type").Value() cmd := exec.Command(fmt.Sprintf("m%s%s", ZAS_PREFIX, gen.resolveMIMETypePlugin(typ)), src) stdout, err := cmd.StdoutPipe() if err != nil { return } cmd.Stderr = os.Stderr c := make(chan bufErr) go func() { data, err := ioutil.ReadAll(stdout) c <- bufErr{data, err} }() if err = cmd.Start(); err != nil { return } be := <-c if err = cmd.Wait(); err != nil { return } if be.err != nil { return be.err } parent := e.Parent() child, err := doc.Coerce(be.buffer) if err != nil { return } parent.AddChild(child) e.Remove() return }
/* * Embeds a Markdown file. */ func (gen *Generator) Markdown(e xml.Node, doc *html.HtmlDocument) (err error) { src := e.Attribute("src").Value() mdInput, err := ioutil.ReadFile(src) if err != nil { return err } md := markdown.MarkdownCommon(mdInput) mdDoc, err := gokogiri.ParseHtml(md) if err != nil { return err } partial, err := mdDoc.Search("//body") if err != nil { return err } parent := e.Parent() child := partial[0].FirstChild() for child != nil { parent.AddChild(child) child = child.NextSibling() } e.Remove() return }
func parseLink(node xml.Node, linksChan chan HNLink) { hnlink := HNLink{ LinkMarkup: template.HTML(node.String()), Excerpt: template.HTML(excerpt(node.Attribute("href").Value()))} linksChan <- hnlink }
// make node's href absolute func absoluteURL(node xml.Node) { url := node.Attribute("href").Value() node.SetAttr("href", githubHost+url) }