`)
return err
}
const timeLayout = "01-02 15:04"
func (e *email) writeFeedContent(buf *buffer.Bytes, feed *route.Feed) error {
// Write title and source information.
if err := e.writeFeedHeader(buf, feed); err != nil {
return errors.Wrap(err, "write feed header")
}
// Write content.
if err := e.writeFeedBody(buf, feed); err != nil {
return errors.Wrap(err, "write feed body")
}
// Write related articles.
if len(feed.Related) > 0 {
if err := e.writeRelateds(buf, feed.Related); err != nil {
return errors.Wrap(err, "write relateds")
}
}
if _, err := buf.WriteString(`
`); err != nil {
return errors.Wrap(err, "write feed footer")
}
return nil
}
func (e *email) writeFeedHeader(buf *buffer.Bytes, feed *route.Feed) error {
typ := feed.Labels.Get(model.LabelType)
source := feed.Labels.Get(model.LabelSource)
title := feed.Labels.Get(model.LabelTitle)
link := feed.Labels.Get(model.LabelLink)
pubTimeI, _ := timeutil.Parse(feed.Labels.Get(model.LabelPubTime))
pubTime := pubTimeI.In(time.Local).Format(timeLayout)
scrapeTime := feed.Time.In(time.Local).Format(timeLayout)
if _, err := fmt.Fprintf(buf, `
%s
Source: %s/%s
Published: %s | Scraped: %s
`,
title, link, typ, source, pubTime, scrapeTime); err != nil {
return errors.Wrap(err, "write feed header")
}
return nil
}
func (e *email) writeFeedBody(buf *buffer.Bytes, feed *route.Feed) error {
if _, err := buf.WriteString(`
`); err != nil {
return errors.Wrap(err, "write feed body header")
}
if _, err := e.renderFeedContent(buf, feed); err != nil {
return errors.Wrap(err, "render feed content")
}
if _, err := buf.WriteString(`
`); err != nil {
return errors.Wrap(err, "write feed body footer")
}
return nil
}
func (e *email) renderFeedContent(buf *buffer.Bytes, feed *route.Feed) (n int, err error) {
if e.config.feedHTMLSnippetTemplate != nil {
n, err = e.renderHTMLContent(buf, feed)
if err == nil && n > 0 {
return
}
}
// Fallback to markdown.
return e.renderMarkdownContent(buf, feed)
}
func (e *email) renderHTMLContent(buf *buffer.Bytes, feed *route.Feed) (n int, err error) {
oldN := buf.Len()
if err := e.config.feedHTMLSnippetTemplate.Execute(buf, feed.Labels.Map()); err != nil {
return 0, errors.Wrap(err, "execute feed HTML template")
}
return buf.Len() - oldN, nil
}
func (e *email) renderMarkdownContent(buf *buffer.Bytes, feed *route.Feed) (n int, err error) {
oldN := buf.Len()
tempBuf := buffer.Get()
defer buffer.Put(tempBuf)
if err := e.config.feedMakrdownTemplate.Execute(tempBuf, feed.Labels.Map()); err != nil {
return 0, errors.Wrap(err, "execute feed markdown template")
}
contentMarkdown := tempBuf.Bytes()
contentHTML, err := textconvert.MarkdownToHTML(contentMarkdown)
if err != nil {
return 0, errors.Wrap(err, "markdown to HTML")
}
if _, err := buf.Write(contentHTML); err != nil {
return 0, errors.Wrap(err, "write content HTML")
}
return buf.Len() - oldN, nil
}
func (e *email) writeRelateds(buf *buffer.Bytes, related []*route.Feed) error {
if _, err := buf.WriteString(`
Related:
`); err != nil {
return errors.Wrapf(err, "write relateds header")
}
for _, f := range related {
relTyp := f.Labels.Get(model.LabelType)
relSource := f.Labels.Get(model.LabelSource)
relTitle := f.Labels.Get(model.LabelTitle)
relLink := f.Labels.Get(model.LabelLink)
if _, err := fmt.Fprintf(buf, `
`, relLink, relTyp, relSource, relTitle); err != nil {
return errors.Wrapf(err, "write relateds item")
}
}
if _, err := buf.WriteString(`
`); err != nil {
return errors.Wrapf(err, "write relateds footer")
}
return nil
}
func (e *email) writeSeparator(buf *buffer.Bytes) error {
_, err := buf.WriteString(`
`)
return err
}
func (e *email) writeDisclaimer(buf *buffer.Bytes) error {
_, err := buf.WriteString(`
免责声明 / Disclaimer
本邮件内容仅用于个人概括性学习和理解,版权归原作者所有。
This email content is for personal learning and understanding purposes only. All rights reserved to the original author.
严禁二次分发或传播!!!
NO redistribution or sharing!!!
如有侵权,请联系 / For copyright issues, please contact:
ysking7402@gmail.com
`)
return err
}
func (e *email) writeHTMLFooter(buf *buffer.Bytes) error {
_, err := buf.WriteString(`