123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- package helpers
- import (
- "encoding/json"
- "time"
- "github.com/gomarkdown/markdown"
- "github.com/gomarkdown/markdown/html"
- "github.com/gomarkdown/markdown/parser"
- "github.com/redis/go-redis/v9"
- )
- const HEADER_KEY = "header-links"
- const MENU_KEY = "menu-config"
- const ADMIN_TABLE_KEY = "admin-tables"
- const TECHNICAL = "technical"
- const CONFIGURATION = "configuration"
- const BLOG = "blog"
- const CREATIVE = "creative"
- const DIGITAL_ART = "digital_art"
- var Topics = []string{
- TECHNICAL,
- BLOG,
- CREATIVE,
- }
- var TopicMap = map[string]string{
- TECHNICAL: TECHNICAL,
- BLOG: BLOG,
- CREATIVE: CREATIVE,
- }
- type HeaderCollection struct {
- Category string `json:"category"`
- Elements []HeaderElem `json:"elements"`
- }
- type HeaderElem struct {
- Png string `json:"png"`
- Link string `json:"link"`
- }
- type ImageElement struct {
- ImgUrl string `json:"img_url"`
- }
- type MenuElement struct {
- Png string `json:"png"`
- Category string `json:"category"`
- MenuLinks []MenuLinkPair `json:"menu_links"`
- }
- type DocumentOld struct {
- Ident string `json:"identifier"`
- Created string `json:"created"`
- Body string `json:"body"`
- Category string `json:"category"`
- Sample string
- }
- type AdminTables struct {
- Tables []Table `json:"tables"`
- }
- type Table struct {
- TableName string `json:"table_name"`
- TableData []TableData `json:"table_data"`
- }
- type TableData struct { // TODO: add this to the database io interface
- DisplayName string `json:"display_name"`
- Link string `json:"link"`
- }
- func NewDocument(ident string, created *time.Time, body string, category string) Document {
- var ts time.Time
- if created == nil {
- rn := time.Now()
- ts = time.Date(rn.Year(), rn.Month(), rn.Day(), rn.Hour(), rn.Minute(),
- rn.Second(), rn.Nanosecond(), rn.Location())
- } else {
- ts = *created
- }
- return Document{Ident: ident, Created: ts.String(), Body: body, Category: category}
- }
- type DocumentUpload struct {
- Name string `json:"name"`
- Category string `json:"category"`
- Text string `json:"text"`
- }
- type HeaderIo interface {
- GetHeaders() (*HeaderCollection, error)
- AddHeaders(HeaderCollection) error
- GetMenuLinks() (*MenuElement, error)
- }
- /*
- Retrieves the header data from the redis database
- */
- func GetHeaders(redisCfg RedisConf) (*HeaderCollection, error) {
- rds := NewRedisClient(redisCfg)
- d, err := rds.Client.Get(rds.ctx, HEADER_KEY).Result()
- if err != nil {
- if err == redis.Nil {
- return nil, nil
- }
- return nil, err
- }
- header := &HeaderCollection{}
- err = json.Unmarshal([]byte(d), header)
- if err != nil {
- return nil, err
- }
- return header, nil
- }
- /*
- Retrieves the menu elements from the database
- */
- func GetMenuLinks(redisCfg RedisConf) (*MenuElement, error) {
- rds := NewRedisClient(redisCfg)
- d, err := rds.Client.Get(rds.ctx, MENU_KEY).Result()
- if err != nil {
- if err == redis.Nil {
- return nil, nil
- }
- return nil, err
- }
- header := &MenuElement{}
- err = json.Unmarshal([]byte(d), header)
- if err != nil {
- return nil, err
- }
- return header, nil
- }
- /*
- retreives the admin table config from the database
- */
- func GetAdminTables(redisCfg RedisConf) (*AdminTables, error) {
- rds := NewRedisClient(redisCfg)
- d, err := rds.Client.Get(rds.ctx, ADMIN_TABLE_KEY).Result()
- if err != nil {
- if err == redis.Nil {
- return nil, nil
- }
- return nil, err
- }
- tables := &AdminTables{}
- err = json.Unmarshal([]byte(d), tables)
- if err != nil {
- return nil, err
- }
- return tables, nil
- }
- /*
- Place holder func to create the header element in redis
- */
- func AddHeaders(h HeaderCollection, redisCfg RedisConf) error {
- rdc := NewRedisClient(redisCfg)
- data, err := json.Marshal(&h)
- if err != nil {
- return err
- }
- err = rdc.Client.Set(rdc.ctx, HEADER_KEY, data, 0).Err()
- if err != nil {
- return err
- }
- return nil
- }
- /*
- Retrieve all documents from the category specified in the argument category
- :param category: the category to get documents from
- */
- func GetAllDocuments(category string, redisCfg RedisConf) ([]*Document, error) {
- rdc := NewRedisClient(redisCfg)
- ids, err := rdc.AllDocIds()
- if err != nil {
- return nil, err
- }
- var docs []*Document
- for idx := range ids {
- doc, err := rdc.GetItem(ids[idx])
- if err != nil {
- return nil, err
- }
- if doc.Category != category {
- continue
- }
- docs = append(docs, &Document{
- Ident: doc.Ident,
- Created: doc.Created,
- Body: doc.Body,
- Sample: doc.MakeSample(),
- })
- }
- return docs, nil
- }
- /*
- adds a text post document to the redis database
- */
- func AddDocument(d Document, redisCfg RedisConf) error {
- rdc := NewRedisClient(redisCfg)
- return rdc.AddDoc(d)
- }
- /*
- convert markdown to html
- :param md: the byte array containing the Markdown to convert
- */
- func MdToHTML(md []byte) []byte {
- extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock
- p := parser.NewWithExtensions(extensions)
- doc := p.Parse(md)
- htmlFlags := html.CommonFlags | html.HrefTargetBlank
- opts := html.RendererOptions{Flags: htmlFlags}
- renderer := html.NewRenderer(opts)
- return markdown.Render(doc, renderer)
- }
|