mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Show commit status icon in commits table (#1688)
* Show commit status icon in commits table * Add comments * Fix icons * Few more places where commit table is displayed * Change integration test to use goquery for parsing html * Add integration tests for commit table and status icons * Fix status to return lates status correctly on all databases * Rewrote lates commit status selects
This commit is contained in:
		| @@ -7,16 +7,15 @@ package integrations | ||||
| import ( | ||||
| 	"bytes" | ||||
|  | ||||
| 	"golang.org/x/net/html" | ||||
| 	"github.com/PuerkitoBio/goquery" | ||||
| ) | ||||
|  | ||||
| type HtmlDoc struct { | ||||
| 	doc  *html.Node | ||||
| 	body *html.Node | ||||
| 	doc *goquery.Document | ||||
| } | ||||
|  | ||||
| func NewHtmlParser(content []byte) (*HtmlDoc, error) { | ||||
| 	doc, err := html.Parse(bytes.NewReader(content)) | ||||
| 	doc, err := goquery.NewDocumentFromReader(bytes.NewReader(content)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -24,87 +23,12 @@ func NewHtmlParser(content []byte) (*HtmlDoc, error) { | ||||
| 	return &HtmlDoc{doc: doc}, nil | ||||
| } | ||||
|  | ||||
| func (doc *HtmlDoc) GetBody() *html.Node { | ||||
| 	if doc.body == nil { | ||||
| 		var b *html.Node | ||||
| 		var f func(*html.Node) | ||||
| 		f = func(n *html.Node) { | ||||
| 			if n.Type == html.ElementNode && n.Data == "body" { | ||||
| 				b = n | ||||
| 				return | ||||
| 			} | ||||
| 			for c := n.FirstChild; c != nil; c = c.NextSibling { | ||||
| 				f(c) | ||||
| 			} | ||||
| 		} | ||||
| 		f(doc.doc) | ||||
| 		if b != nil { | ||||
| 			doc.body = b | ||||
| 		} else { | ||||
| 			doc.body = doc.doc | ||||
| 		} | ||||
| 	} | ||||
| 	return doc.body | ||||
| } | ||||
|  | ||||
| func (doc *HtmlDoc) GetAttribute(n *html.Node, key string) (string, bool) { | ||||
| 	for _, attr := range n.Attr { | ||||
| 		if attr.Key == key { | ||||
| 			return attr.Val, true | ||||
| 		} | ||||
| 	} | ||||
| 	return "", false | ||||
| } | ||||
|  | ||||
| func (doc *HtmlDoc) checkAttr(n *html.Node, attr, val string) bool { | ||||
| 	if n.Type == html.ElementNode { | ||||
| 		s, ok := doc.GetAttribute(n, attr) | ||||
| 		if ok && s == val { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (doc *HtmlDoc) traverse(n *html.Node, attr, val string) *html.Node { | ||||
| 	if doc.checkAttr(n, attr, val) { | ||||
| 		return n | ||||
| 	} | ||||
|  | ||||
| 	for c := n.FirstChild; c != nil; c = c.NextSibling { | ||||
| 		result := doc.traverse(c, attr, val) | ||||
| 		if result != nil { | ||||
| 			return result | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (doc *HtmlDoc) GetElementById(id string) *html.Node { | ||||
| 	return doc.traverse(doc.GetBody(), "id", id) | ||||
| } | ||||
|  | ||||
| func (doc *HtmlDoc) GetInputValueById(id string) string { | ||||
| 	inp := doc.GetElementById(id) | ||||
| 	if inp == nil { | ||||
| 		return "" | ||||
| 	} | ||||
|  | ||||
| 	val, _ := doc.GetAttribute(inp, "value") | ||||
| 	return val | ||||
| } | ||||
|  | ||||
| func (doc *HtmlDoc) GetElementByName(name string) *html.Node { | ||||
| 	return doc.traverse(doc.GetBody(), "name", name) | ||||
| 	text, _ := doc.doc.Find("#" + id).Attr("value") | ||||
| 	return text | ||||
| } | ||||
|  | ||||
| func (doc *HtmlDoc) GetInputValueByName(name string) string { | ||||
| 	inp := doc.GetElementByName(name) | ||||
| 	if inp == nil { | ||||
| 		return "" | ||||
| 	} | ||||
|  | ||||
| 	val, _ := doc.GetAttribute(inp, "value") | ||||
| 	return val | ||||
| 	text, _ := doc.doc.Find("input[name=\"" + name + "\"]").Attr("value") | ||||
| 	return text | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user