Browse Source

Tuned the standard open/save/clipboard

pull/244/head
Eugenio Parodi 2 years ago
parent
commit
2b08a2254e
  1. 1
      TermTk/TTkCrossTools/__init__.py
  2. 159
      TermTk/TTkCrossTools/savetools.py
  3. 23
      TermTk/TTkGui/clipboard.py
  4. 51
      tools/dumb_paint_lib/maintemplate.py
  5. 9
      tools/dumb_paint_lib/paintarea.py
  6. 35
      tools/webExporter/index.html
  7. 116
      tools/webExporter/js/ttkproxy.js
  8. 28
      tools/webExporterInit.sh

1
TermTk/TTkCrossTools/__init__.py

@ -0,0 +1 @@
from .savetools import *

159
TermTk/TTkCrossTools/savetools.py

@ -0,0 +1,159 @@
# MIT License
#
# Copyright (c) 2024 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com>
#
# 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.
__all__ = ['ttkCrossOpen', 'ttkCrossSave', 'ttkCrossSaveAs', 'TTkEncoding', 'ttkConnectDragOpen', 'ttkEmitDragOpen', 'ttkEmitFileOpen']
import os
import importlib.util
import json
from TermTk import pyTTkSlot, pyTTkSignal
from TermTk import TTkLog
from TermTk import TTkMessageBox, TTkFileDialogPicker, TTkHelper, TTkString, TTkK, TTkColor
ttkCrossOpen = None
ttkCrossSave = None
ttkCrossSaveAs = None
ttkEmitDragOpen = None
ttkEmitFileOpen = None
ttkConnectDragOpen = None
class TTkEncoding(str):
TEXT = "text"
TEXT_PLAIN = "text/plain"
TEXT_PLAIN_UTF8 = "text/plain;charset=utf-8"
APPLICATION = 'application'
APPLICATION_JSON = 'application/json'
IMAGE = 'image'
IMAGE_PNG = 'image/png'
IMAGE_SVG = 'image/svg+xml'
IMAGE_JPG = 'image/jpeg'
if importlib.util.find_spec('pyodideProxy'):
TTkLog.info("Using 'pyodideProxy' as clipboard manager")
import pyodideProxy
ttkDragOpen = {}
ttkFileOpen = pyTTkSignal(dict)
def _open(path, encoding, filter, cb=None):
if not cb: return
ttkFileOpen.connect(cb)
pyodideProxy.openFile(encoding)
def _save(filePath, content, encoding, filter=None):
pyodideProxy.saveFile(os.path.basename(filePath), content, encoding)
def _connectDragOpen(encoding, cb):
if not encoding in ttkDragOpen:
ttkDragOpen[encoding] = pyTTkSignal(dict)
return ttkDragOpen[encoding].connect(cb)
def _emitDragOpen(encoding, data):
for do in [ttkDragOpen[e] for e in ttkDragOpen if encoding.startswith(e)]:
do.emit(data)
def _emitFileOpen(encoding, data):
ttkFileOpen.emit(data)
ttkFileOpen.clear()
ttkCrossOpen = _open
ttkCrossSave = _save
ttkCrossSaveAs = _save
ttkEmitDragOpen = _emitDragOpen
ttkEmitFileOpen = _emitFileOpen
ttkConnectDragOpen = _connectDragOpen
else:
def _crossDecoder_text(fileName) :
with open(fileName) as fp:
return fp.read()
def _crossDecoder_json(fileName) :
with open(fileName) as fp:
# return json.load(fp)
return fp.read()
def _crossDecoder_image(fileName):
return None
_crossDecoder = {
TTkEncoding.TEXT : _crossDecoder_text ,
TTkEncoding.TEXT_PLAIN : _crossDecoder_text ,
TTkEncoding.TEXT_PLAIN_UTF8 : _crossDecoder_text ,
TTkEncoding.APPLICATION : _crossDecoder_json ,
TTkEncoding.APPLICATION_JSON : _crossDecoder_json ,
TTkEncoding.IMAGE : _crossDecoder_image ,
TTkEncoding.IMAGE_PNG : _crossDecoder_image ,
TTkEncoding.IMAGE_SVG : _crossDecoder_image ,
TTkEncoding.IMAGE_JPG : _crossDecoder_image ,
}
def _open(path, encoding, filter, cb=None):
if not cb: return
def __openFile(fileName):
_decoder = _crossDecoder.get(encoding,lambda _:None)
content = _decoder(fileName)
cb({'name':fileName, 'data':content})
filePicker = TTkFileDialogPicker(pos = (3,3), size=(100,30), caption="Open", path=path, fileMode=TTkK.FileMode.ExistingFile ,filter=filter)
filePicker.pathPicked.connect(__openFile)
TTkHelper.overlay(None, filePicker, 5, 5, True)
def _save(filePath, content, encoding):
TTkLog.info(f"Saving to: {filePath}")
with open(filePath,'w') as fp:
fp.write(content)
def _saveAs(filePath, content, encoding, filter, cb=None):
if not cb: return
def _approveFile(fileName):
if os.path.exists(fileName):
@pyTTkSlot(TTkMessageBox.StandardButton)
def _cb(btn):
if btn == TTkMessageBox.StandardButton.Save:
ttkCrossSave(fileName,content,encoding)
elif btn == TTkMessageBox.StandardButton.Cancel:
return
if cb:
cb()
messageBox = TTkMessageBox(
text= (
TTkString( f'A file named "{os.path.basename(fileName)}" already exists.\nDo you want to replace it?', TTkColor.BOLD) +
TTkString( f'\n\nReplacing it will overwrite its contents.') ),
icon=TTkMessageBox.Icon.Warning,
standardButtons=TTkMessageBox.StandardButton.Discard|TTkMessageBox.StandardButton.Save|TTkMessageBox.StandardButton.Cancel)
messageBox.buttonSelected.connect(_cb)
TTkHelper.overlay(None, messageBox, 5, 5, True)
else:
ttkCrossSave(fileName,content,encoding)
filePicker = TTkFileDialogPicker(
size=(100,30), path=filePath,
acceptMode=TTkK.AcceptMode.AcceptSave,
caption="Save As...",
fileMode=TTkK.FileMode.AnyFile ,
filter=filter)
filePicker.pathPicked.connect(_approveFile)
TTkHelper.overlay(None, filePicker, 5, 5, True)
ttkCrossOpen = _open
ttkCrossSave = _save
ttkCrossSaveAs = _saveAs
ttkEmitDragOpen = lambda a:None
ttkEmitFileOpen = lambda a:None
ttkConnectDragOpen = lambda a,b:None

