Skip to content

Commit

Permalink
Merge pull request #50 from tarent/revert-46-collect-stylesheets
Browse files Browse the repository at this point in the history
Revert "Collect stylesheets"
  • Loading branch information
domano committed May 30, 2017
2 parents 732a5ac + 4b9f751 commit c825d99
Show file tree
Hide file tree
Showing 12 changed files with 44 additions and 245 deletions.
62 changes: 15 additions & 47 deletions composition/content_merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"errors"
"io"
"strings"
"fmt"
)

const (
Expand Down Expand Up @@ -34,9 +33,6 @@ type ContentMerge struct {
// merge priorities for the content objects
// no entry means priority == 0
priorities map[Content]int

// all stylesheets contained in used fragments
stylesheets []string
}

// NewContentMerge creates a new buffered ContentMerge
Expand All @@ -53,87 +49,59 @@ func NewContentMerge(metaJSON map[string]interface{}) *ContentMerge {
return cntx
}

func (cntx *ContentMerge) collectStylesheets(f Fragment) {
cntx.stylesheets = append(cntx.stylesheets, f.Stylesheets()...)
}

func (cntx *ContentMerge) writeStylesheets(w io.Writer) {
for _, href := range cntx.stylesheets {
stylesheet := fmt.Sprintf("\n <link rel=\"stylesheet\" type=\"text/css\" href=\"%s\">", href)
io.WriteString(w, stylesheet)
func (cntx *ContentMerge) GetHtml() ([]byte, error) {
if len(cntx.priorities) > 0 {
cntx.processMetaPriorityParsing()
}
}
w := bytes.NewBuffer(make([]byte, 0, DefaultBufferSize))

func generateExecutionFunction(cntx *ContentMerge, w io.Writer) (executeFragment func(fragmentName string) error) {
var executeFragment func(fragmentName string) error
executeFragment = func(fragmentName string) error {
f, exist := cntx.GetBodyFragmentByName(fragmentName)
if !exist {
missingFragmentString := generateMissingFragmentString(cntx.Body, fragmentName)
return errors.New(missingFragmentString)
}
cntx.collectStylesheets(f)
return f.Execute(w, cntx.MetaJSON, executeFragment)
}
return executeFragment
}

func (cntx *ContentMerge) GetHtml() ([]byte, error) {

if len(cntx.priorities) > 0 {
cntx.processMetaPriorityParsing()
}

// start header, but don't close it. We will add stylsheets later on
header := bytes.NewBuffer(make([]byte, 0, DefaultBufferSize))
io.WriteString(header, "<!DOCTYPE html>\n<html>\n <head>\n ")
io.WriteString(w, "<!DOCTYPE html>\n<html>\n <head>\n ")

for _, f := range cntx.Head {
cntx.collectStylesheets(f)
executeFragment := generateExecutionFunction(cntx, header)
if err := f.Execute(header, cntx.MetaJSON, executeFragment); err != nil {
if err := f.Execute(w, cntx.MetaJSON, executeFragment); err != nil {
return nil, err
}
}
io.WriteString(w, "\n </head>\n <body")

// open body tag
body := bytes.NewBuffer(make([]byte, 0, DefaultBufferSize))
io.WriteString(body, "\n <body")
for _, f := range cntx.BodyAttrs {
io.WriteString(body, " ")
executeFragment := generateExecutionFunction(cntx, body)
if err := f.Execute(body, cntx.MetaJSON, executeFragment); err != nil {
io.WriteString(w, " ")

if err := f.Execute(w, cntx.MetaJSON, executeFragment); err != nil {
return nil, err
}
}

io.WriteString(body, ">\n ")
io.WriteString(w, ">\n ")

startFragmentName := ""
if _, exist := cntx.GetBodyFragmentByName(LayoutFragmentName); exist {
startFragmentName = LayoutFragmentName
}

// recursively process body fragments
executeFragment := generateExecutionFunction(cntx, body)
if err := executeFragment(startFragmentName); err != nil {
return nil, err
}

for _, f := range cntx.Tail {
cntx.collectStylesheets(f)
if err := f.Execute(body, cntx.MetaJSON, executeFragment); err != nil {
if err := f.Execute(w, cntx.MetaJSON, executeFragment); err != nil {
return nil, err
}
}
io.WriteString(body, "\n </body>\n</html>\n")

// write the collected stylesheets to the header and close it
cntx.writeStylesheets(header)
io.WriteString(header, "\n </head>")
io.WriteString(w, "\n </body>\n</html>\n")

// return concatenated header and body
html := append(header.Bytes(), body.Bytes()...)
return html, nil
return w.Bytes(), nil
}

// GetBodyFragmentByName returns a fragment by ists name.
Expand Down
45 changes: 9 additions & 36 deletions composition/content_merge_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ func Test_ContentMerge_PositiveCase(t *testing.T) {
<page1-head/>
<page2-head/>
<page3-head/>
<link rel="stylesheet" type="text/css" href="/abc/def">
<link rel="stylesheet" type="text/css" href="/üst/das/möglich">
</head>
<body a="b" foo="bar">
<page1-body-main>
Expand All @@ -38,7 +36,6 @@ func Test_ContentMerge_PositiveCase(t *testing.T) {
</page1-body-main>
`)

body.AddStylesheets([]string{"/abc/def", "/üst/das/möglich"})
cm := NewContentMerge(nil)

cm.AddContent(&MemoryContent{
Expand Down Expand Up @@ -78,14 +75,6 @@ func Test_ContentMerge_BodyCompositionWithExplicitNames(t *testing.T) {
<html>
<head>
<link rel="stylesheet" type="text/css" href="/body/first">
<link rel="stylesheet" type="text/css" href="/body/second">
<link rel="stylesheet" type="text/css" href="/page/2A/first">
<link rel="stylesheet" type="text/css" href="/page/2A/second">
<link rel="stylesheet" type="text/css" href="/page/2B/first">
<link rel="stylesheet" type="text/css" href="/page/2B/second">
<link rel="stylesheet" type="text/css" href="/page/3A/first">
<link rel="stylesheet" type="text/css" href="/page/3A/second">
</head>
<body>
<page1-body-main>
Expand All @@ -99,48 +88,32 @@ func Test_ContentMerge_BodyCompositionWithExplicitNames(t *testing.T) {

cm := NewContentMerge(nil)

body := NewStringFragment(
cm.AddContent(&MemoryContent{
name: LayoutFragmentName,
body: map[string]Fragment{
"": NewStringFragment(
`<page1-body-main>
§[> page2-a]§
§[> example1.com#page2-b]§
§[> page3-a]§
</page1-body-main>`)
body.AddStylesheets([]string{"/body/first", "/body/second"})
cm.AddContent(&MemoryContent{
name: LayoutFragmentName,
body: map[string]Fragment{
"": body}}, 0)

page2A := NewStringFragment("<page2-body-a/>")
page2A.AddStylesheets([]string{"/page/2A/first", "/page/2A/second"})
page2B := NewStringFragment("<page2-body-b/>")
page2B.AddStylesheets([]string{"/page/2B/first", "/page/2B/second"})

// this fragment is not rendered, so it's stylesheets should not appear in page header
pageUnreferenced := NewStringFragment("<unreferenced-body/>")
pageUnreferenced.AddStylesheets([]string{"/unreferenced/first", "/unreferenced/second"})
</page1-body-main>`)}}, 0)

cm.AddContent(&MemoryContent{
name: "example1.com",
body: map[string]Fragment{
"page2-a": page2A,
"page2-b": page2B,
"unreferenced": pageUnreferenced,
"page2-a": NewStringFragment("<page2-body-a/>"),
"page2-b": NewStringFragment("<page2-body-b/>"),
}}, 0)

page3A := NewStringFragment("<page3-body-a/>")
page3A.AddStylesheets([]string{"/page/3A/first", "/page/3A/second"})
cm.AddContent(&MemoryContent{
name: "example2.com",
body: map[string]Fragment{
"page3-a": page3A,
"page3-a": NewStringFragment("<page3-body-a/>"),
}}, 0)

html, err := cm.GetHtml()
a.NoError(err)
expected = removeTabsAndNewLines(expected)
result := removeTabsAndNewLines(string(html))
a.Equal(expected, result)
a.Equal(expected, string(html))
}

func Test_ContentMerge_LookupByDifferentFragmentNames(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion composition/discovered_fetch_definition_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@ func Test_FetchDefinition_DiscoveredByError(t *testing.T) {
a.Panics(func() {
testSubject.DiscoveredBy("a")
})
}
}
40 changes: 5 additions & 35 deletions composition/html_content_parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ func (parser *HtmlContentParser) Parse(c *MemoryContent, in io.Reader) error {
}

func (parser *HtmlContentParser) parseHead(z *html.Tokenizer, c *MemoryContent) error {
var stylesheets []string
attrs := make([]html.Attribute, 0, 10)
headBuff := bytes.NewBuffer(nil)

Expand All @@ -78,10 +77,6 @@ forloop:
}
continue
}
if href, isStylesheed := getStylesheet(tag, attrs); isStylesheed {
stylesheets = append(stylesheets, href)
continue
}
case tt == html.EndTagToken:
if string(tag) == "head" {
break forloop
Expand All @@ -92,24 +87,13 @@ forloop:

s := headBuff.String()
st := strings.Trim(s, " \n")
if len(st) > 0 || len(stylesheets) > 0 {
frg := NewStringFragment(st)
frg.AddStylesheets(stylesheets)
c.head = frg
if len(st) > 0 {
c.head = NewStringFragment(st)
}
return nil
}

func getStylesheet(tag []byte, attrs []html.Attribute) (href string, isStylesheet bool) {
if string(tag) == "link" && attrHasValue(attrs, "rel", "stylesheet") {
href, _ := getAttr(attrs, "href")
return href.Val, true
}
return "", false
}

func (parser *HtmlContentParser) parseBody(z *html.Tokenizer, c *MemoryContent) error {
var stylesheets []string
attrs := make([]html.Attribute, 0, 10)
bodyBuff := bytes.NewBuffer(nil)

Expand Down Expand Up @@ -177,10 +161,6 @@ forloop:
continue
}
}
if href, isStylesheed := getStylesheet(tag, attrs); isStylesheed {
stylesheets = append(stylesheets, href)
continue
}

case tt == html.EndTagToken:
if string(tag) == "body" {
Expand All @@ -192,18 +172,15 @@ forloop:

s := bodyBuff.String()
if _, defaultFragmentExists := c.body[""]; !defaultFragmentExists {
if st := strings.Trim(s, " \n"); len(st) > 0 || len(stylesheets) > 0 {
frg := NewStringFragment(st)
frg.AddStylesheets(stylesheets)
c.body[""] = frg
if st := strings.Trim(s, " \n"); len(st) > 0 {
c.body[""] = NewStringFragment(st)
}
}

return nil
}

func parseFragment(z *html.Tokenizer) (f Fragment, dependencies map[string]Params, err error) {
var stylesheets []string
attrs := make([]html.Attribute, 0, 10)
dependencies = make(map[string]Params)

Expand Down Expand Up @@ -239,11 +216,6 @@ forloop:
continue
}

if href, isStylesheed := getStylesheet(tag, attrs); isStylesheed {
stylesheets = append(stylesheets, href)
continue
}

case tt == html.EndTagToken:
if string(tag) == UicFragment || string(tag) == UicTail {
break forloop
Expand All @@ -252,9 +224,7 @@ forloop:
buff.Write(raw)
}

frg := NewStringFragment(buff.String())
frg.AddStylesheets(stylesheets)
return frg, dependencies, nil
return NewStringFragment(buff.String()), dependencies, nil
}

func getInclude(z *html.Tokenizer, attrs []html.Attribute) (startMarker, endMarker, dependencyName string, dependencyParams Params, error error) {
Expand Down

0 comments on commit c825d99

Please sign in to comment.