Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
HoKim98 committed Aug 30, 2024
0 parents commit 3c72e10
Show file tree
Hide file tree
Showing 10 changed files with 311 additions and 0 deletions.
18 changes: 18 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Dockerfile
/.dockerignore
/Dockerfile

# Documents
/*.md
/docs

# Git
/.git
/.github
/.gitignore

# IDE
/.vscode

# Prompts
/!prompt.md
76 changes: 76 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
name: ci

on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
push:
pull_request:
branches:
- master

env:
DEBIAN_FRONTEND: noninteractive

REGISTRY: quay.io
REGISTRY_USER: kerryeon
REGISTRY_REPOSITORY: ulagbulag
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
IMAGE_NAME: openark
IMAGE_REPO: docker.io/library/debian
IMAGE_VERSION: latest

jobs:
build-container-image:
if: ${{ github.ref == 'refs/heads/master' }}
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Install dependencies
run: >
sudo apt-get update
&& sudo apt-get install -y podman
&& mkdir -p /home/runner/.docker/
&& echo '{"auths":{"quay.io":{}}}' >/home/runner/.docker/config.json
# TODO: Wait a buildah issue to be resolved: https://github.com/redhat-actions/buildah-build/issues/116
- name: Disable container build cache
run: find ./ -name 'Dockerfile*' -exec sed -i '/--mount=type=cache[a-z0-9,=\/-]* \\$/ d' '{}' \;

- name: Log in to ${{ env.REGISTRY }}
uses: redhat-actions/podman-login@v1
with:
registry: ${{ env.REGISTRY }}
username: ${{ env.REGISTRY_USER }}
password: ${{ env.REGISTRY_PASSWORD }}

- name: Build Image
id: build-and-push-image
uses: redhat-actions/buildah-build@v2
with:
image: ${{ env.IMAGE_NAME }}
tags: latest
context: "."
containerfiles: |
./Dockerfile
build-args: |
IMAGE_REPO=${{ env.IMAGE_REPO }}
IMAGE_VERSION=${{ env.IMAGE_VERSION }}
- name: Push To ${{ env.REGISTRY }}
id: push-to-quay
if: ${{ github.repository }} == ${{ env.REGISTRY_REPOSITORY }}/${{ env.IMAGE_NAME }}
uses: redhat-actions/push-to-registry@v2
with:
image: ${{ steps.build-and-push-image.outputs.image }}
tags: ${{ steps.build-and-push-image.outputs.tags }}
registry: ${{ env.REGISTRY }}/${{ env.REGISTRY_REPOSITORY }}

- name: Print image url
run: echo "Image pushed to ${{ steps.push-to-quay.outputs.registry-paths }}"
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# IDE
/.vscode
34 changes: 34 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Copyright (c) 2024 Ho Kim ([email protected]). All rights reserved.
# Use of this source code is governed by MIT license that can be
# found in the LICENSE file.

# Configure container image variables
ARG IMAGE_REPO="docker.io/library/debian"
ARG IMAGE_VERSION="latest"

# Be ready for serving
FROM "${IMAGE_REPO}:${IMAGE_VERSION}"

# Add License
ADD ./LICENSE /usr/local/share/licenses/md-translate/LICENSE

# Install dependencies
RUN apt-get update && apt-get install -y \
bash \
coreutils \
curl \
jq \
# Cleanup
&& apt-get clean all \
&& rm -rf /var/lib/apt/lists/*

# Install the package
ADD ./md-translate.sh /usr/local/bin/md-translate.sh
ADD ./prompt.md /usr/local/share/md-translate/prompt.md
ADD ./template.json /usr/local/share/md-translate/template.json
WORKDIR /usr/local/bin

# Configure entrypoint configuration
ENV PROMPT_PATH="/usr/local/share/md-translate/prompt.md"
ENV TEMPLATE_PATH="/usr/local/share/md-translate/template.json"
ENTRYPOINT [ "/usr/bin/env", "/usr/local/bin/md-translate.sh" ]
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2024 Ho Kim

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
32 changes: 32 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Simple Markdown Translator

Translate Markdown documents to your desired language conveniently using Docker and stdin pipes!

## Usage

```bash
cat examples/latex-url.md | ./md-translate.sh | tee output.md
```

### With Docker

```bash
cat examples/latex-url.md | docker run --rm -i -e OPENAI_API_KEY quay.io/ulagbulag/md-translate:latest
```

## Configuration

- **OPENAI_API_KEY**: See how to get API Key: https://help.openai.com/en/articles/7039783-how-can-i-access-the-chatgpt-api

## Features

- **TeX Live** markdown plugin support

## License

Please check the [LICENSE](/LICENSE) file.

### External Resources

- `examples`: Licenses are specified separately for each resource
- `prompt.md`: Derived from https://github.com/smikitky/chatgpt-md-translator (MIT)
26 changes: 26 additions & 0 deletions examples/latex-url.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Introduction

이번에 소개할 분은 여러분들께서 정말로 기다리던 분들이십니다.
이 연극의 주인공, 본인 심영과 문예봉 동무를 소개합니다!
배우 황철 동무와 극작가이신 임선규 동무를 소개합니다!
참고로, 임선규 동무는 문예봉 동무의 남편이 되십니다.
그러니까 동무끼리 부부가 되겠습니다, 여러분!

친애하는 학생, 시민 동지 여러분!
곧 이어서, 우리 공산주의 국가를 열렬히 찬양하는 애국 시민들의 늬우스를 전해 드리겠습니다!
그리고 곧 이어서, 사회주의 낙원을 건설하는 우리 모두의 염원을 연극에 담아 무대에서 보내 드리겠습니다!

여러분, '님'이 무엇입니까?
언제나 그리운 이름입니다.
우리들의 가슴입니다.
우리가 사모하고 눈물 흘리며 오랜 세월을 목말라해 온 이름입니다.
'님'은 바로 사회주의 낙원을 말하는 것입니다, 여러분!

오랫동안 기다리셨습니다.
이제 곧 늬우스를 상영하겠습니다!
기대해 주십시오.
오늘 여러분들은 그토록 고대하시던 여러분들의 님을 확실하게 만나고 확인하시게 될 것입니다, 여러분!

## References

- Plot: \url{https://namu.wiki/w/%EB%82%B4%EA%B0%80%20%EA%B3%A0%EC%9E%90%EB%9D%BC%EB%8B%88/%EB%8C%80%EB%B3%B8#s-4.1}
82 changes: 82 additions & 0 deletions md-translate.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#!/bin/bash
# Copyright (c) 2024 Ho Kim ([email protected]). All rights reserved.
# Use of this source code is governed by MIT license that can be
# found in the LICENSE file.

# Prehibit errors
set -e -o pipefail

###########################################################
# Configuration #
###########################################################

# Configure default environment variables
OPENAI_API_URL_DEFAULT="https://api.openai.com/v1/chat/completions"
PROMPT_PATH_DEFAULT="$(pwd)/prompt.md"
TEMPLATE_PATH_DEFAULT="$(pwd)/template.json"

# Configure environment variables
OPENAI_API_URL="${OPENAI_API_URL:-$OPENAI_API_URL_DEFAULT}"
PROMPT_PATH="${PROMPT_PATH:-$PROMPT_PATH_DEFAULT}"
TEMPLATE_PATH="${TEMPLATE_PATH:-$TEMPLATE_PATH_DEFAULT}"

###########################################################
# Check Environment Variables #
###########################################################

function _assert_file() {
local key="$1"

# try to parse from cache
if [ ! -f "${!key}" ]; then
echo "No such file (${key}): ${!key}" >&2
exit 1
fi
}

function _assert_key() {
local key="$1"

# try to parse from cache
if [ -z "${!key+x}" ]; then
echo "Environment variable \"${key}\" not set" >&2
exit 1
fi
}

_assert_file 'PROMPT_PATH'
_assert_file 'TEMPLATE_PATH'

_assert_key 'OPENAI_API_KEY'

###########################################################
# Main Function #
###########################################################

function main() {
input_file="$(mktemp)"
output_file="$(mktemp)"

# Read stdin
cat - >"${input_file}"

# Call translator
cat "${TEMPLATE_PATH}" |
jq -e |
jq -e "( .messages // [] | . ) += [{\"role\": \"user\", \"content\": \$input}]" --rawfile input "${PROMPT_PATH}" |
jq -e "( .messages // [] | . ) += [{\"role\": \"user\", \"content\": \$input}]" --rawfile input "${input_file}" |
curl -s -X POST "${OPENAI_API_URL}" \
-H "Authorization: Bearer ${OPENAI_API_KEY}" \
-H "Content-Type: application/json" \
-d @- >"${output_file}"

# Parse the outputs
if cat "${output_file}" | jq -e '.error.message' >/dev/null; then
echo "$(cat "${output_file}" | jq -e -r '.error.message')" >&2
exit 1
fi
exec cat "${output_file}" | jq -e -r '.choices[0].message.content'
}

# Execute main function
main "$@"
11 changes: 11 additions & 0 deletions prompt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
I am translating the documentation for writing journal paper.
Translate the Markdown content into English, then I'll paste later into the paper.

You must strictly follow the rules below.

- Never change the Markdown markup structure. Don't add or remove links. Do not change any URL.
- Never change the contents of code blocks even if they appear to have a bug.
- Always preserve the original line breaks. Do not add or remove blank lines.
- Never touch the permalink such as `{/*examples*/}` at the end of each heading.
- Never touch HTML-like tags such as `<Notes>`.
- Never touch LaTex tags such as `\start{document}`.
9 changes: 9 additions & 0 deletions template.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"max_tokens": 2048,
"messages": [],
"model": "gpt-4o",
"n": 1,
"stop": null,
"stream": false,
"temperature": 0.7
}

0 comments on commit 3c72e10

Please sign in to comment.