23
TermTk/TTkGui/clipboard.py

@ -61,10 +61,21 @@ class TTkClipboard():
try:
if importlib.util.find_spec('pyodideProxy'):
TTkLog.info("Using 'pyodideProxy' as clipboard manager")
import pyodideProxy as _c
TTkClipboard._manager = _c
TTkClipboard._setText = _c.copy
TTkClipboard._text = _c.paste
import pyodideProxy
import asyncio
async def _async_co():
text = await pyodideProxy.paste()
TTkLog.debug(f"ttkProxy paste_co: {text}")
return text
def _paste():
loop = asyncio.get_event_loop()
text = loop.run_until_complete(_async_co())
# text = loop.run_until_complete(pyodideProxy.paste())
TTkLog.debug(f"ttkProxy paste: {text=} {_async_co()=}")
return text
TTkClipboard._manager = pyodideProxy
TTkClipboard._setText = pyodideProxy.copy
TTkClipboard._text = pyodideProxy.paste # _paste
elif importlib.util.find_spec('copykitten'):
TTkLog.info("Using 'copykitten' as clipboard manager")
import copykitten as _c
@ -113,13 +124,13 @@ class TTkClipboard():
except Exception as e:
TTkLog.error("Clipboard error, try to export X11 if you are running this UI via SSH")
for line in str(e).split("\n"):
TTkLog.error(line)
TTkLog.error(str(line))
@staticmethod
def text():
'''text'''
if TTkClipboard._text:
txt = ""
txt = None
try:
txt = TTkClipboard._text()
except Exception as e:

51
tools/dumb_paint_lib/maintemplate.py

