asciigoat's core library
https://asciigoat.org/core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1011 B
43 lines
1011 B
package scanner |
|
|
|
import ( |
|
"unicode/utf8" |
|
) |
|
|
|
// A Terminal represents literal element within a document |
|
type Terminal struct { |
|
val string |
|
bytes, runes uint |
|
line, col uint |
|
} |
|
|
|
// NewTerminalFull returns a new Terminal instance |
|
func NewTerminalFull(val string, bytes, runes, line, col uint) *Terminal { |
|
return &Terminal{ |
|
val: val, |
|
bytes: bytes, |
|
runes: runes, |
|
line: line, |
|
col: col, |
|
} |
|
} |
|
|
|
// NewTerminal creates a Terminal instance without knowing it's length |
|
func NewTerminal(val string, line, col uint) *Terminal { |
|
bytes := uint(len(val)) |
|
runes := uint(utf8.RuneCountInString(val)) |
|
|
|
return NewTerminalFull(val, bytes, runes, line, col) |
|
} |
|
|
|
// Position retuns the position (line and column) |
|
// of the Terminal in the source document |
|
func (t *Terminal) Position() (uint, uint) { |
|
return t.line, t.col |
|
} |
|
|
|
// Value returns the string corresponding to |
|
// this Terminal and it's size in bytes and runes |
|
func (t *Terminal) Value() (string, uint, uint) { |
|
return t.val, t.bytes, t.runes |
|
}
|
|
|