Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9dc91a846c | |||
| 9fa783603c | |||
| c37fd42b6a | |||
| 8e6abc4e0e | |||
| 24fdaed8d9 | |||
| 8a9ce0dc9f | |||
| 16ab928383 | |||
| e195ea5532 | |||
| 5629cc57f3 | |||
| d5cf9cba56 | |||
| cf8c4893ff | |||
| 6f634c6a09 | |||
| b603581e4f | |||
| 69be5ca9de | |||
| 3fb055a3a3 |
@@ -1,7 +1,6 @@
|
|||||||
.DS_Store
|
SPEx/bin
|
||||||
.settings
|
|
||||||
bananaSPLIT/build
|
|
||||||
bananaSPLIT/conf/_*.json
|
|
||||||
TestFiles
|
TestFiles
|
||||||
.pydevproject
|
__pycache__
|
||||||
.project
|
.vscode
|
||||||
|
.venv
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>bananaSPLIT</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.python.pydev.PyDevBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.python.pydev.pythonNature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<?eclipse-pydev version="1.0"?><pydev_project>
|
|
||||||
<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
|
|
||||||
<path>/${PROJECT_DIR_NAME}</path>
|
|
||||||
<path>/${PROJECT_DIR_NAME}/bananaSPLIT/libbananasplit</path>
|
|
||||||
<path>/${PROJECT_DIR_NAME}/bananaSPLIT/UserInterface/compiledUI</path>
|
|
||||||
</pydev_pathproperty>
|
|
||||||
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python interpreter</pydev_property>
|
|
||||||
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">python37</pydev_property>
|
|
||||||
</pydev_project>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/org.eclipse.core.resources.prefs
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
encoding//bananaSPLIT/UserInterface/compiledUI/about.py=utf-8
|
|
||||||
encoding//bananaSPLIT/UserInterface/compiledUI/advopt.py=utf-8
|
|
||||||
encoding//bananaSPLIT/UserInterface/compiledUI/avanzatetitolo.py=utf-8
|
|
||||||
encoding//bananaSPLIT/UserInterface/compiledUI/avanzatetitolo2.py=utf-8
|
|
||||||
encoding//bananaSPLIT/UserInterface/compiledUI/avanzatetitolo3.py=utf-8
|
|
||||||
encoding//bananaSPLIT/UserInterface/compiledUI/mainwindow.py=utf-8
|
|
||||||
encoding//bananaSPLIT/UserInterface/compiledUI/selezout.py=utf-8
|
|
||||||
encoding//bananaSPLIT/UserInterface/compiledUI/titolow.py=utf-8
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
|
|
||||||
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
@@ -6,7 +6,6 @@
|
|||||||
"INworkPath": "C://",
|
"INworkPath": "C://",
|
||||||
"OUTworkPath": "C://",
|
"OUTworkPath": "C://",
|
||||||
"fileList": [
|
"fileList": [
|
||||||
"bdlog.txt"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"docStruct": {
|
"docStruct": {
|
||||||
@@ -0,0 +1,505 @@
|
|||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Python graph (network) package"
|
||||||
|
name = "altgraph"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "0.17"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "An abstract syntax tree for Python with inference support."
|
||||||
|
name = "astroid"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.5"
|
||||||
|
version = "2.4.2"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
lazy-object-proxy = ">=1.4.0,<1.5.0"
|
||||||
|
six = ">=1.12,<2.0"
|
||||||
|
wrapt = ">=1.11,<2.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Atomic file writes."
|
||||||
|
marker = "sys_platform == \"win32\""
|
||||||
|
name = "atomicwrites"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
|
version = "1.4.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Classes Without Boilerplate"
|
||||||
|
name = "attrs"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
|
version = "20.2.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"]
|
||||||
|
docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"]
|
||||||
|
tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
|
||||||
|
tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "A tool that automatically formats Python code to conform to the PEP 8 style guide"
|
||||||
|
name = "autopep8"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "1.5.4"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
pycodestyle = ">=2.6.0"
|
||||||
|
toml = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Cross-platform colored terminal text."
|
||||||
|
marker = "sys_platform == \"win32\""
|
||||||
|
name = "colorama"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
|
version = "0.4.4"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Clean single-source support for Python 3 and 2"
|
||||||
|
marker = "sys_platform == \"win32\""
|
||||||
|
name = "future"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||||
|
version = "0.18.2"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "A Python utility / library to sort Python imports."
|
||||||
|
name = "isort"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6,<4.0"
|
||||||
|
version = "5.6.4"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
colors = ["colorama (>=0.4.3,<0.5.0)"]
|
||||||
|
pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
|
||||||
|
requirements_deprecated_finder = ["pipreqs", "pip-api"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "A fast and thorough lazy object proxy."
|
||||||
|
name = "lazy-object-proxy"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
|
version = "1.4.3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Mach-O header analysis and editing"
|
||||||
|
marker = "sys_platform == \"darwin\""
|
||||||
|
name = "macholib"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "1.14"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
altgraph = ">=0.15"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "McCabe checker, plugin for flake8"
|
||||||
|
name = "mccabe"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "0.6.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "More routines for operating on iterables, beyond itertools"
|
||||||
|
name = "more-itertools"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.5"
|
||||||
|
version = "8.5.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Core utilities for Python packages"
|
||||||
|
name = "packaging"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
|
version = "20.4"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
pyparsing = ">=2.0.2"
|
||||||
|
six = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "parse() is the opposite of format()"
|
||||||
|
name = "parse"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "1.18.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Python PE parsing module"
|
||||||
|
marker = "sys_platform == \"win32\""
|
||||||
|
name = "pefile"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "2019.4.18"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
future = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "plugin and hook calling mechanisms for python"
|
||||||
|
name = "pluggy"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
|
version = "0.13.1"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["pre-commit", "tox"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "library with cross-python path, ini-parsing, io, code, log facilities"
|
||||||
|
name = "py"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
|
version = "1.9.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Python style guide checker"
|
||||||
|
name = "pycodestyle"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
|
version = "2.6.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "PyInstaller bundles a Python application and all its dependencies into a single package."
|
||||||
|
name = "pyinstaller"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "4.0"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
altgraph = "*"
|
||||||
|
macholib = ">=1.8"
|
||||||
|
pefile = ">=2017.8.1"
|
||||||
|
pyinstaller-hooks-contrib = ">=2020.6"
|
||||||
|
pywin32-ctypes = ">=0.2.0"
|
||||||
|
setuptools = "*"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
encryption = ["tinyaes (>=1.0.0)"]
|
||||||
|
hook_testing = ["pytest (>=2.7.3)", "execnet (>=1.5.0)", "psutil"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Community maintained hooks for PyInstaller"
|
||||||
|
name = "pyinstaller-hooks-contrib"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "2020.9"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "python code static checker"
|
||||||
|
name = "pylint"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.5.*"
|
||||||
|
version = "2.6.0"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
astroid = ">=2.4.0,<=2.5"
|
||||||
|
colorama = "*"
|
||||||
|
isort = ">=4.2.5,<6"
|
||||||
|
mccabe = ">=0.6,<0.7"
|
||||||
|
toml = ">=0.7.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Python parsing module"
|
||||||
|
name = "pyparsing"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||||
|
version = "2.4.7"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "Python bindings for the Qt cross platform application toolkit"
|
||||||
|
name = "pyqt5"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.5"
|
||||||
|
version = "5.15.1"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
PyQt5-sip = ">=12.8,<13"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "The sip module support for PyQt5"
|
||||||
|
name = "pyqt5-sip"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.5"
|
||||||
|
version = "12.8.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "pytest: simple powerful testing with Python"
|
||||||
|
name = "pytest"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.5"
|
||||||
|
version = "5.4.3"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
atomicwrites = ">=1.0"
|
||||||
|
attrs = ">=17.4.0"
|
||||||
|
colorama = "*"
|
||||||
|
more-itertools = ">=4.0.0"
|
||||||
|
packaging = "*"
|
||||||
|
pluggy = ">=0.12,<1.0"
|
||||||
|
py = ">=1.5.0"
|
||||||
|
wcwidth = "*"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
checkqa-mypy = ["mypy (v0.761)"]
|
||||||
|
testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "A Python Slugify application that handles Unicode"
|
||||||
|
name = "python-slugify"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
|
version = "4.0.1"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
text-unidecode = ">=1.3"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
unidecode = ["Unidecode (>=1.1.1)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = ""
|
||||||
|
marker = "sys_platform == \"win32\""
|
||||||
|
name = "pywin32-ctypes"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "0.2.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Python 2 and 3 compatibility utilities"
|
||||||
|
name = "six"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||||
|
version = "1.15.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "The most basic Text::Unidecode port"
|
||||||
|
name = "text-unidecode"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "1.3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Python Library for Tom's Obvious, Minimal Language"
|
||||||
|
name = "toml"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "0.10.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Measures the displayed width of unicode strings in a terminal"
|
||||||
|
name = "wcwidth"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "0.2.5"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Module for decorators, wrappers and monkey patching."
|
||||||
|
name = "wrapt"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "1.12.1"
|
||||||
|
|
||||||
|
[metadata]
|
||||||
|
content-hash = "6639aa22e7d2afaa0d67104b68e08974d26fbcd9cca38cee0d55a4219a5831c7"
|
||||||
|
lock-version = "1.0"
|
||||||
|
python-versions = "^3.8"
|
||||||
|
|
||||||
|
[metadata.files]
|
||||||
|
altgraph = [
|
||||||
|
{file = "altgraph-0.17-py2.py3-none-any.whl", hash = "sha256:c623e5f3408ca61d4016f23a681b9adb100802ca3e3da5e718915a9e4052cebe"},
|
||||||
|
{file = "altgraph-0.17.tar.gz", hash = "sha256:1f05a47122542f97028caf78775a095fbe6a2699b5089de8477eb583167d69aa"},
|
||||||
|
]
|
||||||
|
astroid = [
|
||||||
|
{file = "astroid-2.4.2-py3-none-any.whl", hash = "sha256:bc58d83eb610252fd8de6363e39d4f1d0619c894b0ed24603b881c02e64c7386"},
|
||||||
|
{file = "astroid-2.4.2.tar.gz", hash = "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703"},
|
||||||
|
]
|
||||||
|
atomicwrites = [
|
||||||
|
{file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
|
||||||
|
{file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
|
||||||
|
]
|
||||||
|
attrs = [
|
||||||
|
{file = "attrs-20.2.0-py2.py3-none-any.whl", hash = "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc"},
|
||||||
|
{file = "attrs-20.2.0.tar.gz", hash = "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594"},
|
||||||
|
]
|
||||||
|
autopep8 = [
|
||||||
|
{file = "autopep8-1.5.4.tar.gz", hash = "sha256:d21d3901cb0da6ebd1e83fc9b0dfbde8b46afc2ede4fe32fbda0c7c6118ca094"},
|
||||||
|
]
|
||||||
|
colorama = [
|
||||||
|
{file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
|
||||||
|
{file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
|
||||||
|
]
|
||||||
|
future = [
|
||||||
|
{file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"},
|
||||||
|
]
|
||||||
|
isort = [
|
||||||
|
{file = "isort-5.6.4-py3-none-any.whl", hash = "sha256:dcab1d98b469a12a1a624ead220584391648790275560e1a43e54c5dceae65e7"},
|
||||||
|
{file = "isort-5.6.4.tar.gz", hash = "sha256:dcaeec1b5f0eca77faea2a35ab790b4f3680ff75590bfcb7145986905aab2f58"},
|
||||||
|
]
|
||||||
|
lazy-object-proxy = [
|
||||||
|
{file = "lazy-object-proxy-1.4.3.tar.gz", hash = "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp27-cp27m-macosx_10_13_x86_64.whl", hash = "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp27-cp27m-win32.whl", hash = "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp34-cp34m-win32.whl", hash = "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp34-cp34m-win_amd64.whl", hash = "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp38-cp38-win32.whl", hash = "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd"},
|
||||||
|
{file = "lazy_object_proxy-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239"},
|
||||||
|
]
|
||||||
|
macholib = [
|
||||||
|
{file = "macholib-1.14-py2.py3-none-any.whl", hash = "sha256:c500f02867515e6c60a27875b408920d18332ddf96b4035ef03beddd782d4281"},
|
||||||
|
{file = "macholib-1.14.tar.gz", hash = "sha256:0c436bc847e7b1d9bda0560351bf76d7caf930fb585a828d13608839ef42c432"},
|
||||||
|
]
|
||||||
|
mccabe = [
|
||||||
|
{file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
|
||||||
|
{file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
|
||||||
|
]
|
||||||
|
more-itertools = [
|
||||||
|
{file = "more-itertools-8.5.0.tar.gz", hash = "sha256:6f83822ae94818eae2612063a5101a7311e68ae8002005b5e05f03fd74a86a20"},
|
||||||
|
{file = "more_itertools-8.5.0-py3-none-any.whl", hash = "sha256:9b30f12df9393f0d28af9210ff8efe48d10c94f73e5daf886f10c4b0b0b4f03c"},
|
||||||
|
]
|
||||||
|
packaging = [
|
||||||
|
{file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"},
|
||||||
|
{file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"},
|
||||||
|
]
|
||||||
|
parse = [
|
||||||
|
{file = "parse-1.18.0.tar.gz", hash = "sha256:91666032d6723dc5905248417ef0dc9e4c51df9526aaeef271eacad6491f06a4"},
|
||||||
|
]
|
||||||
|
pefile = [
|
||||||
|
{file = "pefile-2019.4.18.tar.gz", hash = "sha256:a5d6e8305c6b210849b47a6174ddf9c452b2888340b8177874b862ba6c207645"},
|
||||||
|
]
|
||||||
|
pluggy = [
|
||||||
|
{file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
|
||||||
|
{file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
|
||||||
|
]
|
||||||
|
py = [
|
||||||
|
{file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"},
|
||||||
|
{file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"},
|
||||||
|
]
|
||||||
|
pycodestyle = [
|
||||||
|
{file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"},
|
||||||
|
{file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"},
|
||||||
|
]
|
||||||
|
pyinstaller = [
|
||||||
|
{file = "pyinstaller-4.0.tar.gz", hash = "sha256:970beb07115761d5e4ec317c1351b712fd90ae7f23994db914c633281f99bab0"},
|
||||||
|
]
|
||||||
|
pyinstaller-hooks-contrib = [
|
||||||
|
{file = "pyinstaller-hooks-contrib-2020.9.tar.gz", hash = "sha256:a5fd45a920012802e3f2089e1d3501ef2f49265dfea8fc46c3310f18e3326c91"},
|
||||||
|
{file = "pyinstaller_hooks_contrib-2020.9-py2.py3-none-any.whl", hash = "sha256:c382f3ac1a42b45cfecd581475c36db77da90e479b2f5bcb6d840d21fa545114"},
|
||||||
|
]
|
||||||
|
pylint = [
|
||||||
|
{file = "pylint-2.6.0-py3-none-any.whl", hash = "sha256:bfe68f020f8a0fece830a22dd4d5dddb4ecc6137db04face4c3420a46a52239f"},
|
||||||
|
{file = "pylint-2.6.0.tar.gz", hash = "sha256:bb4a908c9dadbc3aac18860550e870f58e1a02c9f2c204fdf5693d73be061210"},
|
||||||
|
]
|
||||||
|
pyparsing = [
|
||||||
|
{file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
|
||||||
|
{file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
|
||||||
|
]
|
||||||
|
pyqt5 = [
|
||||||
|
{file = "PyQt5-5.15.1-5.15.1-cp35.cp36.cp37.cp38.cp39-abi3-macosx_10_13_intel.whl", hash = "sha256:b9e7cc3ec69f80834f3f7507478c77e4d42411d5e9e557350e61b2660d12abc2"},
|
||||||
|
{file = "PyQt5-5.15.1-5.15.1-cp35.cp36.cp37.cp38.cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:b1ea7e82004dc7b311d1e29df2f276461016e2d180e10c73805ace4376125ed9"},
|
||||||
|
{file = "PyQt5-5.15.1-5.15.1-cp35.cp36.cp37.cp38.cp39-none-win32.whl", hash = "sha256:4e47021c2b8e89a3bc64247dfb224144e5c8d77e3ab44f3842d120aab6b3cbd4"},
|
||||||
|
{file = "PyQt5-5.15.1-5.15.1-cp35.cp36.cp37.cp38.cp39-none-win_amd64.whl", hash = "sha256:17a6d5258796bae16e447aa3efa00258425c09cf88ef68238762628a5dde7c6f"},
|
||||||
|
{file = "PyQt5-5.15.1.tar.gz", hash = "sha256:d9a76b850246d08da9863189ecb98f6c2aa9b4d97a3e85e29330a264aed0f9a1"},
|
||||||
|
]
|
||||||
|
pyqt5-sip = [
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:bb5a87b66fc1445915104ee97f7a20a69decb42f52803e3b0795fa17ff88226c"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a29e2ac399429d3b7738f73e9081e50783e61ac5d29344e0802d0dcd6056c5a2"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp35-cp35m-win32.whl", hash = "sha256:0304ca9114b9817a270f67f421355075b78ff9fc25ac58ffd72c2601109d2194"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp35-cp35m-win_amd64.whl", hash = "sha256:84ba7746762bd223bed22428e8561aa267a229c28344c2d28c5d5d3f8970cffb"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:7b81382ce188d63890a0e35abe0f9bb946cabc873a31873b73583b0fc84ac115"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b6d42250baec52a5f77de64e2951d001c5501c3a2df2179f625b241cbaec3369"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp36-cp36m-win32.whl", hash = "sha256:6c1ebee60f1d2b3c70aff866b7933d8d8d7646011f7c32f9321ee88c290aa4f9"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:34dcd29be47553d5f016ff86e89e24cbc5eebae92eb2f96fb32d2d7ba028c43c"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ed897c58acf4a3cdca61469daa31fe6e44c33c6c06a37c3f21fab31780b3b86a"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a1b8ef013086e224b8e86c93f880f776d01b59195bdfa2a8e0b23f0480678fec"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp37-cp37m-win32.whl", hash = "sha256:0cd969be528c27bbd4755bd323dff4a79a8fdda28215364e6ce3e069cb56c2a9"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c9800729badcb247765e4ffe2241549d02da1fa435b9db224845bc37c3e99cb0"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9312ec47cac4e33c11503bc1cbeeb0bdae619620472f38e2078c5a51020a930f"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2f35e82fd7ec1e1f6716e9154721c7594956a4f5bd4f826d8c6a6453833cc2f0"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp38-cp38-win32.whl", hash = "sha256:da9c9f1e65b9d09e73bd75befc82961b6b61b5a3b9d0a7c832168e1415f163c6"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:832fd60a264de4134c2824d393320838f3ab648180c9c357ec58a74524d24507"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c317ab1263e6417c498b81f5c970a9b1af7acefab1f80b4cc0f2f8e661f29fc5"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c9d6d448c29dc6606bb7974696608f81f4316c8234f7c7216396ed110075e777"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp39-cp39-win32.whl", hash = "sha256:5a011aeff89660622a6d5c3388d55a9d76932f3b82c95e82fc31abd8b1d2990d"},
|
||||||
|
{file = "PyQt5_sip-12.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:f168f0a7f32b81bfeffdf003c36f25d81c97dee5eb67072a5183e761fe250f13"},
|
||||||
|
{file = "PyQt5_sip-12.8.1.tar.gz", hash = "sha256:30e944db9abee9cc757aea16906d4198129558533eb7fadbe48c5da2bd18e0bd"},
|
||||||
|
]
|
||||||
|
pytest = [
|
||||||
|
{file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"},
|
||||||
|
{file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"},
|
||||||
|
]
|
||||||
|
python-slugify = [
|
||||||
|
{file = "python-slugify-4.0.1.tar.gz", hash = "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270"},
|
||||||
|
]
|
||||||
|
pywin32-ctypes = [
|
||||||
|
{file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"},
|
||||||
|
{file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"},
|
||||||
|
]
|
||||||
|
six = [
|
||||||
|
{file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
|
||||||
|
{file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
|
||||||
|
]
|
||||||
|
text-unidecode = [
|
||||||
|
{file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"},
|
||||||
|
{file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"},
|
||||||
|
]
|
||||||
|
toml = [
|
||||||
|
{file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"},
|
||||||
|
{file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"},
|
||||||
|
]
|
||||||
|
wcwidth = [
|
||||||
|
{file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
|
||||||
|
{file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"},
|
||||||
|
]
|
||||||
|
wrapt = [
|
||||||
|
{file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"},
|
||||||
|
]
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
[tool.poetry]
|
||||||
|
name = "SPEx"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = ""
|
||||||
|
authors = ["Emanuele <ema.trabattoni@gmail.com>"]
|
||||||
|
|
||||||
|
[tool.poetry.dependencies]
|
||||||
|
python = "^3.8"
|
||||||
|
PyQt5 = ">=5.15.0"
|
||||||
|
parse = "^1.18.0"
|
||||||
|
python-slugify = "^4.0.1"
|
||||||
|
|
||||||
|
[tool.poetry.dev-dependencies]
|
||||||
|
pytest = "^5.2"
|
||||||
|
pylint = "^2.6.0"
|
||||||
|
autopep8 = "^1.5.4"
|
||||||
|
pyinstaller = "^4.0"
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["poetry>=0.12"]
|
||||||
|
build-backend = "poetry.masonry.api"
|
||||||
@@ -3,10 +3,10 @@
|
|||||||
block_cipher = None
|
block_cipher = None
|
||||||
|
|
||||||
|
|
||||||
a = Analysis(['guimain.py'],
|
a = Analysis(['..\\spex\\guimain.py'],
|
||||||
pathex=['./libbananasplit', './UserInterface/compiledUI', 'D:\\Emanuele\\Documenti\\workspace\\bananaSPLIT\\bananaSPLIT'],
|
pathex=['./libbananasplit', './UserInterface/compiledUI', 'D:\\Emanuele\\Documenti\\VScode\\bananaSPLIT\\SPEx\\scripts'],
|
||||||
binaries=[],
|
binaries=[],
|
||||||
datas=[('C:\\Users\\Emanuele Trabattoni\\AppData\\Roaming\\Python\\Python37\\site-packages\\text_unidecode\\data.bin', '.\\text_unidecode')],
|
datas=[('..\\.venv\\Lib\\site-packages\\text_unidecode\\data.bin', '.\\text_unidecode')],
|
||||||
hiddenimports=[],
|
hiddenimports=[],
|
||||||
hookspath=[],
|
hookspath=[],
|
||||||
runtime_hooks=[],
|
runtime_hooks=[],
|
||||||
@@ -30,4 +30,4 @@ exe = EXE(pyz,
|
|||||||
upx=True,
|
upx=True,
|
||||||
upx_exclude=[],
|
upx_exclude=[],
|
||||||
runtime_tmpdir=None,
|
runtime_tmpdir=None,
|
||||||
console=False , icon='logo.ico')
|
console=False , icon='..\\spex\\logo.ico')
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
'''
|
||||||
|
Created on 24 nov 2019
|
||||||
|
|
||||||
|
@author: Emanuele Trabattoni
|
||||||
|
'''
|
||||||
|
import os, glob, subprocess
|
||||||
|
|
||||||
|
def updateInterfaces():
|
||||||
|
uifiles = glob.glob("*.ui")
|
||||||
|
for f in uifiles:
|
||||||
|
command = r"pyuic5.exe "+f
|
||||||
|
print(command)
|
||||||
|
rv = subprocess.run(command, capture_output=True)
|
||||||
|
if rv.returncode == 0:
|
||||||
|
fp = open(r".\\CompiledUI\\"+f.replace("ui","py"), 'w')
|
||||||
|
fp.write(str(rv.stdout, encoding='utf-8').replace('\r', ''))
|
||||||
|
fp.close()
|
||||||
|
else:
|
||||||
|
print("Command Failure")
|
||||||
|
|
||||||
|
def updateResources():
|
||||||
|
command = r'pyrcc5.exe '+'.\\resources\\resources.qrc'
|
||||||
|
print (command)
|
||||||
|
rv = subprocess.run(command, capture_output=True)
|
||||||
|
if rv.returncode == 0:
|
||||||
|
fp = open(r".\\compiledUI\\resources_rc.py", 'w')
|
||||||
|
fp.write(str(rv.stdout, encoding='utf-8').replace('\r', ''))
|
||||||
|
fp.close()
|
||||||
|
else:
|
||||||
|
print("Command Failure")
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print(os.getcwd())
|
||||||
|
os.chdir(r"..\spex\userInterface")
|
||||||
|
updateInterfaces()
|
||||||
|
updateResources()
|
||||||
|
pass
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
'''
|
||||||
|
Created on 30 mar 2020
|
||||||
|
|
||||||
|
@author: Emanuele Trabattoni
|
||||||
|
'''
|
||||||
|
import glob, docx2txt
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
fList = glob.iglob("../TestFiles/File nuovo formato/*.docx")
|
||||||
|
for f in fList:
|
||||||
|
#os.remove(f.replace('.docx', '.txt'))
|
||||||
|
print(f)
|
||||||
|
try:
|
||||||
|
txt=docx2txt.process(f)
|
||||||
|
with open(f.replace('.docx', '.txt'), 'wb') as fp:
|
||||||
|
fp.write(txt.encode('ansi'))
|
||||||
|
fp.close()
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
pass
|
||||||
|
pass
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
echo off
|
||||||
|
pyinstaller.exe --add-data="..\.venv\Lib\site-packages\text_unidecode\data.bin";.\text_unidecode ^
|
||||||
|
--icon="..\spex\logo.ico" ^
|
||||||
|
--paths ./libbananasplit --paths ./UserInterface/compiledUI ^
|
||||||
|
--name=SPEx.exe ^
|
||||||
|
--onefile ^
|
||||||
|
--windowed -y ^
|
||||||
|
..\spex\guimain.py | rem
|
||||||
|
echo "Copio i file di configurazione..."
|
||||||
|
robocopy /E ..\conf .\dist\conf
|
||||||
|
echo "Sposto la cartella con l'exe"
|
||||||
|
robocopy /E /MOVE .\dist ..\bin\
|
||||||
|
echo "Rimuovo la cartella di build"
|
||||||
|
rmdir /s /q .\build .\dist
|
||||||
|
echo on
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
'''
|
||||||
|
Created on 1 dic 2019
|
||||||
|
|
||||||
|
@author: Emanuele Trabattoni
|
||||||
|
'''
|
||||||
|
import json
|
||||||
|
from libsplit import bananaSPLITTER
|
||||||
|
from libfancylogger import fancyLogger
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
logger = fancyLogger(filepath=r"./conf/loggerconf.json",fileLog=False)
|
||||||
|
fp = open('./conf/conftest.json', 'r')
|
||||||
|
splitter = bananaSPLITTER(fileParams=json.load(fp), logger=logger)
|
||||||
|
fp.close()
|
||||||
|
splitter.run()
|
||||||
|
|
||||||
|
logger.info("\n"+"="*50+"\n\tFINITO!!!\n"+"="*50)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -5,14 +5,11 @@ Created on 10 apr 2020
|
|||||||
'''
|
'''
|
||||||
import os,glob
|
import os,glob
|
||||||
import subprocess
|
import subprocess
|
||||||
from bananaSPLIT.scripts.compileUI import updateResources
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
tsfiles = glob.glob("..\\UserInterface\\resources\\translations\\*.ts")
|
tsfiles = glob.glob("..\\UserInterface\\resources\\translations\\*.ts")
|
||||||
for ts in tsfiles:
|
for ts in tsfiles:
|
||||||
tso = "..\\UserInterface\\resources\\translations\\"+os.path.splitext((os.path.split(ts)[1]))[0]+".qm"
|
tso = "..\\SPEx\\userInterface\\resources\\translations\\"+os.path.splitext((os.path.split(ts)[1]))[0]+".qm"
|
||||||
subprocess.run(f'lrelease.exe {ts} -qm {tso}')
|
subprocess.run(f'lrelease.exe {ts} -qm {tso}')
|
||||||
os.chdir("..\\UserInterface")
|
os.chdir("..\\SPEx\\userInterface")
|
||||||
#print(os.getcwd())
|
|
||||||
#updateResources()
|
|
||||||
pass
|
pass
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
'''
|
||||||
|
Created on 10 apr 2020
|
||||||
|
|
||||||
|
@author: Emanuele Trabattoni
|
||||||
|
'''
|
||||||
|
import os,glob
|
||||||
|
import subprocess
|
||||||
|
langs = ["en"]
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
uifiles = glob.glob("..\\*\\*.ui", recursive=True)
|
||||||
|
pyfiles = ['..\\SPEx\\guimain.py','..\\SPEx\\libbananasplit\\libsplit.py','..\\SPEx\\libbananasplit\\libconfload.py']
|
||||||
|
for l in langs:
|
||||||
|
for ui in uifiles:
|
||||||
|
uio = "..\\SPEx\\userInterface\\resources\\translations\\"+os.path.splitext((os.path.split(ui)[1]))[0]+f"_{l}.ts"
|
||||||
|
subprocess.run(f'lupdate.exe {ui} -ts {uio}')
|
||||||
|
for py in pyfiles:
|
||||||
|
pyo = "..\\SPEx\\userInterface\\resources\\translations\\"+os.path.splitext((os.path.split(py)[1]))[0]+f"_{l}.ts"
|
||||||
|
print(subprocess.run(f'pylupdate5.exe {py} -ts {pyo}'))
|
||||||
|
pass
|
||||||
@@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
# Form implementation generated from reading ui file 'about.ui'
|
# Form implementation generated from reading ui file 'about.ui'
|
||||||
#
|
#
|
||||||
# Created by: PyQt5 UI code generator 5.12.1
|
# Created by: PyQt5 UI code generator 5.15.1
|
||||||
#
|
#
|
||||||
# WARNING! All changes made in this file will be lost!
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||||
|
# run again. Do not edit this file unless you know what you are doing.
|
||||||
|
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
@@ -61,6 +63,4 @@ class Ui_about(object):
|
|||||||
"<p align=\"center\" style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt;\">SPEx non e\' soggetto ad alcun tipo di licenza e viene distribuito senza alcuna garanzia.<br />Essendo un progetto "del tempo libero", bug e proposte di espansione verranno sicuramente presi in considerazione, anche se le tempistiche potrebbero variare.</span></p>\n"
|
"<p align=\"center\" style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt;\">SPEx non e\' soggetto ad alcun tipo di licenza e viene distribuito senza alcuna garanzia.<br />Essendo un progetto "del tempo libero", bug e proposte di espansione verranno sicuramente presi in considerazione, anche se le tempistiche potrebbero variare.</span></p>\n"
|
||||||
"<p align=\"center\" style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:12pt;\">Contatti:</span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:7pt;\"><br /></span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt;\">12parsec.software@gmail.com</span></p>\n"
|
"<p align=\"center\" style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:12pt;\">Contatti:</span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:7pt;\"><br /></span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt;\">12parsec.software@gmail.com</span></p>\n"
|
||||||
"<p align=\"center\" style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:12pt;\">Download:<br /></span><a href=\"https://drive.google.com/open?id=10zUm7uHk9st36PVotMwh9wqOeXU3xrr8\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:7pt; text-decoration: underline; color:#0000ff;\">https://drive.google.com/open?id=10zUm7uHk9st36PVotMwh9wqOeXU3xrr8</span></a></p></body></html>"))
|
"<p align=\"center\" style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:12pt;\">Download:<br /></span><a href=\"https://drive.google.com/open?id=10zUm7uHk9st36PVotMwh9wqOeXU3xrr8\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:7pt; text-decoration: underline; color:#0000ff;\">https://drive.google.com/open?id=10zUm7uHk9st36PVotMwh9wqOeXU3xrr8</span></a></p></body></html>"))
|
||||||
|
|
||||||
|
|
||||||
import resources_rc
|
import resources_rc
|
||||||
@@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
# Form implementation generated from reading ui file 'advopt.ui'
|
# Form implementation generated from reading ui file 'advopt.ui'
|
||||||
#
|
#
|
||||||
# Created by: PyQt5 UI code generator 5.12.1
|
# Created by: PyQt5 UI code generator 5.15.1
|
||||||
#
|
#
|
||||||
# WARNING! All changes made in this file will be lost!
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||||
|
# run again. Do not edit this file unless you know what you are doing.
|
||||||
|
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
@@ -69,6 +71,4 @@ class Ui_editconf(object):
|
|||||||
self.label_2.setText(_translate("editconf", "Da grandi poteri derivano grandi responsabilita\'"))
|
self.label_2.setText(_translate("editconf", "Da grandi poteri derivano grandi responsabilita\'"))
|
||||||
self.btn_cancel.setText(_translate("editconf", "Cancel"))
|
self.btn_cancel.setText(_translate("editconf", "Cancel"))
|
||||||
self.btn_ok.setText(_translate("editconf", "OK"))
|
self.btn_ok.setText(_translate("editconf", "OK"))
|
||||||
|
|
||||||
|
|
||||||
import resources_rc
|
import resources_rc
|
||||||
@@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
# Form implementation generated from reading ui file 'avanzatetitolo3.ui'
|
# Form implementation generated from reading ui file 'avanzatetitolo3.ui'
|
||||||
#
|
#
|
||||||
# Created by: PyQt5 UI code generator 5.12.1
|
# Created by: PyQt5 UI code generator 5.15.1
|
||||||
#
|
#
|
||||||
# WARNING! All changes made in this file will be lost!
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||||
|
# run again. Do not edit this file unless you know what you are doing.
|
||||||
|
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
@@ -155,6 +157,4 @@ class Ui_advtitolo3(object):
|
|||||||
self.btn_annulla.setText(_translate("advtitolo3", "Annulla"))
|
self.btn_annulla.setText(_translate("advtitolo3", "Annulla"))
|
||||||
self.btn_OK.setText(_translate("advtitolo3", "OK"))
|
self.btn_OK.setText(_translate("advtitolo3", "OK"))
|
||||||
self.label_2.setText(_translate("advtitolo3", "Suffisso Titolo"))
|
self.label_2.setText(_translate("advtitolo3", "Suffisso Titolo"))
|
||||||
|
|
||||||
|
|
||||||
import resources_rc
|
import resources_rc
|
||||||
@@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
# Form implementation generated from reading ui file 'mainwindow.ui'
|
# Form implementation generated from reading ui file 'mainwindow.ui'
|
||||||
#
|
#
|
||||||
# Created by: PyQt5 UI code generator 5.12.1
|
# Created by: PyQt5 UI code generator 5.15.1
|
||||||
#
|
#
|
||||||
# WARNING! All changes made in this file will be lost!
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||||
|
# run again. Do not edit this file unless you know what you are doing.
|
||||||
|
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
@@ -309,6 +311,4 @@ class Ui_mainwin(object):
|
|||||||
self.actionAvanzate.setText(_translate("mainwin", "Avanzate"))
|
self.actionAvanzate.setText(_translate("mainwin", "Avanzate"))
|
||||||
self.actionManuale.setText(_translate("mainwin", "Manuale"))
|
self.actionManuale.setText(_translate("mainwin", "Manuale"))
|
||||||
self.actionAbout_SPEx.setText(_translate("mainwin", "About SPEx"))
|
self.actionAbout_SPEx.setText(_translate("mainwin", "About SPEx"))
|
||||||
|
|
||||||
|
|
||||||
import resources_rc
|
import resources_rc
|
||||||
@@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
# Form implementation generated from reading ui file 'selezout.ui'
|
# Form implementation generated from reading ui file 'selezout.ui'
|
||||||
#
|
#
|
||||||
# Created by: PyQt5 UI code generator 5.12.1
|
# Created by: PyQt5 UI code generator 5.15.1
|
||||||
#
|
#
|
||||||
# WARNING! All changes made in this file will be lost!
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||||
|
# run again. Do not edit this file unless you know what you are doing.
|
||||||
|
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
@@ -217,6 +219,4 @@ class Ui_selezout(object):
|
|||||||
self.label.setText(_translate("selezout", "Caratteri speciali da rimuovere "))
|
self.label.setText(_translate("selezout", "Caratteri speciali da rimuovere "))
|
||||||
self.btn_indietro.setText(_translate("selezout", "Indietro"))
|
self.btn_indietro.setText(_translate("selezout", "Indietro"))
|
||||||
self.btn_split.setText(_translate("selezout", "SPLITTA!"))
|
self.btn_split.setText(_translate("selezout", "SPLITTA!"))
|
||||||
|
|
||||||
|
|
||||||
import resources_rc
|
import resources_rc
|
||||||
@@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
# Form implementation generated from reading ui file 'titolow.ui'
|
# Form implementation generated from reading ui file 'titolow.ui'
|
||||||
#
|
#
|
||||||
# Created by: PyQt5 UI code generator 5.12.1
|
# Created by: PyQt5 UI code generator 5.15.1
|
||||||
#
|
#
|
||||||
# WARNING! All changes made in this file will be lost!
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||||
|
# run again. Do not edit this file unless you know what you are doing.
|
||||||
|
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
@@ -335,6 +337,4 @@ class Ui_titolo(object):
|
|||||||
self.rad_altro.setText(_translate("titolo", "Altro:"))
|
self.rad_altro.setText(_translate("titolo", "Altro:"))
|
||||||
self.label.setText(_translate("titolo", "Separatore"))
|
self.label.setText(_translate("titolo", "Separatore"))
|
||||||
self.chk_docnum.setText(_translate("titolo", "Numero documento"))
|
self.chk_docnum.setText(_translate("titolo", "Numero documento"))
|
||||||
|
|
||||||
|
|
||||||
import resources_rc
|
import resources_rc
|
||||||
|
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 584 B After Width: | Height: | Size: 584 B |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 645 B After Width: | Height: | Size: 645 B |
|
Before Width: | Height: | Size: 957 B After Width: | Height: | Size: 957 B |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 862 B After Width: | Height: | Size: 862 B |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
@@ -0,0 +1 @@
|
|||||||
|
__version__ = '0.1.0'
|
||||||
@@ -0,0 +1,660 @@
|
|||||||
|
'''
|
||||||
|
Created on 2 nov 2019
|
||||||
|
|
||||||
|
@author: Emanuele Trabattoni
|
||||||
|
TODO LIST
|
||||||
|
1. rendere threaded lo splitter.. tentativo colore 100..
|
||||||
|
|
||||||
|
'''
|
||||||
|
import sys
|
||||||
|
import copy
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
|
from mainwindow import Ui_mainwin
|
||||||
|
from selezout import Ui_selezout
|
||||||
|
from titolow import Ui_titolo
|
||||||
|
from avanzatetitolo3 import Ui_advtitolo3 as Ui_advtitolo
|
||||||
|
from advopt import Ui_editconf
|
||||||
|
from about import Ui_about
|
||||||
|
|
||||||
|
from libfancylogger import fancyLogger
|
||||||
|
from libconfload import bananaCONF
|
||||||
|
from libsplit import bananaSPLITTER
|
||||||
|
|
||||||
|
import PyQt5.QtGui
|
||||||
|
from PyQt5.QtCore import QDir, QSize, QTranslator, pyqtSlot, pyqtSignal
|
||||||
|
from PyQt5.QtWidgets import QMessageBox, QSizePolicy, QInputDialog
|
||||||
|
|
||||||
|
#modo brutto per mettere la lista delle lingue in un posto solo
|
||||||
|
langlist = ['it', 'en']
|
||||||
|
|
||||||
|
|
||||||
|
class bananaMain(PyQt5.QtWidgets.QMainWindow):
|
||||||
|
def __init__(self, logger=None, confloader=None):
|
||||||
|
PyQt5.QtWidgets.QMainWindow.__init__(self)
|
||||||
|
self.logger = logger
|
||||||
|
self.conf = confloader
|
||||||
|
# inizializzazione interfaccia
|
||||||
|
self.ui = Ui_mainwin()
|
||||||
|
self.ui.setupUi(self)
|
||||||
|
self.titolo = bananaTitolo(self.conf, self.logger)
|
||||||
|
self.titoloav = bananaTitoloAvanzate(self.conf, self.logger)
|
||||||
|
self.selezout = bananaSelezOut(self.conf, self.logger)
|
||||||
|
self.advopt = bananaAdvOpt(self.conf, self.logger)
|
||||||
|
#popola le tab con le finestre giuste
|
||||||
|
self.ui.wgt_main.addTab(self.titolo, self.tr("Impostazioni Titolo"))
|
||||||
|
self.ui.wgt_main.addTab(self.selezout, self.tr("Selezione Output"))
|
||||||
|
# connetti bottoni avanti
|
||||||
|
self.ui.btn_avanti.clicked.connect(self.nextTab)
|
||||||
|
self.titolo.titoloui.btn_avanti.clicked.connect(self.nextTab)
|
||||||
|
#connetti bottoni indietro
|
||||||
|
self.titolo.titoloui.btn_indietro.clicked.connect(self.prevTab)
|
||||||
|
self.selezout.selezoutui.btn_indietro.clicked.connect(self.prevTab)
|
||||||
|
#connetti bottoni selezione cartelle
|
||||||
|
self.ui.btn_cartellasorg.clicked.connect(self.selezSorg)
|
||||||
|
self.ui.btn_cartelladest.clicked.connect(self.selezDest)
|
||||||
|
#connetti action tab
|
||||||
|
self.ui.actionLingua.triggered.connect(self.openLanguage)
|
||||||
|
self.ui.actionAvanzate.triggered.connect(self.openAdvOpt)
|
||||||
|
self.ui.actionCarica_Preset.triggered.connect(self.openLoadPreset)
|
||||||
|
self.ui.actionSalva_Preset.triggered.connect(self.openSavePreset)
|
||||||
|
self.ui.actionAbout_SPEx.triggered.connect(self.openAbout)
|
||||||
|
#connetti i radbutton versione
|
||||||
|
self.ui.rad_fileNew.clicked.connect(self.selezVers)
|
||||||
|
self.ui.rad_fileOld.clicked.connect(self.selezVers)
|
||||||
|
#connetti segnali delle sottointerfacce
|
||||||
|
self.advopt.update.connect(self.fillAllInterfaces)
|
||||||
|
self.logger.sendLog.connect(self.appendLog)
|
||||||
|
#riempi pagine di interfaccia
|
||||||
|
self.fillAllInterfaces()
|
||||||
|
self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
|
||||||
|
self.setFixedSize(QSize(self.conf.getParam(
|
||||||
|
'settings', 'winW'), self.conf.getParam('settings', 'winH')))
|
||||||
|
|
||||||
|
def fillInterface(self):
|
||||||
|
#pagina principale
|
||||||
|
try:
|
||||||
|
self.ui.lbl_preset.setText(self.conf.inUse.replace('.json', ''))
|
||||||
|
self.ui.lbl_sorg.setText(self.conf.getParam('paths', 'INworkPath'))
|
||||||
|
self.ui.lbl_dest.setText(self.conf.getParam('paths', 'OUTworkPath'))
|
||||||
|
self.ui.rad_fileNew.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'fileVersNew'))
|
||||||
|
self.ui.rad_fileOld.setChecked(
|
||||||
|
not self.conf.getParam('docStruct', 'fileVersNew'))
|
||||||
|
self.fillFileList()
|
||||||
|
except:
|
||||||
|
self.log.critical(self.tr("MainWindow: Configurazione non accettata"))
|
||||||
|
|
||||||
|
def fillAllInterfaces(self):
|
||||||
|
self.fillInterface()
|
||||||
|
self.titolo.fillInterface()
|
||||||
|
self.titoloav.fillInterface()
|
||||||
|
self.selezout.fillInterface()
|
||||||
|
self.advopt.fillInterface()
|
||||||
|
|
||||||
|
def fillFileList(self):
|
||||||
|
fl = QDir(self.conf.getParam('paths', 'INworkPath'))
|
||||||
|
fl.setNameFilters(['*.txt', '*.TXT'])
|
||||||
|
fl = fl.entryList(QDir.NoDotAndDotDot | QDir.Files)
|
||||||
|
self.ui.lst_files.clear()
|
||||||
|
for f in fl:
|
||||||
|
self.ui.lst_files.addItem(PyQt5.QtWidgets.QListWidgetItem(f))
|
||||||
|
self.conf.setParam(('paths', 'fileList'), fl)
|
||||||
|
|
||||||
|
def nextTab(self):
|
||||||
|
self.ui.wgt_main.setCurrentIndex(self.ui.wgt_main.currentIndex()+1)
|
||||||
|
self.logger.debug(self.tr("Prossima Tab"))
|
||||||
|
|
||||||
|
def prevTab(self):
|
||||||
|
self.ui.wgt_main.setCurrentIndex(self.ui.wgt_main.currentIndex()-1)
|
||||||
|
self.logger.debug(self.tr("Tab Precedente"))
|
||||||
|
|
||||||
|
def openLoadPreset(self):
|
||||||
|
self.logger.debug(self.tr("Apri Carica Preset"))
|
||||||
|
lf = PyQt5.QtWidgets.QFileDialog(self, self.tr(
|
||||||
|
"Carica Preset"), self.conf.getParam('paths', 'configurationPath'))
|
||||||
|
lf.setAcceptMode(PyQt5.QtWidgets.QFileDialog.AcceptOpen)
|
||||||
|
lf.setFileMode(PyQt5.QtWidgets.QFileDialog.ExistingFile)
|
||||||
|
lf.setNameFilter("bananaCONF (*.json)")
|
||||||
|
if lf.exec():
|
||||||
|
cf = str(lf.selectedFiles()[0].split('/')[-1])
|
||||||
|
self.logger.info(self.tr(f"Apro la configurazione: {cf}"))
|
||||||
|
self.conf.open()
|
||||||
|
self.conf.use(cf)
|
||||||
|
self.logger.debug(self.tr("Riempio tutte le tab"))
|
||||||
|
self.fillAllInterfaces()
|
||||||
|
|
||||||
|
def openSavePreset(self):
|
||||||
|
self.logger.debug(self.tr("Apri Salva Preset"))
|
||||||
|
self.applicaTutto()
|
||||||
|
sf = PyQt5.QtWidgets.QFileDialog(
|
||||||
|
self, "Salva Preset", self.conf.getParam('paths', 'configurationPath'))
|
||||||
|
sf.setAcceptMode(PyQt5.QtWidgets.QFileDialog.AcceptSave)
|
||||||
|
sf.setNameFilter("bananaCONF (*.json)")
|
||||||
|
if sf.exec():
|
||||||
|
rv = str(sf.selectedFiles()[0].split('/')[-1])
|
||||||
|
self.conf.setParam(('paths', 'lastUsed'), rv)
|
||||||
|
#scrivi quale file e' stato usato per ultimo nel default
|
||||||
|
prev = self.conf.inUse
|
||||||
|
self.conf.use("defaults.json")
|
||||||
|
self.conf.setParam(('paths', 'lastUsed'), rv)
|
||||||
|
self.conf.save(fName="defaults.json")
|
||||||
|
self.conf.use(prev)
|
||||||
|
##
|
||||||
|
self.logger.debug(self.tr(f"Scrivo la configurazione: {rv}"))
|
||||||
|
self.conf.save(fName=rv)
|
||||||
|
|
||||||
|
def openAdvOpt(self):
|
||||||
|
self.logger.debug(self.tr("Apri Opzioni Avanzate"))
|
||||||
|
self.advopt.fillInterface()
|
||||||
|
self.advopt.show()
|
||||||
|
|
||||||
|
def openLanguage(self):
|
||||||
|
global langlist
|
||||||
|
self.logger.debug(self.tr("Apri Opzioni Lingua"))
|
||||||
|
flag = False
|
||||||
|
lang, flag = QInputDialog.getItem(self, self.tr(
|
||||||
|
"Lingua"), self.tr("Disponibili"), langlist, 0, False)
|
||||||
|
if flag:
|
||||||
|
self.conf.setParam(('settings', 'uiLang'), lang)
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def openAbout(self):
|
||||||
|
self.logger.debug(self.tr("Apri Finestra About"))
|
||||||
|
self.spxabt = spexAbout(confloader=self.conf)
|
||||||
|
|
||||||
|
def selezSorg(self):
|
||||||
|
rv = PyQt5.QtWidgets.QFileDialog.getExistingDirectory(self, self.tr(
|
||||||
|
"Seleziona Cartella Sorgente"), self.conf.getParam('paths', 'INworkPath'))
|
||||||
|
if rv != "":
|
||||||
|
self.conf.setParam(keys=('paths', 'INworkPath',), val=rv+"/")
|
||||||
|
self.ui.lbl_sorg.setText(rv)
|
||||||
|
self.logger.info(
|
||||||
|
self.tr("Selezionata Cartella Sorgente: {}").format(rv+"/"))
|
||||||
|
self.fillFileList()
|
||||||
|
|
||||||
|
def selezDest(self):
|
||||||
|
rv = PyQt5.QtWidgets.QFileDialog.getExistingDirectory(self, self.tr(
|
||||||
|
"Seleziona Cartella Destinazione"), self.conf.getParam('paths', 'OUTworkPath'))
|
||||||
|
if rv != "":
|
||||||
|
self.conf.setParam(keys=('paths', 'OUTworkPath',), val=rv+"/")
|
||||||
|
self.ui.lbl_dest.setText(rv)
|
||||||
|
self.logger.info(
|
||||||
|
self.tr("Selezionata Cartella Destinazione: {}").format(rv+"/"))
|
||||||
|
|
||||||
|
def selezVers(self):
|
||||||
|
self.conf.setParam(('docStruct', 'fileVersNew'),
|
||||||
|
self.ui.rad_fileNew.isChecked())
|
||||||
|
self.logger.debug(self.tr(f"Selezionata Versione File"))
|
||||||
|
|
||||||
|
def openFileDialog(self, name, path):
|
||||||
|
self.log.debug(self.tr("Apro in directory: {}").format(path))
|
||||||
|
return
|
||||||
|
|
||||||
|
def applicaTutto(self):
|
||||||
|
self.titolo.applica()
|
||||||
|
self.selezout.applica()
|
||||||
|
|
||||||
|
def appendLog(self, msg):
|
||||||
|
self.ui.txt_log.append(msg)
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
####################### INTERFACES ##########################
|
||||||
|
#############################################################
|
||||||
|
|
||||||
|
|
||||||
|
class bananaTitolo(PyQt5.QtWidgets.QWidget):
|
||||||
|
def __init__(self, confloader=None, logger=None):
|
||||||
|
PyQt5.QtWidgets.QWidget.__init__(self)
|
||||||
|
self.titoloui = Ui_titolo()
|
||||||
|
self.titoloui.setupUi(self)
|
||||||
|
self.conf = confloader
|
||||||
|
self.log = logger
|
||||||
|
if self.conf is not None:
|
||||||
|
self.titoloui.btn_avanzate.clicked.connect(self.spawnAvanzate)
|
||||||
|
self.titoloui.btn_avanti.clicked.connect(self.applica)
|
||||||
|
self.advtitolo = bananaTitoloAvanzate(confloader, self.log)
|
||||||
|
self.fillInterface()
|
||||||
|
|
||||||
|
def fillInterface(self):
|
||||||
|
try:
|
||||||
|
# imposta predefiniti interfaccia da file
|
||||||
|
#Data (la piu complicata)
|
||||||
|
self.titoloui.chk_data.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'outDate'))
|
||||||
|
self.titoloui.rad_datajpn.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'outDateType') == 'jpn')
|
||||||
|
self.titoloui.rad_dataita.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'outDateType') == 'it')
|
||||||
|
self.titoloui.rad_datausa.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'outDateType') == 'usa')
|
||||||
|
#Titolo
|
||||||
|
self.titoloui.chk_titolo.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'outTitle'))
|
||||||
|
self.titoloui.spn_ncarat.setValue(
|
||||||
|
self.conf.getParam('docStruct', 'maxTitleLen'))
|
||||||
|
#Numero Documento
|
||||||
|
self.titoloui.chk_docnum.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'outNumber'))
|
||||||
|
#Separatore
|
||||||
|
found = False
|
||||||
|
for itmn in range(self.titoloui.lyt_sep.count()):
|
||||||
|
itm = self.titoloui.lyt_sep.itemAt(itmn).widget()
|
||||||
|
if isinstance(itm, PyQt5.QtWidgets.QRadioButton):
|
||||||
|
if itm.text() == self.conf.getParam('docStruct', 'outNameSep'):
|
||||||
|
itm.setChecked(True)
|
||||||
|
found = True
|
||||||
|
if not found:
|
||||||
|
self.titoloui.rad_altro.setChecked(True)
|
||||||
|
self.titoloui.lin_altro.setText(
|
||||||
|
self.conf.getParam('docStruct', 'customSep'))
|
||||||
|
#finestra avanzate
|
||||||
|
self.advtitolo.fillInterface()
|
||||||
|
except:
|
||||||
|
self.log.critical(self.tr("Titolo: Configurazione non accettata"))
|
||||||
|
|
||||||
|
def spawnAvanzate(self):
|
||||||
|
self.log.debug(self.tr("Mostro la finestra avanzate titolo"))
|
||||||
|
self.advtitolo.show()
|
||||||
|
|
||||||
|
def applica(self):
|
||||||
|
self.log.info(self.tr("Applico impostazioni Titolo"))
|
||||||
|
self.conf.setParam(('docStruct', 'outDate'),
|
||||||
|
self.titoloui.chk_data.isChecked())
|
||||||
|
self.conf.setParam(('docStruct', 'outNumber'),
|
||||||
|
self.titoloui.chk_docnum.isChecked())
|
||||||
|
self.conf.setParam(('docStruct', 'outTitle'),
|
||||||
|
self.titoloui.chk_titolo.isChecked())
|
||||||
|
if self.titoloui.rad_dataita.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'outDateType'), 'ita')
|
||||||
|
elif self.titoloui.rad_datajpn.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'outDateType'), 'jpn')
|
||||||
|
elif self.titoloui.rad_datausa.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'outDateType'), 'usa')
|
||||||
|
self.conf.setParam(('docStruct', 'maxTitleLen'),
|
||||||
|
self.titoloui.spn_ncarat.value())
|
||||||
|
self.conf.setParam(('docStruct', 'customSep'),
|
||||||
|
self.titoloui.lin_altro.text())
|
||||||
|
for itmn in range(self.titoloui.lyt_sep.count()):
|
||||||
|
itm = self.titoloui.lyt_sep.itemAt(itmn).widget()
|
||||||
|
if isinstance(itm, PyQt5.QtWidgets.QRadioButton):
|
||||||
|
if len(itm.text()) == 1 and itm.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'outNameSep'), itm.text())
|
||||||
|
self.advtitolo.applica()
|
||||||
|
|
||||||
|
|
||||||
|
class bananaTitoloAvanzate(PyQt5.QtWidgets.QWidget):
|
||||||
|
def __init__(self, confloader=None, logger=None):
|
||||||
|
PyQt5.QtWidgets.QWidget.__init__(self)
|
||||||
|
self.titoloavui = Ui_advtitolo()
|
||||||
|
self.titoloavui.setupUi(self)
|
||||||
|
self.titoloavui.btn_OK.clicked.connect(self.returnOk)
|
||||||
|
self.titoloavui.btn_annulla.clicked.connect(self.returnKo)
|
||||||
|
|
||||||
|
self.titoloavui.rad_dataprimo.clicked.connect(self.gestisciBottoni)
|
||||||
|
self.titoloavui.rad_datasecondo.clicked.connect(self.gestisciBottoni)
|
||||||
|
self.titoloavui.rad_dataterzo.clicked.connect(self.gestisciBottoni)
|
||||||
|
self.titoloavui.rad_numeroprimo.clicked.connect(self.gestisciBottoni)
|
||||||
|
self.titoloavui.rad_numerosecondo.clicked.connect(self.gestisciBottoni)
|
||||||
|
self.titoloavui.rad_numeroterzo.clicked.connect(self.gestisciBottoni)
|
||||||
|
self.titoloavui.rad_titoloprimo.clicked.connect(self.gestisciBottoni)
|
||||||
|
self.titoloavui.rad_titolosecondo.clicked.connect(self.gestisciBottoni)
|
||||||
|
self.titoloavui.rad_titoloterzo.clicked.connect(self.gestisciBottoni)
|
||||||
|
self.conf = confloader
|
||||||
|
self.log = logger
|
||||||
|
self.fillInterface()
|
||||||
|
|
||||||
|
def fillInterface(self):
|
||||||
|
try:
|
||||||
|
#rimepi interfaccia
|
||||||
|
self.titoloavui.rad_dataprimo.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'datePos') == 1)
|
||||||
|
self.titoloavui.rad_datasecondo.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'datePos') == 2)
|
||||||
|
self.titoloavui.rad_dataterzo.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'datePos') == 3)
|
||||||
|
self.titoloavui.rad_titoloprimo.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'titlePos') == 1)
|
||||||
|
self.titoloavui.rad_titolosecondo.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'titlePos') == 2)
|
||||||
|
self.titoloavui.rad_titoloterzo.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'titlePos') == 3)
|
||||||
|
self.titoloavui.rad_numeroprimo.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'numberPos') == 1)
|
||||||
|
self.titoloavui.rad_numerosecondo.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'numberPos') == 2)
|
||||||
|
self.titoloavui.rad_numeroterzo.setChecked(
|
||||||
|
self.conf.getParam('docStruct', 'numberPos') == 3)
|
||||||
|
self.titoloavui.txt_prefisso.setText(
|
||||||
|
self.conf.getParam('docStruct', 'outPrefix'))
|
||||||
|
self.titoloavui.txt_suffisso.setText(
|
||||||
|
self.conf.getParam('docStruct', 'outSuffix'))
|
||||||
|
except:
|
||||||
|
self.log.critical(self.tr("AvanzateTitolo: Configurazione non accettata"))
|
||||||
|
|
||||||
|
def gestisciBottoni(self):
|
||||||
|
#PRIMO
|
||||||
|
if self.titoloavui.rad_numeroprimo.isChecked():
|
||||||
|
self.titoloavui.rad_dataprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titoloprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_numerosecondo.setChecked(False)
|
||||||
|
self.titoloavui.rad_numeroterzo.setChecked(False)
|
||||||
|
if self.titoloavui.rad_dataprimo.isChecked():
|
||||||
|
self.titoloavui.rad_numeroprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titoloprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_datasecondo.setChecked(False)
|
||||||
|
self.titoloavui.rad_dataterzo.setChecked(False)
|
||||||
|
if self.titoloavui.rad_titoloprimo.isChecked():
|
||||||
|
self.titoloavui.rad_numeroprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_dataprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titolosecondo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titoloterzo.setChecked(False)
|
||||||
|
#secondo
|
||||||
|
if self.titoloavui.rad_numerosecondo.isChecked():
|
||||||
|
self.titoloavui.rad_datasecondo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titolosecondo.setChecked(False)
|
||||||
|
self.titoloavui.rad_numeroprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_numeroterzo.setChecked(False)
|
||||||
|
if self.titoloavui.rad_datasecondo.isChecked():
|
||||||
|
self.titoloavui.rad_numerosecondo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titolosecondo.setChecked(False)
|
||||||
|
self.titoloavui.rad_dataprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_dataterzo.setChecked(False)
|
||||||
|
if self.titoloavui.rad_titolosecondo.isChecked():
|
||||||
|
self.titoloavui.rad_numerosecondo.setChecked(False)
|
||||||
|
self.titoloavui.rad_datasecondo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titoloprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titoloterzo.setChecked(False)
|
||||||
|
#terzo
|
||||||
|
if self.titoloavui.rad_numeroterzo.isChecked():
|
||||||
|
self.titoloavui.rad_dataterzo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titoloterzo.setChecked(False)
|
||||||
|
self.titoloavui.rad_numeroprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_numerosecondo.setChecked(False)
|
||||||
|
if self.titoloavui.rad_dataterzo.isChecked():
|
||||||
|
self.titoloavui.rad_numeroterzo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titoloterzo.setChecked(False)
|
||||||
|
self.titoloavui.rad_dataprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_datasecondo.setChecked(False)
|
||||||
|
if self.titoloavui.rad_titoloterzo.isChecked():
|
||||||
|
self.titoloavui.rad_numeroterzo.setChecked(False)
|
||||||
|
self.titoloavui.rad_dataterzo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titoloprimo.setChecked(False)
|
||||||
|
self.titoloavui.rad_titolosecondo.setChecked(False)
|
||||||
|
|
||||||
|
def returnOk(self):
|
||||||
|
self.log.info(self.tr("Avanzate Titolo Accettate"))
|
||||||
|
self.applica()
|
||||||
|
self.hide()
|
||||||
|
|
||||||
|
def returnKo(self):
|
||||||
|
self.log.info(self.tr("Avanzate Titolo Rifiutate"))
|
||||||
|
self.hide()
|
||||||
|
|
||||||
|
def applica(self):
|
||||||
|
#data
|
||||||
|
if self.titoloavui.rad_dataprimo.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'datePos'), 1)
|
||||||
|
elif self.titoloavui.rad_datasecondo.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'datePos'), 2)
|
||||||
|
elif self.titoloavui.rad_dataterzo.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'datePos'), 3)
|
||||||
|
else:
|
||||||
|
self.conf.setParam(('docStruct', 'datePos'), -1)
|
||||||
|
#numero
|
||||||
|
if self.titoloavui.rad_numeroprimo.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'numberPos'), 1)
|
||||||
|
elif self.titoloavui.rad_numerosecondo.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'numberPos'), 2)
|
||||||
|
elif self.titoloavui.rad_numeroterzo.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'numberPos'), 3)
|
||||||
|
else:
|
||||||
|
self.conf.setParam(('docStruct', 'numberPos'), -1)
|
||||||
|
#titolo
|
||||||
|
if self.titoloavui.rad_titoloprimo.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'titlePos'), 1)
|
||||||
|
elif self.titoloavui.rad_titolosecondo.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'titlePos'), 2)
|
||||||
|
elif self.titoloavui.rad_titoloterzo.isChecked():
|
||||||
|
self.conf.setParam(('docStruct', 'titlePos'), 3)
|
||||||
|
else:
|
||||||
|
self.conf.setParam(('docStruct', 'titlePos'), -1)
|
||||||
|
#prefisso e suffisso
|
||||||
|
self.conf.setParam(('docStruct', 'outPrefix'),
|
||||||
|
self.titoloavui.txt_prefisso.text())
|
||||||
|
self.conf.setParam(('docStruct', 'outSuffix'),
|
||||||
|
self.titoloavui.txt_suffisso.text())
|
||||||
|
|
||||||
|
|
||||||
|
class bananaSelezOut(PyQt5.QtWidgets.QWidget):
|
||||||
|
def __init__(self, confloader=None, logger=None):
|
||||||
|
PyQt5.QtWidgets.QWidget.__init__(self)
|
||||||
|
self.selezoutui = Ui_selezout()
|
||||||
|
self.selezoutui.setupUi(self)
|
||||||
|
self.conf = confloader
|
||||||
|
self.log = logger
|
||||||
|
if self.conf is not None:
|
||||||
|
self.selezoutui.btn_split.clicked.connect(self.applica)
|
||||||
|
self.selezoutui.btn_split.clicked.connect(self.splitta)
|
||||||
|
self.fillInterface()
|
||||||
|
|
||||||
|
def fillInterface(self):
|
||||||
|
try:
|
||||||
|
self.selezoutui.cmb_lingua.clear()
|
||||||
|
self.selezoutui.cmb_lingua.addItems(
|
||||||
|
self.conf.settingsList['languageconf.json'].keys())
|
||||||
|
self.selezoutui.cmb_lingua.setCurrentIndex(
|
||||||
|
self.conf.getParam('docStruct', 'languageIdx'))
|
||||||
|
self.selezoutui.rad_mainbodyEFile.setChecked(self.conf.getParam(
|
||||||
|
'settings', 'saveBodyFile') and self.conf.getParam('settings', 'saveSeparateFiles'))
|
||||||
|
self.selezoutui.rad_file.setChecked(self.conf.getParam(
|
||||||
|
'settings', 'saveSeparateFiles') and not self.conf.getParam('settings', 'saveBodyFile'))
|
||||||
|
self.selezoutui.rad_mainbody.setChecked(self.conf.getParam(
|
||||||
|
'settings', 'saveBodyFile') and not self.conf.getParam('settings', 'saveSeparateFiles'))
|
||||||
|
self.selezoutui.chk_removeDuplicates.setChecked(
|
||||||
|
self.conf.getParam('settings', 'removeDuplicates'))
|
||||||
|
self.selezoutui.chk_includeTitle.setChecked(
|
||||||
|
self.conf.getParam('settings', 'includeTitle'))
|
||||||
|
self.selezoutui.chk_removeBreakWord.setChecked(
|
||||||
|
self.conf.getParam('settings', 'delWordBreak'))
|
||||||
|
self.selezoutui.chk_cleaDestFolder.setChecked(
|
||||||
|
self.conf.getParam('settings', 'removeOldFiles'))
|
||||||
|
self.selezoutui.lin_specialChars.setText(
|
||||||
|
''.join(self.conf.getParam('settings', 'delChars')))
|
||||||
|
except:
|
||||||
|
self.log.critical(self.tr("SelezUscita: Configurazione non accettata"))
|
||||||
|
|
||||||
|
def applica(self):
|
||||||
|
self.log.info(self.tr("Applico Impostazioni File Uscita"))
|
||||||
|
self.conf.setParam(('docStruct', 'language'),
|
||||||
|
self.selezoutui.cmb_lingua.currentText())
|
||||||
|
self.conf.setParam(('docStruct', 'languageIdx'),
|
||||||
|
self.selezoutui.cmb_lingua.currentIndex())
|
||||||
|
self.conf.setParam(('settings', 'saveBodyFile'), self.selezoutui.rad_mainbody.isChecked()
|
||||||
|
| self.selezoutui.rad_mainbodyEFile.isChecked())
|
||||||
|
self.conf.setParam(('settings', 'saveSeparateFiles'), self.selezoutui.rad_file.isChecked()
|
||||||
|
| self.selezoutui.rad_mainbodyEFile.isChecked())
|
||||||
|
self.conf.setParam(('settings', 'removeDuplicates'),
|
||||||
|
self.selezoutui.chk_removeDuplicates.isChecked())
|
||||||
|
self.conf.setParam(('settings', 'includeTitle'),
|
||||||
|
self.selezoutui.chk_removeDuplicates.isChecked())
|
||||||
|
self.conf.setParam(('settings', 'delWordBreak'),
|
||||||
|
self.selezoutui.chk_removeBreakWord.isChecked())
|
||||||
|
self.conf.setParam(('settings', 'removeOldFiles'),
|
||||||
|
self.selezoutui.chk_cleaDestFolder.isChecked())
|
||||||
|
self.conf.setParam(('settings', 'delChars'), list(
|
||||||
|
self.selezoutui.lin_specialChars.text()))
|
||||||
|
|
||||||
|
def splitta(self):
|
||||||
|
# costruisco il dizionario di configurazione
|
||||||
|
prefile = self.conf.inUse
|
||||||
|
splconf = copy.deepcopy(self.conf.dump())
|
||||||
|
lang = copy.deepcopy(self.conf.use(
|
||||||
|
'languageconf.json').getParam(splconf['docStruct']['language']))
|
||||||
|
splconf['docStruct']['language'] = lang
|
||||||
|
self.conf.use(prefile)
|
||||||
|
|
||||||
|
#formato nome in uscita
|
||||||
|
nametemp = []
|
||||||
|
for i in range(1, 4):
|
||||||
|
if i == splconf['docStruct']['numberPos'] and splconf['docStruct']['outNumber']:
|
||||||
|
nametemp.append("{docnum}")
|
||||||
|
if i == splconf['docStruct']['datePos'] and splconf['docStruct']['outDate']:
|
||||||
|
nametemp.append(splconf['docStruct']['dateFormats']
|
||||||
|
[splconf['docStruct']['outDateType']])
|
||||||
|
if i == splconf['docStruct']['titlePos'] and splconf['docStruct']['outTitle']:
|
||||||
|
nametemp.append("{title}")
|
||||||
|
pass
|
||||||
|
if splconf['docStruct']['outPrefix'] != '':
|
||||||
|
# inserisco prefisso e suffisso
|
||||||
|
nametemp.insert(0, splconf['docStruct']['outPrefix'])
|
||||||
|
if splconf['docStruct']['outSuffix'] != '':
|
||||||
|
nametemp.append(splconf['docStruct']['outSuffix'])
|
||||||
|
#unisco i pezzi
|
||||||
|
splconf['docStruct']['outNameFormat'] = splconf['docStruct']['outNameSep'].join(
|
||||||
|
nametemp)+splconf['docStruct']['outExt']
|
||||||
|
|
||||||
|
#costruisco messageBox
|
||||||
|
msgb = QMessageBox(parent=self, icon=QMessageBox.Warning,
|
||||||
|
text=self.tr("Sto SPLITTANDO, attendi.."))
|
||||||
|
msgb.setWindowTitle(self.tr("Sto Splittando.."))
|
||||||
|
msgb.show()
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def updateState(msg):
|
||||||
|
msgb.setText(msg)
|
||||||
|
# costruisco i thread
|
||||||
|
|
||||||
|
tDict = {}
|
||||||
|
try:
|
||||||
|
for f in splconf['paths']['fileList']:
|
||||||
|
splconf['name'] = f
|
||||||
|
tDict[f] = bananaSPLITTER(
|
||||||
|
fileParams=copy.deepcopy(splconf), logger=self.log)
|
||||||
|
tDict[f].sendStatus.connect(updateState)
|
||||||
|
tDict[f].run()
|
||||||
|
#QThreadPool.globalInstance().start(tDict[f])
|
||||||
|
except Exception as e:
|
||||||
|
self.log.error(self.tr(f"Impossibile avviare lo splitter: {e}"))
|
||||||
|
|
||||||
|
msgb.setText(self.tr("FINITO!"))
|
||||||
|
|
||||||
|
|
||||||
|
class bananaAdvOpt(PyQt5.QtWidgets.QWidget):
|
||||||
|
|
||||||
|
update = pyqtSignal()
|
||||||
|
|
||||||
|
def __init__(self, confloader=None, logger=None):
|
||||||
|
PyQt5.QtWidgets.QWidget.__init__(self)
|
||||||
|
self.advoptui = Ui_editconf()
|
||||||
|
self.advoptui.setupUi(self)
|
||||||
|
self.conf = confloader
|
||||||
|
self.log = logger
|
||||||
|
self.errmsg = None
|
||||||
|
if self.conf is not None:
|
||||||
|
self.advoptui.btn_ok.clicked.connect(self.accetta)
|
||||||
|
self.advoptui.btn_cancel.clicked.connect(self.rifiuta)
|
||||||
|
self.fillInterface()
|
||||||
|
|
||||||
|
def fillInterface(self):
|
||||||
|
try:
|
||||||
|
self.advoptui.txt_confFile.setPlainText(
|
||||||
|
json.dumps(self.conf.dump(), indent=2))
|
||||||
|
except:
|
||||||
|
self.log.critical(self.tr("AdvancedOptions: Configurazione non accettata"))
|
||||||
|
|
||||||
|
def accetta(self):
|
||||||
|
self.errmsg = QMessageBox()
|
||||||
|
self.errmsg.setModal(True)
|
||||||
|
self.errmsg.setWindowTitle(self.tr("Avanzate Globali"))
|
||||||
|
icon = PyQt5.QtGui.QIcon()
|
||||||
|
icon.addPixmap(PyQt5.QtGui.QPixmap(":/icons/icons8-smartphone-ram-100.png"),
|
||||||
|
PyQt5.QtGui.QIcon.Normal, PyQt5.QtGui.QIcon.Off)
|
||||||
|
self.errmsg.setWindowIcon(icon)
|
||||||
|
try:
|
||||||
|
self.conf.loads(self.advoptui.txt_confFile.toPlainText())
|
||||||
|
self.log.info(
|
||||||
|
self.tr("Parametri inseriti validi, configurazione accettata"))
|
||||||
|
self.errmsg.setIcon(QMessageBox.Information)
|
||||||
|
self.errmsg.setText(
|
||||||
|
self.tr("Parametri inseriti validi, configurazione accettata"))
|
||||||
|
self.errmsg.show()
|
||||||
|
self.update.emit()
|
||||||
|
self.hide()
|
||||||
|
except Exception as e:
|
||||||
|
self.log.error(self.tr(f"Errore nei parametri! {e}"))
|
||||||
|
self.errmsg.setIcon(QMessageBox.Critical)
|
||||||
|
self.errmsg.setText(self.tr(f"Errore nei parametri!\n{e}"))
|
||||||
|
self.errmsg.show()
|
||||||
|
|
||||||
|
def rifiuta(self):
|
||||||
|
self.log.info(f"AdvancedOptions: Configurazione Rifiutata")
|
||||||
|
self.hide()
|
||||||
|
|
||||||
|
|
||||||
|
class bananaSplitterInterface(PyQt5.QtWidgets.QWidget):
|
||||||
|
def __init__(self, confloader=None, logger=None):
|
||||||
|
PyQt5.QtWidgets.QWidget.__init__(self)
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class spexAbout(PyQt5.QtWidgets.QDialog):
|
||||||
|
def __init__(self, confloader=None, logger=None):
|
||||||
|
PyQt5.QtWidgets.QDialog.__init__(self)
|
||||||
|
self.abt = Ui_about()
|
||||||
|
self.abt.setupUi(self)
|
||||||
|
self.abt.lbl_info.setText(self.abt.lbl_info.text().replace(
|
||||||
|
'{ver}', confloader.getParam('version')))
|
||||||
|
self.show()
|
||||||
|
#############################################################
|
||||||
|
####################### MAIN ################################
|
||||||
|
#############################################################
|
||||||
|
|
||||||
|
|
||||||
|
def except_hook(cls, exception, traceback):
|
||||||
|
sys.__excepthook__(cls, exception, traceback)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app = PyQt5.QtWidgets.QApplication(sys.argv)
|
||||||
|
sys.excepthook = except_hook
|
||||||
|
|
||||||
|
try:
|
||||||
|
print(f"Running directory {os.environ['WORKSPACELOC']}")
|
||||||
|
print(f"Pythonpath: {os.environ['PYTHONPATH']}")
|
||||||
|
LOGGER = fancyLogger(filepath=r"./conf/loggerconf.json", fileLog=False)
|
||||||
|
conf = bananaCONF(workdir=r"./conf", logger=LOGGER)
|
||||||
|
conf.open()
|
||||||
|
conf.use("defaults.json")
|
||||||
|
conf.use(conf.getParam('paths', 'lastUsed'))
|
||||||
|
|
||||||
|
iflan = conf.getParam('settings', 'uiLang')
|
||||||
|
trlist = [f":/tr/translations/guimain_{iflan}.qm",
|
||||||
|
f":/tr/translations/libconfload_{iflan}.qm",
|
||||||
|
f":/tr/translations/libsplit_{iflan}.qm",
|
||||||
|
f":/tr/translations/mainwindow_{iflan}.qm",
|
||||||
|
f":/tr/translations/avanzatetitolo3_{iflan}.qm",
|
||||||
|
f":/tr/translations/titolow_{iflan}.qm",
|
||||||
|
f":/tr/translations/selezout_{iflan}.qm",
|
||||||
|
f":/tr/translations/about_{iflan}.qm"]
|
||||||
|
qtrlist = []
|
||||||
|
|
||||||
|
if iflan != 'it':
|
||||||
|
LOGGER.debug("Carico Traduzioni: ")
|
||||||
|
for tr in trlist:
|
||||||
|
qtr = QTranslator()
|
||||||
|
print(qtr.load(tr), f" {tr}")
|
||||||
|
app.installTranslator(qtr)
|
||||||
|
qtrlist.append(qtr)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Errore main: {e}")
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
window = bananaMain(logger=LOGGER, confloader=conf)
|
||||||
|
window.show()
|
||||||
|
rv = app.exec()
|
||||||
|
print("ExitCode: {}".format(rv))
|
||||||
|
sys.exit(rv)
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
'''
|
||||||
|
Created on 2 nov 2019
|
||||||
|
|
||||||
|
@author: Emanuele Trabattoni
|
||||||
|
'''
|
||||||
|
import json,os,glob,copy
|
||||||
|
from PyQt5.QtCore import QObject
|
||||||
|
|
||||||
|
class bananaCONF(QObject):
|
||||||
|
'''
|
||||||
|
Carica e Salva file di configurazione per bananaSPLITTER
|
||||||
|
'''
|
||||||
|
def __init__(self, workdir=None, logger=None):
|
||||||
|
try:
|
||||||
|
QObject.__init__(self)
|
||||||
|
self.log = logger
|
||||||
|
self.fileList = None
|
||||||
|
self.workdir = None
|
||||||
|
self.inUse = None
|
||||||
|
self.settingsList = dict()
|
||||||
|
if workdir is not None:
|
||||||
|
self.workdir = workdir
|
||||||
|
os.chdir(workdir)
|
||||||
|
self.log.debug(self.tr("Cerco le configurazioni in: [{}]").format(os.getcwd()))
|
||||||
|
else:
|
||||||
|
self.log.error(self.tr("Non mi e' stata fornita una directory per i file di configurazione"))
|
||||||
|
pass
|
||||||
|
except Exception as e:
|
||||||
|
print(f"libConfload Exception: {e}")
|
||||||
|
|
||||||
|
def open(self):
|
||||||
|
self.log.info(self.tr("Carico i file di configurazione"))
|
||||||
|
self.fileList = glob.glob(r"*.json")
|
||||||
|
if len(self.fileList) > 0:
|
||||||
|
for f in self.fileList:
|
||||||
|
try:
|
||||||
|
fp = open(f)
|
||||||
|
tf = json.load(fp)
|
||||||
|
fName = f.split("\\")[-1]
|
||||||
|
self.settingsList[fName] = copy.deepcopy(tf)
|
||||||
|
self.log.info(self.tr("Caricato correttamente: {}").format(fName))
|
||||||
|
fp.close()
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
self.log.error(self.tr("Impossibile leggere la configurazione:{}\n \
|
||||||
|
Controlla il file a riga: {} e colonna:{}").format(e.doc, e.lineno, e.colno))
|
||||||
|
except IOError as ee:
|
||||||
|
self.log.error(self.tr("Impossibile aprire il file: {}").format(ee))
|
||||||
|
except Exception as eee:
|
||||||
|
self.log.critical(self.tr("Eccezione inaspettata: {}").format(eee))
|
||||||
|
else:
|
||||||
|
self.log.error(self.tr("Non ho trovato alcun file di configurazione!"))
|
||||||
|
pass
|
||||||
|
|
||||||
|
def reload(self):
|
||||||
|
self.settingsList = None
|
||||||
|
self.fileList = None
|
||||||
|
self.inUse = None
|
||||||
|
self.open()
|
||||||
|
pass
|
||||||
|
|
||||||
|
def use(self, toUse):
|
||||||
|
self.inUse = toUse
|
||||||
|
return self
|
||||||
|
|
||||||
|
def save(self, fName=None):
|
||||||
|
if fName is None:
|
||||||
|
fName=self.inUse
|
||||||
|
self.log.info(self.tr("Salvo la configurazione: {}").format(fName))
|
||||||
|
try:
|
||||||
|
f=open(fName, 'w')
|
||||||
|
json.dump(self.settingsList[self.inUse], f, indent='\t')
|
||||||
|
f.close()
|
||||||
|
except IOError as e:
|
||||||
|
self.log.error(self.tr("Impossibile salvare il file: {} - [{}]").format(fName,e))
|
||||||
|
except Exception as ei:
|
||||||
|
self.log.error(self.tr("Errore imprevisto nella scrittura del file: {}").format(ei))
|
||||||
|
pass
|
||||||
|
|
||||||
|
def getFiles(self):
|
||||||
|
return self.fileList
|
||||||
|
|
||||||
|
def getParam(self, *keys):
|
||||||
|
rv = self.settingsList[self.inUse]
|
||||||
|
try:
|
||||||
|
for k in keys:
|
||||||
|
rv = rv[k]
|
||||||
|
return rv
|
||||||
|
except ValueError as ve:
|
||||||
|
self.log.error(self.tr("Parametro di configurazione non valido! [{}]").format(ve))
|
||||||
|
return False
|
||||||
|
pass
|
||||||
|
|
||||||
|
def setParam(self, keys=(), val=None):
|
||||||
|
sv = self.settingsList[self.inUse]
|
||||||
|
try:
|
||||||
|
for k in keys[:-1]:
|
||||||
|
sv = sv[k]
|
||||||
|
sv[keys[-1]] = val
|
||||||
|
return True
|
||||||
|
except ValueError as ve:
|
||||||
|
self.log.error(self.tr("Parametro di configurazione non valido! [{}]").format(ve))
|
||||||
|
return False
|
||||||
|
pass
|
||||||
|
|
||||||
|
def dump(self):
|
||||||
|
return self.settingsList[self.inUse]
|
||||||
|
|
||||||
|
def loads(self, conf):
|
||||||
|
jconf = json.loads(conf)
|
||||||
|
self.settingsList[self.inUse]=jconf
|
||||||
|
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
'''
|
||||||
|
Created on 2 nov 2019
|
||||||
|
|
||||||
|
@author: Emanuele Trabattoni
|
||||||
|
'''
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
import colorama
|
||||||
|
from PyQt5.QtCore import QObject, pyqtSignal
|
||||||
|
|
||||||
|
class fancyLogger(QObject):
|
||||||
|
'''
|
||||||
|
Colorizza il logger di python, per un' esperienza stile willy wonka
|
||||||
|
'''
|
||||||
|
sendLog = pyqtSignal(str)
|
||||||
|
|
||||||
|
def __init__(self, filepath=None, name="Logger", consoleLog=True, fileLog=False):
|
||||||
|
QObject.__init__(self)
|
||||||
|
try:
|
||||||
|
with open(filepath, 'r') as fp:
|
||||||
|
settings = json.load(fp)
|
||||||
|
fp.close()
|
||||||
|
colorama.init(convert=True)
|
||||||
|
self.LRED = colorama.Fore.LIGHTRED_EX
|
||||||
|
self.RED = colorama.Fore.RED
|
||||||
|
self.LYELLOW = colorama.Fore.LIGHTYELLOW_EX
|
||||||
|
self.YELLOW = colorama.Fore.YELLOW
|
||||||
|
self.LBLUE = colorama.Fore.LIGHTBLUE_EX
|
||||||
|
self.BLUE = colorama.Fore.BLUE
|
||||||
|
self.LGREEN = colorama.Fore.LIGHTGREEN_EX
|
||||||
|
self.LGREEN = colorama.Fore.GREEN
|
||||||
|
self.WHITE = colorama.Fore.LIGHTWHITE_EX
|
||||||
|
self.RST = colorama.Style.RESET_ALL
|
||||||
|
|
||||||
|
# Setup Logger
|
||||||
|
self.LOGGER = logging.getLogger(name)
|
||||||
|
self.LOGGER.setLevel(logging.DEBUG)
|
||||||
|
self.LOGGER.propagate = False
|
||||||
|
FORMATTER = logging.Formatter((settings["logFormat"]), (settings["logTimeFormat"]))
|
||||||
|
if fileLog:
|
||||||
|
# File Logging
|
||||||
|
fh = logging.FileHandler((settings["logFile"]))
|
||||||
|
fh.setLevel(logging.DEBUG)
|
||||||
|
fh.setFormatter(FORMATTER)
|
||||||
|
self.LOGGER.addHandler(fh)
|
||||||
|
if consoleLog:
|
||||||
|
# Console Logging
|
||||||
|
cl= logging.StreamHandler(sys.stdout)
|
||||||
|
cl.setLevel(logging.DEBUG)
|
||||||
|
cl.setFormatter(FORMATTER)
|
||||||
|
self.LOGGER.addHandler(cl)
|
||||||
|
except IOError as e:
|
||||||
|
print("Impossibile caricare la configurazione del logger: [{}]".format(e))
|
||||||
|
except Exception as ee:
|
||||||
|
print(f"libFancylogger error: {ee}")
|
||||||
|
pass
|
||||||
|
|
||||||
|
def debug(self, msg="Undefined Debug"):
|
||||||
|
print(self.LBLUE, end='')
|
||||||
|
self.LOGGER.debug(msg)
|
||||||
|
print(self.RST, end='')
|
||||||
|
self.sendLog.emit(f"<FONT COLOR='#03c2fc'>DEBUG | {msg} </br>")
|
||||||
|
pass
|
||||||
|
|
||||||
|
def info(self, msg="Undefined Info"):
|
||||||
|
print(self.LGREEN, end='')
|
||||||
|
self.LOGGER.info(msg)
|
||||||
|
print(self.RST, end='')
|
||||||
|
self.sendLog.emit(f"<FONT COLOR='#6bfc03'>INFO | {msg} </br>")
|
||||||
|
pass
|
||||||
|
|
||||||
|
def warn(self, msg="Undefined Warning"):
|
||||||
|
print(self.LYELLOW, end='')
|
||||||
|
self.LOGGER.warning(msg)
|
||||||
|
print(self.RST, end='')
|
||||||
|
self.sendLog.emit(f"<FONT COLOR='#fc9403'>WARNING | {msg} </br>")
|
||||||
|
pass
|
||||||
|
|
||||||
|
def error(self, msg="Undefined Error"):
|
||||||
|
print(self.LRED, end='')
|
||||||
|
self.LOGGER.error(msg)
|
||||||
|
print(self.RST, end='')
|
||||||
|
self.sendLog.emit(f"<FONT COLOR='#ff0000'>ERROR | {msg} </br>")
|
||||||
|
pass
|
||||||
|
|
||||||
|
def critical(self, msg="Undefined Critical"):
|
||||||
|
print(self.RED, end='')
|
||||||
|
self.LOGGER.critical(msg)
|
||||||
|
print(self.RST, end='')
|
||||||
|
self.sendLog.emit(f"<FONT COLOR='#fc03ce'>CRITICAL | {msg} </br>")
|
||||||
|
pass
|
||||||
|
|
||||||
|
def testColors(self):
|
||||||
|
self.debug("Test Debug")
|
||||||
|
self.info("Test Info")
|
||||||
|
self.warn("Test Warning")
|
||||||
|
self.error("Test Error")
|
||||||
|
self.critical("Test Critical")
|
||||||
|
pass
|
||||||
|
|
||||||
@@ -0,0 +1,404 @@
|
|||||||
|
'''
|
||||||
|
Created on 2 nov 2019
|
||||||
|
|
||||||
|
@author: Emanuele Trabattoni
|
||||||
|
'''
|
||||||
|
from PyQt5.QtCore import QObject, pyqtSignal
|
||||||
|
|
||||||
|
from slugify import slugify
|
||||||
|
import time, parse, re, copy, os, json
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
class bananaSPLITTER(QObject):
|
||||||
|
sendStatus = pyqtSignal(str)
|
||||||
|
def __init__(self, fileParams=None, logger=None):
|
||||||
|
try:
|
||||||
|
QObject.__init__(self)
|
||||||
|
self.fileParams = fileParams
|
||||||
|
self.log = logger
|
||||||
|
self.rawFile = None
|
||||||
|
self.status = "first"
|
||||||
|
self.contentList = list()
|
||||||
|
self.bodyCounter=0
|
||||||
|
self.duplicateNumber=0
|
||||||
|
#self.log.debug(f"Configurazione: \n {json.dumps(fileParams, indent=2)}")
|
||||||
|
if fileParams is not None:
|
||||||
|
self.log.debug(self.tr("Sto operando sul file: {}..").format(self.fileParams['name']))
|
||||||
|
self.paths = self.fileParams['paths']
|
||||||
|
self.docStruct = self.fileParams['docStruct']
|
||||||
|
self.settings = self.fileParams['settings']
|
||||||
|
self.fileName = self.fileParams['name']
|
||||||
|
self.outPath = self.paths['OUTworkPath']+slugify(self.fileName)+'/'
|
||||||
|
self.beginTime = time.time()
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.log.critical(self.tr("Non e' stato fornito il nome di alcun file da splittare!"))
|
||||||
|
except Exception as e:
|
||||||
|
print(f"libSplit error: {e}")
|
||||||
|
pass
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self.log.info(self.tr("Nuovo SPLITTER su file: {}").format(self.fileName))
|
||||||
|
self.sendStatus.emit(self.tr(f"Inizio {self.fileName}"))
|
||||||
|
try:
|
||||||
|
self.openFile()
|
||||||
|
self.remEmptyLines()
|
||||||
|
if self.docStruct['fileVersNew']:
|
||||||
|
self.newSplitFile()
|
||||||
|
else:
|
||||||
|
self.splitFile()
|
||||||
|
|
||||||
|
if self.settings['removeDuplicates']:
|
||||||
|
self.log.info(self.tr("Controllo se ci sono dei duplicati.."))
|
||||||
|
self.removeDuplicates()
|
||||||
|
else:
|
||||||
|
for idx, ff in enumerate(self.contentList):
|
||||||
|
ff['duplicate']=False
|
||||||
|
self.contentList[idx]=ff
|
||||||
|
self.log.warn(self.tr("Salto il controllo dei duplicati.."))
|
||||||
|
# se il parse e la rimozione dei duplicati e' andata bene
|
||||||
|
# preparo e inizio il salvataggio
|
||||||
|
if os.path.exists(self.outPath):
|
||||||
|
if self.settings['removeOldFiles']:
|
||||||
|
#os.chdir(self.outPath)
|
||||||
|
for f in os.listdir(self.outPath):
|
||||||
|
os.remove(self.outPath+f)
|
||||||
|
else:
|
||||||
|
raise FileExistsError(self.tr("Non posso sovrascrivere i vecchi file, eliminali manualmente!"))
|
||||||
|
else:
|
||||||
|
os.mkdir(self.outPath)
|
||||||
|
#os.chdir(self.outPath)
|
||||||
|
if self.settings['saveSeparateFiles']:
|
||||||
|
self.saveSeparate()
|
||||||
|
if self.settings['saveBodyFile']:
|
||||||
|
self.saveBody()
|
||||||
|
self.log.info(self.tr("L'elaborazione del file ha richiesto {:4.2f} sec").format(time.time()-self.beginTime))
|
||||||
|
|
||||||
|
except UnicodeDecodeError as ee:
|
||||||
|
self.log.critical(self.tr("Il file [{}] contiene caratteri non compatibili con la codifica scelta! [{}]")
|
||||||
|
.format(self.fileParams['name'],ee))
|
||||||
|
except FileExistsError as fe:
|
||||||
|
self.log.critical(fe)
|
||||||
|
except Exception as ee:
|
||||||
|
traceback.print_exc()
|
||||||
|
self.log.warn(ee)
|
||||||
|
pass
|
||||||
|
|
||||||
|
def openFile(self):
|
||||||
|
try:
|
||||||
|
#os.chdir(self.paths["INworkPath"])
|
||||||
|
self.log.info(self.tr("Carico il contenuto.."))
|
||||||
|
fp = open(self.paths["INworkPath"]+'/'+self.fileParams['name'], mode='r', encoding=self.settings['encoding'])
|
||||||
|
self.rawFile = fp.readlines()
|
||||||
|
fp.close()
|
||||||
|
except IOError as e:
|
||||||
|
self.log.critical(self.tr("Impossibile aprire il file: {}! [{}]").format(self.fileName,e))
|
||||||
|
raise BaseException("OpenFile")
|
||||||
|
os.rmdir(self.outPath)
|
||||||
|
except Exception as ee:
|
||||||
|
print(ee)
|
||||||
|
pass
|
||||||
|
|
||||||
|
def remEmptyLines(self):
|
||||||
|
self.log.info(self.tr("Elimino righe vuote e caratteri inutili.."))
|
||||||
|
tempContent = []
|
||||||
|
try:
|
||||||
|
for ll in self.rawFile:
|
||||||
|
for c in self.settings['delChars']:
|
||||||
|
ll = ll.replace(c,'')
|
||||||
|
if ll not in ['\n', '\r', '\r\n']:
|
||||||
|
tempContent.append(ll)
|
||||||
|
self.rawFile = copy.deepcopy(tempContent)
|
||||||
|
self.rawFile.append('\n') #linea vuota finale per essere sicuri di parsare bene
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
self.log.error(self.tr("Errore inaspettato durante l'eliminazione delle righe vuote!"))
|
||||||
|
raise BaseException("DelLines")
|
||||||
|
del tempContent
|
||||||
|
|
||||||
|
def newSplitFile(self): #porting del codice dal programma originale
|
||||||
|
self.log.info(self.tr("Individuo il contenuto.."))
|
||||||
|
self.bodyCounter=0
|
||||||
|
self.duplicateNumber=0
|
||||||
|
docNumber = 0
|
||||||
|
docSkipped = 0
|
||||||
|
docDate = {}
|
||||||
|
title = ''
|
||||||
|
prevLine = ''
|
||||||
|
newsPaperName = ''
|
||||||
|
titleBegin = True
|
||||||
|
newsName = False
|
||||||
|
tempBody = list()
|
||||||
|
|
||||||
|
for l in self.rawFile: #per ogni linea del file
|
||||||
|
l=l.replace('\xa0', ' ')
|
||||||
|
lineWords = l.lstrip().split(' ') #dividi la riga in parole
|
||||||
|
if self.status == 'first':
|
||||||
|
try:
|
||||||
|
# ricerco la data
|
||||||
|
if (lineWords[self.settings['monthPosition']]).capitalize() in self.docStruct['language']['dateWords']:
|
||||||
|
try:
|
||||||
|
docDate=parse.parse(self.docStruct['dateFormat'],l).named
|
||||||
|
docDate['month']=docDate['month'].lstrip().rstrip().capitalize()
|
||||||
|
docDate['month']=self.docStruct['language']['dateWords'].index(docDate['month'])+1
|
||||||
|
# dopo la data inizia il titolo, ma prima si cerca il nome del giornale
|
||||||
|
except:
|
||||||
|
self.log.warn(self.tr("Ho trovato una riga ambigua.. potrebbe essere una data ma non so: [{}]"). format(l.strip('\r\n')))
|
||||||
|
pass
|
||||||
|
elif lineWords[0].upper() in self.docStruct['language']['headWords']:
|
||||||
|
#cambio stato e inizializzo un nuovo documento da riempire
|
||||||
|
self.status = 'head'
|
||||||
|
newDoc=dict()
|
||||||
|
newDoc['title']=title
|
||||||
|
newDoc['date']=docDate
|
||||||
|
newDoc['newsPaperName'] = newsPaperName
|
||||||
|
titleBegin = False
|
||||||
|
newsName = False
|
||||||
|
else:
|
||||||
|
if titleBegin:
|
||||||
|
title = l.strip().capitalize()
|
||||||
|
titleBegin = False
|
||||||
|
newsName = True
|
||||||
|
elif newsName:
|
||||||
|
if self.settings['getNewsPaperName']:
|
||||||
|
try:
|
||||||
|
if l.strip():
|
||||||
|
newsPaperName = l.strip()
|
||||||
|
else:
|
||||||
|
newsPaperName = self.settings['nameNotFoundStr']
|
||||||
|
except:
|
||||||
|
self.log.warn(self.tr("E' successo qualcosa mentre stavo cercando il nome della pubblicazione,\
|
||||||
|
controlla i file di uscita! [{}]").format(l.strip()))
|
||||||
|
else:
|
||||||
|
newsPaperName = self.settings['nameNotFoundStr']
|
||||||
|
newsName = False
|
||||||
|
except IndexError:
|
||||||
|
self.log.error(self.tr("Errore inaspettato, contatta il tuo sviluppatore di fiducia!"))
|
||||||
|
pass
|
||||||
|
elif self.status == 'head':
|
||||||
|
tempContent = list()
|
||||||
|
#doppio check per trovare l'inizio del corpo documento
|
||||||
|
if re.match(self.docStruct['beginOfDocument'],l):
|
||||||
|
self.status='body'
|
||||||
|
#if lineWords[0].upper() not in self.docStruct['language']['headWords']: #se la prima parola non e' tra quelle di inizio
|
||||||
|
#tempBody.append(l) # vuol dire che ho trovato l'articolo e aggiungo la prima riga al contenuto del documento
|
||||||
|
#self.status = 'body'
|
||||||
|
elif self.status == 'body':
|
||||||
|
if re.match(self.docStruct['endOfDocument'],l) is not None: #controlla se ci sono articoli che non hanno le parole chiave finali
|
||||||
|
self.log.warn(self.tr("Ho individuato una separatore valido prima che si chiusesse l'articolo precedente, controlla i tuoi file in uscita!\n\
|
||||||
|
L'errore dovrebbe essere intorno all'articolo {} ma non sono sicuro! \n\t\t\t[{}]").format(docNumber, l.strip()))
|
||||||
|
self.status = 'tail'
|
||||||
|
anomaly = True
|
||||||
|
elif not lineWords[0].upper() in self.docStruct['language']['tailWords']: #se la prima parola non e' tra quelle di fine
|
||||||
|
if self.settings['delLF']:
|
||||||
|
tempBody.append(l.strip('\n')) #allora sto leggendo l'articolo
|
||||||
|
else:
|
||||||
|
tempBody.append(l)
|
||||||
|
else:
|
||||||
|
self.status = 'tail'
|
||||||
|
anomaly = False
|
||||||
|
|
||||||
|
pass
|
||||||
|
elif self.status == 'tail':
|
||||||
|
if anomaly or (re.match(self.docStruct['endOfDocument'],l) is not None):
|
||||||
|
self.status = 'first'
|
||||||
|
anomaly = False
|
||||||
|
titleBegin = True
|
||||||
|
if self.settings['delWordBreak']:
|
||||||
|
tempContent=[ll.replace('-\n', '') for ll in tempContent]
|
||||||
|
newDoc['content']=copy.deepcopy(''.join(tempBody))
|
||||||
|
self.contentList.append(copy.deepcopy(newDoc))
|
||||||
|
tempBody=list()
|
||||||
|
self.bodyCounter +=1
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.log.critical(self.tr("Stato Interno Sconosciuto"))
|
||||||
|
prevLine=l #salva sempre e comunque il contenuto della linea precedente
|
||||||
|
pass
|
||||||
|
#ricerca terminata, espongo i risultati
|
||||||
|
self.log.info(self.tr("Nel file ho trovato {0} articoli..").format(self.bodyCounter))
|
||||||
|
if docSkipped > 0:
|
||||||
|
self.log.warn(self.tr("Attentione, LexisNexis ne ha saltati {} !!!").format(docSkipped))
|
||||||
|
pass
|
||||||
|
pass
|
||||||
|
|
||||||
|
def splitFile(self): #porting del codice dal programma originale
|
||||||
|
self.log.info(self.tr("Individuo il contenuto.."))
|
||||||
|
self.bodyCounter=0
|
||||||
|
self.duplicateNumber=0
|
||||||
|
docNumber = 0
|
||||||
|
docSkipped = 0
|
||||||
|
docDate = {}
|
||||||
|
title = ''
|
||||||
|
prevLine = ''
|
||||||
|
newsPaperName = ''
|
||||||
|
titleBegin = False
|
||||||
|
tempBody = list()
|
||||||
|
docSep=re.compile(self.docStruct['docSep'])
|
||||||
|
|
||||||
|
for l in self.rawFile: #per ogni linea del file
|
||||||
|
lineWords = l.lstrip().split(' ') #dividi la riga in parole
|
||||||
|
if self.status == 'first':
|
||||||
|
#prendo il numero di documento per vedere se ci sono buchi
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
nn = parse.parse("{current:d} Of {total} Documents",l.strip().capitalize()).named
|
||||||
|
if nn["current"]-docNumber==1:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if self.settings["showSkipped"]:
|
||||||
|
self.log.warn(self.tr("Il conto dei documenti non torna! LexisNexis ne ha saltato qualcuno!\n Precedente:{0}-Attuale:{1}").format(docNumber,nn["current"]))
|
||||||
|
docSkipped+=1
|
||||||
|
docNumber = nn["current"]
|
||||||
|
except:
|
||||||
|
pass #non segnalare eccezione se il parse fallisce
|
||||||
|
# ricerco la data
|
||||||
|
if (lineWords[self.settings['monthPosition']]).capitalize() in self.docStruct['language']['dateWords']:
|
||||||
|
try:
|
||||||
|
docDate=parse.parse(self.docStruct['dateFormat'],l).named
|
||||||
|
docDate['month']=docDate['month'].lstrip().rstrip().capitalize()
|
||||||
|
docDate['month']=self.docStruct['language']['dateWords'].index(docDate['month'])+1
|
||||||
|
title = ''
|
||||||
|
titleBegin=True
|
||||||
|
# dopo la data inizia il titolo, ma prima si cerca il nome del giornale
|
||||||
|
if self.settings['getNewsPaperName']:
|
||||||
|
try:
|
||||||
|
if prevLine.split(' ')[0].strip().isalpha():
|
||||||
|
newsPaperName = prevLine.strip()
|
||||||
|
else:
|
||||||
|
newsPaperName = self.settings['nameNotFoundStr']
|
||||||
|
except:
|
||||||
|
self.log.warn(self.tr("E' successo qualcosa mentre stavo cercando il nome della pubblicazione,\
|
||||||
|
controlla i file di uscita! [{}]").format(prevLine.strip()))
|
||||||
|
else:
|
||||||
|
newsPaperName = self.settings['nameNotFoundStr']
|
||||||
|
except:
|
||||||
|
self.log.warn(self.tr("Ho trovato una riga ambigua.. potrebbe essere una data ma non so: [{}]").format(l.strip('\r\n')))
|
||||||
|
pass
|
||||||
|
elif lineWords[0] in self.docStruct['language']['headWords']:
|
||||||
|
#cambio stato e inizializzo un nuovo documento da riempire
|
||||||
|
self.status = 'head'
|
||||||
|
newDoc=dict()
|
||||||
|
newDoc['title']=title
|
||||||
|
newDoc['date']=docDate
|
||||||
|
newDoc['newsPaperName'] = newsPaperName
|
||||||
|
titleBegin=False
|
||||||
|
else:
|
||||||
|
if titleBegin:
|
||||||
|
title += l.strip().capitalize()
|
||||||
|
except IndexError:
|
||||||
|
self.log.error(self.tr("Errore inaspettato, contatta il tuo sviluppatore di fiducia!"))
|
||||||
|
pass
|
||||||
|
elif self.status == 'head':
|
||||||
|
tempContent = list()
|
||||||
|
if lineWords[0] not in self.docStruct['language']['headWords']: #se la prima parola non e' tra quelle di inizio
|
||||||
|
tempBody.append(l) # vuol dire che ho trovato l'articolo e aggiungo la prima riga al contenuto del documento
|
||||||
|
self.status = 'body'
|
||||||
|
pass
|
||||||
|
elif self.status == 'body':
|
||||||
|
if not lineWords[0] in self.docStruct['language']['tailWords']: #se la prima parola non e' tra quelle di fine
|
||||||
|
if self.settings['delLF']:
|
||||||
|
tempBody.append(l.strip('\n')) #allora sto leggendo l'articolo
|
||||||
|
else:
|
||||||
|
tempBody.append(l)
|
||||||
|
else:
|
||||||
|
self.status = 'tail'
|
||||||
|
anomaly = False
|
||||||
|
if docSep.match(l) is not None: #controlla se ci sono articoli che non hanno le parole chiave finali
|
||||||
|
self.log.warn(self.tr("Ho individuato una separatore valido prima che si chiusesse l'articolo precedente, controlla i tuoi file in uscita!\n\
|
||||||
|
L'errore dovrebbe essere intorno all'articolo {} ma non sono sicuro! \n\t\t[{}]").format(docNumber, l.strip()))
|
||||||
|
self.status = 'tail'
|
||||||
|
anomaly = True
|
||||||
|
pass
|
||||||
|
elif self.status == 'tail':
|
||||||
|
if docSep.match(l) is not None or anomaly:
|
||||||
|
self.status = 'first'
|
||||||
|
anomaly = False
|
||||||
|
if self.settings['delWordBreak']:
|
||||||
|
tempContent=[ll.replace('-\n', '') for ll in tempContent]
|
||||||
|
newDoc['content']=copy.deepcopy(''.join(tempBody))
|
||||||
|
self.contentList.append(copy.deepcopy(newDoc))
|
||||||
|
tempBody=list()
|
||||||
|
self.bodyCounter +=1
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.log.critical(self.tr("Stato Interno Sconosciuto"))
|
||||||
|
prevLine=l #salva sempre e comunque il contenuto della linea precedente
|
||||||
|
pass
|
||||||
|
#ricerca terminata, espongo i risultati
|
||||||
|
self.log.info(self.tr("Nel file ho trovato {0} articoli..").format(self.bodyCounter))
|
||||||
|
if docSkipped > 0:
|
||||||
|
self.log.warn(self.tr("Attentione, LexisNexis ne ha saltati {} !!!").format(docSkipped))
|
||||||
|
pass
|
||||||
|
pass
|
||||||
|
|
||||||
|
def removeDuplicates(self):
|
||||||
|
titleList=[]
|
||||||
|
duplicateList=[]
|
||||||
|
for idx, ff in enumerate(self.contentList):
|
||||||
|
if ff['title'] not in titleList:
|
||||||
|
titleList.append(ff['title'])
|
||||||
|
ff['duplicate']=False
|
||||||
|
self.contentList[idx]=ff
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if ff['title'] not in duplicateList:
|
||||||
|
duplicateList.append(ff['title'])
|
||||||
|
if self.settings['showRemovedDuplicates']:
|
||||||
|
self.log.info(self.tr("Duplicato: {}").format(ff['title'].strip()))
|
||||||
|
ff['duplicate'] = True
|
||||||
|
self.contentList[idx]=ff
|
||||||
|
self.duplicateNumber+=1
|
||||||
|
self.log.info(self.tr("Ho rimosso {} duplicati di {} articoli..").format(self.duplicateNumber, len(duplicateList)))
|
||||||
|
pass
|
||||||
|
|
||||||
|
def saveSeparate(self):
|
||||||
|
outFileCounter = 0
|
||||||
|
self.paths['OUTworkPath']=self.paths['OUTworkPath']+slugify(self.fileName)
|
||||||
|
self.log.info(self.tr("Salvo gli articoli in file separati..."))
|
||||||
|
self.log.debug(self.tr("Persorso: {0}").format(self.outPath))
|
||||||
|
for ff in self.contentList:
|
||||||
|
try:
|
||||||
|
if ff['duplicate'] == False:
|
||||||
|
fName=self.docStruct['outNameFormat'].format(title=slugify(ff['title'][:self.docStruct['maxTitleLen']]),\
|
||||||
|
filename=slugify(self.fileName),\
|
||||||
|
docnum=outFileCounter,\
|
||||||
|
papername=ff['newsPaperName'].strip(),\
|
||||||
|
**ff['date'])
|
||||||
|
out=open(self.outPath+'{0}'.format(fName),'wb')
|
||||||
|
if self.settings['includeTitle']:
|
||||||
|
ff['content'] = ff['title']+os.linesep+ff['content']
|
||||||
|
out.write(ff['content'].encode(self.settings['encoding']))
|
||||||
|
out.close()
|
||||||
|
outFileCounter+=1
|
||||||
|
except IOError as e:
|
||||||
|
self.log.error(self.tr("Qualcosa e\' andato storto, non riesco a scrivere il file: {}").format(e))
|
||||||
|
continue
|
||||||
|
except KeyError as ke:
|
||||||
|
self.log.error(self.tr(f"Chiave {ke} non trovata per:{outFileCounter} {ff['title']} "))
|
||||||
|
except Exception as ee:
|
||||||
|
traceback.print_exc()
|
||||||
|
self.log.error(self.tr(f"Errore generale nel salvataggio: {ee}"))
|
||||||
|
if outFileCounter < self.bodyCounter:
|
||||||
|
self.log.error(self.tr("Ho salvato meno file rispetto a quelli trovati!"))
|
||||||
|
pass
|
||||||
|
|
||||||
|
def saveBody(self):
|
||||||
|
self.log.info(self.tr('Salvo gli articoli in un singolo file vicino agli originali...'))
|
||||||
|
self.log.debug(self.tr('Persorso: {0}').format(self.outPath))
|
||||||
|
#os.chdir(self.outPath)
|
||||||
|
try:
|
||||||
|
fName=slugify(self.fileName)
|
||||||
|
fName='BODYFILE_{0}.txt'.format(fName[:self.docStruct['maxTitleLen']])
|
||||||
|
fileContent = os.linesep.join([cc['content'] for cc in self.contentList])
|
||||||
|
out=open(self.outPath+'{0}'.format(fName),'wb')
|
||||||
|
out.write(fileContent.encode(self.settings['encoding']))
|
||||||
|
out.close()
|
||||||
|
except IOError as e:
|
||||||
|
self.log.error(self.tr("Qualcosa e\' andato storto, non riesco a scrivere il file: {}").format(e))
|
||||||
|
except Exception as ee:
|
||||||
|
self.log.error(self.tr(f"Errore generale nel salvataggio: {ee}"))
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||