@ -264,7 +264,7 @@ class PaintTemplate(ttk.TTkAppTemplate):
self.setMenuBar(appMenuBar:=ttk.TTkMenuBarLayout(), self.TOP)
fileMenu = appMenuBar.addMenu("&File")
buttonOpen = fileMenu.addMenu("&Open")
fileMenu.addMenu("&Open" ).menuButtonClicked.connect(self._open)
fileMenu.addMenu("&Save" ).menuButtonClicked.connect(self._save)
fileMenu.addMenu("Save &As...").menuButtonClicked.connect(self._saveAs)
fileMenu.addSpacer()
@ -277,8 +277,8 @@ class PaintTemplate(ttk.TTkAppTemplate):
buttonExit = fileMenu.addMenu("E&xit")
buttonExit.menuButtonClicked.connect(ttk.TTkHelper.quit)
menuExport.addMenu("&Ascii/Txt")
menuExport.addMenu("&Ansi")
menuExport.addMenu("&Ascii/Txt").menuButtonClicked.connect(self._saveAsAscii)
menuExport.addMenu("&Ansi").menuButtonClicked.connect(self._saveAsAnsi)
menuExport.addMenu("&Python")
menuExport.addMenu("&Bash")
@ -315,23 +315,58 @@ class PaintTemplate(ttk.TTkAppTemplate):
if fileName:
self._openFile(fileName)
ttk.ttkConnectDragOpen(ttk.TTkEncoding.APPLICATION_JSON, self._openDragData)
@ttk.pyTTkSlot()
def _open(self):
ttk.ttkCrossOpen(
path='.',
encoding=ttk.TTkEncoding.APPLICATION_JSON,
filter="DumbPaintTool Files (*.DPT.json);;Json Files (*.json);;All Files (*)",
cb=self._openDragData)
@ttk.pyTTkSlot()
def _save(self):
image = self._parea.exportImage()
ttk.ttkCrossSave('untitled.DPT.txt', image, ttk.TTkEncoding.TEXT_PLAIN)
doc = self._parea.exportDocument()
ttk.ttkCrossSave('untitled.DPT.json', json.dumps(doc, indent=1), ttk.TTkEncoding.APPLICATION_JSON)
@ttk.pyTTkSlot()
def _saveAs(self):
doc = self._parea.exportDocument()
ttk.ttkCrossSaveAs('untitled.DPT.json', json.dumps(doc, indent=1), ttk.TTkEncoding.APPLICATION_JSON,
filter="DumbPaintTool Files (*.DPT.json);;Json Files (*.json);;All Files (*)")
@ttk.pyTTkSlot()
def _saveAsAnsi(self):
image = self._parea.exportImage()
text = ttk.TTkString(image)
ttk.ttkCrossSaveAs('untitled.DPT.Ansi.txt', text.toAnsi(), ttk.TTkEncoding.TEXT_PLAIN_UTF8,
filter="Ansi text Files (*.Ansi.txt);;Text Files (*.txt);;All Files (*)")
@ttk.pyTTkSlot()
def _saveAsAscii(self):
image = self._parea.exportImage()
ttk.ttkCrossSaveAs('untitled.DPT.txt', image, ttk.TTkEncoding.TEXT_PLAIN)
text = ttk.TTkString(image)
ttk.ttkCrossSaveAs('untitled.DPT.ASCII.txt', text.toAscii(), ttk.TTkEncoding.TEXT_PLAIN_UTF8,
filter="ASCII Text Files (*.ASCII.txt);;Text Files (*.txt);;All Files (*)")
@ttk.pyTTkSlot(dict)
def _openDragData(self, data):
dd = json.loads(data['data'])
if 'layers' in dd:
self.importDocument(dd)
else:
self._layers.addLayer(name="Import")
self._parea.importLayer(dd)
def _openFile(self, fileName):
ttk.TTkLog.info(f"Open: {fileName}")
with open(fileName) as fp:
# dd = json.load(fp)
text = fp.read()
dd = eval(text)
# text = fp.read()
# dd = eval(text)
dd = json.load(fp)
if 'layers' in dd:
self.importDocument(dd)
else:

9
tools/dumb_paint_lib/paintarea.py

@ -155,11 +155,15 @@ class PaintArea(ttk.TTkAbstractScrollView):
def importDocument(self, dd):
self._canvasLayers = []
if 'version' in dd and dd['version']=='1.0.0':
if (
( 'version' in dd and dd['version'] == '1.0.0' ) or
( 'version' in dd and dd['version'] == '1.0.1' and dd['type'] == 'DumbPaintTool/Document') ):
self.resizeCanvas(*dd['size'])
for l in dd['layers']:
nl = self.newLayer()
nl.importLayer(l)
else:
ttk.TTkLog.error("File Format not recognised")
self._retuneGeometry()
def exportImage(self):
@ -173,7 +177,8 @@ class PaintArea(ttk.TTkAbstractScrollView):
def exportDocument(self, full=True, palette=True, crop=True) -> dict:
pw,ph = self._documentSize
outData = {
'version':'1.0.0',
'type':'DumbPaintTool/Document',
'version':'1.0.1',
'size':(pw,ph),
'layers':[l.exportLayer(full=full,palette=palette,crop=crop) for l in self._canvasLayers]}
return outData

