zhconv 0.4.1

Traditional, Simplified and regional Chinese variants converter powered by MediaWiki & OpenCC rulesets and the Aho-Corasick algorithm 中文简繁及地區詞轉換
Documentation
import { useMemo } from "react";
import TextField from "@mui/material/TextField";
// import Paper from "@mui/material/Paper";
import Typography from "@mui/material/Typography";
import Box from "@mui/material/Box";
import Tooltip from "@mui/material/Tooltip";
import { useApp } from "../AppContext";

import { countLines } from "../utils";

const INPUT_STATS_MAX_LEN: number = 128 * 1024;

export default function InputEditor({
  input,
  setInput,
}: {
  input: string;
  setInput: (value: string) => void;
}) {
  const { wasm } = useApp();
  return (
    <>
      <TextField
        id="input"
        label="Input / 原文"
        placeholder="天干物燥,小心火烛。"
        multiline
        fullWidth
        autoFocus
        rows={16}
        variant="standard"
        sx={{
          "& .MuiInputBase-input": {
            lineHeight: 1.2,
          },
        }}
        value={input}
        onChange={(event) => setInput(event.target.value)}
      />
      <Box sx={{ mt: 0.5, mb: -1 }}>
        <Typography variant="caption" color="textSecondary">
          Lines/橫行:{" "}
          {useMemo(
            () =>
              input.length > INPUT_STATS_MAX_LEN ? (
                <NAwithTooltip />
              ) : (
                countLines(input)
              ),
            [input],
          )}
          <Box
            component="span"
            sx={{ marginLeft: "0.3em", marginRight: "0.3em" }}
          >
            ・
          </Box>
          Chars/字: {input.length}
          <Box
            component="span"
            sx={{ marginLeft: "0.3em", marginRight: "0.3em" }}
          >
            ・
          </Box>
          Variant/變體:{" "}
          {useMemo(() => {
            if (input.length > INPUT_STATS_MAX_LEN) {
              return <NAwithTooltip />;
            }
            if (!wasm) {
              return "LOADING";
            }
            return wasm.infer_variant_confidence(input ?? "");
          }, [input, wasm])}
        </Typography>
      </Box>
    </>
  );
}

function NAwithTooltip() {
  return (
    <Tooltip title="Stats disabled since input size is too large">
      <Box component="span">N/A</Box>
    </Tooltip>
  );
}