@ -6,8 +6,249 @@ import (
 
		
	
		
			
					"code.ndumas.com/ndumas/wikilink-parser" 
 
		
	
		
			
				)  
		
	
		
			
				
 
		
	
		
			
				func  Test_ObsidianWikilinks ( t  * testing . T )  {  
		
	
		
			
					// t.Parallel()
 
 
		
	
		
			
				func  Test_ObsidianWikilinks_LinksIntext ( t  * testing . T )  {  
		
	
		
			
					tcs  :=  [ ] struct  { 
 
		
	
		
			
						name      string 
 
		
	
		
			
						in        string 
 
		
	
		
			
						expected  [ ] wikilink . Lexeme 
 
		
	
		
			
					} { 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink" , 
 
		
	
		
			
							in :    "this is a [[wikilink]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "this is a " } , 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink|display name" , 
 
		
	
		
			
							in :    "this is a [[wikilink|display name]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "this is a " } , 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "display name" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink|display name|second pipe" , 
 
		
	
		
			
							in :    "[[wikilink|display name|second pipe]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "display name" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "second pipe" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink with numeric alias|420|second pipe" , 
 
		
	
		
			
							in :    "[[wikilink|420|second pipe]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "420" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "second pipe" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink with spaces in filename" , 
 
		
	
		
			
							in :    "[[wikilink spaces]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink spaces" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "#heading" , 
 
		
	
		
			
							in :    "[[#heading]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexHeading ,  Val :  "#" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "heading" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink#heading" , 
 
		
	
		
			
							in :    "[[wikilink#heading]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexHeading ,  Val :  "#" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "heading" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink#heading|display name" , 
 
		
	
		
			
							in :    "[[wikilink#heading|display name]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexHeading ,  Val :  "#" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "heading" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "display name" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink#heading|display name|second pipe" , 
 
		
	
		
			
							in :    "[[wikilink#heading|display name|second pipe]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexHeading ,  Val :  "#" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "heading" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "display name" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "second pipe" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink with numeric aliases#heading|420|display name" , 
 
		
	
		
			
							in :    "[[wikilink#heading|420|second pipe]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexHeading ,  Val :  "#" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "heading" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "420" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "second pipe" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "#^blockRef" , 
 
		
	
		
			
							in :    "[[#^blockRef]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexBlockRef ,  Val :  "#^" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "blockRef" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink#^blockRef" , 
 
		
	
		
			
							in :    "[[wikilink#^blockRef]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexBlockRef ,  Val :  "#^" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "blockRef" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink#^blockRef|display name" , 
 
		
	
		
			
							in :    "[[wikilink#^blockRef|display name]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexBlockRef ,  Val :  "#^" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "blockRef" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "display name" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink#^blockRef|display name|second pipe" , 
 
		
	
		
			
							in :    "[[wikilink#^blockRef|display name|second pipe]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexBlockRef ,  Val :  "#^" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "blockRef" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "display name" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "second pipe" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
						{ 
 
		
	
		
			
							name :  "wikilink with numeric aliases#^blockRef|420|second pipe" , 
 
		
	
		
			
							in :    "[[wikilink#^blockRef|420|second pipe]]" , 
 
		
	
		
			
							expected :  [ ] wikilink . Lexeme { 
 
		
	
		
			
								{ Typ :  wikilink . LexOpenLink ,  Val :  "[[" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "wikilink" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexBlockRef ,  Val :  "#^" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "blockRef" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "420" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexAlias ,  Val :  "|" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexIdent ,  Val :  "second pipe" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexCloseLink ,  Val :  "]]" } , 
 
		
	
		
			
								{ Typ :  wikilink . LexText ,  Val :  "" } , 
 
		
	
		
			
							} , 
 
		
	
		
			
						} , 
 
		
	
		
			
					} 
 
		
	
		
			
					for  _ ,  tc  :=  range  tcs  { 
 
		
	
		
			
						tc  :=  tc 
 
		
	
		
			
						t . Run ( tc . name ,  func ( t  * testing . T )  { 
 
		
	
		
			
							// t.Parallel()
 
 
		
	
		
			
							l  :=  wikilink . Lex ( "testLexer" ,  tc . in ) 
 
		
	
		
			
							defer  l . L . Sync ( ) 
 
		
	
		
			
							if  len ( tc . expected )  !=  len ( l . Items )  { 
 
		
	
		
			
								t . Logf ( "expected %d tokens, got %d\n" ,  len ( tc . expected ) ,  len ( l . Items ) ) 
 
		
	
		
			
								t . Fail ( ) 
 
		
	
		
			
				
 
		
	
		
			
								return 
 
		
	
		
			
							} 
 
		
	
		
			
							for  i ,  e  :=  range  tc . expected  { 
 
		
	
		
			
								n  :=  l . Items [ i ] 
 
		
	
		
			
								if  e . Typ  !=  n . Typ  { 
 
		
	
		
			
									t . Logf ( "expected Type %s, received %s" ,  e . Typ . String ( ) ,  n . Typ . String ( ) ) 
 
		
	
		
			
									t . Fail ( ) 
 
		
	
		
			
				
 
		
	
		
			
									return 
 
		
	
		
			
								} 
 
		
	
		
			
				
 
		
	
		
			
								if  e . Val  !=  n . Val  { 
 
		
	
		
			
									t . Logf ( "expected Value %q, received %q" ,  e . Val ,  n . Val ) 
 
		
	
		
			
									t . Fail ( ) 
 
		
	
		
			
				
 
		
	
		
			
									return 
 
		
	
		
			
								} 
 
		
	
		
			
							} 
 
		
	
		
			
						} ) 
 
		
	
		
			
					} 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				func  Test_ObsidianWikilinks_Basic ( t  * testing . T )  {  
		
	
		
			
					t . Parallel ( ) 
 
		
	
		
			
					tcs  :=  [ ] struct  { 
 
		
	
		
			
						name      string 
 
		
	
		
			
						in        string 
 
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
			
			@ -218,7 +459,7 @@ func Test_ObsidianWikilinks(t *testing.T) {
 
		
	
		
			
					for  _ ,  tc  :=  range  tcs  { 
 
		
	
		
			
						tc  :=  tc 
 
		
	
		
			
						t . Run ( tc . name ,  func ( t  * testing . T )  { 
 
		
	
		
			
							t . Parallel ( ) 
 
		
	
		
			
							// t.Parallel()
 
 
		
	
		
			
							l  :=  wikilink . Lex ( "testLexer" ,  tc . in ) 
 
		
	
		
			
							defer  l . L . Sync ( ) 
 
		
	
		
			
							if  len ( tc . expected )  !=  len ( l . Items )  {