35
tools/webExporter/index.html

@ -9,16 +9,26 @@
<link href="www/xterm/xterm.css" rel="stylesheet" />
<script src="www/xterm/xterm.js"></script>
<script src="www/xterm-addon-fit/xterm-addon-fit.js"></script>
<!--
<script src="www/xterm-addon-canvas/xterm-addon-canvas.js"></script>
-->
<script src="www/xterm-addon-unicode11/xterm-addon-unicode11.js"></script>
<script src="www/file-saver/FileSaver.js"></script>
<script src="js/ttkproxy.js"></script>
<style>
body {
height: 100%;
overflow-y: hidden;
overflow-x: hidden;
}
.xterm .xterm-viewport {overflow-y: hidden;}
</style>
</head>
<body>
<div id="terminal" contenteditable="true" onpaste="pasteFunction()" oncontextmenu="return false;" style="position: absolute; left: 0px; top: 0px; right: 0px; bottom: 0px"></div>
<input type="file" id="file-input" hidden />
<script type="text/javascript">
@ -28,8 +38,10 @@
}
// Workaround from: https://developer.mozilla.org/en-US/docs/Web/API/CSS_Font_Loading_API
// const font = new FontFace("NerdFont", "url(www/nerdfonts/DejaVuSansMNerdFont-Regular.ttf)");
const font = new FontFace("NerdFont", "url(www/opentype/3270SemiCondensed-Regular.otf)");
// const font = new FontFace("pyTermTkFont", "url(www/fonts/nerdfonts/DejaVuSansMNerdFont-Regular.ttf)");
// const font = new FontFace("pyTermTkFont", "url(www/fonts/opentype/3270SemiCondensed-Regular.otf)");
const font = new FontFace("pyTermTkFont", "url(www/fonts/opentype/3270-Regular.otf)");
// const font = new FontFace("pyTermTkFont", "url(www/fonts/unifont/unifont_upper.ttf)");
document.fonts.add(font);
font.load();
document.fonts.ready.then(() => {fetchData()});
@ -45,6 +57,20 @@
main(json)
}
async function paste(){
if(navigator.clipboard){
try {
// let text = null
let text = await navigator.clipboard.readText().then((clipText) => clipText)
console.log('Pasted content: ', text)
return text
} catch (err) {
console.error('Failed to read clipboard contents: ', err);
}
}
return null
}
/* pyodide demo */
async function mainTTk(term,json){
ttkProxy = new TTkProxy(term)
@ -69,7 +95,9 @@
/* xterm.js */
var term = new Terminal({
allowProposedApi: true,
fontFamily: 'NerdFont'});
fontSize: 17,
// fontFamily: 'FreeSerif Regular'});
fontFamily: 'pyTermTkFont'});
/* https://www.npmjs.com/package/xterm-addon-fit */
const fitAddon = new FitAddon.FitAddon();
@ -77,6 +105,7 @@
const unicode11Addon = new Unicode11Addon.Unicode11Addon();
term.loadAddon(fitAddon);
// term.loadAddon(new CanvasAddon.CanvasAddon());
term.loadAddon(unicode11Addon);
term.unicode.activeVersion = '11';

116
tools/webExporter/js/ttkproxy.js

