passing tests
							parent
							
								
									e5f7bb8f98
								
							
						
					
					
						commit
						0b2443c720
					
				| @ -1,3 +1,3 @@ | |||||||
| module github.com/therealfakemoot/wikilinks-parser | module wikilinks | ||||||
| 
 | 
 | ||||||
| go 1.19 | go 1.19 | ||||||
|  | |||||||
| @ -0,0 +1,54 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"log" | ||||||
|  | 	"regexp" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	alias      = regexp.MustCompile(`\|(.*)`) | ||||||
|  | 	link       = regexp.MustCompile(`^([a-zA-Z ]+)?[\|\#\^\\]?`) | ||||||
|  | 	subsection = regexp.MustCompile(`#([\w\s]+)`) | ||||||
|  | 	block      = regexp.MustCompile(`#\^([a-zA-Z ]+)`) | ||||||
|  | 	wholeLink  = regexp.MustCompile(`\[\[(.*)\]\]`) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type Link struct { | ||||||
|  | 	Dest, Alias, Subsection, Block string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func ExtractLink(raw string) Link { | ||||||
|  | 	var li Link | ||||||
|  | 
 | ||||||
|  | 	rawLinkMatch := wholeLink.FindAllStringSubmatch(raw, -1) | ||||||
|  | 	var rawLink string | ||||||
|  | 	if len(rawLinkMatch) > 0 { | ||||||
|  | 		rawLink = rawLinkMatch[0][1] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	l := link.FindAllStringSubmatch(rawLink, -1) | ||||||
|  | 	if len(l) > 0 { | ||||||
|  | 		li.Dest = l[0][1] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	a := alias.FindAllStringSubmatch(rawLink, -1) | ||||||
|  | 	if len(a) > 0 { | ||||||
|  | 		li.Alias = a[0][1] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	s := subsection.FindAllStringSubmatch(rawLink, -1) | ||||||
|  | 	if len(s) > 0 { | ||||||
|  | 		li.Subsection = s[0][1] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	b := block.FindAllStringSubmatch(rawLink, -1) | ||||||
|  | 	if len(b) > 0 { | ||||||
|  | 		li.Block = b[0][1] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return li | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  | 	log.Printf("%#v\n", ExtractLink(`Embedding a link in a bigger block of text [[Regular Link#^link to block]] shouldn't cause any problems `)) | ||||||
|  | } | ||||||
| @ -0,0 +1,34 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func Test_ExtractLink(t *testing.T) { | ||||||
|  | 	tcs := []struct { | ||||||
|  | 		name     string | ||||||
|  | 		in       string | ||||||
|  | 		expected Link | ||||||
|  | 	}{ | ||||||
|  | 		{"link", `[[Regular Link]]`, Link{Dest: "Regular Link"}}, | ||||||
|  | 		{"transclude+link", `![[Transcluded Link]]`, Link{Dest: "Transcluded Link"}}, | ||||||
|  | 		{"link+alias", `[[Regular Link|Alias]]`, Link{Dest: "Regular Link", Alias: "Alias"}}, | ||||||
|  | 		{"link+subsection", `[[Regular Link#Subsection of page]]`, Link{Dest: "Regular Link", Subsection: "Subsection of page"}}, | ||||||
|  | 		{"link+block", `[[Regular Link#^link to block]]`, Link{Dest: "Regular Link", Block: "link to block"}}, | ||||||
|  | 		{"link+subsection+alias", `[[Regular Link#Subsection of page|Alias]]`, Link{Dest: "Regular Link", Subsection: "Subsection of page", Alias: "Alias"}}, | ||||||
|  | 		{"link+block+alias", `[[Regular Link#^link to block|Alias]]`, Link{Dest: "Regular Link", Block: "link to block", Alias: "Alias"}}, | ||||||
|  | 		{"link+alias+escape", `[[Regular Link\|Alias]]`, Link{Dest: "Regular Link", Alias: "Alias"}}, | ||||||
|  | 		{"link+subsection+alias+escape", `[[Regular Link#Subsection of page\|Alias]]`, Link{Dest: "Regular Link", Subsection: "Subsection of page", Alias: "Alias"}}, | ||||||
|  | 		{"link+block+alias+escape", `[[Regular Link#^link to block\|Alias]]`, Link{Dest: "Regular Link", Block: "link to block", Alias: "Alias"}}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, tc := range tcs { | ||||||
|  | 		t.Run(tc.name, func(t *testing.T) { | ||||||
|  | 			out := ExtractLink(tc.in) | ||||||
|  | 			if out != tc.expected { | ||||||
|  | 				t.Logf("got %#v\n", out) | ||||||
|  | 				t.Fail() | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -0,0 +1,10 @@ | |||||||
|  | [[Regular Link]] | ||||||
|  | ![[Transcluded Link]] | ||||||
|  | [[Regular Link|Alias]] | ||||||
|  | [[Regular Link#Subsection of page]] | ||||||
|  | [[Regular Link^link to block]] | ||||||
|  | [[Regular Link#Subsection of page|Alias]] | ||||||
|  | [[Regular Link^link to block|Alias]] | ||||||
|  | [[Regular Link\|Alias]] | ||||||
|  | [[Regular Link#Subsection of page\|Alias]] | ||||||
|  | [[Regular Link^link to block\|Alias]] | ||||||
					Loading…
					
					
				
		Reference in New Issue