nano9 0.1.0-alpha.7

A Pico-8 compatibility layer for Bevy
Documentation
//! Handle P8SCII characters

pub fn char_to_utf8(p8char: u8) -> Option<&'static str> {
    match p8char {
        // The P8SCII character set as described by picotool.

        // Control codes
        0 => Some("\x00"),  // Terminate printing
        1 => Some("\x01"),  // Repeat next character P0 times
        2 => Some("\x02"),  // Draw solid background with color P0
        3 => Some("\x03"),  // Move cursor horizontally by P0-16 pixels
        4 => Some("\x04"),  // Move cursor vertically by P0-16 pixels
        5 => Some("\x05"),  // Move cursor by P0-16, P1-16 pixels
        6 => Some("\x06"),  // Special command
        7 => Some("\x07"),  // Audio command
        8 => Some("\x08"),  // Backspace
        9 => Some("\x09"),  // Tab
        10 => Some("\x0a"), // Newline
        11 => Some("\x0b"), // Decorate previous character command
        12 => Some("\x0c"), // Set foreground to color P0
        13 => Some("\x0d"), // Carriage return
        14 => Some("\x0e"), // Switch font defined at 0x5600
        15 => Some("\x0f"), // Switch font to default

        // Japanese punctuation
        16 => Some(""),  // Vertical rectangle
        17 => Some(""),  // Filled square
        18 => Some(""),  // Hollow square
        19 => Some(""),  // Five dot
        20 => Some(""),  // Four dot
        21 => Some(""),  // Pause
        22 => Some(""),  // Back
        23 => Some(""),  // Forward
        24 => Some(""), // Japanese starting quote
        25 => Some(""), // Japanese ending quote
        26 => Some("¥"),  // Yen sign
        27 => Some(""),  // Interpunct
        28 => Some(""), // Japanese comma
        29 => Some(""), // Japanese full stop
        30 => Some(""), // Japanese dakuten
        31 => Some(""), // Japanese handakuten
        127 => Some(""), // Hollow circle

        // Symbols
        128 => Some(""),  // Rectangle
        129 => Some(""),  // Checkerboard
        130 => Some("🐱"), // Jelpi
        131 => Some("⬇️"), // Down key
        132 => Some(""),  // Dot pattern
        133 => Some(""),  // Throwing star
        134 => Some(""),  // Ball
        135 => Some(""),  // Heart
        136 => Some(""),  // Eye
        137 => Some(""), // Man
        138 => Some(""),  // House
        139 => Some("⬅️"), // Left key
        140 => Some("😐"), // Face
        141 => Some(""),  // Musical note
        142 => Some("🅾️"), // O key
        143 => Some(""),  // Diamond
        144 => Some(""),  // Ellipsis
        145 => Some("➡️"), // Right key
        146 => Some(""),  // Five-pointed star
        147 => Some(""),  // Hourglass
        148 => Some("⬆️"), // Up key
        149 => Some("ˇ"),  // Birds
        150 => Some(""),  // Sawtooth
        151 => Some(""), // X key
        152 => Some(""),  // Horiz lines
        153 => Some(""),  // Vert lines

        // Hiragana
        154 => Some(""), // Hiragana: a
        155 => Some(""), // i
        156 => Some(""), // u
        157 => Some(""), // e
        158 => Some(""), // o
        159 => Some(""), // ka
        160 => Some(""), // ki
        161 => Some(""), // ku
        162 => Some(""), // ke
        163 => Some(""), // ko
        164 => Some(""), // sa
        165 => Some(""), // si
        166 => Some(""), // su
        167 => Some(""), // se
        168 => Some(""), // so
        169 => Some(""), // ta
        170 => Some(""), // chi
        171 => Some(""), // tsu
        172 => Some(""), // te
        173 => Some(""), // to
        174 => Some(""), // na
        175 => Some(""), // ni
        176 => Some(""), // nu
        177 => Some(""), // ne
        178 => Some(""), // no
        179 => Some(""), // ha
        180 => Some(""), // hi
        181 => Some(""), // phu
        182 => Some(""), // he
        183 => Some(""), // ho
        184 => Some(""), // ma
        185 => Some(""), // mi
        186 => Some(""), // mu
        187 => Some(""), // me
        188 => Some(""), // mo
        189 => Some(""), // ya
        190 => Some(""), // yu
        191 => Some(""), // yo
        192 => Some(""), // ra
        193 => Some(""), // ri
        194 => Some(""), // ru
        195 => Some(""), // re
        196 => Some(""), // ro
        197 => Some(""), // wa
        198 => Some(""), // wo
        199 => Some(""), // n
        200 => Some(""), // Hiragana sokuon
        201 => Some(""), // Hiragana digraphs: ya
        202 => Some(""), // yu
        203 => Some(""), // yo

        // Katakana
        204 => Some(""), // Katakana: a
        205 => Some(""), // i
        206 => Some(""), // u
        207 => Some(""), // e
        208 => Some(""), // o
        209 => Some(""), // ka
        210 => Some(""), // ki
        211 => Some(""), // ku
        212 => Some(""), // ke
        213 => Some(""), // ko
        214 => Some(""), // sa
        215 => Some(""), // si
        216 => Some(""), // su
        217 => Some(""), // se
        218 => Some(""), // so
        219 => Some(""), // ta
        220 => Some(""), // chi
        221 => Some(""), // tsu
        222 => Some(""), // te
        223 => Some(""), // to
        224 => Some(""), // na
        225 => Some(""), // ni
        226 => Some(""), // nu
        227 => Some(""), // ne
        228 => Some(""), // no
        229 => Some(""), // ha
        230 => Some(""), // hi
        231 => Some(""), // phu
        232 => Some(""), // he
        233 => Some(""), // ho
        234 => Some(""), // ma
        235 => Some(""), // mi
        236 => Some(""), // mu
        237 => Some(""), // me
        238 => Some(""), // mo
        239 => Some(""), // ya
        240 => Some(""), // yu
        241 => Some(""), // yo
        242 => Some(""), // ra
        243 => Some(""), // ri
        244 => Some(""), // ru
        245 => Some(""), // re
        246 => Some(""), // ro
        247 => Some(""), // wa
        248 => Some(""), // wo
        249 => Some(""), // n
        250 => Some(""), // Katakana sokuon
        251 => Some(""), // Katakana digraphs: ya
        252 => Some(""), // yu
        253 => Some(""), // yo

        // Remaining symbols
        254 => Some(""), // Left arc
        255 => Some(""), // Right arc
        _ => None,
    }
}

pub fn vec_to_utf8(p8chars: Vec<u8>) -> String {
    let mut accum = String::new();
    for p8char in p8chars {
        if let Some(utf8) = char_to_utf8(p8char) {
            accum.push_str(utf8);
        } else {
            accum.push(p8char as char);
        }
    }
    accum
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_x() {
        let mut v: Vec<u8> = Vec::new();
        v.extend(b"hit");
        v.push(145);
        v.extend(b" or ");
        v.push(151);
        v.extend(b" to go to next");
        let s = vec_to_utf8(v);
        assert_eq!("hit➡\u{fe0f} or ❎ to go to next", s);
    }
}