@ -22,19 +22,87 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
async function permissionsCheck() {
if (navigator.clipboard){
const read = await navigator.permissions.query({
name: 'clipboard-read',
});
const write = await navigator.permissions.query({
name: 'clipboard-write',
});
return write.state === 'granted' && read.state !== 'denied';
}
return false
}
// Declaration
class TTkProxy {
constructor(term) {
this.term = term
document.getElementById("file-input").addEventListener("change", (e) => {
e.preventDefault();
const file = e.target.files[0]
let reader = new FileReader()
reader.onload = (event) => {
let data = {
'type':file.type,
'name':file.name,
'size':file.size,
'data':event.target.result}
this.ttk_fileOpen(data)
}
if (file.type.startsWith('application/json') ||
file.type.startsWith('text')){
reader.readAsText(file);
}
})
document.getElementById("terminal").addEventListener("dragover", (e) => {
e.preventDefault(); //preventing from default behaviour
//dropArea.classList.add("active");
//dragFile.textContent = "Release to Upload File";
})
document.getElementById("terminal").addEventListener("dragleave", () => {
//dropArea.classList.remove("active");
// dragFile.textContent = "Drag files here to upload";
})
document.getElementById("terminal").addEventListener("drop", (e) => {
e.preventDefault();
const target = e.dataTransfer;
const file = target.files[0]
let reader = new FileReader()
reader.onload = (event) => {
let data = {
'type':file.type,
'name':file.name,
'size':file.size,
'data':event.target.result}
this.ttk_dragOpen(data)
}
if (file.type.startsWith('application/json') ||
file.type.startsWith('text')){
reader.readAsText(file);
}
})
}
pyodideProxy = {
copy: function(text){
openFile: function(encoding){
let input = document.getElementById("file-input")
input.accept = encoding
input.click();
},
saveFile: function(name, content, encoding){
const blob = new Blob([content], {type: encoding});
saveAs(blob, name);
},
copy: async function(text){
console.log("Copying:",text)
if(navigator.clipboard){
const permission = await permissionsCheck()
if(permission){
navigator.clipboard.writeText(text)
return //codes below wont be executed
}
const active = document.activeElement
const textArea = document.createElement("textarea")
textArea.value = text
@ -46,13 +114,23 @@ class TTkProxy {
document.execCommand('copy')
document.body.removeChild(textArea)
active.focus()
},
paste: function(){
if(navigator.clipboard){
text = navigator.clipboard.readText()
console.log("Pasted:",text)
return text
/*
const permission = await permissionsCheck()
if(permission){
try {
// let text = null
let text = await navigator.clipboard.readText().then((txt) => txt)
// const text = navigator.clipboard.readText()
console.log('Pasted content: ', text)
return text
} catch (err) {
console.error('Failed to read clipboard contents: ', err);
}
}
*/
return null
},
consoleLog: function(m){
@ -135,6 +213,16 @@ class TTkProxy {
from TermTk.TTkCore.TTkTerm.input import TTkInput
import pyodideProxy
def ttk_dragOpen(data):
data = data.to_py()
ttk.ttkEmitDragOpen(data['type'],data)
# ttk_log(f"{type(data.to_py())=}, {str(data.to_py())}")
def ttk_fileOpen(data):
data = data.to_py()
ttk.ttkEmitFileOpen(data['type'],data)
# ttk_log(f"{type(data.to_py())=}, {str(data.to_py())}")
def ttk_input(val):
kevt,mevt,paste = TTkInput.key_process(val)
if kevt or mevt:
@ -155,7 +243,7 @@ class TTkProxy {
def ttk_log(val):
# hex = [f"0x{ord(x):02x}" for x in val]
ttk.TTkLog.debug("---> "+val.replace("\\033","<ESC>") + " - ")
ttk.TTkHelper.paintAll()
# ttk.TTkHelper.paintAll()
def ttk_clean():
if ttk.TTkHelper._rootWidget:
@ -187,12 +275,14 @@ class TTkProxy {
`,{ globals: this.namespace }
);
this.ttk_log = this.namespace.get("ttk_log");
this.ttk_input = this.namespace.get("ttk_input");
this.ttk_timer = this.namespace.get("ttk_timer");
this.ttk_resize = this.namespace.get("ttk_resize");
this.ttk_clean = this.namespace.get("ttk_clean");
this.ttk_init = this.namespace.get("ttk_init");
this.ttk_log = this.namespace.get("ttk_log");
this.ttk_input = this.namespace.get("ttk_input");
this.ttk_timer = this.namespace.get("ttk_timer");
this.ttk_resize = this.namespace.get("ttk_resize");
this.ttk_clean = this.namespace.get("ttk_clean");
this.ttk_init = this.namespace.get("ttk_init");
this.ttk_dragOpen = this.namespace.get("ttk_dragOpen");
this.ttk_fileOpen = this.namespace.get("ttk_fileOpen");
this.pyodideProxy.ttk_timer = this.ttk_timer
this.pyodideProxy.term = this.term

28
tools/webExporterInit.sh

@ -48,10 +48,13 @@ mkdir -p ${_TMP_PATH}/bin \
${_TMP_PATH}/www/pyodide \
${_TMP_PATH}/www/xterm/ \
${_TMP_PATH}/www/xterm-addon-fit \
${_TMP_PATH}/www/xterm-addon-canvas \
${_TMP_PATH}/www/xterm-addon-unicode11 \
${_TMP_PATH}/www/file-saver\
${_TMP_PATH}/www/webfonts \
${_TMP_PATH}/www/nerdfonts \
${_TMP_PATH}/www/opentype
${_TMP_PATH}/www/fonts/nerdfonts \
${_TMP_PATH}/www/fonts/opentype \
${_TMP_PATH}/www/fonts/unifont
function _download {
_P=$1
@ -63,11 +66,12 @@ function _download {
};
_download ${_TMP_PATH}/www/pyodide/ www/pyodide/pyodide.js
# _download ${_TMP_PATH}/www/pyodide/ www/pyodide/pyodide.js.map
# _download ${_TMP_PATH}/www/pyodide/ www/pyodide/pyodide.js
_download ${_TMP_PATH}/www/pyodide/ www/pyodide/pyodide-lock.json
_download ${_TMP_PATH}/www/pyodide/ www/pyodide/python_stdlib.zip
_download ${_TMP_PATH}/www/pyodide/ www/pyodide/pyodide.asm.js
_download ${_TMP_PATH}/www/pyodide/ www/pyodide/repodata.json
# _download ${_TMP_PATH}/www/pyodide/ www/pyodide/repodata.json
_download ${_TMP_PATH}/www/pyodide/ www/pyodide/pyodide.asm.wasm
_download ${_TMP_PATH}/www/xterm/ www/xterm/xterm.css
@ -77,12 +81,20 @@ _download ${_TMP_PATH}/www/xterm/ www/xterm/xterm.js.map
_download ${_TMP_PATH}/www/xterm-addon-fit/ www/xterm-addon-fit/xterm-addon-fit.js
_download ${_TMP_PATH}/www/xterm-addon-fit/ www/xterm-addon-fit/xterm-addon-fit.js.map
_download ${_TMP_PATH}/www/xterm-addon-canvas/ www/xterm-addon-canvas/xterm-addon-canvas.js
_download ${_TMP_PATH}/www/xterm-addon-canvas/ www/xterm-addon-canvas/xterm-addon-canvas.js.map
_download ${_TMP_PATH}/www/xterm-addon-unicode11/ www/xterm-addon-unicode11/xterm-addon-unicode11.js
_download ${_TMP_PATH}/www/xterm-addon-unicode11/ www/xterm-addon-unicode11/xterm-addon-unicode11.js.map
_download ${_TMP_PATH}/www/file-saver/ www/file-saver/FileSaver.js
# _download ${_TMP_PATH}/www/webfonts/ www/webfonts/fa-regular-400.woff2
# _download ${_TMP_PATH}/www/nerdfonts/ www/nerdfonts/HurmitNerdFontMono-Regular.otf
# _download ${_TMP_PATH}/www/nerdfonts/ www/nerdfonts/DejaVuSansMNerdFont-Regular.ttf
_download ${_TMP_PATH}/www/opentype/ www/opentype/3270SemiCondensed-Regular.otf
# _download ${_TMP_PATH}/www/fonts/webfonts/ www/fonts/webfonts/fa-regular-400.woff2
# _download ${_TMP_PATH}/www/fonts/nerdfonts/ www/fonts/nerdfonts/HurmitNerdFontMono-Regular.otf
# _download ${_TMP_PATH}/www/fonts/nerdfonts/ www/fonts/nerdfonts/DejaVuSansMNerdFont-Regular.ttf
# _download ${_TMP_PATH}/www/fonts/opentype/ www/fonts/opentype/3270SemiCondensed-Regular.otf
_download ${_TMP_PATH}/www/fonts/opentype/ www/fonts/opentype/3270-Regular.otf
# _download ${_TMP_PATH}/www/fonts/unifont/ www/fonts/unifont/unifont_upper.ttf
_download ${_TMP_PATH}/www/ www/favicon.ico
@ -112,4 +124,4 @@ echo '{
rm -rf ${_TMP_PATH}/TermTk
pushd ${_TMP_PATH}
zip -r ${_PWD}/itchExport.zip *
popd
popd

Loading…
Cancel
Save