Initial commit
commit
a2e1595b89
|
@ -0,0 +1,13 @@
|
|||
# editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
|
@ -0,0 +1,17 @@
|
|||
version: 2
|
||||
updates:
|
||||
# Fetch and update latest `npm` packages
|
||||
- package-ecosystem: npm
|
||||
directory: '/'
|
||||
schedule:
|
||||
interval: daily
|
||||
time: '00:00'
|
||||
open-pull-requests-limit: 10
|
||||
reviewers:
|
||||
- kddlb
|
||||
assignees:
|
||||
- kddlb
|
||||
commit-message:
|
||||
prefix: fix
|
||||
prefix-development: chore
|
||||
include: scope
|
|
@ -0,0 +1,90 @@
|
|||
# Created by .ignore support plugin (hsz.mobi)
|
||||
### Node template
|
||||
# Logs
|
||||
/logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# TypeScript v1 declaration files
|
||||
typings/
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
|
||||
# next.js build output
|
||||
.next
|
||||
|
||||
# nuxt.js build output
|
||||
.nuxt
|
||||
|
||||
# Nuxt generate
|
||||
dist
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# Serverless directories
|
||||
.serverless
|
||||
|
||||
# IDE / Editor
|
||||
.idea
|
||||
|
||||
# Service worker
|
||||
sw.*
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
|
||||
# Vim swap files
|
||||
*.swp
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2021 Kevin López Brante
|
||||
|
||||
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.
|
|
@ -0,0 +1,20 @@
|
|||
# IPAServer
|
||||
|
||||
## Build Setup
|
||||
|
||||
```bash
|
||||
# install dependencies
|
||||
$ yarn install
|
||||
|
||||
# serve with hot reload at localhost:3000
|
||||
$ yarn dev
|
||||
|
||||
# build for production and launch server
|
||||
$ yarn build
|
||||
$ yarn start
|
||||
|
||||
# generate static project
|
||||
$ yarn generate
|
||||
```
|
||||
|
||||
For detailed explanation on how things work, check out [Nuxt.js docs](https://nuxtjs.org).
|
|
@ -0,0 +1,25 @@
|
|||
const bodyParser = require('body-parser')
|
||||
const app = require('express')()
|
||||
const fs = require('fs')
|
||||
const tmp = require('tmp')
|
||||
const exec = require('child_process').exec;
|
||||
|
||||
const eSpeakExecutable = process.platform === "win32" ? `"C:\\Program Files\\eSpeak NG\\espeak-ng.exe"` : `/usr/bin/espeak-ng`
|
||||
|
||||
app.use(bodyParser.json())
|
||||
app.post('/get', (req, res, next) => {
|
||||
tmp.file(function _tempFileCreated(err, path, fd, cleanupCallback) {
|
||||
if (err) throw err;
|
||||
|
||||
fs.writeFile(path, req.body.sourceText, {encoding: "utf-8"}, ()=> {
|
||||
exec(`${eSpeakExecutable} -v"${req.body.selectedLanguage}" -q -f "${path}" --ipa"`, ((error, stdout, stderr) => {
|
||||
res.json({out: stdout.trim(), stderr})
|
||||
}))
|
||||
})
|
||||
|
||||
cleanupCallback()
|
||||
});
|
||||
})
|
||||
|
||||
module.exports = app
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"~/*": ["./*"],
|
||||
"@/*": ["./*"],
|
||||
"~~/*": ["./*"],
|
||||
"@@/*": ["./*"]
|
||||
}
|
||||
},
|
||||
"exclude": ["node_modules", ".nuxt", "dist"]
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
# LAYOUTS
|
||||
|
||||
**This directory is not required, you can delete it if you don't want to use it.**
|
||||
|
||||
This directory contains your Application Layouts.
|
||||
|
||||
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/views#layouts).
|
|
@ -0,0 +1,11 @@
|
|||
<template>
|
||||
<div>
|
||||
<Nuxt />
|
||||
<footer class="footer mt-auto py-3 bg-light">
|
||||
<b-container fluid>
|
||||
<span class="text-muted">Powered by <a href="https://github.com/espeak-ng/espeak-ng" target="_blank">eSpeak-NG</a> and <a href="https://nuxtjs.org" target="_blank">Nuxt.js</a>.</span>
|
||||
</b-container>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
</template>
|
|
@ -0,0 +1,54 @@
|
|||
export default {
|
||||
// Global page headers (https://go.nuxtjs.dev/config-head)
|
||||
head: {
|
||||
title: 'IPAServer',
|
||||
meta: [
|
||||
{ charset: 'utf-8' },
|
||||
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
|
||||
{ hid: 'description', name: 'description', content: '' }
|
||||
],
|
||||
link: [
|
||||
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
|
||||
]
|
||||
},
|
||||
|
||||
// Global CSS (https://go.nuxtjs.dev/config-css)
|
||||
css: [
|
||||
],
|
||||
|
||||
// Plugins to run before rendering page (https://go.nuxtjs.dev/config-plugins)
|
||||
plugins: [
|
||||
],
|
||||
|
||||
// Auto import components (https://go.nuxtjs.dev/config-components)
|
||||
components: true,
|
||||
|
||||
// Modules for dev and build (recommended) (https://go.nuxtjs.dev/config-modules)
|
||||
buildModules: [
|
||||
],
|
||||
|
||||
// Modules (https://go.nuxtjs.dev/config-modules)
|
||||
modules: [
|
||||
// https://go.nuxtjs.dev/bootstrap
|
||||
'bootstrap-vue/nuxt',
|
||||
// https://go.nuxtjs.dev/axios
|
||||
'@nuxtjs/axios',
|
||||
],
|
||||
|
||||
// Axios module configuration (https://go.nuxtjs.dev/config-axios)
|
||||
axios: {},
|
||||
|
||||
serverMiddleware: [
|
||||
{ path: "/api", handler: "~/api/espeak.js" },
|
||||
],
|
||||
|
||||
loading: {
|
||||
color: '#078f32',
|
||||
height: '15px'
|
||||
},
|
||||
|
||||
|
||||
// Build Configuration (https://go.nuxtjs.dev/config-build)
|
||||
build: {
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"name": "IPAServer",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "nuxt",
|
||||
"build": "nuxt build",
|
||||
"start": "nuxt start",
|
||||
"generate": "nuxt generate"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nuxtjs/axios": "^5.12.2",
|
||||
"body-parser": "^1.19.0",
|
||||
"bootstrap": "^4.5.2",
|
||||
"bootstrap-vue": "^2.17.3",
|
||||
"core-js": "^3.6.5",
|
||||
"express": "^4.17.1",
|
||||
"nuxt": "^2.14.6",
|
||||
"tmp": "^0.2.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nuxt/types": "~2.14.0"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
# PAGES
|
||||
|
||||
This directory contains your Application Views and Routes.
|
||||
The framework reads all the `*.vue` files inside this directory and creates the router of your application.
|
||||
|
||||
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing).
|
|
@ -0,0 +1,425 @@
|
|||
<template>
|
||||
<b-container fluid class="py-3">
|
||||
<h1>IPA Server</h1>
|
||||
<b-row>
|
||||
<b-col cols="12" md="6">
|
||||
<h2>Source text</h2>
|
||||
<b-form-textarea
|
||||
id="textarea"
|
||||
v-model="sourceText"
|
||||
debounce="99"
|
||||
placeholder="Enter your text here"
|
||||
rows="12"
|
||||
max-rows="25"
|
||||
/>
|
||||
<b-form-select class="mt-2" v-model="selectedLanguage" :options="languages"></b-form-select>
|
||||
</b-col>
|
||||
<b-col cols="12" md="6">
|
||||
<h2>IPA output</h2>
|
||||
<b-card>
|
||||
<pre class="text-wrap">{{targetText.out}}</pre>
|
||||
</b-card>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</b-container>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
sourceText: "",
|
||||
targetText: "",
|
||||
selectedLanguage: "en-us",
|
||||
languages: [
|
||||
{
|
||||
"value": "af",
|
||||
"text": "Afrikaans"
|
||||
},
|
||||
{
|
||||
"value": "am",
|
||||
"text": "Amharic"
|
||||
},
|
||||
{
|
||||
"value": "an",
|
||||
"text": "Aragonese"
|
||||
},
|
||||
{
|
||||
"value": "as",
|
||||
"text": "Assamese"
|
||||
},
|
||||
{
|
||||
"value": "az",
|
||||
"text": "Azerbaijani"
|
||||
},
|
||||
{
|
||||
"value": "bg",
|
||||
"text": "Bulgarian"
|
||||
},
|
||||
{
|
||||
"value": "bn",
|
||||
"text": "Bengali"
|
||||
},
|
||||
{
|
||||
"value": "bs",
|
||||
"text": "Bosnian"
|
||||
},
|
||||
{
|
||||
"value": "ca",
|
||||
"text": "Catalan"
|
||||
},
|
||||
{
|
||||
"value": "cmn",
|
||||
"text": "Chinese (Mandarin)"
|
||||
},
|
||||
{
|
||||
"value": "cs",
|
||||
"text": "Czech"
|
||||
},
|
||||
{
|
||||
"value": "cy",
|
||||
"text": "Welsh"
|
||||
},
|
||||
{
|
||||
"value": "da",
|
||||
"text": "Danish"
|
||||
},
|
||||
{
|
||||
"value": "de",
|
||||
"text": "German"
|
||||
},
|
||||
{
|
||||
"value": "el",
|
||||
"text": "Greek"
|
||||
},
|
||||
{
|
||||
"value": "en-029",
|
||||
"text": "English (Caribbean)"
|
||||
},
|
||||
{
|
||||
"value": "en-gb",
|
||||
"text": "English (Great Britain)"
|
||||
},
|
||||
{
|
||||
"value": "en-gb-scotland",
|
||||
"text": "English (Scotland)"
|
||||
},
|
||||
{
|
||||
"value": "en-gb-x-gbclan",
|
||||
"text": "English (Lancaster)"
|
||||
},
|
||||
{
|
||||
"value": "en-gb-x-gbcwmd",
|
||||
"text": "English (West Midlands)"
|
||||
},
|
||||
{
|
||||
"value": "en-gb-x-rp",
|
||||
"text": "English (Received Pronunciation)"
|
||||
},
|
||||
{
|
||||
"value": "en-us",
|
||||
"text": "English (United States)"
|
||||
},
|
||||
{
|
||||
"value": "eo",
|
||||
"text": "Esperanto"
|
||||
},
|
||||
{
|
||||
"value": "es",
|
||||
"text": "Spanish (Spain)"
|
||||
},
|
||||
{
|
||||
"value": "es-419",
|
||||
"text": "Spanish (Latin America)"
|
||||
},
|
||||
{
|
||||
"value": "et",
|
||||
"text": "Estonian"
|
||||
},
|
||||
{
|
||||
"value": "eu",
|
||||
"text": "Basque"
|
||||
},
|
||||
{
|
||||
"value": "fa",
|
||||
"text": "Persian"
|
||||
},
|
||||
{
|
||||
"value": "fa-latn",
|
||||
"text": "Persian (Pinglish)"
|
||||
},
|
||||
{
|
||||
"value": "fi",
|
||||
"text": "Finnish"
|
||||
},
|
||||
{
|
||||
"value": "fr-be",
|
||||
"text": "French (Belgium)"
|
||||
},
|
||||
{
|
||||
"value": "fr-fr",
|
||||
"text": "French (France)"
|
||||
},
|
||||
{
|
||||
"value": "ga",
|
||||
"text": "Gaelic (Irish)"
|
||||
},
|
||||
{
|
||||
"value": "gd",
|
||||
"text": "Gaelic (Scottish)"
|
||||
},
|
||||
{
|
||||
"value": "gn",
|
||||
"text": "Guarani"
|
||||
},
|
||||
{
|
||||
"value": "grc",
|
||||
"text": "Greek (Ancient)"
|
||||
},
|
||||
{
|
||||
"value": "gu",
|
||||
"text": "Gujarati"
|
||||
},
|
||||
{
|
||||
"value": "hi",
|
||||
"text": "Hindi"
|
||||
},
|
||||
{
|
||||
"value": "hr",
|
||||
"text": "Croatian"
|
||||
},
|
||||
{
|
||||
"value": "hu",
|
||||
"text": "Hungarian"
|
||||
},
|
||||
{
|
||||
"value": "hy",
|
||||
"text": "Armenian (East Armenia)"
|
||||
},
|
||||
{
|
||||
"value": "hyw",
|
||||
"text": "Armenian (West Armenia)"
|
||||
},
|
||||
{
|
||||
"value": "ia",
|
||||
"text": "Interlingua"
|
||||
},
|
||||
{
|
||||
"value": "id",
|
||||
"text": "Indonesian"
|
||||
},
|
||||
{
|
||||
"value": "is",
|
||||
"text": "Icelandic"
|
||||
},
|
||||
{
|
||||
"value": "it",
|
||||
"text": "Italian"
|
||||
},
|
||||
{
|
||||
"value": "jbo",
|
||||
"text": "Lojban"
|
||||
},
|
||||
{
|
||||
"value": "ka",
|
||||
"text": "Georgian"
|
||||
},
|
||||
{
|
||||
"value": "kl",
|
||||
"text": "Greenlandic"
|
||||
},
|
||||
{
|
||||
"value": "kn",
|
||||
"text": "Kannada"
|
||||
},
|
||||
{
|
||||
"value": "ko",
|
||||
"text": "Korean"
|
||||
},
|
||||
{
|
||||
"value": "ku",
|
||||
"text": "Kurdish"
|
||||
},
|
||||
{
|
||||
"value": "ky",
|
||||
"text": "Kyrgyz"
|
||||
},
|
||||
{
|
||||
"value": "la",
|
||||
"text": "Latin"
|
||||
},
|
||||
{
|
||||
"value": "lfn",
|
||||
"text": "Lingua Franca Nova"
|
||||
},
|
||||
{
|
||||
"value": "lt",
|
||||
"text": "Lithuanian"
|
||||
},
|
||||
{
|
||||
"value": "lv",
|
||||
"text": "Latvian"
|
||||
},
|
||||
{
|
||||
"value": "mk",
|
||||
"text": "Macedonian"
|
||||
},
|
||||
{
|
||||
"value": "ml",
|
||||
"text": "Malayalam"
|
||||
},
|
||||
{
|
||||
"value": "mr",
|
||||
"text": "Marathi"
|
||||
},
|
||||
{
|
||||
"value": "ms",
|
||||
"text": "Malay"
|
||||
},
|
||||
{
|
||||
"value": "mt",
|
||||
"text": "Maltese"
|
||||
},
|
||||
{
|
||||
"value": "my",
|
||||
"text": "Myanmar (Burmese)"
|
||||
},
|
||||
{
|
||||
"value": "nb",
|
||||
"text": "Norwegian Bokmål"
|
||||
},
|
||||
{
|
||||
"value": "nci",
|
||||
"text": "Nahuatl (Classical)"
|
||||
},
|
||||
{
|
||||
"value": "ne",
|
||||
"text": "Nepali"
|
||||
},
|
||||
{
|
||||
"value": "nl",
|
||||
"text": "Dutch"
|
||||
},
|
||||
{
|
||||
"value": "om",
|
||||
"text": "Oromo"
|
||||
},
|
||||
{
|
||||
"value": "or",
|
||||
"text": "Oriya"
|
||||
},
|
||||
{
|
||||
"value": "pa",
|
||||
"text": "Punjabi"
|
||||
},
|
||||
{
|
||||
"value": "pap",
|
||||
"text": "Papiamento"
|
||||
},
|
||||
{
|
||||
"value": "pl",
|
||||
"text": "Polish"
|
||||
},
|
||||
{
|
||||
"value": "pt",
|
||||
"text": "Portuguese (Portugal)"
|
||||
},
|
||||
{
|
||||
"value": "pt-br",
|
||||
"text": "Portuguese (Brazil)"
|
||||
},
|
||||
{
|
||||
"value": "ro",
|
||||
"text": "Romanian"
|
||||
},
|
||||
{
|
||||
"value": "ru",
|
||||
"text": "Russian"
|
||||
},
|
||||
{
|
||||
"value": "si",
|
||||
"text": "Sinhala"
|
||||
},
|
||||
{
|
||||
"value": "sk",
|
||||
"text": "Slovak"
|
||||
},
|
||||
{
|
||||
"value": "sl",
|
||||
"text": "Slovenian"
|
||||
},
|
||||
{
|
||||
"value": "sq",
|
||||
"text": "Albanian"
|
||||
},
|
||||
{
|
||||
"value": "sr",
|
||||
"text": "Serbian"
|
||||
},
|
||||
{
|
||||
"value": "sv",
|
||||
"text": "Swedish"
|
||||
},
|
||||
{
|
||||
"value": "sw",
|
||||
"text": "Swahili"
|
||||
},
|
||||
{
|
||||
"value": "ta",
|
||||
"text": "Tamil"
|
||||
},
|
||||
{
|
||||
"value": "te",
|
||||
"text": "Telugu"
|
||||
},
|
||||
{
|
||||
"value": "tn",
|
||||
"text": "Setswana"
|
||||
},
|
||||
{
|
||||
"value": "tr",
|
||||
"text": "Turkish"
|
||||
},
|
||||
{
|
||||
"value": "tt",
|
||||
"text": "Tatar"
|
||||
},
|
||||
{
|
||||
"value": "ur",
|
||||
"text": "Urdu"
|
||||
},
|
||||
{
|
||||
"value": "vi",
|
||||
"text": "Vietnamese (Northern)"
|
||||
},
|
||||
{
|
||||
"value": "vi-vn-x-central",
|
||||
"text": "Vietnamese (Central)"
|
||||
},
|
||||
{
|
||||
"value": "vi-vn-x-south",
|
||||
"text": "Vietnamese (Southern)"
|
||||
},
|
||||
{
|
||||
"value": "yue",
|
||||
"text": "Chinese (Cantonese)"
|
||||
}
|
||||
].sort((a,b)=>(a.text>b.text)?1:-1)
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
async sourceText(newValue) {
|
||||
this.targetText = await this.$axios.$post("/api/get", {
|
||||
sourceText: newValue,
|
||||
selectedLanguage: this.selectedLanguage
|
||||
})
|
||||
},
|
||||
async selectedLanguage(newValue) {
|
||||
this.targetText = await this.$axios.$post("/api/get", {
|
||||
sourceText: this.sourceText,
|
||||
selectedLanguage: newValue
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,11 @@
|
|||
# STATIC
|
||||
|
||||
**This directory is not required, you can delete it if you don't want to use it.**
|
||||
|
||||
This directory contains your static files.
|
||||
Each file inside this directory is mapped to `/`.
|
||||
Thus you'd want to delete this README.md before deploying to production.
|
||||
|
||||
Example: `/static/robots.txt` is mapped as `/robots.txt`.
|
||||
|
||||
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#static).
|
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
Loading…
Reference in New Issue