From d625527c19fdb771c8a39fcbab6294521ef839a9 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Wed, 29 Jun 2022 14:15:36 +0200 Subject: [PATCH 1/3] Documentation tool chain switched to GenPackageDoc (replacement for Sphinx) --- JsonPreprocessor/CJsonPreprocessor.py | 92 +- JsonPreprocessor/JsonPreprocessor.pdf | Bin 0 -> 228372 bytes JsonPreprocessor/version.py | 23 + README.rst | 2 +- {config => additions}/CExtendedSetup.py | 162 +- .../PythonExtensionsCollection/File/CFile.py | 1072 ++ .../File/__init__.py | 13 + .../Folder/CFolder.py | 460 + .../Folder/__init__.py | 13 + .../String/CString.py | 1165 ++ .../String/__init__.py | 13 + .../Utils/CUtils.py | 374 + .../Utils/__init__.py | 13 + .../PythonExtensionsCollection/__init__.py | 13 + .../PythonExtensionsCollection/version.py | 23 + additions/__init__.py | 14 + config/CConfig.py | 240 - config/CRepositoryConfig.py | 197 + config/repository_config.json | 19 + doc/CJsonPreprocessor.rst | 32 - doc/_build/html/.buildinfo | 4 - doc/_build/html/CJsonPreprocessor.html | 183 - .../html/_modules/CJsonPreprocessor.html | 497 - doc/_build/html/_modules/index.html | 101 - .../html/_sources/CJsonPreprocessor.rst.txt | 25 - .../feature_documentation.rst.txt | 420 - doc/_build/html/_sources/index.rst.txt | 31 - doc/_build/html/_static/alabaster.css | 701 - doc/_build/html/_static/basic.css | 905 -- doc/_build/html/_static/custom.css | 1 - doc/_build/html/_static/doctools.js | 323 - .../html/_static/documentation_options.js | 12 - doc/_build/html/_static/file.png | Bin 286 -> 0 bytes doc/_build/html/_static/jquery-3.5.1.js | 10872 ---------------- doc/_build/html/_static/jquery.js | 2 - doc/_build/html/_static/language_data.js | 297 - doc/_build/html/_static/minus.png | Bin 90 -> 0 bytes doc/_build/html/_static/plus.png | Bin 90 -> 0 bytes doc/_build/html/_static/pygments.css | 82 - doc/_build/html/_static/searchtools.js | 529 - doc/_build/html/_static/underscore-1.13.1.js | 2042 --- doc/_build/html/_static/underscore.js | 6 - .../additional_doc/feature_documentation.html | 478 - doc/_build/html/genindex.html | 165 - doc/_build/html/index.html | 123 - doc/_build/html/objects.inv | 5 - doc/_build/html/py-modindex.html | 123 - doc/_build/html/search.html | 124 - doc/_build/html/searchindex.js | 1 - doc/_build/latex/Json-Preprocessor.pdf | Bin 302891 -> 0 bytes doc/conf.py | 96 - doc/images/python3-jsonpreprocessor.png | Bin 101520 -> 0 bytes doc/index.rst | 31 - doc/latex_addons/sphinxlatexadmonitions.sty | 284 - dump_repository_config.py | 75 + genpackagedoc.py | 104 + packagedoc/additional_docs/Appendix.rst | 37 + packagedoc/additional_docs/Description.rst | 24 + .../additional_docs/Description_orig.rst | 0 packagedoc/additional_docs/History.tex | 20 + packagedoc/additional_docs/Introduction.rst | 17 + .../pictures}/python3-jsonpreprocessor.png | Bin packagedoc/packagedoc_config.json | 127 + setup.py | 134 +- sphinx-makeall.py | 344 - 65 files changed, 3982 insertions(+), 19303 deletions(-) create mode 100644 JsonPreprocessor/JsonPreprocessor.pdf create mode 100644 JsonPreprocessor/version.py rename {config => additions}/CExtendedSetup.py (54%) create mode 100644 additions/PythonExtensionsCollection/File/CFile.py create mode 100644 additions/PythonExtensionsCollection/File/__init__.py create mode 100644 additions/PythonExtensionsCollection/Folder/CFolder.py create mode 100644 additions/PythonExtensionsCollection/Folder/__init__.py create mode 100644 additions/PythonExtensionsCollection/String/CString.py create mode 100644 additions/PythonExtensionsCollection/String/__init__.py create mode 100644 additions/PythonExtensionsCollection/Utils/CUtils.py create mode 100644 additions/PythonExtensionsCollection/Utils/__init__.py create mode 100644 additions/PythonExtensionsCollection/__init__.py create mode 100644 additions/PythonExtensionsCollection/version.py create mode 100644 additions/__init__.py delete mode 100644 config/CConfig.py create mode 100644 config/CRepositoryConfig.py create mode 100644 config/repository_config.json delete mode 100644 doc/CJsonPreprocessor.rst delete mode 100644 doc/_build/html/.buildinfo delete mode 100644 doc/_build/html/CJsonPreprocessor.html delete mode 100644 doc/_build/html/_modules/CJsonPreprocessor.html delete mode 100644 doc/_build/html/_modules/index.html delete mode 100644 doc/_build/html/_sources/CJsonPreprocessor.rst.txt delete mode 100644 doc/_build/html/_sources/additional_doc/feature_documentation.rst.txt delete mode 100644 doc/_build/html/_sources/index.rst.txt delete mode 100644 doc/_build/html/_static/alabaster.css delete mode 100644 doc/_build/html/_static/basic.css delete mode 100644 doc/_build/html/_static/custom.css delete mode 100644 doc/_build/html/_static/doctools.js delete mode 100644 doc/_build/html/_static/documentation_options.js delete mode 100644 doc/_build/html/_static/file.png delete mode 100644 doc/_build/html/_static/jquery-3.5.1.js delete mode 100644 doc/_build/html/_static/jquery.js delete mode 100644 doc/_build/html/_static/language_data.js delete mode 100644 doc/_build/html/_static/minus.png delete mode 100644 doc/_build/html/_static/plus.png delete mode 100644 doc/_build/html/_static/pygments.css delete mode 100644 doc/_build/html/_static/searchtools.js delete mode 100644 doc/_build/html/_static/underscore-1.13.1.js delete mode 100644 doc/_build/html/_static/underscore.js delete mode 100644 doc/_build/html/additional_doc/feature_documentation.html delete mode 100644 doc/_build/html/genindex.html delete mode 100644 doc/_build/html/index.html delete mode 100644 doc/_build/html/objects.inv delete mode 100644 doc/_build/html/py-modindex.html delete mode 100644 doc/_build/html/search.html delete mode 100644 doc/_build/html/searchindex.js delete mode 100644 doc/_build/latex/Json-Preprocessor.pdf delete mode 100644 doc/conf.py delete mode 100644 doc/images/python3-jsonpreprocessor.png delete mode 100644 doc/index.rst delete mode 100644 doc/latex_addons/sphinxlatexadmonitions.sty create mode 100644 dump_repository_config.py create mode 100644 genpackagedoc.py create mode 100644 packagedoc/additional_docs/Appendix.rst create mode 100644 packagedoc/additional_docs/Description.rst rename doc/additional_doc/feature_documentation.rst => packagedoc/additional_docs/Description_orig.rst (100%) create mode 100644 packagedoc/additional_docs/History.tex create mode 100644 packagedoc/additional_docs/Introduction.rst rename {doc/_build/html/_images => packagedoc/additional_docs/pictures}/python3-jsonpreprocessor.png (100%) create mode 100644 packagedoc/packagedoc_config.json delete mode 100644 sphinx-makeall.py diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index e3b2c33c..301d3881 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -58,16 +58,21 @@ class CSyntaxType(): (re.VERBOSE | re.MULTILINE | re.DOTALL)) class CPythonJSONDecoder(json.JSONDecoder): - """ Add below python values when scanning json data + """ +Some keywords are different in Python and Json + +.. table:: Python vs. Json keywords + :widths: auto - +---------------+-------------------+ - | True | True | - +---------------+-------------------+ - | False | False | - +---------------+-------------------+ - | None | None | - +---------------+-------------------+ + ======= ======= + Python Json + ======= ======= + True true + False false + None null + ======= ======= """ + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.scan_once = self.custom_scan_once @@ -123,24 +128,26 @@ def custom_scan_once(self, string, idx): class CJsonPreprocessor(): ''' - CJsonPreprocessor helps to handle configuration file as json format: - - Allow comment within json file - - Allow import json file within json file +CJsonPreprocessor helps to handle configuration file as json format: + +- Allow comment within json file +- Allow import json file within json file ''' def __init__(self, syntax=CSyntaxType.json, currentCfg={}): + ''' +Method: __processImportFiles this is custom decorder of object_pairs_hook function. + +This method helps to import json file which is provided in '[import]' keyword into current json file. + +Returns: + Dictionary is parsed from json file. + ''' self.lImportedFiles = [] self.recursive_level = 0 self.syntax = syntax self.currentCfg = currentCfg self.lUpdatedParams = [] - - ''' - Method: __processImportFiles this is custom decorder of object_pairs_hook function. - This method helps to import json file which is provided in '[import]' keyword into current json file. - Returns: - Dictionary is parsed from json file. - ''' def __processImportFiles(self, input_data): out_dict = {} for key, value in input_data: @@ -161,13 +168,13 @@ def __processImportFiles(self, input_data): out_dict[key] = value return out_dict - ''' - Method: __removeComments loads json config file which allows comments inside - Args: - jsonFile: string - Returns: - lJsonData: list, list of string data from jsonFile after removing comment(s). - ''' + # ''' + # Method: __removeComments loads json config file which allows comments inside + # Args: + # jsonFile: string + # Returns: + # lJsonData: list, list of string data from jsonFile after removing comment(s). + # ''' def __removeComments(self, jsonFile): jsonPath = '' if '/' in jsonFile: @@ -205,14 +212,14 @@ def __removeComments(self, jsonFile): lJsonData.append(line) return lJsonData, jsonPath - ''' - private __nestedParamHandler: This method handles the nested variable in param names or value - in updated json config file. - Args: - sInputStr: string - param name or value which contains nested variable - Returns: - sStrHandled: string - ''' + # ''' + # private __nestedParamHandler: This method handles the nested variable in param names or value + # in updated json config file. + # Args: + # sInputStr: string - param name or value which contains nested variable + # Returns: + # sStrHandled: string + # ''' def __nestedParamHandler(self, sInputStr): #globals().update(currentCfg) @@ -271,14 +278,14 @@ def __nestedParamHandler(self, sInputStr): sStrHandled = fullVariable return sStrHandled - ''' - private __updateAndReplaceNestedParam: this method replaces all nested params in key and value of Json object - Args: - oJson: dict - currentCfg: dict - Returns: - oJsonOut: dict - ''' + # ''' + # private __updateAndReplaceNestedParam: this method replaces all nested params in key and value of Json object + # Args: + # oJson: dict + # currentCfg: dict + # Returns: + # oJsonOut: dict + # ''' def __updateAndReplaceNestedParam(self, oJson, recursive=False): if bool(self.currentCfg) and not recursive: @@ -359,6 +366,7 @@ def jsonLoad(self, jFile, masterFile=True): Args: jFile: string, json file input + Returns: oJson: dict ''' @@ -392,4 +400,4 @@ def jsonLoad(self, jFile, masterFile=True): oJson = self.__updateAndReplaceNestedParam(oJson) # oJson['JsonPath'] = jsonPath # is JsonPath required? - return oJson \ No newline at end of file + return oJson diff --git a/JsonPreprocessor/JsonPreprocessor.pdf b/JsonPreprocessor/JsonPreprocessor.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0c0d77a6be62b74667c25290e3833e1a9daad7e5 GIT binary patch literal 228372 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

A$J`8h{Oq=F^$3k2uU?)Bd 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 z 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 F`F{&@d@KL} literal 0 HcmV?d00001 diff --git a/JsonPreprocessor/version.py b/JsonPreprocessor/version.py new file mode 100644 index 00000000..f5343d97 --- /dev/null +++ b/JsonPreprocessor/version.py @@ -0,0 +1,23 @@ +# ************************************************************************************************************** +# +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ************************************************************************************************************** +# +# Version and date of JsonPreprocessor +# +VERSION = "0.1.0" +VERSION_DATE = "29.06.2022" + diff --git a/README.rst b/README.rst index 3527fa21..488d2017 100644 --- a/README.rst +++ b/README.rst @@ -47,7 +47,7 @@ package documentation is located in 'doc/_build/'. Package Documentation --------------------- -A detailed documentation of the Json Preprocessor's package can be found here: `Json-Preprocessor.pdf `_ +A detailed documentation of the Json Preprocessor's package can be found here: `JsonPreprocessor.pdf `_ Feedback -------- diff --git a/config/CExtendedSetup.py b/additions/CExtendedSetup.py similarity index 54% rename from config/CExtendedSetup.py rename to additions/CExtendedSetup.py index 1c1a7867..00d770da 100644 --- a/config/CExtendedSetup.py +++ b/additions/CExtendedSetup.py @@ -18,23 +18,18 @@ # # CExtendedSetup.py # -# CM-CI1/ECA3-Queckenstedt +# XC-CT/ECA3-Queckenstedt # # Contains all functions to support the extended setup process. # # -------------------------------------------------------------------------------------------------------------- # -# 21.02.2022 / XC-CT/ECA3-Queckenstedt -# Added add_htmldoc_to_wheel() to support wheel based distribution -# -# 30.09.2021 / XC-CI1/ECA3-Queckenstedt -# Added wrapper for error messages -# -# Initial version 08/2021 +# 10.05.2022 # # -------------------------------------------------------------------------------------------------------------- import os, sys, platform, shlex, subprocess, shutil +import pypandoc import colorama as col col.init(autoreset=True) @@ -70,11 +65,11 @@ def __del__(self): # -------------------------------------------------------------------------------------------------------------- - def gen_doc(self): - """Executes sphinx-makeall.py + def genpackagedoc(self): + """Executes genpackagedoc.py """ - sPython = self.__oRepositoryConfig.Get('sPython') - sDocumentationBuilder = self.__oRepositoryConfig.Get('sDocumentationBuilder') + sPython = self.__oRepositoryConfig.Get('PYTHON') + sDocumentationBuilder = self.__oRepositoryConfig.Get('DOCUMENTATIONBUILDER') listCmdLineParts = [] listCmdLineParts.append(f"\"{sPython}\"") listCmdLineParts.append(f"\"{sDocumentationBuilder}\"") @@ -96,16 +91,58 @@ def gen_doc(self): return ERROR print() return nReturn - # eof def gen_doc(): + # eof def genpackagedoc(): + + # -------------------------------------------------------------------------------------------------------------- + + def convert_repo_readme(self): + """Converts the main repository README from 'rst' to 'md' format. + """ + + sReadMe_rst = self.__oRepositoryConfig.Get("README_RST") + if sReadMe_rst is None: + print() + printerror(f"'sReadMe_rst' is None") + print() + return ERROR + + sReadMe_md = self.__oRepositoryConfig.Get("README_MD") + if sReadMe_md is None: + print() + printerror(f"'sReadMe_md' is None") + print() + return ERROR + + if os.path.isfile(sReadMe_rst) is False: + print() + printerror(f"Missing readme file '{sReadMe_rst}'") + print() + return ERROR + + sFileContent = pypandoc.convert_file(sReadMe_rst, 'md') + hFile_md = open(sReadMe_md, "w", encoding="utf-8") + listFileContent = sFileContent.splitlines() + for sLine in listFileContent: + hFile_md.write(sLine + "\n") + hFile_md.close() + + print(f"File '{sReadMe_rst}'") + print("converted to") + print(f"'{sReadMe_md}'") + print() + + return SUCCESS + + # eof def convert_repo_readme(self): # -------------------------------------------------------------------------------------------------------------- def delete_previous_build(self): """Deletes folder containing previous builds of setup.py within the repository """ - sSetupBuildFolder = self.__oRepositoryConfig.Get('sSetupBuildFolder') - sSetupDistFolder = self.__oRepositoryConfig.Get('sSetupDistFolder') - sEggInfoFolder = self.__oRepositoryConfig.Get('sEggInfoFolder') + sSetupBuildFolder = self.__oRepositoryConfig.Get('SETUPBUILDFOLDER') + sSetupDistFolder = self.__oRepositoryConfig.Get('SETUPDISTFOLDER') + sEggInfoFolder = self.__oRepositoryConfig.Get('EGGINFOFOLDER') if os.path.isdir(sSetupBuildFolder) is True: print(f"* Deleting '{sSetupBuildFolder}'") try: @@ -141,7 +178,7 @@ def delete_previous_build(self): def delete_previous_installation(self): """Deletes previous package installation folder within the Python installation """ - sInstalledPackageFolder = self.__oRepositoryConfig.Get('sInstalledPackageFolder') + sInstalledPackageFolder = self.__oRepositoryConfig.Get('INSTALLEDPACKAGEFOLDER') if os.path.isdir(sInstalledPackageFolder) is True: print(f"* Deleting '{sInstalledPackageFolder}'") try: @@ -151,102 +188,11 @@ def delete_previous_installation(self): printexception(str(ex)) print() return ERROR - sInstalledPackageDocFolder = self.__oRepositoryConfig.Get('sInstalledPackageDocFolder') - if os.path.isdir(sInstalledPackageDocFolder) is True: - print(f"* Deleting '{sInstalledPackageDocFolder}'") - try: - shutil.rmtree(sInstalledPackageDocFolder) - except Exception as ex: - print() - printexception(str(ex)) - print() - return ERROR print() return SUCCESS # eof def delete_previous_installation(): - # -------------------------------------------------------------------------------------------------------------- - - def add_htmldoc_to_installation(self): - """Adds the package documentation in HTML format to the Python onstallation - """ - sHTMLOutputFolder = self.__oRepositoryConfig.Get('sHTMLOutputFolder') - sInstalledPackageDocFolder = self.__oRepositoryConfig.Get('sInstalledPackageDocFolder') - if os.path.isdir(sHTMLOutputFolder) is False: - print() - printerror(f"Error: Missing html output folder '{sHTMLOutputFolder}'") - print() - return ERROR - shutil.copytree(sHTMLOutputFolder, sInstalledPackageDocFolder) - if os.path.isdir(sInstalledPackageDocFolder) is False: - print() - printerror(f"Error: html documentation not copied to package installation folder '{sInstalledPackageDocFolder}'") - print() - return ERROR - print(COLBY + f"Folder '{sHTMLOutputFolder}'") - print(COLBY + "copied to") - print(COLBY + f"'{sInstalledPackageDocFolder}'") - print() - return SUCCESS - # eof def add_htmldoc_to_installation(): - - # -------------------------------------------------------------------------------------------------------------- - - def add_htmldoc_to_wheel(self): - """Adds the package documentation in HTML format to the wheel folder inside build - """ - sHTMLOutputFolder = self.__oRepositoryConfig.Get('sHTMLOutputFolder') - sSetupBuildFolder = self.__oRepositoryConfig.Get('sSetupBuildFolder') - sPackageName = self.__oRepositoryConfig.Get('sPackageName') - if os.path.isdir(sHTMLOutputFolder) is False: - print() - printerror(f"Error: Missing html output folder '{sHTMLOutputFolder}'") - print() - return ERROR - - # The desired destination path for the documentation is: - # \bdist.win-amd64\wheel\\doc - # with is already available by 'sSetupBuildFolder' in CConfig. - # I am not convinced that it's a good idea to have hard coded parts like 'bdist.win-amd64' within a path here. - # Therefore we search recursively the file system for a subfolder with name 'wheel/'. And that's it! - sTargetFolder = f"wheel/{sPackageName}" - sWheelDocDestPath = None - bBreak = False - for sRootFolder, listFolders, listFiles in os.walk(sSetupBuildFolder): - for sFolder in listFolders: - sPath = os.path.join(sRootFolder, sFolder) - sPathMod = sPath.replace("\\", "/") - if sPathMod.endswith(sTargetFolder): - sWheelDocDestPath = f"{sPathMod}/doc" - bBreak = True - break # for sFolder in listFolders: - # eof if sPathMod.endswith(sTargetFolder): - # eof for sFolder in listFolders: - if bBreak is True: - break # walk - # eof for sRootFolder, listFolders, listFiles in os.walk(sSetupBuildFolder): - - if sWheelDocDestPath is None: - print() - printerror(f"Error: Not able to find '{sTargetFolder}' inside {sSetupBuildFolder}") - print() - return ERROR - - shutil.copytree(sHTMLOutputFolder, sWheelDocDestPath) - if os.path.isdir(sWheelDocDestPath) is False: - print() - printerror(f"Error: html documentation not copied to local wheel folder '{sWheelDocDestPath}'") - print() - return ERROR - - print(COLBY + f"Folder '{sHTMLOutputFolder}'") - print(COLBY + "copied to") - print(COLBY + f"'{sWheelDocDestPath}'") - print() - return SUCCESS - # eof def add_htmldoc_to_wheel(): - # eof class CExtendedSetup(): # -------------------------------------------------------------------------------------------------------------- diff --git a/additions/PythonExtensionsCollection/File/CFile.py b/additions/PythonExtensionsCollection/File/CFile.py new file mode 100644 index 00000000..320424c6 --- /dev/null +++ b/additions/PythonExtensionsCollection/File/CFile.py @@ -0,0 +1,1072 @@ +# ************************************************************************************************************** +# +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ************************************************************************************************************** +# +# CFile.py +# +# XC-CT/ECA3-Queckenstedt +# +# 27.06.2022 +# +# ************************************************************************************************************** + +# -- import standard Python modules +import os, shutil, platform + +# -- import Bosch Python modules +from PythonExtensionsCollection.String.CString import CString + +# ************************************************************************************************************** + +class enFileStatiType: + """ +The class ``enFileStatiType`` defines the sollowing file states: + +* ``closed`` +* ``openedforwriting`` +* ``openedforappending`` +* ``openedforreading`` + """ + closed = "closed" + openedforwriting = "openedforwriting" + openedforappending = "openedforappending" + openedforreading = "openedforreading" + +# -------------------------------------------------------------------------------------------------------------- + +class CFile(object): + """ +The class ``CFile`` provides a small set of file functions with extended parametrization (like switches +defining if a file is allowed to be overwritten or not). + +Most of the functions at least returns ``bSuccess`` and ``sResult``. + +* ``bSuccess`` is ``True`` in case of no error occurred. +* ``bSuccess`` is ``False`` in case of an error occurred. +* ``bSuccess`` is ``None`` in case of a very fatal error occurred (exceptions). + +* ``sResult`` contains details about what happens during computation. + +Every instance of CFile handles one single file only and forces exclusive access to this file. + +It is not possible to create an instance of this class with a file that is already in use by another instance. + +It is also not possible to use ``CopyTo`` or ``MoveTo`` to overwrite files that are already in use by another instance. +This makes the file handling more save against access violations. + """ + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def __init__(self, sFile=None): + self.__sFile = CString.NormalizePath(sFile) + self.__oFileHandle = None + self.__oFileStatus = enFileStatiType.closed + self.__sLastDestination = None + + try: + CFile.__listFilesInUse + except: + CFile.__listFilesInUse = [] + + # exclusive access is required (checked by self.__bIsFreeToUse; relevant for destination in CopyTo and MoveTo) + if self.__sFile in CFile.__listFilesInUse: + raise Exception(f"The file '{self.__sFile}' is already in use by another CFile instance.") + else: + CFile.__listFilesInUse.append(self.__sFile) + + # eof def __init__(self, sFile=None): + + def __del__(self): + self.Close() + if self.__sFile in CFile.__listFilesInUse: + CFile.__listFilesInUse.remove(self.__sFile) + + # eof def __del__(self): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def __bIsFreeToUse(self, sFile=None): + """ +Checks if the file ``sFile`` is free to use, that means: not used by another instance of ``CFile``. + """ + + bIsFreeToUse = False # init + if sFile is None: + bIsFreeToUse = False # error handling + else: + if sFile in CFile.__listFilesInUse: + bIsFreeToUse = False + else: + bIsFreeToUse = True + return bIsFreeToUse + + # eof def __bIsFreeToUse(self, sFile=None): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def __OpenForWriting(self): + """ +Opens a text file for writing. + +Returns ``bSuccess`` and ``sResult`` (feedback). + """ + + sMethod = "CFile.__OpenForWriting" + + if self.__sFile is None: + bSuccess = False + sResult = "self.__sFile is None; please provide path and name of a file when creating a CFile object." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + bSuccess, sResult = self.Close() + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + try: + self.__oFileHandle = open(self.__sFile, "w", encoding="utf-8") + self.__oFileStatus = enFileStatiType.openedforwriting + bSuccess = True + sResult = f"File '{self.__sFile}' is open for writing" + except Exception as reason: + self.Close() + bSuccess = None + sResult = f"Not possible to open file '{self.__sFile}' for writing.\nReason: " + str(reason) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + + return bSuccess, sResult + + # eof def __OpenForWriting(self): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def __OpenForAppending(self): + """ +Opens a text file for appending. + +Returns ``bSuccess`` and ``sResult`` (feedback). + """ + + sMethod = "CFile.__OpenForAppending" + + if self.__sFile is None: + bSuccess = False + sResult = "self.__sFile is None; please provide path and name of a file when creating a CFile object." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + bSuccess, sResult = self.Close() + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + try: + self.__oFileHandle = open(self.__sFile, "a", encoding="utf-8") + self.__oFileStatus = enFileStatiType.openedforappending + bSuccess = True + sResult = f"File '{self.__sFile}' is open for appending" + except Exception as reason: + self.Close() + bSuccess = None + sResult = f"Not possible to open file '{self.__sFile}' for appending.\nReason: " + str(reason) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + + return bSuccess, sResult + + # eof def __OpenForAppending(self): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def __OpenForReading(self): + """ +Opens a text file for reading. + +Returns ``bSuccess`` and ``sResult`` (feedback). + """ + + sMethod = "CFile.__OpenForReading" + + if self.__sFile is None: + bSuccess = False + sResult = "self.__sFile is None; please provide path and name of a file when creating a CFile object." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + bSuccess, sResult = self.Close() + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + try: + self.__oFileHandle = open(self.__sFile, "r", encoding="utf-8") + self.__oFileStatus = enFileStatiType.openedforreading + bSuccess = True + sResult = f"File '{self.__sFile}' is open for reading" + except Exception as reason: + self.Close() + bSuccess = None + sResult = f"Not possible to open file '{self.__sFile}' for reading.\nReason: " + str(reason) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + + return bSuccess, sResult + + # eof def __OpenForReading(self): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def Close(self): + """ +Closes the opened file. + +**Arguments:** + +(no args) + +**Returns:** + +* ``bSuccess`` + + / *Type*: bool / + + Indicates if the computation of the method was successful or not. + +* ``sResult`` + + / *Type*: str / + + The result of the computation of the method. + """ + sMethod = "CFile.Close" + + if self.__oFileHandle is not None: + try: + self.__oFileHandle.flush() + self.__oFileHandle.close() + bSuccess = True + sResult = f"File '{self.__sFile}' closed" + except Exception as reason: + bSuccess = None + sResult = f"Exception while closing file '{self.__sFile}'.\nReason: " + str(reason) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + self.__oFileHandle = None + else: + bSuccess = True + sResult = "Done" + + self.__oFileStatus = enFileStatiType.closed + + return bSuccess, sResult + + # eof def Close(self): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def Delete(self, bConfirmDelete=True): + """ +Deletes the current file. + +**Arguments:** + +* ``bConfirmDelete`` + + / *Condition*: optional / *Type*: bool / *Default*: True / + + Defines if it will be handled as error if the file does not exist. + + If ``True``: If the file does not exist, the method indicates an error (``bSuccess = False``). + + If ``False``: It doesn't matter if the file exists or not. + +**Returns:** + +* ``bSuccess`` + + / *Type*: bool / + + Indicates if the computation of the method was successful or not. + +* ``sResult`` + + / *Type*: str / + + The result of the computation of the method. + """ + + sMethod = "CFile.Delete" + + if self.__sFile is None: + bSuccess = False + sResult = "self.__sFile is None; please provide path and name of a file when creating a CFile object." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + if os.path.isfile(self.__sFile) is False: + if bConfirmDelete is True: + bSuccess = False + else: + bSuccess = True + sResult = f"Nothing to delete. The file '{self.__sFile}' does not exist." + return bSuccess, sResult + + bSuccess, sResult = self.Close() + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + try: + os.remove(self.__sFile) + bSuccess = True + sResult = f"File '{self.__sFile}' deleted." + except Exception as reason: + bSuccess = None + sResult = f"Exception while deleting file '{self.__sFile}'.\nReason: " + str(reason) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + + return bSuccess, sResult + + # eof def Delete(self, bConfirmDelete=True): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def __PrepareOutput(self, Content=""): + """ +Helper for ``Write`` and ``Append`` (consideration of composite data types). + +Returns a list of strings (that will be written to file). + """ + + listOut = [] + + if type(Content) == list: + for element in Content: + listOut.append(str(element)) + elif type(Content) == tuple: + for element in Content: + listOut.append(str(element)) + elif type(Content) == set: + for element in Content: + listOut.append(str(element)) + elif type(Content) == dict: + listKeys = Content.keys() + nRJust = 0 + for key in listKeys: + sKey = str(key) # because also numerical values can be keys + if len(sKey) > nRJust: + nRJust = len(sKey) + for key in listKeys: + sKey = str(key) # because also numerical values can be keys + sOut = sKey.rjust(nRJust, ' ') + " : " + str(Content[key]) + listOut.append(sOut) + elif str(type(Content)).lower().find('dotdict') >=0: + try: + listKeys = Content.keys() + nRJust = 0 + for key in listKeys: + sKey = str(key) # because also numerical values can be keys + if len(sKey) > nRJust: + nRJust = len(sKey) + for key in listKeys: + sKey = str(key) # because also numerical values can be keys + sOut = sKey.rjust(nRJust, ' ') + " : " + str(Content[key]) + listOut.append(sOut) + except Exception as reason: + listOut.append(str(Content)) + else: + listOut.append(str(Content)) + + return listOut + + # eof def __PrepareOutput(self, Content=""): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def Write(self, Content="", nVSpaceAfter=0, sPrefix=None, bToScreen=False): + """ +Writes the content of a variable ``Content`` to file. + +**Arguments:** + +* ``Content`` + + / *Condition*: required / *Type*: one of: str, list, tuple, set, dict, dotdict / + + If ``Content`` is not a string, the ``Write`` method resolves the data structure before writing the content to file. + +* ``nVSpaceAfter`` + + / *Condition*: optional / *Type*: int / *Default*: 0 / + + Adds vertical space ``nVSpaceAfter`` (= number of blank lines) after ``Content``. + +* ``sPrefix`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + `sPrefix`` is added to every line of output (in case of ``sPrefix`` is not ``None``). + +* ``bToScreen`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + Prints ``Content`` also to screen (in case of ``bToScreen`` is ``True``). + +**Returns:** + +* ``bSuccess`` + + / *Type*: bool / + + Indicates if the computation of the method was successful or not. + +* ``sResult`` + + / *Type*: str / + + The result of the computation of the method. + """ + + sMethod = "CFile.Write" + + if self.__oFileStatus != enFileStatiType.openedforwriting: + bSuccess, sResult = self.__OpenForWriting() + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + listOut = self.__PrepareOutput(Content) + + for nCnt in range(nVSpaceAfter): + listOut.append("") + + if bToScreen is True: + for sOut in listOut: + if ( (sPrefix is not None) and (sOut != '') ): + sOut = f"{sPrefix}{sOut}" + print(sOut) + + bSuccess = True + sResult = "Done" + try: + for sOut in listOut: + if ( (sPrefix is not None) and (sOut != '') ): + sOut = f"{sPrefix}{sOut}" + self.__oFileHandle.write(sOut + "\n") + except Exception as reason: + bSuccess = None + sResult = f"Not possible to write to file '{self.__sFile}'.\nReason: " + str(reason) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + + return bSuccess, sResult + + # eof def Write(self, Content="", nVSpaceAfter=0, sPrefix=None, bToScreen=False): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def Append(self, Content="", nVSpaceAfter=0, sPrefix=None, bToScreen=False): + """ +Appends the content of a variable ``Content`` to file. + +**Arguments:** + +* ``Content`` + + / *Condition*: required / *Type*: one of: str, list, tuple, set, dict, dotdict / + + If ``Content`` is not a string, the ``Write`` method resolves the data structure before writing the content to file. + +* ``nVSpaceAfter`` + + / *Condition*: optional / *Type*: int / *Default*: 0 / + + Adds vertical space ``nVSpaceAfter`` (= number of blank lines) after ``Content``. + +* ``sPrefix`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + `sPrefix`` is added to every line of output (in case of ``sPrefix`` is not ``None``). + +* ``bToScreen`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + Prints ``Content`` also to screen (in case of ``bToScreen`` is ``True``). + +**Returns:** + +* ``bSuccess`` + + / *Type*: bool / + + Indicates if the computation of the method was successful or not. + +* ``sResult`` + + / *Type*: str / + + The result of the computation of the method. + """ + sMethod = "CFile.Append" + + if self.__oFileStatus != enFileStatiType.openedforappending: + bSuccess, sResult = self.__OpenForAppending() + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + listOut = self.__PrepareOutput(Content) + + for nCnt in range(nVSpaceAfter): + listOut.append("") + + if bToScreen is True: + for sOut in listOut: + if ( (sPrefix is not None) and (sOut != '') ): + sOut = f"{sPrefix}{sOut}" + print(sOut) + + bSuccess = True + sResult = "Done" + try: + for sOut in listOut: + if ( (sPrefix is not None) and (sOut != '') ): + sOut = f"{sPrefix}{sOut}" + self.__oFileHandle.write(sOut + "\n") + except Exception as reason: + bSuccess = None + sResult = f"Not possible to append to file '{self.__sFile}'.\nReason: " + str(reason) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + + return bSuccess, sResult + + # eof def Append(self, Content="", nVSpaceAfter=0, sPrefix=None, bToScreen=False): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def ReadLines(self, + bCaseSensitive = True, + bSkipBlankLines = False, + sComment = None, + sStartsWith = None, + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = None, + sContainsNot = None, + sInclRegEx = None, + sExclRegEx = None, + bLStrip = False, + bRStrip = True, + bToScreen = False): + """ +Reads content from current file. Returns an array of lines together with ``bSuccess`` and ``sResult`` (feedback). + +The method takes care of opening and closing the file. The complete file content is read by ``ReadLines`` in one step, +but with the help of further parameters it is possible to reduce the content by including and excluding lines. + +The logical join of all filter is: ``AND``. + +**Arguments:** + +* ``bCaseSensitive`` + + / *Condition*: optional / *Type*: bool / *Default*: True / + + * If ``True``, the standard filters work case sensitive, otherwise not. + * This has no effect to the regular expression based filters ``sInclRegEx`` and ``sExclRegEx``. + +* ``bSkipBlankLines`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + If ``True``, blank lines will be skipped, otherwise not. + +* ``sComment`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + In case of a line starts with the string ``sComment``, this line is skipped. + +* ``sStartsWith`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + * The criterion of this filter is fulfilled in case of the input string starts with the string ``sStartsWith`` + * More than one string can be provided (semicolon separated; logical join: ``OR``) + +* ``sEndsWith`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + * The criterion of this filter is fulfilled in case of the input string ends with the string ``sEndsWith`` + * More than one string can be provided (semicolon separated; logical join: ``OR``) + +* ``sStartsNotWith`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + * The criterion of this filter is fulfilled in case of the input string starts not with the string ``sStartsNotWith`` + * More than one string can be provided (semicolon separated; logical join: ``AND``) + +* ``sEndsNotWith`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + * The criterion of this filter is fulfilled in case of the input string ends not with the string ``sEndsNotWith`` + * More than one string can be provided (semicolon separated; logical join: ``AND``) + +* ``sContains`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + * The criterion of this filter is fulfilled in case of the input string contains the string ``sContains`` at any position + * More than one string can be provided (semicolon separated; logical join: ``OR``) + +* ``sContainsNot`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + * The criterion of this filter is fulfilled in case of the input string does **not** contain the string ``sContainsNot`` at any position + * More than one string can be provided (semicolon separated; logical join: ``AND``) + +* ``sInclRegEx`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + * *Include* filter based on regular expressions (consider the syntax of regular expressions!) + * The criterion of this filter is fulfilled in case of the regular expression ``sInclRegEx`` matches the input string + * Leading and trailing blanks within the input string are considered + * ``bCaseSensitive`` has no effect + * A semicolon separated list of several regular expressions is **not** supported + +* ``sExclRegEx`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + * *Exclude* filter based on regular expressions (consider the syntax of regular expressions!) + * The criterion of this filter is fulfilled in case of the regular expression ``sExclRegEx`` does **not** match the input string + * Leading and trailing blanks within the input string are considered + * ``bCaseSensitive`` has no effect + * A semicolon separated list of several regular expressions is **not** supported + +* ``bLStrip`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + If ``True``, leading spaces are removed from line before the filters are used, otherwise not. + +* ``bRStrip`` + + / *Condition*: optional / *Type*: bool / *Default*: True / + + If ``True``, trailing spaces are removed from line before the filters are used, otherwise not. + +* ``bToScreen`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + If ``True``, the content read from file is also printed to screen, otherwise not. + """ + + sMethod = "CFile.ReadLines" + + listLines = [] + + if os.path.isfile(self.__sFile) is False: + bSuccess = False + sResult = f"The file '{self.__sFile}' does not exist." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return listLines, bSuccess, sResult + + # !!! independend from: self.__oFileStatus != enFileStatiType.openedforreading: !!! + # Reason: Repeated call of ReadLines needs to have the read pointer at the beginning of the file. + bSuccess, sResult = self.__OpenForReading() + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return listLines, bSuccess, sResult + + try: + sFileContent = self.__oFileHandle.read() + except Exception as reason: + bSuccess = None + sResult = f"Not possible to read from file '{self.__sFile}'.\nReason: " + str(reason) + return listLines, bSuccess, sResult + + bSuccess, sResult = self.Close() + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return listLines, bSuccess, sResult + + listFileContent = sFileContent.splitlines() # in opposite to readlines this is OS independend! + + for sLine in listFileContent: + if CString.StringFilter(sString = sLine, + bCaseSensitive = bCaseSensitive, + bSkipBlankStrings = bSkipBlankLines, + sComment = sComment, + sStartsWith = sStartsWith, + sEndsWith = sEndsWith, + sStartsNotWith = sStartsNotWith, + sEndsNotWith = sEndsNotWith, + sContains = sContains, + sContainsNot = sContainsNot, + sInclRegEx = sInclRegEx, + sExclRegEx = sExclRegEx, + bDebug = False) is True: + if bLStrip is True: + sLine = sLine.lstrip(" \t\r\n") + + if bRStrip is True: + sLine = sLine.rstrip(" \t\r\n") + + if bToScreen is True: + print(sLine) + + listLines.append(sLine) + + # eof for sLine in listFileContent: + + del listFileContent + + nNrOfLines = len(listLines) + + bSuccess = True + sResult = f"Read {nNrOfLines} lines from '{self.__sFile}'." + return listLines, bSuccess, sResult + + # eof def ReadLines(...) + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def GetFileInfo(self): + """ +Returns the following informations about the file (encapsulated within a dictionary ``dFileInfo``): + +**Returns:** + +* Key ``sFile`` + + / *Type*: str / + + Path and name of current file + + +* Key ``bFileIsExisting`` + + / *Type*: bool / + + ``True`` if file is existing, otherwise ``False`` + +* Key ``sFileName`` + + / *Type*: str / + + The name of the current file (incl. extension) + +* Key ``sFileExtension`` + + / *Type*: str / + + The extension of the current file + +* Key ``sFileNameOnly`` + + / *Type*: str / + + The pure name of the current file (without extension) + +* Key ``sFilePath`` + + / *Type*: str / + + The the path to current file + +* Key ``bFilePathIsExisting`` + + / *Type*: bool / + + ``True`` if file path is existing, otherwise ``False`` + """ + + sMethod = "CFile.GetFileInfo" + + dFileInfo = {} + dFileInfo['sFile'] = None + dFileInfo['bFileIsExisting'] = None + dFileInfo['sFileName'] = None + dFileInfo['sFileExtension'] = None + dFileInfo['sFileNameOnly'] = None + dFileInfo['sFilePath'] = None + dFileInfo['bFilePathIsExisting'] = None + + if self.__sFile is None: + return None + + dFileInfo['sFile'] = self.__sFile + dFileInfo['bFileIsExisting'] = os.path.isfile(self.__sFile) + + sFileName = os.path.basename(self.__sFile) + dFileInfo['sFileName'] = sFileName + + sFileExtension = "" + sFileNameOnly = "" + listParts = sFileName.split('.') + if len(listParts) > 1: + sFileExtension = listParts[len(listParts)-1] + sFileNameOnly = sFileName[:-len(sFileExtension)-1] + else: + sFileExtension = "" + sFileNameOnly = sFileName + + dFileInfo['sFileExtension'] = sFileExtension + dFileInfo['sFileNameOnly'] = sFileNameOnly + dFileInfo['sFilePath'] = os.path.dirname(self.__sFile) + dFileInfo['bFilePathIsExisting'] = os.path.isdir(dFileInfo['sFilePath']) + + return dFileInfo + + # eof def GetFileInfo(self): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def CopyTo(self, sDestination=None, bOverwrite=False): + """ +Copies the current file to ``sDestination``, that can either be a path without file name or a path together with a file name. + +In case of the destination file already exists and ``bOverwrite`` is ``True``, than the destination file will be overwritten. + +In case of the destination file already exists and ``bOverwrite`` is ``False`` (default), than the destination file will not be overwritten +and ``CopyTo`` returns ``bSuccess = False``. + +**Arguments:** + +* ``sDestination`` + + / *Condition*: required / *Type*: string / + + The path to destination file (either incl. file name or without file name) + +* ``bOverwrite`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + * In case of the destination file already exists and ``bOverwrite`` is ``True``, than the destination file will be overwritten. + * In case of the destination file already exists and ``bOverwrite`` is ``False`` (default), than the destination file will not be overwritten + and ``CopyTo`` returns ``bSuccess = False``. + +**Returns:** + +* ``bSuccess`` + + / *Type*: bool / + + Indicates if the computation of the method was successful or not. + +* ``sResult`` + + / *Type*: str / + + The result of the computation of the method. + """ + sMethod = "CFile.CopyTo" + + if self.__sFile is None: + bSuccess = False + sResult = "self.__sFile is None; please provide path and name of a file when creating a CFile object." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + if os.path.isfile(self.__sFile) is False: + bSuccess = False + sResult = f"The file '{self.__sFile}' does not exist, therefore nothing can be copied." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + if sDestination is None: + bSuccess = False + sResult = "sDestination is None; please provide path and name of destination file. Or at least the destination path. In this case the file name will be taken over." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + sDestination = CString.NormalizePath(sDestination) + + bDeleteDestFile = False + + sDestFile = sDestination # default + + if os.path.isdir(sDestination) is True: + sFileName = os.path.basename(self.__sFile) + sDestFile = f"{sDestination}/{sFileName}" # file name in destination is required for: shutil.copyfile + + if self.__bIsFreeToUse(sDestFile) is False: + bSuccess = False + sResult = f"The destination file '{sDestFile}' is already in use by another CFile instance." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + self.__sLastDestination = sDestFile + + if os.path.isfile(sDestFile) is True: + # destination file already exists + if sDestFile == self.__sFile: + bSuccess = False + sResult = f"Source file and destination file are the same: '{self.__sFile}'. Therefore nothing to do." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + if bOverwrite is True: + bDeleteDestFile = True + else: + bSuccess = False + sResult = f"Not allowed to overwrite existing destination file '{sDestFile}'. Therefore nothing to do." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + else: + # destination file not yet exists + # (we assume here that the destination shall be a file because we already have figured out that the destination is not a folder) + # => we have to check if the path to the file exists + sDestFilePath = os.path.dirname(sDestFile) + if os.path.isdir(sDestFilePath) is True: + bDeleteDestFile = False + else: + bSuccess = False + sResult = f"The destination path '{sDestFilePath}' does not exist. The file '{self.__sFile}' cannot be copied." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + # eof else - if os.path.isfile(sDestFile) is True: + + # analysis done, now the action + + bSuccess, sResult = self.Close() + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + if bDeleteDestFile is True: + # To delete the destination file explicitely before executing any copy-function is an addon here in this library. + # The purpose is to be independend from the way the used copy function is handling existing destination files. + # But this makes only sense under Windows and not under Linux, because Windows is much more strict with access + # violations than Linux. Therefore we avoid such kind of additional steps in case of the platform is not Windows. + if platform.system() == "Windows": + try: + os.remove(sDestFile) + bSuccess = True + sResult = f"File '{sDestFile}' deleted." + except Exception as reason: + bSuccess = None + sResult = f"Exception while deleting destination file '{sDestFile}'.\nReason: " + str(reason) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + # eof if bDeleteDestFile is True: + + try: + shutil.copyfile(self.__sFile, sDestFile) + bSuccess = True + sResult = f"File '{self.__sFile}' copied to '{sDestFile}'." + except Exception as reason: + bSuccess = None + sResult = f"Exception while copying file '{self.__sFile}' to '{sDestFile}'.\nReason: " + str(reason) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + + return bSuccess, sResult + + # eof def CopyTo(self, sDestination=None, bOverwrite=False): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def MoveTo(self, sDestination=None, bOverwrite=False): + """ +Moves the current file to ``sDestination``, that can either be a path without file name or a path together with a file name. + +**Arguments:** + +* ``sDestination`` + + / *Condition*: required / *Type*: string / + + The path to destination file (either incl. file name or without file name) + +* ``bOverwrite`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + * In case of the destination file already exists and ``bOverwrite`` is ``True``, than the destination file will be overwritten. + * In case of the destination file already exists and ``bOverwrite`` is ``False`` (default), than the destination file will not be overwritten + and ``MoveTo`` returns ``bSuccess = False``. + +**Returns:** + +* ``bSuccess`` + + / *Type*: bool / + + Indicates if the computation was successful or not + +* ``sResult`` + + / *Type*: str / + + Contains details about what happens during computation + """ + sMethod = "CFile.MoveTo" + + bSuccess, sResult = self.CopyTo(sDestination, bOverwrite) + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + if os.path.isfile(self.__sLastDestination) is False: + # the copied file should exist at new location + bSuccess = None + sResult = f"Someting went wrong while copying the file '{self.__sFile}' to '{self.__sLastDestination}'. Aborting." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + else: + bSuccess, sResult = self.Delete() + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + bSuccess = True + sResult = f"File moved from '{self.__sFile}' to '{self.__sLastDestination}'" + return bSuccess, sResult + + # eof def MoveTo(self, sDestination=None, bOverwrite=False): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + +# eof class CFile(object): + +# ************************************************************************************************************** + + diff --git a/additions/PythonExtensionsCollection/File/__init__.py b/additions/PythonExtensionsCollection/File/__init__.py new file mode 100644 index 00000000..958420af --- /dev/null +++ b/additions/PythonExtensionsCollection/File/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/additions/PythonExtensionsCollection/Folder/CFolder.py b/additions/PythonExtensionsCollection/Folder/CFolder.py new file mode 100644 index 00000000..451c32f9 --- /dev/null +++ b/additions/PythonExtensionsCollection/Folder/CFolder.py @@ -0,0 +1,460 @@ +# ************************************************************************************************************** +# +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ************************************************************************************************************** +# +# CFolder.py +# +# XC-CT/ECA3-Queckenstedt +# +# 28.06.2022 +# +# ************************************************************************************************************** + +# -- import standard Python modules +import os, shutil, time, stat + +# -- import Bosch Python modules +from PythonExtensionsCollection.String.CString import CString + +# -------------------------------------------------------------------------------------------------------------- + +# little helper to delete folders containing files that are write protected +def rm_dir_readonly(func, path, excinfo): + """ +Calls ``os.chmod`` in case of ``shutil.rmtree`` (within ``Delete()``) throws an exception (making files writable). + """ + # print(f"{excinfo}") # debug only + os.chmod(path, stat.S_IWRITE) + func(path) + +# -------------------------------------------------------------------------------------------------------------- + +class CFolder(object): + """ +The class ``CFolder`` provides a small set of folder functions with extended parametrization (like switches +defining if a folder is allowed to be overwritten or not). + +Most of the functions at least returns ``bSuccess`` and ``sResult``. + +* ``bSuccess`` is ``True`` in case of no error occurred. +* ``bSuccess`` is ``False`` in case of an error occurred. +* ``bSuccess`` is ``None`` in case of a very fatal error occurred (exceptions). + +* ``sResult`` contains details about what happens during computation. + +Every instance of CFolder handles one single folder only and forces exclusive access to this folder. + +It is not possible to create an instance of this class with a folder that is already in use by another instance. + +The constructor of ``CFolder`` requires the input parameter ``sFolder``, that is the path and the name of a folder +that is handled by the current class instance. + """ + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def __init__(self, sFolder=None): + self.__sFolder = CString.NormalizePath(sFolder) + + try: + CFolder.__listFoldersInUse + except: + CFolder.__listFoldersInUse = [] + + # exclusive access is required (checked by self.__bIsFreeToUse; relevant for destination in CopyTo and MoveTo) + if self.__sFolder in CFolder.__listFoldersInUse: + raise Exception(f"The folder '{self.__sFolder}' is already in use by another CFolder instance.") + else: + CFolder.__listFoldersInUse.append(self.__sFolder) + + # eof def __init__(self, sFolder=None): + + def __del__(self): + if self.__sFolder in CFolder.__listFoldersInUse: + CFolder.__listFoldersInUse.remove(self.__sFolder) + + # eof def __del__(self): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def __bIsFreeToUse(self, sFolder=None): + """ +Checks if the folder ``sFolder`` is free to use, that means: not used by another instance of ``CFolder``. + """ + + bIsFreeToUse = False # init + if sFolder is None: + bIsFreeToUse = False # error handling + else: + if sFolder in CFolder.__listFoldersInUse: + bIsFreeToUse = False + else: + bIsFreeToUse = True + return bIsFreeToUse + + # eof def __bIsFreeToUse(self, sFolder=None): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def __Delete(self, sFolder=None, bConfirmDelete=True): + """ +Deletes the folder ``sFolder``. + +**Arguments:** + +* ``sFolder`` + + / *Condition*: required / *Type*: str / + + Path and name of folder to be deleted + +* ``bConfirmDelete`` + + / *Condition*: optional / *Type*: bool / *Default*: True / + + Defines if it will be handled as error if the folder does not exist. + + If ``True``: If the folder does not exist, the method indicates an error (``bSuccess = False``). + + If ``False``: It doesn't matter if the folder exists or not. + +**Returns:** + +* ``bSuccess`` + + / *Type*: bool / + + Indicates if the computation of the method was successful or not. + +* ``sResult`` + + / *Type*: str / + + The result of the computation of the method. + """ + sMethod = "CFolder.__Delete" + + if sFolder is None: + bSuccess = False + sResult = "sFolder is None; please provide path and name of a folder when creating a CFolder object." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + if os.path.isdir(sFolder) is False: + sResult = f"Nothing to delete. The folder '{sFolder}' does not exist." + if bConfirmDelete is True: + bSuccess = False + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + else: + bSuccess = True + return bSuccess, sResult + # eof if os.path.isdir(sFolder) is False: + + bSuccess = False + sResult = "UNKNOWN" + nCntTries = 1 + nTriesMax = 4 + nDelay = 2 # sec + listResults = [] + while nCntTries <= nTriesMax: + try: + print(f"Trying to delete '{sFolder}'") + print() + shutil.rmtree(sFolder, ignore_errors=False, onerror=rm_dir_readonly) + except Exception as reason: + listResults.append(str(reason)) + if os.path.isdir(sFolder) is True: + sResult = f"({nCntTries}/{nTriesMax}) Problem with deleting the folder '{sFolder}'. Folder still present." + listResults.append(sResult) + time.sleep(nDelay) # delay before next try + else: + bSuccess = True + sResult = f"Folder '{sFolder}' deleted." + break + nCntTries = nCntTries + 1 + # eof while nCntTries <= nTriesMax: + + if bSuccess is False: + sResult = "\n".join(listResults) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + + return bSuccess, sResult + + # eof def __Delete(self, sFolder=None, bConfirmDelete=True): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def Delete(self, bConfirmDelete=True): + """ +Deletes the folder the current class instance contains. + +**Arguments:** + +* ``bConfirmDelete`` + + / *Condition*: optional / *Type*: bool / *Default*: True / + + Defines if it will be handled as error if the folder does not exist. + + If ``True``: If the folder does not exist, the method indicates an error (``bSuccess = False``). + + If ``False``: It doesn't matter if the folder exists or not. + +**Returns:** + +* ``bSuccess`` + + / *Type*: bool / + + Indicates if the computation of the method was successful or not. + +* ``sResult`` + + / *Type*: str / + + The result of the computation of the method. + """ + sMethod = "CFolder.Delete" + bSuccess, sResult = self.__Delete(self.__sFolder, bConfirmDelete) + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + # eof def Delete(self, bConfirmDelete=True): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def Create(self, bOverwrite=False, bRecursive=False): + """ +Creates the current folder ``sFolder``. + +**Arguments:** + +* ``bOverwrite`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + * In case of the folder already exists and ``bOverwrite`` is ``True``, than the folder will be deleted before creation. + * In case of the folder already exists and ``bOverwrite`` is ``False`` (default), than the folder will not be touched. + + In both cases the return value ``bSuccess`` is ``True`` - because the folder exists. + +* ``bRecursive`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + * In case of ``bRecursive`` is ``True``, than the complete destination path will be created (including all intermediate subfolders). + * In case of ``bRecursive`` is ``False``, than it is expected that the parent folder of the new folder already exists. + +**Returns:** + +* ``bSuccess`` + + / *Type*: bool / + + Indicates if the computation of the method was successful or not. + +* ``sResult`` + + / *Type*: str / + + The result of the computation of the method. + """ + sMethod = "CFolder.Create" + + if self.__sFolder is None: + bSuccess = False + sResult = "self.__sFolder is None; please provide path and name of a folder when creating a CFolder object." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + bCreateFolder = False + if os.path.isdir(self.__sFolder) is True: + if bOverwrite is True: + bSuccess, sResult = self.Delete() + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + bCreateFolder = True + else: + bSuccess = True + sResult = f"Folder '{self.__sFolder}' already exists." + return bSuccess, sResult + else: + bCreateFolder = True + + bSuccess = False + sResult = "UNKNOWN" + + if bCreateFolder is True: + nCntTries = 1 + nTriesMax = 3 + nDelay = 2 # sec + listResults = [] + while nCntTries <= nTriesMax: + try: + print(f"Trying to create '{self.__sFolder}'") + print() + if bRecursive is True: + os.makedirs(self.__sFolder) + else: + os.mkdir(self.__sFolder) + except Exception as reason: + listResults.append(str(reason)) + if os.path.isdir(self.__sFolder) is False: + sResult = f"({nCntTries}/{nTriesMax}) Problem with creating the folder '{self.__sFolder}'." + listResults.append(sResult) + time.sleep(nDelay) # delay before next try + else: + bSuccess = True + sResult = f"Folder '{self.__sFolder}' created." + break + nCntTries = nCntTries + 1 + # eof while nCntTries <= nTriesMax: + + if bSuccess is False: + sResult = "\n".join(listResults) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + + # eof if bCreateFolder is True: + + return bSuccess, sResult + + # eof def Create(self, bOverwrite=False, bRecursive=False): + + # -------------------------------------------------------------------------------------------------------------- + # TM*** + + def CopyTo(self, sDestination=None, bOverwrite=False): + """ +Copies the current folder to ``sDestination``, that has to be a path to a folder **within** the source folder will be copied to +(with it's original name), + +In case of the destination folder already exists and ``bOverwrite`` is ``True``, than the destination folder will be overwritten. + +In case of the destination folder already exists and ``bOverwrite`` is ``False`` (default), than the destination folder will not be overwritten +and ``CopyTo`` returns ``bSuccess = False``. + +**Arguments:** + +* ``sDestination`` + + / *Condition*: required / *Type*: string / + + The path to destination folder + +* ``bOverwrite`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + * In case of the destination folder already exists and ``bOverwrite`` is ``True``, than the destination folder will be overwritten. + * In case of the destination folder already exists and ``bOverwrite`` is ``False`` (default), than the destination folder will not be overwritten + and ``CopyTo`` returns ``bSuccess = False``. + +**Returns:** + +* ``bSuccess`` + + / *Type*: bool / + + Indicates if the computation of the method was successful or not. + +* ``sResult`` + + / *Type*: str / + + The result of the computation of the method. + """ + sMethod = "CFolder.CopyTo" + + if self.__sFolder is None: + bSuccess = False + sResult = "self.__sFolder is None; please provide path and name of a folder when creating a CFolder object." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + if os.path.isdir(self.__sFolder) is False: + bSuccess = False + sResult = f"The folder '{self.__sFolder}' does not exist, therefore nothing can be copied." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + if sDestination is None: + bSuccess = False + sResult = "sDestination is None; please provide a path to a destination folder." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + sDestination = CString.NormalizePath(sDestination) + + if os.path.isdir(sDestination) is False: + # the folder to be copied will be created within the destination folder, therefore we expect that the destination folder already exists + bSuccess = False + sResult = f"The destination folder '{sDestination}' does not exist." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + sSourceFolderName = os.path.basename(self.__sFolder) + sDestFolder = f"{sDestination}/{sSourceFolderName}" + + if sDestFolder == self.__sFolder: + bSuccess = False + sResult = f"Source folder and destination folder are the same: '{self.__sFolder}'. Therefore nothing to do." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + if self.__bIsFreeToUse(sDestFolder) is False: + bSuccess = False + sResult = f"The destination folder '{sDestFolder}' is already in use by another CFolder instance." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + + if os.path.isdir(sDestFolder) is True: + # destination folder already exists + if bOverwrite is True: + bSuccess, sResult = self.__Delete(sDestFolder) + if bSuccess is not True: + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + else: + bSuccess = False + sResult = f"Not allowed to overwrite existing destination folder '{sDestFolder}'. Therefore nothing to do." + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + return bSuccess, sResult + # eof if os.path.isdir(sDestFolder) is True: + + # analysis and preconditions done, now the action + + try: + shutil.copytree(self.__sFolder, sDestFolder) + bSuccess = True + sResult = "Folder copied from\n> '" + self.__sFolder + "'\nto\n> '" + sDestFolder + "'" + except Exception as reason: + bSuccess = None + sResult = str(reason) + sResult = CString.FormatResult(sMethod, bSuccess, sResult) + + return bSuccess, sResult + + # eof def CopyTo(self, sDestination=None, bOverwrite=False): + +# -------------------------------------------------------------------------------------------------------------- + + diff --git a/additions/PythonExtensionsCollection/Folder/__init__.py b/additions/PythonExtensionsCollection/Folder/__init__.py new file mode 100644 index 00000000..958420af --- /dev/null +++ b/additions/PythonExtensionsCollection/Folder/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/additions/PythonExtensionsCollection/String/CString.py b/additions/PythonExtensionsCollection/String/CString.py new file mode 100644 index 00000000..82aeb204 --- /dev/null +++ b/additions/PythonExtensionsCollection/String/CString.py @@ -0,0 +1,1165 @@ +# ************************************************************************************************************** +# +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ************************************************************************************************************** +# +# CString.py +# +# XC-CT/ECA3-Queckenstedt +# +# 02.06.2022 +# +# ************************************************************************************************************** + +# -- import standard Python modules +import os, ntpath, re + +# ************************************************************************************************************** + +class CString(object): + """ +The class ``CString`` contains some string computation methods like e.g. normalizing a path. + """ + + # -------------------------------------------------------------------------------------------------------------- + #TM*** + + def NormalizePath(sPath=None, bWin=False, sReferencePathAbs=None, bConsiderBlanks=False, bExpandEnvVars=True, bMask=True): + """ +Normalizes local paths, paths to local network resources and internet addresses + +**Arguments:** + +* ``sPath`` + + / *Condition*: required / *Type*: str / + + The path to be normalized + +* ``bWin`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + If ``True`` then returned path contains masked backslashes as separator, otherwise slashes + +* ``sReferencePathAbs`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + In case of ``sPath`` is relative and ``sReferencePathAbs`` (expected to be absolute) is given, then + the returned absolute path is a join of both input paths + +* ``bConsiderBlanks`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + If ``True`` then the returned path is encapsulated in quotes - in case of the path contains blanks + +* ``bExpandEnvVars`` + + / *Condition*: optional / *Type*: bool / *Default*: True / + + If ``True`` then in the returned path environment variables are resolved, otherwise not. + +* ``bMask`` + + / *Condition*: optional / *Type*: bool / *Default*: True (requires ``bWin=True``)/ + + * If ``bWin`` is ``True`` and ``bMask`` is ``True`` then the returned path contains masked backslashes as separator. + * If ``bWin`` is ``True`` and ``bMask`` is ``False`` then the returned path contains single backslashes only - this might be + required for applications, that are not able to handle masked backslashes. + * In case of ``bWin`` is ``False`` ``bMask`` has no effect. + +**Returns:** + +* ``sPath`` + + / *Type*: str / + + The normalized path (is ``None`` in case of ``sPath`` is ``None``) + """ + + if sPath is not None: + + # -- expand Windows environment variables + if bExpandEnvVars is True: + sPath = os.path.expandvars(sPath) + + # - remove leading and trailing horizontal space + sPath = sPath.strip(" \t\r\n") + + # - remove leading and trailing quotes + sPath = sPath.strip("\"'") + + # - remove once more leading and trailing horizontal space + # (after the removal of leading and trailing quotes further horizontal space might be there, that has to be removed; + # but further levels of nesting are not considered) + sPath = sPath.strip(" \t") + + if sPath == "": + return sPath + + # - remove trailing slash or backslash (maybe at end of path to folder) + sPath = sPath.rstrip("/\\") + + # -------------------------------------------------------------------------------------------------------------- + # consider internet addresses and local network resources + # -------------------------------------------------------------------------------------------------------------- + # -- local network resource / file server + # (prepare for Windows explorer) + # either (default) + # //server.com/abc/xyz + # or (with bWin=True); bMask must be False because \\server.com\\abc\\xyz is not allowed + # \\server.com\abc\xyz + # (=> user is allowed to select bWin but not bMask) + # + # -- local network resource / file server + # (prepare for web browser) + # after 'file://///' only single slashes allowed; bWin and bMask must be False + # file://///server.com/abc/xyz + # (=> user is NOT allowed to select bWin and bMask) + # + # -- internet address + # after server name only single slashes allowed; bWin and bMask must be False + # http://server.com/abc/xyz + # https://server.com/abc/xyz + # (=> user is NOT allowed to select bWin and bMask) + # + # - not allowed (=> this method must not return this format): + # http:\\server.com + # https:\\server.com + # -------------------------------------------------------------------------------------------------------------- + + sPathPrefix = None + + # In case there is any prefix, we remove this prefix, we compute the remaining part of the path separately, + # we also modify this prefix manually, and at the end we put the new prefix back to the path. + + if ( (sPath[:2] == "\\\\") or (sPath[:2] == "//") ): + sPath = sPath[2:] + if bWin is True: + sPathPrefix = "\\\\" + else: + sPathPrefix = "//" + bMask = False # !!! this overrules the input parameter value, because masked backslashes are not allowed in remaining path !!! + elif sPath[:10] == "file://///": # exactly this must be given; all other combinations of slashes and backslashes are not handled + sPath = sPath[10:] + sPathPrefix = "file://///" + bWin = False # !!! this overrules the input parameter value, because only single slashes allowed in remaining path !!! + bMask = False # !!! this overrules the input parameter value, because only single slashes allowed in remaining path !!! + elif ( (sPath[:7] == "http://") or (sPath[:7] == "http:\\\\") ): + sPath = sPath[7:] + sPathPrefix = "http://" + bWin = False # !!! this overrules the input parameter value, because only single slashes allowed in remaining path !!! + bMask = False # !!! this overrules the input parameter value, because only single slashes allowed in remaining path !!! + elif ( (sPath[:8] == "https://") or (sPath[:8] == "https:\\\\") ): + sPath = sPath[8:] + sPathPrefix = "https://" + bWin = False # !!! this overrules the input parameter value, because only single slashes allowed in remaining path !!! + bMask = False # !!! this overrules the input parameter value, because only single slashes allowed in remaining path !!! + else: + # Internet addresses and local network resources handled, now checking for relative paths: + # In case of sPath is a relative path AND an absolute reference path is provided + # merge them to an absolute path; without reference path use standard function to + # convert relative path to absolute path + if ( (sPath[0] != "%") and (sPath[0] != "$") ): + # If sPath starts with '%' or with '$' it is assumed that the path starts with an environment variable (Windows or Linux). + # But in this case 'os.path.isabs(sPath)' will not detect this to be an absolute path and will call + # 'sPath = os.path.abspath(sPath)' (depending on sReferencePathAbs). This will accidently merge + # the root path together with the path starting with the environment variable and cause invalid results. + if os.path.isabs(sPath) is False: + if sReferencePathAbs is not None: + sPath = os.path.join(sReferencePathAbs, sPath) + else: + sPath = os.path.abspath(sPath) + + # eof computation of sPathPrefix + + # - normalize the path (collapse redundant separators and up-level references) + # on Windows this converts slashes to backward slashes + # sPath = os.path.normpath(sPath) # under Linux this unfortunately keeps redundant separators (in opposite to Windows) + # -- alternative + sPath = ntpath.normpath(sPath) + + # - exchange single backslashes by single slashes (= partly we have to repair the outcome of normpath) + if bWin is False: + sPath = sPath.replace("\\", "/") + else: + if bMask is True: + sPath = sPath.replace("\\", "\\\\") + + # - restore the path prefix + if sPathPrefix is not None: + sPath = f"{sPathPrefix}{sPath}" + + # - consider blanks (prepare path for usage in Windows command line) + if bConsiderBlanks is True: + if sPath.find(" ") >= 0: + sPath = f"\"{sPath}\"" + + # eof if sPath is not None: + + return sPath + + # eof NormalizePath(sPath=None, bWin=False, sReferencePathAbs=None, bConsiderBlanks=False, bExpandEnvVars=True, bMask=True) + + # -------------------------------------------------------------------------------------------------------------- + #TM*** + + def DetectParentPath(sStartPath=None, sFolderName=None, sFileName=None): + """ +Computes the path to any parent folder inside a given path. Optionally DetectParentPath is able +to search for files inside the parent folder. + +**Arguments:** + +* ``sStartPath`` + + / *Condition*: required / *Type*: str / + + The path in which to search for a parent folder + +* ``sFolderName`` + + / *Condition*: required / *Type*: str / + + The name of the folder to search for within ``sStartPath``. It is possible to provide more than one folder name separated by semicolon + +* ``sFileName`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + The name of a file to search within the detected parent folder + +**Returns:** + +* ``sDestPath`` + + / *Type*: str / + + Path and name of parent folder found inside ``sStartPath``, ``None`` in case of ``sFolderName`` is not found inside ``sStartPath``. + In case of more than one parent folder is found ``sDestPath`` contains the first result and ``listDestPaths`` contains all results. + +* ``listDestPaths`` + + / *Type*: list / + + If ``sFolderName`` contains a single folder name this list contains only one element that is ``sDestPath``. + In case of ``FolderName`` contains a semicolon separated list of several folder names this list contains all found paths of the given folder names. + ``listDestPaths`` is ``None`` (and not an empty list!) in case of ``sFolderName`` is not found inside ``sStartPath``. + +* ``sDestFile`` + + / *Type*: str / + + Path and name of ``sFileName``, in case of ``sFileName`` is given and found inside ``listDestPaths``. + In case of more than one file is found ``sDestFile`` contains the first result and ``listDestFiles`` contains all results. + ``sDestFile`` is ``None`` in case of ``sFileName`` is ``None`` and also in case of ``sFileName`` is not found inside ``listDestPaths`` + (and therefore also in case of ``sFolderName`` is not found inside ``sStartPath``). + +* ``listDestFiles`` + + / *Type*: list / + + Contains all positions of ``sFileName`` found inside ``listDestPaths``. + + ``listDestFiles`` is ``None`` (and not an empty list!) in case of ``sFileName`` is ``None`` and also in case of ``sFileName`` + is not found inside ``listDestPaths`` (and therefore also in case of ``sFolderName`` is not found inside ``sStartPath``). + +* ``sDestPathParent`` + + / *Type*: str / + + The parent folder of ``sDestPath``, ``None`` in case of ``sFolderName`` is not found inside ``sStartPath`` (``sDestPath`` is ``None``). + """ + + sDestPath = None + listDestPaths = None + sDestFile = None + listDestFiles = None + sDestPathParent = None + + if sStartPath is None: + return sDestPath, listDestPaths, sDestFile, listDestFiles, sDestPathParent + + if sFolderName is None: + return sDestPath, listDestPaths, sDestFile, listDestFiles, sDestPathParent + + sStartPath = sStartPath.strip() + if sStartPath == "": + return sDestPath, listDestPaths, sDestFile, listDestFiles, sDestPathParent + + sFolderName = sFolderName.strip() + if sFolderName == "": + return sDestPath, listDestPaths, sDestFile, listDestFiles, sDestPathParent + + listSplit = sFolderName.split(';') + + listTopLevelFolders = [] + for sFolder in listSplit: + # removing duplicates + sFolder = sFolder.strip() + if sFolder != "": + if sFolder not in listTopLevelFolders: + listTopLevelFolders.append(sFolder) + # eof for sFolder in listSplit: + + nNrOfFolders = len(listTopLevelFolders) + sStartPath = CString.NormalizePath(sStartPath) + listLevels = sStartPath.split("/") + + listDestPaths = [] + + while len(listLevels) > 0: + # -- merging paths with folder names and search for existing combinations + sPathParent = "/".join(listLevels) + for sTLFolder in listTopLevelFolders: + sSubPath = sPathParent + "/" + sTLFolder + if os.path.isdir(sSubPath) is True: + listDestPaths.append(sSubPath) + if len(listTopLevelFolders) == len(listDestPaths): + # all folders found + break + else: + listLevels.pop() + # eof while len(listLevels) > 0: + + sDestPath = None + sDestPathParent = None + if len(listDestPaths) > 0: + # -- returning sDestPath and sDestPathParent related to first entry in list; just to return anything else than None + sDestPath = listDestPaths[0] + sDestPathParent = CString.NormalizePath(os.path.dirname(sDestPath)) + + # -- optionally searching also for a single file + # Input: file name + # Output: full path of file and list of full paths of files (!!! limited to 'listDestPaths' !!!) + + listDestFiles = [] + + if ( (sFileName is not None) and (len(listDestPaths) > 0) ): + for sDestPathToWalk in listDestPaths: + for sLocalRootPath, listFolderNames, listFileNames in os.walk(sDestPathToWalk): + for sFileNameTmp in listFileNames: + if sFileNameTmp == sFileName: + sFile = CString.NormalizePath(os.path.join(sLocalRootPath, sFileName)) + listDestFiles.append(sFile) + # eof for sLocalRootPath, listFolderNames, listFileNames in os.walk(sDestPathToWalk): + # eof for sDestPathToWalk in listDestPaths: + # eof if ( (sFileName is not None) and (len(listDestPaths) > 0) ): + + if len(listDestFiles) > 0: + listDestFiles.sort() + sDestFile = listDestFiles[0] # just to return anything else than None + + # -- preparing output (setting empty lists to None, to have unique criteria for results not available) + if listDestPaths is not None: + if len(listDestPaths) == 0: + listDestPaths = None + if listDestFiles is not None: + if len(listDestFiles) == 0: + listDestFiles = None + + return sDestPath, listDestPaths, sDestFile, listDestFiles, sDestPathParent + + # eof def DetectParentPath(sStartPath=None, sFolderName=None, sFileName=None): + + # -------------------------------------------------------------------------------------------------------------- + #TM*** + + def StringFilter(sString = None, + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = None, + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = None, + sContainsNot = None, + sInclRegEx = None, + sExclRegEx = None, + bDebug = False): + """ +During the computation of strings there might occur the need to get to know if this string fulfils certain criteria or not. +Such a criterion can e.g. be that the string contains a certain substring. Also an inverse logic might be required: +In this case the criterion is that the string does **not** contain this substring. + +It might also be required to combine several criteria to a final conclusion if in total the criterion for a string is fulfilled or not. +For example: The string must start with the string *prefix* and must also contain either the string *substring1* or the string *substring2* +but must also **not** end with the string *suffix*. + +This method provides a bunch of predefined filters that can be used singly or combined to come to a final conclusion if the string fulfils all criteria or not. + +The filters are divided into three different types: + +1. Filters that are interpreted as raw strings (called 'standard filters'; no wild cards supported) +2. Filters that are interpreted as regular expressions (called 'regular expression based filters'; the syntax of regular expressions has to be considered) +3. Boolean switches (e.g. indicating if also an empty string is accepted or not) + +The input string might contain leading and trailing blanks and tabs. This kind of horizontal space is removed from the input string +before the standard filters start their work (except the regular expression based filters). + +The regular expression based filters consider the original input string (including the leading and trailing space). + +The outcome is that in case of the leading and trailing space shall be part of the criterion, the regular expression based filters can be used only. + +It is possible to decide if the standard filters shall work case sensitive or not. This decision has no effect on the regular expression based filters. + +The regular expression based filters always work with the original input string that is not modified in any way. + +Except the regular expression based filters it is possible to provide more than one string for every standard filter (must be a semikolon separated list in this case). +A semicolon that shall be part of the search string, has to be masked in this way: ``\;``. + +This method returns a boolean value that is ``True`` in case of all criteria are fulfilled, and ``False`` in case of some or all of them are not fulfilled. + +The default value for all filters is ``None`` (except ``bSkipBlankStrings``). In case of a filter value is ``None`` this filter has no influence on the result. + +In case of all filters are ``None`` (default) the return value is ``True`` (except the string itself is ``None`` +or the string is empty and ``bSkipBlankStrings`` is ``True``). + +In case of the string is ``None``, the return value is ``False``, because nothing concrete can be done with ``None`` strings. + +Internally every filter has his own individual acknowledge that indicates if the criterion of this filter is fulfilled or not. + +The meaning of *criterion fulfilled* of a filter is that the filter supports the final return value ``bAck`` of this method with ``True``. + +The final return value ``bAck`` of this method is a logical join (``AND``) of all individual acknowledges (except ``bSkipBlankStrings`` and ``sComment``; +in case of their criteria are **not** fulfilled, immediately ``False`` is returned). + +Summarized: + +* Filters are used to define *criteria* +* The return value of this method provides the *conclusion* - indicating if all criteria are fulfilled or not + +The following filters are available: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**bSkipBlankStrings** + + * Like already mentioned above leading and trailing spaces are removed from the input string at the beginning + * In case of the result is an empty string and ``bSkipBlankStrings`` is ``True``, the method immediately returns ``False`` + and all other filters are ignored + +**sComment** + + * In case of the input string starts with the string ``sComment``, the method immediately returns ``False`` + and all other filters are ignored + * Leading blanks within the input string have no effect + * The decision also depends on ``bCaseSensitive`` + * The idea behind this decision is: Ignore a string that is commented out + +**sStartsWith** + + * The criterion of this filter is fulfilled in case of the input string starts with the string ``sStartsWith`` + * Leading blanks within the input string have no effect + * The decision also depends on ``bCaseSensitive`` + * More than one string can be provided (semicolon separated; logical join: ``OR``) + +**sEndsWith** + + * The criterion of this filter is fulfilled in case of the input string ends with the string ``sEndsWith`` + * Trailing blanks within the input string have no effect + * The decision also depends on ``bCaseSensitive`` + * More than one string can be provided (semicolon separated; logical join: ``OR``) + +**sStartsNotWith** + + * The criterion of this filter is fulfilled in case of the input string does **not** start with the string ``sStartsNotWith`` + * Leading blanks within the input string have no effect + * The decision also depends on ``bCaseSensitive`` + * More than one string can be provided (semicolon separated; logical join: ``AND``) + +**sEndsNotWith** + + * The criterion of this filter is fulfilled in case of the input string does **not** end with the string ``sEndsNotWith`` + * Trailing blanks within the input string have no effect + * The decision also depends on ``bCaseSensitive`` + * More than one string can be provided (semicolon separated; logical join: ``AND``) + +**sContains** + + * The criterion of this filter is fulfilled in case of the input string contains the string ``sContains`` at any position + * Leading and trailing blanks within the input string have no effect + * The decision also depends on ``bCaseSensitive`` + * More than one string can be provided (semicolon separated; logical join: ``OR``) + +**sContainsNot** + + * The criterion of this filter is fulfilled in case of the input string does **not** contain the string ``sContainsNot`` at any position + * Leading and trailing blanks within the input string have no effect + * The decision also depends on ``bCaseSensitive`` + * More than one string can be provided (semicolon separated; logical join: ``AND``) + +**sInclRegEx** + + * *Include* filter based on regular expressions (consider the syntax of regular expressions!) + * The criterion of this filter is fulfilled in case of the regular expression ``sInclRegEx`` matches the input string + * Leading and trailing blanks within the input string are considered + * ``bCaseSensitive`` has no effect + * A semicolon separated list of several regular expressions is **not** supported + +**sExclRegEx** + + * *Exclude* filter based on regular expressions (consider the syntax of regular expressions!) + * The criterion of this filter is fulfilled in case of the regular expression ``sExclRegEx`` does **not** match the input string + * Leading and trailing blanks within the input string are considered + * ``bCaseSensitive`` has no effect + * A semicolon separated list of several regular expressions is **not** supported + +**Further arguments:** + +* ``sString`` + + / *Condition*: required / *Type*: str / + + The input string that has to be investigated. + +* ``bCaseSensitive`` + + / *Condition*: optional / *Type*: bool / *Default*: True / + + If ``True``, the standard filters work case sensitive, otherwise not. + +* ``bDebug`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + If ``True``, additional output is printed to console (e.g. the decision of every single filter), otherwise not. + +**Returns:** + +* ``bAck`` + + / *Type*: bool / + + Final statement about the input string ``sString`` after filter computation + +Examples: +~~~~~~~~~ + +1. Returns ``True``: + +.. code:: python + + StringFilter(sString = "Speed is 25 beats per minute", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = "Sp", + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = "beats", + sContainsNot = None, + sInclRegEx = None, + sExclRegEx = None) + +2. Returns ``False``: + +.. code:: python + + StringFilter(sString = "Speed is 25 beats per minute", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = "Sp", + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = "minute", + sContains = "beats", + sContainsNot = None, + sInclRegEx = None, + sExclRegEx = None) + +3. Returns ``True``: + +.. code:: python + + StringFilter(sString = "Speed is 25 beats per minute", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = None, + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = None, + sContainsNot = "Beats", + sInclRegEx = None, + sExclRegEx = None) + +4. Returns ``True``: + +.. code:: python + + StringFilter(sString = "Speed is 25 beats per minute", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = None, + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = None, + sContainsNot = None, + sInclRegEx = r"\d{2}", + sExclRegEx = None) + +5. Returns ``False``: + +.. code:: python + + StringFilter(sString = "Speed is 25 beats per minute", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = "Speed", + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = None, + sContainsNot = None, + sInclRegEx = r"\d{3}", + sExclRegEx = None) + +6. Returns ``False``: + +.. code:: python + + StringFilter(sString = "Speed is 25 beats per minute", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = "Speed", + sEndsWith = "minute", + sStartsNotWith = "speed", + sEndsNotWith = None, + sContains = "beats", + sContainsNot = None, + sInclRegEx = r"\d{2}", + sExclRegEx = r"\d{2}") + +7. Returns ``False``: + +.. code:: python + + StringFilter(sString = " ", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = None, + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = None, + sContainsNot = None, + sInclRegEx = None, + sExclRegEx = None) + +8. Returns ``False``: + +.. code:: python + + StringFilter(sString = "# Speed is 25 beats per minute", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = "#", + sStartsWith = None, + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = "beats", + sContainsNot = None, + sInclRegEx = None, + sExclRegEx = None) + + +9. Returns ``False``: + +.. code:: python + + StringFilter(sString = " Alpha is not beta; and beta is not gamma ", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = None, + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = " Alpha ", + sContainsNot = None, + sInclRegEx = None, + sExclRegEx = None) + +Because blanks around search strings (here ``" Alpha "``) are considered, whereas the blanks around the input string are removed before computation. +Therefore ``" Alpha "`` cannot be found within the (shortened) input string. + + +10. This alternative solution returns ``True``: + +.. code:: python + + StringFilter(sString = " Alpha is not beta; and beta is not gamma ", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = None, + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = None, + sContainsNot = None, + sInclRegEx = r"\s{3}Alpha", + sExclRegEx = None) + + +11. Returns ``True``: + +.. code:: python + + StringFilter(sString = "Alpha is not beta; and beta is not gamma", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = None, + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = "beta; and", + sContainsNot = None, + sInclRegEx = None, + sExclRegEx = None) + +The meaning of ``"beta; and"`` is: The criterion is fulfilled in case of either ``"beta"`` or ``" and"`` can be found. That's ``True`` in this example - but this +has nothing to do with the fact, that also this string ``"beta; and"`` can be found. Here the semikolon is a separator character and therefore part of the syntax. + +A semicolon that shall be part of the search string, has to be masked with '``\;``'! + +The meaning of ``"beta\; not"`` in the following example is: The criterion is fulfilled in case of ``"beta; not"`` can be found. + +That's **not** ``True``. Therefore the method returns ``False``: + +.. code:: python + + StringFilter(sString = "Alpha is not beta; and beta is not gamma", + bCaseSensitive = True, + bSkipBlankStrings = True, + sComment = None, + sStartsWith = None, + sEndsWith = None, + sStartsNotWith = None, + sEndsNotWith = None, + sContains = r"beta\; not", + sContainsNot = None, + sInclRegEx = None, + sExclRegEx = None) + """ + + if sString is None: + return False # hard coded here; no separate filter for that decision + + # The original string 'sString' is used by regular expression filters sInclRegEx and sExclRegEx. + # The stripped string 'sStringStripped' is used by all other filters. + sStringStripped = sString.strip(" \t\r\n") + + # -- skipping blank strings or strings commented out; other filters will not be considered any more in this case + + if bSkipBlankStrings is True: + if sStringStripped == "": + return False + + if sComment is not None: + if sComment != "": + if bCaseSensitive is True: + if sStringStripped.startswith(sComment) is True: + return False + else: + if sStringStripped.upper().startswith(sComment.upper()) is True: + return False + + # -- consider further filters + # + # No filter set (= no criteria defined) => use this string (bAck is True). + # + # At least one filter set (except sExclRegEx), at least one set filter fits (except sExclRegEx) => use this string. + # Filter sExclRegEx is set and fits => skip this string (final veto). + # At least one filter does not fit (except sExclRegEx) => skip this string. + # + # All filters (except sExclRegEx) are include filter (bAck is True in case of all set filters fit, also the 'not' filters) + # The filter sExclRegEx is an exclude filter and has final veto right (can revoke the True from other filters). + # + # All filters (except sInclRegEx and sExclRegEx) are handled as 'raw strings': no wild cards, just strings, considering bCaseSensitive. + # The filters sInclRegEx and sExclRegEx are handled as regular expressions; bCaseSensitive is not considered here. + + # -- filter specific flags (containing the names of the criteria within their names) + bStartsWith = None + bEndsWith = None + bStartsNotWith = None + bEndsNotWith = None + bContains = None + bContainsNot = None + bInclRegEx = None + bExclRegEx = None + + # Meaning: + # - Flag is None : filter not set => filter has no effect + # - Flag is True : filter set => result: use the input string (from this single filter flag point of view) + # - Flag is False: filter set => result: do not use the input string (from this single filter flag point of view) + # The results of all flags will be merged at the end of this function to one final conclusion to use the input string + # (bAck is True) or not (bAck is False). + # Logical join between all set filters: AND + + # substitute for the masked filter separator '\n' (hopefully the input string does not contain this substitute) + sSeparatorSubstitute = "#|S#|E#|P#|A#|R#|A#|T#|O#|R#" + + # -- filter: starts with + # > several filter strings possible (separated by semicolon; logical join: OR) + if sStartsWith is not None: + if sStartsWith != "": + sStartsWithModified = sStartsWith.replace(r"\;", sSeparatorSubstitute) # replace the masked separator by a substitute separator + listStartsWith = [] + if sStartsWith.find(";") >= 0: + listParts = sStartsWithModified.split(";") + for sPart in listParts: + sPart = sPart.replace(sSeparatorSubstitute , ";") # recover the original version + listStartsWith.append(sPart) + else: + sStartsWithModified = sStartsWith.replace(r"\;", ";") # convert to unmasked version + listStartsWith.append(sStartsWithModified) + + bStartsWith = False + for sStartsWith in listStartsWith: + if bCaseSensitive is True: + if sStringStripped.startswith(sStartsWith) is True: + bStartsWith = True + break + else: + if sStringStripped.upper().startswith(sStartsWith.upper()) is True: + bStartsWith = True + break + + # -- filter: ends with + # > several filter strings possible (separated by semicolon; logical join: OR) + if sEndsWith is not None: + if sEndsWith != "": + sEndsWithModified = sEndsWith.replace(r"\;", sSeparatorSubstitute) # replace the masked separator by a substitute separator + listEndsWith = [] + if sEndsWith.find(";") >= 0: + listParts = sEndsWithModified.split(";") + for sPart in listParts: + sPart = sPart.replace(sSeparatorSubstitute , ";") # recover the original version + listEndsWith.append(sPart) + else: + sEndsWithModified = sEndsWith.replace(r"\;", ";") # convert to unmasked version + listEndsWith.append(sEndsWithModified) + + bEndsWith = False + for sEndsWith in listEndsWith: + if bCaseSensitive is True: + if sStringStripped.endswith(sEndsWith) is True: + bEndsWith = True + break + else: + if sStringStripped.upper().endswith(sEndsWith.upper()) is True: + bEndsWith = True + break + + # -- filter: starts not with + # > several filter strings possible (separated by semicolon; logical join: AND) + if sStartsNotWith is not None: + if sStartsNotWith != "": + sStartsNotWithModified = sStartsNotWith.replace(r"\;", sSeparatorSubstitute) # replace the masked separator by a substitute separator + listStartsNotWith = [] + if sStartsNotWith.find(";") >= 0: + listParts = sStartsNotWithModified.split(";") + for sPart in listParts: + sPart = sPart.replace(sSeparatorSubstitute , ";") # recover the original version + listStartsNotWith.append(sPart) + else: + sStartsNotWithModified = sStartsNotWith.replace(r"\;", ";") # convert to unmasked version + listStartsNotWith.append(sStartsNotWithModified) + + bStartsNotWith = True + for sStartsNotWith in listStartsNotWith: + if bCaseSensitive is True: + if sStringStripped.startswith(sStartsNotWith) is True: + bStartsNotWith = False + break + else: + if sStringStripped.upper().startswith(sStartsNotWith.upper()) is True: + bStartsNotWith = False + break + + # -- filter: ends not with + # > several filter strings possible (separated by semicolon; logical join: AND) + if sEndsNotWith is not None: + if sEndsNotWith != "": + sEndsNotWithModified = sEndsNotWith.replace(r"\;", sSeparatorSubstitute) # replace the masked separator by a substitute separator + listEndsNotWith = [] + if sEndsNotWith.find(";") >= 0: + listParts = sEndsNotWithModified.split(";") + for sPart in listParts: + sPart = sPart.replace(sSeparatorSubstitute , ";") # recover the original version + listEndsNotWith.append(sPart) + else: + sEndsNotWithModified = sEndsNotWith.replace(r"\;", ";") # convert to unmasked version + listEndsNotWith.append(sEndsNotWithModified) + + bEndsNotWith = True + for sEndsNotWith in listEndsNotWith: + if bCaseSensitive is True: + if sStringStripped.endswith(sEndsNotWith) is True: + bEndsNotWith = False + break + else: + if sStringStripped.upper().endswith(sEndsNotWith.upper()) is True: + bEndsNotWith = False + break + + # -- filter: contains + # > several filter strings possible (separated by semicolon; logical join: OR) + if sContains is not None: + if sContains != "": + sContainsModified = sContains.replace(r"\;", sSeparatorSubstitute) # replace the masked separator by a substitute separator + listContains = [] + if sContainsModified.find(";") >= 0: + listParts = sContainsModified.split(";") + for sPart in listParts: + sPart = sPart.replace(sSeparatorSubstitute , ";") # recover the original version + print(f"- Part: '{sPart}'") + listContains.append(sPart) + else: + sContainsModified = sContains.replace(r"\;", ";") # convert to unmasked version + listContains.append(sContainsModified) + + bContains = False + for sContains in listContains: + if bCaseSensitive is True: + if sStringStripped.find(sContains) >= 0: + bContains = True + break + else: + if sStringStripped.upper().find(sContains.upper()) >= 0: + bContains = True + break + + # -- filter: contains not + # > several filter strings possible (separated by semicolon; logical join: AND) + if sContainsNot is not None: + if sContainsNot != "": + sContainsNotModified = sContainsNot.replace(r"\;", sSeparatorSubstitute) # replace the masked separator by a substitute separator + listContainsNot = [] + if sContainsNot.find(";") >= 0: + listParts = sContainsNotModified.split(";") + for sPart in listParts: + sPart = sPart.replace(sSeparatorSubstitute , ";") # recover the original version + listContainsNot.append(sPart) + else: + sContainsNotModified = sContainsNot.replace(r"\;", ";") # convert to unmasked version + listContainsNot.append(sContainsNotModified) + + bContainsNot = True + for sContainsNot in listContainsNot: + if bCaseSensitive is True: + if sStringStripped.find(sContainsNot) >= 0: + bContainsNot = False + break + else: + if sStringStripped.upper().find(sContainsNot.upper()) >= 0: + bContainsNot = False + break + + # -- filter: sInclRegEx + # > (take care to mask special characters that are part of the syntax of regular expressions!) + # > bCaseSensitive not considered here + if sInclRegEx is not None: + if sInclRegEx != "": + bInclRegEx = False + if re.search(sInclRegEx, sString) is not None: + bInclRegEx = True + + # -- last filter: sExclRegEx (final veto right) + # > (take care to mask special characters that are part of the syntax of regular expressions!) + # > bCaseSensitive not considered here + if sExclRegEx is not None: + if sExclRegEx != "": + bExclRegEx = True + if re.search(sExclRegEx, sString) is not None: + bExclRegEx = False + + # -- debug info + if bDebug is True: + print("\n* [sString] : '" + str(sString) + "'\n") + print(" -> [bStartsWith] : '" + str(bStartsWith) + "'") + print(" -> [bEndsWith] : '" + str(bEndsWith) + "'") + print(" -> [bStartsNotWith] : '" + str(bStartsNotWith) + "'") + print(" -> [bEndsNotWith] : '" + str(bEndsNotWith) + "'") + print(" -> [bContains] : '" + str(bContains) + "'") + print(" -> [bContainsNot] : '" + str(bContainsNot) + "'") + print(" -> [bInclRegEx] : '" + str(bInclRegEx) + "'") + print(" -> [bExclRegEx] : '" + str(bExclRegEx) + "'\n") + + # -- final conclusion (AND condition between filters) + + listDecisions = [] + listDecisions.append(bStartsWith) + listDecisions.append(bEndsWith) + listDecisions.append(bStartsNotWith) + listDecisions.append(bEndsNotWith) + listDecisions.append(bContains) + listDecisions.append(bContainsNot) + listDecisions.append(bInclRegEx) + listDecisions.append(bExclRegEx) + + bAck = False # initial + + # -- 1.) no filter set (all None) + nCntDecisions = 0 + for bDecision in listDecisions: + if bDecision is None: + nCntDecisions = nCntDecisions + 1 + if nCntDecisions == len(listDecisions): + bAck = True + if bDebug is True: + print(" > case [1] - bAck: " + str(bAck)) + + # -- 2.) final veto from exclude filter + if bExclRegEx is False: + bAck = False + if bDebug is True: + print(" > case [2] - bAck: " + str(bAck)) + + # -- 3.) exclude filter not set; decision only made by other filters (include) + if bExclRegEx is None: + bAck = True + for bDecision in listDecisions: + if bDecision is False: + bAck = False + break + if bDebug is True: + print(" > case [3] - bAck: " + str(bAck)) + + # -- 4.) exclude filter is True (only relevant in case of all other filters are not set; otherwise decision only made by other filters (include)) + if bExclRegEx is True: + if ( (bStartsWith is None) and + (bEndsWith is None) and + (bStartsNotWith is None) and + (bEndsNotWith is None) and + (bContains is None) and + (bContainsNot is None) and + (bInclRegEx is None) ): + bAck = True + if bDebug is True: + print(" > case [4.1] - bAck: " + str(bAck)) + else: + bAck = True + for bDecision in listDecisions: + if bDecision is False: + bAck = False + break + if bDebug is True: + print(" > case [4.2] - bAck: " + str(bAck)) + + if bDebug is True: + print() + + return bAck + + # eof def StringFilter(...) + + # -------------------------------------------------------------------------------------------------------------- + #TM*** + + def FormatResult(sMethod="", bSuccess=True, sResult=""): + """ +Formats the result string ``sResult`` depending on ``bSuccess``: + +* ``bSuccess`` is ``True`` indicates *success* +* ``bSuccess`` is ``False`` indicates an *error* +* ``bSuccess`` is ``None`` indicates an *exception* + +Additionally the name of the method that causes the result, can be provided (*optional*). +This is useful for debugging. + +**Arguments:** + +* ``sMethod`` + + / *Condition*: optional / *Type*: str / *Default*: (empty string) / + + Name of the method that causes the result. + +* ``bSuccess`` + + / *Condition*: optional / *Type*: bool / *Default*: True / + + Indicates if the computation of the method ``sMethod`` was successful or not. + +* ``sResult`` + + / *Condition*: optional / *Type*: str / *Default*: (empty string) / + + The result of the computation of the method ``sMethod``. + +**Returns:** + +* ``sResult`` + + / *Type*: str / + + The formatted result string. + """ + + if sMethod is None: + sMethod = str(sMethod) + if sResult is None: + sResult = str(sResult) + if bSuccess is True: + if sMethod != "": + sResult = f"[{sMethod}] : {sResult}" + elif bSuccess is False: + sError = "!!! ERROR !!!" + if sMethod != "": + sResult = f"{sError}\n[{sMethod}] : {sResult}" + else: + sResult = f"{sError}\n{sResult}" + else: + sException = "!!! EXCEPTION !!!" + if sMethod != "": + sResult = f"{sException}\n[{sMethod}] : {sResult}" + else: + sResult = f"{sException}\n{sResult}" + return sResult + + # eof def FormatResult(sMethod="", bSuccess=True, sResult=""): + + # -------------------------------------------------------------------------------------------------------------- + #TM*** + + # - make the methods static + + NormalizePath = staticmethod(NormalizePath) + DetectParentPath = staticmethod(DetectParentPath) + StringFilter = staticmethod(StringFilter) + FormatResult = staticmethod(FormatResult) + +# eof class CString(object): + +# ************************************************************************************************************** + + + diff --git a/additions/PythonExtensionsCollection/String/__init__.py b/additions/PythonExtensionsCollection/String/__init__.py new file mode 100644 index 00000000..958420af --- /dev/null +++ b/additions/PythonExtensionsCollection/String/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/additions/PythonExtensionsCollection/Utils/CUtils.py b/additions/PythonExtensionsCollection/Utils/CUtils.py new file mode 100644 index 00000000..20447501 --- /dev/null +++ b/additions/PythonExtensionsCollection/Utils/CUtils.py @@ -0,0 +1,374 @@ +# ************************************************************************************************************** +# +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ************************************************************************************************************** +# +# CUtils.py +# +# XC-CT/ECA3-Queckenstedt +# +# 20.05.2022 +# +# ************************************************************************************************************** + +# -- import standard Python modules +from dotdict import dotdict + +# ************************************************************************************************************** +# wrapper +# ************************************************************************************************************** + +def PrettyPrint(oData=None, hOutputFile=None, bToConsole=True, nIndent=0, sPrefix=None, bHexFormat=False): + """ +Wrapper function to create and use a ``CTypePrint`` object. This wrapper function is responsible for +printing out the content to console and to a file (depending on input parameter). + +The content itself is prepared by the method ``TypePrint`` of class ``CTypePrint``. This happens ``PrettyPrint`` internally. + +The idea behind the ``PrettyPrint`` function is to resolve also the content of composite data types and provide for every parameter inside: + +* the type +* the total number of elements inside (e.g. the number of keys inside a dictionary) +* the counter number of the current element +* the value + +Example call: + +.. code:: python + + PrettyPrint(oData) + +(*with oData is a Python variable of any type*) + +The output can e.g. look like this: + +.. code:: python + + [DICT] (3/1) > {K1} [STR] : 'Val1' + [DICT] (3/2) > {K2} [LIST] (4/1) > [INT] : 1 + [DICT] (3/2) > {K2} [LIST] (4/2) > [STR] : 'A' + [DICT] (3/2) > {K2} [LIST] (4/3) > [INT] : 2 + [DICT] (3/2) > {K2} [LIST] (4/4) > [TUPLE] (2/1) > [INT] : 9 + [DICT] (3/2) > {K2} [LIST] (4/4) > [TUPLE] (2/2) > [STR] : 'Z' + [DICT] (3/3) > {K3} [INT] : 5 + +Every line of output has to be interpreted strictly from left to right. + +For example the meaning of the fifth line of output + +.. code:: python + + [DICT] (3/2) > {K2} [LIST] (4/4) > [TUPLE] (2/1) > [INT] : 9 + +is: + +* The type of input parameter (``oData``) is ``dict`` +* The dictionary contains 3 keys +* The current line gives information about the second key of the dictionary +* The name of the second key is 'K2' +* The value of the second key is of type ``list`` +* The list contains 4 elements +* The current line gives information about the fourth element of the list +* The fourth element of the list is of type ``tuple`` +* The tuple contains 2 elements +* The current line gives information about the first element of the tuple +* The first element of the tuple is of type ``int`` and has the value 9 + +Types are encapsulated in square brackets, counter in round brackets and key names are encapsulated in curly brackets. + +**Arguments:** + +* ``oData`` + + / *Condition*: required / *Type*: (*any Python data type*) / + + A variable of any Python data type. + +* ``hOutputFile`` + + / *Condition*: optional / *Type*: file handle / *Default*: None / + + If handle is not ``None`` the content is written to this file, otherwise not. + +* ``bToConsole`` + + / *Condition*: optional / *Type*: bool / *Default*: True / + + If ``True`` the content is written to console, otherwise not. + +* ``nIndent`` + + / *Condition*: optional / *Type*: int / *Default*: 0 / + + Sets the number of additional blanks at the beginning of every line of output (indentation). + +* ``sPrefix`` + + / *Condition*: optional / *Type*: str / *Default*: None / + + Sets a prefix string that is added at the beginning of every line of output. + +* ``bHexFormat`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + If ``True`` the output is printed in hexadecimal format (but valid for strings only). + +**Returns:** + +* ``listOutLines`` (*list*) + + / *Type*: list / + + List of lines containing the prepared output + """ + + oTypePrint = CTypePrint() + listOutLines = oTypePrint.TypePrint(oData, bHexFormat) + + listReturned = [] + for sLine in listOutLines: + # if requested add indentation and prefix + sLineOut = "" + if sPrefix is not None: + sLineOut = nIndent*" " + sPrefix + " " + sLine + else: + sLineOut = nIndent*" " + sLine + listReturned.append(sLineOut) + + if hOutputFile is not None: + hOutputFile.write(sLineOut + "\n") + if bToConsole is True: + print(sLineOut) + + return listReturned + +# eof def PrettyPrint(oData=None, hOutputFile=None, bToConsole=True, nIndent=0, sPrefix=None, bHexFormat=False): + +# -------------------------------------------------------------------------------------------------------------- +# TM*** + +class CTypePrint(object): + """ +The class ``CTypePrint`` provides a method (``TypePrint``) to compute the following data: + +* the type +* the total number of elements inside (e.g. the number of keys inside a dictionary) +* the counter number of the current element +* the value + +of simple and composite data types. + +The call of this method is encapsulated within the function ``PrettyPrint`` inside this module. + """ + def __init__(self): + self.listGlobalPrefixes = [] + self.listOutLines = [] + + def __del__(self): + pass + + def _ToHex(self, sString=None): + if ( (sString is None) or (sString == "") ): + return sString + listHex = [] + for sChar in sString: + listHex.append(hex(ord(sChar))) + sStringHex = " ".join(listHex) + return sStringHex + + def TypePrint(self, oData=None, bHexFormat=False): + """ +The method ``TypePrint`` computes details about the input variable ``oData``. + +**Arguments:** + +* ``oData`` + + / *Condition*: required / *Type*: any Python data type / + + Python variable of any data type. + +* ``bHexFormat`` + + / *Condition*: optional / *Type*: bool / *Default*: False / + + If ``True`` the output is provide in hexadecimal format. + +**Returns:** + +* ``listOutLines`` + + / *Type*: list / + + List of lines containing the resolved content of ``oData``. + """ + + if oData is None: + sLocalPrefix = "[NONE]" + sGlobalPrefix = " ".join(self.listGlobalPrefixes) + sOut = sGlobalPrefix + " " + sLocalPrefix + " : " + str(oData) + self.listOutLines.append(sOut.strip()) + + elif type(oData) == int: + sLocalPrefix = "[INT]" + sGlobalPrefix = " ".join(self.listGlobalPrefixes) + sOut = sGlobalPrefix + " " + sLocalPrefix + " : " + str(oData) + self.listOutLines.append(sOut.strip()) + + elif type(oData) == float: + sLocalPrefix = "[FLOAT]" + sGlobalPrefix = " ".join(self.listGlobalPrefixes) + sOut = sGlobalPrefix + " " + sLocalPrefix + " : " + str(oData) + self.listOutLines.append(sOut.strip()) + + elif type(oData) == bool: + sLocalPrefix = "[BOOL]" + sGlobalPrefix = " ".join(self.listGlobalPrefixes) + sOut = sGlobalPrefix + " " + sLocalPrefix + " : " + str(oData) + self.listOutLines.append(sOut.strip()) + + elif type(oData) == str: + sLocalPrefix = "[STR]" + sGlobalPrefix = " ".join(self.listGlobalPrefixes) + sData = str(oData) + if bHexFormat is True: + sData = self._ToHex(sData) + sOut = sGlobalPrefix + " " + sLocalPrefix + " : '" + sData + "'" + self.listOutLines.append(sOut.strip()) + + elif type(oData) == list: + nNrOfElements = len(oData) + if nNrOfElements == 0: + # -- indicate empty list + sLocalPrefix = "[LIST]" + sGlobalPrefix = " ".join(self.listGlobalPrefixes) + sOut = sGlobalPrefix + " " + sLocalPrefix + " : []" + self.listOutLines.append(sOut.strip()) + else: + # -- list elements of list + self.listGlobalPrefixes.append("[LIST]") + nCnt = 0 + for oElement in oData: + nCnt = nCnt + 1 + sCnt = "(" + str(nNrOfElements) + "/" + str(nCnt) + ") >" + self.listGlobalPrefixes.append(sCnt) + self.TypePrint(oElement, bHexFormat) # >>>> recursion + del self.listGlobalPrefixes[-1] # remove prefix count + del self.listGlobalPrefixes[-1] # remove prefix name + + elif type(oData) == tuple: + nNrOfElements = len(oData) + if nNrOfElements == 0: + # -- indicate empty tuple + sLocalPrefix = "[TUPLE]" + sGlobalPrefix = " ".join(self.listGlobalPrefixes) + sOut = sGlobalPrefix + " " + sLocalPrefix + " : ()" + self.listOutLines.append(sOut.strip()) + else: + # -- list elements of tuple + self.listGlobalPrefixes.append("[TUPLE]") + nCnt = 0 + for oElement in oData: + nCnt = nCnt + 1 + sCnt = "(" + str(nNrOfElements) + "/" + str(nCnt) + ") >" + self.listGlobalPrefixes.append(sCnt) + self.TypePrint(oElement, bHexFormat) # >>>> recursion + del self.listGlobalPrefixes[-1] # remove prefix count + del self.listGlobalPrefixes[-1] # remove prefix name + + elif type(oData) == set: + nNrOfElements = len(oData) + if nNrOfElements == 0: + # -- indicate empty set + sLocalPrefix = "[SET]" + sGlobalPrefix = " ".join(self.listGlobalPrefixes) + sOut = sGlobalPrefix + " " + sLocalPrefix + " : ()" + self.listOutLines.append(sOut.strip()) + else: + # -- list elements of set + self.listGlobalPrefixes.append("[SET]") + nCnt = 0 + for oElement in oData: + nCnt = nCnt + 1 + sCnt = "(" + str(nNrOfElements) + "/" + str(nCnt) + ") >" + self.listGlobalPrefixes.append(sCnt) + self.TypePrint(oElement, bHexFormat) # >>>> recursion + del self.listGlobalPrefixes[-1] # remove prefix count + del self.listGlobalPrefixes[-1] # remove prefix name + + elif type(oData) == dict: + nNrOfElements = len(oData) + if nNrOfElements == 0: + # -- indicate empty dictionary + sLocalPrefix = "[DICT]" + sGlobalPrefix = " ".join(self.listGlobalPrefixes) + sOut = sGlobalPrefix + " " + sLocalPrefix + " : {}" + self.listOutLines.append(sOut.strip()) + else: + # -- list elements of dictionary + self.listGlobalPrefixes.append("[DICT]") + nCnt = 0 + listKeys = list(oData.keys()) + for sKey in listKeys: + nCnt = nCnt + 1 + oValue = oData[sKey] + sCntAndKey = "(" + str(nNrOfElements) + "/" + str(nCnt) + ") > {" + str(sKey) + "}" + self.listGlobalPrefixes.append(sCntAndKey) + self.TypePrint(oValue, bHexFormat) # >>>> recursion + del self.listGlobalPrefixes[-1] # remove prefix count + del self.listGlobalPrefixes[-1] # remove prefix name + + # elif type(oData) == dotdict: + elif ( (type(oData) == dotdict) or (str(type(oData)) == "") ): + nNrOfElements = len(oData) + if nNrOfElements == 0: + # -- indicate empty dot dictionary + sLocalPrefix = "[DOTDICT]" + sGlobalPrefix = " ".join(self.listGlobalPrefixes) + sOut = sGlobalPrefix + " " + sLocalPrefix + " : {}" + self.listOutLines.append(sOut.strip()) + else: + # -- list elements of dot dictionary + self.listGlobalPrefixes.append("[DOTDICT]") + nCnt = 0 + listKeys = list(oData.keys()) + for sKey in listKeys: + nCnt = nCnt + 1 + oValue = oData[sKey] + sCntAndKey = "(" + str(nNrOfElements) + "/" + str(nCnt) + ") > {" + str(sKey) + "}" + self.listGlobalPrefixes.append(sCntAndKey) + self.TypePrint(oValue, bHexFormat) # >>>> recursion + del self.listGlobalPrefixes[-1] # remove prefix count + del self.listGlobalPrefixes[-1] # remove prefix name + + else: + sLocalPrefix = "[" + str(type(oData)) + "]" + sGlobalPrefix = " ".join(self.listGlobalPrefixes) + sData = str(oData) + if bHexFormat is True: + sData = self._ToHex(sData) + sOut = sGlobalPrefix + " " + sLocalPrefix + " : '" + sData + "'" + self.listOutLines.append(sOut.strip()) + + return self.listOutLines + + # eof def TypePrint(...): + +# eof class CTypePrint(): + +# ************************************************************************************************************** + diff --git a/additions/PythonExtensionsCollection/Utils/__init__.py b/additions/PythonExtensionsCollection/Utils/__init__.py new file mode 100644 index 00000000..958420af --- /dev/null +++ b/additions/PythonExtensionsCollection/Utils/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/additions/PythonExtensionsCollection/__init__.py b/additions/PythonExtensionsCollection/__init__.py new file mode 100644 index 00000000..958420af --- /dev/null +++ b/additions/PythonExtensionsCollection/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/additions/PythonExtensionsCollection/version.py b/additions/PythonExtensionsCollection/version.py new file mode 100644 index 00000000..b5b224a4 --- /dev/null +++ b/additions/PythonExtensionsCollection/version.py @@ -0,0 +1,23 @@ +# ************************************************************************************************************** +# +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ************************************************************************************************************** +# +# Version and date of PythonExtensionsCollection +# +VERSION = "0.8.0" +VERSION_DATE = "28.06.2022" + diff --git a/additions/__init__.py b/additions/__init__.py new file mode 100644 index 00000000..85a18b76 --- /dev/null +++ b/additions/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/config/CConfig.py b/config/CConfig.py deleted file mode 100644 index 19b5e276..00000000 --- a/config/CConfig.py +++ /dev/null @@ -1,240 +0,0 @@ -# ************************************************************************************************************** -# -# Copyright 2020-2022 Robert Bosch GmbH -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# ************************************************************************************************************** -# -# CConfig.py -# -# XC-CT/ECA3-Queckenstedt -# -# Purpose: -# - Compute and store all repository specific information, like the repository name, -# paths to repository subfolder, paths to interpreter and so on ... -# -# - All paths to subfolder depends on the repository root path that has to be provided to constructor of CConfig -# -# Additional hints: -# - Variable names like SPHINXBUILD, SOURCEDIR and BUILDDIR are taken over from original output of Sphinx -# (when documentation project files like make.bat are generated by Sphinx; for better understanding -# no new names here). -# -# - Output in PDF format requires LaTeX compiler and depends on %ROBOTLATEXPATH%/miktex/bin/x64/pdflatex.exe -# -# - Don't be confused: We have 'doc/_build' containing the documentation builder output -# and we have 'build' containing the build of the setup tools. These are different things. -# -# -------------------------------------------------------------------------------------------------------------- -# -# 18.02.2022 / XC-CT/ECA3-Queckenstedt -# Usage of %RobotPythonPath% exchanged by sys.executable -# -# 11.10.2021 / XC-CI1/ECA3-Queckenstedt -# Fixed path within site-packages (Linux) -# -# 06.10.2021 / XC-CI1/ECA3-Queckenstedt -# Added Linux support -# -# 01.10.2021 / XC-CI1/ECA3-Queckenstedt -# Added environment check -# -# 01.10.2021 / XC-CI1/ECA3-Queckenstedt -# Added wrapper for error messages -# -# Initial version 08/2021 -# -# -------------------------------------------------------------------------------------------------------------- - -import os, sys, platform, shlex, subprocess -import colorama as col -import pypandoc - -col.init(autoreset=True) -COLBR = col.Style.BRIGHT + col.Fore.RED -COLBG = col.Style.BRIGHT + col.Fore.GREEN - -# -------------------------------------------------------------------------------------------------------------- - -def printerror(sMsg): - sys.stderr.write(COLBR + f"Error: {sMsg}!\n") - -def printexception(sMsg): - sys.stderr.write(COLBR + f"Exception: {sMsg}!\n") - -# -------------------------------------------------------------------------------------------------------------- - -class CConfig(): - - def __init__(self, sReferencePath="."): - - self.__dictConfig = {} - - self.__sReferencePath = os.path.normpath(os.path.abspath(sReferencePath)) - self.__dictConfig['sReferencePath'] = self.__sReferencePath # only to have the possibility to print out all values only with help of 'self.__dictConfig' - - # 1. basic setup stuff - self.__dictConfig['sPackageName'] = "JsonPreprocessor" - self.__dictConfig['sVersion'] = "0.1.0" - self.__dictConfig['sAuthor'] = "Mai Dinh Nam Son" - self.__dictConfig['sAuthorEMail'] = "son.maidinhnam@vn.bosch.com" - self.__dictConfig['sDescription'] = "This package provides a preprocessor for json files" - self.__dictConfig['sLongDescriptionContentType'] = "text/markdown" - self.__dictConfig['sURL'] = "https://github.com/test-fullautomation/python-jsonpreprocessor" - self.__dictConfig['sProgrammingLanguage'] = "Programming Language :: Python :: 3" - self.__dictConfig['sLicence'] = "License :: OSI Approved :: Apache Software License" - self.__dictConfig['sOperatingSystem'] = "Operating System :: OS Independent" - self.__dictConfig['sPythonRequires'] = ">=3.0" - self.__dictConfig['sDevelopmentStatus'] = "Development Status :: 4 - Beta" - self.__dictConfig['sIntendedAudience'] = "Intended Audience :: Developers" - self.__dictConfig['sTopic'] = "Topic :: Software Development" - self.__dictConfig['arInstallRequires'] = ['sphinx','pypandoc','colorama'] - - - # 2. certain folder and executables (things that requires computation) - bSuccess, sResult = self.__InitConfig() - if bSuccess != True: - raise Exception(sResult) - print(COLBG + sResult) - print() - - - def __del__(self): - del self.__dictConfig - - - def __InitConfig(self): - - sOSName = os.name - sPlatformSystem = platform.system() - sPythonPath = os.path.dirname(sys.executable) - sPython = sys.executable - sPythonVersion = sys.version - - SPHINXBUILD = None - sLaTeXInterpreter = None - sInstalledPackageFolder = None - sInstalledPackageDocFolder = None - - try: - self.__dictConfig['sPandoc'] = pypandoc.get_pandoc_path() - except Exception as ex: - bSuccess = False - sResult = str(ex) - return bSuccess, sResult - - if sPlatformSystem == "Windows": - SPHINXBUILD = f"{sPythonPath}/Scripts/sphinx-build.exe" - sInstalledPackageFolder = f"{sPythonPath}/Lib/site-packages/" + self.__dictConfig['sPackageName'] - sInstalledPackageDocFolder = f"{sPythonPath}/Lib/site-packages/" + self.__dictConfig['sPackageName'] + "_doc" - sLaTeXInterpreter = os.path.normpath(os.path.expandvars("%ROBOTLATEXPATH%/miktex/bin/x64/pdflatex.exe")) - - elif sPlatformSystem == "Linux": - SPHINXBUILD = f"{sPythonPath}/sphinx-build" - sInstalledPackageFolder = f"{sPythonPath}/../lib/python3.9/site-packages/" + self.__dictConfig['sPackageName'] - sInstalledPackageDocFolder = f"{sPythonPath}/../lib/python3.9/site-packages/" + self.__dictConfig['sPackageName'] + "_doc" - sLaTeXInterpreter = os.path.normpath(os.path.expandvars("${ROBOTLATEXPATH}/miktex/bin/x64/pdflatex")) - - else: - bSuccess = False - sResult = f"Operating system {sPlatformSystem} ({sOSName}) not supported" - return bSuccess, sResult - - if os.path.isfile(sLaTeXInterpreter) is False: - sLaTeXInterpreter = None # not an error; PDF generation is an option - - if os.path.isfile(SPHINXBUILD) is False: - bSuccess = False - sResult = f"Missing Sphinx '{SPHINXBUILD}'" - return bSuccess, sResult - - self.__dictConfig['SPHINXBUILD'] = SPHINXBUILD - self.__dictConfig['sPython'] = sPython - self.__dictConfig['sLaTeXInterpreter'] = sLaTeXInterpreter - self.__dictConfig['sInstalledPackageFolder'] = sInstalledPackageFolder - self.__dictConfig['sInstalledPackageDocFolder'] = sInstalledPackageDocFolder - - - # ---- paths relative to repository root folder (where the srcipts are located that use this module) - - # ====== 1. documentation - - # This doesn't matter in case of the documentation builder itself is using this CConfig. - # But if the documentation builder is called by other apps like setup_ext.py, they need to know where to find. - sDocumentationBuilder = os.path.normpath(self.__sReferencePath + "/sphinx-makeall.py") - self.__dictConfig['sDocumentationBuilder'] = sDocumentationBuilder - - # - documentation project source dir (relative to reference path (= position of executing script) - SOURCEDIR = os.path.normpath(self.__sReferencePath + "/doc") - self.__dictConfig['SOURCEDIR'] = SOURCEDIR - - # - documentation project build dir - BUILDDIR = os.path.normpath(SOURCEDIR + "/_build") - self.__dictConfig['BUILDDIR'] = BUILDDIR - - # - documentation project html output folder - sHTMLOutputFolder = os.path.normpath(BUILDDIR + "/html") - self.__dictConfig['sHTMLOutputFolder'] = sHTMLOutputFolder - - # - README - sReadMe_rst = os.path.normpath(self.__sReferencePath + "/README.rst") - self.__dictConfig['sReadMe_rst'] = sReadMe_rst - sReadMe_md = os.path.normpath(self.__sReferencePath + "/README.md") - self.__dictConfig['sReadMe_md'] = sReadMe_md - - - # ====== 2. setuptools - - self.__dictConfig['sSetupBuildFolder'] = os.path.normpath(self.__sReferencePath + "/build") - self.__dictConfig['sSetupBuildLibFolder'] = os.path.normpath(self.__sReferencePath + "/build/lib") - self.__dictConfig['sSetupBuildLibDocFolder'] = os.path.normpath(self.__sReferencePath + "/build/lib/" + self.__dictConfig['sPackageName'] + "_doc") - self.__dictConfig['sSetupDistFolder'] = os.path.normpath(self.__sReferencePath + "/dist") - self.__dictConfig['sEggInfoFolder'] = os.path.normpath(self.__sReferencePath + "/" + self.__dictConfig['sPackageName'] + ".egg-info") - - print() - print(f"Running under {sPlatformSystem} ({sOSName})") - self.PrintConfig() - - bSuccess = True - sResult = "Repository setup done" - return bSuccess, sResult - - # eof def __InitConfig(self): - - - def PrintConfig(self): - # -- printing configuration to console - nJust = 30 - print() - for sKey in self.__dictConfig: - print(sKey.rjust(nJust, ' ') + " : " + str(self.__dictConfig[sKey])) - print() - # eof def PrintConfig(self): - - - def Get(self, sName=None): - if ( (sName is None) or (sName not in self.__dictConfig) ): - print() - printerror(f"Error: Configuration parameter '{sName}' not existing!") - # from here it's standard output: - print("Use instead one of:") - self.PrintConfig() - return None # returning 'None' in case of key is not existing !!! - else: - return self.__dictConfig[sName] - # eof def Get(self, sName=None): - -# eof class CConfig(): - -# -------------------------------------------------------------------------------------------------------------- diff --git a/config/CRepositoryConfig.py b/config/CRepositoryConfig.py new file mode 100644 index 00000000..5bc81020 --- /dev/null +++ b/config/CRepositoryConfig.py @@ -0,0 +1,197 @@ +# ************************************************************************************************************** +# +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ************************************************************************************************************** +# +# CRepositoryConfig.py +# +# XC-CT/ECA3-Queckenstedt +# +# Purpose: +# - Compute and store all repository specific information, like the repository name, +# paths to repository subfolder, paths to interpreter and so on ... +# +# - All paths to subfolder depends on the repository root path that has to be provided +# to constructor of CRepositoryConfig +# +# -------------------------------------------------------------------------------------------------------------- +# +# 29.06.2022 +# +# -------------------------------------------------------------------------------------------------------------- + +import os, sys, platform, shlex, subprocess, json +import colorama as col +import pypandoc + +from PythonExtensionsCollection.String.CString import CString + +from JsonPreprocessor.version import VERSION +from JsonPreprocessor.version import VERSION_DATE + +col.init(autoreset=True) +COLBR = col.Style.BRIGHT + col.Fore.RED +COLBG = col.Style.BRIGHT + col.Fore.GREEN + +# -------------------------------------------------------------------------------------------------------------- + +def printerror(sMsg): + sys.stderr.write(COLBR + f"Error: {sMsg}!\n") + +def printexception(sMsg): + sys.stderr.write(COLBR + f"Exception: {sMsg}!\n") + +# -------------------------------------------------------------------------------------------------------------- + +class CRepositoryConfig(): + + def __init__(self, sCalledBy=None): + + # TODO: error handling sCalledBy=None + sCalledBy = CString.NormalizePath(sCalledBy) + self.__sReferencePath = os.path.dirname(sCalledBy) + + self.__dictRepositoryConfig = None # initialized below by json.load() + + # load static configuration values (name of json file is fix) + sRepositoryConfigurationFile = CString.NormalizePath(f"{self.__sReferencePath}/config/repository_config.json") + hRepositoryConfigurationFile = open(sRepositoryConfigurationFile) + self.__dictRepositoryConfig = json.load(hRepositoryConfigurationFile) + hRepositoryConfigurationFile.close() + + # add further infos + # (to have the possibility to print out all values with help of 'PrintConfig()') + self.__dictRepositoryConfig['CALLEDBY'] = sCalledBy + self.__dictRepositoryConfig['CWD'] = os.getcwd() + self.__dictRepositoryConfig['REFERENCEPATH'] = self.__sReferencePath + self.__dictRepositoryConfig['REPOSITORYCONFIGURATIONFILE'] = sRepositoryConfigurationFile + + # add version and date of the package this repository configuration belongs to + self.__dictRepositoryConfig['PACKAGEVERSION'] = VERSION + self.__dictRepositoryConfig['PACKAGEDATE'] = VERSION_DATE + + # make absolute path to package documentation + self.__dictRepositoryConfig['PACKAGEDOC'] = CString.NormalizePath(sPath=self.__dictRepositoryConfig['PACKAGEDOC'], sReferencePathAbs=self.__sReferencePath) + + # compute dynamic configuration values + bSuccess, sResult = self.__InitConfig() + if bSuccess != True: + raise Exception(sResult) + print(COLBG + sResult) + print() + + + def __del__(self): + del self.__dictRepositoryConfig + + + def __InitConfig(self): + + sOSName = os.name + sPlatformSystem = platform.system() + sPythonPath = CString.NormalizePath(os.path.dirname(sys.executable)) + sPython = CString.NormalizePath(sys.executable) + sPythonVersion = sys.version + + sInstalledPackageFolder = None + + try: + # try to access pandoc; if not installed we detect this already here as early as possible + pypandoc.get_pandoc_path() + except Exception as ex: + bSuccess = False + sResult = str(ex) + return bSuccess, sResult + + if sPlatformSystem == "Windows": + sInstalledPackageFolder = f"{sPythonPath}/Lib/site-packages/" + self.__dictRepositoryConfig['PACKAGENAME'] + elif sPlatformSystem == "Linux": + sInstalledPackageFolder = f"{sPythonPath}/../lib/python3.9/site-packages/" + self.__dictRepositoryConfig['PACKAGENAME'] + else: + bSuccess = False + sResult = f"Operating system {sPlatformSystem} ({sOSName}) not supported" + return bSuccess, sResult + + self.__dictRepositoryConfig['OSNAME'] = sOSName + self.__dictRepositoryConfig['PLATFORMSYSTEM'] = sPlatformSystem + self.__dictRepositoryConfig['PYTHON'] = sPython + self.__dictRepositoryConfig['PYTHONVERSION'] = sPythonVersion + self.__dictRepositoryConfig['INSTALLEDPACKAGEFOLDER'] = sInstalledPackageFolder + + # ---- paths relative to repository root folder (where the scripts are located that use this module) + + # ====== 1. documentation + + # - README + self.__dictRepositoryConfig['README_RST'] = CString.NormalizePath(f"{self.__sReferencePath}/README.rst") + self.__dictRepositoryConfig['README_MD'] = CString.NormalizePath(f"{self.__sReferencePath}/README.md") + + # The following key doesn't matter in case of the documentation builder itself is using this CRepositoryConfig. + # But if the documentation builder is called by other apps like setup.py, they need to know where to find. + self.__dictRepositoryConfig['DOCUMENTATIONBUILDER'] = CString.NormalizePath(f"{self.__sReferencePath}/genpackagedoc.py") + + # - folder containing the package source files (will also contain the PDF documentation) + self.__dictRepositoryConfig['PACKAGESOURCEFOLDER'] = CString.NormalizePath(f"{self.__sReferencePath}/{self.__dictRepositoryConfig['PACKAGENAME']}") + + # ====== 2. setuptools + + self.__dictRepositoryConfig['SETUPBUILDFOLDER'] = CString.NormalizePath(f"{self.__sReferencePath}/build") + self.__dictRepositoryConfig['SETUPBUILDLIBFOLDER'] = CString.NormalizePath(f"{self.__sReferencePath}/build/lib") + self.__dictRepositoryConfig['SETUPBUILDLIBPACKAGEFOLDER'] = CString.NormalizePath(f"{self.__sReferencePath}/build/lib/{self.__dictRepositoryConfig['PACKAGENAME']}") + self.__dictRepositoryConfig['SETUPDISTFOLDER'] = CString.NormalizePath(f"{self.__sReferencePath}/dist") + self.__dictRepositoryConfig['EGGINFOFOLDER'] = CString.NormalizePath(f"{self.__sReferencePath}/{self.__dictRepositoryConfig['PACKAGENAME']}.egg-info") + + print() + print(f"Running under {sPlatformSystem} ({sOSName})") + self.PrintConfig() + + bSuccess = True + sResult = "Repository setup done" + return bSuccess, sResult + + # eof def __InitConfig(self): + + + def PrintConfig(self): + # -- printing configuration to console + nJust = 30 + print() + for sKey in self.__dictRepositoryConfig: + print(sKey.rjust(nJust, ' ') + " : " + str(self.__dictRepositoryConfig[sKey])) + print() + # eof def PrintConfig(self): + + + def Get(self, sName=None): + if ( (sName is None) or (sName not in self.__dictRepositoryConfig) ): + print() + printerror(f"Error: Configuration parameter '{sName}' not existing!") + # from here it's standard output: + print("Use instead one of:") + self.PrintConfig() + return None # returning 'None' in case of key is not existing !!! + else: + return self.__dictRepositoryConfig[sName] + # eof def Get(self, sName=None): + + + def GetConfig(self): + return self.__dictRepositoryConfig + # eof def GetConfig(self): + +# eof class CRepositoryConfig(): + +# -------------------------------------------------------------------------------------------------------------- diff --git a/config/repository_config.json b/config/repository_config.json new file mode 100644 index 00000000..5c378414 --- /dev/null +++ b/config/repository_config.json @@ -0,0 +1,19 @@ +{ + "REPOSITORYNAME" : "python-jsonpreprocessor", + "PACKAGENAME" : "JsonPreprocessor", + "AUTHOR" : "Mai Dinh Nam Son", + "AUTHOREMAIL" : "son.maidinhnam@vn.bosch.com", + "DESCRIPTION" : "Preprocessor for json files", + "LONGDESCRIPTIONCONTENTTYPE" : "text/markdown", + "URL" : "https://github.com/test-fullautomation/python-jsonpreprocessor", + "PROGRAMMINGLANGUAGE" : "Programming Language :: Python :: 3", + "LICENCE" : "License :: OSI Approved :: Apache Software License", + "OPERATINGSYSTEM" : "Operating System :: OS Independent", + "PYTHONREQUIRES" : ">=3.0", + "DEVELOPMENTSTATUS" : "Development Status :: 4 - Beta", + "INTENDEDAUDIENCE" : "Intended Audience :: Developers", + "TOPIC" : "Topic :: Software Development", + "INSTALLREQUIRES" : ["pypandoc","colorama","GenPackageDoc","PythonExtensionsCollection"], + "PACKAGEDATA" : ["*.pdf"], + "PACKAGEDOC" : "./packagedoc" +} diff --git a/doc/CJsonPreprocessor.rst b/doc/CJsonPreprocessor.rst deleted file mode 100644 index 27a06032..00000000 --- a/doc/CJsonPreprocessor.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. Copyright 2020-2022 Robert Bosch GmbH - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -.. rst-class:: dl-parameters - -.. role:: aspect (emphasis) -.. role:: sep (strong) - - -JsonPreprocessor package -======================== - - -Module contents ---------------- - -.. automodule:: CJsonPreprocessor - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/_build/html/.buildinfo b/doc/_build/html/.buildinfo deleted file mode 100644 index 732a518c..00000000 --- a/doc/_build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: c1b9daab68a41d0ab802bb1788587c44 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/_build/html/CJsonPreprocessor.html b/doc/_build/html/CJsonPreprocessor.html deleted file mode 100644 index 9cbd2dcd..00000000 --- a/doc/_build/html/CJsonPreprocessor.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - JsonPreprocessor package — The Json Preprocessor documentation - - - - - - - - - - - - - - - - - - -

