UTF-8 비호환 장치용 바이너리 자산으로 JSON 문자열 모음 변환

This article originally appeared on my personal dev blog.



지난 번에 . 이번 주에는 SE Basic IV 프로젝트가 Weblate에서 JSON 출력을 가져와서 인터프리터가 8비트 코드 페이지와 함께 사용할 수 있는 바이너리로 변환하는 방법을 보여드리겠습니다. 이것은 매우 틈새 사용 사례이지만 자신의 프로젝트에 적용할 수 있는 몇 가지 일반적인 교훈이 있기를 바랍니다.

이 프로젝트는 GitHub에서 호스팅되는 Git 리포지토리를 사용합니다. 최상위 수준에는 다른 언어 파일을 생성하는 데 사용되는 영어 JSON 템플릿이 포함된 locales 폴더가 있습니다. 이러한 파일은 명확성이 필요한 경우(예: 라틴 아메리카 스페인어)를 제외하고 대부분 2자로 된 ISO 언어 코드로 식별됩니다.

다음은 템플릿의 스니펫입니다.

    {
        "NAME": "English",
        "FILENAME": "EN.LN",
        "ICONV": "IBM437",
        "SCROLL": "Scroll?____",
        "ERROR": " in ",
        "READY": "Ready_______",
        "SYNTAX": "Syntax error",
    ...
        "PATH": "Path not found"
    }

`
NAME 필드는 웨블레이트와 빌드 스크립트(보고용)에서 사용됩니다.
FILENAME 필드는 출력 파일 이름을 설정합니다.
ICONV 필드는 UTF-8에서 변환할 때 사용할 코드 페이지를 설정합니다.

처음 세 개의 번역 가능한 용어에는 밑줄 형식의 패딩이 포함되어 있습니다. 이는 통역사가 이러한 용어가 고정된 주소에 저장될 것으로 예상하기 때문에 필요합니다. 빌드 스크립트는 밑줄을 null로 변환합니다(코드 포인트 0 ). 나머지 용어는 null로 종료됩니다.

JSON 파일의 항목은 임의의 순서일 수 있습니다. 빌드 스크립트는 필요한 순서대로 출력합니다.

기본 분기의 locales 폴더에 변경 사항이 있으면 GitHub 호스팅 러너를 시작하여 빌드 스크립트를 실행하는 GitHub 작업이 트리거됩니다. 작업은 YAML 파일에 정의됩니다.
`
name: build localized message bundles
on:
  push:
    paths:
    - 'locales/**'
  workflow_dispatch:

jobs:
  locales:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name:
        run: |
          ./scripts/locales.sh
          git config user.name github-actions
          git config user.email [email protected]
          git add .
          git commit -m "locales"
          git push origin main

`

The name 매개변수는 보고 목적으로 사용됩니다.
on 매개변수는 스크립트가 실행될 때 설정됩니다. 이 경우 ** 폴더에 모든 파일 유형( locales )의 푸시가 있는 경우입니다. 분기를 지정하지 않으면 스크립트는 기본 분기로 기본 설정됩니다. workflow_dispatch 매개변수를 사용하면 GitHub Actions 웹 인터페이스에서 스크립트를 수동으로 실행할 수 있습니다.
jobs 매개변수는 작업이 수행하는 작업을 정의합니다. 여기서 locales는 작업 이름입니다.
runs-on 매개변수는 호스트 실행기가 사용하는 OS를 설정합니다. 이 경우 Ubuntu 최신(x64)입니다. 다른 OS를 지정할 수도 있지만 실행 프로그램 비용을 지불해야 하는 경우(예: 상용 소프트웨어를 개발하는 경우) Linux가 가장 저렴한 옵션입니다.
steps 매개변수는 작업을 정의합니다. uses 매개변수를 사용하면 checkout@v2와 같은 미리 정의된 작업을 사용할 수 있습니다. 그러면 호스트 실행기에 리포지토리 사본이 저장됩니다.
run: | 매개변수를 사용하면 명령줄 작업 목록을 지정할 수 있습니다. 이 작업은 다음 작업을 수행합니다.

  • locales.sh 셸 스크립트를 실행합니다.
  • Git user.name 및 user.email을 설정합니다. 이는 작업에 의해 변경되었음을 보여줍니다.
  • 모든 변경 사항을 추가합니다.
  • 변경 사항을 커밋합니다.
  • 변경 사항을 푸시합니다.

  • 다음은 locales.sh 스크립트의 스니펫입니다.

    cd locales
    for f in *.json; do
    export jname=${f%}
    name=$(jq -r .NAME $jname)
    echo Generating $name
    fname=$(jq -r .FILENAME $jname)
    iconv=$(jq -r .ICONV $jname)
    scroll=$(jq -r .SCROLL $jname)
    error=$(jq -r .ERROR $jname)
    ready=$(jq -r .READY $jname)
    synatx=$(jq -r .SYNTAX $jname)
    ...
    path=$(jq -r .PATH $jname)
    echo $scroll"_"$error"_"$ready"_"$ok"_"$break"_"$for"_"$synatx"_"$gosub"_"$data"_"$call"_"$overflow"_"$memory"_"$line"_"$subscript"_"$variable"_"$address"_"$statement"_"$type"_"$screen"_"$device"_"$stream"_"$channel"_"$function"_"$buffer"_"$next"_"$wend"_"$while"_"$file"_"$input"_"$path"____________________________________________________________________________________________________________________________________________________________________________________________________________________" > TEMP.LN
    iconv -f UTF8 -t $iconv TEMP.LN > $fname
    head -c 608 $fname > TEMP.LN
    mv TEMP.LN $fname
    perl -pi -e 's/_/\0/g' $fname
    mv $fname ../ChloeVM.app/Contents/Resources/chloehd/SYSTEM/LANGUAGE.S/$fname
    done

    The script uses a FOR loop to iterate through every JSON file in the locales 폴더. 대부분의 실제 작업은 두 가지 도구로 수행됩니다.


  • jq - 명령줄 JSON 프로세서

  • iconv - 명령줄 문자 인코딩 도구입니다.

  • JSON 파일의 각 매개변수에 대해 스크립트는 jq를 사용하여 동등한 변수를 생성합니다. 각 파일에 대한 프로세스는 다음과 같습니다.
  • 모든 변수가 할당되면 추가 패딩이 있는 TEMP.LN라는 임시 파일이 생성됩니다.
  • 그런 다음 iconv를 사용하여 임시 파일을 적절한 코드 페이지용으로 인코딩된 올바른 파일 이름으로 변환합니다.
  • head 명령은 바이너리를 고정 길이로 트리밍하는 데 사용됩니다.
  • 임시 파일이 제거되었습니다.
  • Perl은 밑줄( _ )을 null 문자(코드 포인트 0 )로 바꾸는 데 사용됩니다.
  • 바이너리가 기본 파일 시스템의 올바른 위치로 이동됩니다.
  • 좋은 웹페이지 즐겨찾기