2022-08-13 14:32:34 -04:00
// Copyright 2022 The Gitea Authors. All rights reserved.
2022-01-06 20:18:52 -05:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2022-08-13 14:32:34 -04:00
//go:generate go run invisible/generate.go -v -o ./invisible_gen.go
//go:generate go run ambiguous/generate.go -v -o ./ambiguous_gen.go ambiguous/ambiguous.json
2022-01-06 20:18:52 -05:00
package charset
import (
2022-12-19 10:51:21 -05:00
"bufio"
2022-01-06 20:18:52 -05:00
"io"
"strings"
2022-08-13 14:32:34 -04:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/translation"
2022-01-06 20:18:52 -05:00
)
2022-08-13 14:32:34 -04:00
// RuneNBSP is the codepoint for NBSP
const RuneNBSP = 0xa0
2022-01-06 20:18:52 -05:00
2022-08-13 14:32:34 -04:00
// EscapeControlHTML escapes the unicode control sequences in a provided html document
func EscapeControlHTML ( text string , locale translation . Locale , allowed ... rune ) ( escaped * EscapeStatus , output string ) {
2022-01-06 20:18:52 -05:00
sb := & strings . Builder { }
2022-08-13 14:32:34 -04:00
outputStream := & HTMLStreamerWriter { Writer : sb }
streamer := NewEscapeStreamer ( locale , outputStream , allowed ... ) . ( * escapeStreamer )
2022-01-06 20:18:52 -05:00
2022-08-13 14:32:34 -04:00
if err := StreamHTML ( strings . NewReader ( text ) , streamer ) ; err != nil {
streamer . escaped . HasError = true
log . Error ( "Error whilst escaping: %v" , err )
}
return streamer . escaped , sb . String ( )
2022-01-06 20:18:52 -05:00
}
2022-12-19 10:51:21 -05:00
// EscapeControlReaders escapes the unicode control sequences in a provided reader of HTML content and writer in a locale and returns the findings as an EscapeStatus and the escaped []byte
2022-08-13 14:32:34 -04:00
func EscapeControlReader ( reader io . Reader , writer io . Writer , locale translation . Locale , allowed ... rune ) ( escaped * EscapeStatus , err error ) {
outputStream := & HTMLStreamerWriter { Writer : writer }
streamer := NewEscapeStreamer ( locale , outputStream , allowed ... ) . ( * escapeStreamer )
2022-01-06 20:18:52 -05:00
2022-08-13 14:32:34 -04:00
if err = StreamHTML ( reader , streamer ) ; err != nil {
streamer . escaped . HasError = true
log . Error ( "Error whilst escaping: %v" , err )
2022-01-06 20:18:52 -05:00
}
2022-08-13 14:32:34 -04:00
return streamer . escaped , err
2022-01-06 20:18:52 -05:00
}
2022-12-19 10:51:21 -05:00
// EscapeControlStringReader escapes the unicode control sequences in a provided reader of string content and writer in a locale and returns the findings as an EscapeStatus and the escaped []byte
func EscapeControlStringReader ( reader io . Reader , writer io . Writer , locale translation . Locale , allowed ... rune ) ( escaped * EscapeStatus , err error ) {
bufRd := bufio . NewReader ( reader )
outputStream := & HTMLStreamerWriter { Writer : writer }
streamer := NewEscapeStreamer ( locale , outputStream , allowed ... ) . ( * escapeStreamer )
for {
line , rdErr := bufRd . ReadString ( '\n' )
if len ( line ) > 0 {
if err := streamer . Text ( line ) ; err != nil {
streamer . escaped . HasError = true
log . Error ( "Error whilst escaping: %v" , err )
return streamer . escaped , err
}
}
if rdErr != nil {
if rdErr != io . EOF {
err = rdErr
}
break
}
if err := streamer . SelfClosingTag ( "br" ) ; err != nil {
streamer . escaped . HasError = true
return streamer . escaped , err
}
}
return streamer . escaped , err
}
2022-08-13 14:32:34 -04:00
// EscapeControlString escapes the unicode control sequences in a provided string and returns the findings as an EscapeStatus and the escaped string
func EscapeControlString ( text string , locale translation . Locale , allowed ... rune ) ( escaped * EscapeStatus , output string ) {
sb := & strings . Builder { }
outputStream := & HTMLStreamerWriter { Writer : sb }
streamer := NewEscapeStreamer ( locale , outputStream , allowed ... ) . ( * escapeStreamer )
2022-01-06 20:18:52 -05:00
2022-08-13 14:32:34 -04:00
if err := streamer . Text ( text ) ; err != nil {
streamer . escaped . HasError = true
log . Error ( "Error whilst escaping: %v" , err )
}
return streamer . escaped , sb . String ( )
2022-01-06 20:18:52 -05:00
}