110 lines
3.8 KiB
R
110 lines
3.8 KiB
R
|
### Tests of non-Latin-1 plotting in PDF and PS
|
||
|
|
||
|
## Help says pdf() and postscropt() support encoding =
|
||
|
## ISOLatin1 ISOLatin2 ISOLatin7 ISOLatin9
|
||
|
## Cyrillic Greek
|
||
|
## KOI8-R KOI8-U
|
||
|
## WinAnsi aka CP1252 CP1250 CP1251 CP1253 CP1257
|
||
|
## and a few more (PDFDdoc, AdobeStd, AdobeSym).
|
||
|
|
||
|
options(warn = 1L)
|
||
|
|
||
|
### only do this in a UTF-8 locale
|
||
|
if (!l10n_info()[["UTF-8"]]) {
|
||
|
warning("encodings2.R requires a UTF-8 locale")
|
||
|
q("no")
|
||
|
}
|
||
|
|
||
|
pdfenc <- c("ISOLatin1", "ISOLatin2", "ISOLatin7", "ISOLatin9",
|
||
|
"Greek", "Cyrillic", "KOI8-R", "KOI8-U",
|
||
|
"WinAnsi", "CP1250", "CP1251", "CP1253", "CP1257")
|
||
|
|
||
|
enc <- c("latin1", "latin2", "iso-8859-13", "latin-9",
|
||
|
"iso-8859-7", "iso-8859-5", "KOI8-R", "KOI8-U",
|
||
|
"CP1252", "CP1250", "CP1251", "CP1253", "CP1257")
|
||
|
|
||
|
## only use valid printable characters from the encodings and exclude those
|
||
|
## that have a diffent UTF-8 mapping on Windows (iso-8859-7, KOI8-R)
|
||
|
##
|
||
|
## invalid characters are sometimes converted to unexpected UTF-8 mappings on
|
||
|
## Windows (rather than NA)
|
||
|
valid_printable <- list(
|
||
|
"latin1" = c(32:126,160:255),
|
||
|
"latin2" = c(32:126,160:255),
|
||
|
"iso-8859-13" = c(32:126,160:255),
|
||
|
"latin-9" = c(32:126,160:255),
|
||
|
"iso-8859-7" = c(32:126,160,163,166:169,171:173,175:209,211:254),
|
||
|
# 161, 162 - Windows uses normal quotes, but Linux/macOS uses fancy
|
||
|
# 164, 165, 170 - 2003 additions not supported by Windows
|
||
|
"iso-8859-5" = c(32:126,160:255),
|
||
|
"KOI8-R" = c(32:126,160:255),
|
||
|
"KOI8-U" = c(32:126,128:173,175:189,191:255),
|
||
|
# 174, 190 - Windows uses characters from KOI8-RU (U+45e, U+40e),
|
||
|
# which differs from Unix (R+255d, U+256c)
|
||
|
"CP1252" = c(32:126,128,130:140,142,145:156,158:255),
|
||
|
"CP1250" = c(32:126,128,130,132:135,137:143,145:151,153:255),
|
||
|
"CP1251" = c(32:126,128:151,153:255),
|
||
|
"CP1253" = c(32:126,128,130:135,137,139,145:151,153,155,160:169,171:209,211:254),
|
||
|
"CP1257" = c(32:126,128,130,132:135,137,139,141:143,145:151,153,155,157:158,160,162:164,166:255)
|
||
|
)
|
||
|
|
||
|
do_one <-function(name, encoding)
|
||
|
{
|
||
|
par(pty="s")
|
||
|
plot(c(-1,16), c(-1,16), type="n", xlab="", ylab="", xaxs="i", yaxs="i")
|
||
|
title(paste("Centred chars in", name))
|
||
|
grid(17, 17, lty=1)
|
||
|
known <- valid_printable[[encoding]]
|
||
|
x <- rawToChar(as.raw(known), TRUE)
|
||
|
z <- rep(NA_character_, 256)
|
||
|
z[known] <- iconv(x, encoding, "UTF-8")
|
||
|
##print(z)
|
||
|
|
||
|
for(i in known) {
|
||
|
x <- i %% 16
|
||
|
y <- i %/% 16
|
||
|
points(x, y, pch = z[i])
|
||
|
}
|
||
|
par(pty="m")
|
||
|
}
|
||
|
|
||
|
|
||
|
## Expect centring to fail for most chars in
|
||
|
## CP1253 KOI8-* Cyrillic CP1251 Greek CP1253
|
||
|
## as those chars are not in the Adobe afms.
|
||
|
for(i in seq_along(pdfenc)) {
|
||
|
message("\ntesting ", pdfenc[i])
|
||
|
ff <- paste0("pdf-", pdfenc[i], ".pdf")
|
||
|
## use compress = FALSE to make the output human readable
|
||
|
## encoding may not work (e.g. latin2 did not in musl), so use try()
|
||
|
res <- try(pdf(ff, encoding = pdfenc[i], width = 9, height = 9,
|
||
|
compress = FALSE))
|
||
|
if(!inherits(res, "try-error")) {
|
||
|
## and this may not work either
|
||
|
try(do_one(pdfenc[i], enc[i]))
|
||
|
dev.off()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for(i in seq_along(pdfenc)) {
|
||
|
message("\ntesting postscript in ", pdfenc[i])
|
||
|
ff <- paste0("PS-", pdfenc[i], ".ps")
|
||
|
## use compress = FALSE to make the output human readable
|
||
|
## encoding may not work (e.g. latin2 did not in musl), so use try()
|
||
|
res <- try(postscript(ff, encoding = pdfenc[i], width = 9, height = 9))
|
||
|
if(!inherits(res, "try-error")) {
|
||
|
## and this may not work either
|
||
|
try(do_one(pdfenc[i], enc[i]))
|
||
|
dev.off()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(!capabilities("cairo")) q("no")
|
||
|
## Now test cairo_pdf(): do not expect any messages
|
||
|
cairo_pdf("cairo_pdf-encodings.pdf", width = 9, height = 9, onefile = TRUE)
|
||
|
for (e in enc) {
|
||
|
message("testing ", e, " with cairo_pdf")
|
||
|
do_one(e, e)
|
||
|
}
|
||
|
dev.off()
|