github.com/bosssauce/ponzu@v0.11.1-0.20200102001432-9bc41b703131/management/editor/dom.go (about)

     1  package editor
     2  
     3  import (
     4  	"bytes"
     5  	"html"
     6  	"log"
     7  	"strings"
     8  )
     9  
    10  // Element is a basic struct for representing DOM elements
    11  type Element struct {
    12  	TagName string
    13  	Attrs   map[string]string
    14  	Name    string
    15  	Label   string
    16  	Data    string
    17  	ViewBuf *bytes.Buffer
    18  }
    19  
    20  // NewElement returns an Element with Name and Data already processed from the
    21  // fieldName and content interface provided
    22  func NewElement(tagName, label, fieldName string, p interface{}, attrs map[string]string) *Element {
    23  	return &Element{
    24  		TagName: tagName,
    25  		Attrs:   attrs,
    26  		Name:    TagNameFromStructField(fieldName, p),
    27  		Label:   label,
    28  		Data:    ValueFromStructField(fieldName, p),
    29  		ViewBuf: &bytes.Buffer{},
    30  	}
    31  }
    32  
    33  // DOMElementSelfClose is a special DOM element which is parsed as a
    34  // self-closing tag and thus needs to be created differently
    35  func DOMElementSelfClose(e *Element) []byte {
    36  	_, err := e.ViewBuf.WriteString(`<div class="input-field col s12">`)
    37  	if err != nil {
    38  		log.Println("Error writing HTML string to buffer: DOMElementSelfClose")
    39  		return nil
    40  	}
    41  
    42  	if e.Label != "" {
    43  		_, err = e.ViewBuf.WriteString(
    44  			`<label class="active" for="` +
    45  				strings.Join(strings.Split(e.Label, " "), "-") + `">` + e.Label +
    46  				`</label>`)
    47  		if err != nil {
    48  			log.Println("Error writing HTML string to buffer: DOMElementSelfClose")
    49  			return nil
    50  		}
    51  	}
    52  
    53  	_, err = e.ViewBuf.WriteString(`<` + e.TagName + ` value="`)
    54  	if err != nil {
    55  		log.Println("Error writing HTML string to buffer: DOMElementSelfClose")
    56  		return nil
    57  	}
    58  
    59  	_, err = e.ViewBuf.WriteString(html.EscapeString(e.Data) + `" `)
    60  	if err != nil {
    61  		log.Println("Error writing HTML string to buffer: DOMElementSelfClose")
    62  		return nil
    63  	}
    64  
    65  	for attr, value := range e.Attrs {
    66  		_, err := e.ViewBuf.WriteString(attr + `="` + value + `" `)
    67  		if err != nil {
    68  			log.Println("Error writing HTML string to buffer: DOMElementSelfClose")
    69  			return nil
    70  		}
    71  	}
    72  	_, err = e.ViewBuf.WriteString(` name="` + e.Name + `" />`)
    73  	if err != nil {
    74  		log.Println("Error writing HTML string to buffer: DOMElementSelfClose")
    75  		return nil
    76  	}
    77  
    78  	_, err = e.ViewBuf.WriteString(`</div>`)
    79  	if err != nil {
    80  		log.Println("Error writing HTML string to buffer: DOMElementSelfClose")
    81  		return nil
    82  	}
    83  
    84  	return e.ViewBuf.Bytes()
    85  }
    86  
    87  // DOMElementCheckbox is a special DOM element which is parsed as a
    88  // checkbox input tag and thus needs to be created differently
    89  func DOMElementCheckbox(e *Element) []byte {
    90  	_, err := e.ViewBuf.WriteString(`<p class="col s6">`)
    91  	if err != nil {
    92  		log.Println("Error writing HTML string to buffer: DOMElementCheckbox")
    93  		return nil
    94  	}
    95  
    96  	_, err = e.ViewBuf.WriteString(`<` + e.TagName + ` `)
    97  	if err != nil {
    98  		log.Println("Error writing HTML string to buffer: DOMElementCheckbox")
    99  		return nil
   100  	}
   101  
   102  	for attr, value := range e.Attrs {
   103  		_, err := e.ViewBuf.WriteString(attr + `="` + value + `" `)
   104  		if err != nil {
   105  			log.Println("Error writing HTML string to buffer: DOMElementCheckbox")
   106  			return nil
   107  		}
   108  	}
   109  	_, err = e.ViewBuf.WriteString(` name="` + e.Name + `" />`)
   110  	if err != nil {
   111  		log.Println("Error writing HTML string to buffer: DOMElementCheckbox")
   112  		return nil
   113  	}
   114  
   115  	if e.Label != "" {
   116  		_, err = e.ViewBuf.WriteString(
   117  			`<label for="` +
   118  				strings.Join(strings.Split(e.Label, " "), "-") + `">` +
   119  				e.Label + `</label>`)
   120  		if err != nil {
   121  			log.Println("Error writing HTML string to buffer: DOMElementCheckbox")
   122  			return nil
   123  		}
   124  	}
   125  
   126  	_, err = e.ViewBuf.WriteString(`</p>`)
   127  	if err != nil {
   128  		log.Println("Error writing HTML string to buffer: DOMElementCheckbox")
   129  		return nil
   130  	}
   131  
   132  	return e.ViewBuf.Bytes()
   133  }
   134  
   135  // DOMElement creates a DOM element
   136  func DOMElement(e *Element) []byte {
   137  	_, err := e.ViewBuf.WriteString(`<div class="input-field col s12">`)
   138  	if err != nil {
   139  		log.Println("Error writing HTML string to buffer: DOMElement")
   140  		return nil
   141  	}
   142  
   143  	if e.Label != "" {
   144  		_, err = e.ViewBuf.WriteString(
   145  			`<label class="active" for="` +
   146  				strings.Join(strings.Split(e.Label, " "), "-") + `">` + e.Label +
   147  				`</label>`)
   148  		if err != nil {
   149  			log.Println("Error writing HTML string to buffer: DOMElement")
   150  			return nil
   151  		}
   152  	}
   153  
   154  	_, err = e.ViewBuf.WriteString(`<` + e.TagName + ` `)
   155  	if err != nil {
   156  		log.Println("Error writing HTML string to buffer: DOMElement")
   157  		return nil
   158  	}
   159  
   160  	for attr, value := range e.Attrs {
   161  		_, err = e.ViewBuf.WriteString(attr + `="` + string(value) + `" `)
   162  		if err != nil {
   163  			log.Println("Error writing HTML string to buffer: DOMElement")
   164  			return nil
   165  		}
   166  	}
   167  	_, err = e.ViewBuf.WriteString(` name="` + e.Name + `" >`)
   168  	if err != nil {
   169  		log.Println("Error writing HTML string to buffer: DOMElement")
   170  		return nil
   171  	}
   172  
   173  	_, err = e.ViewBuf.WriteString(html.EscapeString(e.Data))
   174  	if err != nil {
   175  		log.Println("Error writing HTML string to buffer: DOMElement")
   176  		return nil
   177  	}
   178  
   179  	_, err = e.ViewBuf.WriteString(`</` + e.TagName + `>`)
   180  	if err != nil {
   181  		log.Println("Error writing HTML string to buffer: DOMElement")
   182  		return nil
   183  	}
   184  
   185  	_, err = e.ViewBuf.WriteString(`</div>`)
   186  	if err != nil {
   187  		log.Println("Error writing HTML string to buffer: DOMElement")
   188  		return nil
   189  	}
   190  
   191  	return e.ViewBuf.Bytes()
   192  }
   193  
   194  func DOMElementWithChildrenSelect(e *Element, children []*Element) []byte {
   195  	_, err := e.ViewBuf.WriteString(`<div class="input-field col s6">`)
   196  	if err != nil {
   197  		log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect")
   198  		return nil
   199  	}
   200  
   201  	_, err = e.ViewBuf.WriteString(`<` + e.TagName + ` `)
   202  	if err != nil {
   203  		log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect")
   204  		return nil
   205  	}
   206  
   207  	for attr, value := range e.Attrs {
   208  		_, err = e.ViewBuf.WriteString(attr + `="` + value + `" `)
   209  		if err != nil {
   210  			log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect")
   211  			return nil
   212  		}
   213  	}
   214  	_, err = e.ViewBuf.WriteString(` name="` + e.Name + `" >`)
   215  	if err != nil {
   216  		log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect")
   217  		return nil
   218  	}
   219  
   220  	// loop over children and create DOMElement for each child
   221  	for _, child := range children {
   222  		_, err = e.ViewBuf.Write(DOMElement(child))
   223  		if err != nil {
   224  			log.Println("Error writing HTML DOMElement to buffer: DOMElementWithChildrenSelect")
   225  			return nil
   226  		}
   227  	}
   228  
   229  	_, err = e.ViewBuf.WriteString(`</` + e.TagName + `>`)
   230  	if err != nil {
   231  		log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect")
   232  		return nil
   233  	}
   234  
   235  	if e.Label != "" {
   236  		_, err = e.ViewBuf.WriteString(`<label class="active">` + e.Label + `</label>`)
   237  		if err != nil {
   238  			log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect")
   239  			return nil
   240  		}
   241  	}
   242  
   243  	_, err = e.ViewBuf.WriteString(`</div>`)
   244  	if err != nil {
   245  		log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect")
   246  		return nil
   247  	}
   248  
   249  	return e.ViewBuf.Bytes()
   250  }
   251  
   252  func DOMElementWithChildrenCheckbox(e *Element, children []*Element) []byte {
   253  	_, err := e.ViewBuf.WriteString(`<` + e.TagName + ` `)
   254  	if err != nil {
   255  		log.Println("Error writing HTML string to buffer: DOMElementWithChildrenCheckbox")
   256  		return nil
   257  	}
   258  
   259  	for attr, value := range e.Attrs {
   260  		_, err = e.ViewBuf.WriteString(attr + `="` + value + `" `)
   261  		if err != nil {
   262  			log.Println("Error writing HTML string to buffer: DOMElementWithChildrenCheckbox")
   263  			return nil
   264  		}
   265  	}
   266  
   267  	_, err = e.ViewBuf.WriteString(` >`)
   268  	if err != nil {
   269  		log.Println("Error writing HTML string to buffer: DOMElementWithChildrenCheckbox")
   270  		return nil
   271  	}
   272  
   273  	if e.Label != "" {
   274  		_, err = e.ViewBuf.WriteString(`<label class="active">` + e.Label + `</label>`)
   275  		if err != nil {
   276  			log.Println("Error writing HTML string to buffer: DOMElementWithChildrenCheckbox")
   277  			return nil
   278  		}
   279  	}
   280  
   281  	// loop over children and create DOMElement for each child
   282  	for _, child := range children {
   283  		_, err = e.ViewBuf.Write(DOMElementCheckbox(child))
   284  		if err != nil {
   285  			log.Println("Error writing HTML DOMElementCheckbox to buffer: DOMElementWithChildrenCheckbox")
   286  			return nil
   287  		}
   288  	}
   289  
   290  	_, err = e.ViewBuf.WriteString(`</` + e.TagName + `><div class="clear padding">&nbsp;</div>`)
   291  	if err != nil {
   292  		log.Println("Error writing HTML string to buffer: DOMElementWithChildrenCheckbox")
   293  		return nil
   294  	}
   295  
   296  	return e.ViewBuf.Bytes()
   297  }