@ -235,40 +235,78 @@ func findAllIssueReferencesMarkdown(content string) []*rawReference {
return findAllIssueReferencesBytes ( bcontent , links )
}
func convertFullHTMLReferencesToShortRefs ( re * regexp . Regexp , contentBytes * [ ] byte ) {
// We will iterate through the content, rewrite and simplify full references.
//
// We want to transform something like:
//
// this is a https://ourgitea.com/git/owner/repo/issues/123456789, foo
// https://ourgitea.com/git/owner/repo/pulls/123456789
//
// Into something like:
//
// this is a #123456789, foo
// !123456789
pos := 0
for {
// re looks for something like: (\s|^|\(|\[)https://ourgitea.com/git/(owner/repo)/(issues)/(123456789)(?:\s|$|\)|\]|[:;,.?!]\s|[:;,.?!]$)
match := re . FindSubmatchIndex ( ( * contentBytes ) [ pos : ] )
if match == nil {
break
}
// match is a bunch of indices into the content from pos onwards so
// to simplify things let's just add pos to all of the indices in match
for i := range match {
match [ i ] += pos
}
// match[0]-match[1] is whole string
// match[2]-match[3] is preamble
// move the position to the end of the preamble
pos = match [ 3 ]
// match[4]-match[5] is owner/repo
// now copy the owner/repo to end of the preamble
endPos := pos + match [ 5 ] - match [ 4 ]
copy ( ( * contentBytes ) [ pos : endPos ] , ( * contentBytes ) [ match [ 4 ] : match [ 5 ] ] )
// move the current position to the end of the newly copied owner/repo
pos = endPos
// Now set the issue/pull marker:
//
// match[6]-match[7] == 'issues'
( * contentBytes ) [ pos ] = '#'
if string ( ( * contentBytes ) [ match [ 6 ] : match [ 7 ] ] ) == "pulls" {
( * contentBytes ) [ pos ] = '!'
}
pos ++
// Then add the issue/pull number
//
// match[8]-match[9] is the number
endPos = pos + match [ 9 ] - match [ 8 ]
copy ( ( * contentBytes ) [ pos : endPos ] , ( * contentBytes ) [ match [ 8 ] : match [ 9 ] ] )
// Now copy what's left at the end of the string to the new end position
copy ( ( * contentBytes ) [ endPos : ] , ( * contentBytes ) [ match [ 9 ] : ] )
// now we reset the length
// our new section has length endPos - match[3]
// our old section has length match[9] - match[3]
( * contentBytes ) = ( * contentBytes ) [ : len ( ( * contentBytes ) ) - match [ 9 ] + endPos ]
pos = endPos
}
}
// FindAllIssueReferences returns a list of unvalidated references found in a string.
func FindAllIssueReferences ( content string ) [ ] IssueReference {
// Need to convert fully qualified html references to local system to #/! short codes
contentBytes := [ ] byte ( content )
if re := getGiteaIssuePullPattern ( ) ; re != nil {
pos := 0
for {
match := re . FindSubmatchIndex ( contentBytes [ pos : ] )
if match == nil {
break
}
// match[0]-match[1] is whole string
// match[2]-match[3] is preamble
pos += match [ 3 ]
// match[4]-match[5] is owner/repo
endPos := pos + match [ 5 ] - match [ 4 ]
copy ( contentBytes [ pos : endPos ] , contentBytes [ match [ 4 ] : match [ 5 ] ] )
pos = endPos
// match[6]-match[7] == 'issues'
contentBytes [ pos ] = '#'
if string ( contentBytes [ match [ 6 ] : match [ 7 ] ] ) == "pulls" {
contentBytes [ pos ] = '!'
}
pos ++
// match[8]-match[9] is the number
endPos = pos + match [ 9 ] - match [ 8 ]
copy ( contentBytes [ pos : endPos ] , contentBytes [ match [ 8 ] : match [ 9 ] ] )
copy ( contentBytes [ endPos : ] , contentBytes [ match [ 9 ] : ] )
// now we reset the length
// our new section has length endPos - match[3]
// our old section has length match[9] - match[3]
contentBytes = contentBytes [ : len ( contentBytes ) - match [ 9 ] + endPos ]
pos = endPos
}
convertFullHTMLReferencesToShortRefs ( re , & contentBytes )
} else {
log . Debug ( "No GiteaIssuePullPattern pattern" )
}