-
-
- - -
- -
-

JsonPreprocessor package¶

-
-

Module contents¶

-
-
-class CJsonPreprocessor.CJsonPreprocessor(syntax='json', currentCfg={})[source]¶
-

Bases: object

-
-
CJsonPreprocessor helps to handle configuration file as json format:
    -
  • Allow comment within json file

  • -
  • Allow import json file within json file

  • -
-
-
-
-
-jsonLoad(jFile, masterFile=True)[source]¶
-

Method: jsonLoad loads the json file then parses to dict object

-
-
Args:

jFile: string, json file input

-
-
Returns:

oJson: dict

-
-
-
- -
- -
-
-class CJsonPreprocessor.CPythonJSONDecoder(*args, **kwargs)[source]¶
-

Bases: json.decoder.JSONDecoder

-

Add below python values when scanning json data

- ---- - - - - - - - - - - - -

True

True

False

False

None

None

-
-
-custom_scan_once(string, idx)[source]¶
-
- -
- -
-
-class CJsonPreprocessor.CSyntaxType[source]¶
-

Bases: object

-
-
-json = 'json'¶
-
- -
-
-python = 'python'¶
-
- -
- -
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/doc/_build/html/_modules/CJsonPreprocessor.html b/doc/_build/html/_modules/CJsonPreprocessor.html deleted file mode 100644 index 2a3ba812..00000000 --- a/doc/_build/html/_modules/CJsonPreprocessor.html +++ /dev/null @@ -1,497 +0,0 @@ - - - - - - - - CJsonPreprocessor — The Json Preprocessor documentation - - - - - - - - - - - - - - - - - -
-
-
- - -
- -

