Initial commit

main
Kevin López 3 years ago
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

90
.gitignore vendored

@ -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

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save