STUDIO HAZE · jeniapp
Topaz source
Open by house policy. Topaz is our own language.
Topaz 5.20.2 · 63 files
apps/char-counter/count.tpz
Topaz · 2001 B · Original file
1
// 글자 수 세기. 글자 수, 공백을 뺀 글자 수, 단어 수, 줄 수, UTF-8 바이트 수를 셉니다.2
// 입력은 아무 글이고, 출력은 숫자와 고정 이름만 담은 통계 카드 다섯 장의 HTML 조각입니다.3
// 같은 입력이면 인터프리터와 웹 빌드에서 바이트까지 같은 출력을 냅니다.4
// 글자는 유니코드 스칼라 단위로 세며 자소 묶음이나 화면 너비는 따지지 않습니다. 공백은 스페이스, 탭, LF, CR 입니다.5
// Character counter: scalars, non-space scalars, words, lines and UTF-8 bytes.7
record 통계항목 { 이름: string, 값: int }9
// 공용 도우미 시작 (공백인가)10
// 여러 도구가 같은 원본을 씁니다. 여기서 고치지 않고 원본에서 고친 뒤 다시 생성합니다.12
function 공백인가(글자: string) -> bool {13
글자 == " " || 글자 == "\t" || 글자 == "\n" || 글자 == "\r"14
}16
// 공용 도우미 끝18
// 카드에는 사용자 글이 들어가지 않으므로 이스케이프하지 않습니다.19
function 카드(항목: 통계항목) -> string {20
"<div class=\"stat\"><b>{항목.값}</b><span>{항목.이름}</span></div>"21
}23
function 세기(텍스트: string) -> string {24
let 글자들 = 텍스트.scalars()25
// 단어는 공백이 아닌 글자가 이어진 것이므로 단어가 시작하는 자리를 셉니다.26
let 단어수 = filter(0..<글자들.length, i => !공백인가(글자들[i]) && (i == 0 || 공백인가(글자들[i - 1]))).length27
let 통계 = [28
통계항목 { 이름: "글자 수", 값: 글자들.length },29
통계항목 { 이름: "공백 제외", 값: 글자들.filter(글자 => !공백인가(글자)).length },30
통계항목 { 이름: "단어 수", 값: 단어수 },31
통계항목 { 이름: "줄 수", 값: 텍스트.split("\n").length },32
통계항목 { 이름: "바이트 (UTF-8)", 값: 텍스트.byteLength() },33
]34
"<div class=\"stats\">{통계.map(카드).join("")}</div>"35
}37
input() |> 세기 |> printSHA256 8b76596ea0184ac1692f76c07770a577cd69f2af871a4b859b0e4c0ddd02e0cb