Source code for CJsonPreprocessor

-#  Copyright 2020-2022 Robert Bosch Car Multimedia GmbH
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-#################################################################################
-#
-# File: JsonPreprocessor.py
-# 
-# This module uses to handle connfiguration file in json format (import another 
-# json file to the json file).
-# Allows user adds comment into json config file
-#
-# History:
-# 
-# 2021-01:
-#    - Initially created by Mai Dinh Nam Son (RBVH/ECM11)
-#
-# 2021-02-08:
-#   - Use object_pairs_hook of json.load() to process [import] node(s).
-#     Allow to use multiple [import] node(s) at same level.
-#   - Avoid cyclic import
-#
-# 2021-02-17:
-#   - Replace method to load json data json.load() by json.loads() 
-#     to load string data after removing comment(s)
-#
-# 2021-02-18:
-#   - Add parameter syntax to support Python types if required:
-#     None  => null
-#     True  => true
-#     False => false
-#
-# 2021-03-29:
-#   - Adds update configuration using json file
-#   - Handles nested parameter in json config file
-#################################################################################
-
-
-import os
-import json
-import re
-
-
[docs]class CSyntaxType(): - python = "python" - json = "json"
- -NUMBER_RE = re.compile( - r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?', - (re.VERBOSE | re.MULTILINE | re.DOTALL)) - -
[docs]class CPythonJSONDecoder(json.JSONDecoder): - """ Add below python values when scanning json data - - +---------------+-------------------+ - | True | True | - +---------------+-------------------+ - | False | False | - +---------------+-------------------+ - | None | None | - +---------------+-------------------+ - """ - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.scan_once = self.custom_scan_once - - def _custom_scan_once(self, string, idx): - try: - nextchar = string[idx] - except IndexError: - raise StopIteration(idx) from None - - if nextchar == '"': - return self.parse_string(string, idx + 1, self.strict) - elif nextchar == '{': - return self.parse_object((string, idx + 1), self.strict, - self._custom_scan_once, self.object_hook, self.object_pairs_hook, self.memo) - elif nextchar == '[': - return self.parse_array((string, idx + 1), self._custom_scan_once) - elif nextchar == 'n' and string[idx:idx + 4] == 'null': - return None, idx + 4 - elif nextchar == 't' and string[idx:idx + 4] == 'true': - return True, idx + 4 - elif nextchar == 'f' and string[idx:idx + 5] == 'false': - return False, idx + 5 - elif nextchar == 'N' and string[idx:idx + 4] == 'None': - return None, idx + 4 - elif nextchar == 'T' and string[idx:idx + 4] == 'True': - return True, idx + 4 - elif nextchar == 'F' and string[idx:idx + 5] == 'False': - return False, idx + 5 - - m = NUMBER_RE.match(string, idx) - if m is not None: - integer, frac, exp = m.groups() - if frac or exp: - res = self.parse_float(integer + (frac or '') + (exp or '')) - else: - res = self.parse_int(integer) - return res, m.end() - elif nextchar == 'N' and string[idx:idx + 3] == 'NaN': - return self.parse_constant('NaN'), idx + 3 - elif nextchar == 'I' and string[idx:idx + 8] == 'Infinity': - return self.parse_constant('Infinity'), idx + 8 - elif nextchar == '-' and string[idx:idx + 9] == '-Infinity': - return self.parse_constant('-Infinity'), idx + 9 - else: - raise StopIteration(idx) - -
[docs] def custom_scan_once(self, string, idx): - try: - return self._custom_scan_once(string, idx) - finally: - self.memo.clear()
- -
[docs]class CJsonPreprocessor(): - ''' - CJsonPreprocessor helps to handle configuration file as json format: - - Allow comment within json file - - Allow import json file within json file - ''' - def __init__(self, syntax=CSyntaxType.json, currentCfg={}): - self.lImportedFiles = [] - self.recursive_level = 0 - self.syntax = syntax - self.currentCfg = currentCfg - self.lUpdatedParams = [] - - - ''' - Method: __processImportFiles this is custom decorder of object_pairs_hook function. - This method helps to import json file which is provided in '[import]' keyword into current json file. - Returns: - Dictionary is parsed from json file. - ''' - def __processImportFiles(self, input_data): - out_dict = {} - for key, value in input_data: - if re.match('^\s*\[\s*import\s*\]\s*', key.lower()): - abs_path_file = os.path.abspath(value) - - # Use recursive_level and lImportedFiles to avoid cyclic import - self.recursive_level = self.recursive_level + 1 # increase recursive level - # length of lImportedFiles should equal to recursive_level - self.lImportedFiles = self.lImportedFiles[:self.recursive_level] - if abs_path_file in self.lImportedFiles: - raise Exception('Cyclic imported json file \'%s\'' %str(abs_path_file)) - - oJsonImport = self.jsonLoad(value, masterFile=False) - out_dict.update(oJsonImport) - self.recursive_level = self.recursive_level - 1 # descrease recursive level - else: - out_dict[key] = value - return out_dict - - ''' - Method: __removeComments loads json config file which allows comments inside - Args: - jsonFile: string - Returns: - lJsonData: list, list of string data from jsonFile after removing comment(s). - ''' - def __removeComments(self, jsonFile): - jsonPath = '' - if '/' in jsonFile: - for item in jsonFile.split('/')[:-1]: - jsonPath += item + '/' - else: - for item in jsonFile.split('\\')[:-1]: - jsonPath += item + '\\' - - ''' - Removes comment parts in json file then store in temporary json file - ''' - lJsonData = [] - - with open(jsonFile) as fr: - for line in fr: - if re.match('^\s*//', line): - continue - elif '//' in line: - reEx1 = re.search("(\s*{*\s*\'.+\')\s*:\s*(\'.+\'\s*,*)*\s*(.*)", line) - if reEx1 is None: - reEx1 = re.search("(\s*{*\s*\".+\")\s*:\s*(\".+\"\s*,*)*\s*(.*)", line) - if reEx1 is None: - line = re.sub('//.*', '', line) - elif reEx1.group(1) is not None and reEx1.group(2) is not None: - line = reEx1.group(1) + ": " + reEx1.group(2) if reEx1.group(3) is None else \ - reEx1.group(1) + ": " + reEx1.group(2) + re.sub('//.*', '', reEx1.group(3)) - else: - reEx2 = re.search("(\s*{*\s*\'.+\')\s*:\s*(.+,*)\s*//\s*.*", line) - if reEx2 is None: - reEx2 = re.search("(\s*{*\s*\".+\")\s*:\s*(.+,*)\s*(//\s*.*)*", line) - if reEx2 is not None: - line = reEx2.group(1) + ": " + re.sub('//.*', '', reEx2.group(2)) - - lJsonData.append(line) - return lJsonData, jsonPath - - ''' - private __nestedParamHandler: This method handles the nested variable in param names or value - in updated json config file. - Args: - sInputStr: string - param name or value which contains nested variable - Returns: - sStrHandled: string - ''' - def __nestedParamHandler(self, sInputStr): - - #globals().update(currentCfg) - referVars = re.findall('(\${\s*.*?\s*})', sInputStr) - if len(referVars) > 1: - sUpdateVar = referVars[0] - referVars = referVars[1:] - sInputStr = re.sub('\\' + sUpdateVar, '', sInputStr, count=1) - for var in referVars[::-1]: - pattern = '(\\' + var + '\s*\[\s*.*?\s*\])' - variable = re.findall(pattern, sInputStr) - if variable == []: - sExec = "value = " + re.search('^\s*\${(\s*.*?)}', var).group(1) - try: - ldict = {} - exec(sExec, globals(), ldict) - tmpValue = ldict['value'] - except: - raise Exception('The variable %s is not available' % (var)) - sInputStr = re.sub('\\' + var, tmpValue, sInputStr) if isinstance(tmpValue, str) else \ - re.sub('\\' + var, str(tmpValue), sInputStr) - continue - while variable != []: - fullVariable = variable[0] - pattern = pattern[:-1] + '\[\s*.*?\s*\])' - variable = re.findall(pattern, sInputStr) - if variable != []: - fullVariable = variable[0] - sExec = "value = " + re.sub('\${\s*(.*?)\s*}', '\\1', fullVariable) - try: - ldict = {} - exec(sExec, globals(), ldict) - tmpValue = ldict['value'] - except: - raise Exception('The variable %s is not available!!!' % (fullVariable)) - pattern = re.sub('\[', '\\[', fullVariable) - pattern = re.sub('\]', '\\]', pattern) - sInputStr = re.sub('\\' + pattern, '\'' + tmpValue + '\'', sInputStr) if isinstance(tmpValue, str) else \ - re.sub('\\' + pattern, '\'' + str(tmpValue) + '\'', sInputStr) - sStrHandled = sUpdateVar + sInputStr - return sStrHandled - - else: - pattern = '(\\' + referVars[0] + '\s*\[\s*.*?\s*\])' - variable = re.findall(pattern, sInputStr) - if variable == []: - sStrHandled = referVars[0] - return sStrHandled - else: - fullVariable = variable[0] - while variable != []: - pattern = pattern[:-1] + '\[\s*.*?\s*\])' - variable = re.findall(pattern, sInputStr) - if variable != []: - fullVariable = variable[0] - sStrHandled = fullVariable - return sStrHandled - - ''' - private __updateAndReplaceNestedParam: this method replaces all nested params in key and value of Json object - Args: - oJson: dict - currentCfg: dict - Returns: - oJsonOut: dict - ''' - def __updateAndReplaceNestedParam(self, oJson, recursive=False): - - if bool(self.currentCfg) and not recursive: - for k, v in self.currentCfg.items(): - globals().update({k:v}) - - tmpJson = {} - bNested = False - for k, v in oJson.items(): - if re.match('^\s*\${\s*', k.lower()): - keyAfterProcessed = self.__nestedParamHandler(k) - k = re.sub('^\s*\${\s*(.*?)\s*}', '\\1', keyAfterProcessed) - bNested = True - - if isinstance(v, dict): - v = self.__updateAndReplaceNestedParam(v, recursive=True) - if bNested: - if '[' in k: - sExec = k + " = \'" + v + "\'" if isinstance(v, str) else k + " = " + str(v) - try: - exec(sExec, globals()) - except: - raise Exception("Could not set variable \'%s\' with value \'%s\'" %(k, v)) - else: - tmpJson[k] = v - bNested = False - else: - tmpJson[k] = v - - elif isinstance(v, str) and re.match('^.*\s*\${\s*', v.lower()): - - valueAfterProcessed = self.__nestedParamHandler(v) - tmpValueAfterProcessed = re.sub('\\${\s*(.*?)\s*}', '\\1', valueAfterProcessed) - sExec = "value = " + tmpValueAfterProcessed if isinstance(tmpValueAfterProcessed, str) else \ - "value = " + str(tmpValueAfterProcessed) - - try: - ldict = {} - exec(sExec, globals(), ldict) - v = ldict['value'] if v.strip()==valueAfterProcessed else \ - v.replace(valueAfterProcessed, str(ldict['value'])) - except: - raise Exception('The variable %s is not available!!!' % (tmpValueAfterProcessed)) - - if bNested: - if '[' in k: - sExec = k + " = \'" + v + "\'" if isinstance(v, str) else k + " = " + str(v) - try: - exec(sExec, globals()) - except: - raise Exception("Could not set variable \'%s\' with value \'%s\'" %(k, v)) - else: - tmpJson[k] = v - bNested = False - else: - tmpJson[k] = v - - else: - if bNested: - if '[' in k: - sExec = k + " = \'" + v + "\'" if isinstance(v, str) else k + " = " + str(v) - try: - exec(sExec, globals()) - except: - raise Exception("Could not set variable \'%s\' with value \'%s\'" %(k, v)) - else: - tmpJson[k] = v - - bNested = False - - oJson.update(tmpJson) - - return oJson - -
[docs] def jsonLoad(self, jFile, masterFile=True): - ''' - Method: jsonLoad loads the json file then parses to dict object - - Args: - jFile: string, json file input - Returns: - oJson: dict - ''' - try: - lJsonData, jsonPath = self.__removeComments(jFile) - except Exception as reason: - raise Exception("Could not read json configuration file %s due to: %s \n\ - Please input 'utf-8' format in Json configuration file only" %(jFile, reason)) - - currentDir = os.getcwd() - self.lImportedFiles.append(os.path.abspath(jFile)) - os.chdir(jsonPath) - CJSONDecoder = None - if self.syntax != CSyntaxType.json: - if self.syntax == CSyntaxType.python: - CJSONDecoder = CPythonJSONDecoder - else: - raise Exception('Provided syntax \'%s\' is not supported.' %self.syntax) - - try: - oJson = json.loads("\n".join(lJsonData), - cls=CJSONDecoder , - object_pairs_hook=self.__processImportFiles) - except Exception as error: - raise Exception("JSON configuration file '%s': %s" %(jFile, error)) - - os.chdir(currentDir) - if masterFile: - for k, v in oJson.items(): - globals().update({k:v}) - oJson = self.__updateAndReplaceNestedParam(oJson) - # oJson['JsonPath'] = jsonPath # is JsonPath required? - - return oJson
-
- -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/doc/_build/html/_modules/index.html b/doc/_build/html/_modules/index.html deleted file mode 100644 index 96a7ee01..00000000 --- a/doc/_build/html/_modules/index.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - Overview: module code — The Json Preprocessor documentation - - - - - - - - - - - - - - - - - -
-
-
- - -
- -

All modules for which code is available

- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/doc/_build/html/_sources/CJsonPreprocessor.rst.txt b/doc/_build/html/_sources/CJsonPreprocessor.rst.txt deleted file mode 100644 index 63f2fb1a..00000000 --- a/doc/_build/html/_sources/CJsonPreprocessor.rst.txt +++ /dev/null @@ -1,25 +0,0 @@ -.. Copyright 2020-2022 Robert Bosch Car Multimedia GmbH - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -JsonPreprocessor package -======================== - - -Module contents ---------------- - -.. automodule:: CJsonPreprocessor - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/_build/html/_sources/additional_doc/feature_documentation.rst.txt b/doc/_build/html/_sources/additional_doc/feature_documentation.rst.txt deleted file mode 100644 index 711a3465..00000000 --- a/doc/_build/html/_sources/additional_doc/feature_documentation.rst.txt +++ /dev/null @@ -1,420 +0,0 @@ -.. Copyright 2020-2022 Robert Bosch Car Multimedia GmbH - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -Json Preprocessor's Feature Documentation -========================================= - -Introduction: -------------- - -.. image:: /images/python3-jsonpreprocessor.png - -The JsonPreprocessor is the python3 package which allows programmer to handle some -additional features in json file such as comment, import, override, etc for -configuring purpose. The json file containing comment, import,... will be handled -by JsonPreprocessor package then returned the final dictionary object for python -program. - -New features -~~~~~~~~~~~~ - -`Adding comments to Json file`_ - -`Import the contents from other json files`_ - -`Overwrite existing and add new parameters`_ - -`Nested parameters`_ - -Features in details -------------------- - -Adding comments to Json file -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The JsonPreprocessor allows adding comments into json file, a comment could be -added follow **"//"**. - -This is required becuase some big projects require a large json configuration file -which contains a huge number of configuration parameters for the different features. -Therefore, having the need of adding comments into json file to clarify the different -configuration parameters. - -**Note:** This package is not allow commented a block of json code, each comment -must be added with **"//"**. - -**Example:** - -.. code-block:: - - //***************************************************************************** - // Author: ROBFW-AIO Team - // - // This file defines all common global parameters and will be included to all - // test config files - //***************************************************************************** - { - "Project": "G3g", - "WelcomeString": "Hello... ROBFW is running now!", - // Version control information. - "version": { - "majorversion": "0", - "minorversion": "1", - "patchversion": "1" - }, - "params": { - // Global parameters - "global": { - "gGlobalIntParam" : 1, - "gGlobalFloatParam" : 1.332, // This parameter is used to configure for .... - "gGlobalString" : "This is a string", - "gGlobalStructure": { - "general": "general" - } - } - }, - "preprocessor": { - "definitions": { - // FEATURE switches - "gPreprolIntParam" : 1, - "gPreproFloatParam" : 1.332, - // The parameter for feature ABC - "gPreproString" : "This is a string", - "gPreproStructure": { - "general": "general" - } - } - }, - "TargetName" : "gen3flex@dlt" - } - -Import the contents from other json files -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This import feature allows user merges the content of other json files into the -json file, it also allows the nested importing means we can use import feature in -the imported files. - -The import feature helps user distinguish the configuration parameters of each -functions, purposes, variants, and so forth into the separate json files. Therefore, -we can easy to understand and manage the configuration parameters of big project. - -**Example:** - -Suppose we have the json file ``params_global.json`` with the content: - -.. code-block:: - - //***************************************************************************** - // Author: ROBFW-AIO Team - // - // This file defines all common global parameters and will be included to all - // test config files - //***************************************************************************** - // - // This is to distinguish the different types of resets - { - "gGlobalIntParam" : 1, - - "gGlobalFloatParam" : 1.332, // This parameter is used to configure for .... - - "gGlobalString" : "This is a string", - - "gGlobalStructure": { - "general": "general" - } - } - -And other json file ``preprocessor_definitions.json`` with content: - -.. code-block:: - - //***************************************************************************** - // Author: ROBFW-AIO Team - // - // This file defines all common global parameters and will be included to all - // test config files - //***************************************************************************** - { - "gPreprolIntParam" : 1, - - "gPreproFloatParam" : 1.332, - // The parameter for feature ABC - "gPreproString" : "This is a string", - - "gPreproStructure": { - "general": "general" - } - } - -Then we can import these 2 files above to the json file ``config.json`` with content: - -.. code-block:: - - //***************************************************************************** - // Author: ROBFW-AIO Team - // - // This file defines all common global parameters and will be included to all - // test config files - //***************************************************************************** - { - "Project": "G3g", - "WelcomeString": "Hello... ROBFW is running now!", - // Version control information. - "version": { - "majorversion": "0", - "minorversion": "1", - "patchversion": "1" - }, - "params": { - // Global parameters - "global": { - "[import]": "/params_global.json" - } - }, - "preprocessor": { - "definitions": { - // FEATURE switches - "[import]": "/preprocessor_definitions.json" - } - }, - "TargetName" : "gen3flex@dlt" - } - -The ``config.json`` file is handled by JsonPreprocessor package, then return the dictionary object for a program like below: - -.. code-block:: - - { - "Project": "G3g", - "WelcomeString": "Hello... ROBFW is running now!", - "version": { - "majorversion": "0", - "minorversion": "1", - "patchversion": "1" - }, - "params": { - "global": { - "gGlobalIntParam" : 1, - "gGlobalFloatParam" : 1.332, - "gGlobalString" : "This is a string", - "gGlobalStructure": { - "general": "general" - } - } - }, - "preprocessor": { - "definitions": { - "gPreprolIntParam" : 1, - "gPreproFloatParam" : 1.332, - "gPreproString" : "This is a string", - "gPreproStructure": { - "general": "general" - } - } - }, - "TargetName" : "gen3flex@dlt" - } - -Overwrite existing and add new parameters -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This package also provides user ability to overwrite or update as well as add new -parameters. User can update parameters which are already declared and add new parameters -or new element into existing parameters. The below example will show the way to do -these features. - -In case we have many different variants, and each varaint requires a different value -assigned to the parameter. This feature could help us update new value for existen -parameters, it also supports to add new parameters to existen configuation object. - -**Example:** - -Suppose we have the json file ``params_global.json`` with the content: - -.. code-block:: - - { - "gGlobalIntParam" : 1, - - "gGlobalFloatParam" : 1.332, // This parameter is used to configure for .... - - "gGlobalString" : "This is a string", - - "gGlobalStructure": { - "general": "general" - } - } - -Then we import ``params_global.json`` to json file ``config.json`` with content: - -.. code-block:: - - { - "Project": "G3g", - "WelcomeString": "Hello... ROBFW is running now!", - // Version control information. - "version": { - "majorversion": "0", - "minorversion": "1", - "patchversion": "1" - }, - "params": { - // Global parameters - "global": { - "[import]": "/params_global.json" - } - }, - "TargetName" : "gen3flex@dlt", - // Overwrite parameters - "${params}['global']['gGlobalFloatParam']": 9.999, - "${version}['patchversion']": "2", - "${params}['global']['gGlobalString']": "This is the new value for the already existing parameter.", - // Add new parameters - "${newParam}": { - "abc": 9, - "xyz": "new param" - }, - "${params}['global']['gGlobalStructure']['newGlobalParam']": 123 - } - -The ``config.json`` file is handled by JsonPreprocessor package, then return the dictionary object for a program like below: - -.. code-block:: - - { - "Project": "G3g", - "WelcomeString": "Hello... ROBFW is running now!", - "version": { - "majorversion": "0", - "minorversion": "1", - "patchversion": "2" - }, - "params": { - "global": { - "gGlobalIntParam" : 1, - "gGlobalFloatParam" : 9.999, - "gGlobalString" : "This is the new value for the already existing parameter.", - "gGlobalStructure": { - "general": "general", - "newGlobalParam": 123 - } - } - }, - "TargetName": "gen3flex@dlt", - "newParam": { - "abc": 9, - "xyz": "new param" - } - } - -Nested parameters -~~~~~~~~~~~~~~~~~ - -With JsonPreprocessor package, user can also use nested parameters as example below: - -**Example:** - -Suppose we have the json file ``config.json`` with the content: - -.. code-block:: - - { - "Project": "G3g", - "WelcomeString": "Hello... ROBFW is running now!", - // Version control information. - "version": { - "majorversion": "0", - "minorversion": "1", - "patchversion": "1" - }, - "params": { - // Global parameters - "global": { - "gGlobalIntParam" : 1, - "gGlobalFloatParam" : 1.332, // This parameter is used to configure for .... - "gGlobalString" : "This is a string", - "gGlobalStructure": { - "general": "general" - } - } - }, - "preprocessor": { - "definitions": { - "gPreprolIntParam" : 1, - "gPreproFloatParam" : 9.664, - "ABC": "checkABC", - "gPreproString" : "This is a string", - "gPreproStructure": { - "general": "general" - } - } - }, - "TargetName" : "gen3flex@dlt", - // Nested parameter - "${params}['global'][${preprocessor}['definitions']['ABC']]": true, - "${params}['global']['gGlobalFloatParam']": "${preprocessor}['definitions']['gPreproFloatParam']" - } - -The ``config.json`` file is handled by JsonPreprocessor package, then return the dictionary object for a program like below: - -.. code-block:: - - { - "Project": "G3g", - "WelcomeString": "Hello... ROBFW is running now!", - "version": { - "majorversion": "0", - "minorversion": "1", - "patchversion": "1" - }, - "params": { - "global": { - "gGlobalIntParam" : 1, - "gGlobalFloatParam" : 9.664, - "gGlobalString" : "This is a string", - "gGlobalStructure": { - "general": "general" - }, - "checkABC": true - } - }, - "preprocessor": { - "definitions": { - "gPreprolIntParam" : 1, - "gPreproFloatParam" : 9.664, - "ABC": "checkABC", - "gPreproString" : "This is a string", - "gPreproStructure": { - "general": "general" - } - } - }, - "TargetName" : "gen3flex@dlt" - } - -Feedback --------- - -To give us a feedback, you can send an email to `Thomas Pollerspöck `_ or -`RBVH-ECM-Automation_Test_Framework-Associates `_ - -In case you want to report a bug or request any interesting feature, please don't hesitate to rasie a ticket on -`our Jira `_ - -References ----------- - -For more information please refer to our `Bosch Connect Community `_ - diff --git a/doc/_build/html/_sources/index.rst.txt b/doc/_build/html/_sources/index.rst.txt deleted file mode 100644 index e847ced9..00000000 --- a/doc/_build/html/_sources/index.rst.txt +++ /dev/null @@ -1,31 +0,0 @@ -.. Copyright 2020-2022 Robert Bosch Car Multimedia GmbH - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -.. The Json Preprocessor documentation master file, created by - sphinx-quickstart on Tue Jun 22 10:06:14 2021. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - - -Json Preprocessor's API! -======================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - ./additional_doc/feature_documentation.rst - ./CJsonPreprocessor.rst - - diff --git a/doc/_build/html/_static/alabaster.css b/doc/_build/html/_static/alabaster.css deleted file mode 100644 index 0eddaeb0..00000000 --- a/doc/_build/html/_static/alabaster.css +++ /dev/null @@ -1,701 +0,0 @@ -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: Georgia, serif; - font-size: 17px; - background-color: #fff; - color: #000; - margin: 0; - padding: 0; -} - - -div.document { - width: 940px; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 220px; -} - -div.sphinxsidebar { - width: 220px; - font-size: 14px; - line-height: 1.5; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #fff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -div.body > .section { - text-align: left; -} - -div.footer { - width: 940px; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -p.caption { - font-family: inherit; - font-size: inherit; -} - - -div.relations { - display: none; -} - - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 0px; - text-align: center; -} - -div.sphinxsidebarwrapper h1.logo { - margin-top: -10px; - text-align: center; - margin-bottom: 5px; - text-align: left; -} - -div.sphinxsidebarwrapper h1.logo-name { - margin-top: 0px; -} - -div.sphinxsidebarwrapper p.blurb { - margin-top: 0; - font-style: normal; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: Georgia, serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar ul li.toctree-l1 > a { - font-size: 120%; -} - -div.sphinxsidebar ul li.toctree-l2 > a { - font-size: 110%; -} - -div.sphinxsidebar input { - border: 1px solid #CCC; - font-family: Georgia, serif; - font-size: 1em; -} - -div.sphinxsidebar hr { - border: none; - height: 1px; - color: #AAA; - background: #AAA; - - text-align: left; - margin-left: 0; - width: 50%; -} - -div.sphinxsidebar .badge { - border-bottom: none; -} - -div.sphinxsidebar .badge:hover { - border-bottom: none; -} - -/* To address an issue with donation coming after search */ -div.sphinxsidebar h3.donation { - margin-top: 10px; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: Georgia, serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #DDD; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #EAEAEA; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - margin: 20px 0px; - padding: 10px 30px; - background-color: #EEE; - border: 1px solid #CCC; -} - -div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fafafa; -} - -div.admonition p.admonition-title { - font-family: Georgia, serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: #fff; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.warning { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.danger { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.error { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.caution { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.attention { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.important { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.note { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.tip { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.hint { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.seealso { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.topic { - background-color: #EEE; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt, code { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -.hll { - background-color: #FFC; - margin: 0 -12px; - padding: 0 12px; - display: block; -} - -img.screenshot { -} - -tt.descname, tt.descclassname, code.descname, code.descclassname { - font-size: 0.95em; -} - -tt.descname, code.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #EEE; - background: #FDFDFD; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.field-list p { - margin-bottom: 0.8em; -} - -/* Cloned from - * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 - */ -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -table.footnote td.label { - width: .1px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - /* Matches the 30px from the narrow-screen "li > ul" selector below */ - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #EEE; - padding: 7px 30px; - margin: 15px 0px; - line-height: 1.3em; -} - -div.viewcode-block:target { - background: #ffd; -} - -dl pre, blockquote pre, li pre { - margin-left: 0; - padding-left: 30px; -} - -tt, code { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, code.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fff; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -/* Don't put an underline on images */ -a.image-reference, a.image-reference:hover { - border-bottom: none; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt, a:hover code { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: #fff; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: #FFF; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: #fff; - } - - div.sphinxsidebar a { - color: #AAA; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} - -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatting between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ -table.docutils.citation, table.docutils.citation td, table.docutils.citation th { - border: none; - /* Below needed in some edge cases; if not applied, bottom shadows appear */ - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - - -/* relbar */ - -.related { - line-height: 30px; - width: 100%; - font-size: 0.9rem; -} - -.related.top { - border-bottom: 1px solid #EEE; - margin-bottom: 20px; -} - -.related.bottom { - border-top: 1px solid #EEE; -} - -.related ul { - padding: 0; - margin: 0; - list-style: none; -} - -.related li { - display: inline; -} - -nav#rellinks { - float: right; -} - -nav#rellinks li+li:before { - content: "|"; -} - -nav#breadcrumbs li+li:before { - content: "\00BB"; -} - -/* Hide certain items when printing */ -@media print { - div.related { - display: none; - } -} \ No newline at end of file diff --git a/doc/_build/html/_static/basic.css b/doc/_build/html/_static/basic.css deleted file mode 100644 index 603f6a87..00000000 --- a/doc/_build/html/_static/basic.css +++ /dev/null @@ -1,905 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/doc/_build/html/_static/custom.css b/doc/_build/html/_static/custom.css deleted file mode 100644 index 2a924f1d..00000000 --- a/doc/_build/html/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/doc/_build/html/_static/doctools.js b/doc/_build/html/_static/doctools.js deleted file mode 100644 index 8cbf1b16..00000000 --- a/doc/_build/html/_static/doctools.js +++ /dev/null @@ -1,323 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { - this.initOnKeyListeners(); - } - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey - && !event.shiftKey) { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - break; - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - break; - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/doc/_build/html/_static/documentation_options.js b/doc/_build/html/_static/documentation_options.js deleted file mode 100644 index 4daa6b50..00000000 --- a/doc/_build/html/_static/documentation_options.js +++ /dev/null @@ -1,12 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false -}; \ No newline at end of file diff --git a/doc/_build/html/_static/file.png b/doc/_build/html/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/doc/_build/html/_static/jquery-3.5.1.js b/doc/_build/html/_static/jquery-3.5.1.js deleted file mode 100644 index 50937333..00000000 --- a/doc/_build/html/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

Json Preprocessor’s Feature Documentation¶

-
-

Introduction:¶

-../_images/python3-jsonpreprocessor.png -

The JsonPreprocessor is the python3 package which allows programmer to handle some -additional features in json file such as comment, import, override, etc for -configuring purpose. The json file containing comment, import,… will be handled -by JsonPreprocessor package then returned the final dictionary object for python -program.

- -
-
-

Features in details¶

-
-

Adding comments to Json file¶

-

The JsonPreprocessor allows adding comments into json file, a comment could be -added follow “//â€.

-

This is required becuase some big projects require a large json configuration file -which contains a huge number of configuration parameters for the different features. -Therefore, having the need of adding comments into json file to clarify the different -configuration parameters.

-

Note: This package is not allow commented a block of json code, each comment -must be added with “//â€.

-

Example:

-
//*****************************************************************************
-//  Author: ROBFW-AIO Team
-//
-//  This file defines all common global parameters and will be included to all
-//  test config files
-//*****************************************************************************
-{
-  "Project": "G3g",
-  "WelcomeString": "Hello... ROBFW is running now!",
-  // Version control information.
-  "version": {
-    "majorversion": "0",
-    "minorversion": "1",
-    "patchversion": "1"
-  },
-  "params": {
-    // Global parameters
-    "global": {
-      "gGlobalIntParam" : 1,
-      "gGlobalFloatParam" : 1.332,  // This parameter is used to configure for ....
-      "gGlobalString"   : "This is a string",
-      "gGlobalStructure": {
-        "general": "general"
-      }
-    }
-  },
-  "preprocessor": {
-    "definitions": {
-      // FEATURE switches
-      "gPreprolIntParam" : 1,
-      "gPreproFloatParam" : 1.332,
-       // The parameter for feature ABC
-      "gPreproString"   : "This is a string",
-      "gPreproStructure": {
-                         "general": "general"
-                        }
-      }
-  },
-  "TargetName" : "gen3flex@dlt"
-}
-
-
-
-
-

Import the contents from other json files¶

-

This import feature allows user merges the content of other json files into the -json file, it also allows the nested importing means we can use import feature in -the imported files.

-

The import feature helps user distinguish the configuration parameters of each -functions, purposes, variants, and so forth into the separate json files. Therefore, -we can easy to understand and manage the configuration parameters of big project.

-

Example:

-

Suppose we have the json file params_global.json with the content:

-
//*****************************************************************************
-//  Author: ROBFW-AIO Team
-//
-//  This file defines all common global parameters and will be included to all
-//  test config files
-//*****************************************************************************
-//
-//  This is to distinguish the different types of resets
-{
-  "gGlobalIntParam" : 1,
-
-  "gGlobalFloatParam" : 1.332, // This parameter is used to configure for ....
-
-  "gGlobalString"   : "This is a string",
-
-  "gGlobalStructure": {
-    "general": "general"
-  }
-}
-
-
-

And other json file preprocessor_definitions.json with content:

-
//*****************************************************************************
-//  Author: ROBFW-AIO Team
-//
-//  This file defines all common global parameters and will be included to all
-//  test config files
-//*****************************************************************************
-{
-  "gPreprolIntParam" : 1,
-
-  "gPreproFloatParam" : 1.332,
-  // The parameter for feature ABC
-  "gPreproString"   : "This is a string",
-
-  "gPreproStructure": {
-                         "general": "general"
-                      }
-}
-
-
-

Then we can import these 2 files above to the json file config.json with content:

-
//*****************************************************************************
-//  Author: ROBFW-AIO Team
-//
-//  This file defines all common global parameters and will be included to all
-//  test config files
-//*****************************************************************************
-{
-  "Project": "G3g",
-  "WelcomeString": "Hello... ROBFW is running now!",
-  // Version control information.
-  "version": {
-    "majorversion": "0",
-    "minorversion": "1",
-    "patchversion": "1"
-  },
-  "params": {
-    // Global parameters
-    "global": {
-               "[import]": "<path_to_the_imported_file>/params_global.json"
-      }
-    },
-  "preprocessor": {
-    "definitions": {
-      // FEATURE switches
-        "[import]": "<path_to_the_imported_file>/preprocessor_definitions.json"
-      }
-  },
-  "TargetName" : "gen3flex@dlt"
-}
-
-
-

The config.json file is handled by JsonPreprocessor package, then return the dictionary object for a program like below:

-
{
-  "Project": "G3g",
-  "WelcomeString": "Hello... ROBFW is running now!",
-  "version": {
-    "majorversion": "0",
-    "minorversion": "1",
-    "patchversion": "1"
-  },
-  "params": {
-    "global": {
-      "gGlobalIntParam" : 1,
-      "gGlobalFloatParam" : 1.332,
-      "gGlobalString"   : "This is a string",
-      "gGlobalStructure": {
-        "general": "general"
-        }
-    }
-  },
-  "preprocessor": {
-    "definitions": {
-      "gPreprolIntParam" : 1,
-      "gPreproFloatParam" : 1.332,
-      "gPreproString"   : "This is a string",
-      "gPreproStructure": {
-                         "general": "general"
-                        }
-    }
-  },
-  "TargetName" : "gen3flex@dlt"
-}
-
-
-
-
-

Overwrite existing and add new parameters¶

-

This package also provides user ability to overwrite or update as well as add new -parameters. User can update parameters which are already declared and add new parameters -or new element into existing parameters. The below example will show the way to do -these features.

-

In case we have many different variants, and each varaint requires a different value -assigned to the parameter. This feature could help us update new value for existen -parameters, it also supports to add new parameters to existen configuation object.

-

Example:

-

Suppose we have the json file params_global.json with the content:

-
{
-  "gGlobalIntParam" : 1,
-
-  "gGlobalFloatParam" : 1.332, // This parameter is used to configure for ....
-
-  "gGlobalString"   : "This is a string",
-
-  "gGlobalStructure": {
-    "general": "general"
-  }
-}
-
-
-

Then we import params_global.json to json file config.json with content:

-
{
-  "Project": "G3g",
-  "WelcomeString": "Hello... ROBFW is running now!",
-  // Version control information.
-  "version": {
-    "majorversion": "0",
-    "minorversion": "1",
-    "patchversion": "1"
-  },
-  "params": {
-    // Global parameters
-    "global": {
-               "[import]": "<path_to_the_imported_file>/params_global.json"
-      }
-    },
-  "TargetName" : "gen3flex@dlt",
-  // Overwrite parameters
-  "${params}['global']['gGlobalFloatParam']": 9.999,
-  "${version}['patchversion']": "2",
-  "${params}['global']['gGlobalString']": "This is the new value for the already existing parameter.",
-  // Add new parameters
-  "${newParam}": {
-                               "abc": 9,
-                               "xyz": "new param"
-  },
-  "${params}['global']['gGlobalStructure']['newGlobalParam']": 123
-}
-
-
-

The config.json file is handled by JsonPreprocessor package, then return the dictionary object for a program like below:

-
{
-  "Project": "G3g",
-  "WelcomeString": "Hello... ROBFW is running now!",
-  "version": {
-    "majorversion": "0",
-    "minorversion": "1",
-    "patchversion": "2"
-  },
-  "params": {
-    "global": {
-      "gGlobalIntParam" : 1,
-      "gGlobalFloatParam" : 9.999,
-      "gGlobalString"   : "This is the new value for the already existing parameter.",
-      "gGlobalStructure": {
-        "general": "general",
-               "newGlobalParam": 123
-        }
-      }
-  },
-  "TargetName": "gen3flex@dlt",
-  "newParam": {
-         "abc": 9,
-         "xyz": "new param"
-  }
-}
-
-
-
-
-

Nested parameters¶

-

With JsonPreprocessor package, user can also use nested parameters as example below:

-

Example:

-

Suppose we have the json file config.json with the content:

-
{
-  "Project": "G3g",
-  "WelcomeString": "Hello... ROBFW is running now!",
-  // Version control information.
-  "version": {
-    "majorversion": "0",
-    "minorversion": "1",
-    "patchversion": "1"
-  },
-  "params": {
-    // Global parameters
-    "global": {
-      "gGlobalIntParam" : 1,
-      "gGlobalFloatParam" : 1.332, // This parameter is used to configure for ....
-      "gGlobalString"   : "This is a string",
-      "gGlobalStructure": {
-        "general": "general"
-        }
-    }
-  },
-  "preprocessor": {
-    "definitions": {
-      "gPreprolIntParam" : 1,
-      "gPreproFloatParam" : 9.664,
-         "ABC": "checkABC",
-      "gPreproString"   : "This is a string",
-      "gPreproStructure": {
-                         "general": "general"
-                        }
-    }
-  },
-  "TargetName" : "gen3flex@dlt",
-  // Nested parameter
-  "${params}['global'][${preprocessor}['definitions']['ABC']]": true,
-  "${params}['global']['gGlobalFloatParam']": "${preprocessor}['definitions']['gPreproFloatParam']"
-}
-
-
-

The config.json file is handled by JsonPreprocessor package, then return the dictionary object for a program like below:

-
{
-  "Project": "G3g",
-  "WelcomeString": "Hello... ROBFW is running now!",
-  "version": {
-    "majorversion": "0",
-    "minorversion": "1",
-    "patchversion": "1"
-  },
-  "params": {
-    "global": {
-      "gGlobalIntParam" : 1,
-      "gGlobalFloatParam" : 9.664,
-      "gGlobalString"   : "This is a string",
-      "gGlobalStructure": {
-        "general": "general"
-        },
-         "checkABC": true
-    }
-  },
-  "preprocessor": {
-    "definitions": {
-      "gPreprolIntParam" : 1,
-      "gPreproFloatParam" : 9.664,
-         "ABC": "checkABC",
-      "gPreproString"   : "This is a string",
-      "gPreproStructure": {
-                         "general": "general"
-                        }
-    }
-  },
-  "TargetName" : "gen3flex@dlt"
-}
-
-
-
-
-
-

Feedback¶

-

To give us a feedback, you can send an email to Thomas Pollerspöck or -RBVH-ECM-Automation_Test_Framework-Associates

-

In case you want to report a bug or request any interesting feature, please don’t hesitate to rasie a ticket on -our Jira

-
-
-

References¶

-

For more information please refer to our Bosch Connect Community

-
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/doc/_build/html/genindex.html b/doc/_build/html/genindex.html deleted file mode 100644 index 2d063a11..00000000 --- a/doc/_build/html/genindex.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - Index — The Json Preprocessor documentation - - - - - - - - - - - - - - - - - -
- - -
-
- - - - - - - \ No newline at end of file diff --git a/doc/_build/html/index.html b/doc/_build/html/index.html deleted file mode 100644 index 6fa43ffb..00000000 --- a/doc/_build/html/index.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - Json Preprocessor’s API! — The Json Preprocessor documentation - - - - - - - - - - - - - - - - - - -
-
-
- - - - -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/doc/_build/html/objects.inv b/doc/_build/html/objects.inv deleted file mode 100644 index 765f4a34..00000000 --- a/doc/_build/html/objects.inv +++ /dev/null @@ -1,5 +0,0 @@ -# Sphinx inventory version 2 -# Project: The Json Preprocessor -# Version: -# The remainder of this file is compressed using zlib. -xÚ¥“ÍN„0…÷<Å5ºu;;ÃÄd&þàžÜi¯ZZÒ–dØù¾žO"¥N`„ÉŒ²kzîùÎ)´ñÚ(™hª´bdŒÒP5‹RñZÜ@ü[r[ŠK¯‡Wã‰xŠÈ·Ç€g’¢·vãA!ïJ’Íÿ33iZ›\§ÏOKbŠÓŒz#TÄjcU™†2S’ÑŒži#-î^šŠþ_°gt_ÎÐZ]ljKs`Uwð980–/¸bóÁø!{Ç-Èya %Qd-áú•Ð֚ܺ.©íè´!ÿœù>†™_Ÿî½–CC°%YHN».Ià†„ËÚïzÞÊ-ƒ~ì§Ð`b:ñ.Y]í#›¨šp/x£«>j ž°ù»{è6„šå‡F¿ç=©×÷¾kŒú \ No newline at end of file diff --git a/doc/_build/html/py-modindex.html b/doc/_build/html/py-modindex.html deleted file mode 100644 index 3a6e54a4..00000000 --- a/doc/_build/html/py-modindex.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - Python Module Index — The Json Preprocessor documentation - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - -

Python Module Index

- -
- c -
- - - - - - - -
 
- c
- CJsonPreprocessor -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/doc/_build/html/search.html b/doc/_build/html/search.html deleted file mode 100644 index 97710925..00000000 --- a/doc/_build/html/search.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - Search — The Json Preprocessor documentation - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -

Search

- - - - -

- Searching for multiple words only shows matches that contain - all words. -

- - -
- - - -
- - - -
- -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/doc/_build/html/searchindex.js b/doc/_build/html/searchindex.js deleted file mode 100644 index 077c5652..00000000 --- a/doc/_build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["CJsonPreprocessor","additional_doc/feature_documentation","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["CJsonPreprocessor.rst","additional_doc\\feature_documentation.rst","index.rst"],objects:{"":[[0,0,0,"-","CJsonPreprocessor"]],"CJsonPreprocessor.CJsonPreprocessor":[[0,2,1,"","jsonLoad"]],"CJsonPreprocessor.CPythonJSONDecoder":[[0,2,1,"","custom_scan_once"]],"CJsonPreprocessor.CSyntaxType":[[0,3,1,"","json"],[0,3,1,"","python"]],CJsonPreprocessor:[[0,1,1,"","CJsonPreprocessor"],[0,1,1,"","CPythonJSONDecoder"],[0,1,1,"","CSyntaxType"]]},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:attribute"},terms:{"0":1,"1":1,"123":1,"2":1,"332":1,"664":1,"9":1,"999":1,"case":1,"class":0,"do":1,"final":1,"function":1,"import":0,"pollersp\u00f6ck":1,"return":[0,1],"switch":1,"true":[0,1],And:1,For:1,In:1,The:1,Then:1,To:1,With:1,abc:1,abil:1,abov:1,add:0,addit:1,aio:1,all:1,allow:[0,1],alreadi:1,also:1,an:1,ani:1,ar:1,arg:0,assign:1,associ:1,author:1,automation_test_framework:1,base:0,becuas:1,below:[0,1],big:1,block:1,bosch:1,bug:1,can:1,checkabc:1,cjsonpreprocessor:0,clarifi:1,code:1,comment:0,common:1,commun:1,config:1,configu:1,configur:[0,1],connect:1,contain:1,control:1,could:1,cpythonjsondecod:0,csyntaxtyp:0,currentcfg:0,custom_scan_onc:0,data:0,declar:1,decod:0,defin:1,definit:1,detail:2,dict:0,dictionari:1,differ:1,distinguish:1,dlt:1,document:2,don:1,each:1,easi:1,ecm:1,element:1,email:1,etc:1,exampl:1,existen:1,fals:0,featur:2,feedback:2,file:0,follow:1,format:0,forth:1,g3g:1,gen3flex:1,gener:1,gglobalfloatparam:1,gglobalintparam:1,gglobalstr:1,gglobalstructur:1,give:1,global:1,gpreprofloatparam:1,gpreprolintparam:1,gpreprostr:1,gpreprostructur:1,handl:[0,1],have:1,hello:1,help:[0,1],hesit:1,huge:1,idx:0,includ:1,inform:1,input:0,interest:1,introduct:2,jfile:0,jira:1,json:0,jsondecod:0,jsonload:0,jsonpreprocessor:[1,2],kwarg:0,larg:1,like:1,load:0,majorvers:1,manag:1,mani:1,masterfil:0,mean:1,merg:1,method:0,minorvers:1,modul:2,more:1,must:1,need:1,newglobalparam:1,newparam:1,none:0,note:1,now:1,number:1,object:[0,1],ojson:0,our:1,overrid:1,packag:[1,2],param:1,params_glob:1,pars:0,patchvers:1,path_to_the_imported_fil:1,pleas:1,preprocessor_definit:1,program:1,programm:1,project:1,provid:1,purpos:1,python3:1,python:[0,1],rasi:1,rbvh:1,refer:2,report:1,request:1,requir:1,reset:1,robfw:1,run:1,scan:0,send:1,separ:1,show:1,so:1,some:1,sourc:0,string:[0,1],support:1,suppos:1,syntax:0,t:1,targetnam:1,team:1,test:1,therefor:1,thi:1,thoma:1,ticket:1,type:1,understand:1,updat:1,us:1,user:1,valu:[0,1],varaint:1,variant:1,version:1,wai:1,want:1,we:1,welcomestr:1,well:1,when:0,which:1,within:0,xyz:1,you:1},titles:["JsonPreprocessor package","Json Preprocessor\u2019s Feature Documentation","Json Preprocessor\u2019s API!"],titleterms:{"import":1,"new":1,ad:1,add:1,api:2,comment:1,content:[0,1,2],detail:1,document:1,exist:1,featur:1,feedback:1,file:1,from:1,introduct:1,json:[1,2],jsonpreprocessor:0,modul:0,nest:1,other:1,overwrit:1,packag:0,paramet:1,preprocessor:[1,2],refer:1,s:[1,2]}}) \ No newline at end of file diff --git a/doc/_build/latex/Json-Preprocessor.pdf b/doc/_build/latex/Json-Preprocessor.pdf deleted file mode 100644 index f8387b13b4c0e9cf82ae43f1169adfe6165e8840..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302891 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%0As^t+UJ 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

9+z02I+Ls7^|W8l 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 B{DxqRi+zVO7Dz|eSw4B6r>4qkzh%SjwBr5r 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 diff --git a/doc/conf.py b/doc/conf.py deleted file mode 100644 index 958d6ab7..00000000 --- a/doc/conf.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright 2020-2022 Robert Bosch GmbH -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "./../JsonPreprocessor"))) - -# print("(debug) sys.path:\n" + '\n'.join(sys.path)) - -# -- Project information ----------------------------------------------------- - -project = 'The Json Preprocessor' -copyright = '2021, Pollerspoeck Thomas (XC-CI1/ECA3)' -author = 'Pollerspoeck Thomas (XC-CI1/ECA3)' - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.viewcode', - 'sphinx.ext.todo', -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# -- Options for TEX/PDF output ------------------------------------------------- - -# Redefinition of text boxes (using LaTeX package 'tcolorbox' instead of the Sphinx internal 'sphinxlightbox' and 'sphinxheavybox') -latex_additional_files = ["latex_addons/sphinxlatexadmonitions.sty"] -# The original installation version of this file can be found here: -# \Lib\site-packages\sphinx\texinputs\sphinxlatexadmonitions.sty -# The latex_addons folder contains this file with the same name! -# Reason: Because of too much dependencies and adaptions the complete file has to be exchanged! - -latex_documents = [('index', 'Json-Preprocessor.tex', project, author, 'manual', False)] - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = 'en' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'alabaster' - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -# html_static_path = ['_static'] # (currently not used) - - -# -- Extension configuration ------------------------------------------------- - -# -- Options for todo extension ---------------------------------------------- - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True \ No newline at end of file diff --git a/doc/images/python3-jsonpreprocessor.png b/doc/images/python3-jsonpreprocessor.png deleted file mode 100644 index a691ae94541b94c469758043854d009da82f795f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101520 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

cpfLscmVai=8->W&I*A|uN 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 -% the noticetype is the name of the markdown directive). -% -% Markdown example to enable the text box 'boxattention': -% .. attention:: Be aware of .. -% -% The original installation version of this file can be found here: -% \Lib\site-packages\sphinx\texinputs\sphinxlatexadmonitions.sty -% -% The exchange of this file happens in file conf.py, section 'latex_additional_files'. -% -% -------------------------------------------------------------------------------------------------------------- -% -% Dependencies (they do not need to be defined at time of loading): -% - of course the various colour and dimension options handled via sphinx.sty -% - \sphinxstrong (for text boxes) -% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty -% - \savenotes/\spewnotes from sphinxpackagefootnote (for sphinxheavybox) - -% -------------------------------------------------------------------------------------------------------------- - -\usepackage[breakable,skins]{tcolorbox} -\tcbuselibrary{skins} -\tcbuselibrary{breakable} - -\usepackage{wasysym} % to enable certain symbols in text mode - -% -------------------------------------------------------------------------------------------------------------- -% definition of text boxes for every text box markdown directive -% -------------------------------------------------------------------------------------------------------------- - -\newtcolorbox{boxnote_template}[1][]{ - enhanced, - before skip=2mm, - after skip=3mm, - boxrule=2pt, - left=12mm, - right=2mm, - top=1mm, - bottom=1mm, - colback=yellow!10, - colframe=yellow!80!white, - underlay={% - \path[fill=yellow!80!white,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries \UParrow} ([xshift=10mm]interior.north west); - }, - , #1} - -\newenvironment{boxnote}[1] -{\begin{boxnote_template} -{\color{yellow!95!black} \sphinxstrong{#1}} -\vspace{5pt} -\\ -}{\end{boxnote_template}} - -% -------------------------------------------------------------------------------------------------------------- - -\newtcolorbox{boxhint_template}[1][]{ - enhanced, - before skip=2mm, - after skip=3mm, - boxrule=2pt, - left=12mm, - right=2mm, - top=1mm, - bottom=1mm, - colback=green!10, - colframe=green!80!white, - underlay={% - \path[fill=green!80!white,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries \checked} ([xshift=10mm]interior.north west); - }, - , #1} - -\newenvironment{boxhint}[1] -{\begin{boxhint_template} -{\color{green!80!white} \sphinxstrong{#1}} -\vspace{5pt} -\\ -}{\end{boxhint_template}} - -% -------------------------------------------------------------------------------------------------------------- - -\newtcolorbox{boxtip_template}[1][]{ - enhanced, - before skip=2mm, - after skip=3mm, - boxrule=2pt, - left=12mm, - right=2mm, - top=1mm, - bottom=1mm, - colback=blue!10, - colframe=blue!70!white, - underlay={% - \path[fill=blue!70!white,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries \smiley} ([xshift=10mm]interior.north west); - }, - , #1} - -\newenvironment{boxtip}[1] -{\begin{boxtip_template} -{\color{blue!70!white} \sphinxstrong{#1}} -\vspace{5pt} -\\ -}{\end{boxtip_template}} - -% -------------------------------------------------------------------------------------------------------------- - -\newtcolorbox{boxattention_template}[1][]{ - enhanced, - before skip=2mm, - after skip=3mm, - boxrule=2pt, - left=12mm, - right=2mm, - top=1mm, - bottom=1mm, - colback=orange!10, - colframe=orange!80!white, - underlay={% - \path[fill=orange!80!white,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries !} ([xshift=10mm]interior.north west); - }, - , #1} - -\newenvironment{boxattention}[1] -{\begin{boxattention_template} -{\color{orange!80!white} \sphinxstrong{#1}} -\vspace{5pt} -\\ -}{\end{boxattention_template}} - -% -------------------------------------------------------------------------------------------------------------- - -\newtcolorbox{boxcaution_template}[1][]{ - enhanced, - before skip=2mm, - after skip=3mm, - boxrule=2pt, - left=12mm, - right=2mm, - top=1mm, - bottom=1mm, - colback=orange!10, - colframe=orange!80!white, - underlay={% - \path[fill=orange!80!white,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries !} ([xshift=10mm]interior.north west); - }, - , #1} - -\newenvironment{boxcaution}[1] -{\begin{boxcaution_template} -{\color{orange!80!white} \sphinxstrong{#1}} -\vspace{5pt} -\\ -}{\end{boxcaution_template}} - -% -------------------------------------------------------------------------------------------------------------- - -\newtcolorbox{boximportant_template}[1][]{ - enhanced, - before skip=2mm, - after skip=3mm, - boxrule=2pt, - left=12mm, - right=2mm, - top=1mm, - bottom=1mm, - colback=orange!30, - colframe=orange!90!white, - underlay={% - \path[fill=orange!90!white,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries !} ([xshift=10mm]interior.north west); - }, - , #1} - -\newenvironment{boximportant}[1] -{\begin{boximportant_template} -{\color{orange!90!white} \sphinxstrong{#1}} -\vspace{5pt} -\\ -}{\end{boximportant_template}} - -% -------------------------------------------------------------------------------------------------------------- - -\newtcolorbox{boxdanger_template}[1][]{ - enhanced, - before skip=2mm, - after skip=3mm, - boxrule=2pt, - left=12mm, - right=2mm, - top=1mm, - bottom=1mm, - colback=red!10, - colframe=red!70!white, - underlay={% - \path[fill=red!70!white,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries \frownie} ([xshift=10mm]interior.north west); - }, - , #1} - -\newenvironment{boxdanger}[1] -{\begin{boxdanger_template} -{\color{red} \sphinxstrong{#1}} -\vspace{5pt} -\\ -}{\end{boxdanger_template}} - -% -------------------------------------------------------------------------------------------------------------- - -\newtcolorbox{boxwarning_template}[1][]{ - enhanced, - before skip=2mm, - after skip=3mm, - boxrule=2pt, - left=12mm, - right=2mm, - top=1mm, - bottom=1mm, - colback=red!10, - colframe=red!70!white, - underlay={% - \path[fill=red!70!white,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries \frownie} ([xshift=10mm]interior.north west); - }, - , #1} - -\newenvironment{boxwarning}[1] -{\begin{boxwarning_template} -{\color{red} \sphinxstrong{#1}} -\vspace{5pt} -\\ -}{\end{boxwarning_template}} - -% -------------------------------------------------------------------------------------------------------------- - -\newtcolorbox{boxerror_template}[1][]{ - enhanced, - before skip=2mm, - after skip=3mm, - boxrule=2pt, - left=12mm, - right=2mm, - top=1mm, - bottom=1mm, - colback=red!30, - colframe=red!90!white, - underlay={% - \path[fill=red!90!white,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries \lightning} ([xshift=10mm]interior.north west); - }, - , #1} - -\newenvironment{boxerror}[1] -{\begin{boxerror_template} -{\color{red} \sphinxstrong{#1}} -\vspace{5pt} -\\ -}{\end{boxerror_template}} - -% -------------------------------------------------------------------------------------------------------------- -% the main dispatch for all types of notices -% -------------------------------------------------------------------------------------------------------------- -\newenvironment{sphinxadmonition}[2]{% #1=type, #2=heading - % can't use #1 directly in definition of end part - \def\spx@noticetype {#1}% - % start specific environment, passing the heading as argument - \begin{box#1}{#2}} - % workaround some LaTeX "feature" of \end command - {\edef\spx@temp{\noexpand\end{box\spx@noticetype}}\spx@temp} - -% -------------------------------------------------------------------------------------------------------------- - -\endinput diff --git a/dump_repository_config.py b/dump_repository_config.py new file mode 100644 index 00000000..fcc051b8 --- /dev/null +++ b/dump_repository_config.py @@ -0,0 +1,75 @@ +# ************************************************************************************************************** +# +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ************************************************************************************************************** +# +# dump_repository_config.py +# +# XC-CT/ECA3-Queckenstedt +# +# dump_repository_config.py is a little helper to get deeper knowledge about the environment under which +# the software in this repository is being executed. +# +# The script prints all repository configuration values to console: +# Reference: +# - config\repository_config.json +# - config\CRepositoryConfig.py +# +# -------------------------------------------------------------------------------------------------------------- +# +import os, sys + +import colorama as col + +from config.CRepositoryConfig import CRepositoryConfig + +col.init(autoreset=True) + +COLBR = col.Style.BRIGHT + col.Fore.RED +COLBY = col.Style.BRIGHT + col.Fore.YELLOW +COLBG = col.Style.BRIGHT + col.Fore.GREEN + +SUCCESS = 0 +ERROR = 1 + +# -------------------------------------------------------------------------------------------------------------- + +def printerror(sMsg): + sys.stderr.write(COLBR + f"Error: {sMsg}!\n") + +def printexception(sMsg): + sys.stderr.write(COLBR + f"Exception: {sMsg}!\n") + +# -------------------------------------------------------------------------------------------------------------- + +# -- setting up the repository configuration (relative to the path of this script) +oRepositoryConfig = None +try: + oRepositoryConfig = CRepositoryConfig(os.path.abspath(sys.argv[0])) +except Exception as ex: + print() + printexception(str(ex)) + print() + sys.exit(ERROR) + +# -------------------------------------------------------------------------------------------------------------- + +print(COLBG + "Repository configuration dump done") +print() +sys.exit(SUCCESS) + +# -------------------------------------------------------------------------------------------------------------- + diff --git a/genpackagedoc.py b/genpackagedoc.py new file mode 100644 index 00000000..f948d6de --- /dev/null +++ b/genpackagedoc.py @@ -0,0 +1,104 @@ +# ************************************************************************************************************** +# +# Copyright 2020-2022 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ************************************************************************************************************** +# +# genpackagedoc.py +# +# XC-CT/ECA3-Queckenstedt +# +# -------------------------------------------------------------------------------------------------------------- +# +# 29.06.2022 +# +# -------------------------------------------------------------------------------------------------------------- + +import os, sys + +import colorama as col + +from config.CRepositoryConfig import CRepositoryConfig # providing repository and environment specific information +from GenPackageDoc.CPackageDocConfig import CPackageDocConfig +from GenPackageDoc.CDocBuilder import CDocBuilder + +col.init(autoreset=True) + +COLBR = col.Style.BRIGHT + col.Fore.RED +COLBY = col.Style.BRIGHT + col.Fore.YELLOW +COLBG = col.Style.BRIGHT + col.Fore.GREEN + +SUCCESS = 0 +ERROR = 1 + +# -------------------------------------------------------------------------------------------------------------- + +def printerror(sMsg): + sys.stderr.write(COLBR + f"Error: {sMsg}!\n") + +def printexception(sMsg): + sys.stderr.write(COLBR + f"Exception: {sMsg}!\n") + +# -------------------------------------------------------------------------------------------------------------- + +# -- setting up the repository configuration (relative to the path of this script) +oRepositoryConfig = None +try: + oRepositoryConfig = CRepositoryConfig(os.path.abspath(sys.argv[0])) +except Exception as ex: + print() + printexception(str(ex)) + print() + sys.exit(ERROR) + +# -- setting up the GenPackageDoc configuration +oGenPackageDocConfig = None +try: + oPackageDocConfig = CPackageDocConfig(oRepositoryConfig) +except Exception as ex: + print() + printexception(str(ex)) + print() + sys.exit(ERROR) + +# -- setting up and calling the doc builder +try: + oDocBuilder = CDocBuilder(oPackageDocConfig) +except Exception as ex: + print() + printexception(str(ex)) + print() + sys.exit(ERROR) + +bSuccess, sResult = oDocBuilder.Build() +if bSuccess is None: + print() + printexception(sResult) + print() + sys.exit(ERROR) +elif bSuccess is False: + print() + printerror(sResult) + print() + sys.exit(ERROR) +else: + print(COLBY + sResult) + print() + print(COLBG + "genpackagedoc done") + print() + sys.exit(SUCCESS) + +# -------------------------------------------------------------------------------------------------------------- + diff --git a/packagedoc/additional_docs/Appendix.rst b/packagedoc/additional_docs/Appendix.rst new file mode 100644 index 00000000..d70d0c0b --- /dev/null +++ b/packagedoc/additional_docs/Appendix.rst @@ -0,0 +1,37 @@ +.. Copyright 2020-2022 Robert Bosch GmbH + +.. Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + +.. http://www.apache.org/licenses/LICENSE-2.0 + +.. Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**About this package:** + +.. table:: Package setup + :widths: auto + + ================== ========================= + Setup parameter Value + ================== ========================= + Name ###PACKAGENAME### + Version ###PACKAGEVERSION### + Date ###PACKAGEDATE### + Description ###DESCRIPTION### + Package URL `###REPOSITORYNAME### <###URL###>`_ + Author ###AUTHOR### + Email ###AUTHOREMAIL### + Language ###PROGRAMMINGLANGUAGE### + License ###LICENCE### + OS ###OPERATINGSYSTEM### + Python required ###PYTHONREQUIRES### + Development status ###DEVELOPMENTSTATUS### + Intended audience ###INTENDEDAUDIENCE### + Topic ###TOPIC### + ================== ========================= diff --git a/packagedoc/additional_docs/Description.rst b/packagedoc/additional_docs/Description.rst new file mode 100644 index 00000000..66b4088c --- /dev/null +++ b/packagedoc/additional_docs/Description.rst @@ -0,0 +1,24 @@ +.. Copyright 2020-2022 Robert Bosch GmbH + +.. Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + +.. http://www.apache.org/licenses/LICENSE-2.0 + +.. Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +The json preprocessor: + +.. image:: ./pictures/python3-jsonpreprocessor.png + + + +TO BE CONTINUED + + + diff --git a/doc/additional_doc/feature_documentation.rst b/packagedoc/additional_docs/Description_orig.rst similarity index 100% rename from doc/additional_doc/feature_documentation.rst rename to packagedoc/additional_docs/Description_orig.rst diff --git a/packagedoc/additional_docs/History.tex b/packagedoc/additional_docs/History.tex new file mode 100644 index 00000000..d529af95 --- /dev/null +++ b/packagedoc/additional_docs/History.tex @@ -0,0 +1,20 @@ +% Copyright 2020-2022 Robert Bosch GmbH + +% Licensed under the Apache License, Version 2.0 (the "License"); +% you may not use this file except in compliance with the License. +% You may obtain a copy of the License at + +% http://www.apache.org/licenses/LICENSE-2.0 + +% Unless required by applicable law or agreed to in writing, software +% distributed under the License is distributed on an "AS IS" BASIS, +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +% See the License for the specific language governing permissions and +% limitations under the License. + +\begin{center} +\begin{tabular}{| m{6em} | m{26em} |}\hline + \textbf{0.1.0} & 01/2022\\ \hline + \multicolumn{2}{| m{32em} |}{\textit{Initial version}}\\ \hline +\end{tabular} +\end{center} diff --git a/packagedoc/additional_docs/Introduction.rst b/packagedoc/additional_docs/Introduction.rst new file mode 100644 index 00000000..7e72e6c3 --- /dev/null +++ b/packagedoc/additional_docs/Introduction.rst @@ -0,0 +1,17 @@ +.. Copyright 2020-2022 Robert Bosch GmbH + +.. Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + +.. http://www.apache.org/licenses/LICENSE-2.0 + +.. Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*Json Preprocessor* + +!!! add introduction - if wanted !! diff --git a/doc/_build/html/_images/python3-jsonpreprocessor.png b/packagedoc/additional_docs/pictures/python3-jsonpreprocessor.png similarity index 100% rename from doc/_build/html/_images/python3-jsonpreprocessor.png rename to packagedoc/additional_docs/pictures/python3-jsonpreprocessor.png diff --git a/packagedoc/packagedoc_config.json b/packagedoc/packagedoc_config.json new file mode 100644 index 00000000..c927d22c --- /dev/null +++ b/packagedoc/packagedoc_config.json @@ -0,0 +1,127 @@ +# ************************************************************************************************************** +# GenPackageDoc configuration file +# +# GenPackageDoc creates tex files out of the docstrings of Python modules and out of separate rst files. +# With the help of a LaTeX compiler the tex files can be converted into a PDF file. +# This json file contains the required settings. +# +# 29.06.2022 +# +# ************************************************************************************************************** +# Format: extended json format with the possibility to comment out lines (by '#' at the beginning of the line). +# All fixed terms (keys) have to be written in capital letters, all user defined keys in small letters. +# Paths to files and folders within this file must be relative (except "TEX"). The reference for relative paths +# is the position of this file. +# -------------------------------------------------------------------------------------------------------------- + +{ + +# Section "CONTROL": +# ------------------ +# Contains parameter to control the application behavior in general. + + "CONTROL" : { + # if 'INCLUDEPRIVATE' is false: private methods are skipped, otherwise they are included in documentation + "INCLUDEPRIVATE" : false, + # if 'INCLUDEUNDOCUMENTED' is true: also classes and methods without docstring are listed in the documentation; + # otherwise they are skipped + "INCLUDEUNDOCUMENTED" : true, + # if 'STRICT' is true: missing LaTeX compiler causes an error; otherwise PDF generation is handled as option + # and a missing LaTeX compiler does not cause an error + "STRICT" : false + }, + +# Section "TOC": +# -------------- +# Defines the content of the PDF document (= the order of the chapters). +# A chapter can be represented by an additional text file in rst format. Every rst file is a separate chapter +# within the resulting PDF document. +# A chapter can also be represented by an additional tex file. Every tex file is a separate chapter +# within the resulting PDF document. +# In case of Python modules are involved, every Python module is a chapter. +# Class and function definitions within a Python module are subchapters. Methods of classes are subsubchapters. +# In this section every additional rst file is represented by a short name (key) and a path incl. file name (key value). +# This is completely under the responsibility of the user and therefore the names have to be written in small letters only. +# The keys with name starting with "INTERFACE" points to folder containing Python modules that have to be documented. +# In case of a repository contains several separate folder with Python modules, it is possible to use more than one +# key starting with "INTERFACE", e.g. "INTERFACE_part1" and "INTERFACE_part2". +# The key "DOCUMENTPARTS" contains a list of all defined keys in the order of their desired appearances within the resulting PDF document. +# It is strongly recommended to place all additional rst files flat into one single folder (and not in any further sub folder). +# Reason is that currently the tex files generated out of the rst files are also placed flat into only one single output folder +# (see section "OUTPUT") and the relative paths to possibly imported pictures (see section "PICTURES") must be kept valid! + + "TOC" : { + "introduction" : "./additional_docs/Introduction.rst", + "description" : "./additional_docs/Description.rst", + "INTERFACE" : "../###PACKAGENAME###", + "appendix" : "./additional_docs/Appendix.rst", + "history" : "./additional_docs/History.tex", + "DOCUMENTPARTS" : ["introduction","description","INTERFACE","appendix","history"] + }, + +# Section "PARAMS": +# ----------------- +# In this section a user has the ability to define own runtime variables, that are accessible within the doctrings of involved Python modules +# and also within separate rst files. Key names have to be written in small letters to indicate that they are user defined. +# Values can be either hard coded or taken over from the repository configuration (see config/repository_config.json). +# In second case the key name has to be encapsulated within three hashes '#'. The same notation can be used in rst files and doctrings +# of Python modules (for example adding an additional hint within a doctring of a class: ###additional_hint###). +# This mechanism is limited to strings! +# This key is optional. In case of own parameters are not needed, this key can be removed or set to null. + + # "PARAMS" : { + # "" : "", + # }, + +# Section "DOCUMENT": +# ------------------- +# This section contains basic details about the output document. Like in the previous section, values can be defined +# either hard coded or taken over from the repository configuration (with '#' notation). +# The keys in this section also are runtime variables. + + "DOCUMENT" : { + "OUTPUTFILENAME" : "###PACKAGENAME###.tex", + "AUTHOR" : "###AUTHOR###", + "TITLE" : "###PACKAGENAME###", + "DATE" : "###PACKAGEDATE###", + "VERSION" : "###PACKAGEVERSION###" + }, + +# Section "PICTURES": +# ------------------- +# Additional rst files may import pictures. GenPackageDoc needs to know where to find them. +# To keep the relative paths to possibly imported pictures valid also within the created tex files, +# this pictures folder will be copied into the output folder defined by key "OUTPUT". +# This key is optional. In case of there are no pictures needed in this package description, +# this key can be removed or set to null. + + "PICTURES" : "./additional_docs/pictures", + +# Section "OUTPUT": +# ----------------- +# Defines the path to the output folder containing the generated tex files and the PDF file. + + "OUTPUT" : "./build", + +# Section "PDFDEST": +# ----------------- +# Defines the path to a folder in which the PDF file will be copied after creation +# (the "OUTPUT" folder in which the LaTeX compiler creates the PDF file, is not really a proper destination finally) +# This key is optional. In case of it is not required to copy the PDF file to another location, +# this key can be removed or set to null. + + "PDFDEST" : "../###PACKAGENAME###", + +# Section "TEX": +# ----------------- +# Converting the generated text source files to a PDF document requires a LaTeX distribution. +# GenPackageDoc needs to know where to find LaTeX. Because the path to the LaTeX interpreter depends +# on the operating system, this path has to be defined separately for every supported operating system +# (currently "WINDOWS" and "LINUX"). +# Example: + + "TEX" : { + "WINDOWS" : "%ROBOTLATEXPATH%/miktex/bin/x64/pdflatex.exe", + "LINUX" : "${ROBOTLATEXPATH}/miktex/bin/x64/pdflatex" + } +} diff --git a/setup.py b/setup.py index 22358c59..749203b5 100644 --- a/setup.py +++ b/setup.py @@ -20,12 +20,12 @@ # # XC-CT/ECA3-Queckenstedt # -# Extends the standard setuptools installation by adding the documentation in HTML format +# Extends the standard setuptools installation by adding the documentation in PDF format # (requires installation mode) and tidying up some folders. # # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # -# This script deletes folders (as defined in config.CConfig, depending on the position of this script): +# This script deletes folders (as defined in config.CRepositoryConfig, depending on the position of this script): # - previous builds within this repository # - previous installations within # * \Lib\site-packages (Windows) @@ -44,9 +44,9 @@ # The usual # packages = setuptools.find_packages(), # is replaced by -# packages = [str(oRepositoryConfig.Get('sPackageName')), ], -# to avoid that also config.CConfig() and config.CExtendedSetup() are part of the distribution. -# CConfig and CExtendedSetup() are only repository internal helper. +# packages = [str(oRepositoryConfig.Get('PACKAGENAME')), ], +# to avoid that also config.CRepositoryConfig() and additions.CExtendedSetup() are part of the distribution. +# CRepositoryConfig and CExtendedSetup() are only repository internal helper. # # * Known issues: # @@ -60,21 +60,7 @@ # # -------------------------------------------------------------------------------------------------------------- # -# 21.02.2022 / XC-CT/ECA3-Queckenstedt -# -# "sdist bdist_wheel" maintenance: some steps moved from inside 'ExtendedInstallCommand' to outside -# -# 09.02.2022 / XC-CT/ECA3-Queckenstedt -# Suppressed generation of documents and installations in case of command line -# parameter is not 'install' and not 'build' (this enables printing the help only). (10.02.2022: and not 'sdist') -# -# 11.10.2021 / XC-CI1/ECA3-Queckenstedt -# Fixed computation order of readme files together with long_description -# -# 30.09.2021 / XC-CI1/ECA3-Queckenstedt -# Added wrapper for error messages -# -# Initial version 08/2021 +# 29.06.2022 # # -------------------------------------------------------------------------------------------------------------- @@ -82,8 +68,11 @@ import setuptools from setuptools.command.install import install -from config.CConfig import CConfig # providing repository and environment specific information -from config.CExtendedSetup import CExtendedSetup # providing functions to support the extended setup process +# prefer the repository local version of all additional libraries (instead of the installed version under site-packages) +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "./additions"))) + +from config.CRepositoryConfig import CRepositoryConfig # providing repository and environment specific information +from additions.CExtendedSetup import CExtendedSetup # providing functions to support the extended setup process import colorama as col @@ -113,28 +102,7 @@ def run(self): listCmdArgs = sys.argv if ( ('install' in listCmdArgs) or ('build' in listCmdArgs) or ('sdist' in listCmdArgs) or ('bdist_wheel' in listCmdArgs) ): - print() - print(COLBY + "Extended setup step 4/5: install.run(self)") # creates the build folder .\build - print() - install.run(self) # TODO: What does install.run(self) return? How to realize error handling? - print() - if 'bdist_wheel' in listCmdArgs: - print(COLBY + "Extended setup step 5/5: Add html documentation to local wheel folder inside build") - print() - nReturn = oExtendedSetup.add_htmldoc_to_wheel() - if nReturn != SUCCESS: - return nReturn - print() - else: - print(COLBY + "Extended setup step 5/5: Add html documentation to package installation folder") # (./doc/_build/html to \Lib\site-packages\_doc) - print() - nReturn = oExtendedSetup.add_htmldoc_to_installation() - if nReturn != SUCCESS: - return nReturn - print() - print(COLBG + "Extended installation done") - print() - + install.run(self) return SUCCESS # eof class ExtendedInstallCommand(install): @@ -146,9 +114,8 @@ def run(self): # -- setting up the repository configuration oRepositoryConfig = None -sReferencePath = os.path.dirname(os.path.abspath(sys.argv[0])) try: - oRepositoryConfig = CConfig(sReferencePath) + oRepositoryConfig = CRepositoryConfig(os.path.abspath(sys.argv[0])) except Exception as ex: print() printexception(str(ex)) @@ -176,59 +143,80 @@ def run(self): print() print(COLBY + "Extended setup step 1/5: Calling the documentation builder") - # (previously called inside ExtendedInstallCommand - but this is too late, because the content of the initially - # generated or updated README file is already needed for the long_description below.) print() - nReturn = oExtendedSetup.gen_doc() + + nReturn = oExtendedSetup.genpackagedoc() + if nReturn != SUCCESS: + sys.exit(nReturn) + + print(COLBY + "Extended setup step 2/5: Converting the repository README") + print() + + nReturn = oExtendedSetup.convert_repo_readme() if nReturn != SUCCESS: sys.exit(nReturn) - print(COLBY + "Extended setup step 2/5: Deleting previous setup outputs (build, dist, .egg-info within repository)") + print(COLBY + "Extended setup step 3/5: Deleting previous setup outputs (build, dist, .egg-info within repository)") print() nReturn = oExtendedSetup.delete_previous_build() if nReturn != SUCCESS: sys.exit(nReturn) - if not 'bdist_wheel' in listCmdArgs: + if ( ('bdist_wheel' in listCmdArgs) or ('build' in listCmdArgs) ): + print() + print(COLBY + "Skipping extended setup step 4/5: Deleting previous package installation folder within site-packages") + print() + else: print() - print(COLBY + "Extended setup step 3/5: Deleting previous package installation folder within site-packages") # ( and _doc under \Lib\site-packages + print(COLBY + "Extended setup step 4/5: Deleting previous package installation folder within site-packages") # ( and _doc under \Lib\site-packages print() nReturn = oExtendedSetup.delete_previous_installation() if nReturn != SUCCESS: sys.exit(nReturn) - with open("README.md", "r", encoding="utf-8") as fh: + README_MD = str(oRepositoryConfig.Get('README_MD')) + with open(README_MD, "r", encoding="utf-8") as fh: long_description = fh.read() - print() - + fh.close() # -------------------------------------------------------------------------------------------------------------- -# This also handles the printing of help to console and therefore must be called in every case. -# And therefore all variables and objects must exist (even in case of the values are not used). +# -- the 'setup' itself + +print(COLBY + "Extended setup step 5/5: install.run(self)") +print() + setuptools.setup( - name = str(oRepositoryConfig.Get('sPackageName')), - version = str(oRepositoryConfig.Get('sVersion')), - author = str(oRepositoryConfig.Get('sAuthor')), - author_email = str(oRepositoryConfig.Get('sAuthorEMail')), - description = str(oRepositoryConfig.Get('sDescription')), + name = str(oRepositoryConfig.Get('REPOSITORYNAME')), + version = str(oRepositoryConfig.Get('PACKAGEVERSION')), + author = str(oRepositoryConfig.Get('AUTHOR')), + author_email = str(oRepositoryConfig.Get('AUTHOREMAIL')), + description = str(oRepositoryConfig.Get('DESCRIPTION')), long_description = long_description, - long_description_content_type = str(oRepositoryConfig.Get('sLongDescriptionContentType')), - url = str(oRepositoryConfig.Get('sURL')), - packages = [str(oRepositoryConfig.Get('sPackageName')), ], + long_description_content_type = str(oRepositoryConfig.Get('LONGDESCRIPTIONCONTENTTYPE')), + url = str(oRepositoryConfig.Get('URL')), + packages = [str(oRepositoryConfig.Get('PACKAGENAME')),], + package_dir = {str(oRepositoryConfig.Get('REPOSITORYNAME')) : str(oRepositoryConfig.Get('PACKAGENAME'))}, classifiers = [ - str(oRepositoryConfig.Get('sProgrammingLanguage')), - str(oRepositoryConfig.Get('sLicence')), - str(oRepositoryConfig.Get('sOperatingSystem')), - str(oRepositoryConfig.Get('sDevelopmentStatus')), - str(oRepositoryConfig.Get('sIntendedAudience')), - str(oRepositoryConfig.Get('sTopic')), + str(oRepositoryConfig.Get('PROGRAMMINGLANGUAGE')), + str(oRepositoryConfig.Get('LICENCE')), + str(oRepositoryConfig.Get('OPERATINGSYSTEM')), + str(oRepositoryConfig.Get('DEVELOPMENTSTATUS')), + str(oRepositoryConfig.Get('INTENDEDAUDIENCE')), + str(oRepositoryConfig.Get('TOPIC')), ], - python_requires = str(oRepositoryConfig.Get('sPythonRequires')), + python_requires = str(oRepositoryConfig.Get('PYTHONREQUIRES')), cmdclass={ 'install': ExtendedInstallCommand, }, - install_requires = oRepositoryConfig.Get('arInstallRequires'), + install_requires = oRepositoryConfig.Get('INSTALLREQUIRES'), + package_data={f"{oRepositoryConfig.Get('PACKAGENAME')}" : oRepositoryConfig.Get('PACKAGEDATA')}, ) # -------------------------------------------------------------------------------------------------------------- +print() +print(COLBG + "Extended installation done") +print() + +# -------------------------------------------------------------------------------------------------------------- + diff --git a/sphinx-makeall.py b/sphinx-makeall.py deleted file mode 100644 index 8b5d87d8..00000000 --- a/sphinx-makeall.py +++ /dev/null @@ -1,344 +0,0 @@ -# ************************************************************************************************************** -# -# Copyright 2020-2022 Robert Bosch GmbH -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# ************************************************************************************************************** -# -# sphinx-makeall.py -# -# XC-CT/ECA3-Queckenstedt -# -# Uses the Python documentation tool Sphinx to generate the documentation of Python modules -# - based on the docstrings inside the Python modules and -# - based on additionally included separate text files (containing usually more common information -# than the docstrings of the Python modules). -# -# The docstrings and the additionally included text files have to be written in reStructureText syntax. -# The output is available in HTML format and in LaTeX format (.tex), optionally also in PDF. -# -# Preconditions: -# - Sphinx available as part of the Python installation. -# - Sphinx documentation project files already created and adapted to the local repository -# (see conf.py and index.rst). -# - LaTeX compiler (in case of output in PDF format is wanted) -# - pandoc and pypandoc for conversions between markdown formats -# -# Known issues: -# - LaTeX compiler throws some warnings when computing Sphinx output. -# -# -------------------------------------------------------------------------------------------------------------- -# -# 02.11.2021 / XC-CT/ECA3-Queckenstedt -# gen_doc_pdf called twice (to get also a table of content added to PDF file) -# -# 30.09.2021 / XC-CI1/ECA3-Queckenstedt -# Added wrapper for error messages -# -# Initial version 08/2021 -# -# -------------------------------------------------------------------------------------------------------------- - -import os, sys, platform, shlex, subprocess - -import pypandoc - -from config.CConfig import CConfig # providing repository and environment specific information - -import colorama as col - -col.init(autoreset=True) - -COLBR = col.Style.BRIGHT + col.Fore.RED -COLBY = col.Style.BRIGHT + col.Fore.YELLOW -COLBG = col.Style.BRIGHT + col.Fore.GREEN - -SUCCESS = 0 -ERROR = 1 - -# -------------------------------------------------------------------------------------------------------------- - -def printerror(sMsg): - sys.stderr.write(COLBR + f"Error: {sMsg}!\n") - -def printexception(sMsg): - sys.stderr.write(COLBR + f"Exception: {sMsg}!\n") - -# -------------------------------------------------------------------------------------------------------------- - -def convert_repo_readme(oRepositoryConfig=None): - """Converts the main repository README from 'rst' to 'md' format. - """ - - if oRepositoryConfig is None: - print() - printerror("oRepositoryConfig is None") - print() - return ERROR - - sReadMe_rst = oRepositoryConfig.Get("sReadMe_rst") - if sReadMe_rst is None: - return ERROR - - sReadMe_md = oRepositoryConfig.Get("sReadMe_md") - if sReadMe_md is None: - return ERROR - - if os.path.isfile(sReadMe_rst) is False: - print() - printerror(f"Missing readme file '{sReadMe_rst}'") - print() - return ERROR - - sFileContent = pypandoc.convert_file(sReadMe_rst, 'md') - hFile_md = open(sReadMe_md, "w", encoding="utf-8") - listFileContent = sFileContent.splitlines() - for sLine in listFileContent: - hFile_md.write(sLine + "\n") - hFile_md.close() - - print() - print(COLBY + f"File '{sReadMe_rst}'") - print(COLBY + "converted to") - print(COLBY + f"'{sReadMe_md}'") - print() - - return SUCCESS - -# eof def convert_repo_readme(oRepositoryConfig=None): - -# -------------------------------------------------------------------------------------------------------------- - -def sphinx_build(sFormat=None, oRepositoryConfig=None): - """Executes Sphinx to generate the documentation in format 'sFormat'. - """ - - if sFormat is None: - print() - printerror("sFormat is None") - print() - return ERROR - - if oRepositoryConfig is None: - print() - printerror("oRepositoryConfig is None") - print() - return ERROR - - SPHINXBUILD = oRepositoryConfig.Get("SPHINXBUILD") - if SPHINXBUILD is None: - return ERROR - - SOURCEDIR = oRepositoryConfig.Get("SOURCEDIR") - if SOURCEDIR is None: - return ERROR - - BUILDDIR = oRepositoryConfig.Get("BUILDDIR") - if BUILDDIR is None: - return ERROR - - sPython = oRepositoryConfig.Get("sPython") - if sPython is None: - return ERROR - - listCmdLineParts = [] - listCmdLineParts.append(f"\"{sPython}\"") - listCmdLineParts.append(f"\"{SPHINXBUILD}\"") - listCmdLineParts.append(f"-M {sFormat}") - listCmdLineParts.append(f"\"{SOURCEDIR}\"") - listCmdLineParts.append(f"\"{BUILDDIR}\"") - - sCmdLine = " ".join(listCmdLineParts) - del listCmdLineParts - listCmdLineParts = shlex.split(sCmdLine) - - # -- debug - sCmdLine = " ".join(listCmdLineParts) - print() - print("Now executing command line:\n" + sCmdLine) - print() - - nReturn = ERROR - try: - nReturn = subprocess.call(listCmdLineParts) - except Exception as ex: - printexception(str(ex)) - print() - return ERROR - - print() - - return nReturn - -# eof def sphinx_build(sFormat=None, oRepositoryConfig=None): - -# -------------------------------------------------------------------------------------------------------------- - -def gen_doc_pdf(oRepositoryConfig=None): - """Executes LaTeX to generate the documentation in PDF format (based on previously generated LaTeX format). - """ - - if oRepositoryConfig is None: - print() - printerror("oRepositoryConfig is None") - print() - return ERROR - - print() # empty line after Sphinx console output - for better readibility - - BUILDDIR = oRepositoryConfig.Get("BUILDDIR") - if BUILDDIR is None: - return ERROR - - sLaTeXInterpreter = oRepositoryConfig.Get("sLaTeXInterpreter") - if sLaTeXInterpreter is None: - return ERROR - - # LaTeX sources are placed by Sphinx within subfolder 'latex' of folder 'BUILDDIR' - sLaTeXRoot = os.path.normpath(f"{BUILDDIR}/latex") # not part of oRepositoryConfig; only needed here! - if os.path.isdir(sLaTeXRoot) is False: - print() - printerror(f"Missing LaTeX documentation folder '{sLaTeXRoot}'") - print() - return ERROR - - # Not really sure which name of main tex file we can expect here; therefore scanning for tex files and compute all of them - # (but usually only one tex file is expected) - listTeXFiles = [] - for root, dirs, files in os.walk(sLaTeXRoot): - for name in files: - if name.lower().endswith(".tex"): - sTeXFile = os.path.join(root, name) - listTeXFiles.append(sTeXFile) - - if len(listTeXFiles) == 0: - print() - printerror(f"Missing LaTeX source files (.tex) within '{sLaTeXRoot}'") - print() - return ERROR - - for sTeXFile in listTeXFiles: - print(COLBY + f"* Rendering file '{sTeXFile}'") - print() - - listCmdLineParts = [] - listCmdLineParts.append(f"\"{sLaTeXInterpreter}\"") - listCmdLineParts.append(f"\"{sTeXFile}\"") - - sCmdLine = " ".join(listCmdLineParts) - del listCmdLineParts - listCmdLineParts = shlex.split(sCmdLine) - - # -- debug - # sCmdLine = " ".join(listCmdLineParts) - # print("Now executing command line:\n" + sCmdLine) - # print() - - nReturn = ERROR - cwd = os.getcwd() # we have to save cwd because later we have to change - try: - os.chdir(sLaTeXRoot) # otherwise LaTeX compiler is not able to find files inside - nReturn = subprocess.call(listCmdLineParts) - print() - print(f"LaTeX compiler returned {nReturn}") - print() - os.chdir(cwd) # restore original value - except Exception as ex: - printexception(str(ex)) - print() - os.chdir(cwd) # restore original value - return ERROR - - if nReturn != SUCCESS: - printerror(f"LaTeX compiler not returned expected value {SUCCESS}") - print() - return nReturn - - # finally let's see what has been generated - for root, dirs, files in os.walk(sLaTeXRoot): - for name in files: - if name.lower().endswith(".pdf"): - sPDFFile = os.path.join(root, name) - print(COLBY + f"* Created '{sPDFFile}'") - print() - - return nReturn - -# eof def gen_doc_pdf(oRepositoryConfig=None): - -# -------------------------------------------------------------------------------------------------------------- - -# -- setting up the repository configuration (relative to the path of this script) -oRepositoryConfig = None -sReferencePath = os.path.dirname(os.path.abspath(sys.argv[0])) -try: - oRepositoryConfig = CConfig(sReferencePath) -except Exception as ex: - print() - printexception(str(ex)) - print() - sys.exit(ERROR) - -# -- converting the main repository README from 'rst' to 'md' format -nReturn = convert_repo_readme(oRepositoryConfig) -if nReturn != SUCCESS: - printerror("convert_repo_readme with 'README.rst' failed") - print() - sys.exit(nReturn) - -# -- removing previous output in documentation build folder -nReturn = sphinx_build("clean", oRepositoryConfig) -if nReturn != SUCCESS: - printerror("sphinx_build 'clean' failed") - print() - sys.exit(nReturn) - -# -- generating new documentation in HTML format -nReturn = sphinx_build("html", oRepositoryConfig) -if nReturn != SUCCESS: - printerror("sphinx_build 'html' failed") - print() - sys.exit(nReturn) - -# -- generating new documentation in LaTeX format -nReturn = sphinx_build("latex", oRepositoryConfig) -if nReturn != SUCCESS: - printerror("sphinx_build 'latex' failed") - print() - sys.exit(nReturn) - -# -- generating new documentation in PDF format (requires configured LaTeX) -sLaTeXInterpreter = oRepositoryConfig.Get('sLaTeXInterpreter') -if sLaTeXInterpreter is not None: - print("Calling LaTeX PDF renderer (1/2)") - nReturn = gen_doc_pdf(oRepositoryConfig) - if nReturn != SUCCESS: - printerror("PDF generation failed") - print() - sys.exit(nReturn) - print("Calling LaTeX PDF renderer (2/2) - to get referencs and table of content updated") - nReturn = gen_doc_pdf(oRepositoryConfig) - if nReturn != SUCCESS: - printerror("PDF generation failed") - print() - sys.exit(nReturn) - -# -------------------------------------------------------------------------------------------------------------- - -print(COLBG + "sphinx-makeall done") -print() -sys.exit(SUCCESS) - -# -------------------------------------------------------------------------------------------------------------- - From 90182ee6f40ce207547aff0157ad27402744d5fe Mon Sep 17 00:00:00 2001 From: qth2hi Date: Thu, 30 Jun 2022 14:08:45 +0200 Subject: [PATCH 2/3] setup.py fix: use package name instead of repository name --- JsonPreprocessor/JsonPreprocessor.pdf | Bin 228372 -> 227975 bytes JsonPreprocessor/version.py | 4 ++-- setup.py | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/JsonPreprocessor/JsonPreprocessor.pdf b/JsonPreprocessor/JsonPreprocessor.pdf index 0c0d77a6be62b74667c25290e3833e1a9daad7e5..c172f94ec02b63ca8a92fd7344ae2877b0f83974 100644 GIT binary patch delta 48791 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­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 u8$gIfm_>kxlk*g$ diff --git a/JsonPreprocessor/version.py b/JsonPreprocessor/version.py index f5343d97..ea271838 100644 --- a/JsonPreprocessor/version.py +++ b/JsonPreprocessor/version.py @@ -18,6 +18,6 @@ # # Version and date of JsonPreprocessor # -VERSION = "0.1.0" -VERSION_DATE = "29.06.2022" +VERSION = "0.1.1" +VERSION_DATE = "30.06.2022" diff --git a/setup.py b/setup.py index 749203b5..33ea18d8 100644 --- a/setup.py +++ b/setup.py @@ -60,7 +60,7 @@ # # -------------------------------------------------------------------------------------------------------------- # -# 29.06.2022 +# 30.06.2022 # # -------------------------------------------------------------------------------------------------------------- @@ -187,7 +187,7 @@ def run(self): print() setuptools.setup( - name = str(oRepositoryConfig.Get('REPOSITORYNAME')), + name = str(oRepositoryConfig.Get('PACKAGENAME')), version = str(oRepositoryConfig.Get('PACKAGEVERSION')), author = str(oRepositoryConfig.Get('AUTHOR')), author_email = str(oRepositoryConfig.Get('AUTHOREMAIL')), @@ -196,7 +196,6 @@ def run(self): long_description_content_type = str(oRepositoryConfig.Get('LONGDESCRIPTIONCONTENTTYPE')), url = str(oRepositoryConfig.Get('URL')), packages = [str(oRepositoryConfig.Get('PACKAGENAME')),], - package_dir = {str(oRepositoryConfig.Get('REPOSITORYNAME')) : str(oRepositoryConfig.Get('PACKAGENAME'))}, classifiers = [ str(oRepositoryConfig.Get('PROGRAMMINGLANGUAGE')), str(oRepositoryConfig.Get('LICENCE')), From 718abb122ac00f1ea493009ff07b443d1ec6cfb5 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Fri, 1 Jul 2022 10:37:36 +0200 Subject: [PATCH 3/3] egg folder name fix --- JsonPreprocessor/CJsonPreprocessor.py | 2 +- JsonPreprocessor/JsonPreprocessor.pdf | Bin 227975 -> 228207 bytes JsonPreprocessor/__init__.py | 2 +- JsonPreprocessor/version.py | 4 ++-- config/CRepositoryConfig.py | 5 +++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 301d3881..dbfd2daa 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -1,4 +1,4 @@ -# Copyright 2020-2022 Robert Bosch Car Multimedia GmbH +# Copyright 2020-2022 Robert Bosch GmbH # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/JsonPreprocessor/JsonPreprocessor.pdf b/JsonPreprocessor/JsonPreprocessor.pdf index c172f94ec02b63ca8a92fd7344ae2877b0f83974..033f473a3da3068d1e4dd2f0bde82dd6fb247345 100644 GIT binary patch delta 48580 zcmV(&K;gfK^$qX#4X{-Q0yr_3QIG*Ce}#`R4}w4pg?D~M$78tK_U<@XjbcKgG4VFz zKopfhFp&8BJz#WjYSX;e?>&MC5bP5AGuI(ml~MqE6m}NE9Yib=2{_}CbAfP!v#Q3v zI}Xiz=u>T2U7K<2hx8IEu#A~xpiPF}F5(ZS+7T&2Mwvvb(hx9X;hane9dU&(GC
    bn^x22Ip!V`4O3e8fmGJ;{vvX}Ar^7ns3=F9^3U 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 Ic`@Yw56RdmsQ>@~ delta 48299 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ⅇ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 diff --git a/JsonPreprocessor/__init__.py b/JsonPreprocessor/__init__.py index 8043fb51..6034eb8a 100644 --- a/JsonPreprocessor/__init__.py +++ b/JsonPreprocessor/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2020-2022 Robert Bosch Car Multimedia GmbH +# Copyright 2020-2022 Robert Bosch GmbH # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/JsonPreprocessor/version.py b/JsonPreprocessor/version.py index ea271838..bf715f22 100644 --- a/JsonPreprocessor/version.py +++ b/JsonPreprocessor/version.py @@ -18,6 +18,6 @@ # # Version and date of JsonPreprocessor # -VERSION = "0.1.1" -VERSION_DATE = "30.06.2022" +VERSION = "0.1.2" +VERSION_DATE = "01.07.2022" diff --git a/config/CRepositoryConfig.py b/config/CRepositoryConfig.py index 5bc81020..3da68162 100644 --- a/config/CRepositoryConfig.py +++ b/config/CRepositoryConfig.py @@ -29,7 +29,7 @@ # # -------------------------------------------------------------------------------------------------------------- # -# 29.06.2022 +# 01.07.2022 # # -------------------------------------------------------------------------------------------------------------- @@ -152,7 +152,8 @@ def __InitConfig(self): self.__dictRepositoryConfig['SETUPBUILDLIBFOLDER'] = CString.NormalizePath(f"{self.__sReferencePath}/build/lib") self.__dictRepositoryConfig['SETUPBUILDLIBPACKAGEFOLDER'] = CString.NormalizePath(f"{self.__sReferencePath}/build/lib/{self.__dictRepositoryConfig['PACKAGENAME']}") self.__dictRepositoryConfig['SETUPDISTFOLDER'] = CString.NormalizePath(f"{self.__sReferencePath}/dist") - self.__dictRepositoryConfig['EGGINFOFOLDER'] = CString.NormalizePath(f"{self.__sReferencePath}/{self.__dictRepositoryConfig['PACKAGENAME']}.egg-info") + EGGINFOFOLDER = self.__dictRepositoryConfig['PACKAGENAME'].replace('-', '_') + self.__dictRepositoryConfig['EGGINFOFOLDER'] = CString.NormalizePath(f"{self.__sReferencePath}/{EGGINFOFOLDER}.egg-info") print() print(f"Running under {sPlatformSystem} ({sOSName})")