--- /dev/null
+EXCLUDE = addon cmake doc examples jquery templates testing winbuild src/logos.cpp src/lodepng.cpp
+FILE_PATTERNS = *.h *.cpp *.md
+USE_MDFILE_AS_MAINPAGE = src/doxygen.md
--- /dev/null
+# See https://editorconfig.org/ for more information.
+
+[*]
+indent_style = space
+indent_size = 2
+
+[*.py]
+indent_size = 4
--- /dev/null
+# These are supported funding model platforms
+
+github: doxygen
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
--- /dev/null
+---
+name: Report a bug or issue
+about: Create a report to help us improve doxygen
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+Describe what you see that (you think) is wrong.
+
+**Expected behavior**
+Describe what you would have expected or think is correct.
+
+**Screenshots**
+If useful, add screenshots to help explain your problem.
+
+**To Reproduce**
+Attach a self contained example that allows us to reproduce the problem.
+Such an example typically exist of some source code (can be dummy code) and a doxygen configuration file used (you can strip it using `doxygen -s -u`). After you verified the example demonstrates the problem, put it in a zip (or tarball) and attach it to the bug report. Try to avoid linking to external sources, since they might disappear in the future.
+
+**Version**
+Mention the version of doxygen used (output of `doxygen --version`) and the platform on which you run doxygen (e.g. Windows 10, 64 bit). If you run doxygen under Linux please also mention the name and version of the distribution used (output of `lsb_release -a`) and mention if you compiled doxygen yourself or that you use a binary that comes with the distribution or from the doxygen website.
+
+**Stack trace**
+If you encounter a crash and can build doxygen from sources yourself with debug info (`-DCMAKE_BUILD_TYPE=Debug`), a stack trace can be very helpful (especially if it is not possible to capture the problem in a small example that can be shared).
+
+**Additional context**
+Add any other context about the problem here.
--- /dev/null
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
--- /dev/null
+name: CMake Build for Doxygen
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ name: ${{ matrix.config.name }}
+ runs-on: ${{ matrix.config.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ config:
+ - {
+ name: "Ubuntu Latest GCC Release",
+ os: ubuntu-20.04,
+ build_type: "Release", cc: "gcc", cxx: "g++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Dbuild_search=YES -Dbuild_app=YES -Dbuild_parse=YES -Dbuild_xmlparser=YES -Duse_sqlite3=ON"
+ }
+ - {
+ name: "Ubuntu Latest GCC Debug",
+ os: ubuntu-20.04,
+ build_type: "Debug", cc: "gcc", cxx: "g++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Dbuild_search=YES -Dbuild_app=YES -Dbuild_parse=YES -Dbuild_xmlparser=YES -Duse_sqlite3=ON"
+ }
+ - {
+ name: "Ubuntu Latest Clang Release",
+ os: ubuntu-20.04,
+ build_type: "Release", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Duse_libclang=YES -Dstatic_libclang=YES -Duse_libc++=NO -Duse_sqlite3=ON"
+ }
+ - {
+ name: "Ubuntu Latest Clang Debug",
+ os: ubuntu-20.04,
+ build_type: "Debug", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Duse_libclang=YES -Dstatic_libclang=YES -Duse_libc++=NO -Duse_sqlite3=ON"
+ }
+ - {
+ name: "macOS Latest Release",
+ os: macos-latest,
+ build_type: "Release", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles"
+ }
+ - {
+ name: "macOS Latest Debug",
+ os: macos-latest,
+ build_type: "Debug", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles"
+ }
+ - {
+ name: "Windows Latest MSVC Debug",
+ os: windows-latest,
+ build_type: "Debug", cc: "cl", cxx: "cl",
+ build_gen: "NMake Makefiles"
+ }
+ - {
+ name: "Windows Latest MSVC Release",
+ os: windows-latest,
+ build_type: "Release", cc: "cl", cxx: "cl",
+ build_gen: "NMake Makefiles"
+ }
+ steps:
+ - name: Checkout doxygen
+ uses: actions/checkout@v3
+
+ - name: Download MikTex (Windows)
+ run: |
+ $wc = New-Object System.Net.WebClient;
+ $maxAttempts=5;
+ $attemptCount=0;
+ Do {
+ $attemptCount++;
+ Try {
+ $wc.DownloadFile("https://ctan.math.illinois.edu/systems/win32/miktex/setup/windows-x64/miktexsetup-4.2-x64.zip","miktexsetup-4.2-x64.zip")
+ } Catch [Exception] {
+ Write-Host $_.Exception | format-list -force
+ }
+ } while (((Test-Path "miktexsetup-4.2-x64.zip") -eq $false) -and ($attemptCount -le $maxAttempts))
+ shell: pwsh
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install libiconv (Windows)
+ uses: suisei-cn/actions-download-file@v1
+ with:
+ url: "https://github.com/pffang/libiconv-for-Windows/releases/download/v1.16/libiconv-for-Windows_1.16.7z"
+ target: .
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install LaTeX (Linux)
+ run: |
+ sudo apt update
+ sudo apt-get install texlive texlive-latex-recommended texlive-extra-utils texlive-latex-extra texlive-font-utils
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install LaTeX (MacOS)
+ run: |
+ brew update
+ brew install --cask mactex;
+ echo "/Library/TeX/texbin/" >> $GITHUB_PATH
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install libclang (Ubuntu 20.04)
+ run: |
+ sudo apt update
+ sudo apt remove llvm-8 clang-8 libclang-common-8-dev clang-format-8 libllvm8
+ sudo apt remove llvm-9 llvm-9-dev llvm-9-tools llvm-9-runtime clang-9 libclang-common-9-dev clang-format-9 libllvm9
+ #sudo apt remove llvm-10 llvm-10-dev llvm-10-tools llvm-10-runtime clang-10 clang-format-10 libclang-common-10-dev libclang-cpp10 libclang1-10 libllvm10
+ sudo apt remove llvm-11 llvm-11-dev llvm-11-tools llvm-11-runtime clang-11 clang-format-11 libclang-common-11-dev libclang-cpp11 libclang1-11 libllvm11
+ sudo apt remove llvm-12 llvm-12-dev llvm-12-tools llvm-12-runtime clang-12 clang-format-12 libclang-common-12-dev libclang-cpp12 libclang1-12 libllvm12
+ sudo apt-get autoremove
+ sudo apt-get clean
+ sudo apt install libclang-common-10-dev libclang-10-dev
+ apt list --installed | egrep '(clang|llvm)'
+ ls -d /usr/lib/llvm-*/include/
+ sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-10 100
+ sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-10 100
+ ls -al /usr/bin/clang++
+ ls -al /etc/alternatives/clang++
+ which clang++
+ clang++ -v
+ if: matrix.config.os == 'ubuntu-20.04'
+
+ - name: Install libxapian (Ubuntu 20.04)
+ run: |
+ sudo apt update
+ sudo apt install libxapian-dev
+ if: matrix.config.os == 'ubuntu-20.04'
+
+ - name: Extract MikTex zip (Windows)
+ shell: bash
+ run: |
+ unzip miktexsetup-4.2-x64.zip
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Download MikTex packages (Windows)
+ shell: bash
+ run: |
+ ./miktexsetup_standalone --verbose \
+ --local-package-repository=C:/miktex-repository \
+ --remote-package-repository="https://ctan.math.illinois.edu/systems/win32/miktex/tm/packages/" \
+ --package-set=essential \
+ download
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install MikTex packages (Windows)
+ shell: bash
+ run: |
+ ./miktexsetup_standalone --local-package-repository=C:/miktex-repository \
+ --package-set=essential \
+ --shared \
+ install
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Setting MikTex paths (Windows)
+ shell: bash
+ run: |
+ echo "C:/Program Files/MiKTeX/miktex/bin/x64/" >> $GITHUB_PATH
+ export PATH="/c/Program Files/MiKTeX/miktex/bin/x64/:$PATH"
+
+ echo "Configuring MiKTeX to install missing packages on the fly"
+ initexmf --admin --verbose --set-config-value='[MPM]AutoInstall=1'
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install Ghostscript (Linux)
+ run: |
+ sudo apt update
+ sudo apt-get install ghostscript
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install Ghostscript (Windows)
+ run:
+ choco install ghostscript
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Setting Ghostscript paths (Windows)
+ shell: bash
+ run: |
+ export GSpath=`find /c/Prog*/gs -name gswin\*c.exe | sed -e "s/gswin.*c.exe//"`
+ export PATH="$GSpath:$PATH"
+ export GSpath=`echo "$GSpath" | sed -e "s%/c%C:%"`
+ echo "$GSpath" >> $GITHUB_PATH
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install xmllint (Linux)
+ run: |
+ sudo apt-get update
+ sudo apt-get install libxml2-utils
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install xmllint (MacOS)
+ run: brew install libxml2
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install bison (MacOS)
+ run: |
+ brew install bison;
+ echo "/usr/local/opt/bison/bin" >> $GITHUB_PATH
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install bison/flex (Windows)
+ run: |
+ Choco-Install -PackageName winflexbison
+ #choco install winflexbison
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install Graphviz (Linux)
+ run: |
+ sudo apt update
+ sudo apt-get install graphviz
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install Graphviz (MacOS)
+ run: brew install graphviz
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install Graphviz (Windows)
+ run:
+ choco install graphviz.portable
+ if: matrix.config.os == 'windows-latest'
+
+# - name: Install Perl (Windows)
+# run:
+# choco install activeperl
+# if: matrix.config.os == 'windows-latest'
+
+ - name: Setup VS Environment (Windows)
+ uses: seanmiddleditch/gha-setup-vsdevenv@master
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Refresh Env (Windows)
+ run:
+ refreshenv
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install Qt
+ uses: jurplel/install-qt-action@v2
+
+ - name: Check tool versions (Linux / MacOS)
+ shell: bash
+ run: |
+ echo "=== perl ===";
+ perl --version;
+ echo "=== python ===";
+ python --version;
+ echo "=== cmake ===";
+ cmake --version;
+ echo "=== latex ===";
+ latex --version;
+ echo "=== bibtex ===";
+ bibtex --version
+ echo "=== dvips ===";
+ dvips --version
+ echo "=== bison ===";
+ bison --version;
+ echo "=== flex ===";
+ flex --version;
+ echo "=== dot ===";
+ dot -V;
+ echo "=== ghostscript ===";
+ gs --version;
+ if: matrix.config.os != 'windows-latest'
+
+ - name: Check tool versions (Windows)
+ shell: bash
+ run: |
+ echo "=== perl ===";
+ perl --version;
+ echo "=== python ===";
+ python --version;
+ echo "=== cmake ===";
+ cmake --version;
+ echo "=== latex ===";
+ latex --version;
+ echo "=== bibtex ===";
+ bibtex --version
+ echo "=== dvips ===";
+ dvips --version
+ echo "=== bison ===";
+ win_bison --version;
+ echo "=== flex ===";
+ win_flex --version;
+ echo "=== dot ===";
+ dot -V;
+ echo "=== ghostscript ===";
+ gswin64c --version;
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Configure
+ shell: cmake -P {0}
+ run: |
+ set(ENV{CC} ${{ matrix.config.cc }})
+ set(ENV{CXX} ${{ matrix.config.cxx }})
+
+ execute_process(
+ COMMAND cmake
+ -S .
+ -B build
+ -D CMAKE_BUILD_TYPE=${{ matrix.config.build_type }}
+ -G "${{ matrix.config.build_gen }}"
+ -Dbuild_doc=YES
+ -Dbuild_wizard=YES
+ ${{ matrix.config.cmake_extra_opts }}
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Bad exit status")
+ endif()
+
+ - name: Build
+ shell: cmake -P {0}
+ run: |
+ include(ProcessorCount)
+ ProcessorCount(N)
+ execute_process(
+ COMMAND cmake --build build --parallel ${N}
+ RESULT_VARIABLE result
+ OUTPUT_VARIABLE output
+ ERROR_VARIABLE output
+ ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE
+ )
+ if (NOT result EQUAL 0)
+ string(REGEX MATCH "FAILED:.*$" error_message "${output}")
+ string(REPLACE "\n" "%0A" error_message "${error_message}")
+ message("::error::${error_message}")
+ message(FATAL_ERROR "Build failed")
+ endif()
+
+ - name: Archive build artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: "${{ matrix.config.name }} build artifacts"
+ path: build/bin/
+
+ - name: Run tests (Linux / MacOS)
+ shell: cmake -P {0}
+ run: |
+ set(ENV{CTEST_OUTPUT_ON_FAILURE} "ON")
+
+ execute_process(
+ COMMAND cmake --build build --target tests TEST_FLAGS="--xml --xmlxsd --xhtml --qhp --docbook --rtf"
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Running tests failed!")
+ endif()
+ if: matrix.config.os != 'windows-latest'
+
+ - name: Run tests (Windows)
+ shell: cmake -P {0}
+ run: |
+ set(ENV{CTEST_OUTPUT_ON_FAILURE} "ON")
+
+ execute_process(
+ COMMAND cmake --build build --target tests TEST_FLAGS="--xml --xmlxsd"
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Running tests failed!")
+ endif()
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Generate documentation
+ shell: cmake -P {0}
+ run: |
+ execute_process(
+ COMMAND cmake --build build --target docs
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Building documentation failed")
+ endif()
+ if: matrix.config.os != 'windows-latest'
+
+ - name: Archive html documentation artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: "Html documentation artifacts"
+ path: build/html/
+ if: matrix.config.name == 'Ubuntu Latest GCC Release'
+
+
+ - name: Archive Latex documentation artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: "Latex documentation artifacts"
+ path: build/latex/doxygen_manual.pdf
+ if: matrix.config.name == 'Ubuntu Latest GCC Release'
+
+ - name: Generate Internal documentation
+ shell: bash
+ run: |
+ build/bin/doxygen Doxyfile
+ if: matrix.config.name == 'Ubuntu Latest GCC Release'
+
+ - name: Publish Internal documentation to Github pages
+ uses: peaceiris/actions-gh-pages@v3
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: doxygen_docs/html
+ if: ${{ github.event_name == 'push' && matrix.config.name == 'Ubuntu Latest GCC Release' }}
+
--- /dev/null
+name: Coverity for doxygen
+
+# Just for tests
+#on: [push, pull_request]
+
+# The right schedule
+on:
+ schedule:
+ - cron: '30 2 * * *' # Run once per day, to avoid Coverity's submission limits
+
+
+permissions:
+ contents: read
+
+jobs:
+ check_date:
+ runs-on: ubuntu-20.04
+ name: Check latest commit
+ outputs:
+ should_run: ${{ steps.should_run.outputs.should_run }}
+ steps:
+ - uses: actions/checkout@v3
+ - name: print latest_commit
+ run: echo ${{ github.sha }}
+
+ - id: should_run
+ continue-on-error: true
+ name: check latest commit is less than a day
+ if: ${{ github.event_name == 'schedule' }}
+ run: test -z $(git rev-list --after="24 hours" ${{ github.sha }}) && echo "::set-output name=should_run::false"
+
+ scan:
+ needs: check_date
+ if: ${{ needs.check_date.outputs.should_run != 'false' }}
+ runs-on: ubuntu-20.04
+
+ env:
+ CC: gcc
+ DEBIAN_FRONTEND: noninteractive
+
+ steps:
+ - name: Checkout doxygen
+ uses: actions/checkout@v3
+
+ - name: Download Coverity
+ run: |
+ wget -q https://scan.coverity.com/download/cxx/linux64 --post-data "token=$TOKEN&project=doxygen%2Fdoxygen" -O coverity_tool.tgz
+ mkdir cov-scan
+ tar ax -f coverity_tool.tgz --strip-components=1 -C cov-scan
+ env:
+ TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
+
+ - name: Setup environment
+ run: |
+ echo "$(pwd)/cov-scan/bin" >> $GITHUB_PATH
+ echo "NPROC=$(getconf _NPROCESSORS_ONLN)" >> $GITHUB_ENV
+
+ - name: Configure doxygen
+ run: |
+ mkdir build
+ cmake -S . -B build -D CMAKE_BUILD_TYPE=Release -G "Unix Makefiles"
+
+ - name: Run coverity build/scan
+ run: |
+ cd build && cov-build --dir cov-int make -j${NPROC}
+
+ - name: Submit results
+ run: |
+ cd build
+ tar zcf cov-scan.tgz cov-int
+ curl --form token=$TOKEN \
+ --form email=$EMAIL \
+ --form file=@cov-scan.tgz \
+ --form version="$(git rev-parse HEAD)" \
+ --form description="Automatic GHA scan" \
+ 'https://scan.coverity.com/builds?project=doxygen%2Fdoxygen'
+ env:
+ TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
+ EMAIL: ${{ secrets.COVERITY_SCAN_EMAIL }}
+
--- /dev/null
+*~
+.*sw?
+\#*
+.DS_Store
+
+*.rej
+*.orig
+
+*.pro
+/packages/rpm/doxygen.spec
+*.idb
+*.pdb
+
+/doxygen_docs
+/doxygen.tag
+/build*
+/qtools_docs
+/warnings.log
+
+tags
+
+.idea
SET(enlarge_lex_buffers "262144" CACHE INTERNAL "Sets the lex input and read buffers to the specified size")
+if(enable_coverage)
+ if ("${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
+ message(FATAL_ERROR "Doxygen cannot be generated in-place, the build directory (${PROJECT_BINARY_DIR}) has to differ from the doxygen main directory (${PROJECT_SOURCE_DIR})\nPlease don't forget to remove the already file created file 'CMakeCache.txt' and the directory 'CMakeFiles'!")
+ endif()
+endif()
+
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Sanitizers")
set(TOP "${PROJECT_SOURCE_DIR}")
include(version)
+message(STATUS "Using Cmake version ${CMAKE_VERSION}")
+if (${CMAKE_VERSION} VERSION_LESS "3.21.0")
+ set(depfile_supported "0" CACHE INTERNAL "DEPFILE is not supported")
+else()
+ set(depfile_supported "1" CACHE INTERNAL "DEPFILE is supported")
+endif()
+
set(sqlite3 "0" CACHE INTERNAL "used in settings.h")
set(clang "0" CACHE INTERNAL "used in settings.h")
if (use_sqlite3)
+# Doxyfile 1.9.5
#---------------------------------------------------------------------------
# Project related configuration options
JAVADOC_BANNER = NO
QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
+PYTHON_DOCSTRING = YES
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
OPTIMIZE_OUTPUT_SLICE = NO
EXTENSION_MAPPING =
MARKDOWN_SUPPORT = YES
-TOC_INCLUDE_HEADINGS =
+TOC_INCLUDE_HEADINGS = 5
AUTOLINK_SUPPORT = YES
BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
INLINE_SIMPLE_STRUCTS = NO
TYPEDEF_HIDES_STRUCT = NO
LOOKUP_CACHE_SIZE = 0
+NUM_PROC_THREADS = 1
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO
EXTRACT_ANON_NSPACES = NO
+RESOLVE_UNNAMED_PARAMS = YES
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
CASE_SENSE_NAMES = NO
HIDE_SCOPE_NAMES = NO
HIDE_COMPOUND_REFERENCE= NO
+SHOW_HEADERFILE = YES
SHOW_INCLUDE_FILES = YES
SHOW_GROUPED_MEMB_INC = NO
FORCE_LOCAL_INCLUDES = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
+WARN_IF_INCOMPLETE_DOC = YES
WARN_NO_PARAMDOC = NO
-WARN_AS_ERROR = NO
-WARN_FORMAT = "$file:$line: $text "
-WARN_LOGFILE = warnings.log
+WARN_AS_ERROR = FAIL_ON_WARNINGS
+WARN_FORMAT = "$file:$line: $text"
+WARN_LINE_FORMAT = "at line $line of file $file"
+WARN_LOGFILE =
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
FILTER_SOURCE_FILES = NO
FILTER_SOURCE_PATTERNS =
USE_MDFILE_AS_MAINPAGE =
+FORTRAN_COMMENT_AFTER = 72
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
HTML_STYLESHEET =
HTML_EXTRA_STYLESHEET =
HTML_EXTRA_FILES =
+HTML_COLORSTYLE = TOGGLE
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
-HTML_TIMESTAMP = YES
+HTML_TIMESTAMP = NO
HTML_DYNAMIC_MENUS = YES
HTML_DYNAMIC_SECTIONS = YES
HTML_INDEX_NUM_ENTRIES = 100
GENERATE_DOCSET = YES
DOCSET_FEEDNAME = "Doxygen docs"
+DOCSET_FEEDURL =
DOCSET_BUNDLE_ID = org.doxygen.Doxygen
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
DOCSET_PUBLISHER_NAME = Publisher
ECLIPSE_DOC_ID = org.doxygen.Project
DISABLE_INDEX = NO
GENERATE_TREEVIEW = YES
+FULL_SIDEBAR = NO
ENUM_VALUES_PER_LINE = 4
TREEVIEW_WIDTH = 250
EXT_LINKS_IN_WINDOW = NO
+OBFUSCATE_EMAILS = YES
+HTML_FORMULA_FORMAT = png
FORMULA_FONTSIZE = 10
-FORMULA_TRANSPARENT = YES
+FORMULA_MACROFILE =
USE_MATHJAX = NO
+MATHJAX_VERSION = MathJax_2
MATHJAX_FORMAT = HTML-CSS
MATHJAX_RELPATH =
MATHJAX_EXTENSIONS =
MATHJAX_CODEFILE =
SEARCHENGINE = YES
-SERVER_BASED_SEARCH = YES
+SERVER_BASED_SEARCH = NO
EXTERNAL_SEARCH = NO
SEARCHENGINE_URL =
SEARCHDATA_FILE = searchdata.xml
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
+# Configuration options related to Sqlite3 output
+#---------------------------------------------------------------------------
+GENERATE_SQLITE3 = NO
+SQLITE3_OUTPUT = sqlite3
+SQLITE3_RECREATE_DB = YES
+#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
libmscgen
INCLUDE_FILE_PATTERNS =
PREDEFINED =
-EXPAND_AS_DEFINED =
+EXPAND_AS_DEFINED = DOC_NODES DN_SEP DN
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration options related to external references
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = YES
DOT_NUM_THREADS = 0
-DOT_FONTNAME = Helvetica
-DOT_FONTSIZE = 10
+DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
+DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
+DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
DOT_FONTPATH =
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
UML_LIMIT_NUM_FIELDS = 10
+DOT_UML_DETAILS = NO
+DOT_WRAP_THRESHOLD = 17
TEMPLATE_RELATIONS = YES
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
+DIR_GRAPH_MAX_DEPTH = 1
DOT_IMAGE_FORMAT = svg
INTERACTIVE_SVG = YES
DOT_PATH =
PLANTUML_JAR_PATH =
PLANTUML_CFG_FILE =
PLANTUML_INCLUDE_PATH =
-DOT_GRAPH_MAX_NODES = 100
+DOT_GRAPH_MAX_NODES = 300
MAX_DOT_GRAPH_DEPTH = 0
-DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = NO
-DOT_WRAP_THRESHOLD = 17
-DOT_UML_DETAILS = NO
* Coverity Scan Build Status: <a href="https://scan.coverity.com/projects/2860"> <img alt="Coverity Scan Build Status" src="https://scan.coverity.com/projects/2860/badge.svg"/> </a>
-* Doxygen's Doxygen Documentation: <a href="https://codedocs.xyz/doxygen/doxygen/"><img src="https://codedocs.xyz/doxygen/doxygen.svg"/></a>
+* Doxygen's <a href="http://doxygen.github.io/doxygen/">internal source code documentation</a>
* Install: Please read the installation section of the manual (https://www.doxygen.nl/manual/install.html)
XML='XML'
SQL='SQL'
MARKDOWN='Markdown'
+ SLICE='Slice'
+ LEX='Lex'
class DoxMemberKind(str, Enum):
self.gds_collector_.add_message('Value "%(value)s"%(lineno)s is not of the correct base simple type (str)' % {"value": value, "lineno": lineno, })
return False
value = value
- enumerations = ['Unknown', 'IDL', 'Java', 'C#', 'D', 'PHP', 'Objective-C', 'C++', 'JavaScript', 'Python', 'Fortran', 'VHDL', 'XML', 'SQL', 'Markdown']
+ enumerations = ['Unknown', 'IDL', 'Java', 'C#', 'D', 'PHP', 'Objective-C', 'C++', 'JavaScript', 'Python', 'Fortran', 'VHDL', 'XML', 'SQL', 'Markdown', 'Slice', 'Lex']
if value not in enumerations:
lineno = self.gds_get_node_lineno_()
self.gds_collector_.add_message('Value "%(value)s"%(lineno)s does not match xsd enumeration restriction on DoxLanguage' % {"value" : encode_str_2_3(value), "lineno": lineno} )
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'internal':
obj_ = docInternalType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'internal', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_internal'):
- self.add_internal(obj_.value)
+ self.add_internal(obj_.value)
elif hasattr(self, 'set_internal'):
- self.set_internal(obj_.value)
+ self.set_internal(obj_.value)
elif nodeName_ == 'sect1':
obj_ = docSect1Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'sect1', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect1'):
- self.add_sect1(obj_.value)
+ self.add_sect1(obj_.value)
elif hasattr(self, 'set_sect1'):
- self.set_sect1(obj_.value)
+ self.set_sect1(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'initializer', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_initializer'):
- self.add_initializer(obj_.value)
+ self.add_initializer(obj_.value)
elif hasattr(self, 'set_initializer'):
- self.set_initializer(obj_.value)
+ self.set_initializer(obj_.value)
elif nodeName_ == 'briefdescription':
obj_ = descriptionType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'briefdescription', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_briefdescription'):
- self.add_briefdescription(obj_.value)
+ self.add_briefdescription(obj_.value)
elif hasattr(self, 'set_briefdescription'):
- self.set_briefdescription(obj_.value)
+ self.set_briefdescription(obj_.value)
elif nodeName_ == 'detaileddescription':
obj_ = descriptionType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'detaileddescription', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_detaileddescription'):
- self.add_detaileddescription(obj_.value)
+ self.add_detaileddescription(obj_.value)
elif hasattr(self, 'set_detaileddescription'):
- self.set_detaileddescription(obj_.value)
+ self.set_detaileddescription(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'sp', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sp'):
- self.add_sp(obj_.value)
+ self.add_sp(obj_.value)
elif hasattr(self, 'set_sp'):
- self.set_sp(obj_.value)
+ self.set_sp(obj_.value)
elif nodeName_ == 'ref':
obj_ = refTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'internal':
obj_ = docInternalS1Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'internal', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_internal'):
- self.add_internal(obj_.value)
+ self.add_internal(obj_.value)
elif hasattr(self, 'set_internal'):
- self.set_internal(obj_.value)
+ self.set_internal(obj_.value)
elif nodeName_ == 'sect2':
obj_ = docSect2Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'sect2', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect2'):
- self.add_sect2(obj_.value)
+ self.add_sect2(obj_.value)
elif hasattr(self, 'set_sect2'):
- self.set_sect2(obj_.value)
+ self.set_sect2(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect3':
obj_ = docSect3Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'sect3', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect3'):
- self.add_sect3(obj_.value)
+ self.add_sect3(obj_.value)
elif hasattr(self, 'set_sect3'):
- self.set_sect3(obj_.value)
+ self.set_sect3(obj_.value)
elif nodeName_ == 'internal':
obj_ = docInternalS2Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'internal', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_internal'):
- self.add_internal(obj_.value)
+ self.add_internal(obj_.value)
elif hasattr(self, 'set_internal'):
- self.set_internal(obj_.value)
+ self.set_internal(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect4':
obj_ = docSect4Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'sect4', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect4'):
- self.add_sect4(obj_.value)
+ self.add_sect4(obj_.value)
elif hasattr(self, 'set_sect4'):
- self.set_sect4(obj_.value)
+ self.set_sect4(obj_.value)
elif nodeName_ == 'internal':
obj_ = docInternalS3Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'internal', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_internal'):
- self.add_internal(obj_.value)
+ self.add_internal(obj_.value)
elif hasattr(self, 'set_internal'):
- self.set_internal(obj_.value)
+ self.set_internal(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'internal':
obj_ = docInternalS4Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'internal', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_internal'):
- self.add_internal(obj_.value)
+ self.add_internal(obj_.value)
elif hasattr(self, 'set_internal'):
- self.set_internal(obj_.value)
+ self.set_internal(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect1':
obj_ = docSect1Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'sect1', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect1'):
- self.add_sect1(obj_.value)
+ self.add_sect1(obj_.value)
elif hasattr(self, 'set_sect1'):
- self.set_sect1(obj_.value)
+ self.set_sect1(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect2':
obj_ = docSect2Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'sect2', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect2'):
- self.add_sect2(obj_.value)
+ self.add_sect2(obj_.value)
elif hasattr(self, 'set_sect2'):
- self.set_sect2(obj_.value)
+ self.set_sect2(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect3':
obj_ = docSect3Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'sect3', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect3'):
- self.add_sect3(obj_.value)
+ self.add_sect3(obj_.value)
elif hasattr(self, 'set_sect3'):
- self.set_sect3(obj_.value)
+ self.set_sect3(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
elif nodeName_ == 'sect3':
obj_ = docSect4Type.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'sect3', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_sect3'):
- self.add_sect3(obj_.value)
+ self.add_sect3(obj_.value)
elif hasattr(self, 'set_sect3'):
- self.set_sect3(obj_.value)
+ self.set_sect3(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'para', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_para'):
- self.add_para(obj_.value)
+ self.add_para(obj_.value)
elif hasattr(self, 'set_para'):
- self.set_para(obj_.value)
+ self.set_para(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, hruler=None, preformatted=None, programlisting=None, verbatim=None, javadocliteral=None, javadoccode=None, indexentry=None, orderedlist=None, itemizedlist=None, simplesect=None, title=None, variablelist=None, table=None, heading=None, dotfile=None, mscfile=None, diafile=None, toclist=None, language=None, parameterlist=None, xrefsect=None, copydoc=None, blockquote=None, parblock=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, hruler=None, preformatted=None, programlisting=None, verbatim=None, javadocliteral=None, javadoccode=None, indexentry=None, orderedlist=None, itemizedlist=None, simplesect=None, title=None, variablelist=None, table=None, heading=None, dotfile=None, mscfile=None, diafile=None, toclist=None, language=None, parameterlist=None, xrefsect=None, copydoc=None, details=None, blockquote=None, parblock=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
else:
self.copydoc = copydoc
self.copydoc_nsprefix_ = None
+ if details is None:
+ self.details = []
+ else:
+ self.details = details
+ self.details_nsprefix_ = None
if blockquote is None:
self.blockquote = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.copydoc.insert(index, value)
def replace_copydoc_at(self, index, value):
self.copydoc[index] = value
+ def get_details(self):
+ return self.details
+ def set_details(self, details):
+ self.details = details
+ def add_details(self, value):
+ self.details.append(value)
+ def insert_details_at(self, index, value):
+ self.details.insert(index, value)
+ def replace_details_at(self, index, value):
+ self.details[index] = value
def get_blockquote(self):
return self.blockquote
def set_blockquote(self, blockquote):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
self.parameterlist or
self.xrefsect or
self.copydoc or
+ self.details or
self.blockquote or
self.parblock or
(1 if type(self.valueOf_) in [int,float] else self.valueOf_) or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
for copydoc_ in self.copydoc:
namespaceprefix_ = self.copydoc_nsprefix_ + ':' if (UseCapturedNS_ and self.copydoc_nsprefix_) else ''
copydoc_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='copydoc', pretty_print=pretty_print)
+ for details_ in self.details:
+ namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
+ details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for blockquote_ in self.blockquote:
namespaceprefix_ = self.blockquote_nsprefix_ + ':' if (UseCapturedNS_ and self.blockquote_nsprefix_) else ''
blockquote_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='blockquote', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
elif nodeName_ == 'hruler':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'hruler', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_hruler'):
- self.add_hruler(obj_.value)
+ self.add_hruler(obj_.value)
elif hasattr(self, 'set_hruler'):
- self.set_hruler(obj_.value)
+ self.set_hruler(obj_.value)
elif nodeName_ == 'preformatted':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'preformatted', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_preformatted'):
- self.add_preformatted(obj_.value)
+ self.add_preformatted(obj_.value)
elif hasattr(self, 'set_preformatted'):
- self.set_preformatted(obj_.value)
+ self.set_preformatted(obj_.value)
elif nodeName_ == 'programlisting':
obj_ = listingType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'programlisting', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_programlisting'):
- self.add_programlisting(obj_.value)
+ self.add_programlisting(obj_.value)
elif hasattr(self, 'set_programlisting'):
- self.set_programlisting(obj_.value)
+ self.set_programlisting(obj_.value)
elif nodeName_ == 'verbatim' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'verbatim')
MixedContainer.TypeNone, 'indexentry', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_indexentry'):
- self.add_indexentry(obj_.value)
+ self.add_indexentry(obj_.value)
elif hasattr(self, 'set_indexentry'):
- self.set_indexentry(obj_.value)
+ self.set_indexentry(obj_.value)
elif nodeName_ == 'orderedlist':
obj_ = docListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'orderedlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_orderedlist'):
- self.add_orderedlist(obj_.value)
+ self.add_orderedlist(obj_.value)
elif hasattr(self, 'set_orderedlist'):
- self.set_orderedlist(obj_.value)
+ self.set_orderedlist(obj_.value)
elif nodeName_ == 'itemizedlist':
obj_ = docListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'itemizedlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_itemizedlist'):
- self.add_itemizedlist(obj_.value)
+ self.add_itemizedlist(obj_.value)
elif hasattr(self, 'set_itemizedlist'):
- self.set_itemizedlist(obj_.value)
+ self.set_itemizedlist(obj_.value)
elif nodeName_ == 'simplesect':
obj_ = docSimpleSectType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'simplesect', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_simplesect'):
- self.add_simplesect(obj_.value)
+ self.add_simplesect(obj_.value)
elif hasattr(self, 'set_simplesect'):
- self.set_simplesect(obj_.value)
+ self.set_simplesect(obj_.value)
elif nodeName_ == 'title':
obj_ = docTitleType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'title', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_title'):
- self.add_title(obj_.value)
+ self.add_title(obj_.value)
elif hasattr(self, 'set_title'):
- self.set_title(obj_.value)
+ self.set_title(obj_.value)
elif nodeName_ == 'variablelist':
obj_ = docVariableListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'variablelist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_variablelist'):
- self.add_variablelist(obj_.value)
+ self.add_variablelist(obj_.value)
elif hasattr(self, 'set_variablelist'):
- self.set_variablelist(obj_.value)
+ self.set_variablelist(obj_.value)
elif nodeName_ == 'table':
obj_ = docTableType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'table', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_table'):
- self.add_table(obj_.value)
+ self.add_table(obj_.value)
elif hasattr(self, 'set_table'):
- self.set_table(obj_.value)
+ self.set_table(obj_.value)
elif nodeName_ == 'heading':
obj_ = docHeadingType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'heading', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_heading'):
- self.add_heading(obj_.value)
+ self.add_heading(obj_.value)
elif hasattr(self, 'set_heading'):
- self.set_heading(obj_.value)
+ self.set_heading(obj_.value)
elif nodeName_ == 'dotfile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dotfile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dotfile'):
- self.add_dotfile(obj_.value)
+ self.add_dotfile(obj_.value)
elif hasattr(self, 'set_dotfile'):
- self.set_dotfile(obj_.value)
+ self.set_dotfile(obj_.value)
elif nodeName_ == 'mscfile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'mscfile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_mscfile'):
- self.add_mscfile(obj_.value)
+ self.add_mscfile(obj_.value)
elif hasattr(self, 'set_mscfile'):
- self.set_mscfile(obj_.value)
+ self.set_mscfile(obj_.value)
elif nodeName_ == 'diafile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'diafile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_diafile'):
- self.add_diafile(obj_.value)
+ self.add_diafile(obj_.value)
elif hasattr(self, 'set_diafile'):
- self.set_diafile(obj_.value)
+ self.set_diafile(obj_.value)
elif nodeName_ == 'toclist':
obj_ = docTocListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'toclist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_toclist'):
- self.add_toclist(obj_.value)
+ self.add_toclist(obj_.value)
elif hasattr(self, 'set_toclist'):
- self.set_toclist(obj_.value)
+ self.set_toclist(obj_.value)
elif nodeName_ == 'language':
obj_ = docLanguageType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'language', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_language'):
- self.add_language(obj_.value)
+ self.add_language(obj_.value)
elif hasattr(self, 'set_language'):
- self.set_language(obj_.value)
+ self.set_language(obj_.value)
elif nodeName_ == 'parameterlist':
obj_ = docParamListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'parameterlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_parameterlist'):
- self.add_parameterlist(obj_.value)
+ self.add_parameterlist(obj_.value)
elif hasattr(self, 'set_parameterlist'):
- self.set_parameterlist(obj_.value)
+ self.set_parameterlist(obj_.value)
elif nodeName_ == 'xrefsect':
obj_ = docXRefSectType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'xrefsect', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_xrefsect'):
- self.add_xrefsect(obj_.value)
+ self.add_xrefsect(obj_.value)
elif hasattr(self, 'set_xrefsect'):
- self.set_xrefsect(obj_.value)
+ self.set_xrefsect(obj_.value)
elif nodeName_ == 'copydoc':
obj_ = docCopyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'copydoc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_copydoc'):
- self.add_copydoc(obj_.value)
+ self.add_copydoc(obj_.value)
elif hasattr(self, 'set_copydoc'):
- self.set_copydoc(obj_.value)
+ self.set_copydoc(obj_.value)
+ elif nodeName_ == 'details':
+ obj_ = docDetailsType.factory(parent_object_=self)
+ obj_.build(child_, gds_collector_=gds_collector_)
+ obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
+ MixedContainer.TypeNone, 'details', obj_)
+ self.content_.append(obj_)
+ if hasattr(self, 'add_details'):
+ self.add_details(obj_.value)
+ elif hasattr(self, 'set_details'):
+ self.set_details(obj_.value)
elif nodeName_ == 'blockquote':
obj_ = docBlockQuoteType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'blockquote', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_blockquote'):
- self.add_blockquote(obj_.value)
+ self.add_blockquote(obj_.value)
elif hasattr(self, 'set_blockquote'):
- self.set_blockquote(obj_.value)
+ self.set_blockquote(obj_.value)
elif nodeName_ == 'parblock':
obj_ = docParBlockType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'parblock', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_parblock'):
- self.add_parblock(obj_.value)
+ self.add_parblock(obj_.value)
elif hasattr(self, 'set_parblock'):
- self.set_parblock(obj_.value)
+ self.set_parblock(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, hruler=None, preformatted=None, programlisting=None, verbatim=None, javadocliteral=None, javadoccode=None, indexentry=None, orderedlist=None, itemizedlist=None, simplesect=None, title=None, variablelist=None, table=None, heading=None, dotfile=None, mscfile=None, diafile=None, toclist=None, language=None, parameterlist=None, xrefsect=None, copydoc=None, blockquote=None, parblock=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, hruler=None, preformatted=None, programlisting=None, verbatim=None, javadocliteral=None, javadoccode=None, indexentry=None, orderedlist=None, itemizedlist=None, simplesect=None, title=None, variablelist=None, table=None, heading=None, dotfile=None, mscfile=None, diafile=None, toclist=None, language=None, parameterlist=None, xrefsect=None, copydoc=None, details=None, blockquote=None, parblock=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
else:
self.copydoc = copydoc
self.copydoc_nsprefix_ = None
+ if details is None:
+ self.details = []
+ else:
+ self.details = details
+ self.details_nsprefix_ = None
if blockquote is None:
self.blockquote = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.copydoc.insert(index, value)
def replace_copydoc_at(self, index, value):
self.copydoc[index] = value
+ def get_details(self):
+ return self.details
+ def set_details(self, details):
+ self.details = details
+ def add_details(self, value):
+ self.details.append(value)
+ def insert_details_at(self, index, value):
+ self.details.insert(index, value)
+ def replace_details_at(self, index, value):
+ self.details[index] = value
def get_blockquote(self):
return self.blockquote
def set_blockquote(self, blockquote):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
self.parameterlist or
self.xrefsect or
self.copydoc or
+ self.details or
self.blockquote or
self.parblock or
(1 if type(self.valueOf_) in [int,float] else self.valueOf_) or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
for copydoc_ in self.copydoc:
namespaceprefix_ = self.copydoc_nsprefix_ + ':' if (UseCapturedNS_ and self.copydoc_nsprefix_) else ''
copydoc_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='copydoc', pretty_print=pretty_print)
+ for details_ in self.details:
+ namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
+ details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for blockquote_ in self.blockquote:
namespaceprefix_ = self.blockquote_nsprefix_ + ':' if (UseCapturedNS_ and self.blockquote_nsprefix_) else ''
blockquote_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='blockquote', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
elif nodeName_ == 'hruler':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'hruler', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_hruler'):
- self.add_hruler(obj_.value)
+ self.add_hruler(obj_.value)
elif hasattr(self, 'set_hruler'):
- self.set_hruler(obj_.value)
+ self.set_hruler(obj_.value)
elif nodeName_ == 'preformatted':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'preformatted', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_preformatted'):
- self.add_preformatted(obj_.value)
+ self.add_preformatted(obj_.value)
elif hasattr(self, 'set_preformatted'):
- self.set_preformatted(obj_.value)
+ self.set_preformatted(obj_.value)
elif nodeName_ == 'programlisting':
obj_ = listingType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'programlisting', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_programlisting'):
- self.add_programlisting(obj_.value)
+ self.add_programlisting(obj_.value)
elif hasattr(self, 'set_programlisting'):
- self.set_programlisting(obj_.value)
+ self.set_programlisting(obj_.value)
elif nodeName_ == 'verbatim' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'verbatim')
MixedContainer.TypeNone, 'indexentry', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_indexentry'):
- self.add_indexentry(obj_.value)
+ self.add_indexentry(obj_.value)
elif hasattr(self, 'set_indexentry'):
- self.set_indexentry(obj_.value)
+ self.set_indexentry(obj_.value)
elif nodeName_ == 'orderedlist':
obj_ = docListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'orderedlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_orderedlist'):
- self.add_orderedlist(obj_.value)
+ self.add_orderedlist(obj_.value)
elif hasattr(self, 'set_orderedlist'):
- self.set_orderedlist(obj_.value)
+ self.set_orderedlist(obj_.value)
elif nodeName_ == 'itemizedlist':
obj_ = docListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'itemizedlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_itemizedlist'):
- self.add_itemizedlist(obj_.value)
+ self.add_itemizedlist(obj_.value)
elif hasattr(self, 'set_itemizedlist'):
- self.set_itemizedlist(obj_.value)
+ self.set_itemizedlist(obj_.value)
elif nodeName_ == 'simplesect':
obj_ = docSimpleSectType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'simplesect', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_simplesect'):
- self.add_simplesect(obj_.value)
+ self.add_simplesect(obj_.value)
elif hasattr(self, 'set_simplesect'):
- self.set_simplesect(obj_.value)
+ self.set_simplesect(obj_.value)
elif nodeName_ == 'title':
obj_ = docTitleType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'title', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_title'):
- self.add_title(obj_.value)
+ self.add_title(obj_.value)
elif hasattr(self, 'set_title'):
- self.set_title(obj_.value)
+ self.set_title(obj_.value)
elif nodeName_ == 'variablelist':
obj_ = docVariableListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'variablelist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_variablelist'):
- self.add_variablelist(obj_.value)
+ self.add_variablelist(obj_.value)
elif hasattr(self, 'set_variablelist'):
- self.set_variablelist(obj_.value)
+ self.set_variablelist(obj_.value)
elif nodeName_ == 'table':
obj_ = docTableType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'table', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_table'):
- self.add_table(obj_.value)
+ self.add_table(obj_.value)
elif hasattr(self, 'set_table'):
- self.set_table(obj_.value)
+ self.set_table(obj_.value)
elif nodeName_ == 'heading':
obj_ = docHeadingType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'heading', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_heading'):
- self.add_heading(obj_.value)
+ self.add_heading(obj_.value)
elif hasattr(self, 'set_heading'):
- self.set_heading(obj_.value)
+ self.set_heading(obj_.value)
elif nodeName_ == 'dotfile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dotfile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dotfile'):
- self.add_dotfile(obj_.value)
+ self.add_dotfile(obj_.value)
elif hasattr(self, 'set_dotfile'):
- self.set_dotfile(obj_.value)
+ self.set_dotfile(obj_.value)
elif nodeName_ == 'mscfile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'mscfile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_mscfile'):
- self.add_mscfile(obj_.value)
+ self.add_mscfile(obj_.value)
elif hasattr(self, 'set_mscfile'):
- self.set_mscfile(obj_.value)
+ self.set_mscfile(obj_.value)
elif nodeName_ == 'diafile':
obj_ = docImageFileType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'diafile', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_diafile'):
- self.add_diafile(obj_.value)
+ self.add_diafile(obj_.value)
elif hasattr(self, 'set_diafile'):
- self.set_diafile(obj_.value)
+ self.set_diafile(obj_.value)
elif nodeName_ == 'toclist':
obj_ = docTocListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'toclist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_toclist'):
- self.add_toclist(obj_.value)
+ self.add_toclist(obj_.value)
elif hasattr(self, 'set_toclist'):
- self.set_toclist(obj_.value)
+ self.set_toclist(obj_.value)
elif nodeName_ == 'language':
obj_ = docLanguageType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'language', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_language'):
- self.add_language(obj_.value)
+ self.add_language(obj_.value)
elif hasattr(self, 'set_language'):
- self.set_language(obj_.value)
+ self.set_language(obj_.value)
elif nodeName_ == 'parameterlist':
obj_ = docParamListType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'parameterlist', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_parameterlist'):
- self.add_parameterlist(obj_.value)
+ self.add_parameterlist(obj_.value)
elif hasattr(self, 'set_parameterlist'):
- self.set_parameterlist(obj_.value)
+ self.set_parameterlist(obj_.value)
elif nodeName_ == 'xrefsect':
obj_ = docXRefSectType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'xrefsect', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_xrefsect'):
- self.add_xrefsect(obj_.value)
+ self.add_xrefsect(obj_.value)
elif hasattr(self, 'set_xrefsect'):
- self.set_xrefsect(obj_.value)
+ self.set_xrefsect(obj_.value)
elif nodeName_ == 'copydoc':
obj_ = docCopyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'copydoc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_copydoc'):
- self.add_copydoc(obj_.value)
+ self.add_copydoc(obj_.value)
elif hasattr(self, 'set_copydoc'):
- self.set_copydoc(obj_.value)
+ self.set_copydoc(obj_.value)
+ elif nodeName_ == 'details':
+ obj_ = docDetailsType.factory(parent_object_=self)
+ obj_.build(child_, gds_collector_=gds_collector_)
+ obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
+ MixedContainer.TypeNone, 'details', obj_)
+ self.content_.append(obj_)
+ if hasattr(self, 'add_details'):
+ self.add_details(obj_.value)
+ elif hasattr(self, 'set_details'):
+ self.set_details(obj_.value)
elif nodeName_ == 'blockquote':
obj_ = docBlockQuoteType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'blockquote', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_blockquote'):
- self.add_blockquote(obj_.value)
+ self.add_blockquote(obj_.value)
elif hasattr(self, 'set_blockquote'):
- self.set_blockquote(obj_.value)
+ self.set_blockquote(obj_.value)
elif nodeName_ == 'parblock':
obj_ = docParBlockType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'parblock', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_parblock'):
- self.add_parblock(obj_.value)
+ self.add_parblock(obj_.value)
elif hasattr(self, 'set_parblock'):
- self.set_parblock(obj_.value)
+ self.set_parblock(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, url=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, url=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, refid=None, kindref=None, external=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, refid=None, kindref=None, external=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, id=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, id=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, level=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, level=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, type_=None, name=None, width=None, height=None, alt=None, inline=None, caption=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, type_=None, name=None, width=None, height=None, alt=None, inline=None, caption=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, name=None, width=None, height=None, caption=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, name=None, width=None, height=None, caption=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, name=None, width=None, height=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, name=None, width=None, height=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, name=None, width=None, height=None, caption=None, engine=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, name=None, width=None, height=None, caption=None, engine=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
__hash__ = GeneratedsSuper.__hash__
subclass = None
superclass = None
- def __init__(self, id=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, details=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
+ def __init__(self, id=None, ulink=None, bold=None, s=None, strike=None, underline=None, emphasis=None, computeroutput=None, subscript=None, superscript=None, center=None, small=None, cite=None, del_=None, ins=None, summary=None, htmlonly=None, manonly=None, xmlonly=None, rtfonly=None, latexonly=None, docbookonly=None, image=None, dot=None, msc=None, plantuml=None, anchor=None, formula=None, ref=None, emoji=None, linebreak=None, valueOf_=None, mixedclass_=None, content_=None, gds_collector_=None, **kwargs_):
self.gds_collector_ = gds_collector_
self.gds_elementtree_node_ = None
self.original_tagname_ = None
else:
self.ins = ins
self.ins_nsprefix_ = None
- if details is None:
- self.details = []
- else:
- self.details = details
- self.details_nsprefix_ = None
if summary is None:
self.summary = []
else:
self.ins.insert(index, value)
def replace_ins_at(self, index, value):
self.ins[index] = value
- def get_details(self):
- return self.details
- def set_details(self, details):
- self.details = details
- def add_details(self, value):
- self.details.append(value)
- def insert_details_at(self, index, value):
- self.details.insert(index, value)
- def replace_details_at(self, index, value):
- self.details[index] = value
def get_summary(self):
return self.summary
def set_summary(self, summary):
self.cite or
self.del_ or
self.ins or
- self.details or
self.summary or
self.htmlonly or
self.manonly or
for ins_ in self.ins:
namespaceprefix_ = self.ins_nsprefix_ + ':' if (UseCapturedNS_ and self.ins_nsprefix_) else ''
ins_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='ins', pretty_print=pretty_print)
- for details_ in self.details:
- namespaceprefix_ = self.details_nsprefix_ + ':' if (UseCapturedNS_ and self.details_nsprefix_) else ''
- details_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='details', pretty_print=pretty_print)
for summary_ in self.summary:
namespaceprefix_ = self.summary_nsprefix_ + ':' if (UseCapturedNS_ and self.summary_nsprefix_) else ''
summary_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='summary', pretty_print=pretty_print)
MixedContainer.TypeNone, 'ulink', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ulink'):
- self.add_ulink(obj_.value)
+ self.add_ulink(obj_.value)
elif hasattr(self, 'set_ulink'):
- self.set_ulink(obj_.value)
+ self.set_ulink(obj_.value)
elif nodeName_ == 'bold':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'bold', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_bold'):
- self.add_bold(obj_.value)
+ self.add_bold(obj_.value)
elif hasattr(self, 'set_bold'):
- self.set_bold(obj_.value)
+ self.set_bold(obj_.value)
elif nodeName_ == 's':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 's', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_s'):
- self.add_s(obj_.value)
+ self.add_s(obj_.value)
elif hasattr(self, 'set_s'):
- self.set_s(obj_.value)
+ self.set_s(obj_.value)
elif nodeName_ == 'strike':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'strike', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_strike'):
- self.add_strike(obj_.value)
+ self.add_strike(obj_.value)
elif hasattr(self, 'set_strike'):
- self.set_strike(obj_.value)
+ self.set_strike(obj_.value)
elif nodeName_ == 'underline':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'underline', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_underline'):
- self.add_underline(obj_.value)
+ self.add_underline(obj_.value)
elif hasattr(self, 'set_underline'):
- self.set_underline(obj_.value)
+ self.set_underline(obj_.value)
elif nodeName_ == 'emphasis':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emphasis', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emphasis'):
- self.add_emphasis(obj_.value)
+ self.add_emphasis(obj_.value)
elif hasattr(self, 'set_emphasis'):
- self.set_emphasis(obj_.value)
+ self.set_emphasis(obj_.value)
elif nodeName_ == 'computeroutput':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'computeroutput', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_computeroutput'):
- self.add_computeroutput(obj_.value)
+ self.add_computeroutput(obj_.value)
elif hasattr(self, 'set_computeroutput'):
- self.set_computeroutput(obj_.value)
+ self.set_computeroutput(obj_.value)
elif nodeName_ == 'subscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'subscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_subscript'):
- self.add_subscript(obj_.value)
+ self.add_subscript(obj_.value)
elif hasattr(self, 'set_subscript'):
- self.set_subscript(obj_.value)
+ self.set_subscript(obj_.value)
elif nodeName_ == 'superscript':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'superscript', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_superscript'):
- self.add_superscript(obj_.value)
+ self.add_superscript(obj_.value)
elif hasattr(self, 'set_superscript'):
- self.set_superscript(obj_.value)
+ self.set_superscript(obj_.value)
elif nodeName_ == 'center':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'center', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_center'):
- self.add_center(obj_.value)
+ self.add_center(obj_.value)
elif hasattr(self, 'set_center'):
- self.set_center(obj_.value)
+ self.set_center(obj_.value)
elif nodeName_ == 'small':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'small', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_small'):
- self.add_small(obj_.value)
+ self.add_small(obj_.value)
elif hasattr(self, 'set_small'):
- self.set_small(obj_.value)
+ self.set_small(obj_.value)
elif nodeName_ == 'cite':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'cite', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_cite'):
- self.add_cite(obj_.value)
+ self.add_cite(obj_.value)
elif hasattr(self, 'set_cite'):
- self.set_cite(obj_.value)
+ self.set_cite(obj_.value)
elif nodeName_ == 'del':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'del', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_del'):
- self.add_del(obj_.value)
+ self.add_del(obj_.value)
elif hasattr(self, 'set_del'):
- self.set_del(obj_.value)
+ self.set_del(obj_.value)
elif nodeName_ == 'ins':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ins', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ins'):
- self.add_ins(obj_.value)
+ self.add_ins(obj_.value)
elif hasattr(self, 'set_ins'):
- self.set_ins(obj_.value)
- elif nodeName_ == 'details':
- obj_ = docMarkupType.factory(parent_object_=self)
- obj_.build(child_, gds_collector_=gds_collector_)
- obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
- MixedContainer.TypeNone, 'details', obj_)
- self.content_.append(obj_)
- if hasattr(self, 'add_details'):
- self.add_details(obj_.value)
- elif hasattr(self, 'set_details'):
- self.set_details(obj_.value)
+ self.set_ins(obj_.value)
elif nodeName_ == 'summary':
obj_ = docMarkupType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'summary', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_summary'):
- self.add_summary(obj_.value)
+ self.add_summary(obj_.value)
elif hasattr(self, 'set_summary'):
- self.set_summary(obj_.value)
+ self.set_summary(obj_.value)
elif nodeName_ == 'htmlonly':
obj_ = docHtmlOnlyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'htmlonly', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_htmlonly'):
- self.add_htmlonly(obj_.value)
+ self.add_htmlonly(obj_.value)
elif hasattr(self, 'set_htmlonly'):
- self.set_htmlonly(obj_.value)
+ self.set_htmlonly(obj_.value)
elif nodeName_ == 'manonly' and child_.text is not None:
valuestr_ = child_.text
valuestr_ = self.gds_parse_string(valuestr_, node, 'manonly')
MixedContainer.TypeNone, 'image', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_image'):
- self.add_image(obj_.value)
+ self.add_image(obj_.value)
elif hasattr(self, 'set_image'):
- self.set_image(obj_.value)
+ self.set_image(obj_.value)
elif nodeName_ == 'dot':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'dot', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_dot'):
- self.add_dot(obj_.value)
+ self.add_dot(obj_.value)
elif hasattr(self, 'set_dot'):
- self.set_dot(obj_.value)
+ self.set_dot(obj_.value)
elif nodeName_ == 'msc':
obj_ = docDotMscType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'msc', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_msc'):
- self.add_msc(obj_.value)
+ self.add_msc(obj_.value)
elif hasattr(self, 'set_msc'):
- self.set_msc(obj_.value)
+ self.set_msc(obj_.value)
elif nodeName_ == 'plantuml':
obj_ = docPlantumlType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'plantuml', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_plantuml'):
- self.add_plantuml(obj_.value)
+ self.add_plantuml(obj_.value)
elif hasattr(self, 'set_plantuml'):
- self.set_plantuml(obj_.value)
+ self.set_plantuml(obj_.value)
elif nodeName_ == 'anchor':
obj_ = docAnchorType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'anchor', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_anchor'):
- self.add_anchor(obj_.value)
+ self.add_anchor(obj_.value)
elif hasattr(self, 'set_anchor'):
- self.set_anchor(obj_.value)
+ self.set_anchor(obj_.value)
elif nodeName_ == 'formula':
obj_ = docFormulaType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'formula', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_formula'):
- self.add_formula(obj_.value)
+ self.add_formula(obj_.value)
elif hasattr(self, 'set_formula'):
- self.set_formula(obj_.value)
+ self.set_formula(obj_.value)
elif nodeName_ == 'ref':
obj_ = docRefTextType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
elif nodeName_ == 'emoji':
obj_ = docEmojiType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'emoji', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_emoji'):
- self.add_emoji(obj_.value)
+ self.add_emoji(obj_.value)
elif hasattr(self, 'set_emoji'):
- self.set_emoji(obj_.value)
+ self.set_emoji(obj_.value)
elif nodeName_ == 'linebreak':
obj_ = docEmptyType.factory(parent_object_=self)
obj_.build(child_, gds_collector_=gds_collector_)
MixedContainer.TypeNone, 'linebreak', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_linebreak'):
- self.add_linebreak(obj_.value)
+ self.add_linebreak(obj_.value)
elif hasattr(self, 'set_linebreak'):
- self.set_linebreak(obj_.value)
+ self.set_linebreak(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
MixedContainer.TypeNone, 'ref', obj_)
self.content_.append(obj_)
if hasattr(self, 'add_ref'):
- self.add_ref(obj_.value)
+ self.add_ref(obj_.value)
elif hasattr(self, 'set_ref'):
- self.set_ref(obj_.value)
+ self.set_ref(obj_.value)
if not fromsubclass_ and child_.tail is not None:
obj_ = self.mixedclass_(MixedContainer.CategoryText,
MixedContainer.TypeNone, '', child_.tail)
# end class docCopyType
+class docDetailsType(GeneratedsSuper):
+ __hash__ = GeneratedsSuper.__hash__
+ subclass = None
+ superclass = None
+ def __init__(self, para=None, gds_collector_=None, **kwargs_):
+ self.gds_collector_ = gds_collector_
+ self.gds_elementtree_node_ = None
+ self.original_tagname_ = None
+ self.parent_object_ = kwargs_.get('parent_object_')
+ self.ns_prefix_ = None
+ if para is None:
+ self.para = []
+ else:
+ self.para = para
+ self.para_nsprefix_ = None
+ def factory(*args_, **kwargs_):
+ if CurrentSubclassModule_ is not None:
+ subclass = getSubclassFromModule_(
+ CurrentSubclassModule_, docDetailsType)
+ if subclass is not None:
+ return subclass(*args_, **kwargs_)
+ if docDetailsType.subclass:
+ return docDetailsType.subclass(*args_, **kwargs_)
+ else:
+ return docDetailsType(*args_, **kwargs_)
+ factory = staticmethod(factory)
+ def get_ns_prefix_(self):
+ return self.ns_prefix_
+ def set_ns_prefix_(self, ns_prefix):
+ self.ns_prefix_ = ns_prefix
+ def get_para(self):
+ return self.para
+ def set_para(self, para):
+ self.para = para
+ def add_para(self, value):
+ self.para.append(value)
+ def insert_para_at(self, index, value):
+ self.para.insert(index, value)
+ def replace_para_at(self, index, value):
+ self.para[index] = value
+ def hasContent_(self):
+ if (
+ self.para
+ ):
+ return True
+ else:
+ return False
+ def export(self, outfile, level, namespaceprefix_='', namespacedef_='', name_='docDetailsType', pretty_print=True):
+ imported_ns_def_ = GenerateDSNamespaceDefs_.get('docDetailsType')
+ if imported_ns_def_ is not None:
+ namespacedef_ = imported_ns_def_
+ if pretty_print:
+ eol_ = '\n'
+ else:
+ eol_ = ''
+ if self.original_tagname_ is not None and name_ == 'docDetailsType':
+ name_ = self.original_tagname_
+ if UseCapturedNS_ and self.ns_prefix_:
+ namespaceprefix_ = self.ns_prefix_ + ':'
+ showIndent(outfile, level, pretty_print)
+ outfile.write('<%s%s%s' % (namespaceprefix_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+ already_processed = set()
+ self.exportAttributes(outfile, level, already_processed, namespaceprefix_, name_='docDetailsType')
+ if self.hasContent_():
+ outfile.write('>%s' % (eol_, ))
+ self.exportChildren(outfile, level + 1, namespaceprefix_, namespacedef_, name_='docDetailsType', pretty_print=pretty_print)
+ showIndent(outfile, level, pretty_print)
+ outfile.write('</%s%s>%s' % (namespaceprefix_, name_, eol_))
+ else:
+ outfile.write('/>%s' % (eol_, ))
+ def exportAttributes(self, outfile, level, already_processed, namespaceprefix_='', name_='docDetailsType'):
+ pass
+ def exportChildren(self, outfile, level, namespaceprefix_='', namespacedef_='', name_='docDetailsType', fromsubclass_=False, pretty_print=True):
+ if pretty_print:
+ eol_ = '\n'
+ else:
+ eol_ = ''
+ for para_ in self.para:
+ namespaceprefix_ = self.para_nsprefix_ + ':' if (UseCapturedNS_ and self.para_nsprefix_) else ''
+ para_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='para', pretty_print=pretty_print)
+ def build(self, node, gds_collector_=None):
+ self.gds_collector_ = gds_collector_
+ if SaveElementTreeNode:
+ self.gds_elementtree_node_ = node
+ already_processed = set()
+ self.ns_prefix_ = node.prefix
+ self.buildAttributes(node, node.attrib, already_processed)
+ for child in node:
+ nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+ self.buildChildren(child, node, nodeName_, gds_collector_=gds_collector_)
+ return self
+ def buildAttributes(self, node, attrs, already_processed):
+ pass
+ def buildChildren(self, child_, node, nodeName_, fromsubclass_=False, gds_collector_=None):
+ if nodeName_ == 'para':
+ obj_ = docParaType.factory(parent_object_=self)
+ obj_.build(child_, gds_collector_=gds_collector_)
+ self.para.append(obj_)
+ obj_.original_tagname_ = 'para'
+# end class docDetailsType
+
+
class docBlockQuoteType(GeneratedsSuper):
__hash__ = GeneratedsSuper.__hash__
subclass = None
"docBlockQuoteType",
"docCaptionType",
"docCopyType",
+ "docDetailsType",
"docDotMscType",
"docEmojiType",
"docEmptyType",
def parse_compound(inDirName,baseName,metrics):
rootObj = doxmlparser.compound.parse(inDirName+"/"+baseName+".xml",True)
for compounddef in rootObj.get_compounddef():
- kind = compounddef.get_kind()
- if kind==DoxCompoundKind.CLASS:
- metrics.numClasses+=1
- if is_documented(compounddef):
- metrics.numDocClasses+=1
- elif kind==DoxCompoundKind.STRUCT:
- metrics.numStructs+=1
- elif kind==DoxCompoundKind.UNION:
- metrics.numUnions+=1
- elif kind==DoxCompoundKind.INTERFACE:
- metrics.numInterfaces+=1
- elif kind==DoxCompoundKind.EXCEPTION:
- metrics.numExceptions+=1
- elif kind==DoxCompoundKind.NAMESPACE:
- metrics.numNamespaces+=1
- elif kind==DoxCompoundKind.FILE:
- metrics.numFiles+=1
- if is_documented(compounddef):
- metrics.numDocFiles+=1
- elif kind==DoxCompoundKind.GROUP:
- metrics.numGroups+=1
- elif kind==DoxCompoundKind.PAGE:
- metrics.numPages+=1
- else:
- continue
- parse_sections(compounddef,metrics)
+ kind = compounddef.get_kind()
+ if kind==DoxCompoundKind.CLASS:
+ metrics.numClasses+=1
+ if is_documented(compounddef):
+ metrics.numDocClasses+=1
+ elif kind==DoxCompoundKind.STRUCT:
+ metrics.numStructs+=1
+ elif kind==DoxCompoundKind.UNION:
+ metrics.numUnions+=1
+ elif kind==DoxCompoundKind.INTERFACE:
+ metrics.numInterfaces+=1
+ elif kind==DoxCompoundKind.EXCEPTION:
+ metrics.numExceptions+=1
+ elif kind==DoxCompoundKind.NAMESPACE:
+ metrics.numNamespaces+=1
+ elif kind==DoxCompoundKind.FILE:
+ metrics.numFiles+=1
+ if is_documented(compounddef):
+ metrics.numDocFiles+=1
+ elif kind==DoxCompoundKind.GROUP:
+ metrics.numGroups+=1
+ elif kind==DoxCompoundKind.PAGE:
+ metrics.numPages+=1
+ else:
+ continue
+ parse_sections(compounddef,metrics)
def parse_index(inDirName):
metrics = Metrics()
-#!/usr/bin/python
+#!/usr/bin/env python
#
# Copyright (C) 1997-2022 by Dimitri van Heesch.
#
{
for (const auto &kv : *Doxygen::symbolMap)
{
- listSymbol(kv.second);
+ for (const auto &def : kv.second)
+ {
+ listSymbol(def);
+ }
}
}
-static void lookupSymbol(Definition *d)
+static void lookupSymbol(const Definition *d)
{
if (d!=Doxygen::globalScope && // skip the global namespace symbol
d->name().at(0)!='@' // skip anonymous stuff
{
case Definition::TypeClass:
{
- ClassDef *cd = dynamic_cast<ClassDef*>(d);
+ const ClassDef *cd = dynamic_cast<const ClassDef*>(d);
printf("Kind: %s\n",cd->compoundTypeString().data());
}
break;
case Definition::TypeFile:
{
- FileDef *fd = dynamic_cast<FileDef*>(d);
+ const FileDef *fd = dynamic_cast<const FileDef*>(d);
printf("Kind: File: #includes %zu other files\n",
fd->includeFileList().size());
}
break;
case Definition::TypeNamespace:
{
- NamespaceDef *nd = dynamic_cast<NamespaceDef*>(d);
+ const NamespaceDef *nd = dynamic_cast<const NamespaceDef*>(d);
printf("Kind: Namespace: contains %zu classes and %zu namespaces\n",
nd->getClasses().size(),
nd->getNamespaces().size());
break;
case Definition::TypeMember:
{
- MemberDef *md = dynamic_cast<MemberDef*>(d);
+ const MemberDef *md = dynamic_cast<const MemberDef*>(d);
printf("Kind: %s\n",md->memberTypeName().data());
}
break;
{
auto range = Doxygen::symbolMap->find(sym);
bool found=false;
- for (auto it=range.first; it!=range.second; ++it)
+ for (const Definition *def : range)
{
- lookupSymbol(it->second);
+ lookupSymbol(def);
found=true;
}
if (!found)
-#!/usr/bin/python
+#!/usr/bin/env python
# python script to search through doxygen_sqlite3.db
#
import re
class MemberType:
- Define="macro definition"
- Function="function"
- Variable="variable"
- Typedef="typedef"
- Enumeration="enumeration"
- EnumValue="enumvalue"
- Signal="signal"
- Slot="slot"
- Friend="friend"
- DCOP="dcop"
- Property="property"
- Event="event"
- File="file"
+ Define="macro definition"
+ Function="function"
+ Variable="variable"
+ Typedef="typedef"
+ Enumeration="enumeration"
+ EnumValue="enumvalue"
+ Signal="signal"
+ Slot="slot"
+ Friend="friend"
+ DCOP="dcop"
+ Property="property"
+ Event="event"
+ File="file"
class RequestType:
- References="9901"
- Struct="9902"
- Includers="9903"
- Includees="9904"
- Members="9905"
- BaseClasses="9906"
- SubClasses="9907"
+ References="9901"
+ Struct="9902"
+ Includers="9903"
+ Includees="9904"
+ Members="9905"
+ BaseClasses="9906"
+ SubClasses="9907"
g_use_regexp=False
###############################################################################
print(json.dumps({"result":j,"error":None}))
###############################################################################
def usage():
- sys.stderr.write("""Usage: search.py [Options]
+ sys.stderr.write("""Usage: search.py [Options]
Options:
-h, --help
-d <D> Use database <D> for queries.
cn=openDb(dbname)
f=Finder(cn,o)
if ref != None:
- j=processHref(cn,ref)
+ j=processHref(cn,ref)
else:
- j=process(f,kind)
+ j=process(f,kind)
print(json.dumps(j,indent=4))
TextField = 7
};
- /** Handler for a start tag. Called for <doc> and <field> tags */
+ /** Handler for a start tag. Called for `<doc>` and `<field>` tags */
void startElement(const std::string &name, const XMLHandlers::Attributes &attrib)
{
m_data="";
}
}
- /** Handler for an end tag. Called for </doc> and </field> tags */
+ /** Handler for an end tag. Called for `</doc>` and `</field>` tags */
void endElement(const std::string &name)
{
if (name=="doc") // </doc>
set_source_files_properties(${GENERATED_SRC_WIZARD}/configdoc.cpp PROPERTIES GENERATED 1)
set(LEX_FILES config_doxyw)
+
+if (NOT depfile_supported)
+ # In case the DEPFILE possibility is not supported the complete list of lex include files for the dependency has to be used
+ set(LEX_INC_FILES)
+endif()
+
foreach(lex_file ${LEX_FILES})
+ if (depfile_supported)
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d ${PROJECT_SOURCE_DIR}/src
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l
+ DEPFILE ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ )
+ else()
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d ${PROJECT_SOURCE_DIR}/src
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${LEX_INC_FILES}
+ OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ )
+ endif()
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.l PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.corr PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.d PROPERTIES GENERATED 1)
+
+ if (depfile_supported)
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d ${PROJECT_SOURCE_DIR}/src
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l
+ DEPFILE ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ )
+ else()
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d ${PROJECT_SOURCE_DIR}/src
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/pre_lex.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${LEX_INC_FILES}
+ OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${GENERATED_SRC_WIZARD}/${lex_file}.d
+ )
+ endif()
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.l PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.corr PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.d PROPERTIES GENERATED 1)
+
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/scan_states.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l > ${GENERATED_SRC_WIZARD}/${lex_file}.l.h
- DEPENDS ${PROJECT_SOURCE_DIR}/src/scan_states.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/scan_states.py ${GENERATED_SRC_WIZARD}/${lex_file}.l > ${GENERATED_SRC_WIZARD}/${lex_file}.l.h
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/scan_states.py ${GENERATED_SRC_WIZARD}/${lex_file}.l
OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l.h
)
set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.l.h PROPERTIES GENERATED 1)
- FLEX_TARGET(${lex_file} ${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.cpp COMPILE_FLAGS "${LEX_FLAGS}")
+ FLEX_TARGET(${lex_file}
+ ${GENERATED_SRC_WIZARD}/${lex_file}.l
+ ${GENERATED_SRC_WIZARD}/${lex_file}_intermediate.cpp
+ COMPILE_FLAGS "${LEX_FLAGS}")
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/post_lex.py ${GENERATED_SRC_WIZARD}/${lex_file}_intermediate.cpp ${GENERATED_SRC_WIZARD}/${lex_file}.cpp ${GENERATED_SRC_WIZARD}/${lex_file}.corr ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l ${GENERATED_SRC_WIZARD}/${lex_file}.l
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/post_lex.py ${GENERATED_SRC_WIZARD}/${lex_file}_intermediate.cpp ${GENERATED_SRC_WIZARD}/${lex_file}.corr
+ OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.cpp
+ )
endforeach()
qt_wrap_cpp(doxywizard_MOC
#define MAX_INCLUDE_DEPTH 10
+#define USE_STATE2STRING 0
/* -----------------------------------------------------------------
*
}
}
+#if USE_STATE2STRING
+static const char *stateToString(int state);
+#endif
%}
}
}
}
+#if USE_STATE2STRING
#include "config_doxyw.l.h"
+#endif
HTML_COLORSTYLE_SAT = 0
ENABLED_SECTIONS = logo_on
ENABLE_PREPROCESSING = NO
+HTML_COLORSTYLE = LIGHT
CASE_SENSE_NAMES = NO
IMAGE_PATH = . images
INPUT = index.doc install.doc starting.doc docblocks.doc markdown.doc \
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
STRIP_CODE_COMMENTS = NO
-HTML_STYLESHEET = doxygen_manual.css
+HTML_EXTRA_STYLESHEET = doxygen_manual.css
HTML_EXTRA_FILES = doxygen_logo.svg
HTML_EXTRA_FILES += translator_report.txt
ALIASES = LaTeX="\f({\LaTeX}\f)"
doxygen command: with the `-x` option and the name of the configuration file (default
is `Doxyfile`). The output will be a list of the not default settings (in `Doxyfile`
format). Alternatively also `-x_noenv` is possible which is identical to the `-x`
-option but without replacing the environment variables.
+option but without replacing the environment variables and the CMake type replacement variables.
\htmlonly
Return to the <a href="index.html">index</a>.
/** \page changelog Changelog
\tableofcontents{html,latex}
\section log_1_9 1.9 Series
+\subsection log_1_9_5 Release 1.9.5
+\htmlonly
+<b>(release date 26-08-2022)</b>
+</p>
+<h3>Bug fixes</h3>
+<ul>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/3165">#3165</a>: EXPAND_ONLY_PREDEF neglected within function macro expansions (Origin: bugzilla #559489) [<a href="https://github.com/doxygen/doxygen/commit/50184bd02e8c8c4558827913907690ef0db72fd1">view</a>]</li>
+ <li>Macros listed with EXPAND_AS_DEFINED were not recursively expanded [<a href="https://github.com/doxygen/doxygen/commit/387f508b2e41179a9f70b2914132c2bf12d07b43">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/8215">#8215</a>: missing lang attribute and meta description for SEO [<a href="https://github.com/doxygen/doxygen/commit/15825737c8f2cc6ceee34ed986594b0ddbc47ce1">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9016">#9016</a>: Support collapsible sections in markdown [<a href="https://github.com/doxygen/doxygen/commit/a4e67401cb031ddb21b694e6a1ae62e98ec67d33">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9047">#9047</a>: Support @param-taint in PHP (permit dashes in command aliases?) [<a href="https://github.com/doxygen/doxygen/commit/6222ce6fc0feaf54d5bf88bca3451bb5727eedfe">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/a3c2018660befc13d99ab5ccbb453ba957fdd497">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9096">#9096</a>: Call Graph corrupt and/or incomplete (2) [<a href="https://github.com/doxygen/doxygen/commit/e08488a312af7e0ef7fbd6d011a0d3c0086631cc">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9236">#9236</a>: doxygen x_noenv should always diff system-dependent settings [<a href="https://github.com/doxygen/doxygen/commit/f41a679b3e68f13eff9f4eceaf04aacc51555fc5">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9309">#9309</a>: Colon on a line by itself [<a href="https://github.com/doxygen/doxygen/commit/0cf06873e8435a1e1a799ddf7178ca5fad7240eb">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9312">#9312</a>: Build: cache.h:53:14: error: 'exchange' is not a member of 'std' [<a href="https://github.com/doxygen/doxygen/commit/5198966c8d5fec89116d025c74934ac03ea511fa">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9317">#9317</a>: File-scoped Namespaces in C# [<a href="https://github.com/doxygen/doxygen/commit/e51aa96d25e96dff00d2eb23648eb24d777ce7a6">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9319">#9319</a>: Doc build fails with cairo 1.17.6 [<a href="https://github.com/doxygen/doxygen/commit/9df76e22464a0b6302b7c1cda980a35b39185bc4">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/c22ae5ed4ca8d7e5568be7d5a930ee388117703e">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9344">#9344</a>: Long bibliography entry looks bad [<a href="https://github.com/doxygen/doxygen/commit/ac090b56af5358b0f1ffc5a38dba4e61acb938d1">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9352">#9352</a>: Qt Q_GADGET macro is not supported [<a href="https://github.com/doxygen/doxygen/commit/d70eb9351c0b8881696cd9dbd9e174565e8c7115">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9362">#9362</a>: Doxyfile environment/quote mishandling in list values [<a href="https://github.com/doxygen/doxygen/commit/76c643993df0f046741b6f77808ec0e2b25f585a">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9367">#9367</a>: Current git master does not honor PROJECT_NUMBER in LaTeX [<a href="https://github.com/doxygen/doxygen/commit/b293309a4cacf4e6385a9a992165f6c30a0575ce">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9378">#9378</a>: Dollar Sign Escape Sequence Ignored in Markdown Backtick Syntax (Inline Code) [<a href="https://github.com/doxygen/doxygen/commit/5db58085ae8d335c3c97be35973a7ee325c56c3b">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9394">#9394</a>: Request: Show C++ default member values when INLINE_SIMPLE_STRUCTS=YES [<a href="https://github.com/doxygen/doxygen/commit/f40a739457ef05b4935971db67c77925a6f90dcc">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9399">#9399</a>: XML / perlmod fortran output, the type of a parameter of a function is set to the name of the parameter [<a href="https://github.com/doxygen/doxygen/commit/9ad2a32a22200d550c90eef9cf68a37b5e8e0f76">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9409">#9409</a>: Error-message and Line-Number is NOT related to document [<a href="https://github.com/doxygen/doxygen/commit/ceb573f8254cdbd4715ebc0440f5bd2c580ac105">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9417">#9417</a>: Java: Issue with static initializer if no space after static [<a href="https://github.com/doxygen/doxygen/commit/eaaf3bb120b571f28f376d35f6d8543303a2e98a">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9427">#9427</a>: Enhance documentation for filter commands [<a href="https://github.com/doxygen/doxygen/commit/48f76a973a2d7ac2f40605d37b7fa7df91eb83a9">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9430">#9430</a>: HTML layout: a full sidebar overlaps with breadcrumbs [<a href="https://github.com/doxygen/doxygen/commit/85568d9ae102ab12233686f81e8eea32a2332ffc">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9440">#9440</a>: Fix search label regression [<a href="https://github.com/doxygen/doxygen/commit/0653918549e09f139897422787d6fd957f47d0e4">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9476">#9476</a>: fatal: Cannot open 'doxygen/graph_legend.dox': No such file or directory [<a href="https://github.com/doxygen/doxygen/commit/1b106e6d3495bf53ef971b8c9fdf0cd03c67d41c">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9500">#9500</a>: No output when run doxygen in high level directory [<a href="https://github.com/doxygen/doxygen/commit/532fabed57d7b508439ee4114f999132d745ce09">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9515">#9515</a>: Function return value problem [<a href="https://github.com/doxygen/doxygen/commit/6e300b2d094bb9f376dc0473b5b32a31ced4f139">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9520">#9520</a>: Rest of file silently ignored after a certain string literal [PHP] [<a href="https://github.com/doxygen/doxygen/commit/68e8d2a220c51d0909c38e8c5027f644f7233db0">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/789a763ef1a8f8ad8ddbdb4725913ca08b1ff37a">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9386">#9386</a>: Problems with the directory dependency graph [<a href="https://github.com/doxygen/doxygen/commit/3278a3268ec66bbd843462ce3ec1520f8d9aac8d">view</a>]</li>
+<li>bug 531817 Python: Backslash prevent showing the proper preview [<a href="https://github.com/doxygen/doxygen/commit/5be58a08bba75ae0c9c1fdc229efbe5e77bcaa6e">view</a>]</li>
+<li>bug 539818 C Preprocessor enum printing trick not handled properly by Doxygen [<a href="https://github.com/doxygen/doxygen/commit/29001f8659735d5e073bdf6f0f1ef988e8957d74">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/70df5ab5a701e203d1a9b1cb63a864dc0582f10c">view</a>]</li>
+<li>bug 642168 C# "here-docs" not correctly parsed [<a href="https://github.com/doxygen/doxygen/commit/d0bac16ec30f704dbc4712d25f0256f02d3f69d3">view</a>]</li>
+<li>bug 786576 regression with ALIASES or image latex interpretation [<a href="https://github.com/doxygen/doxygen/commit/b3bd30ff95b9630cdbc5b592e82b95c314531eeb">view</a>]</li>
+<li>bug_572042 ingroup does not allow multiple groupnames [<a href="https://github.com/doxygen/doxygen/commit/7dc299f2d867250bd924d39545c7a3d10b9d3756">view</a>]</li>
+<li>bug_751023 Predefined macros are handled incorrectly in source browser [<a href="https://github.com/doxygen/doxygen/commit/c1c791ae46e61ad168e4a1ad7951da0d4f0d2bd2">view</a>]</li>
+<li>Fixed javascript issue in menu.js causing invalid XHTML output [<a href="https://github.com/doxygen/doxygen/commit/50ca2d074678ed34f2fa043f6fbd4cfd97815a0d">view</a>]</li>
+<li>Fixed parsing issues with the XHTML output due to the use of &nbsp; [<a href="https://github.com/doxygen/doxygen/commit/d9a25b04bfacc6e68c45f32f183b09e55099854e">view</a>]</li>
+<li>FileInfo::isSymLink() did not work correctly [<a href="https://github.com/doxygen/doxygen/commit/6045c84aa1f6c21e99954268c720f3be7bae7995">view</a>]</li>
+<li>Files Quick Link results in a non existing page [<a href="https://github.com/doxygen/doxygen/commit/fb6a3bd96fde4c65e792e6ad606ce6142eda928e">view</a>]</li>
+<li>Added guard to prevent stack overflow in hasNonReferenceSuperClass() [<a href="https://github.com/doxygen/doxygen/commit/ffd5a0947f809304008c1b327dd2306997430355">view</a>]</li>
+<li>Give markdown verbatim and fenced code blocks their own command. [<a href="https://github.com/doxygen/doxygen/commit/037da647c6a1b4d138c892f2a5f111887b198928">view</a>]</li>
+<li>No click possible on chapters in doxygen's CHM documentation [<a href="https://github.com/doxygen/doxygen/commit/f759783502a61097f685369888d06f14022f6c4c">view</a>]</li>
+</ul>
+<h3>Features</h3>
+<ul>
+<li>Add support for Dark theme (set via HTML_COLORSTYLE with setting DARK, LIGHT, AUTO_DARK, AUTO_LIGHT and TOGGLE). <br/>
+Original issue <a href="https://github.com/doxygen/doxygen/issues/8404">#8404</a>:
+Dark theme [<a href="https://github.com/doxygen/doxygen/commit/8b7822cb67fd55a4349a6ec7525ca18c1d9f6790">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/c28602c794592a4e57db03dbc34d7d031d3e6085">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/ec318afc588324136bde8b627cb0ff69d8a25e65">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/e1772b8ac91011cdc774ad5ed3962633bc8aa20c">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/41d6c6e265e6cd27df0e31064418fea030461c1a">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/95390f85058027057433095cdcff23bd97f917b0">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/ec04a338840da52d51eaf3360e2338feac157891">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/d8c07cfd399b95725638e559a86f90e28170bd5c">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/35a246e8974c5a6275d2f09a865145a5b9d88ade">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/aa4a606685c08c43ffea4f8d3350cef093870ad9">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/50871a4cd625586b6e73fad25afd23610da09e3e">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/260f2fadf8b780d824cba2e490d119e759ada101">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/a02d23c8b9c7328a4d0afb5c0aa8a6967b352521">view</a>], and
+[<a href="https://github.com/doxygen/doxygen/commit/18b11ea424e412cc7a03795a9e5f3df6f7406c3e">view</a>]</li>
+<li>New options DOt_COMMON_ATTR, DOT_EDGE_ATTR, and DOT_NODE_ATTR to configure dot graph,
+nodes and arrows attributes [<a href="https://github.com/doxygen/doxygen/commit/4bfd829767e85f0d4589ee3638b90c27b3395853">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/5d929c3c10ee45917ec8c7e44ce9b0b294b7aec7">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/abdd83c2de5cdf71018fba11957e1a92a5366214">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/4ad25a884f0c79e043bfb7cbfd858ba0b00fc9ea">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/a4565784cdc01e860438edfdcc6dc1ef7ffe9ec9">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/a313ed7c3f3ef7638c8bf2a7744e86b8ae91ae3f">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/b711b21a041b14d7b2fddea610d904671f260924">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/6881a3c1db326c73c673a5ee5874f54a40400565">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/780e6fc8d6f7e7339a48fba731cb6f12afe1ab91">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/50a50fdb86a2b4c6f021beb219b21209f504d48b">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/5f8bf5819d4ce95e9a21e8ad88fc82cfe10c23dc">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/241b3015356f7fa59285403008dd771bd26cafa2">view</a>], and
+[<a href="https://github.com/doxygen/doxygen/commit/d6a4618b39615db4af2146d2d08f69cf6d724702">view</a>]</li>
+<li>New option INPUT_FILE_ENCODING to specify input encoding based on a file pattern [<a href="https://github.com/doxygen/doxygen/commit/256f352fad995f70d58a777c4ce32f8104382b20">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/d0d1482ddc6a78e9b6aafb02c63b736291881ac8">view</a>]</li>
+<li>New option FORTRAN_COMMENT_AFTER to configure the fixed format comment start position (default 72).
+<li>Added new commands \fileinfo and \lineinfo to show the current file and line. <br/>
+See issue <a href="https://github.com/doxygen/doxygen/issues/7046">#7046</a>: Add filename and line number support to tags, ala __FILE__ and __LINE__ macros [<a href="https://github.com/doxygen/doxygen/commit/7279874742ad21ca74506da1e898dfe9a27da248">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/6db7cd7d6da22e5219c96097e280539cf793a3a8">view</a>]</li>
+<li>Add support for \showdate command [<a href="https://github.com/doxygen/doxygen/commit/7958f3b22fd4a3c6fea26450214a8aa294d9a21d">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/bb9d30dc964af2709096ad20f95e707fe4c72bb3">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/c03d69c7fa1f66aaa734d0b4624b0b8dec2723c1">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/3a2247fe708ad1312d2f30cbd6a0c45ec823ed64">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/9af1017ab5a52f3f1f96248736a838df74e57007">view</a>], and
+[<a href="https://github.com/doxygen/doxygen/commit/afb0a4465e1f6f1c8288773b0c416f568236ec8b">view</a>]</li>
+<li>Allow empty HTML <div/> and <span/> tags [<a href="https://github.com/doxygen/doxygen/commit/1c7bbfb6879851c8e1a3a0d7f792b1ae0a4732eb">view</a>]</li>
+<li>Handling of `@...@` setting with `doxygen -x_noenv` [<a href="https://github.com/doxygen/doxygen/commit/a26134fd3e1a12c090e87b005654631bfcb2b5ea">view</a>], and
+[<a href="https://github.com/doxygen/doxygen/commit/5961e8c06d738d9ebddfdeac79c0b14fff64d237">view</a>]</li>
+<li>Recognizing and name of implicit Fortran [programs [<a href="https://github.com/doxygen/doxygen/commit/943d8b7381fc79c4f78f8730fa1f2967521213a2">view</a>]</li>
+<li>Support HTML stylesheets on the Internet [<a href="https://github.com/doxygen/doxygen/commit/6b89e8f7b2793329c820d636a91126af52c757e0">view</a>]</li>
+Issue <a href="https://github.com/doxygen/doxygen/issues/9415">#9415</a>: fixed format source with wide lines [<a href="https://github.com/doxygen/doxygen/commit/155afc19f081b65d413f8fb175e9e7ec2ac3d8cc">view</a>]</li>
+<li>End of "here document" can be indented [<a href="https://github.com/doxygen/doxygen/commit/801e3fbfc44373e9f2e9cc68133c937ff81f9463">view</a>]</li>
+<li>Portuguese and Czech translators updated to 1.9.4. [<a href="https://github.com/doxygen/doxygen/commit/b45a92584ea4626f778842fa853230d679c6f266">view</a>] and [<a href="https://github.com/doxygen/doxygen/pull/9540">view</a>]</li>
+<li>issue <a href="https://github.com/doxygen/doxygen/issues/9444">#9444</a>: Upgrade jQuery UI to latest 1.13 release to get rid of security issues [<a href="https://github.com/doxygen/doxygen/commit/ac02185173cb7f6109b8945a8d7aa0ca6927d6fb">view</a>]</li>
+</ul>
+<h3>Improved user feedback</h3>
+<ul>
+<li>Commented function list marcro gives warning [<a href="https://github.com/doxygen/doxygen/commit/039d190f27da746670fd27685237eed927f78abf">view</a>]</li>
+<li>Correction of line counting [<a href="https://github.com/doxygen/doxygen/commit/2606d4e2e5c086d5fc5560099d2a417bf7ccf58c">view</a>]</li>
+<li>Documenting parameter of function without parameters [<a href="https://github.com/doxygen/doxygen/commit/14a1de12affc2798278b7755a70d285c3194ee7f">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/f8daa6234b05c097450b9886bdc7ece758daae8e">view</a>]</li>
+<li>Warning about non closed (nested) comment [<a href="https://github.com/doxygen/doxygen/commit/64b858397458af468f9918ca5cc6d7287ef7cd8a">view</a>]</li>
+<li>Friendly message on incorrect input [<a href="https://github.com/doxygen/doxygen/commit/be9aa9ced3c7fa8628971da762f0aa7436a02abc">view</a>]</li>
+<li>Make directory traversal more robust for errors (e.g. broken symlinks) [<a href="https://github.com/doxygen/doxygen/commit/d72fa53f41d6bea2a190a98fcc830fe79667abc7">view</a>]</li>
+</ul>
+<h3>Deprecated functionality</h3>
+<ul>
+<li>With the new dark mode color style the FORMULA_TRANSPARENT and DOT_TRANSPARENT have become obsolete. Pictures always have a transparent background now.</li>
+<li>The specific options DOT_FONTNAME and DOT_FONTSIZE have been replaced be more generic options DOT_COMMON_ATTR, DOT_EDGE_ATTR, and DOT_NODE_ATTR that can be used to
+customize the way dot images are rendered. When upgrading the Doxyfile (using <tt>doxygen -u</tt>) the existing values of DOT_FONTNAME and DOT_FONTSIZE will be migrated.</li>
+</ul>
+<h3>Refactoring and cleanup</h3>
+<ul>
+<li>Dependency between examples. [<a href="https://github.com/doxygen/doxygen/commit/c4e30d6e6fd747ff2c32a79a2012cf9481f4e780">view</a>]</li>
+<li>Enabling include files for lex files [<a href="https://github.com/doxygen/doxygen/commit/a619d333a84905c5ad20c03a744f8c977fccb770">view</a>]</li>
+<li>Enabling dependencies for include files in lex files [<a href="https://github.com/doxygen/doxygen/commit/2c6fad4d202c512db26a5a7ccbfb63b2822a280b">view</a>]</li>
+<li>Fix handling of PUBLIC/PRIVATE for procedures in Fortran [<a href="https://github.com/doxygen/doxygen/commit/4340e8ae1d0910f5521742478f759f9e7575ba33">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/827294d41ba868f8a5144f8e33d4d6de386359f5">view</a>]</li> <li>Fix regressions introduced by changing the way references are resolved [<a href="https://github.com/doxygen/doxygen/commit/35711f2d14acc81cff83f81f04c566ad8c8c6fe8">view</a>]</li>
+<li>Fixes: also allow ; and space as attribute separator [<a href="https://github.com/doxygen/doxygen/commit/6f020734520f2945f8f2821deb78ee0beb7c0c62">view</a>]</li>
+<li>Implementation of lineBreak and nonBreakingSpace in docbook [<a href="https://github.com/doxygen/doxygen/commit/e2090bb18964077542b3637496347a3f9d4f53c8">view</a>]</li>
+<li>Improve test for fortran public/private handling [<a href="https://github.com/doxygen/doxygen/commit/230d403896d06e906a9e711bd86851b0df33d682">view</a>]</li>
+<li>Improvement of HTML documentation section [<a href="https://github.com/doxygen/doxygen/commit/a935b577686e6a4a635837fecb7e79b6d77dabef">view</a>]</li>
+<li>Incorrect determination of sub-sections for index. [<a href="https://github.com/doxygen/doxygen/commit/593cc01f11da17f231750a88c7f997f8383df283">view</a>]</li>
+<li>Incorrect name lex state name used [<a href="https://github.com/doxygen/doxygen/commit/8115051ac38e58763dab8f0474d21946e9b0f872">view</a>]</li>
+<li>Making example configurations consistent [<a href="https://github.com/doxygen/doxygen/commit/bc1af180883518ad86f32e15f7dbe342a3549a97">view</a>]</li>
+<li>Missing possibility for Element 'compounddef', attribute 'language' [<a href="https://github.com/doxygen/doxygen/commit/79c5ec77867e404d6f5438548c98d4079de6c351">view</a>]</li>
+<li>More translation tweaks [<a href="https://github.com/doxygen/doxygen/commit/8dad30669344c200e757fdbf7284b87ecfed3654">view</a>]</li>
+<li>Performance tweaks to speed up processing [<a href="https://github.com/doxygen/doxygen/commit/db8c2d6289d8c56a401d07714a6109ddc0bdc819">view</a>]</li>
+<li>Prohibit in-place doxygen builds [<a href="https://github.com/doxygen/doxygen/commit/97d59a983709475dad375b9758d6c48cecda7afe">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/9d0600b51717dd8741635ed13dcd5f2a9080601f">view</a>]</li>
+<li>Refactoring and fixes [<a href="https://github.com/doxygen/doxygen/commit/a44f6a7e5caf1fbf5fe271c99046a51b315d5f56">view</a>]</li>
+<li>Refactoring: Automatically replace incorrect formula.repository [<a href="https://github.com/doxygen/doxygen/commit/6cb065fa4b525f9e507ff80633050b770a6fb34a">view</a>]</li>
+<li>Refactoring: optimize FileDef::isDocumentationFile() method [<a href="https://github.com/doxygen/doxygen/commit/20cacf8a84b52535ab68c3e298f3e8f5088a2bb9">view</a>]</li>
+<li>Refactoring: optimize guessSection routine [<a href="https://github.com/doxygen/doxygen/commit/40869ceda8277459bd0042086a5494e2e68d2188">view</a>]</li>
+<li>Refactoring: reimplement getDefs using symbol resolver [<a href="https://github.com/doxygen/doxygen/commit/b290399fab92df45376103d7c094f053f24495fa">view</a>]</li>
+<li>Refactoring: replace left(n)/right(n) by startsWith/endsWith [<a href="https://github.com/doxygen/doxygen/commit/5979b8fa3e20ceda77e0019a35f9e07c18071597">view</a>]</li>
+<li>Refactoring: use std::variant for Indices [<a href="https://github.com/doxygen/doxygen/commit/f6aacfe1798efa80bbd9663b74ab05d2c7cb8382">view</a>]</li>
+<li>Refactoring: use std::variant to switch between search indices [<a href="https://github.com/doxygen/doxygen/commit/fdd8e8e750e1b8e58b4d9cc758293f532278dcca">view</a>]</li>
+<li>Remember position of collapse/expand across pages [<a href="https://github.com/doxygen/doxygen/commit/6bc86feae5466f98f8b9ea873c85f26e5c827bd2">view</a>]</li>
+<li>Remove dead-code statement as found by coverity [<a href="https://github.com/doxygen/doxygen/commit/426d3a5c743936e5584723a3762d80f8fca65fac">view</a>]</li>
+<li>Remove unused Validate debug option [<a href="https://github.com/doxygen/doxygen/commit/5cc149cbf65e433f04de23ad26be9bb4bf460ab2">view</a>]</li>
+<li>Replacing the list of HTML / XML commands by tables [<a href="https://github.com/doxygen/doxygen/commit/9bd76a4e95cff7064cabfb4ce8f5e00fe0453a1e">view</a>]</li>
+<li>Restructure build rule to improve readability and remove duplication [<a href="https://github.com/doxygen/doxygen/commit/09a6b3e8ddca2328d08ae4715f42df1d07d55700">view</a>]</li>
+<li>Small spelling correction in doxygen usage [<a href="https://github.com/doxygen/doxygen/commit/601e680b8f6dd2be7fea07ab107c9e4572eb8ddc">view</a>]</li>
+<li>Test Fortran inheritance over modules [<a href="https://github.com/doxygen/doxygen/commit/58ad198d5f6124f6fbc1aac2c0aeba7e8c80cbe5">view</a>]</li>
+<li>Use lower().str() to map Fortran identifier [<a href="https://github.com/doxygen/doxygen/commit/3205fbb4c34f61aa4165f875702de8e976cfd68f">view</a>]</li>
+<li>Workaround for DEPFILE [<a href="https://github.com/doxygen/doxygen/commit/3b30f16032a4b4512c2b60fb4b1cf68c36d06854">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/cb4c6f9b96e66c43401b9ff2e1d35faa73a10f17">view</a>]</li>
+<li>Workaround for XHTML not supporting <picture> [<a href="https://github.com/doxygen/doxygen/commit/24af0b0aaa7d834a015c40ba4c4c35fff511c21e">view</a>]</li>
+<li>fix shabang [<a href="https://github.com/doxygen/doxygen/commit/6afedffc85eeeb350d66d9cf2c1ee0e7ccd90fad">view</a>]</li>
+<li>python: do not use tabs for indentation [<a href="https://github.com/doxygen/doxygen/commit/87ce4ab655a1b3d344dabdefcfb3e626fd828d46">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/3b6a7091a85ef63fff96936b964ab3f4a8477ff6">view</a>]</li>
+<li>unset executable flag [<a href="https://github.com/doxygen/doxygen/commit/68725d49fede1a02a8f3c73608cc920960224d2b">view</a>]</li>
+</ul>
+<p>
+\endhtmlonly
+
\subsection log_1_9_4 Release 1.9.4
\htmlonly
<b>(release date 05-05-2022)</b>
<li>Alignment in LaTeX parameter table [<a href="https://github.com/doxygen/doxygen/commit/a0880ff1c41a1c57bc92c1ccf99cf750064e2995">view</a>]</li>
<li>Avoid using Resource::data as string, as it is not null terminated. [<a href="https://github.com/doxygen/doxygen/commit/15a87a623791bf407b3076960cdd1133c8973357">view</a>]</li>
<li>Better handling of implicit statement in source code browser [<a href="https://github.com/doxygen/doxygen/commit/404468ac5484d54e47129ce2a00b3ad6e1c2c72a">view</a>]</li>
-<li>Bug 149792 - Mainpage title has wrong style in RTF [<a href="https://github.com/doxygen/doxygen/commit/077aeb768767e62407abb4759d44671619bc62fd">view</a>]</li>
+<li>Bug 149792 - Mainpage title has wrong style in RTF [<a href="https://github.com/doxygen/doxygen/commit/077aeb768767e62407abb4759d44671619bc62fd">view</a>]</li>
<li>Bump version so that the GIT repo represents the version for the "next" release [<a href="https://github.com/doxygen/doxygen/commit/42c376cdb41db392bd025611ccfcaddb49d05e92">view</a>]</li>
<li>Cmake tries to remove directory refman.tex instead of file refman.tex [<a href="https://github.com/doxygen/doxygen/commit/63094c8bb34a2e02e8490860660303d849e4a984">view</a>]</li>
<li>Copy user EXTRA_FILES at the end to overrule files generated by default by doxygen [<a href="https://github.com/doxygen/doxygen/commit/82f08138ad08fa5b8906c162283c4df0e9819d83">view</a>]</li>
\refitem cmdfcurlyopen \\f{
\refitem cmdfcurlyclose \\f}
\refitem cmdfile \\file
+\refitem cmdfileinfo \\fileinfo
\refitem cmdfn \\fn
\refitem cmdheaderfile \\headerfile
\refitem cmdhidecallergraph \\hidecallergraph
\refitem cmdlatexonly \\latexonly
\refitem cmdli \\li
\refitem cmdline \\line
+\refitem cmdlineinfo \\lineinfo
\refitem cmdlink \\link
\refitem cmdmainpage \\mainpage
\refitem cmdmaninclude \\maninclude
\refitem cmdsection \\section
\refitem cmdsee \\see
\refitem cmdshort \\short
+\refitem cmdshowdate \\showdate
\refitem cmdshowinitializer \\showinitializer
\refitem cmdshowrefby \\showrefby
\refitem cmdshowrefs \\showrefs
has been set to \c YES in the configuration file.
<hr>
+\section cmdfileinfo \\fileinfo['{'option'}']
+
+ \addindex \\fileinfo
+ Shows (part) of the file name in which this command is placed.
+ The `option` can be `file`, `extension`, `filename`, `directory` or, `full`,
+ with `file` the name of the file without extension, `extension` the extension of the file, `filename` the
+ filename i.e. `file` plus `extension`, `directory` the directory of the given file and `full` the full path
+ and filename of the given file.
+
+ \note the command \\fileinfo cannot be used as argument to the \ref cmdfile "\\file" command
+
+ \see section \ref cmdlineinfo "\\lineinfo"
+
+<hr>
+\section cmdlineinfo \\lineinfo
+
+ \addindex \\lineinfo
+ Shows the line number inside the file at which this command is placed.
+
+ \see section \ref cmdfileinfo "\\fileinfo"
+
+<hr>
\section cmdfn \\fn (function declaration)
\addindex \\fn
\ref cmdmemberof "\\memberof"
<hr>
-\section cmdingroup \\ingroup (<groupname> [<groupname> <groupname>])
+\section cmdingroup \\ingroup (<groupname> [<groupname>]*)
\addindex \\ingroup
- If the \c \\ingroup command is placed in a comment block of a
- class, file or namespace, then it will be added to the group or
- groups identified by \<groupname\>.
+ If the \c \\ingroup command is placed in a comment block of a compound entity
+ (like class, file or namespace), then it will be added to the group(s)
+ identified by the `<groupname>`(s).
+ In case of members (like variable, functions, typedefs and enums) the member will
+ be added only to one group (to avoid ambiguous linking targets in case
+ a member is not documented in the context of its class, namespace
+ or file, but only visible as part of a group).
\sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup",
\ref cmdaddtogroup "\\addtogroup", and \ref cmdweakgroup "\\weakgroup"
for an example.
<hr>
+\section cmdshowdate \\showdate "<format>" [ <date_time> ]
+
+ \addindex \\showdate
+ Shows the date and time based on the given \<format\> and \<date_time\>. Where the \<format\> is a string in which the following tokens have a special meaning:
+ | Code | Description |
+ | :--- | :---------- |
+ | \%y | Year without century as a zero-padded decimal number.
+ | \%Y | Year with century as a decimal number.
+ | \%m | Month as a zero-padded decimal number.
+ | \%-m | The month as a decimal number.
+ | \%b | Month as locale’s abbreviated name.
+ | \%B | Month as locale’s full name.
+ | \%d | Day of the month as a zero-padded decimal number.
+ | \%-d | Day of the month as a decimal number.
+ | \%u | The weekday as a decimal number (1-7), where Monday is 1.
+ | \%w | The weekday as a decimal number (0-6), where Sunday is 0.
+ | \%a | Weekday as locale’s abbreviated name.
+ | \%A | Weekday as locale’s full name.
+ | |
+ | \%H | Hour (24-hour clock) as a zero-padded decimal number.
+ | \%-H | Hour (24-hour clock) as a decimal number.
+ | \%I | Hour (12-hour clock) as a zero-padded decimal number.
+ | \%-I | Hour (12-hour clock) as a decimal number.
+ | \%M | Minute as a zero-padded decimal number.
+ | \%-M | Minute as a decimal number.
+ | \%S | Second as a zero-padded decimal number.
+ | \%-S | Second as a decimal number.
+ | \%p | Locale’s equivalent of either AM or PM.
+ | |
+ | \%\% | A \% character.
+
+ Note that the \<format\> has to be between double quotes.
+
+ In case the \<date_time\> is specified it has to have the following representation:
+ - optional `date` where `date` is:
+ - 4 digits for the year
+ - a minus sign
+ - one or 2 digits for the month
+ - a minus sign
+ - one or 2 digits for the day
+ - optional `time` where `time` is:
+ - whitespace
+ - one or 2 digits for the hours
+ - a colon sign
+ - one or 2 digits for the minutes
+ - when the format contains \%S or \%-S
+ - a colon sign
+ - 2 digits for the seconds
+ .
+ in case the \<date_time\> is not specified the current date and time are used.
+
+ Here is an example:
+ \code
+ - \showdate "%A %d-%m-%Y" 2015-3-14
+ - \showdate "%a %d-%m-%y" 2015-3-14
+ - \showdate "%-m.%d%y" 2015-3-14
+ - \showdate "%A %d-%m-%Y %H:%M:%S" 2015-3-14 03:04:15
+ - \showdate "%A %d-%m-%Y %H:%M" 2015-3-14 03:04
+ \endcode
+ In case `OUTPUT_LANGUAGE=english` this results in:
+ - Saturday 14-03-2015
+ - Sat 14-03-15
+ - 3.1415
+ - Saturday 14-03-15 03:04:15
+ - Saturday 14-03-15 03:04
+ .
+ In case `OUTPUT_LANGUAGE=dutch` this results in:
+ - zaterdag 14-03-15
+ - za 14-03-2015
+ - 3.1415
+ - zaterdag 14-03-15 03:04:15
+ - zaterdag 14-03-15 03:04
+ .
+<hr>
\section cmddeprecated \\deprecated { description }
\addindex \\deprecated
\b Note:
environment variables (like \$(HOME) ) are resolved inside a
- \LaTeX-only block.
+ \LaTeX\-only block.
\sa sections \ref cmdrtfonly "\\rtfonly",
\ref cmdxmlonly "\\xmlonly",
.TP
Use doxygen to compare the used configuration file with the template configuration file
.RS 0
- without replacing the environment variables
+ without replacing the environment variables or CMake type replacement variables
.RE
.IP
doxygen \fB\-x_noenv\fR [configFile]
}
div.contents {
+ margin-top: 0px;
margin-bottom: 10px;
padding: 12px;
margin-left: auto;
</ul>
\warning When using a custom header you are responsible
for the proper inclusion of any scripts and style sheets that doxygen
- needs, which is dependent on the configuration options and may changes
+ needs, which is dependent on the configuration options and may change
when upgrading to a new doxygen release.
\note
sequences. Doxygen supports the subset of emoji characters as used by GitHub (based on the list
https://api.github.com/emojis).
An emoji is created using the \ref cmdemoji "\\emoji" command.
-For example `\emoji smile` (or `\emoji :smile:`) both produce \emoji smile.
+For example `\emoji smile` or `\emoji :smile:` both produce \emoji smile.
\section emojirep Representation
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
*/
/*! \page htmlcmds HTML Commands
+\section htmltagcmds HTML tag commands
+
Here is a list of all HTML commands that may be used inside the
documentation. Note that although these HTML tags are translated to the
-proper commands for output formats other than HTML, all attributes
-of a HTML tag are passed on to the HTML output only
+proper commands for output formats other than HTML, all attributes
+of a HTML tag are passed on to the HTML output only
(the \c HREF and \c NAME attributes for the \c A tag are the only exception).
-<ul>
-<li><tt>\anchor htmltag_A_HREF \addindex "\<A HREF=\"...\"\>"\<A HREF="..."\></tt> Starts a hyperlink
- (if supported by the output format).
-<li><tt>\anchor htmltag_A_ID \addindex "\<A ID=\"...\"\>"\<A ID="..."\></tt> Starts a named anchor
- (if supported by the output format).
-<li><tt>\anchor htmltag_A_NAME \addindex "\<A NAME=\"...\"\>"\<A NAME="..."\></tt> Starts a named anchor
- (if supported by the output format).
-<li><tt>\anchor htmltag_endA \addindex "\</A\>"\</A\></tt> Ends a link or anchor
-<li><tt>\anchor htmltag_B \addindex "\<B\>"\<B\></tt> Starts a piece of text displayed in a bold font.
-<li><tt>\anchor htmltag_endB \addindex "\</B\>"\</B\></tt> Ends a \ref htmltag_B "\<B\>" section.
-<li><tt>\anchor htmltag_BLOCKQUOTE \addindex "\<BLOCKQUOTE\>"\<BLOCKQUOTE\></tt> Starts a quotation block.
-<li><tt>\anchor htmltag_endBLOCKQUOTE \addindex "\</BLOCKQUOTE\>"\</BLOCKQUOTE\></tt> Ends the quotation block.
-<li><tt>\anchor htmltag_BR \addindex "\<BR\>"\<BR\></tt> Forces a line break.
-<li><tt>\anchor htmltag_CENTER \addindex "\<CENTER\>"\<CENTER\></tt> starts a section of centered text.
-<li><tt>\anchor htmltag_endCENTER \addindex "\</CENTER\>"\</CENTER\></tt> ends a section of centered text.
-<li><tt>\anchor htmltag_CAPTION \addindex "\<CAPTION\>"\<CAPTION\></tt> Starts a caption. Use within a table only.
-<li><tt>\anchor htmltag_endCAPTION \addindex "\</CAPTION\>"\</CAPTION\></tt> Ends a caption. Use within a table only.
-<li><tt>\anchor htmltag_CITE \addindex "\<CITE\>"\<CITE\></tt> Starts a section of text displayed in a font specific for citations.
-<li><tt>\anchor htmltag_endCITE \addindex "\</CITE\>"\</CITE\></tt> Ends a \ref htmltag_CITE "\<CITE\>" section.
-<li><tt>\anchor htmltag_CODE \addindex "\<CODE\>"\<CODE\></tt> Starts a piece of text displayed in a typewriter font.
- Note that only for C# code, this command is equivalent to
- \ref cmdcode "\\code" (see \ref xmltag_code "\<code\>").
-<li><tt>\anchor htmltag_endCODE \addindex "\</CODE\>"\</CODE\></tt> Ends a \ref htmltag_CODE "\<CODE\>" section.
+<table class="markdownTable">
+<tr class="markdownTableHead"><th class="markdownTableHeadLeft">HTML Command</th><th class="markdownTableHeadLeft">Description</th></tr>
+<tr><td valign="top"><tt>\anchor htmltag_A_HREF \addindex "\<A HREF=\"...\"\>"\<A HREF="..."\></tt></td><td valign="top">Starts a hyperlink
+ (if supported by the output format).</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_A_ID \addindex "\<A ID=\"...\"\>"\<A ID="..."\></tt></td><td valign="top">Starts a named anchor
+ (if supported by the output format).</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_A_NAME \addindex "\<A NAME=\"...\"\>"\<A NAME="..."\></tt></td><td valign="top">Starts a named anchor
+ (if supported by the output format).</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endA \addindex "\</A\>"\</A\></tt></td><td valign="top">Ends a link or anchor</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_B \addindex "\<B\>"\<B\></tt></td><td valign="top">Starts a piece of text displayed in a bold font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endB \addindex "\</B\>"\</B\></tt></td><td valign="top">Ends a \ref htmltag_B "\<B\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_BLOCKQUOTE \addindex "\<BLOCKQUOTE\>"\<BLOCKQUOTE\></tt></td><td valign="top">Starts a quotation block.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endBLOCKQUOTE \addindex "\</BLOCKQUOTE\>"\</BLOCKQUOTE\></tt></td><td valign="top">Ends the quotation block.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_BR \addindex "\<BR\>"\<BR\></tt></td><td valign="top">Forces a line break.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_CENTER \addindex "\<CENTER\>"\<CENTER\></tt></td><td valign="top">starts a section of centered text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endCENTER \addindex "\</CENTER\>"\</CENTER\></tt></td><td valign="top">ends a section of centered text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_CAPTION \addindex "\<CAPTION\>"\<CAPTION\></tt></td><td valign="top">Starts a caption. Use within a table only.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endCAPTION \addindex "\</CAPTION\>"\</CAPTION\></tt></td><td valign="top">Ends a caption. Use within a table only.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_CITE \addindex "\<CITE\>"\<CITE\></tt></td><td valign="top">Starts a section of text displayed in a font specific for citations.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endCITE \addindex "\</CITE\>"\</CITE\></tt></td><td valign="top">Ends a \ref htmltag_CITE "\<CITE\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_CODE \addindex "\<CODE\>"\<CODE\></tt></td><td valign="top">Starts a piece of text displayed in a typewriter font.</td></tr>
Note that only for C# code, this command is equivalent to
- \ref cmdendcode "\\endcode" (see \ref xmltag_code "\<code\>").
-<li><tt>\anchor htmltag_DD \addindex "\<DD\>"\<DD\></tt> Starts an item description.
-<li><tt>\anchor htmltag_endDD \addindex "\</DD\>"\</DD\></tt> Ends an item description.
-<li><tt>\anchor htmltag_DEL \addindex "\<DEL\>"\<DEL\></tt> Starts a section of deleted text, typically shown strike through text.
-<li><tt>\anchor htmltag_endDEL \addindex "\</DEL\>"\</DEL\></tt> Ends a section of deleted text.
-<li><tt>\anchor htmltag_DETAILS \addindex "\<DETAILS\>"\<DETAILS\></tt> Starts a section of detailed text that the user can open and close (in HTML output))
-<li><tt>\anchor htmltag_endDETAILS \addindex "\</DETAILS\>"\</DETAILS\></tt> Ends a section of detailed text.
-<li><tt>\anchor htmltag_DFN \addindex "\<DFN\>"\<DFN\></tt> Starts a piece of text displayed in a typewriter font.
-<li><tt>\anchor htmltag_endDFN \addindex "\</DFN\>"\</DFN\></tt> Ends a \ref htmltag_DFN "\<DFN\>" section.
-<li><tt>\anchor htmltag_DIV \addindex "\<DIV\>"\<DIV></tt> Starts a section with a specific style (HTML only)
-<li><tt>\anchor htmltag_endDIV \addindex "\</DIV\>"\</DIV></tt> Ends a section with a specific style (HTML only)
-<li><tt>\anchor htmltag_DL \addindex "\<DL\>"\<DL\></tt> Starts a description list.
-<li><tt>\anchor htmltag_endDL \addindex "\</DL\>"\</DL\></tt> Ends a description list.
-<li><tt>\anchor htmltag_DT \addindex "\<DT\>"\<DT\></tt> Starts an item title.
-<li><tt>\anchor htmltag_endDT \addindex "\</DT\>"\</DT\></tt> Ends an item title.
-<li><tt>\anchor htmltag_EM \addindex "\<EM\>"\<EM\></tt> Starts a piece of text displayed in an italic font.
-<li><tt>\anchor htmltag_endEM \addindex "\</EM\>"\</EM\></tt> Ends a \ref htmltag_EM "\<EM\>" section.
-<li><tt>\anchor htmltag_HR \addindex "\<HR\>"\<HR\></tt> Writes a horizontal ruler.
-<li><tt>\anchor htmltag_H1 \addindex "\<H1\>"\<H1\></tt> Starts an unnumbered section.
-<li><tt>\anchor htmltag_endH1 \addindex "\</H1\>"\</H1\></tt> Ends an unnumbered section.
-<li><tt>\anchor htmltag_H2 \addindex "\<H2\>"\<H2\></tt> Starts an unnumbered subsection.
-<li><tt>\anchor htmltag_endH2 \addindex "\</H2\>"\</H2\></tt> Ends an unnumbered subsection.
-<li><tt>\anchor htmltag_H3 \addindex "\<H3\>"\<H3\></tt> Starts an unnumbered subsubsection.
-<li><tt>\anchor htmltag_endH3 \addindex "\</H3\>"\</H3\></tt> Ends an unnumbered subsubsection.
-<li><tt>\anchor htmltag_H4 \addindex "\<H4\>"\<H4\></tt> Starts an unnumbered subsubsection.
-<li><tt>\anchor htmltag_endH4 \addindex "\</H4\>"\</H4\></tt> Ends an unnumbered subsubsection.
-<li><tt>\anchor htmltag_H5 \addindex "\<H5\>"\<H5\></tt> Starts an unnumbered subsubsection.
-<li><tt>\anchor htmltag_endH5 \addindex "\</H5\>"\</H5\></tt> Ends an unnumbered subsubsection.
-<li><tt>\anchor htmltag_H6 \addindex "\<H6\>"\<H6\></tt> Starts an unnumbered subsubsection.
-<li><tt>\anchor htmltag_endH6 \addindex "\</H6\>"\</H6\></tt> Ends an unnumbered subsubsection.
-<li><tt>\anchor htmltag_I \addindex "\<I\>"\<I\></tt> Starts a piece of text displayed in an italic font.
-<li><tt>\anchor htmltag_endI \addindex "\</I\>"\</I\></tt> Ends a \ref htmltag_I "\<I\>" section.
-<li><tt>\anchor htmltag_IMG \addindex "\<IMG SRC=\"...\"\>"\<IMG SRC="..." ...\></tt> This command is written with its attributes to the HTML output only. The SRC attribute is mandatory.
-<li><tt>\anchor htmltag_INS \addindex "\<INS\>"\<INS\></tt> Starts a section of inserted text, typically shown as underlined text.
-<li><tt>\anchor htmltag_endINS \addindex "\</INS\>"\</INS\></tt> Ends a section of inserted text.
-<li><tt>\anchor htmltag_LI \addindex "\<LI\>"\<LI\></tt> Starts a new list item.
-<li><tt>\anchor htmltag_endLI \addindex "\</LI\>"\</LI\></tt> Ends a list item.
-<li><tt>\anchor htmltag_OL \addindex "\<OL\>"\<OL\></tt> Starts a numbered item list.
-<li><tt>\anchor htmltag_endOL \addindex "\</OL\>"\</OL\></tt> Ends a numbered item list.
-<li><tt>\anchor htmltag_P \addindex "\<P\>"\<P\></tt> Starts a new paragraph.
-<li><tt>\anchor htmltag_endP \addindex "\</P\>"\</P\></tt> Ends a paragraph.
-<li><tt>\anchor htmltag_PRE \addindex "\<PRE\>"\<PRE\></tt> Starts a preformatted fragment.
-<li><tt>\anchor htmltag_endPRE \addindex "\</PRE\>"\</PRE\></tt> Ends a preformatted fragment.
-<li><tt>\anchor htmltag_SMALL \addindex "\<SMALL\>"\<SMALL\></tt> Starts a section of text displayed in a smaller font.
-<li><tt>\anchor htmltag_endSMALL \addindex "\</SMALL\>"\</SMALL\></tt> Ends a \ref htmltag_SMALL "\<SMALL\>" section.
-<li><tt>\anchor htmltag_SPAN \addindex "\<SPAN\>"\<SPAN></tt> Starts an inline text fragment with a specific style (HTML only)
-<li><tt>\anchor htmltag_endSPAN \addindex "\</SPAN\>"\</SPAN></tt> Ends an inline text fragment with a specific style (HTML only)
-<li><tt>\anchor htmltag_S \addindex "\<S\>"\<S\></tt> Starts a section of strike through text.
-<li><tt>\anchor htmltag_endS \addindex "\</S\>"\</S\></tt> Ends a section of strike through text.
-<li><tt>\anchor htmltag_STRIKE \addindex "\<STRIKE\>"\<STRIKE\></tt> Starts a section of strike through text.
-<li><tt>\anchor htmltag_endSTRIKE \addindex "\</STRIKE\>"\</STRIKE\></tt> Ends a section of strike through text.
-<li><tt>\anchor htmltag_STRONG \addindex "\<STRONG\>"\<STRONG\></tt> Starts a section of bold text.
-<li><tt>\anchor htmltag_endSTRONG \addindex "\</STRONG\>"\</STRONG\></tt> Ends a section of bold text.
-<li><tt>\anchor htmltag_SUB \addindex "\<SUB\>"\<SUB\></tt> Starts a piece of text displayed in subscript.
-<li><tt>\anchor htmltag_endSUB \addindex "\</SUB\>"\</SUB\></tt> Ends a \ref htmltag_SUB "\<SUB\>" section.
-<li><tt>\anchor htmltag_SUP \addindex "\<SUP\>"\<SUP\></tt> Starts a piece of text displayed in superscript.
-<li><tt>\anchor htmltag_endSUP \addindex "\</SUP\>"\</SUP\></tt> Ends a \ref htmltag_SUP "\<SUP\>" section.
-<li><tt>\anchor htmltag_TABLE \addindex "\<TABLE\>"\<TABLE\></tt> starts a table.
-<li><tt>\anchor htmltag_endTABLE \addindex "\</TABLE\>"\</TABLE\></tt> ends a table.
-<li><tt>\anchor htmltag_TD \addindex "\<TD\>"\<TD\></tt> Starts a new table data element.
-<li><tt>\anchor htmltag_endTD \addindex "\</TD\>"\</TD\></tt> Ends a table data element.
-<li><tt>\anchor htmltag_TH \addindex "\<TH\>"\<TH\></tt> Starts a new table header.
-<li><tt>\anchor htmltag_endTH \addindex "\</TH\>"\</TH\></tt> Ends a table header.
-<li><tt>\anchor htmltag_TR \addindex "\<TR\>"\<TR\></tt> Starts a new table row.
-<li><tt>\anchor htmltag_endTR \addindex "\</TR\>"\</TR\></tt> Ends a table row.
-<li><tt>\anchor htmltag_TT \addindex "\<TT\>"\<TT\></tt> Starts a piece of text displayed in a typewriter font.
-<li><tt>\anchor htmltag_endTT \addindex "\</TT\>"\</TT\></tt> Ends a \ref htmltag_TT "\<TT\>" section.
-<li><tt>\anchor htmltag_KBD \addindex "\<KBD\>"\<KBD\></tt> Starts a piece of text displayed in a typewriter font.
-<li><tt>\anchor htmltag_endKBD \addindex "\</KBD\>"\</KBD\></tt> Ends a \ref htmltag_KBD "\<KBD\>" section.
-<li><tt>\anchor htmltag_U \addindex "\<U\>"\<U\></tt> Starts a section of underlined text.
-<li><tt>\anchor htmltag_endU \addindex "\</U\>"\</U\></tt> Ends a section of underlined text.
-<li><tt>\anchor htmltag_UL \addindex "\<UL\>"\<UL\></tt> Starts an unnumbered item list.
-<li><tt>\anchor htmltag_endUL \addindex "\</UL\>"\</UL\></tt> Ends an unnumbered item list.
-<li><tt>\anchor htmltag_VAR \addindex "\<VAR\>"\<VAR\></tt> Starts a piece of text displayed in an italic font.
-<li><tt>\anchor htmltag_endVAR \addindex "\</VAR\>"\</VAR\></tt> Ends a \ref htmltag_VAR "\<VAR\>" section.
-</ul>
-
-The special HTML4 character entities.<br>
-The list of entities with their descriptions has been taken from <a href="http://www.w3.org/TR/html4/sgml/entities.html">Character entity references in HTML 4</a>.
-( Portions © International Organization for Standardization 1986
- Permission to copy in any form is granted for use with
- conforming SGML systems and applications as defined in
- ISO 8879, provided this notice is included in all copies.)
-<ul>
-<li><tt>\ </tt>` ` no-break space = non-breaking space:
-<li><tt>\¡</tt>` ` inverted exclamation mark: ¡
-<li><tt>\¢</tt>` ` cent sign: ¢
-<li><tt>\£</tt>` ` pound sign: £
-<li><tt>\¤</tt>` ` currency sign: ¤
-<li><tt>\¥</tt>` ` yen sign = yuan sign: ¥
-<li><tt>\¦</tt>` ` broken bar = broken vertical bar: ¦
-<li><tt>\§</tt>` ` section sign: §
-<li><tt>\¨</tt>` ` diaeresis = spacing diaeresis: ¨
-<li><tt>\©</tt>` ` copyright sign: ©
-<li><tt>\ª</tt>` ` feminine ordinal indicator: ª
-<li><tt>\«</tt>` ` left-pointing double angle quotation mark = left pointing guillemet: «
-<li><tt>\¬</tt>` ` not sign: ¬
-<li><tt>\­</tt>` ` soft hyphen = discretionary hyphen: ­
-<li><tt>\®</tt>` ` registered sign = registered trade mark sign: ®
-<li><tt>\¯</tt>` ` macron = spacing macron = overline = APL overbar: ¯
-<li><tt>\°</tt>` ` degree sign: °
-<li><tt>\±</tt>` ` plus-minus sign = plus-or-minus sign: ±
-<li><tt>\²</tt>` ` superscript two = superscript digit two = squared: ²
-<li><tt>\³</tt>` ` superscript three = superscript digit three = cubed: ³
-<li><tt>\´</tt>` ` acute accent = spacing acute: ´
-<li><tt>\µ</tt>` ` micro sign: µ
-<li><tt>\¶</tt>` ` pilcrow sign = paragraph sign: ¶
-<li><tt>\·</tt>` ` middle dot = Georgian comma = Greek middle dot: ·
-<li><tt>\¸</tt>` ` cedilla = spacing cedilla: ¸
-<li><tt>\¹</tt>` ` superscript one = superscript digit one: ¹
-<li><tt>\º</tt>` ` masculine ordinal indicator: º
-<li><tt>\»</tt>` ` right-pointing double angle quotation mark = right pointing guillemet: »
-<li><tt>\¼</tt>` ` vulgar fraction one quarter = fraction one quarter: ¼
-<li><tt>\½</tt>` ` vulgar fraction one half = fraction one half: ½
-<li><tt>\¾</tt>` ` vulgar fraction three quarters = fraction three quarters: ¾
-<li><tt>\¿</tt>` ` inverted question mark = turned question mark: ¿
-<li><tt>\À</tt>` ` latin capital letter A with grave = latin capital letter A grave: À
-<li><tt>\Á</tt>` ` latin capital letter A with acute: Á
-<li><tt>\Â</tt>` ` latin capital letter A with circumflex: Â
-<li><tt>\Ã</tt>` ` latin capital letter A with tilde: Ã
-<li><tt>\Ä</tt>` ` latin capital letter A with diaeresis: Ä
-<li><tt>\Å</tt>` ` latin capital letter A with ring above = latin capital letter A ring: Å
-<li><tt>\Æ</tt>` ` latin capital letter AE = latin capital ligature AE: Æ
-<li><tt>\Ç</tt>` ` latin capital letter C with cedilla: Ç
-<li><tt>\È</tt>` ` latin capital letter E with grave: È
-<li><tt>\É</tt>` ` latin capital letter E with acute: É
-<li><tt>\Ê</tt>` ` latin capital letter E with circumflex: Ê
-<li><tt>\Ë</tt>` ` latin capital letter E with diaeresis: Ë
-<li><tt>\Ì</tt>` ` latin capital letter I with grave: Ì
-<li><tt>\Í</tt>` ` latin capital letter I with acute: Í
-<li><tt>\Î</tt>` ` latin capital letter I with circumflex: Î
-<li><tt>\Ï</tt>` ` latin capital letter I with diaeresis: Ï
-<li><tt>\Ð</tt>` ` latin capital letter ETH: Ð
-<li><tt>\Ñ</tt>` ` latin capital letter N with tilde: Ñ
-<li><tt>\Ò</tt>` ` latin capital letter O with grave: Ò
-<li><tt>\Ó</tt>` ` latin capital letter O with acute: Ó
-<li><tt>\Ô</tt>` ` latin capital letter O with circumflex: Ô
-<li><tt>\Õ</tt>` ` latin capital letter O with tilde: Õ
-<li><tt>\Ö</tt>` ` latin capital letter O with diaeresis: Ö
-<li><tt>\×</tt>` ` multiplication sign: ×
-<li><tt>\Ø</tt>` ` latin capital letter O with stroke = latin capital letter O slash: Ø
-<li><tt>\Ù</tt>` ` latin capital letter U with grave: Ù
-<li><tt>\Ú</tt>` ` latin capital letter U with acute: Ú
-<li><tt>\Û</tt>` ` latin capital letter U with circumflex: Û
-<li><tt>\Ü</tt>` ` latin capital letter U with diaeresis: Ü
-<li><tt>\Ý</tt>` ` latin capital letter Y with acute: Ý
-<li><tt>\Þ</tt>` ` latin capital letter THORN: Þ
-<li><tt>\ß</tt>` ` latin small letter sharp s = ess-zed: ß
-<li><tt>\à</tt>` ` latin small letter a with grave = latin small letter a grave: à
-<li><tt>\á</tt>` ` latin small letter a with acute: á
-<li><tt>\â</tt>` ` latin small letter a with circumflex: â
-<li><tt>\ã</tt>` ` latin small letter a with tilde: ã
-<li><tt>\ä</tt>` ` latin small letter a with diaeresis: ä
-<li><tt>\å</tt>` ` latin small letter a with ring above = latin small letter a ring: å
-<li><tt>\æ</tt>` ` latin small letter ae = latin small ligature ae: æ
-<li><tt>\ç</tt>` ` latin small letter c with cedilla: ç
-<li><tt>\è</tt>` ` latin small letter e with grave: è
-<li><tt>\é</tt>` ` latin small letter e with acute: é
-<li><tt>\ê</tt>` ` latin small letter e with circumflex: ê
-<li><tt>\ë</tt>` ` latin small letter e with diaeresis: ë
-<li><tt>\ì</tt>` ` latin small letter i with grave: ì
-<li><tt>\í</tt>` ` latin small letter i with acute: í
-<li><tt>\î</tt>` ` latin small letter i with circumflex: î
-<li><tt>\ï</tt>` ` latin small letter i with diaeresis: ï
-<li><tt>\ð</tt>` ` latin small letter eth: ð
-<li><tt>\ñ</tt>` ` latin small letter n with tilde: ñ
-<li><tt>\ò</tt>` ` latin small letter o with grave: ò
-<li><tt>\ó</tt>` ` latin small letter o with acute: ó
-<li><tt>\ô</tt>` ` latin small letter o with circumflex: ô
-<li><tt>\õ</tt>` ` latin small letter o with tilde: õ
-<li><tt>\ö</tt>` ` latin small letter o with diaeresis: ö
-<li><tt>\÷</tt>` ` division sign: ÷
-<li><tt>\ø</tt>` ` latin small letter o with stroke, = latin small letter o slash: ø
-<li><tt>\ù</tt>` ` latin small letter u with grave: ù
-<li><tt>\ú</tt>` ` latin small letter u with acute: ú
-<li><tt>\û</tt>` ` latin small letter u with circumflex: û
-<li><tt>\ü</tt>` ` latin small letter u with diaeresis: ü
-<li><tt>\ý</tt>` ` latin small letter y with acute: ý
-<li><tt>\þ</tt>` ` latin small letter thorn: þ
-<li><tt>\ÿ</tt>` ` latin small letter y with diaeresis: ÿ
-<li><tt>\ƒ</tt>` ` latin small f with hook = function = florin: ƒ
-<li><tt>\Α</tt>` ` greek capital letter alpha: Α
-<li><tt>\Β</tt>` ` greek capital letter beta: Β
-<li><tt>\Γ</tt>` ` greek capital letter gamma: Γ
-<li><tt>\Δ</tt>` ` greek capital letter delta: Δ
-<li><tt>\Ε</tt>` ` greek capital letter epsilon: Ε
-<li><tt>\Ζ</tt>` ` greek capital letter zeta: Ζ
-<li><tt>\Η</tt>` ` greek capital letter eta: Η
-<li><tt>\Θ</tt>` ` greek capital letter theta: Θ
-<li><tt>\Ι</tt>` ` greek capital letter iota: Ι
-<li><tt>\Κ</tt>` ` greek capital letter kappa: Κ
-<li><tt>\Λ</tt>` ` greek capital letter lambda: Λ
-<li><tt>\Μ</tt>` ` greek capital letter mu: Μ
-<li><tt>\Ν</tt>` ` greek capital letter nu: Ν
-<li><tt>\Ξ</tt>` ` greek capital letter xi: Ξ
-<li><tt>\Ο</tt>` ` greek capital letter omicron: Ο
-<li><tt>\Π</tt>` ` greek capital letter pi: Π
-<li><tt>\Ρ</tt>` ` greek capital letter rho: Ρ
-<li><tt>\Σ</tt>` ` greek capital letter sigma: Σ
-<li><tt>\Τ</tt>` ` greek capital letter tau: Τ
-<li><tt>\Υ</tt>` ` greek capital letter upsilon: Υ
-<li><tt>\Φ</tt>` ` greek capital letter phi: Φ
-<li><tt>\Χ</tt>` ` greek capital letter chi: Χ
-<li><tt>\Ψ</tt>` ` greek capital letter psi: Ψ
-<li><tt>\Ω</tt>` ` greek capital letter omega: Ω
-<li><tt>\α</tt>` ` greek small letter alpha: α
-<li><tt>\β</tt>` ` greek small letter beta: β
-<li><tt>\γ</tt>` ` greek small letter gamma: γ
-<li><tt>\δ</tt>` ` greek small letter delta: δ
-<li><tt>\ε</tt>` ` greek small letter epsilon: ε
-<li><tt>\ζ</tt>` ` greek small letter zeta: ζ
-<li><tt>\η</tt>` ` greek small letter eta: η
-<li><tt>\θ</tt>` ` greek small letter theta: θ
-<li><tt>\ι</tt>` ` greek small letter iota: ι
-<li><tt>\κ</tt>` ` greek small letter kappa: κ
-<li><tt>\λ</tt>` ` greek small letter lambda: λ
-<li><tt>\μ</tt>` ` greek small letter mu: μ
-<li><tt>\ν</tt>` ` greek small letter nu: ν
-<li><tt>\ξ</tt>` ` greek small letter xi: ξ
-<li><tt>\ο</tt>` ` greek small letter omicron: ο
-<li><tt>\π</tt>` ` greek small letter pi: π
-<li><tt>\ρ</tt>` ` greek small letter rho: ρ
-<li><tt>\ς</tt>` ` greek small letter final sigma: ς
-<li><tt>\σ</tt>` ` greek small letter sigma: σ
-<li><tt>\τ</tt>` ` greek small letter tau: τ
-<li><tt>\υ</tt>` ` greek small letter upsilon: υ
-<li><tt>\φ</tt>` ` greek small letter phi: φ
-<li><tt>\χ</tt>` ` greek small letter chi: χ
-<li><tt>\ψ</tt>` ` greek small letter psi: ψ
-<li><tt>\ω</tt>` ` greek small letter omega: ω
-<li><tt>\ϑ</tt> greek small letter theta symbol: ϑ
-<li><tt>\ϒ</tt>` ` greek upsilon with hook symbol: ϒ
-<li><tt>\ϖ</tt>` ` greek pi symbol: ϖ
-<li><tt>\•</tt>` ` bullet = black small circle: •
-<li><tt>\…</tt>` ` horizontal ellipsis = three dot leader: …
-<li><tt>\′</tt>` ` prime = minutes = feet: ′
-<li><tt>\″</tt>` ` double prime = seconds = inches: ″
-<li><tt>\‾</tt>` ` overline = spacing overscore: ‾
-<li><tt>\⁄</tt>` ` fraction slash: ⁄
-<li><tt>\℘</tt>` ` script capital P = power set = Weierstrass p: ℘
-<li><tt>\ℑ</tt>` ` blackletter capital I = imaginary part: ℑ
-<li><tt>\ℜ</tt>` ` blackletter capital R = real part symbol: ℜ
-<li><tt>\™</tt>` ` trade mark sign: ™
-<li><tt>\ℵ</tt>` ` alef symbol = first transfinite cardinal: ℵ
-<li><tt>\←</tt>` ` leftwards arrow: ←
-<li><tt>\↑</tt>` ` upwards arrow: ↑
-<li><tt>\→</tt>` ` rightwards arrow: →
-<li><tt>\↓</tt>` ` downwards arrow: ↓
-<li><tt>\↔</tt>` ` left right arrow: ↔
-<li><tt>\↵</tt>` ` downwards arrow with corner leftwards = carriage return: ↵
-<li><tt>\⇐</tt>` ` leftwards double arrow: ⇐
-<li><tt>\⇑</tt>` ` upwards double arrow: ⇑
-<li><tt>\⇒</tt>` ` rightwards double arrow: ⇒
-<li><tt>\⇓</tt>` ` downwards double arrow: ⇓
-<li><tt>\⇔</tt>` ` left right double arrow: ⇔
-<li><tt>\∀</tt>` ` for all: ∀
-<li><tt>\∂</tt>` ` partial differential: ∂
-<li><tt>\∃</tt>` ` there exists: ∃
-<li><tt>\∅</tt>` ` empty set = null set = diameter: ∅
-<li><tt>\∇</tt>` ` nabla = backward difference: ∇
-<li><tt>\∈</tt>` ` element of: ∈
-<li><tt>\∉</tt>` ` not an element of: ∉
-<li><tt>\∋</tt>` ` contains as member: ∋
-<li><tt>\∏</tt>` ` n-ary product = product sign: ∏
-<li><tt>\∑</tt>` ` n-ary summation: ∑
-<li><tt>\−</tt>` ` minus sign: −
-<li><tt>\∗</tt>` ` asterisk operator: ∗
-<li><tt>\√</tt>` ` square root = radical sign: √
-<li><tt>\∝</tt>` ` proportional to: ∝
-<li><tt>\∞</tt>` ` infinity: ∞
-<li><tt>\∠</tt>` ` angle: ∠
-<li><tt>\∧</tt>` ` logical and = wedge: ∧
-<li><tt>\∨</tt>` ` logical or = vee: ∨
-<li><tt>\∩</tt>` ` intersection = cap: ∩
-<li><tt>\∪</tt>` ` union = cup: ∪
-<li><tt>\∫</tt>` ` integral: ∫
-<li><tt>\∴</tt>` ` therefore: ∴
-<li><tt>\∼</tt>` ` tilde operator = varies with = similar to: ∼
-<li><tt>\≅</tt>` ` approximately equal to: ≅
-<li><tt>\≈</tt>` ` almost equal to = asymptotic to: ≈
-<li><tt>\≠</tt>` ` not equal to: ≠
-<li><tt>\≡</tt>` ` identical to: ≡
-<li><tt>\≤</tt>` ` less-than or equal to: ≤
-<li><tt>\≥</tt>` ` greater-than or equal to: ≥
-<li><tt>\⊂</tt>` ` subset of: ⊂
-<li><tt>\⊃</tt>` ` superset of: ⊃
-<li><tt>\⊄</tt>` ` not a subset of: ⊄
-<li><tt>\⊆</tt>` ` subset of or equal to: ⊆
-<li><tt>\⊇</tt>` ` superset of or equal to: ⊇
-<li><tt>\⊕</tt>` ` circled plus = direct sum: ⊕
-<li><tt>\⊗</tt>` ` circled times = vector product: ⊗
-<li><tt>\⊥</tt>` ` up tack = orthogonal to = perpendicular: ⊥
-<li><tt>\⋅</tt>` ` dot operator: ⋅
-<li><tt>\⌈</tt>` ` left ceiling = apl upstile: ⌈
-<li><tt>\⌉</tt>` ` right ceiling: ⌉
-<li><tt>\⌊</tt>` ` left floor = apl downstile: ⌊
-<li><tt>\⌋</tt>` ` right floor: ⌋
-<li><tt>\⟨</tt>` ` left-pointing angle bracket = bra: ⟨
-<li><tt>\⟩</tt>` ` right-pointing angle bracket = ket: ⟩
-<li><tt>\◊</tt>` ` lozenge: ◊
-<li><tt>\♠</tt>` ` black spade suit: ♠
-<li><tt>\♣</tt>` ` black club suit = shamrock: ♣
-<li><tt>\♥</tt>` ` black heart suit = valentine: ♥
-<li><tt>\♦</tt>` ` black diamond suit: ♦
-<li><tt>\"</tt>` ` quotation mark = APL quote: "
-<li><tt>\&</tt>` ` ampersand: &
-<li><tt>\<</tt>` ` less-than sign: <
-<li><tt>\></tt>` ` greater-than sign: >
-<li><tt>\Œ</tt>` ` latin capital ligature OE: Œ
-<li><tt>\œ</tt>` ` latin small ligature oe: œ
-<li><tt>\Š</tt>` ` latin capital letter S with caron: Š
-<li><tt>\š</tt>` ` latin small letter s with caron: š
-<li><tt>\Ÿ</tt>` ` latin capital letter Y with diaeresis: Ÿ
-<li><tt>\ˆ</tt>` ` modifier letter circumflex accent: ˆ
-<li><tt>\˜</tt>` ` small tilde: ˜
-<li><tt>\ </tt>` ` en space:  
-<li><tt>\ </tt>` ` em space:  
-<li><tt>\ </tt>` ` thin space:  
-<li><tt>\‌</tt>` ` zero width non-joiner: ‌
-<li><tt>\‍</tt>` ` zero width joiner: ‍
-<li><tt>\‎</tt>` ` left-to-right mark: ‎
-<li><tt>\‏</tt>` ` right-to-left mark: ‏
-<li><tt>\–</tt>` ` en dash: –
-<li><tt>\—</tt>` ` em dash: —
-<li><tt>\‘</tt>` ` left single quotation mark: ‘
-<li><tt>\’</tt>` ` right single quotation mark: ’
-<li><tt>\‚</tt>` ` single low-9 quotation mark: ‚
-<li><tt>\“</tt>` ` left double quotation mark: “
-<li><tt>\”</tt>` ` right double quotation mark: ”
-<li><tt>\„</tt>` ` double low-9 quotation mark: „
-<li><tt>\†</tt>` ` dagger: †
-<li><tt>\‡</tt>` ` double dagger: ‡
-<li><tt>\‰</tt>` ` per mille sign: ‰
-<li><tt>\‹</tt>` ` single left-pointing angle quotation mark: ‹
-<li><tt>\›</tt>` ` single right-pointing angle quotation mark: ›
-<li><tt>\€</tt>` ` euro sign: €
-</ul>
-Doxygen extensions:
-<ul>
-<li><tt>\&tm;</tt>` ` trade mark sign: &tm;
-<li><tt>\'</tt>` ` apostrophe: '
-</ul>
+ \ref cmdcode "\\code" (see \ref xmltag_code "\<code\>").</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endCODE \addindex "\</CODE\>"\</CODE\></tt></td><td valign="top">Ends a \ref htmltag_CODE "\<CODE\>" section.
+ Note that only for C# code, this command is equivalent to
+ \ref cmdendcode "\\endcode" (see \ref xmltag_code "\<code\>").</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DD \addindex "\<DD\>"\<DD\></tt></td><td valign="top">Starts an item description.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDD \addindex "\</DD\>"\</DD\></tt></td><td valign="top">Ends an item description.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DEL \addindex "\<DEL\>"\<DEL\></tt></td><td valign="top">Starts a section of deleted text, typically shown strike through text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDEL \addindex "\</DEL\>"\</DEL\></tt></td><td valign="top">Ends a section of deleted text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DETAILS \addindex "\<DETAILS\>"\<DETAILS\></tt></td><td valign="top">Starts a section of detailed text that the user can open and close (in HTML output))</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDETAILS \addindex "\</DETAILS\>"\</DETAILS\></tt></td><td valign="top">Ends a section of detailed text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DFN \addindex "\<DFN\>"\<DFN\></tt></td><td valign="top">Starts a piece of text displayed in a typewriter font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDFN \addindex "\</DFN\>"\</DFN\></tt></td><td valign="top">Ends a \ref htmltag_DFN "\<DFN\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DIV \addindex "\<DIV\>"\<DIV></tt></td><td valign="top">Starts a section with a specific style (HTML only)</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDIV \addindex "\</DIV\>"\</DIV></tt></td><td valign="top">Ends a section with a specific style (HTML only)</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DL \addindex "\<DL\>"\<DL\></tt></td><td valign="top">Starts a description list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDL \addindex "\</DL\>"\</DL\></tt></td><td valign="top">Ends a description list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_DT \addindex "\<DT\>"\<DT\></tt></td><td valign="top">Starts an item title.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endDT \addindex "\</DT\>"\</DT\></tt></td><td valign="top">Ends an item title.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_EM \addindex "\<EM\>"\<EM\></tt></td><td valign="top">Starts a piece of text displayed in an italic font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endEM \addindex "\</EM\>"\</EM\></tt></td><td valign="top">Ends a \ref htmltag_EM "\<EM\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_HR \addindex "\<HR\>"\<HR\></tt></td><td valign="top">Writes a horizontal ruler.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H1 \addindex "\<H1\>"\<H1\></tt></td><td valign="top">Starts an unnumbered section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH1 \addindex "\</H1\>"\</H1\></tt></td><td valign="top">Ends an unnumbered section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H2 \addindex "\<H2\>"\<H2\></tt></td><td valign="top">Starts an unnumbered subsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH2 \addindex "\</H2\>"\</H2\></tt></td><td valign="top">Ends an unnumbered subsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H3 \addindex "\<H3\>"\<H3\></tt></td><td valign="top">Starts an unnumbered subsubsection.</td></tr></td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH3 \addindex "\</H3\>"\</H3\></tt></td><td valign="top">Ends an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H4 \addindex "\<H4\>"\<H4\></tt></td><td valign="top">Starts an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH4 \addindex "\</H4\>"\</H4\></tt></td><td valign="top">Ends an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H5 \addindex "\<H5\>"\<H5\></tt></td><td valign="top">Starts an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH5 \addindex "\</H5\>"\</H5\></tt></td><td valign="top">Ends an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_H6 \addindex "\<H6\>"\<H6\></tt></td><td valign="top">Starts an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endH6 \addindex "\</H6\>"\</H6\></tt></td><td valign="top">Ends an unnumbered subsubsection.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_I \addindex "\<I\>"\<I\></tt></td><td valign="top">Starts a piece of text displayed in an italic font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endI \addindex "\</I\>"\</I\></tt></td><td valign="top">Ends a \ref htmltag_I "\<I\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_IMG \addindex "\<IMG SRC=\"...\"\>"\<IMG SRC="..." ...\></tt></td><td valign="top">This command is written with its attributes to the HTML output only. The SRC attribute is mandatory.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_INS \addindex "\<INS\>"\<INS\></tt></td><td valign="top">Starts a section of inserted text, typically shown as underlined text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endINS \addindex "\</INS\>"\</INS\></tt></td><td valign="top">Ends a section of inserted text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_LI \addindex "\<LI\>"\<LI\></tt></td><td valign="top">Starts a new list item.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endLI \addindex "\</LI\>"\</LI\></tt></td><td valign="top">Ends a list item.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_OL \addindex "\<OL\>"\<OL\></tt></td><td valign="top">Starts a numbered item list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endOL \addindex "\</OL\>"\</OL\></tt></td><td valign="top">Ends a numbered item list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_P \addindex "\<P\>"\<P\></tt></td><td valign="top">Starts a new paragraph.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endP \addindex "\</P\>"\</P\></tt></td><td valign="top">Ends a paragraph.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_PRE \addindex "\<PRE\>"\<PRE\></tt></td><td valign="top">Starts a preformatted fragment.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endPRE \addindex "\</PRE\>"\</PRE\></tt></td><td valign="top">Ends a preformatted fragment.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_SMALL \addindex "\<SMALL\>"\<SMALL\></tt></td><td valign="top">Starts a section of text displayed in a smaller font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSMALL \addindex "\</SMALL\>"\</SMALL\></tt></td><td valign="top">Ends a \ref htmltag_SMALL "\<SMALL\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_SPAN \addindex "\<SPAN\>"\<SPAN></tt></td><td valign="top">Starts an inline text fragment with a specific style (HTML only)</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSPAN \addindex "\</SPAN\>"\</SPAN></tt></td><td valign="top">Ends an inline text fragment with a specific style (HTML only)</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_S \addindex "\<S\>"\<S\></tt></td><td valign="top">Starts a section of strike through text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endS \addindex "\</S\>"\</S\></tt></td><td valign="top">Ends a section of strike through text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_STRIKE \addindex "\<STRIKE\>"\<STRIKE\></tt></td><td valign="top">Starts a section of strike through text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSTRIKE \addindex "\</STRIKE\>"\</STRIKE\></tt></td><td valign="top">Ends a section of strike through text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_STRONG \addindex "\<STRONG\>"\<STRONG\></tt></td><td valign="top">Starts a section of bold text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSTRONG \addindex "\</STRONG\>"\</STRONG\></tt></td><td valign="top">Ends a section of bold text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_SUB \addindex "\<SUB\>"\<SUB\></tt></td><td valign="top">Starts a piece of text displayed in subscript.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSUB \addindex "\</SUB\>"\</SUB\></tt></td><td valign="top">Ends a \ref htmltag_SUB "\<SUB\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_SUP \addindex "\<SUP\>"\<SUP\></tt></td><td valign="top">Starts a piece of text displayed in superscript.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endSUP \addindex "\</SUP\>"\</SUP\></tt></td><td valign="top">Ends a \ref htmltag_SUP "\<SUP\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_TABLE \addindex "\<TABLE\>"\<TABLE\></tt></td><td valign="top">starts a table.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endTABLE \addindex "\</TABLE\>"\</TABLE\></tt></td><td valign="top">ends a table.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_TD \addindex "\<TD\>"\<TD\></tt></td><td valign="top">Starts a new table data element.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endTD \addindex "\</TD\>"\</TD\></tt></td><td valign="top">Ends a table data element.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_TH \addindex "\<TH\>"\<TH\></tt></td><td valign="top">Starts a new table header.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endTH \addindex "\</TH\>"\</TH\></tt></td><td valign="top">Ends a table header.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_TR \addindex "\<TR\>"\<TR\></tt></td><td valign="top">Starts a new table row.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endTR \addindex "\</TR\>"\</TR\></tt></td><td valign="top">Ends a table row.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_TT \addindex "\<TT\>"\<TT\></tt></td><td valign="top">Starts a piece of text displayed in a typewriter font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endTT \addindex "\</TT\>"\</TT\></tt></td><td valign="top">Ends a \ref htmltag_TT "\<TT\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_KBD \addindex "\<KBD\>"\<KBD\></tt></td><td valign="top">Starts a piece of text displayed in a typewriter font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endKBD \addindex "\</KBD\>"\</KBD\></tt></td><td valign="top">Ends a \ref htmltag_KBD "\<KBD\>" section.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_U \addindex "\<U\>"\<U\></tt></td><td valign="top">Starts a section of underlined text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endU \addindex "\</U\>"\</U\></tt></td><td valign="top">Ends a section of underlined text.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_UL \addindex "\<UL\>"\<UL\></tt></td><td valign="top">Starts an unnumbered item list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endUL \addindex "\</UL\>"\</UL\></tt></td><td valign="top">Ends an unnumbered item list.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_VAR \addindex "\<VAR\>"\<VAR\></tt></td><td valign="top">Starts a piece of text displayed in an italic font.</td></tr>
+<tr><td valign="top"><tt>\anchor htmltag_endVAR \addindex "\</VAR\>"\</VAR\></tt></td><td valign="top">Ends a \ref htmltag_VAR "\<VAR\>" section.</td></tr>
+</table>
Finally, to put invisible comments inside comment blocks, HTML style
comments can be used:
The part `<!-- ... -->` will not be shown in the main documentation.
+
+\section htmlentities HTML4 character entities
+
+The list of special HTML4 character entities with their descriptions has been taken from: <a href="http://www.w3.org/TR/html4/sgml/entities.html">Character entity references in HTML 4</a>.
+( Portions © International Organization for Standardization 1986
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.)
+| Entity | | Description |
+| :----- | :----- | :---------- |
+| <tt>\ </tt> | | no-break space = non-breaking space |
+| <tt>\¡</tt> | ¡ | inverted exclamation mark |
+| <tt>\¢</tt> | ¢ | cent sign |
+| <tt>\£</tt> | £ | pound sign |
+| <tt>\¤</tt> | ¤ | currency sign |
+| <tt>\¥</tt> | ¥ | yen sign = yuan sign |
+| <tt>\¦</tt> | ¦ | broken bar = broken vertical bar |
+| <tt>\§</tt> | § | section sign |
+| <tt>\¨</tt> | ¨ | diaeresis = spacing diaeresis |
+| <tt>\©</tt> | © | copyright sign |
+| <tt>\ª</tt> | ª | feminine ordinal indicator |
+| <tt>\«</tt> | « | left-pointing double angle quotation mark = left pointing guillemet |
+| <tt>\¬</tt> | ¬ | not sign |
+| <tt>\­</tt> | ­ | soft hyphen = discretionary hyphen |
+| <tt>\®</tt> | ® | registered sign = registered trade mark sign |
+| <tt>\¯</tt> | ¯ | macron = spacing macron = overline = APL overbar |
+| <tt>\°</tt> | ° | degree sign |
+| <tt>\±</tt> | ± | plus-minus sign = plus-or-minus sign |
+| <tt>\²</tt> | ² | superscript two = superscript digit two = squared |
+| <tt>\³</tt> | ³ | superscript three = superscript digit three = cubed |
+| <tt>\´</tt> | ´ | acute accent = spacing acute |
+| <tt>\µ</tt> | µ | micro sign |
+| <tt>\¶</tt> | ¶ | pilcrow sign = paragraph sign |
+| <tt>\·</tt> | · | middle dot = Georgian comma = Greek middle dot |
+| <tt>\¸</tt> | ¸ | cedilla = spacing cedilla |
+| <tt>\¹</tt> | ¹ | superscript one = superscript digit one |
+| <tt>\º</tt> | º | masculine ordinal indicator |
+| <tt>\»</tt> | » | right-pointing double angle quotation mark = right pointing guillemet |
+| <tt>\¼</tt> | ¼ | vulgar fraction one quarter = fraction one quarter |
+| <tt>\½</tt> | ½ | vulgar fraction one half = fraction one half |
+| <tt>\¾</tt> | ¾ | vulgar fraction three quarters = fraction three quarters |
+| <tt>\¿</tt> | ¿ | inverted question mark = turned question mark |
+| <tt>\À</tt> | À | latin capital letter A with grave = latin capital letter A grave |
+| <tt>\Á</tt> | Á | latin capital letter A with acute |
+| <tt>\Â</tt> | Â | latin capital letter A with circumflex |
+| <tt>\Ã</tt> | Ã | latin capital letter A with tilde |
+| <tt>\Ä</tt> | Ä | latin capital letter A with diaeresis |
+| <tt>\Å</tt> | Å | latin capital letter A with ring above = latin capital letter A ring |
+| <tt>\Æ</tt> | Æ | latin capital letter AE = latin capital ligature AE |
+| <tt>\Ç</tt> | Ç | latin capital letter C with cedilla |
+| <tt>\È</tt> | È | latin capital letter E with grave |
+| <tt>\É</tt> | É | latin capital letter E with acute |
+| <tt>\Ê</tt> | Ê | latin capital letter E with circumflex |
+| <tt>\Ë</tt> | Ë | latin capital letter E with diaeresis |
+| <tt>\Ì</tt> | Ì | latin capital letter I with grave |
+| <tt>\Í</tt> | Í | latin capital letter I with acute |
+| <tt>\Î</tt> | Î | latin capital letter I with circumflex |
+| <tt>\Ï</tt> | Ï | latin capital letter I with diaeresis |
+| <tt>\Ð</tt> | Ð | latin capital letter ETH |
+| <tt>\Ñ</tt> | Ñ | latin capital letter N with tilde |
+| <tt>\Ò</tt> | Ò | latin capital letter O with grave |
+| <tt>\Ó</tt> | Ó | latin capital letter O with acute |
+| <tt>\Ô</tt> | Ô | latin capital letter O with circumflex |
+| <tt>\Õ</tt> | Õ | latin capital letter O with tilde |
+| <tt>\Ö</tt> | Ö | latin capital letter O with diaeresis |
+| <tt>\×</tt> | × | multiplication sign |
+| <tt>\Ø</tt> | Ø | latin capital letter O with stroke = latin capital letter O slash |
+| <tt>\Ù</tt> | Ù | latin capital letter U with grave |
+| <tt>\Ú</tt> | Ú | latin capital letter U with acute |
+| <tt>\Û</tt> | Û | latin capital letter U with circumflex |
+| <tt>\Ü</tt> | Ü | latin capital letter U with diaeresis |
+| <tt>\Ý</tt> | Ý | latin capital letter Y with acute |
+| <tt>\Þ</tt> | Þ | latin capital letter THORN |
+| <tt>\ß</tt> | ß | latin small letter sharp s = ess-zed |
+| <tt>\à</tt> | à | latin small letter a with grave = latin small letter a grave |
+| <tt>\á</tt> | á | latin small letter a with acute |
+| <tt>\â</tt> | â | latin small letter a with circumflex |
+| <tt>\ã</tt> | ã | latin small letter a with tilde |
+| <tt>\ä</tt> | ä | latin small letter a with diaeresis |
+| <tt>\å</tt> | å | latin small letter a with ring above = latin small letter a ring |
+| <tt>\æ</tt> | æ | latin small letter ae = latin small ligature ae |
+| <tt>\ç</tt> | ç | latin small letter c with cedilla |
+| <tt>\è</tt> | è | latin small letter e with grave |
+| <tt>\é</tt> | é | latin small letter e with acute |
+| <tt>\ê</tt> | ê | latin small letter e with circumflex |
+| <tt>\ë</tt> | ë | latin small letter e with diaeresis |
+| <tt>\ì</tt> | ì | latin small letter i with grave |
+| <tt>\í</tt> | í | latin small letter i with acute |
+| <tt>\î</tt> | î | latin small letter i with circumflex |
+| <tt>\ï</tt> | ï | latin small letter i with diaeresis |
+| <tt>\ð</tt> | ð | latin small letter eth |
+| <tt>\ñ</tt> | ñ | latin small letter n with tilde |
+| <tt>\ò</tt> | ò | latin small letter o with grave |
+| <tt>\ó</tt> | ó | latin small letter o with acute |
+| <tt>\ô</tt> | ô | latin small letter o with circumflex |
+| <tt>\õ</tt> | õ | latin small letter o with tilde |
+| <tt>\ö</tt> | ö | latin small letter o with diaeresis |
+| <tt>\÷</tt> | ÷ | division sign |
+| <tt>\ø</tt> | ø | latin small letter o with stroke, = latin small letter o slash |
+| <tt>\ù</tt> | ù | latin small letter u with grave |
+| <tt>\ú</tt> | ú | latin small letter u with acute |
+| <tt>\û</tt> | û | latin small letter u with circumflex |
+| <tt>\ü</tt> | ü | latin small letter u with diaeresis |
+| <tt>\ý</tt> | ý | latin small letter y with acute |
+| <tt>\þ</tt> | þ | latin small letter thorn |
+| <tt>\ÿ</tt> | ÿ | latin small letter y with diaeresis |
+| <tt>\ƒ</tt> | ƒ | latin small f with hook = function = florin |
+| <tt>\Α</tt> | Α | greek capital letter alpha |
+| <tt>\Β</tt> | Β | greek capital letter beta |
+| <tt>\Γ</tt> | Γ | greek capital letter gamma |
+| <tt>\Δ</tt> | Δ | greek capital letter delta |
+| <tt>\Ε</tt> | Ε | greek capital letter epsilon |
+| <tt>\Ζ</tt> | Ζ | greek capital letter zeta |
+| <tt>\Η</tt> | Η | greek capital letter eta |
+| <tt>\Θ</tt> | Θ | greek capital letter theta |
+| <tt>\Ι</tt> | Ι | greek capital letter iota |
+| <tt>\Κ</tt> | Κ | greek capital letter kappa |
+| <tt>\Λ</tt> | Λ | greek capital letter lambda |
+| <tt>\Μ</tt> | Μ | greek capital letter mu |
+| <tt>\Ν</tt> | Ν | greek capital letter nu |
+| <tt>\Ξ</tt> | Ξ | greek capital letter xi |
+| <tt>\Ο</tt> | Ο | greek capital letter omicron |
+| <tt>\Π</tt> | Π | greek capital letter pi |
+| <tt>\Ρ</tt> | Ρ | greek capital letter rho |
+| <tt>\Σ</tt> | Σ | greek capital letter sigma |
+| <tt>\Τ</tt> | Τ | greek capital letter tau |
+| <tt>\Υ</tt> | Υ | greek capital letter upsilon |
+| <tt>\Φ</tt> | Φ | greek capital letter phi |
+| <tt>\Χ</tt> | Χ | greek capital letter chi |
+| <tt>\Ψ</tt> | Ψ | greek capital letter psi |
+| <tt>\Ω</tt> | Ω | greek capital letter omega |
+| <tt>\α</tt> | α | greek small letter alpha |
+| <tt>\β</tt> | β | greek small letter beta |
+| <tt>\γ</tt> | γ | greek small letter gamma |
+| <tt>\δ</tt> | δ | greek small letter delta |
+| <tt>\ε</tt> | ε | greek small letter epsilon |
+| <tt>\ζ</tt> | ζ | greek small letter zeta |
+| <tt>\η</tt> | η | greek small letter eta |
+| <tt>\θ</tt> | θ | greek small letter theta |
+| <tt>\ι</tt> | ι | greek small letter iota |
+| <tt>\κ</tt> | κ | greek small letter kappa |
+| <tt>\λ</tt> | λ | greek small letter lambda |
+| <tt>\μ</tt> | μ | greek small letter mu |
+| <tt>\ν</tt> | ν | greek small letter nu |
+| <tt>\ξ</tt> | ξ | greek small letter xi |
+| <tt>\ο</tt> | ο | greek small letter omicron |
+| <tt>\π</tt> | π | greek small letter pi |
+| <tt>\ρ</tt> | ρ | greek small letter rho |
+| <tt>\ς</tt> | ς | greek small letter final sigma |
+| <tt>\σ</tt> | σ | greek small letter sigma |
+| <tt>\τ</tt> | τ | greek small letter tau |
+| <tt>\υ</tt> | υ | greek small letter upsilon |
+| <tt>\φ</tt> | φ | greek small letter phi |
+| <tt>\χ</tt> | χ | greek small letter chi |
+| <tt>\ψ</tt> | ψ | greek small letter psi |
+| <tt>\ω</tt> | ω | greek small letter omega |
+| <tt>\ϑ</tt> | ϑ | greek small letter theta symbol |
+| <tt>\ϒ</tt> | ϒ | greek upsilon with hook symbol |
+| <tt>\ϖ</tt> | ϖ | greek pi symbol |
+| <tt>\•</tt> | • | bullet = black small circle |
+| <tt>\…</tt> | … | horizontal ellipsis = three dot leader |
+| <tt>\′</tt> | ′ | prime = minutes = feet |
+| <tt>\″</tt> | ″ | double prime = seconds = inches |
+| <tt>\‾</tt> | ‾ | overline = spacing overscore |
+| <tt>\⁄</tt> | ⁄ | fraction slash |
+| <tt>\℘</tt> | ℘ | script capital P = power set = Weierstrass p |
+| <tt>\ℑ</tt> | ℑ | blackletter capital I = imaginary part |
+| <tt>\ℜ</tt> | ℜ | blackletter capital R = real part symbol |
+| <tt>\™</tt> | ™ | trade mark sign |
+| <tt>\ℵ</tt> | ℵ | alef symbol = first transfinite cardinal |
+| <tt>\←</tt> | ← | leftwards arrow |
+| <tt>\↑</tt> | ↑ | upwards arrow |
+| <tt>\→</tt> | → | rightwards arrow |
+| <tt>\↓</tt> | ↓ | downwards arrow |
+| <tt>\↔</tt> | ↔ | left right arrow |
+| <tt>\↵</tt> | ↵ | downwards arrow with corner leftwards = carriage return |
+| <tt>\⇐</tt> | ⇐ | leftwards double arrow |
+| <tt>\⇑</tt> | ⇑ | upwards double arrow |
+| <tt>\⇒</tt> | ⇒ | rightwards double arrow |
+| <tt>\⇓</tt> | ⇓ | downwards double arrow |
+| <tt>\⇔</tt> | ⇔ | left right double arrow |
+| <tt>\∀</tt> | ∀ | for all |
+| <tt>\∂</tt> | ∂ | partial differential |
+| <tt>\∃</tt> | ∃ | there exists |
+| <tt>\∅</tt> | ∅ | empty set = null set = diameter |
+| <tt>\∇</tt> | ∇ | nabla = backward difference |
+| <tt>\∈</tt> | ∈ | element of |
+| <tt>\∉</tt> | ∉ | not an element of |
+| <tt>\∋</tt> | ∋ | contains as member |
+| <tt>\∏</tt> | ∏ | n-ary product = product sign |
+| <tt>\∑</tt> | ∑ | n-ary summation |
+| <tt>\−</tt> | − | minus sign |
+| <tt>\∗</tt> | ∗ | asterisk operator |
+| <tt>\√</tt> | √ | square root = radical sign |
+| <tt>\∝</tt> | ∝ | proportional to |
+| <tt>\∞</tt> | ∞ | infinity |
+| <tt>\∠</tt> | ∠ | angle |
+| <tt>\∧</tt> | ∧ | logical and = wedge |
+| <tt>\∨</tt> | ∨ | logical or = vee |
+| <tt>\∩</tt> | ∩ | intersection = cap |
+| <tt>\∪</tt> | ∪ | union = cup |
+| <tt>\∫</tt> | ∫ | integral |
+| <tt>\∴</tt> | ∴ | therefore |
+| <tt>\∼</tt> | ∼ | tilde operator = varies with = similar to |
+| <tt>\≅</tt> | ≅ | approximately equal to |
+| <tt>\≈</tt> | ≈ | almost equal to = asymptotic to |
+| <tt>\≠</tt> | ≠ | not equal to |
+| <tt>\≡</tt> | ≡ | identical to |
+| <tt>\≤</tt> | ≤ | less-than or equal to |
+| <tt>\≥</tt> | ≥ | greater-than or equal to |
+| <tt>\⊂</tt> | ⊂ | subset of |
+| <tt>\⊃</tt> | ⊃ | superset of |
+| <tt>\⊄</tt> | ⊄ | not a subset of |
+| <tt>\⊆</tt> | ⊆ | subset of or equal to |
+| <tt>\⊇</tt> | ⊇ | superset of or equal to |
+| <tt>\⊕</tt> | ⊕ | circled plus = direct sum |
+| <tt>\⊗</tt> | ⊗ | circled times = vector product |
+| <tt>\⊥</tt> | ⊥ | up tack = orthogonal to = perpendicular |
+| <tt>\⋅</tt> | ⋅ | dot operator |
+| <tt>\⌈</tt> | ⌈ | left ceiling = apl upstile |
+| <tt>\⌉</tt> | ⌉ | right ceiling |
+| <tt>\⌊</tt> | ⌊ | left floor = apl downstile |
+| <tt>\⌋</tt> | ⌋ | right floor |
+| <tt>\⟨</tt> | ⟨ | left-pointing angle bracket = bra |
+| <tt>\⟩</tt> | ⟩ | right-pointing angle bracket = ket |
+| <tt>\◊</tt> | ◊ | lozenge |
+| <tt>\♠</tt> | ♠ | black spade suit |
+| <tt>\♣</tt> | ♣ | black club suit = shamrock |
+| <tt>\♥</tt> | ♥ | black heart suit = valentine |
+| <tt>\♦</tt> | ♦ | black diamond suit |
+| <tt>\"</tt> | " | quotation mark = APL quote |
+| <tt>\&</tt> | & | ampersand |
+| <tt>\<</tt> | < | less-than sign |
+| <tt>\></tt> | > | greater-than sign |
+| <tt>\Œ</tt> | Œ | latin capital ligature OE |
+| <tt>\œ</tt> | œ | latin small ligature oe |
+| <tt>\Š</tt> | Š | latin capital letter S with caron |
+| <tt>\š</tt> | š | latin small letter s with caron |
+| <tt>\Ÿ</tt> | Ÿ | latin capital letter Y with diaeresis |
+| <tt>\ˆ</tt> | ˆ | modifier letter circumflex accent |
+| <tt>\˜</tt> | ˜ | small tilde |
+| <tt>\ </tt> |   | en space |
+| <tt>\ </tt> |   | em space |
+| <tt>\ </tt> |   | thin space |
+| <tt>\‌</tt> | ‌ | zero width non-joiner |
+| <tt>\‍</tt> | ‍ | zero width joiner |
+| <tt>\‎</tt> | ‎ | left-to-right mark |
+| <tt>\‏</tt> | ‏ | right-to-left mark |
+| <tt>\–</tt> | – | en dash |
+| <tt>\—</tt> | — | em dash |
+| <tt>\‘</tt> | ‘ | left single quotation mark |
+| <tt>\’</tt> | ’ | right single quotation mark |
+| <tt>\‚</tt> | ‚ | single low-9 quotation mark |
+| <tt>\“</tt> | “ | left double quotation mark |
+| <tt>\”</tt> | ” | right double quotation mark |
+| <tt>\„</tt> | „ | double low-9 quotation mark |
+| <tt>\†</tt> | † | dagger |
+| <tt>\‡</tt> | ‡ | double dagger |
+| <tt>\‰</tt> | ‰ | per mille sign |
+| <tt>\‹</tt> | ‹ | single left-pointing angle quotation mark |
+| <tt>\›</tt> | › | single right-pointing angle quotation mark |
+| <tt>\€</tt> | € | euro sign |
+| **Doxygen extensions:** |||
+| <tt>\&tm;</tt> | &tm; | trade mark sign |
+| <tt>\'</tt> | ' | apostrophe|
+
\htmlonly
<br/>
Go to the <a href="xmlcmds.html">next</a> section or return to the
Doxygen is the de facto standard tool for generating documentation from
annotated C++ sources, but it also supports other popular programming
languages such as C, Objective-C, C#, PHP, Java, Python, IDL
-(Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, and to some extent D.
+(Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, and to some extent D.
Doxygen also supports the hardware description language VHDL.
Doxygen can help you in three ways:
\addindex license
\addindex GPL
-Copyright © 1997-2019 by
+Copyright © 1997-\showdate "%Y" by
<a href="mailto:doxygen@gmail.com">Dimitri van Heesch</a>.<p>
Permission to use, copy, modify, and distribute this software and its
\endverbatim
<p>Now, in <code>setTranslator()</code> add
\verbatim
- case OUTPUT_LANGUAGE_t::YourLanguage: theTranslator = new TranslatorYourLanguage; break;
+case OUTPUT_LANGUAGE_t::YourLanguage: theTranslator = new TranslatorYourLanguage; break;
\endverbatim
<li>Edit <code>doxygen/src/translator_xx.h</code>:
<ul>
<dd>Generated from the \LaTeX output by
running <code>make ps</code> in the output directory.
For the best results \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS" should be set to \c NO.
-<dt><b>PDF</b>\htmlonly \endhtmlonly
+<dt><b>PDF</b>
<dd>Generated from the \LaTeX output by
running <code>make pdf</code> in the output directory.
To improve the PDF output, you typically would want to enable the use
As you can see doxygen's preprocessor is quite powerful, but if you want
even more flexibility you can always write an input filter and specify it
-after the \ref cfg_input_filter "INPUT_FILTER" tag.
+after the \ref cfg_input_filter "INPUT_FILTER" tag or
+the \ref cfg_filter_patterns "FILTER_PATTERNS" tag
+(or the \ref cfg_filter_source_patterns "FILTER_SOURCE_PATTERNS" tag).<br>
+If you are unsure what the effect of the filter will be
+you can run doxygen as follows: `doxygen -d filteroutput`.
If you are unsure what the effect of doxygen's preprocessing will be
you can run doxygen as follows:
Note that the end tags (like `</td>`) are left out in the example above.
This is allowed, and in the HTML output doxygen will add the end tags again.
+\latexonly \newpage \endlatexonly
The output will look as follows:
<table>
prototype=="virtual QCString latexFont()" or\r
prototype=="virtual QCString latexFontenc()" or\r
prototype=="virtual bool needsPunctuation()")):\r
- self.prototypeDic[uniPrototype] = prototype\r
+ self.prototypeDic[uniPrototype] = prototype\r
status = 2 # body consumed\r
methodId = None # outside of any method\r
elif tokenId == 'lcurly':\r
# be set.\r
if not self.note and self.status == '' and \\r
(self.translateMeFlag or self.txtMAX_DOT_GRAPH_HEIGHT_flag):\r
- self.note = ''\r
- if self.translateMeFlag:\r
- self.note += 'The "%s" found in a comment.' % self.translateMeText\r
- if self.note != '':\r
- self.note += '\n\t\t'\r
- if self.txtMAX_DOT_GRAPH_HEIGHT_flag:\r
- self.note += 'The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()'\r
+ self.note = ''\r
+ if self.translateMeFlag:\r
+ self.note += 'The "%s" found in a comment.' % self.translateMeText\r
+ if self.note != '':\r
+ self.note += '\n\t\t'\r
+ if self.txtMAX_DOT_GRAPH_HEIGHT_flag:\r
+ self.note += 'The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()'\r
\r
# If everything seems OK, but there are obsolete methods, set\r
# the note to clean-up source. This note will be used only when\r
if classId in self.__translDic:\r
lang = self.__translDic[classId].langReadable\r
mm = 'see the %s language' % lang\r
- ee = ' '\r
+ ee = ' '\r
\r
if not mm and obj.classId in self.__maintainersDic:\r
# Build a string of names separated by the HTML break element.\r
Here is the list of tags supported by doxygen:
-<ul>
-<li><tt>\anchor xmltag_c \addindex "\<c\>" \<c\></tt> Identifies inline text that should be rendered as a
- piece of code. Similar to using <tt>\<tt\></tt>text<tt>\</tt\></tt>.
-<li><tt>\anchor xmltag_code \addindex "\<code\>" <code\></tt> Set one or more lines of source code or program output.
+<table class="markdownTable" valign="top">
+<tr class="markdownTableHead"><th class="markdownTableHeadLeft">XML Command</th><th class="markdownTableHeadLeft">Description</th></tr>
+<tr><td valign="top"><tt>\anchor xmltag_c \addindex "\<c\>" \<c\></tt></td><td valign="top">Identifies inline text that should be rendered as a
+ piece of code. Similar to using <tt>\<tt\></tt>text<tt>\</tt\></tt>.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_code \addindex "\<code\>" <code\></tt></td><td valign="top">Set one or more lines of source code or program output.
Note that this command behaves like \ref cmdcode "\\code" ... \ref cmdendcode "\\endcode"
for C# code, but it behaves like the HTML equivalent
- \ref htmltag_CODE "\<CODE\>"...\ref htmltag_endCODE "\</CODE\>" for other languages.
-<li><tt>\anchor xmltag_description \addindex "\<description\>" \<description\></tt> Part of a \ref xmltag_list "\<list\>" command, describes an item.
-<li><tt>\anchor xmltag_example \addindex "\<example\>" \<example\></tt> Marks a block of text as an example, ignored by doxygen.
-<li><tt>\anchor xmltag_exception \addindex "\<exception\>" \<exception cref="member"\></tt> Identifies the exception a
- method can throw.
-<li><tt>\anchor xmltag_include \addindex "\<include\>" \<include\></tt> Can be used to import a piece of XML from an external
- file. Ignored by doxygen at the moment.
-<li><tt>\anchor xmltag_inheritdoc \addindex "\<inheritdoc\>" \<inheritdoc\></tt> Can be used to insert the documentation of a
+ \ref htmltag_CODE "\<CODE\>"...\ref htmltag_endCODE "\</CODE\>" for other languages.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_description \addindex "\<description\>" \<description\></tt></td><td valign="top">Part of a \ref xmltag_list "\<list\>" command, describes an item.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_example \addindex "\<example\>" \<example\></tt></td><td valign="top">Marks a block of text as an example, ignored by doxygen.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_exception \addindex "\<exception\>" \<exception cref="member"\></tt></td><td valign="top">Identifies the exception a
+ method can throw.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_include \addindex "\<include\>" \<include\></tt></td><td valign="top">Can be used to import a piece of XML from an external
+ file. Ignored by doxygen at the moment.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_inheritdoc \addindex "\<inheritdoc\>" \<inheritdoc\></tt></td><td valign="top">Can be used to insert the documentation of a
member of a base class into the documentation of a
- member of a derived class that reimplements it.
-<li><tt>\anchor xmltag_item \addindex "\<item\>" \<item\></tt> List item. Can only be used inside a \ref xmltag_list "\<list\>" context.
-
-<li><tt>\anchor xmltag_list \addindex "\<list\>" \<list type="type"\></tt> Starts a list, supported types are <tt>bullet</tt>
+ member of a derived class that reimplements it.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_item \addindex "\<item\>" \<item\></tt></td><td valign="top">List item. Can only be used inside a \ref xmltag_list "\<list\>" context.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_list \addindex "\<list\>" \<list type="type"\></tt></td><td valign="top">Starts a list, supported types are <tt>bullet</tt>
or <tt>number</tt> and <tt>table</tt>.
A list consists of a number of <tt>\<item\></tt> tags.
A list of type table, is a two column table which can have
- a header.
-<li><tt>\anchor xmltag_listheader \addindex "\<listheader\>" \<listheader\></tt> Starts the header of a list of type "table".
-<li><tt>\anchor xmltag_para \addindex "\<para\>" \<para\></tt> Identifies a paragraph of text.
-<li><tt>\anchor xmltag_param \addindex "\<param\>" \<param name="paramName"\></tt> Marks a piece of text as the documentation
+ a header.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_listheader \addindex "\<listheader\>" \<listheader\></tt></td><td valign="top">Starts the header of a list of type "table".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_para \addindex "\<para\>" \<para\></tt></td><td valign="top">Identifies a paragraph of text.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_param \addindex "\<param\>" \<param name="paramName"\></tt></td><td valign="top">Marks a piece of text as the documentation
for parameter "paramName". Similar to
- using \ref cmdparam "\\param".
-<li><tt>\anchor xmltag_paramref \addindex "\<paramref\>" \<paramref name="paramName"\></tt> Refers to a parameter with name
- "paramName". Similar to using \ref cmda "\\a".
-<li><tt>\anchor xmltag_permission \addindex "\<permission\>" \<permission\></tt> Identifies the security accessibility of a member.
- Ignored by doxygen.
-<li><tt>\anchor xmltag_remarks \addindex "\<remarks\>" \<remarks\></tt> Identifies the detailed description.
-<li><tt>\anchor xmltag_returns \addindex "\<returns\>" \<returns\></tt> Marks a piece of text as the return value of a
- function or method. Similar to using \ref cmdreturn "\\return".
-<li><tt>\anchor xmltag_see \addindex "\<see\>" \<see cref="member"\></tt> Refers to a member. Similar to \ref cmdref "\\ref".
-<li><tt>\anchor xmltag_seealso \addindex "\<seealso\>" \<seealso cref="member"\></tt> Starts a "See also" section referring
- to "member". Similar to using \ref cmdsa "\\sa" member.
-<li><tt>\anchor xmltag_summary \addindex "\<summary\>" \<summary\></tt>
+ using \ref cmdparam "\\param".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_paramref \addindex "\<paramref\>" \<paramref name="paramName"\></tt></td><td valign="top">Refers to a parameter with name
+ "paramName". Similar to using \ref cmda "\\a".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_permission \addindex "\<permission\>" \<permission\></tt></td><td valign="top">Identifies the security accessibility of a member.
+ Ignored by doxygen.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_remarks \addindex "\<remarks\>" \<remarks\></tt></td><td valign="top">Identifies the detailed description. </td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_returns \addindex "\<returns\>" \<returns\></tt></td><td valign="top">Marks a piece of text as the return value of a
+ function or method. Similar to using \ref cmdreturn "\\return".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_see \addindex "\<see\>" \<see cref="member"\></tt></td><td valign="top">Refers to a member. Similar to \ref cmdref "\\ref".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_seealso \addindex "\<seealso\>" \<seealso cref="member"\></tt></td><td valign="top">Starts a "See also" section referring
+ to "member". Similar to using \ref cmdsa "\\sa" member.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_summary \addindex "\<summary\>" \<summary\></tt></td><td valign="top">
In case this tag is used outside a \ref htmltag_DETAILS "\<DETAILS\>" tag this tag
identifies the brief description.
Similar to using \ref cmdbrief "\\brief".
In case this tag is used inside a \ref htmltag_DETAILS "\<DETAILS\>" tag this tag
- identifies the heading of the \ref htmltag_DETAILS "\<DETAILS\>" tag.
-<li><tt>\anchor xmltag_term \addindex "\<term\>" \<term\></tt> Part of a \ref xmltag_list "\<list\>" command.
-<li><tt>\anchor xmltag_typeparam \addindex "\<typeparam\>" \<typeparam name="paramName"\></tt> Marks a piece of text as the documentation
+ identifies the heading of the \ref htmltag_DETAILS "\<DETAILS\>" tag.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_term \addindex "\<term\>" \<term\></tt></td><td valign="top">Part of a \ref xmltag_list "\<list\>" command.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_typeparam \addindex "\<typeparam\>" \<typeparam name="paramName"\></tt></td><td valign="top">Marks a piece of text as the documentation
for type parameter "paramName". Similar to
- using \ref cmdparam "\\param".
-<li>\anchor xmltag_typeparamref \addindex "\<typeparamref\>"<tt>\<typeparamref name="paramName"\></tt> Refers to a parameter with name
- "paramName". Similar to using \ref cmda "\\a".
-<li><tt>\anchor xmltag_value \addindex "\<value\>" \<value\></tt> Identifies a property. Ignored by doxygen.
-<li><tt>\anchor xmltag_CDATA \addindex "\<![CDATA[...]]\>" \<![CDATA[...]]\></tt> The text inside this tag (on the ...) is handled as normal
+ using \ref cmdparam "\\param".</td></tr>
+<tr><td valign="top">\anchor xmltag_typeparamref \addindex "\<typeparamref\>"<tt>\<typeparamref name="paramName"\></tt></td><td valign="top">Refers to a parameter with name
+ "paramName". Similar to using \ref cmda "\\a".</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_value \addindex "\<value\>" \<value\></tt></td><td valign="top">Identifies a property. Ignored by doxygen.</td></tr>
+<tr><td valign="top"><tt>\anchor xmltag_CDATA \addindex "\<![CDATA[...]]\>" \<![CDATA[...]]\></tt></td><td valign="top">The text inside this tag (on the ...) is handled as normal
doxygen comment except for the XML special characters `<`, `>` and
- `&` that are used as if they were escaped.
-</ul>
+ `&` that are used as if they were escaped.</td></tr>
+</table>
Here is an example of a typical piece of code using some of the above commands:
set(DIAGRAM_EXAMPLE ${PROJECT_BINARY_DIR}/html/examples/diagrams/html/index.html)
endif()
+add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/examples/baseexample.cfg" "${PROJECT_BINARY_DIR}/examples/"
+ DEPENDS "${PROJECT_SOURCE_DIR}/examples/baseexample.cfg"
+ OUTPUT "${PROJECT_BINARY_DIR}/examples/baseexample.cfg"
+)
+set_source_files_properties("${PROJECT_BINARY_DIR}/examples/baseexample.cfg" PROPERTIES GENERATED 1)
+
foreach (f ${EXAMPLE_FILES})
add_custom_command(
COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/examples/${f}" "${PROJECT_BINARY_DIR}/examples/"
list(APPEND OUT_EXAMPLE_FILES "${PROJECT_BINARY_DIR}/examples/${f}")
endforeach()
+# name file extension dependency (optional)
+set(EXAMPLE_class class h)
+set(EXAMPLE_define define h)
+set(EXAMPLE_enum enum h)
+set(EXAMPLE_file file h)
+set(EXAMPLE_func func h)
+set(EXAMPLE_javadoc javadoc-banner h)
+set(EXAMPLE_structcmd structcmd h)
+set(EXAMPLE_afterdoc afterdoc h)
+set(EXAMPLE_relates relates cpp)
+set(EXAMPLE_author author cpp)
+set(EXAMPLE_par par cpp)
+set(EXAMPLE_overload overload cpp)
+set(EXAMPLE_example example cpp)
+set(EXAMPLE_include include cpp)
+set(EXAMPLE_qtstyle qtstyle cpp)
+set(EXAMPLE_jdstyle jdstyle cpp)
+set(EXAMPLE_autolink autolink cpp)
+set(EXAMPLE_restypedef restypedef cpp)
+set(EXAMPLE_tag tag cpp example)
+set(EXAMPLE_group group cpp)
+set(EXAMPLE_memgrp memgrp cpp)
+set(EXAMPLE_templ templ cpp)
+set(EXAMPLE_page page doc)
+set(EXAMPLE_docstring docstring py)
+set(EXAMPLE_pyexample pyexample py)
+set(EXAMPLE_manual manual c)
+set(EXAMPLE_mux mux vhdl)
+
set(BASIC_EXAMPLES
- class:h
- define:h
- enum:h
- file:h
- func:h
- javadoc-banner:h
- structcmd:h
- afterdoc:h
- relates:cpp
- author:cpp
- par:cpp
- overload:cpp
- example:cpp
- include:cpp
- qtstyle:cpp
- jdstyle:cpp
- autolink:cpp
- restypedef:cpp
- tag:cpp
- group:cpp
- memgrp:cpp
- templ:cpp
- page:doc
- docstring:py
- pyexample:py
- manual:c
- mux:vhdl
+ EXAMPLE_class EXAMPLE_define EXAMPLE_enum EXAMPLE_file EXAMPLE_func
+ EXAMPLE_javadoc EXAMPLE_structcmd EXAMPLE_afterdoc EXAMPLE_relates EXAMPLE_author
+ EXAMPLE_par EXAMPLE_overload EXAMPLE_example EXAMPLE_include EXAMPLE_qtstyle
+ EXAMPLE_jdstyle EXAMPLE_autolink EXAMPLE_restypedef EXAMPLE_tag EXAMPLE_group
+ EXAMPLE_memgrp EXAMPLE_templ EXAMPLE_page EXAMPLE_docstring EXAMPLE_pyexample
+ EXAMPLE_manual EXAMPLE_mux
)
foreach (f_inp ${BASIC_EXAMPLES})
- string(REGEX REPLACE ".*:" "" f_ext ${f_inp})
- string(REGEX REPLACE ":.*" "" f ${f_inp})
+ list(LENGTH ${f_inp} f_len)
+ list(GET ${f_inp} 0 f)
+ list(GET ${f_inp} 1 f_ext)
+ set(f_dep "")
+ if (${f_len} GREATER 2)
+ list(GET ${f_inp} 2 f_dep)
+ set(f_dep "${PROJECT_BINARY_DIR}/html/examples/${f_dep}/html/index.html")
+ endif()
add_custom_command(
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/html/examples/${f}
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/latex/examples/${f}
COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen ${f}.cfg
COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/latex/examples/${f}/latex/refman.tex > ${PROJECT_BINARY_DIR}/latex/examples/${f}/latex/refman_doc.tex
- DEPENDS doxygen ${f}.${f_ext} ${f}.cfg ${TOP}/examples/strip_example.py
+ DEPENDS doxygen ${f}.${f_ext} ${f}.cfg ${TOP}/examples/strip_example.py ${f_dep}
OUTPUT ${PROJECT_BINARY_DIR}/html/examples/${f}/html/index.html ${PROJECT_BINARY_DIR}/latex/examples/${f}/latex/refman_doc.tex
)
set(EXAMPLES_RES ${EXAMPLES_RES} "" ${PROJECT_BINARY_DIR}/html/examples/${f}/html/index.html)
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "AfterDocs"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/afterdoc/html
LATEX_OUTPUT = latex/examples/afterdoc/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = afterdoc.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Author Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/author/html
LATEX_OUTPUT = latex/examples/author/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = author.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Automatic link generation"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/autolink/html
LATEX_OUTPUT = latex/examples/autolink/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = autolink.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
--- /dev/null
+OUTPUT_DIRECTORY = ..
+CASE_SENSE_NAMES = NO
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
+LATEX_HIDE_INDICES = YES
+COMPACT_LATEX = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
+HTML_COLORSTYLE = LIGHT
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Class Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/class/html
LATEX_OUTPUT = latex/examples/class/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = class.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Define Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/define/html
LATEX_OUTPUT = latex/examples/define/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = define.h
STRIP_CODE_COMMENTS = NO
ENABLE_PREPROCESSING = YES
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Diagrams"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/diagrams/html
LATEX_OUTPUT = latex/examples/diagrams/latex
HAVE_DOT = YES
EXTRACT_ALL = YES
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
ENABLE_PREPROCESSING = YES
INPUT = .
STRIP_CODE_COMMENTS = NO
FILE_PATTERNS = diagrams_*.h
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Python"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/docstring/html
LATEX_OUTPUT = latex/examples/docstring/latex
EXTRACT_ALL = YES
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
OPTIMIZE_OUTPUT_JAVA = YES
INPUT = docstring.py
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Enum Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/enum/html
LATEX_OUTPUT = latex/examples/enum/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = enum.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Example Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/example/html
LATEX_OUTPUT = latex/examples/example/latex
GENERATE_TAGFILE = example.tag
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = example.cpp
EXAMPLE_PATH = example_test.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "File Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/file/html
LATEX_OUTPUT = latex/examples/file/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = file.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Fn Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/func/html
LATEX_OUTPUT = latex/examples/func/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = func.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Grouping"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/group/html
LATEX_OUTPUT = latex/examples/group/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = group.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Include Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/include/html
LATEX_OUTPUT = latex/examples/include/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = include.cpp
EXAMPLE_PATH = include_test.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Javadoc Banner"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/javadoc-banner/html
LATEX_OUTPUT = latex/examples/javadoc-banner/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = javadoc-banner.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
JAVADOC_BANNER = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
EXTRACT_ALL = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Javadoc Style"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/jdstyle/html
LATEX_OUTPUT = latex/examples/jdstyle/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = jdstyle.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Manual inheritance and membership"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/manual/html
LATEX_OUTPUT = latex/examples/manual/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = manual.c
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
TYPEDEF_HIDES_STRUCT = YES
INLINE_SOURCES = YES
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Member Grouping"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/memgrp/html
LATEX_OUTPUT = latex/examples/memgrp/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = memgrp.cpp
-QUIET = YES
DISTRIBUTE_GROUP_DOC = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = Mux
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/mux/html
LATEX_OUTPUT = latex/examples/mux/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = mux.vhdl
OPTIMIZE_OUTPUT_VHDL = YES
-QUIET = YES
INHERIT_DOCS = YES
EXTRACT_PRIVATE = YES
HIDE_SCOPE_NAMES = YES
INHERIT_DOCS = NO
-SEARCHENGINE = NO
ENABLE_PREPROCESSING = NO
EXTRACT_PACKAGE = YES
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Overloaded Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/overload/html
LATEX_OUTPUT = latex/examples/overload/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
SORT_MEMBER_DOCS = NO
INPUT = overload.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Page Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/page/html
LATEX_OUTPUT = latex/examples/page/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = page.doc
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Par Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/par/html
LATEX_OUTPUT = latex/examples/par/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = par.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Python"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/pyexample/html
LATEX_OUTPUT = latex/examples/pyexample/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
OPTIMIZE_OUTPUT_JAVA = YES
INPUT = pyexample.py
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Qt Style"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/qtstyle/html
LATEX_OUTPUT = latex/examples/qtstyle/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = qtstyle.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Relates Command"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/relates/html
LATEX_OUTPUT = latex/examples/relates/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = relates.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Resolving Typedefs"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/restypedef/html
LATEX_OUTPUT = latex/examples/restypedef/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = restypedef.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
do_print = False
for line in sys.stdin:
if line.startswith("%--- Begin generated contents ---"):
- do_print = True
+ do_print = True
elif line.startswith("%--- End generated contents ---"):
- do_print = False
+ do_print = False
elif do_print:
- sys.stdout.write(line)
+ sys.stdout.write(line)
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Structural commands"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/structcmd/html
LATEX_OUTPUT = latex/examples/structcmd/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = structcmd.h
STRIP_CODE_COMMENTS = NO
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Tag Files"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/tag/html
LATEX_OUTPUT = latex/examples/tag/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = tag.cpp
TAGFILES = example.tag=../../example/html
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
+@INCLUDE = baseexample.cfg
PROJECT_NAME = "Template Test"
-OUTPUT_DIRECTORY = ..
HTML_OUTPUT = html/examples/templ/html
LATEX_OUTPUT = latex/examples/templ/latex
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
INPUT = templ.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
-WARN_AS_ERROR = FAIL_ON_WARNINGS
JQUERY_VERSION = 3.6.0
-JQUERY_UI_VERSION = 1.12.1
+JQUERY_UI_VERSION = 1.13.2
SCROLL_VERSION = 2.1.2
POWERTIP_VERSION = 1.3.1
TOUCHPUNCH_VERSION = 0.2.3
Doxygen's jquery.js script is composed of minified versions of the following
packages:
- jquery 3.6.0: https://jquery.com/download/
-- jquery.ui 1.12.1: https://github.com/jquery/jquery-ui
+- jquery.ui 1.13.2: https://github.com/jquery/jquery-ui
modules required:
- jquery.ui.core all
- jquery.ui.interactions resizable
+++ /dev/null
-/*! jQuery UI - v1.12.1 - 2019-01-27
-* http://jqueryui.com
-* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/resizable.js, widgets/mouse.js
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}t.ui=t.ui||{},t.ui.version="1.12.1";var i=0,s=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,n,o=s.call(arguments,1),a=0,r=o.length;r>a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,m,g,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),x={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,m=_.offset,g=t.extend({},m),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),x[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?g.left+=p:"center"===n.at[0]&&(g.left+=p/2),"bottom"===n.at[1]?g.top+=f:"center"===n.at[1]&&(g.top+=f/2),u=e(x.at,p,f),g.left+=u[0],g.top+=u[1],this.each(function(){var s,r,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),k=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},g),T=e(x.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=T[0],D.top+=T[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:l,elemHeight:c,collisionPosition:s,collisionWidth:k,collisionHeight:C,offset:[u[0]+T[0],u[1]+T[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=m.left-D.left,i=e+p-l,s=m.top-D.top,r=s+f-c,u={target:{element:v,left:m.left,top:m.top,width:p,height:f},element:{element:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("<div>"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element
-},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});
\ No newline at end of file
--- /dev/null
+/*! jQuery UI - v1.13.2 - 2022-08-01
+* http://jqueryui.com
+* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/resizable.js, widgets/mouse.js
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(y){"use strict";y.ui=y.ui||{};y.ui.version="1.13.2";var n,i=0,h=Array.prototype.hasOwnProperty,a=Array.prototype.slice;y.cleanData=(n=y.cleanData,function(t){for(var e,i,s=0;null!=(i=t[s]);s++)(e=y._data(i,"events"))&&e.remove&&y(i).triggerHandler("remove");n(t)}),y.widget=function(t,i,e){var s,n,o,h={},a=t.split(".")[0],r=a+"-"+(t=t.split(".")[1]);return e||(e=i,i=y.Widget),Array.isArray(e)&&(e=y.extend.apply(null,[{}].concat(e))),y.expr.pseudos[r.toLowerCase()]=function(t){return!!y.data(t,r)},y[a]=y[a]||{},s=y[a][t],n=y[a][t]=function(t,e){if(!this||!this._createWidget)return new n(t,e);arguments.length&&this._createWidget(t,e)},y.extend(n,s,{version:e.version,_proto:y.extend({},e),_childConstructors:[]}),(o=new i).options=y.widget.extend({},o.options),y.each(e,function(e,s){function n(){return i.prototype[e].apply(this,arguments)}function o(t){return i.prototype[e].apply(this,t)}h[e]="function"==typeof s?function(){var t,e=this._super,i=this._superApply;return this._super=n,this._superApply=o,t=s.apply(this,arguments),this._super=e,this._superApply=i,t}:s}),n.prototype=y.widget.extend(o,{widgetEventPrefix:s&&o.widgetEventPrefix||t},h,{constructor:n,namespace:a,widgetName:t,widgetFullName:r}),s?(y.each(s._childConstructors,function(t,e){var i=e.prototype;y.widget(i.namespace+"."+i.widgetName,n,e._proto)}),delete s._childConstructors):i._childConstructors.push(n),y.widget.bridge(t,n),n},y.widget.extend=function(t){for(var e,i,s=a.call(arguments,1),n=0,o=s.length;n<o;n++)for(e in s[n])i=s[n][e],h.call(s[n],e)&&void 0!==i&&(y.isPlainObject(i)?t[e]=y.isPlainObject(t[e])?y.widget.extend({},t[e],i):y.widget.extend({},i):t[e]=i);return t},y.widget.bridge=function(o,e){var h=e.prototype.widgetFullName||o;y.fn[o]=function(i){var t="string"==typeof i,s=a.call(arguments,1),n=this;return t?this.length||"instance"!==i?this.each(function(){var t,e=y.data(this,h);return"instance"===i?(n=e,!1):e?"function"!=typeof e[i]||"_"===i.charAt(0)?y.error("no such method '"+i+"' for "+o+" widget instance"):(t=e[i].apply(e,s))!==e&&void 0!==t?(n=t&&t.jquery?n.pushStack(t.get()):t,!1):void 0:y.error("cannot call methods on "+o+" prior to initialization; attempted to call method '"+i+"'")}):n=void 0:(s.length&&(i=y.widget.extend.apply(null,[i].concat(s))),this.each(function(){var t=y.data(this,h);t?(t.option(i||{}),t._init&&t._init()):y.data(this,h,new e(i,this))})),n}},y.Widget=function(){},y.Widget._childConstructors=[],y.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n<i.length-1;n++)s[i[n]]=s[i[n]]||{},s=s[i[n]];if(t=i.pop(),1===arguments.length)return void 0===s[t]?null:s[t];s[t]=e}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=e}return this._setOptions(o),this},_setOptions:function(t){for(var e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(t){var e,i,s;for(e in t)s=this.classesElementLookup[e],t[e]!==this.options.classes[e]&&s&&s.length&&(i=y(s.get()),this._removeClass(s,e),i.addClass(this._classes({element:i,keys:e,classes:t,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(n){var o=[],h=this;function t(t,e){for(var i,s=0;s<t.length;s++)i=h.classesElementLookup[t[s]]||y(),i=n.add?(function(){var i=[];n.element.each(function(t,e){y.map(h.classesElementLookup,function(t){return t}).some(function(t){return t.is(e)})||i.push(e)}),h._on(y(i),{remove:"_untrackClassesElement"})}(),y(y.uniqueSort(i.get().concat(n.element.get())))):y(i.not(n.element).get()),h.classesElementLookup[t[s]]=i,o.push(t[s]),e&&n.classes[t[s]]&&o.push(n.classes[t[s]])}return(n=y.extend({element:this.element,classes:this.options.classes||{}},n)).keys&&t(n.keys.match(/\S+/g)||[],!0),n.extra&&t(n.extra.match(/\S+/g)||[]),o.join(" ")},_untrackClassesElement:function(i){var s=this;y.each(s.classesElementLookup,function(t,e){-1!==y.inArray(i.target,e)&&(s.classesElementLookup[t]=y(e.not(i.target).get()))}),this._off(y(i.target))},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){var n="string"==typeof t||null===t,i={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s="boolean"==typeof s?s:i};return i.element.toggleClass(this._classes(i),s),this},_on:function(n,o,t){var h,a=this;"boolean"!=typeof n&&(t=o,o=n,n=!1),t?(o=h=y(o),this.bindings=this.bindings.add(o)):(t=o,o=this.element,h=this.widget()),y.each(t,function(t,e){function i(){if(n||!0!==a.options.disabled&&!y(this).hasClass("ui-state-disabled"))return("string"==typeof e?a[e]:e).apply(a,arguments)}"string"!=typeof e&&(i.guid=e.guid=e.guid||i.guid||y.guid++);var s=t.match(/^([\w:-]*)\s*(.*)$/),t=s[1]+a.eventNamespace,s=s[2];s?h.on(t,s,i):o.on(t,i)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.off(e),this.bindings=y(this.bindings.not(t).get()),this.focusable=y(this.focusable.not(t).get()),this.hoverable=y(this.hoverable.not(t).get())},_delay:function(t,e){var i=this;return setTimeout(function(){return("string"==typeof t?i[t]:t).apply(i,arguments)},e||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){this._addClass(y(t.currentTarget),null,"ui-state-hover")},mouseleave:function(t){this._removeClass(y(t.currentTarget),null,"ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){this._addClass(y(t.currentTarget),null,"ui-state-focus")},focusout:function(t){this._removeClass(y(t.currentTarget),null,"ui-state-focus")}})},_trigger:function(t,e,i){var s,n,o=this.options[t];if(i=i||{},(e=y.Event(e)).type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),e.target=this.element[0],n=e.originalEvent)for(s in n)s in e||(e[s]=n[s]);return this.element.trigger(e,i),!("function"==typeof o&&!1===o.apply(this.element[0],[e].concat(i))||e.isDefaultPrevented())}},y.each({show:"fadeIn",hide:"fadeOut"},function(o,h){y.Widget.prototype["_"+o]=function(e,t,i){var s,n=(t="string"==typeof t?{effect:t}:t)?!0!==t&&"number"!=typeof t&&t.effect||h:o;"number"==typeof(t=t||{})?t={duration:t}:!0===t&&(t={}),s=!y.isEmptyObject(t),t.complete=i,t.delay&&e.delay(t.delay),s&&y.effects&&y.effects.effect[n]?e[o](t):n!==o&&e[n]?e[n](t.duration,t.easing,i):e.queue(function(t){y(this)[o](),i&&i.call(e[0]),t()})}});var s,x,D,o,r,l,u,p,W;y.widget;function E(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function H(t,e){return parseInt(y.css(t,e),10)||0}function S(t){return null!=t&&t===t.window}x=Math.max,D=Math.abs,o=/left|center|right/,r=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,u=/^\w+/,p=/%$/,W=y.fn.position,y.position={scrollbarWidth:function(){if(void 0!==s)return s;var t,e=y("<div style='display:block;position:absolute;width:200px;height:200px;overflow:hidden;'><div style='height:300px;width:auto;'></div></div>"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.width<t.element[0].scrollWidth;return{width:"scroll"===i||"auto"===i&&t.height<t.element[0].scrollHeight?y.position.scrollbarWidth():0,height:e?y.position.scrollbarWidth():0}},getWithinInfo:function(t){var e=y(t||window),i=S(e[0]),s=!!e[0]&&9===e[0].nodeType;return{element:e,isWindow:i,isDocument:s,offset:!i&&!s?y(t).offset():{left:0,top:0},scrollLeft:e.scrollLeft(),scrollTop:e.scrollTop(),width:e.outerWidth(),height:e.outerHeight()}}},y.fn.position=function(p){if(!p||!p.of)return W.apply(this,arguments);var d,c,f,g,m,t,_="string"==typeof(p=y.extend({},p)).of?y(document).find(p.of):y(p.of),w=y.position.getWithinInfo(p.within),v=y.position.getScrollInfo(w),b=(p.collision||"flip").split(" "),z={},e=9===(t=(e=_)[0]).nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:S(t)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:t.preventDefault?{width:0,height:0,offset:{top:t.pageY,left:t.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()};return _[0].preventDefault&&(p.at="left top"),c=e.width,f=e.height,m=y.extend({},g=e.offset),y.each(["my","at"],function(){var t,e,i=(p[this]||"").split(" ");(i=1===i.length?o.test(i[0])?i.concat(["center"]):r.test(i[0])?["center"].concat(i):["center","center"]:i)[0]=o.test(i[0])?i[0]:"center",i[1]=r.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),z[this]=[t?t[0]:0,e?e[0]:0],p[this]=[u.exec(i[0])[0],u.exec(i[1])[0]]}),1===b.length&&(b[1]=b[0]),"right"===p.at[0]?m.left+=c:"center"===p.at[0]&&(m.left+=c/2),"bottom"===p.at[1]?m.top+=f:"center"===p.at[1]&&(m.top+=f/2),d=E(z.at,c,f),m.left+=d[0],m.top+=d[1],this.each(function(){var i,t,h=y(this),a=h.outerWidth(),r=h.outerHeight(),e=H(this,"marginLeft"),s=H(this,"marginTop"),n=a+e+H(this,"marginRight")+v.width,o=r+s+H(this,"marginBottom")+v.height,l=y.extend({},m),u=E(z.my,h.outerWidth(),h.outerHeight());"right"===p.my[0]?l.left-=a:"center"===p.my[0]&&(l.left-=a/2),"bottom"===p.my[1]?l.top-=r:"center"===p.my[1]&&(l.top-=r/2),l.left+=u[0],l.top+=u[1],i={marginLeft:e,marginTop:s},y.each(["left","top"],function(t,e){y.ui.position[b[t]]&&y.ui.position[b[t]][e](l,{targetWidth:c,targetHeight:f,elemWidth:a,elemHeight:r,collisionPosition:i,collisionWidth:n,collisionHeight:o,offset:[d[0]+u[0],d[1]+u[1]],my:p.my,at:p.at,within:w,elem:h})}),p.using&&(t=function(t){var e=g.left-l.left,i=e+c-a,s=g.top-l.top,n=s+f-r,o={target:{element:_,left:g.left,top:g.top,width:c,height:f},element:{element:h,left:l.left,top:l.top,width:a,height:r},horizontal:i<0?"left":0<e?"right":"center",vertical:n<0?"top":0<s?"bottom":"middle"};c<a&&D(e+i)<c&&(o.horizontal="center"),f<r&&D(s+n)<f&&(o.vertical="middle"),x(D(e),D(i))>x(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0<h&&a<=0?(i=t.left+h+e.collisionWidth-n-s,t.left+=h-i):t.left=!(0<a&&h<=0)&&a<h?s+n-e.collisionWidth:s:0<h?t.left+=h:0<a?t.left-=a:t.left=x(t.left-o,t.left)},top:function(t,e){var i=e.within,s=i.isWindow?i.scrollTop:i.offset.top,n=e.within.height,o=t.top-e.collisionPosition.marginTop,h=s-o,a=o+e.collisionHeight-n-s;e.collisionHeight>n?0<h&&a<=0?(i=t.top+h+e.collisionHeight-n-s,t.top+=h-i):t.top=!(0<a&&h<=0)&&a<h?s+n-e.collisionHeight:s:0<h?t.top+=h:0<a?t.top-=a:t.top=x(t.top-o,t.top)}},flip:{left:function(t,e){var i=e.within,s=i.offset.left+i.scrollLeft,n=i.width,o=i.isWindow?i.scrollLeft:i.offset.left,h=t.left-e.collisionPosition.marginLeft,a=h-o,r=h+e.collisionWidth-n-o,l="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,i="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,h=-2*e.offset[0];a<0?((s=t.left+l+i+h+e.collisionWidth-n-s)<0||s<D(a))&&(t.left+=l+i+h):0<r&&(0<(o=t.left-e.collisionPosition.marginLeft+l+i+h-o)||D(o)<r)&&(t.left+=l+i+h)},top:function(t,e){var i=e.within,s=i.offset.top+i.scrollTop,n=i.height,o=i.isWindow?i.scrollTop:i.offset.top,h=t.top-e.collisionPosition.marginTop,a=h-o,r=h+e.collisionHeight-n-o,l="top"===e.my[1]?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,i="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,h=-2*e.offset[1];a<0?((s=t.top+l+i+h+e.collisionHeight-n-s)<0||s<D(a))&&(t.top+=l+i+h):0<r&&(0<(o=t.top-e.collisionPosition.marginTop+l+i+h-o)||D(o)<r)&&(t.top+=l+i+h)}},flipfit:{left:function(){y.ui.position.flip.left.apply(this,arguments),y.ui.position.fit.left.apply(this,arguments)},top:function(){y.ui.position.flip.top.apply(this,arguments),y.ui.position.fit.top.apply(this,arguments)}}};var t;y.ui.position,y.extend(y.expr.pseudos,{data:y.expr.createPseudo?y.expr.createPseudo(function(e){return function(t){return!!y.data(t,e)}}):function(t,e,i){return!!y.data(t,i[3])}}),y.fn.extend({disableSelection:(t="onselectstart"in document.createElement("div")?"selectstart":"mousedown",function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}),enableSelection:function(){return this.off(".ui-disableSelection")}});y.ui.focusable=function(t,e){var i,s,n,o,h=t.nodeName.toLowerCase();return"area"===h?(s=(i=t.parentNode).name,!(!t.href||!s||"map"!==i.nodeName.toLowerCase())&&(0<(s=y("img[usemap='#"+s+"']")).length&&s.is(":visible"))):(/^(input|select|textarea|button|object)$/.test(h)?(n=!t.disabled)&&(o=y(t).closest("fieldset")[0])&&(n=!o.disabled):n="a"===h&&t.href||e,n&&y(t).is(":visible")&&function(t){var e=t.css("visibility");for(;"inherit"===e;)t=t.parent(),e=t.css("visibility");return"visible"===e}(y(t)))},y.extend(y.expr.pseudos,{focusable:function(t){return y.ui.focusable(t,null!=y.attr(t,"tabindex"))}});var e,d;y.ui.focusable,y.fn._form=function(){return"string"==typeof this[0].form?this.closest("form"):y(this[0].form)},y.ui.formResetMixin={_formResetHandler:function(){var e=y(this);setTimeout(function(){var t=e.data("ui-form-reset-instances");y.each(t,function(){this.refresh()})})},_bindFormResetHandler:function(){var t;this.form=this.element._form(),this.form.length&&((t=this.form.data("ui-form-reset-instances")||[]).length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t))},_unbindFormResetHandler:function(){var t;this.form.length&&((t=this.form.data("ui-form-reset-instances")).splice(y.inArray(this,t),1),t.length?this.form.data("ui-form-reset-instances",t):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset"))}};y.expr.pseudos||(y.expr.pseudos=y.expr[":"]),y.uniqueSort||(y.uniqueSort=y.unique),y.escapeSelector||(e=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,d=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},y.escapeSelector=function(t){return(t+"").replace(e,d)}),y.fn.even&&y.fn.odd||y.fn.extend({even:function(){return this.filter(function(t){return t%2==0})},odd:function(){return this.filter(function(t){return t%2==1})}});y.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},y.fn.labels=function(){var t,e,i;return this.length?this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(e=this.eq(0).parents("label"),(t=this.attr("id"))&&(i=(i=this.eq(0).parents().last()).add((i.length?i:this).siblings()),t="label[for='"+y.escapeSelector(t)+"']",e=e.add(i.find(t).addBack(t))),this.pushStack(e)):this.pushStack([])},y.fn.scrollParent=function(t){var e=this.css("position"),i="absolute"===e,s=t?/(auto|scroll|hidden)/:/(auto|scroll)/,t=this.parents().filter(function(){var t=y(this);return(!i||"static"!==t.css("position"))&&s.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==e&&t.length?t:y(this[0].ownerDocument||document)},y.extend(y.expr.pseudos,{tabbable:function(t){var e=y.attr(t,"tabindex"),i=null!=e;return(!i||0<=e)&&y.ui.focusable(t,i)}}),y.fn.extend({uniqueId:(c=0,function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++c)})}),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&y(this).removeAttr("id")})}}),y.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var c,f=!1;y(document).on("mouseup",function(){f=!1});y.widget("ui.mouse",{version:"1.13.2",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(t){if(!0===y.data(t.target,e.widgetName+".preventClickEvent"))return y.removeData(t.target,e.widgetName+".preventClickEvent"),t.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!f){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var e=this,i=1===t.which,s=!("string"!=typeof this.options.cancel||!t.target.nodeName)&&y(t.target).closest(this.options.cancel).length;return i&&!s&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(t),!this._mouseStarted)?(t.preventDefault(),!0):(!0===y.data(t.target,this.widgetName+".preventClickEvent")&&y.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return e._mouseMove(t)},this._mouseUpDelegate=function(t){return e._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),f=!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(y.ui.ie&&(!document.documentMode||document.documentMode<9)&&!t.button)return this._mouseUp(t);if(!t.which)if(t.originalEvent.altKey||t.originalEvent.ctrlKey||t.originalEvent.metaKey||t.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(this._mouseDownEvent,t),this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&y.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,f=!1,t.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n<o.length;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}};y.widget("ui.resizable",y.ui.mouse,{version:"1.13.2",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(t,e){if("hidden"===y(t).css("overflow"))return!1;var i=e&&"left"===e?"scrollLeft":"scrollTop",e=!1;if(0<t[i])return!0;try{t[i]=1,e=0<t[i],t[i]=0}catch(t){}return e},_create:function(){var t,e=this.options,i=this;this._addClass("ui-resizable"),y.extend(this,{_aspectRatio:!!e.aspectRatio,aspectRatio:e.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:e.helper||e.ghost||e.animate?e.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(y("<div class='ui-wrapper'></div>").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e<i.length;e++)s="ui-resizable-"+(t=String.prototype.trim.call(i[e])),n=y("<div>"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),s<n.maxWidth&&(n.maxWidth=s),t<n.maxHeight&&(n.maxHeight=t)),this._vBoundaries=n},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e<this._proportionallyResizeElements.length;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,e=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||y("<div></div>").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidth<d,g=i.maxHeight&&i.maxHeight<c,m=i.minWidth&&i.minWidth>d,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0<c-l?(e.size.height=c,e.position.top=o.top-p):(c=l-t.height,e.size.height=c,e.position.top=o.top+n.height-c),0<d-r?(e.size.width=d,e.position.left=o.left-u):(d=r-t.width,e.size.width=d,e.position.left=o.left+n.width-d))}});y.ui.resizable});
\ No newline at end of file
// :: 1.3. Typography
// ----------------------------------------------------------
-$sm-dox__font-family: "Lucida Grande", "Geneva", "Helvetica", Arial, sans-serif !default;
+$sm-dox__font-family: var(--font-family-nav) !default;
$sm-dox__font-size-base: 13px !default;
$sm-dox__font-size-small: 12px !default;
$sm-dox__line-height: 15px !default;
// Menu box
//$sm-dox__collapsible-bg: $sm-dox__gray !default;
-$sm-dox__collapsible-bg: url('tab_b.png') !default;
+$sm-dox__collapsible-bg: var(--nav-gradient-image) !default;
$sm-dox__collapsible-border-radius: $sm-dox__border-radius !default;
// Items
-$sm-dox__collapsible-item-color: $sm-dox__gray-darker !default;
+$sm-dox__collapsible-item-color: var(--nav-menu-foreground-color) !default; //$sm-dox__gray-darker !default;
$sm-dox__collapsible-item-current-color: $sm-dox__red !default;
$sm-dox__collapsible-item-disabled-color: darken($sm-dox__gray, 20%) !default;
-$sm-dox__collapsible-item-padding-vertical: 0px !default;
-$sm-dox__collapsible-item-padding-horizontal: 12px !default;
+$sm-dox__collapsible-item-padding-vertical: 0px !default;
+$sm-dox__collapsible-item-padding-horizontal: 12px !default;
// Items separators
$sm-dox__collapsible-separators-color: rgba(0, 0, 0, 0.05) !default;
// Toggle button (sub menu indicators)
-$sm-dox__collapsible-toggle-bg: rgba(255, 255, 255, 0.5) !default;
+$sm-dox__collapsible-toggle-bg: var(--nav-menu-toggle-color) !default; //rgba(255, 255, 255, 0.5) !default;
// ----------------------------------------------------------
// ----------------------------------------------------------
// Menu box
-$sm-dox__collapsible-sub-bg: rgba(darken($sm-dox__gray, 30%), 0.1) !default;
+$sm-dox__collapsible-sub-bg: var(--nav-menu-background-color) !default; // rgba(darken($sm-dox__gray, 30%), 0.1) !default;
// Items text indentation for deeper levels
$sm-dox__collapsible-sub-item-indentation: 8px !default;
// Menu box
//$sm-dox__desktop-bg: $sm-dox__gray !default;
-$sm-dox__desktop-bg: url('tab_b.png') !default;
+$sm-dox__desktop-bg: var(--nav-gradient-image) !default;
//$sm-dox__desktop-border-radius: 100px !default;
$sm-dox__desktop-padding-horizontal: 10px !default;
// Items
-$sm-dox__desktop-item-color: $sm-dox__gray_darker !default;
-$sm-dox__desktop-item-hover-color: $sm-dox__red !default;
-$sm-dox__desktop-item-current-color: $sm-dox__red !default;
+$sm-dox__desktop-item-color: var(--nav-text-normal-color) !default; //$sm-dox__gray_darker !default;
+$sm-dox__desktop-item-hover-color: var(--nav-text-hover-color) !default; //$sm-dox__red !default;
+$sm-dox__desktop-item-current-color: var(--nav-text-disabled-color) !default; //$sm-dox__red !default;
$sm-dox__desktop-item-disabled-color: darken($sm-dox__gray, 20%) !default;
$sm-dox__desktop-item-padding-vertical: 0px !default;
$sm-dox__desktop-item-padding-horizontal: 12px !default;
$sm-dox__desktop-vertical-item-padding-vertical: 10px !default;
$sm-dox__desktop-vertical-item-padding-horizontal: 20px !default;
-$sm-dox__main-text-color: #283A5D !default;
-$sm-dox__main-highlight-color: white !default;
+$sm-dox__main-text-color: var(--nav-text-normal-color) !default; // #283A5D !default;
+$sm-dox__main-highlight-color: var(--nav-text-hover-color) !default; // white !default;
// ----------------------------------------------------------
// :: 1.8. Desktop sub menus
// ----------------------------------------------------------
// Menu box
-$sm-dox__desktop-sub-bg: $sm-dox__white !default;
+$sm-dox__desktop-sub-bg: var(--nav-menu-background-color) !default; //$sm-dox__white !default;
$sm-dox__desktop-sub-border-color: $sm-dox__gray-dark !default;
$sm-dox__desktop-sub-border-radius: $sm-dox__border-radius !default;
$sm-dox__desktop-sub-box-shadow: 0 5px 9px $sm-dox__box-shadow !default;
$sm-dox__desktop-sub-padding-horizontal: 0 !default;
// Items
-$sm-dox__desktop-sub-item-color: $sm-dox__gray_darker !default;
+$sm-dox__desktop-sub-item-color: var(--nav-menu-foreground-color) !default; //$sm-dox__gray_darker !default;
$sm-dox__desktop-sub-item-hover-color: $sm-dox__red !default;
$sm-dox__desktop-sub-item-hover-bg: $sm-dox__gray !default;
$sm-dox__desktop-sub-item-current-color: $sm-dox__red !default;
font-weight: bold;
line-height: 36px; //$sm-dox__line-height;
text-decoration: none;
- text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-shadow: var(--nav-text-normal-shadow);
color: $sm-dox__main-text-color;
outline: none;
}
&:hover {
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
color: $sm-dox__main-highlight-color;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-shadow: var(--nav-text-hover-shadow);
}
&.current {
//line-height: $sm-dox__line-height;
line-height: $sm-dox__main-row-height;
text-shadow: none;
- background-color: white;
+ background-color: var(--nav-menu-background-color);
background-image: none;
}
&:hover {
// color: $sm-dox__collapsible-item-current-color;
// background-color: $sm-dox__gray;
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
color: $sm-dox__main-highlight-color;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
&.highlighted {
padding: $sm-dox__desktop-item-padding-vertical $sm-dox__desktop-item-padding-horizontal;
/*color: $sm-dox__desktop-item-color;*/
- background-image:url('tab_s.png');
+ background-image:var(--nav-separator-image);
background-repeat:no-repeat;
background-position:right;
@include border-radius(0 !important);
}
&:hover {
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
color: $sm-dox__main-highlight-color;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-shadow: var(--nav-text-hover-shadow);
span.sub-arrow {
border-color: $sm-dox__main-highlight-color transparent transparent transparent;
}
}
&:hover {
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
color: $sm-dox__main-highlight-color;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-shadow: var(--nav-text-hover-shadow);
span.sub-arrow {
border-color: transparent transparent transparent $sm-dox__main-highlight-color;
}
left: 2px;
height: 2px;
width: 24px;
- background: #666;
+ background: var(--nav-menu-button-color);
-webkit-transition: all 0.25s;
transition: all 0.25s;
}
#include "mscgen_safe.h"
#include "mscgen_lexer.h"
#include "mscgen_language.h" /* Token definitions from Yacc/Bison */
+
+#define USE_STATE2STRING 0
+
/* Counter for error reporting */
static unsigned long lex_linenum = 1;
static char *lex_line = NULL;
static void newline(const char *text, unsigned int n);
static char *trimQstring(char *s);
static const char *stateToString(int state);
+
+#if USE_STATE2STRING
+static const char *stateToString(int state);
+#endif
%}
/* Not used, so prevent compiler warning */
lex_utf8 = FALSE;
}
+#if USE_STATE2STRING
#include "mscgen_lexer.l.h"
+#endif
/* END OF FILE */
lexscanner
configimpl)
+if (NOT depfile_supported)
+ # In case the DEPFILE possibility is not supported the complete list of lex include files for the dependency has to be used
+ set(LEX_INC_FILES)
+endif()
+
# unfortunately ${LEX_FILES_H} and ${LEX_FILES_CPP} don't work in older versions of CMake (like 3.6.2) for add_library
foreach(lex_file ${LEX_FILES})
set(LEX_FILES_H ${LEX_FILES_H} " " ${GENERATED_SRC}/${lex_file}.l.h CACHE INTERNAL "Stores generated files")
set(LEX_FILES_CPP ${LEX_FILES_CPP} " " ${GENERATED_SRC}/${lex_file}.cpp CACHE INTERNAL "Stores generated files")
+
+ if (depfile_supported)
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.corr ${GENERATED_SRC}/${lex_file}.d ${CMAKE_CURRENT_LIST_DIR}
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l
+ DEPFILE ${GENERATED_SRC}/${lex_file}.d
+ OUTPUT ${GENERATED_SRC}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.corr ${GENERATED_SRC}/${lex_file}.d
+ )
+ else()
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.corr ${GENERATED_SRC}/${lex_file}.d ${CMAKE_CURRENT_LIST_DIR}
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/pre_lex.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l ${LEX_INC_FILES}
+ OUTPUT ${GENERATED_SRC}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.corr ${GENERATED_SRC}/${lex_file}.d
+ )
+ endif()
+ set_source_files_properties(${GENERATED_SRC}/${lex_file}.l PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC}/${lex_file}.corr PROPERTIES GENERATED 1)
+ set_source_files_properties(${GENERATED_SRC}/${lex_file}.d PROPERTIES GENERATED 1)
+
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/scan_states.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l > ${GENERATED_SRC}/${lex_file}.l.h
- DEPENDS ${CMAKE_CURRENT_LIST_DIR}/scan_states.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/scan_states.py ${GENERATED_SRC}/${lex_file}.l > ${GENERATED_SRC}/${lex_file}.l.h
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/scan_states.py ${GENERATED_SRC}/${lex_file}.l
OUTPUT ${GENERATED_SRC}/${lex_file}.l.h
)
set_source_files_properties(${GENERATED_SRC}/${lex_file}.l.h PROPERTIES GENERATED 1)
- # for code coverage we need the flex sources in the build src directory
- add_custom_command(
- COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/src/${lex_file}.l ${PROJECT_BINARY_DIR}/src/${lex_file}.l
- DEPENDS ${PROJECT_SOURCE_DIR}/src/${lex_file}.l
- OUTPUT ${PROJECT_BINARY_DIR}/src/${lex_file}.l
- )
+
+ if(enable_coverage)
+ # for code coverage we need the flex sources in the build src directory
+ add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E copy ${GENERATED_SRC}/${lex_file}.l ${PROJECT_BINARY_DIR}/src/${lex_file}.l
+ DEPENDS ${GENERATED_SRC}/${lex_file}.l
+ OUTPUT ${PROJECT_BINARY_DIR}/src/${lex_file}.l
+ )
+ endif()
FLEX_TARGET(${lex_file}
- ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l
- ${GENERATED_SRC}/${lex_file}.cpp
+ ${GENERATED_SRC}/${lex_file}.l
+ ${GENERATED_SRC}/${lex_file}_intermediate.cpp
COMPILE_FLAGS "${LEX_FLAGS}")
+ add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/post_lex.py ${GENERATED_SRC}/${lex_file}_intermediate.cpp ${GENERATED_SRC}/${lex_file}.cpp ${GENERATED_SRC}/${lex_file}.corr ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l ${GENERATED_SRC}/${lex_file}.l
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/post_lex.py ${GENERATED_SRC}/${lex_file}_intermediate.cpp ${GENERATED_SRC}/${lex_file}.corr
+ OUTPUT ${GENERATED_SRC}/${lex_file}.cpp
+ )
endforeach()
${GENERATED_SRC}/ce_parse.cpp
COMPILE_FLAGS "${YACC_FLAGS}")
-add_custom_command(
- COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/src/constexp.y ${PROJECT_BINARY_DIR}/src
- DEPENDS ${PROJECT_SOURCE_DIR}/src/constexp.y
- OUTPUT ${PROJECT_BINARY_DIR}/src/constexp.y
-)
+if(enable_coverage)
+ add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/src/constexp.y ${PROJECT_BINARY_DIR}/src
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/constexp.y
+ OUTPUT ${PROJECT_BINARY_DIR}/src/constexp.y
+ )
+endif()
add_library(doxycfg STATIC
${GENERATED_SRC}/configvalues.h
condparser.cpp
context.cpp
cppvalue.cpp
+ datetime.cpp
defgen.cpp
definition.cpp
dia.cpp
#include <list>
#include <unordered_map>
#include <mutex>
+#include <utility>
#include <ctype.h>
/*! Fixed size cache for value type V using keys of type K.
const char *bibTmpFile = "bibTmpFile_";
const char *bibTmpDir = "bibTmpDir/";
+static QCString getBibFile(const QCString &inFile)
+{
+ QCString name = inFile;
+ if (!name.isEmpty() && !name.endsWith(".bib")) name+=".bib";
+ return name;
+}
+
class CiteInfoImpl : public CiteInfo
{
public:
const StringVector &citeDataList = Config_getList(CITE_BIB_FILES);
for (const auto &bibdata : citeDataList)
{
- QCString bibFile = bibdata.c_str();
- if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ QCString bibFile = getBibFile(QCString(bibdata));
insertCrossReferencesForBibFile(bibFile);
}
int i = 0;
for (const auto &bibdata : citeDataList)
{
- QCString bibFile = bibdata.c_str();
- if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ QCString bibFile = getBibFile(QCString(bibdata));
FileInfo fi(bibFile.str());
if (fi.exists())
{
i = 0;
for (const auto &bibdata : citeDataList)
{
- QCString bibFile = bibdata.c_str();
- // Note: file can now have multiple dots
- if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ QCString bibFile = getBibFile(QCString(bibdata));
FileInfo fi(bibFile.str());
if (fi.exists())
{
int i = 0;
for (const auto &bibdata : citeDataList)
{
- QCString bibFile = bibdata.c_str();
- // Note: file can now have multiple dots
- if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ QCString bibFile = getBibFile(QCString(bibdata));
FileInfo fi(bibFile.str());
if (fi.exists())
{
SrcLangExt lang = getLanguageFromFileName(fileName);
if (lang==SrcLangExt_ObjC || p->detectedLang!=DetectedLang::Cpp)
{
- QCString fn = fileName;
+ QCString fn = fileName.lower();
if (p->detectedLang!=DetectedLang::Cpp &&
- (fn.right(4).lower()==".cpp" || fn.right(4).lower()==".cxx" ||
- fn.right(3).lower()==".cc" || fn.right(2).lower()==".c"))
+ (fn.endsWith(".cpp") || fn.endsWith(".cxx") ||
+ fn.endsWith(".cc") || fn.endsWith(".c")))
{ // fall back to C/C++ once we see an extension that indicates this
p->detectedLang = DetectedLang::Cpp;
}
- else if (fn.right(3).lower()==".mm") // switch to Objective C++
+ else if (fn.endsWith(".mm")) // switch to Objective C++
{
p->detectedLang = DetectedLang::ObjCpp;
}
- else if (fn.right(2).lower()==".m") // switch to Objective C
+ else if (fn.endsWith(".m")) // switch to Objective C
{
p->detectedLang = DetectedLang::ObjC;
}
#include <cstdio>
#include <algorithm>
+#include "types.h"
#include "classdef.h"
#include "classlist.h"
#include "entry.h"
{
n=substitute(n,"::",sep);
}
- if (cd->compoundType()==ClassDef::Protocol && n.right(2)=="-p")
+ if (cd->compoundType()==ClassDef::Protocol && n.endsWith("-p"))
{
n="<"+n.left(n.length()-2)+">";
}
- //else if (n.right(2)=="-g")
- //{
- // n = n.left(n.length()-2);
- //}
- //printf("ClassDefImpl::displayName()=%s\n",qPrint(n));
return n;
}
virtual const ArgumentList &templateArguments() const;
virtual FileDef *getFileDef() const;
virtual const MemberDef *getMemberByName(const QCString &) const;
- virtual bool isBaseClass(const ClassDef *bcd,bool followInstances,int level=0) const;
+ virtual int isBaseClass(const ClassDef *bcd,bool followInstances) const;
virtual bool isSubClass(ClassDef *bcd,int level=0) const;
virtual bool isAccessibleMember(const MemberDef *md) const;
virtual const TemplateInstanceList &getTemplateInstances() const;
{ return getCdAlias()->getFileDef(); }
virtual const MemberDef *getMemberByName(const QCString &s) const
{ return getCdAlias()->getMemberByName(s); }
- virtual bool isBaseClass(const ClassDef *bcd,bool followInstances,int level=0) const
- { return getCdAlias()->isBaseClass(bcd,followInstances,level); }
+ virtual int isBaseClass(const ClassDef *bcd,bool followInstances) const
+ { return getCdAlias()->isBaseClass(bcd,followInstances); }
virtual bool isSubClass(ClassDef *bcd,int level=0) const
{ return getCdAlias()->isSubClass(bcd,level); }
virtual bool isAccessibleMember(const MemberDef *md) const
const ClassDef *cd=toClassDef(d);
if (!name.isEmpty()) name+="::";
QCString clName = d->localName();
- if (/*clName.right(2)=="-g" ||*/ clName.right(2)=="-p")
+ if (clName.endsWith("-p"))
{
clName = clName.left(clName.length()-2);
}
m_impl->tempArgs = al;
}
-/*! Returns \c TRUE iff this class or a class inheriting from this class
- * is \e not defined in an external tag file.
- */
-bool ClassDefImpl::hasNonReferenceSuperClass() const
+static bool hasNonReferenceSuperClassRec(const ClassDef *cd,int level)
{
- bool found=!isReference() && isLinkableInProject() && !isHidden();
+ bool found=!cd->isReference() && cd->isLinkableInProject() && !cd->isHidden();
if (found)
{
return TRUE; // we're done if this class is not a reference
}
- for (const auto &ibcd : m_impl->inheritedBy)
+ for (const auto &ibcd : cd->subClasses())
{
- ClassDef *bcd=ibcd.classDef;
+ const ClassDef *bcd=ibcd.classDef;
+ if (level>256)
+ {
+ err("Possible recursive class relation while inside %s and looking for base class %s\n",qPrint(cd->name()),qPrint(bcd->name()));
+ return FALSE;
+ }
// recurse into the super class branch
- found = found || bcd->hasNonReferenceSuperClass();
+ found = found || hasNonReferenceSuperClassRec(bcd,level+1);
if (!found)
{
// look for template instances that might have non-reference super classes
for (const auto &cil : bcd->getTemplateInstances())
{
// recurse into the template instance branch
- found = cil.classDef->hasNonReferenceSuperClass();
+ found = hasNonReferenceSuperClassRec(cil.classDef,level+1);
if (found) break;
}
}
return found;
}
+/*! Returns \c TRUE iff this class or a class inheriting from this class
+ * is \e not defined in an external tag file.
+ */
+bool ClassDefImpl::hasNonReferenceSuperClass() const
+{
+ return hasNonReferenceSuperClassRec(this,0);
+}
+
QCString ClassDefImpl::requiresClause() const
{
return m_impl->requiresClause;
//----------------------------------------------------------------------
// recursive function:
-// returns TRUE iff class definition 'bcd' represents an (in)direct base
-// class of class definition 'cd'.
+// returns the distance to the base class definition 'bcd' represents an (in)direct base
+// class of class definition 'cd' or 0 if it does not.
-bool ClassDefImpl::isBaseClass(const ClassDef *bcd, bool followInstances,int level) const
+int ClassDefImpl::isBaseClass(const ClassDef *bcd, bool followInstances) const
{
- bool found=FALSE;
+ int distance=0;
//printf("isBaseClass(cd=%s) looking for %s\n",qPrint(name()),qPrint(bcd->name()));
- if (level>256)
- {
- err("Possible recursive class relation while inside %s and looking for base class %s\n",qPrint(name()),qPrint(bcd->name()));
- return FALSE;
- }
for (const auto &bclass : baseClasses())
{
const ClassDef *ccd = bclass.classDef;
if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
- found = (ccd==bcd) || ccd->isBaseClass(bcd,followInstances,level+1);
- if (found) break;
+ if (ccd==bcd)
+ {
+ distance=1;
+ break; // no shorter path possible
+ }
+ else
+ {
+ int d = ccd->isBaseClass(bcd,followInstances);
+ if (d>256)
+ {
+ err("Possible recursive class relation while inside %s and looking for base class %s\n",qPrint(name()),qPrint(bcd->name()));
+ return 0;
+ }
+ else if (d>0) // path found
+ {
+ if (distance==0 || d+1<distance) // update if no path found yet or shorter path found
+ {
+ distance=d+1;
+ }
+ }
+ }
}
- return found;
+ return distance;
}
//----------------------------------------------------------------------
*/
virtual FileDef *getFileDef() const = 0;
- /** Returns the Java package this class is in or 0 if not applicable.
- */
-
+ /** Returns the member with the given name */
virtual const MemberDef *getMemberByName(const QCString &) const = 0;
/** Returns TRUE iff \a bcd is a direct or indirect base class of this
* class. This function will recursively traverse all branches of the
* inheritance tree.
*/
- virtual bool isBaseClass(const ClassDef *bcd,bool followInstances,int level=0) const = 0;
+ virtual int isBaseClass(const ClassDef *bcd,bool followInstances) const = 0;
/** Returns TRUE iff \a bcd is a direct or indirect sub class of this
* class.
{ "b", CMD_BOLD },
{ "c", CMD_CODE },
{ "cite", CMD_CITE },
+ { "icode", CMD_ISTARTCODE },
{ "code", CMD_STARTCODE },
{ "copydoc", CMD_COPYDOC },
{ "copybrief", CMD_COPYBRIEF },
{ "copydetails", CMD_COPYDETAILS },
{ "copyright", CMD_COPYRIGHT },
{ "date", CMD_DATE },
+ { "showdate", CMD_SHOWDATE },
{ "dontinclude", CMD_DONTINCLUDE },
{ "dotfile", CMD_DOTFILE },
{ "e", CMD_EMPHASIS },
{ "em", CMD_EMPHASIS },
+ { "endicode", CMD_ENDICODE },
{ "endcode", CMD_ENDCODE },
{ "endhtmlonly", CMD_ENDHTMLONLY },
{ "endlatexonly", CMD_ENDLATEXONLY },
{ "endlink", CMD_ENDLINK },
{ "endsecreflist", CMD_ENDSECREFLIST },
+ { "endiverbatim", CMD_ENDIVERBATIM },
{ "endverbatim", CMD_ENDVERBATIM },
{ "endxmlonly", CMD_ENDXMLONLY },
{ "exception", CMD_EXCEPTION },
{ "xrefitem", CMD_XREFITEM },
{ "throw", CMD_EXCEPTION },
{ "until", CMD_UNTIL },
+ { "iverbatim", CMD_IVERBATIM },
{ "verbatim", CMD_VERBATIM },
{ "verbinclude", CMD_VERBINCLUDE },
{ "version", CMD_VERSION },
{ "maninclude", CMD_MANINCLUDE },
{ "xmlinclude", CMD_XMLINCLUDE },
{ "iline", CMD_ILINE },
+ { "ifile", CMD_IFILE },
{ "iliteral", CMD_ILITERAL },
{ "endiliteral", CMD_ENDILITERAL },
{ 0, 0 },
CMD_ILINE = 116,
CMD_ILITERAL = 117,
CMD_ENDILITERAL = 118,
+ CMD_IFILE = 119,
+ CMD_SHOWDATE = 120,
+ CMD_ISTARTCODE = 121,
+ CMD_ENDICODE = 122,
+ CMD_IVERBATIM = 123,
+ CMD_ENDIVERBATIM = 124
};
enum HtmlTagType
int yyLineNr = 0; //!< current line number
yy_size_t yyColNr = 0; //!< current column number
bool insideCodeLine = FALSE;
+ bool skipCodify = FALSE; //!< for CSharp files scoped namespace {
bool exampleBlock = FALSE;
QCString exampleName;
BN [ \t\n\r]
ID [$a-z_A-Z\x80-\xFF][$a-z_A-Z0-9\x80-\xFF]*
SEP ("::"|"\\")
-SCOPENAME ({SEP}{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID}
+SCOPENAME ("::"{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID}
TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID})
SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+
if (yyextra->sourceFileDef)
{
const FileDef *fd=yyextra->sourceFileDef;
- yyextra->insideObjC = fd->name().lower().right(2)==".m" ||
- fd->name().lower().right(3)==".mm";
+ yyextra->insideObjC = fd->name().lower().endsWith(".m") ||
+ fd->name().lower().endsWith(".mm");
DBG_CTX((stderr,"insideObjC=%d\n",yyextra->insideObjC));
}
else
BEGIN(Body);
}
<ClassName,ClassVar>";" {
- yyextra->code->codify(yytext);
- yyextra->searchingForBody=FALSE;
- BEGIN( Body );
+ if (yyextra->lang==SrcLangExt_CSharp)
+ {
+ yyextra->code->codify(yytext);
+ yyextra->skipCodify = true;
+ unput('{');
+ }
+ else
+ {
+ yyextra->code->codify(yytext);
+ yyextra->searchingForBody=FALSE;
+ BEGIN( Body );
+ }
}
<ClassName,ClassVar>[*&^%]+ {
yyextra->type=yyextra->curClassName;
<Bases>^{Bopt}/"@"{ID} | // Objective-C interface
<Bases,ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*"{"{B}* {
yyextra->theVarContext.pushScope();
- yyextra->code->codify(yytext);
+ if (!yyextra->skipCodify) yyextra->code->codify(yytext);
+ yyextra->skipCodify = false;
if (YY_START==ClassVar && yyextra->curClassName.isEmpty())
{
yyextra->curClassName = yyextra->name;
yyextra->delimiter=yyextra->delimiter.left(yyextra->delimiter.length()-1);
BEGIN( RawString );
}
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\" {
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit,ClassVar>\" {
startFontClass(yyscanner,"stringliteral");
yyextra->code->codify(yytext);
yyextra->lastStringContext=YY_START;
DBG_CTX((stderr,"VariableContext::addVariable(%s,%s)\n",qPrint(type),qPrint(name)));
QCString ltype = type.simplifyWhiteSpace();
QCString lname = name.simplifyWhiteSpace();
- if (ltype.left(7)=="struct ")
- {
- ltype = ltype.right(ltype.length()-7);
- }
- else if (ltype.left(6)=="union ")
- {
- ltype = ltype.right(ltype.length()-6);
- }
+ ltype.stripPrefix("struct ");
+ ltype.stripPrefix("union ");
if (ltype.isEmpty() || lname.isEmpty()) return;
ltype = substitute(ltype,".","::");
DBG_CTX((stderr,"** addVariable trying: type='%s' name='%s' currentDefinition=%s\n",
return TRUE;
}
}
- else // found member, but it is not linkable, so make sure content inside is not assigned
- // to the previous member, see bug762760
- {
- DBG_CTX((stderr,"unlinkable member %s\n",qPrint(md->name())));
- yyextra->currentMemberDef = 0;
- }
}
return FALSE;
}
copyToOutput(yyscanner,yytext,(int)yyleng);
yyextra->lastCommentContext = YY_START;
yyextra->javaBlock=0;
- yyextra->blockName=QCString(yytext).stripWhiteSpace().left(3);
+ yyextra->blockName=QCString(yytext).stripWhiteSpace().left(3); // take the ``` or ~~~ part
BEGIN(VerbatimCode);
}
<CComment,ReadLine>[\\@]("dot"|"code"|"msc"|"startuml")/[^a-z_A-Z0-9] { /* start of a verbatim block */
BEGIN(Scan);
}
}
+<CComment,CNComment>"/""/"+/"*/" { /* we are already in C-comment so not a start of a nested comment but
+ * just the end of the comment (the end part is handled later). */
+ copyToOutput(yyscanner,yytext,(int)yyleng);
+ }
<CComment,CNComment>"/"+"*" { /* nested C comment */
if (yyextra->lang==SrcLangExt_Python ||
yyextra->lang==SrcLangExt_Markdown)
handleCondSectionId(yyscanner," "); // fake section id causing the section to be hidden unconditionally
if (*yytext=='\n') { yyextra->lineNr++; copyToOutput(yyscanner,"\n",1);}
}
-<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]* { // expand alias without arguments
+<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9-]* { // expand alias without arguments
replaceAliases(yyscanner,QCString(yytext));
}
-<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]*"{" { // expand alias with arguments
+<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9-]*"{" { // expand alias with arguments
yyextra->lastBlockContext=YY_START;
yyextra->blockCount=1;
yyextra->aliasString=yytext;
#include <stack>
#include <string>
#include <mutex>
+#include <functional>
+#include <unordered_map>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "qcstring.h"
+#include "fileinfo.h"
#include "cite.h"
#include "commentscan.h"
#include "condparser.h"
static bool handleEndParBlock(yyscan_t yyscanner,const QCString &, const StringVector &);
static bool handleParam(yyscan_t yyscanner,const QCString &, const StringVector &);
static bool handleRetval(yyscan_t yyscanner,const QCString &, const StringVector &);
+static bool handleFileInfo(yyscan_t yyscanner,const QCString &, const StringVector &);
+static bool handleLineInfo(yyscan_t yyscanner,const QCString &, const StringVector &);
#if USE_STATE2STRING
static const char *stateToString(int state);
{ "cite", { &handleCite, CommandSpacing::Inline }},
{ "class", { &handleClass, CommandSpacing::Invisible }},
{ "code", { &handleFormatBlock, CommandSpacing::Block }},
+ { "icode", { &handleFormatBlock, CommandSpacing::Block }},
{ "concept", { &handleConcept, CommandSpacing::Invisible }},
{ "copybrief", { &handleCopyBrief, CommandSpacing::Invisible }},
{ "copydetails", { &handleCopyDetails, CommandSpacing::Block }},
{ "copydoc", { &handleCopyDoc, CommandSpacing::Block }},
{ "copyright", { 0, CommandSpacing::Block }},
+ { "showdate", { 0, CommandSpacing::Inline }},
{ "date", { 0, CommandSpacing::Block }},
{ "def", { &handleDef, CommandSpacing::Invisible }},
{ "defgroup", { &handleDefGroup, CommandSpacing::Invisible }},
{ "until", { 0, CommandSpacing::Block }},
{ "var", { &handleFn, CommandSpacing::Invisible }},
{ "verbatim", { &handleFormatBlock, CommandSpacing::Block }},
+ { "iverbatim", { &handleFormatBlock, CommandSpacing::Block }},
{ "verbinclude", { 0, CommandSpacing::Inline }},
{ "version", { 0, CommandSpacing::Block }},
{ "warning", { 0, CommandSpacing::Block }},
{ "xmlonly", { &handleFormatBlock, CommandSpacing::Invisible }},
{ "xrefitem", { &handleXRefItem, CommandSpacing::XRef }},
{ "iliteral", { &handleFormatBlock, CommandSpacing::Inline }},
+ { "fileinfo", { &handleFileInfo, CommandSpacing::Inline }},
+ { "lineinfo", { &handleLineInfo, CommandSpacing::Inline }},
};
#define YY_NO_INPUT 1
static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
static void addCite(yyscan_t yyscanner);
static void addIline(yyscan_t yyscanner,int lineNr);
+static void addIlineBreak(yyscan_t yyscanner,int lineNr);
#define unput_string(yytext,yyleng) do { for (int i=(int)yyleng-1;i>=0;i--) unput(yytext[i]); } while(0)
addOutput(yyscanner,yytext[0]);
addOutput(yyscanner,yytext[2]);
}
-<Comment>".," { // . with comma such as "e.g.,"
+<Comment>"."[,:;] { // . with some puntuations such as "e.g.," or "e.g.:"
addOutput(yyscanner,yytext);
}
<Comment>"...\\"[ \t] { // ellipsis with escaped space.
yyextra->formulaNewLines++;
yyextra->formulaText+=*yytext;
yyextra->lineNr++;
+ addIline(yyscanner,yyextra->lineNr);
}
<ReadFormulaLong,ReadFormulaShort,ReadFormulaRound>. { // any other character
yyextra->formulaText+=*yytext;
//lastDefGroup.groupname = yytext;
//lastDefGroup.pri = yyextra->current->groupingPri();
// the .html stuff is for Qt compatibility
- if (yyextra->current->name.right(5)==".html")
+ if (yyextra->current->name.endsWith(".html"))
{
yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-5);
}
/* ----- handle arguments of the preformatted block commands ------- */
-<FormatBlock>{CMD}("endverbatim"|"endiliteral"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"endmsc")/{NW} { // possible ends
+<FormatBlock>{CMD}("endverbatim"|"endiverbatim"|"endiliteral"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"endicode"|"endmsc")/{NW} { // possible ends
addOutput(yyscanner,yytext);
if (&yytext[4]==yyextra->blockName) // found end of the block
{
addOutput(yyscanner,'\n');
}
<FormatBlock>{CCS} { // start of a C-comment
- if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim" || yyextra->blockName=="iliteral")) yyextra->commentCount++;
+ if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim" ||
+ yyextra->blockName=="icode" || yyextra->blockName=="iverbatim"||
+ yyextra->blockName=="iliteral"
+ )
+ ) yyextra->commentCount++;
addOutput(yyscanner,yytext);
}
<FormatBlock>{CCE} { // end of a C-comment
addOutput(yyscanner,yytext);
- if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim" || yyextra->blockName=="iliteral"))
+ if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim" ||
+ yyextra->blockName=="icode" || yyextra->blockName=="iverbatim"||
+ yyextra->blockName=="iliteral"
+ )
+ )
{
yyextra->commentCount--;
if (yyextra->commentCount<0)
if (*yytext=='\n') yyextra->lineNr++;
//next line is commented out due to bug620924
//addOutput(yyscanner,'\n');
- addIline(yyscanner,yyextra->lineNr);
+ addIlineBreak(yyscanner,yyextra->lineNr);
BEGIN( Comment );
}
<GuardParam>{LC} { // line continuation
<GuardParamEnd>{B}*{DOCNL} {
lineCount(yyscanner);
yyextra->spaceBeforeIf.resize(0);
- addIline(yyscanner,yyextra->lineNr);
+ addIlineBreak(yyscanner,yyextra->lineNr);
BEGIN(Comment);
}
<GuardParamEnd>{B}* {
addOutput(yyscanner,yyextra->spaceBeforeIf);
}
yyextra->spaceBeforeIf.resize(0);
- addIline(yyscanner,yyextra->lineNr);
+ addIlineBreak(yyscanner,yyextra->lineNr);
BEGIN(Comment);
}
<GuardParamEnd>. {
unput(*yytext);
- addIline(yyscanner,yyextra->lineNr);
+ addIlineBreak(yyscanner,yyextra->lineNr);
BEGIN(Comment);
}
/* ----- handle argument of noop command ------- */
<Noop>{DOCNL} { // end of argument
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
+ if (*yytext=='\n')
+ {
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
BEGIN( Comment );
}
<Noop>. { // ignore other stuff
return FALSE;
}
+static bool handleFileInfo(yyscan_t yyscanner,const QCString &, const StringVector &optList)
+{
+ using OutputWriter = std::function<void(yyscan_t,FileInfo &)>;
+ static std::unordered_map<std::string,OutputWriter> options =
+ { // name, writer
+ { "name", [](yyscan_t s,FileInfo &fi) { addOutput(s,fi.baseName()); } },
+ { "extension", [](yyscan_t s,FileInfo &fi) { addOutput(s,fi.extension(true)); } },
+ { "filename", [](yyscan_t s,FileInfo &fi) { addOutput(s,fi.fileName()); } },
+ { "directory", [](yyscan_t s,FileInfo &fi) { addOutput(s,fi.dirPath()); } },
+ { "full", [](yyscan_t s,FileInfo &fi) { addOutput(s,fi.absFilePath()); } },
+ };
+
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (!yyextra->spaceBeforeCmd.isEmpty())
+ {
+ addOutput(yyscanner,yyextra->spaceBeforeCmd);
+ yyextra->spaceBeforeCmd.resize(0);
+ }
+ bool first = true;
+ FileInfo fi(yyextra->fileName.str());
+ for (const auto &opt_ : optList)
+ {
+ QCString optStripped = QCString(opt_).stripWhiteSpace();
+ std::string opt = optStripped.lower().str();
+ auto it = options.find(opt);
+ if (it != options.end())
+ {
+ if (!first)
+ {
+ warn(yyextra->fileName,yyextra->lineNr,"Multiple options specified with \\fileinfo, discarding '%s'", qPrint(optStripped));
+ }
+ else
+ {
+ it->second(yyscanner,fi);
+ }
+ first = false;
+ }
+ else
+ {
+ warn(yyextra->fileName,yyextra->lineNr,"Unknown option specified with \\fileinfo: '%s'", qPrint(optStripped));
+ }
+ }
+ if (first) // no options specified
+ {
+ if (Config_getBool(FULL_PATH_NAMES))
+ {
+ addOutput(yyscanner,stripFromPath(yyextra->fileName));
+ }
+ else
+ {
+ addOutput(yyscanner,yyextra->fileName);
+ }
+ }
+ addOutput(yyscanner," ");
+ return FALSE;
+}
+
+static bool handleLineInfo(yyscan_t yyscanner,const QCString &, const StringVector &)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (!yyextra->spaceBeforeCmd.isEmpty())
+ {
+ addOutput(yyscanner,yyextra->spaceBeforeCmd);
+ yyextra->spaceBeforeCmd.resize(0);
+ }
+ addOutput(yyscanner,QCString().setNum(yyextra->lineNr));
+ addOutput(yyscanner," ");
+ return FALSE;
+}
+
static bool handleIf(yyscan_t yyscanner,const QCString &, const StringVector &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
static void addIline(yyscan_t yyscanner,int lineNr)
{
+ char cmd[20];
+ sprintf(cmd,"\\iline %d ",lineNr);
+ addOutput(yyscanner, cmd);
+}
+
+static void addIlineBreak(yyscan_t yyscanner,int lineNr)
+{
char cmd[30];
sprintf(cmd,"\\iline %d \\ilinebr ",lineNr);
addOutput(yyscanner, cmd);
// found some brief description and not just whitespace
yyextra->briefEndsAtDot=FALSE;
setOutput(yyscanner,OutputDoc);
+ addIline(yyscanner,yyextra->lineNr);
if (addToOutput) addOutput(yyscanner,yytext);
}
+ else
+ {
+ int saveLineNr = yyextra->lineNr;
+ lineCount(yyscanner);
+ yyextra->current->briefLine = yyextra->lineNr;
+ yyextra->lineNr = saveLineNr;
+ }
}
static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
//#endif
//! @}
-enum class DoxyfileSettings { Full, Compressed, CompressedNoEnv };
class TextStream;
/** \brief Public function to deal with the configuration file. */
namespace Config
{
+ enum class CompareMode { Full, Compressed, CompressedNoEnv };
+
/*! Initialize configuration variables to their default value */
void init();
/*! Writes a the differences between the current configuration and the
* template configuration to stream \a t.
*/
- void compareDoxyfile(TextStream &t, DoxyfileSettings diffList);
+ void compareDoxyfile(TextStream &t, CompareMode compareMode);
/*! Writes a the used settings of the current configuration as XML format
* to stream \a t.
* \returns TRUE if successful, FALSE if the file could not be
* opened or read.
*/
- bool parse(const QCString &fileName,bool update=FALSE);
+ bool parse(const QCString &fileName,bool update=FALSE, CompareMode compareMode = CompareMode::Full);
/*! Post processed the parsed data. Replaces raw string values by the actual values.
* and replaces environment variables.
* \param clearHeaderAndFooter set to TRUE when writing header and footer templates.
- * \param compare signals if we in Doxyfile compare (`-x` or `-x_noenv`) mode are or not.
- * Influences setting of the default value and replacement of environment variables.
+ * \param compareMode signals if we in Doxyfile compare (`-x` or `-x_noenv`) mode are or not.
+ * Influences setting of the default value and replacement of environment variables and CMake type replacement variables.
*/
- void postProcess(bool clearHeaderAndFooter, DoxyfileSettings compare = DoxyfileSettings::Full);
+ void postProcess(bool clearHeaderAndFooter, CompareMode compareMode = CompareMode::Full);
/*! Check the validity of the parsed options and correct or warn the user where needed.
* \param quiet setting for the QUIET option (can have been overruled by means of a command line option)
doxygen -x [configFile]
\endverbatim
Use doxygen to compare the used configuration file with the template configuration file
-without replacing the environment variables:
+without replacing the environment variables or CMake type replacement variables:
\verbatim
doxygen -x_noenv [configFile]
\endverbatim
]]>
</docs>
</option>
- <option type='bool' id='CASE_SENSE_NAMES' defval='0' altdefval='Portable::fileSystemIsCaseSensitive()'>
+ <option type='enum' id='CASE_SENSE_NAMES' defval='SYSTEM'>
<docs>
<![CDATA[
With the correct setting of option \c CASE_SENSE_NAMES doxygen will better be able to match the
whereas on Linux or other Unix flavors it should typically be set to \c YES.
]]>
</docs>
+ <value name="SYSTEM" />
+ <value name="NO"/>
+ <value name="YES" />
</option>
<option type='bool' id='HIDE_SCOPE_NAMES' defval='0'>
<docs>
Doxygen uses `libiconv` (or the `iconv` built into `libc`) for the transcoding.
See <a href="https://www.gnu.org/software/libiconv/">the libiconv documentation</a> for
the list of possible encodings.
+
+ \sa \ref cfg_input_file_encoding "INPUT_FILE_ENCODING"
+]]>
+ </docs>
+ </option>
+ <option type='list' id='INPUT_FILE_ENCODING' format='string'>
+ <docs>
+<![CDATA[
+ This tag can be used to specify the character encoding of the source files that doxygen
+ parses
+ The \c INPUT_FILE_ENCODING tag can be used to specify character encoding on a per file pattern
+ basis. Doxygen will compare the file name with each pattern and apply the
+ encoding instead of the default \ref cfg_input_encoding "INPUT_ENCODING") if there is a match.
+ The character encodings are a list of the form: pattern=encoding (like `*.php=ISO-8859-1`).
+
+ See cfg_input_encoding "INPUT_ENCODING" for further information on supported encodings.
]]>
</docs>
</option>
<br>Note that the filter must not add or remove lines; it is applied before the
code is scanned, but not when the output code is generated. If lines are added
or removed, the anchors will not be placed correctly.
+ <br>Note that doxygen will use the data processed and written to standard output for further processing,
+ therefore nothing else, like debug statements or used commands (so in case of a Windows batch file
+ always use `@echo OFF`), should be written to standard output.
<br>Note that for custom extensions or not directly supported extensions you also
need to set \ref cfg_extension_mapping "EXTENSION_MAPPING" for the extension
otherwise the files are not properly processed by doxygen.<br>
]]>
</docs>
</option>
+ <option type='int' id='FORTRAN_COMMENT_AFTER' defval='72' minval='7' maxval='10000'>
+ <docs>
+<![CDATA[
+ The Fortran standard specifies that for fixed formatted Fortran code all characters
+ from position 72 are to be considered as comment. A common extension is to allow
+ longer lines before the automatic comment starts.
+ The setting \c FORTRAN_COMMENT_AFTER will also make it possible that longer lines can be
+ processed before the automatic comment starts.
+]]>
+ </docs>
+ </option>
</group>
<group name='Source_Browser' docs='Configuration options related to source browsing'>
<option type='bool' id='SOURCE_BROWSER' defval='0'>
]]>
</docs>
</option>
+ <option type='enum' id='HTML_COLORSTYLE' defval='AUTO_LIGHT' depends='GENERATE_HTML'>
+ <docs>
+<![CDATA[
+ The \c HTML_COLORSTYLE tag can be used to specify if the generated HTML output should be rendered with
+ a dark or light theme. Default setting \c AUTO_LIGHT enables light output unless the user preference is dark output.
+ Other options are \c DARK to always use dark mode, \c LIGHT to always use light mode, \c AUTO_DARK to default to dark
+ mode unless the user prefers light mode, and \c TOGGLE to let the user toggle between dark and light mode via a button.
+]]>
+ </docs>
+ <value name="LIGHT" desc="Always generate light output."/>
+ <value name="DARK" desc="Always generate dark output."/>
+ <value name="AUTO_LIGHT" desc="Automatically set the mode according to the user preference, use light mode if no preference is set (the default)."/>
+ <value name="AUTO_DARK" desc="Automatically set the mode according to the user preference, use dark mode if no preference is set."/>
+ <value name="TOGGLE" desc="Allow to user to switch between light and dark mode via a button."/>
+ </option>
<option type='int' id='HTML_COLORSTYLE_HUE' minval='0' maxval='359' defval='220' depends='GENERATE_HTML'>
<docs>
<![CDATA[
]]>
</docs>
</option>
- <option type='bool' id='FORMULA_TRANSPARENT' defval='1' depends='GENERATE_HTML'>
- <docs>
-<![CDATA[
- Use the \c FORMULA_TRANSPARENT tag to determine whether or not the images
- generated for formulas are transparent PNGs. Transparent PNGs are
- not supported properly for IE 6.0, but are supported on all modern browsers.
- <br>Note that when changing this option you need to delete any `form_*.png` files
- in the HTML output directory before the changes have effect.
-]]>
- </docs>
- </option>
<option type='string' id='FORMULA_MACROFILE' format='file' defval=''>
<docs>
<![CDATA[
<dt><code>$papertype</code><dd>will be replaced by the paper type as set in
\ref cfg_paper_type "PAPER_TYPE" and the word "paper" is directly appended to it to have
a correct \f$\mbox{\LaTeX}\f$ paper type.
+ <dt><code>$langISO</code><dd>will be replaced by the ISO language name.
<dt><code>$languagesupport</code><dd>will be replaced by an output language dependent setting
of packages required for translating terms of the specified language.
<dt><code>$latexfontenc</code><dd>will be replaced by an output language dependent setting
]]>
</docs>
</option>
- <option type='string' id='DOT_FONTNAME' format='string' defval='Helvetica' depends='HAVE_DOT'>
+ <option type='string' id='DOT_COMMON_ATTR' format='string' depends='HAVE_DOT'
+ defval='fontname=Helvetica,fontsize=10'>
<docs>
<![CDATA[
+ \c DOT_COMMON_ATTR is common attributes for nodes, edges and labels of subgraphs.
When you want a differently looking font in the dot files that doxygen generates
- you can specify the font name
- using \c DOT_FONTNAME. You need to make sure dot is able to find the font,
- which can be done by putting it in a standard location or by setting the
- \c DOTFONTPATH environment variable or by setting \ref cfg_dot_fontpath "DOT_FONTPATH" to the
+ you can specify fontname, fontcolor and fontsize attributes.
+ For details please see
+ <a href=https://graphviz.org/doc/info/attrs.html>Node, Edge and Graph Attributes specification</a>
+ You need to make sure dot is able to find the font,
+ which can be done by putting it in a standard location
+ or by setting the \c DOTFONTPATH environment variable or by
+ setting \ref cfg_dot_fontpath "DOT_FONTPATH" to the
directory containing the font.
+ Default graphviz fontsize is 14.
+]]>
+ </docs>
+ </option>
+ <option type='string' id='DOT_EDGE_ATTR' format='string' depends='HAVE_DOT'
+ defval='labelfontname=Helvetica,labelfontsize=10'>
+ <docs>
+<![CDATA[
+ \c DOT_EDGE_ATTR is concatenated with \ref cfg_dot_common_attr "DOT_COMMON_ATTR".
+ For elegant style you can add 'arrowhead=open, arrowtail=open, arrowsize=0.5'.
+ <a href=https://graphviz.org/doc/info/arrows.html>Complete documentation about arrows shapes.</a>
]]>
</docs>
</option>
- <option type='int' id='DOT_FONTSIZE' minval='4' maxval='24' defval='10' depends='HAVE_DOT'>
+ <option type='string' id='DOT_NODE_ATTR' format='string' depends='HAVE_DOT'
+ defval='shape=box,height=0.2,width=0.4'>
<docs>
<![CDATA[
- The \c DOT_FONTSIZE tag can be used to set the size (in points) of the font of dot graphs.
+ \c DOT_NODE_ATTR is concatenated with \ref cfg_dot_common_attr "DOT_COMMON_ATTR".
+ For view without boxes around nodes set 'shape=plain' or 'shape=plaintext'
+ <a href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
]]>
</docs>
</option>
<option type='string' id='DOT_FONTPATH' format='dir' defval='' depends='HAVE_DOT'>
<docs>
<![CDATA[
- By default doxygen will tell \c dot to use the default font as specified with \ref cfg_dot_fontname "DOT_FONTNAME".
- If you specify a
- different font using \ref cfg_dot_fontname "DOT_FONTNAME" you can set the path where \c dot
- can find it using this tag.
+ You can set the path where \c dot can find font specified with
+ fontname in \ref cfg_dot_common_attr "DOT_COMMON_ATTR" and others dot attributes.
]]>
</docs>
</option>
]]>
</docs>
</option>
- <option type='bool' id='DOT_TRANSPARENT' defval='0' depends='HAVE_DOT'>
- <docs>
-<![CDATA[
- Set the \c DOT_TRANSPARENT tag to \c YES to generate images with a transparent
- background. This is disabled by default, because dot on Windows does not
- seem to support this out of the box.
- <br>
- Warning: Depending on the platform used,
- enabling this option may lead to badly anti-aliased labels on the edges of
- a graph (i.e. they become hard to read).
-]]>
- </docs>
- </option>
<option type='bool' id='DOT_MULTI_TARGETS' defval='0' depends='HAVE_DOT'>
<docs>
<![CDATA[
<option type='obsolete' orgtype='bool' id='RTF_SOURCE_CODE'/>
<option type='obsolete' orgtype='bool' id='LATEX_SOURCE_CODE'/>
<option type='obsolete' orgtype='bool' id='CLASS_DIAGRAMS'/>
+ <option type='obsolete' orgtype='int' id='DOT_FONTSIZE'/>
+ <option type='obsolete' orgtype='string' id='DOT_FONTNAME'/>
+ <option type='obsolete' orgtype='bool' id='FORMULA_TRANSPARENT'/>
+ <option type='obsolete' orgtype='bool' id='DOT_TRANSPARENT'/>
</group>
</doxygenconfig>
-#!/usr/bin/python
+#!/usr/bin/env python
# python script to generate configoptions.cpp and config.doc from config.xml
#
# Copyright (C) 1997-2015 by Dimitri van Heesch.
"default value", defval)
elif (type == 'bool'):
if (node.hasAttribute('altdefval')):
- doc += "<br/>%s: %s." % ("The default value is", "system dependent")
+ doc += "<br/>%s: %s." % ("The default value is", "system dependent")
else:
- doc += "<br/>%s: %s." % ("The default value is", "YES" if (defval == "1") else "NO")
+ doc += "<br/>%s: %s." % ("The default value is", "YES" if (defval == "1") else "NO")
elif (type == 'list'):
if format == 'string':
values = collectValues(node)
#include "containers.h"
#include "qcstring.h"
+#include "config.h"
class TextStream;
protected:
virtual void writeTemplate(TextStream &t,bool sl,bool upd) = 0;
- virtual void compareDoxyfile(TextStream &t) = 0;
+ virtual void compareDoxyfile(TextStream &t,Config::CompareMode compareMode) = 0;
virtual void writeXMLDoxyfile(TextStream &t) = 0;
- virtual void convertStrToVal() {}
+ virtual void convertStrToVal(Config::CompareMode compareMode) {}
virtual void emptyValueToDefault() {}
virtual void substEnvVars() = 0;
virtual void init() {}
void writeBoolValue(TextStream &t,bool v,bool initSpace = true);
void writeIntValue(TextStream &t,int i,bool initSpace = true);
- void writeStringValue(TextStream &t,const QCString &s,bool initSpace = true);
+ void writeStringValue(TextStream &t,const QCString &s,bool initSpace = true,bool wasQuoted = false);
void writeStringList(TextStream &t,const StringVector &l);
QCString m_spaces;
m_doc = doc;
}
void writeTemplate(TextStream &t, bool sl,bool);
- void compareDoxyfile(TextStream &) {}
+ void compareDoxyfile(TextStream &,Config::CompareMode) {}
void writeXMLDoxyfile(TextStream &) {}
void substEnvVars() {}
};
StringVector getDefault() { return m_defaultValue; }
void emptyValueToDefault() { if (m_value.empty() && !m_defaultValue.empty()) m_value=m_defaultValue; };
void writeTemplate(TextStream &t,bool sl,bool);
- void compareDoxyfile(TextStream &t);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
void writeXMLDoxyfile(TextStream &t);
void substEnvVars();
void init() { m_value = m_defaultValue; }
QCString *valueRef() { return &m_value; }
void substEnvVars();
void writeTemplate(TextStream &t,bool sl,bool);
- void convertStrToVal();
- void compareDoxyfile(TextStream &t);
+ void convertStrToVal(Config::CompareMode compareMode);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
void writeXMLDoxyfile(TextStream &t);
void init() { m_value = m_defValue; }
bool isDefault() { return m_value == m_defValue; }
void setDefaultValue(const char *v) { m_defValue = v; }
QCString *valueRef() { return &m_value; }
void writeTemplate(TextStream &t,bool sl,bool);
- void compareDoxyfile(TextStream &t);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
void writeXMLDoxyfile(TextStream &t);
void substEnvVars();
void init() { m_value = m_defValue; }
int *valueRef() { return &m_value; }
int minVal() const { return m_minVal; }
int maxVal() const { return m_maxVal; }
- void convertStrToVal();
+ void convertStrToVal(Config::CompareMode compareMode);
void substEnvVars();
void writeTemplate(TextStream &t,bool sl,bool upd);
- void compareDoxyfile(TextStream &t);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
void writeXMLDoxyfile(TextStream &t);
void init() { m_value = m_defValue; }
bool isDefault() { return m_value == m_defValue; }
}
QCString *valueStringRef() { return &m_valueString; }
bool *valueRef() { return &m_value; }
- void convertStrToVal();
+ void convertStrToVal(Config::CompareMode compareMode);
void substEnvVars();
void setValueString(const QCString &v) { m_valueString = v; }
void writeTemplate(TextStream &t,bool sl,bool upd);
- void compareDoxyfile(TextStream &t);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
void writeXMLDoxyfile(TextStream &t);
void init() { m_value = m_defValue; }
bool isDefault() { return m_value == m_defValue; }
ConfigObsolete(const char *name,OptionType orgType) : ConfigOption(O_Obsolete), m_orgType(orgType)
{ m_name = name; }
void writeTemplate(TextStream &,bool,bool);
- void compareDoxyfile(TextStream &) {}
+ void compareDoxyfile(TextStream &,Config::CompareMode) {}
void writeXMLDoxyfile(TextStream &) {}
void substEnvVars() {}
OptionType orgType() const { return m_orgType; }
ConfigDisabled(const char *name) : ConfigOption(O_Disabled)
{ m_name = name; }
void writeTemplate(TextStream &,bool,bool);
- void compareDoxyfile(TextStream &) {}
+ void compareDoxyfile(TextStream &,Config::CompareMode) {}
void writeXMLDoxyfile(TextStream &) {}
void substEnvVars() {}
};
/*! Writes a the differences between the current configuration and the
* template configuration to stream \a t.
*/
- void compareDoxyfile(TextStream &t);
+ void compareDoxyfile(TextStream &t,Config::CompareMode compareMode);
/*! Writes a the used settings of the current configuration as XML format
* to stream \a t.
/*! Converts the string values read from the configuration file
* to real values for non-string type options (like int, and bools)
*/
- void convertStrToVal();
+ void convertStrToVal(Config::CompareMode compareMode);
/*! Sets default value in case value is empty
*/
{
m_userComment += u;
}
+ /*! Append replacement string
+ */
+ void appendStoreRepl(const QCString &u)
+ {
+ m_storeRepl += u;
+ }
/*! Take the user start comment and reset it internally
* \returns user start comment
*/
m_userComment.resize(0);
return substitute(result,"\r","");
}
+ /*! Take the replacement string
+ * \returns the replacement string
+ */
+ QCString takeStoreRepl()
+ {
+ QCString result=m_storeRepl;
+ m_storeRepl.resize(0);
+ return substitute(result,"\r","");
+ }
protected:
static ConfigImpl *m_instance;
QCString m_startComment;
QCString m_userComment;
+ QCString m_storeRepl;
bool m_initialized;
QCString m_header;
};
#include <algorithm>
#include <fstream>
#include <iostream>
+#include <iomanip>
+#include "config.h"
#include "regex.h"
#include "configimpl.h"
#include "version.h"
#include "fileinfo.h"
#include "dir.h"
#include "textstream.h"
+#include "dotattributes.h"
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
const QCString &fromEncoding,
const QCString &toEncoding);
+static bool containsEnvVar(QCString &str);
+
#define MAX_INCLUDE_DEPTH 10
#define YY_NEVER_INTERACTIVE 1
t << i;
}
-void ConfigOption::writeStringValue(TextStream &t,const QCString &s,bool initSpace)
+void ConfigOption::writeStringValue(TextStream &t,const QCString &s,bool initSpace, bool wasQuoted)
{
char c;
- bool needsEscaping=FALSE;
+ bool needsEscaping=wasQuoted;
// convert the string back to it original g_encoding
QCString se = configStringRecode(s,"UTF-8",m_encoding);
if (se.isEmpty()) return;
QCString s=p.c_str();
if (!first)
t << " ";
- writeStringValue(t,s);
+ bool wasQuoted = ((s.at(0)=='"') && (s.at(s.length()-1)=='"'));
+ if (wasQuoted)
+ {
+ s = s.mid(1,s.length()-2);
+ }
+ writeStringValue(t,s,true,wasQuoted);
first=FALSE;
}
}
ConfigImpl *ConfigImpl::m_instance = 0;
-void ConfigInt::convertStrToVal()
+void ConfigInt::convertStrToVal(Config::CompareMode compareMode)
{
if (!m_valueString.isEmpty())
{
+ if (compareMode == Config::CompareMode::CompressedNoEnv)
+ {
+ if (containsEnvVar(m_valueString)) return;
+ }
bool ok;
int val = m_valueString.toInt(&ok);
if (!ok || val<m_minVal || val>m_maxVal)
return false;
}
-void ConfigBool::convertStrToVal()
+void ConfigBool::convertStrToVal(Config::CompareMode compareMode)
{
if (!m_valueString.stripWhiteSpace().isEmpty())
{
+ if (compareMode == Config::CompareMode::CompressedNoEnv)
+ {
+ if (containsEnvVar(m_valueString)) return;
+ }
bool isValid=false;
bool b = convertStringToBool(m_valueString,isValid);
if (isValid)
}
}
-void ConfigEnum::convertStrToVal()
+void ConfigEnum::convertStrToVal(Config::CompareMode compareMode)
{
if (m_value.isEmpty())
{
m_value = m_defValue;
return;
}
+ if (compareMode == Config::CompareMode::CompressedNoEnv)
+ {
+ if (containsEnvVar(m_value)) return;
+ }
QCString val = m_value.stripWhiteSpace().lower();
for (const auto &s : m_valueRange)
{
return true;
}
-void ConfigList::compareDoxyfile(TextStream &t)
+void ConfigList::compareDoxyfile(TextStream &t, Config::CompareMode)
{
if (!isDefault()) writeTemplate(t,TRUE,TRUE);
}
t << "\n";
}
-void ConfigEnum::compareDoxyfile(TextStream &t)
+void ConfigEnum::compareDoxyfile(TextStream &t, Config::CompareMode)
{
if (!isDefault()) writeTemplate(t,TRUE,TRUE);
}
t << "\n";
}
-void ConfigString::compareDoxyfile(TextStream &t)
+void ConfigString::compareDoxyfile(TextStream &t, Config::CompareMode)
{
if (!isDefault()) writeTemplate(t,TRUE,TRUE);
}
t << "\n";
}
-void ConfigInt::compareDoxyfile(TextStream &t)
+void ConfigInt::compareDoxyfile(TextStream &t,Config::CompareMode compareMode)
{
- if (!isDefault()) writeTemplate(t,TRUE,TRUE);
+ if (!isDefault() || ((compareMode == Config::CompareMode::CompressedNoEnv) && containsEnvVar(m_valueString))) writeTemplate(t,TRUE,TRUE);
}
void ConfigInt::writeXMLDoxyfile(TextStream &t)
t << "\n";
}
-void ConfigBool::compareDoxyfile(TextStream &t)
+void ConfigBool::compareDoxyfile(TextStream &t,Config::CompareMode compareMode)
{
- if (!isDefault()) writeTemplate(t,TRUE,TRUE);
+ if (!isDefault() || ((compareMode == Config::CompareMode::CompressedNoEnv) && containsEnvVar(m_valueString))) writeTemplate(t,TRUE,TRUE);
}
void ConfigBool::writeXMLDoxyfile(TextStream &t)
static bool g_configUpdate = FALSE;
static QCString g_encoding;
static ConfigImpl *g_config;
+static Config::CompareMode g_compareMode = Config::CompareMode::Full;
+static QCString g_localStoreRepl;
+#define unput_string(yytext,yyleng) do { for (int i=(int)yyleng-1;i>=0;i--) unput(yytext[i]); } while(0)
/* -----------------------------------------------------------------
*/
#undef YY_INPUT
void *cd = portable_iconv_open(outputEncoding.data(),inputEncoding.data());
if (cd==reinterpret_cast<void *>(-1))
{
- config_term("Error: unsupported character conversion: '%s'->'%s'\n",
+ config_term("Error: unsupported character conversion: '%s'->'%s'\n"
+ "Check the 'DOXYFILE_ENCODING' setting in the config file!\n",
qPrint(inputEncoding),qPrint(outputEncoding));
}
size_t iLeft=inputSize;
return s;
}
+static void processStoreRepl(QCString &storeReplStr)
+{
+ // strip leading and trailing whitespace
+ QCString s = stripComment(storeReplStr.stripWhiteSpace());
+ // recode the string
+ storeReplStr=configStringRecode(s,g_encoding,"UTF-8");
+}
+
static void processString()
{
// strip leading and trailing whitespace
int l = s.length();
QCString elemStr;
+ bool wasQuote=false;
// helper to push elemStr to the list and clear it
- auto addElem = [&elemStr]()
+ auto addElem = [&elemStr,&wasQuote]()
{
if (!elemStr.isEmpty())
{
QCString e = configStringRecode(elemStr,g_encoding,"UTF-8");
//printf("Processed list element '%s'\n",qPrint(e));
+ if (wasQuote) e = "\""+e+"\"";
+ wasQuote = false;
g_list->push_back(e.str());
elemStr="";
}
};
bool needsSeparator=false;
- int insideQuote=false;
+ bool insideQuote=false;
bool warned=false;
for (int i=0;i<l;i++)
{
if (!insideQuote)
{
insideQuote=true;
+ wasQuote=true;
}
else // this quote ends an element
{
%}
%option noyywrap
-%option nounput
+
+REGEX_a [a-z_A-Z\x80-\xFF]
+REGEX_w [a-z_A-Z0-9\x80-\xFF]
%x Start
%x SkipInvalid
%x GetString
%x GetStrList
%x Include
+%x StoreRepl
%%
<Start>"@INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); g_list=&g_includePathList; g_list->clear(); g_listStr=""; }
/* include a g_config file */
<Start>"@INCLUDE"[ \t]*"=" { BEGIN(Include);}
+<Start>"$("{REGEX_a}({REGEX_w}|[.-])*")" | // e.g. $(HOME)
+<Start>"$("{REGEX_a}({REGEX_w}|[.-])*"("{REGEX_a}({REGEX_w}|[.-])*"))" { // e.g. $(PROGRAMFILES(X86))
+ g_localStoreRepl = yytext;
+ if (g_compareMode == Config::CompareMode::CompressedNoEnv) // the x_noenv
+ {
+ BEGIN(StoreRepl);
+ }
+ else
+ {
+ substEnvVarsInString(g_localStoreRepl);
+ unput_string(g_localStoreRepl.data(),g_localStoreRepl.length());
+ }
+ }
+<Start>"@"{REGEX_a}{REGEX_w}*"@" {
+ if (g_compareMode == Config::CompareMode::CompressedNoEnv) // the x_noenv
+ {
+ g_localStoreRepl = yytext;
+ BEGIN(StoreRepl);
+ }
+ else
+ {
+ config_warn("ignoring unknown '%s' at line %d, file %s\n",
+ yytext,g_yyLineNr,qPrint(g_yyFileName));
+ }
+ }
<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") {
readIncludeFile(configStringRecode(yytext,g_encoding,"UTF-8"));
BEGIN(Start);
<Start>[a-z_A-Z0-9]+ { config_warn("ignoring unknown tag '%s' at line %d, file %s\n",yytext,g_yyLineNr,qPrint(g_yyFileName)); }
/*-------------- GetString ---------------*/
+<StoreRepl>\n {
+ g_localStoreRepl += yytext;
+ processStoreRepl(g_localStoreRepl);
+ g_config->appendStoreRepl(g_localStoreRepl + "\n");
+ g_localStoreRepl.resize(0);
+ g_yyLineNr++; // end of string
+ BEGIN(Start);
+ }
+<StoreRepl>\\[ \r\t]*\n { g_yyLineNr++; // line continuation
+ g_localStoreRepl += yytext;
+ }
+<StoreRepl>"\\" { // escape character
+ g_localStoreRepl += yytext;
+ }
+<StoreRepl>[^\n\\]+ { // string part without escape characters
+ g_localStoreRepl += yytext;
+ }
+ /*-------------- GetString ---------------*/
+
<GetString>\n { processString();
g_yyLineNr++; // end of string
BEGIN(Start);
}
}
-void ConfigImpl::compareDoxyfile(TextStream &t)
+void ConfigImpl::compareDoxyfile(TextStream &t,Config::CompareMode compareMode)
{
t << "# Difference with default Doxyfile " << getFullVersion();
t << "\n";
for (const auto &option : m_options)
{
option->m_userComment = "";
- option->compareDoxyfile(t);
+ option->compareDoxyfile(t,compareMode);
+ }
+ if (!m_storeRepl.isEmpty())
+ {
+ t << "\n";
+ t << takeStoreRepl() << "\n";
}
}
t << "</doxyfile>\n";
}
-void ConfigImpl::convertStrToVal()
+void ConfigImpl::convertStrToVal(Config::CompareMode compareMode)
{
for (const auto &option : m_options)
{
- option->convertStrToVal();
+ option->convertStrToVal(compareMode);
}
}
void ConfigImpl::emptyValueToDefault()
}
}
+static const reg::Ex reEnvVar(R"(\$\((\a[\w.-]*)\))"); // e.g. $(HOME)
+static const reg::Ex reEnvVarExt(R"(\$\((\a[\w.-]*\(\a[\w.-]*\))\))"); // e.g. $(PROGRAMFILES(X86))
+static const reg::Ex reEnvVarCMake(R"(@\a\w*@)"); // CMake type replacement
+
+static bool containsEnvVar(QCString &str)
+{
+ reg::Match m;
+ std::string s = str.str();
+ return reg::search(s,m,reEnvVar) || reg::search(s,m,reEnvVarExt) || reg::search(s,m,reEnvVarCMake);
+}
+
static void substEnvVarsInString(QCString &str)
{
if (str.isEmpty()) return;
return result;
};
- // match e.g. re1=$(HOME) but also re2=$(PROGRAMFILES(X86))
- static const reg::Ex re1(R"(\$\((\a[\w.-]*)\))");
- static const reg::Ex re2(R"(\$\((\a[\w.-]*\(\a[\w.-]*\))\))");
- str = QCString(replace(replace(str.str(),re1),re2)).stripWhiteSpace();
+ str = QCString(replace(replace(str.str(),reEnvVar),reEnvVarExt)).stripWhiteSpace();
}
static void substEnvVarsInStrList(StringVector &sl)
for (const auto &s : sl)
{
QCString result = s.c_str();
- bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1) || (result.find('"')!=-1);
+ bool wasQuoted = ((result.at(0)=='"') && (result.at(result.length()-1)=='"'));
+ if (wasQuoted)
+ {
+ result = result.mid(1,result.length()-2);
+ }
+ else
+ {
+ wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1) || (result.find('"')!=-1);
+ }
// here we strip the quote again
substEnvVarsInString(result);
return true;
}
-#include "config.h"
void Config::init()
{
}
}
+static void adjustColorStyleSetting(const char *depOption)
+{
+ auto updateColorStyle = [&depOption](HTML_COLORSTYLE_t curStyle,HTML_COLORSTYLE_t newStyle)
+ {
+ err("When enabling '%s' the 'HTML_COLORSTYLE' option should be either 'LIGHT' or 'DARK' but has value '%s'. I'll adjust it for you to '%s'.\n",
+ depOption,
+ qPrint(HTML_COLORSTYLE_enum2str(curStyle)),
+ qPrint(HTML_COLORSTYLE_enum2str(newStyle)));
+ Config_updateEnum(HTML_COLORSTYLE,newStyle);
+ };
+ auto colorStyle = Config_getEnum(HTML_COLORSTYLE);
+ switch (colorStyle)
+ {
+ case HTML_COLORSTYLE_t::LIGHT:
+ case HTML_COLORSTYLE_t::DARK:
+ // no adjustment needed
+ break;
+ case HTML_COLORSTYLE_t::AUTO_LIGHT:
+ case HTML_COLORSTYLE_t::TOGGLE:
+ updateColorStyle(colorStyle,HTML_COLORSTYLE_t::LIGHT);
+ break;
+ case HTML_COLORSTYLE_t::AUTO_DARK:
+ updateColorStyle(colorStyle,HTML_COLORSTYLE_t::DARK);
+ break;
+ }
+}
+
void Config::checkAndCorrect(bool quiet, const bool check)
{
for (const auto &alias : aliasList)
{
// match aliases of the form re1='name=' and re2='name{2} ='
- static const reg::Ex re1(R"(^\a\w*\s*=)");
- static const reg::Ex re2(R"(^\a\w*{\d+}\s*=)");
+ static const reg::Ex re1(R"(^\a[\w-]*\s*=)");
+ static const reg::Ex re2(R"(^\a[\w-]*{\d+}\s*=)");
if (!reg::search(alias,re1) && !reg::search(alias,re2))
{
err("Illegal ALIASES format '%s'. Use \"name=value\" or \"name{n}=value\", where n is the number of arguments\n",
checkList(Config_getList(FILTER_SOURCE_PATTERNS),"FILTER_SOURCE_PATTERNS",FALSE,FALSE);
//------------------------
+ // check INPUT_FILE_ENCODING
+ checkList(Config_getList(INPUT_FILE_ENCODING),"INPUT_FILE_ENCODING",TRUE,TRUE);
+
+ //------------------------
// check TAGFILES
checkList(Config_getList(TAGFILES),"TAGFILES",FALSE,TRUE);
adjustBoolSetting( depOption, "HTML_DYNAMIC_MENUS", false );
adjustBoolSetting( depOption, "HTML_DYNAMIC_SECTIONS",false );
adjustStringSetting(depOption, "HTML_FILE_EXTENSION", ".html");
+ adjustColorStyleSetting(depOption);
}
// check for settings that are inconsistent with having INLINE_GROUPED_CLASSES enabled
}
//------------------------
- // correct DOT_FONTNAME if needed
- QCString dotFontName=Config_getString(DOT_FONTNAME);
- if (dotFontName=="FreeSans" || dotFontName=="FreeSans.ttf")
- {
- warn_uncond("doxygen no longer ships with the FreeSans font.\n"
- " You may want to clear or change DOT_FONTNAME.\n"
- " Otherwise you run the risk that the wrong font is being used for dot generated graphs.\n");
- }
-
- //------------------------
// clip number of threads
int dotNumThreads = Config_getInt(DOT_NUM_THREADS);
if (dotNumThreads>32)
}
+static void updateAttribute(DotAttributes& attr, QCString name, ConfigObsolete* value)
+{
+ if (value==0 || value->valueStringRef()->isEmpty()) return;
+ attr.updateValue(name,*value->valueStringRef());
+}
+
void Config::updateObsolete()
{
//------------------------
}
}
}
+
+ auto fontname = dynamic_cast<ConfigObsolete*>(ConfigImpl::instance()->get("DOT_FONTNAME"));
+ auto fontsize = dynamic_cast<ConfigObsolete*>(ConfigImpl::instance()->get("DOT_FONTSIZE"));
+
+ // correct DOT_FONTNAME if needed
+ if (fontname &&
+ (*fontname->valueStringRef() == "FreeSans"
+ || *fontname->valueStringRef() == "FreeSans.ttf"))
+ warn_uncond("doxygen no longer ships with the FreeSans font.\n"
+ " You may want to clear or change DOT_FONTNAME.\n"
+ " Otherwise you run the risk that the wrong font is being used for dot generated graphs.\n");
+
+ QCString& commonAttrStr = *dynamic_cast<ConfigString*>(ConfigImpl::instance()->get("DOT_COMMON_ATTR"))->valueRef();
+ DotAttributes commonAttr(commonAttrStr);
+ updateAttribute(commonAttr, "fontname", fontname);
+ updateAttribute(commonAttr, "fontsize", fontsize);
+ commonAttrStr = commonAttr.str();
+
+ QCString& edgeAttrStr = *dynamic_cast<ConfigString*>(ConfigImpl::instance()->get("DOT_EDGE_ATTR"))->valueRef();
+ DotAttributes edgeAttr(edgeAttrStr);
+ updateAttribute(edgeAttr, "labelfontname", fontname);
+ updateAttribute(edgeAttr, "labelfontsize", fontsize);
+ edgeAttrStr = edgeAttr.str();
}
void Config::writeTemplate(TextStream &t,bool shortList,bool update)
ConfigImpl::instance()->writeTemplate(t,shortList,update);
}
-void Config::compareDoxyfile(TextStream &t,DoxyfileSettings diffList)
+void Config::compareDoxyfile(TextStream &t,Config::CompareMode compareMode)
{
- postProcess(FALSE, diffList);
- ConfigImpl::instance()->compareDoxyfile(t);
+ postProcess(FALSE, compareMode);
+ ConfigImpl::instance()->compareDoxyfile(t, compareMode);
}
void Config::writeXMLDoxyfile(TextStream &t)
ConfigImpl::instance()->writeXMLDoxyfile(t);
}
-bool Config::parse(const QCString &fileName,bool update)
+bool Config::parse(const QCString &fileName,bool update, Config::CompareMode compareMode)
{
+ g_compareMode = compareMode;
bool parseRes = ConfigImpl::instance()->parse(fileName,update);
if (!parseRes) return parseRes;
return parseRes;
}
-void Config::postProcess(bool clearHeaderAndFooter, DoxyfileSettings diffList)
+void Config::postProcess(bool clearHeaderAndFooter, Config::CompareMode compareMode)
{
- if (diffList != DoxyfileSettings::CompressedNoEnv) ConfigImpl::instance()->substituteEnvironmentVars();
- if (diffList == DoxyfileSettings::Full)ConfigImpl::instance()->emptyValueToDefault();
- ConfigImpl::instance()->convertStrToVal();
+ auto configInst = ConfigImpl::instance();
+ if (compareMode != CompareMode::CompressedNoEnv) configInst->substituteEnvironmentVars();
+ if (compareMode == CompareMode::Full) configInst->emptyValueToDefault();
+ configInst->convertStrToVal(compareMode);
// avoid bootstrapping issues when the g_config file already
// refers to the files that we are supposed to parse.
{ "classIndex", &Private::classIndex },
//%% string concepts
{ "concepts", &Private::concepts },
- //%% string conceptDefintion
+ //%% string conceptDefinition
{ "conceptDefinition", &Private::conceptDefinition },
//%% string namespaceIndex
{ "namespaceIndex", &Private::namespaceIndex },
}
else if (type==Definition::TypeClass)
{
- if (text.right(2)=="-p")
+ if (text.endsWith("-p"))
{
text = text.left(text.length()-2);
}
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <cstdlib>
+#include <chrono>
+#include <memory>
+#include <array>
+#include <functional>
+
+#include "regex.h"
+#include "datetime.h"
+#include "config.h"
+#include "portable.h"
+#include "language.h"
+#include "message.h"
+#include "growbuf.h"
+
+std::tm getCurrentDateTime()
+{
+ QCString sourceDateEpoch = Portable::getenv("SOURCE_DATE_EPOCH");
+ if (!sourceDateEpoch.isEmpty()) // see https://reproducible-builds.org/specs/source-date-epoch/
+ {
+ bool ok;
+ uint64 epoch = sourceDateEpoch.toUInt64(&ok);
+ if (!ok)
+ {
+ static bool warnedOnce=FALSE;
+ if (!warnedOnce)
+ {
+ warn_uncond("Environment variable SOURCE_DATE_EPOCH does not contain a valid number; value is '%s'\n",
+ qPrint(sourceDateEpoch));
+ warnedOnce=TRUE;
+ }
+ }
+ else // use given epoch value as current 'built' time
+ {
+ auto epoch_start = std::chrono::time_point<std::chrono::system_clock>{};
+ auto epoch_seconds = std::chrono::seconds(epoch);
+ auto build_time = epoch_start + epoch_seconds;
+ std::time_t time = std::chrono::system_clock::to_time_t(build_time);
+ return *gmtime(&time);
+ }
+ }
+
+ // return current local time
+ auto now = std::chrono::system_clock::now();
+ std::time_t time = std::chrono::system_clock::to_time_t(now);
+ return *localtime(&time);
+}
+
+QCString dateToString(bool includeTime)
+{
+ auto current = getCurrentDateTime();
+ return theTranslator->trDateTime(current.tm_year + 1900,
+ current.tm_mon + 1,
+ current.tm_mday,
+ (current.tm_wday+6)%7+1, // map: Sun=0..Sat=6 to Mon=1..Sun=7
+ current.tm_hour,
+ current.tm_min,
+ current.tm_sec,
+ includeTime);
+}
+
+QCString yearToString()
+{
+ auto current = getCurrentDateTime();
+ return QCString().setNum(current.tm_year+1900);
+}
+
+struct SpecFormat
+{
+ const reg::Ex re;
+ int count;
+ int offset;
+ int format;
+};
+
+using TMFieldAssigner = std::function< void(std::tm &,int value) >;
+
+struct DateTimeField
+{
+ TMFieldAssigner assigner;
+ int minVal;
+ int maxVal;
+ const char *name;
+};
+
+static std::array<SpecFormat,5> g_specFormats
+{{
+ // regular expression, num values, offset, format bits
+ { std::string(R"((\d+)-(\d+)-(\d+)\s*(\d+):(\d+):(\d+))"), 6, 0, SF_Date|SF_Time|SF_Seconds }, // format 13-04-2015 12:34:56
+ { std::string(R"((\d+)-(\d+)-(\d+)\s*(\d+):(\d+))"), 5, 0, SF_Date|SF_Time }, // format 13-04-2015 12:34
+ { std::string(R"((\d+)-(\d+)-(\d+))"), 3, 0, SF_Date }, // format 13-04-2015
+ { std::string(R"((\d+):(\d+):(\d+))"), 3, 3, SF_Time|SF_Seconds }, // format 12:34:56
+ { std::string(R"((\d+):(\d+))"), 2, 3, SF_Time } // format 12:34
+}};
+
+static std::array<DateTimeField,6> g_assignValues
+{{
+ // assigner, minVal, maxVal, name
+ { [](std::tm &tm,int value) { tm.tm_year = value-1900; }, 1900, 9999, "year" },
+ { [](std::tm &tm,int value) { tm.tm_mon = value-1; }, 1, 12, "month" },
+ { [](std::tm &tm,int value) { tm.tm_mday = value; }, 1, 31, "day" },
+ { [](std::tm &tm,int value) { tm.tm_hour = value; }, 0, 23, "hour" },
+ { [](std::tm &tm,int value) { tm.tm_min = value; }, 0, 59, "minute" },
+ { [](std::tm &tm,int value) { tm.tm_sec = value; }, 0, 59, "second" }
+}};
+
+static void determine_weekday( std::tm& tm )
+{
+ auto cpy = tm;
+ // there are some problems when the hr:min:sec are on 00:00:00 in determining the weekday
+ cpy.tm_hour = 12;
+ const auto as_time_t = std::mktime( &cpy ) ;
+ if (as_time_t != -1)
+ {
+ cpy = *std::localtime( &as_time_t ) ;
+ tm.tm_wday = cpy.tm_wday;
+ }
+}
+
+QCString dateTimeFromString(const QCString &spec,std::tm &dt,int &format)
+{
+ // for an empty spec field return the current date and time
+ dt = getCurrentDateTime();
+ if (spec.isEmpty())
+ {
+ format = SF_Date | SF_Time | SF_Seconds;
+ return QCString();
+ }
+
+ // find a matching pattern
+ std::string s = spec.str();
+ for (const auto &fmt : g_specFormats)
+ {
+ reg::Match m;
+ if (reg::match(s,m,fmt.re)) // match found
+ {
+ for (int i=0; i<fmt.count; i++)
+ {
+ int value = std::atoi(m[i+1].str().c_str());
+ const DateTimeField &dtf = g_assignValues[i+fmt.offset];
+ if (value<dtf.minVal || value>dtf.maxVal) // check if the value is in the expected range
+ {
+ return QCString().sprintf("value for %s is %d which is outside of the value range [%d..%d]",
+ dtf.name, value, dtf.minVal, dtf.maxVal);
+ }
+ dtf.assigner(dt,value);
+ }
+ format = fmt.format;
+ if (format&SF_Date) // if we have a date also determine the weekday
+ {
+ determine_weekday(dt);
+ }
+ return QCString();
+ }
+ }
+
+ // no matching pattern found
+ return "invalid or non representable date/time argument";
+}
+
+QCString formatDateTime(const QCString &format,const std::tm &dt,int &formatUsed)
+{
+ formatUsed = 0;
+ auto getYear = [](const std::tm &dat) { return dat.tm_year+1900; };
+ auto getMonth = [](const std::tm &dat) { return dat.tm_mon+1; };
+ auto getDay = [](const std::tm &dat) { return dat.tm_mday; };
+ auto getDayOfWeek = [](const std::tm &dat) { return (dat.tm_wday+6)%7+1; };
+ GrowBuf growBuf;
+ char c;
+ const char *p = format.data();
+ const char *fmt_zero = "%02d";
+ const char *fmt_nonzero = "%d";
+ const char *fmt_selected = 0;
+ if (p==0) return QCString();
+ while ((c=*p++))
+ {
+ char nc = *p;
+ switch (c)
+ {
+ case '%':
+ fmt_selected = nc=='-' ? fmt_nonzero : fmt_zero; // %-H produces 1 and %H produces 01
+ if (nc=='-') nc=*++p; // skip over -
+ switch (nc)
+ {
+ case '%': growBuf.addChar('%'); break;
+ case 'y': growBuf.addInt(fmt_selected,getYear(dt)%100); formatUsed|=SF_Date; break;
+ case 'Y': growBuf.addInt("%d",getYear(dt)); formatUsed|=SF_Date; break;
+ case 'm': growBuf.addInt(fmt_selected,getMonth(dt)); formatUsed|=SF_Date; break;
+ case 'b': growBuf.addStr(theTranslator->trMonth(getMonth(dt),false,false)); formatUsed|=SF_Date; break;
+ case 'B': growBuf.addStr(theTranslator->trMonth(getMonth(dt),false,true)); formatUsed|=SF_Date; break;
+ case 'd': growBuf.addInt(fmt_selected,getDay(dt)); formatUsed|=SF_Date; break;
+ case 'u': growBuf.addInt("%d",getDayOfWeek(dt)); /* Monday = 1 ... Sunday = 7 */ formatUsed|=SF_Date; break;
+ case 'w': growBuf.addInt("%d",getDayOfWeek(dt)%7); /* Sunday = 0 ... Saturday = 6 */ formatUsed|=SF_Date; break;
+ case 'a': growBuf.addStr(theTranslator->trDayOfWeek(getDayOfWeek(dt),false,false)); formatUsed|=SF_Date; break;
+ case 'A': growBuf.addStr(theTranslator->trDayOfWeek(getDayOfWeek(dt),false,true)); formatUsed|=SF_Date; break;
+ case 'H': growBuf.addInt(fmt_selected,dt.tm_hour); formatUsed|=SF_Time; break;
+ case 'I': growBuf.addInt(fmt_selected,dt.tm_hour%12); formatUsed|=SF_Time; break;
+ case 'p': growBuf.addStr(theTranslator->trDayPeriod(dt.tm_hour>=12?1:0)); formatUsed|=SF_Time; break;
+ case 'M': growBuf.addInt(fmt_selected,dt.tm_min); formatUsed|=SF_Time; break;
+ case 'S': growBuf.addInt(fmt_selected,dt.tm_sec); formatUsed|=SF_Seconds; break;
+ default:
+ growBuf.addChar(c);
+ if (*(p-1)=='-') growBuf.addChar('-');
+ growBuf.addChar(nc);
+ break;
+ }
+ p++;
+ break;
+ default:
+ growBuf.addChar(c);
+ break;
+ }
+ }
+ growBuf.addChar(0);
+ return growBuf.get();
+}
+
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DATETIME_H
+#define DATETIME_H
+
+#include <ctime>
+#include "qcstring.h"
+
+/** @brief Date and time related functions. */
+
+constexpr int SF_Date = 1<<0; //!< a date is presenting in the format string
+constexpr int SF_Time = 1<<1; //!< a time is presenting in the format string
+constexpr int SF_Seconds = 1<<2; //!< the seconds are presenting in the format string
+constexpr int SF_NumBits = 3; //!< number of bits in SF vector
+
+/** Helper function that returns the name related one of the SF bits. Used for generating warnings.
+ * @param[in] bitNumber bit value in range [0..SF_NumBits) for which to return the string value.
+ */
+constexpr const char *SF_bit2str(int bitNumber)
+{
+ constexpr const char *partNames[] = { "date", "time", "seconds" };
+ return bitNumber>=0 && bitNumber<SF_NumBits ? partNames[bitNumber] : "";
+}
+
+/** Returns the filled in std::tm for a given string representing a date and/or time.
+ *
+ * @param[in] spec The string representation of the date and/or time
+ * Possible formats:
+ * - the empty string: the current date and time is returned
+ * - `YYYY-MM-DD HH:MM:SS`: the date and time are fully specified
+ * - `YYYY-MM-DD HH:MM`: the date and time without seconds
+ * - `YYYY-MM-DD`: the date without time
+ * - `HH:MM:SS`: the time with seconds but without date
+ * - `HH:MM`: the time without seconds and without date
+ *
+ * @param[out] dt The corresponding datetime value.
+ * @param[out] format The parts that have been found in spec; a bitwise or
+ * of `SF_Date`, `SF_Time` and `SF_Seconds`.
+ * @returns An empty string if the spec has a supported format,
+ * or an error message if the format is invalid.
+ */
+QCString dateTimeFromString(const QCString &spec,std::tm &dt,int &format);
+
+
+/** Return a string representation for a given std::tm value that is formatted according to the
+ * pattern given by a format.
+ * @param[in] format the string used for format the date and time, e.g. `%Y-%m-%d`
+ * @param[in] dt the date and time value to fill in
+ * @param[out] formatUsed A bitwise OR of `SF_Date`, `SF_Time` and `SF_Seconds` representing the
+ * the types of markers found in the format string.
+ */
+QCString formatDateTime(const QCString &format,const std::tm &dt,int &formatUsed);
+
+/** Returns the filled in std::tm for the current date and time */
+std::tm getCurrentDateTime();
+
+/** Returns the current year as a string */
+QCString yearToString();
+
+#endif
{ "classes", Debug::Classes },
{ "commentcnv", Debug::CommentCnv },
{ "commentscan", Debug::CommentScan },
- { "validate", Debug::Validate },
{ "printtree", Debug::PrintTree },
{ "time", Debug::Time },
{ "extcmd", Debug::ExtCmd },
Classes = 0x00000010,
CommentCnv = 0x00000020,
CommentScan = 0x00000040,
- Validate = 0x00000080,
PrintTree = 0x00000100,
Time = 0x00000200,
ExtCmd = 0x00000400,
addTypeName(yyscanner);
yyextra->name += removeRedundantWhiteSpace(QCString(yytext));
}
+<Start>"anonymous_namespace{"[^}]+"}" { // anonymous namespace
+ if (!yyextra->scope.isEmpty())
+ {
+ yyextra->scope+=QCString("::")+yytext;
+ }
+ else
+ {
+ yyextra->scope = yytext;
+ }
+ }
<Start>([~!]{B}*)?{ID}/({B}*"["{B}*"]")* { // the []'s are for Java,
// the / was add to deal with multi-
// dimensional C++ arrays like A[][15]
yyextra->name += removeRedundantWhiteSpace(QCString(yytext));
}
<Start>{B}*"::"{B}* { // found a yyextra->scope specifier
- if (!yyextra->scope.isEmpty())
+ if (!yyextra->scope.isEmpty() && !yyextra->scope.endsWith("::"))
{
yyextra->scope+="::"+yyextra->name; // add yyextra->name to yyextra->scope
}
yyextra->name=yyextra->name.left(nb);
}
-#if 0
- {
- int l=yyextra->scope.length();
- int i=0;
- int skipCount=0;
- cl.resize(0);
- ctl.resize(0);
- for (i=0;i<l;i++)
- {
- char c=yyextra->scope.at(i);
- if (c=='<')
- skipCount++;
- else if (c=='>')
- skipCount--;
- else if (skipCount==0)
- cl+=c;
- }
- }
- cl=stripTemplateSpecifiersFromScope(removeRedundantWhiteSpace(yyextra->scope),FALSE);
- ctl.resize(0);
-#endif
-
cl=yyextra->scope;
n=removeRedundantWhiteSpace(yyextra->name);
int il,ir;
// and need to correct it to avoid seeing a nameless parameter
// "struct A" as a parameter with type "struct" and name "A".
int sv=0;
- if (a.type.left(6)=="const ") sv=6;
- else if (a.type.left(9)=="volatile ") sv=9;
+ if (a.type.startsWith("const ")) sv=6;
+ else if (a.type.startsWith("volatile ")) sv=9;
if (a.type.mid(sv)=="struct" ||
a.type.mid(sv)=="union" ||
bool varArgs = FALSE;
bool isPredefined = FALSE;
bool nonRecursive = FALSE;
+ bool expandAsDefined = FALSE;
};
/** List of all macro definitions */
#include <iterator>
#include <unordered_map>
#include <string>
-
#include <ctype.h>
-#include "md5.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
+
+#include "md5.h"
#include "regex.h"
#include "config.h"
#include "definitionimpl.h"
#include "bufstr.h"
#include "reflist.h"
#include "utf8.h"
+#include "indexlist.h"
+#include "fileinfo.h"
//-----------------------------------------------------------------------------------------
if (!vhdlOpt && index!=-1) symbolName=symbolName.mid(index+2);
if (!symbolName.isEmpty())
{
+ //printf("adding symbol %s\n",qPrint(symbolName));
Doxygen::symbolMap->add(symbolName,d);
d->_setSymbolName(symbolName);
}
QCString title = si->title();
if (title.isEmpty()) title = si->label();
- // determine if there is a next level inside this item
+ // determine if there is a next level inside this item, but be aware of the anchor and table section references.
auto it_next = std::next(it);
bool isDir = (it_next!=m_impl->sectionRefs.end()) ?
- (static_cast<int>((*it_next)->type()) > nextLevel) : FALSE;
+ (isSection((*it_next)->type()) && static_cast<int>((*it_next)->type()) > nextLevel) : FALSE;
Doxygen::indexList->addContentsItem(isDir,title,
getReference(),
m_impl->def->getOutputFileBase(),
Debug::print(Debug::FilterOutput,0,"-------------\n%s\n-------------\n",qPrint(result));
}
}
- result = transcodeCharacterStringToUTF8(result);
+ result = transcodeCharacterStringToUTF8(getEncoding(FileInfo(fileName.str())),result);
if (!result.isEmpty() && result.at(result.length()-1)!='\n') result += "\n";
//printf("readCodeFragment(%d-%d)=%s\n",startLine,endLine,qPrint(result));
return found;
else if (m_impl->def->definitionType()==Definition::TypeClass)
{
QCString name = locName;
- if (name.right(2)=="-p" /*|| name.right(2)=="-g"*/)
+ if (name.endsWith("-p"))
{
name = name.left(name.length()-2);
}
int DefinitionImpl::docLine() const
{
- return m_impl->details ? m_impl->details->line : 1;
+ return m_impl->details ? m_impl->details->line : m_impl->brief ? m_impl->brief->line : 1;
}
QCString DefinitionImpl::docFile() const
{
- return m_impl->details ? m_impl->details->file : QCString("<"+m_impl->name+">");
+ return m_impl->details ? m_impl->details->file : m_impl->brief ? m_impl->brief->file : QCString("<"+m_impl->name+">");
}
//----------------------------------------------------------------------------
#include "util.h"
#include "doxygen.h"
#include "portable.h"
-#include "index.h"
+#include "indexlist.h"
#include "classlist.h"
#include "textstream.h"
uint x,uint y,uint w,uint h,bool firstRow,
bool hasDocs,bool children=FALSE)
{
- uchar colFill = hasDocs ? (firstRow ? 0 : 2) : 7;
+ uchar colFill = hasDocs ? (firstRow ? 8 : 2) : 7;
uchar colBorder = (firstRow || !hasDocs) ? 1 : 3;
uint l = Image::stringLength(di->label());
uint mask=virtToMask(di->virtualness());
// we use classDef->name() here and not displayName() in order
// to get the name used in the inheritance relation.
QCString n = m_classDef->name();
- if (/*n.right(2)=="-g" ||*/ n.right(2)=="-p")
+ if (n.endsWith("-p"))
{
n = n.left(n.length()-2);
}
struct DirIterator::Private
{
Private() : it() {}
- Private(const std::string &path) : it(path) {}
+ Private(const std::string &path) : it(path,ec) {}
fs::directory_iterator it;
+ std::error_code ec;
mutable DirEntry current;
};
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DISPATCHER_H
+#define DISPATCHER_H
+
+#include <cstddef>
+#include <utility>
+#include <functional>
+#include <variant>
+#include <type_traits>
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// idea based on https://mpark.github.io/programming/2019/01/22/variant-visitation-v2/
+
+namespace detail
+{
+
+//! Represents an unreachable piece of code
+#ifdef __GNUC__ // GCC 4.8+, Clang, Intel and other compilers compatible with GCC (-std=c++0x or above)
+[[noreturn]] inline __attribute__((always_inline)) void unreachable() { __builtin_unreachable(); }
+#elif defined(_MSC_VER) // MSVC
+[[noreturn]] __forceinline void unreachable() { __assume(false); }
+#else // ???
+#warning "no implementation of unreachable for this compiler!"
+inline void unreachable() {}
+#endif
+
+//! generic template declaration for the Dispatcher without implementation
+template<bool valid>
+struct Dispatcher;
+
+//! specialization for the invalid case, signaling the compiler that the path is unreachable
+template<>
+struct Dispatcher<false>
+{
+ //! case corresponding with the non-existing I'th type of variant V
+ template<template<class> class W, std::size_t I, class V, class... As>
+ static constexpr void case_(V &&, As &&...) { unreachable(); }
+};
+
+//! specialization for the valid case, where `case_` invokes a specific method.
+template<>
+struct Dispatcher<true>
+{
+ //! Invokes the method of a class `X` whose method pointer type is defined by `W<X>::method`
+ //! where `X` matches the I'th type of variant `V` on the object held by `v`.
+ template<template<class> class W, std::size_t I, class V, class... As>
+ static constexpr void case_(V &&v, As &&... args) {
+ using Alt = std::variant_alternative_t<I,std::decay_t<V>>;
+ std::invoke( W<Alt>::method, std::get<I>( std::forward<V>(v) ), std::forward<As>(args)... );
+ }
+};
+
+} // namespace detail
+
+//! Invokes the method of a class `X` whose member pointer type is defined by `W<X>::method`
+//! where `X` matches the type of the object held by `v` that is stored in a variant `V`.
+//! \tparam W a template class where `W<X>::method` points to a method of class `X` one of the types of `V`.
+//! \tparam V the type of the variant
+//! \tparam As the parameter types used to invoke the method
+//! \param v a object of the variant type for which to invoke the method
+//! \param args the parameters to pass to the method
+//! \note This implementation assumes a maximum of 10 types in the variant (easy to extend though by adding more cases).
+template<template<class> class W,class V, class...As>
+static constexpr void dispatch_call(V &&v,As &&... args)
+{
+ // size holds the number of type of variant `V`
+ constexpr std::size_t size = std::variant_size_v<std::decay_t<V>>;
+ // which on a worst case maximum number of types in `V`.
+ // fills in an unreachable branch for indices equal or higher than size.
+ switch (v.index())
+ {
+#define DISPATCH_AT(n) case n: detail::Dispatcher< ((n)<size) >::template case_<W,n>(v,std::forward<As>(args)...); break;
+ DISPATCH_AT(0)
+ DISPATCH_AT(1)
+ DISPATCH_AT(2)
+ DISPATCH_AT(3)
+ DISPATCH_AT(4)
+ DISPATCH_AT(5)
+ DISPATCH_AT(6)
+ DISPATCH_AT(7)
+ DISPATCH_AT(8)
+ DISPATCH_AT(9)
+#undef DISPATCH_AT
+ }
+}
+
+#endif // DISPATCHER_H
}
pageName = fileName;
relPath = relativePathToRoot(fileName);
- if (fileName.right(4)!=".xml") fileName+=".xml";
+ if (!fileName.endsWith(".xml")) fileName+=".xml";
startPlainFile(fileName);
m_codeGen.setRelativePath(relPath);
m_codeGen.setSourceFileName(stripPath(fileName));
void DocbookGenerator::writeNonBreakableSpace(int n)
{
DB_GEN_C
- for (int i=0;i<n;i++) m_t << " ";
+ for (int i=0;i<n;i++) m_t << " ";
}
void DocbookGenerator::lineBreak(const QCString &)
{
DB_GEN_C
- m_t << "\n";
+ m_t << "<?linebreak?>";
}
void DocbookGenerator::startTypewriter()
{
{
DB_VIS_C
if (m_hide) return;
- m_t << "\n<literallayout> 
</literallayout>\n";
+ m_t << "<?linebreak?>";
// gives nicer results but gives problems as it is not allowed in <pare> and also problems with dblatex
// m_t << "\n" << "<sbr/>\n";
}
case DocStyleChange::Ins: break;
case DocStyleChange::Div: /* HTML only */ break;
case DocStyleChange::Span: /* HTML only */ break;
- case DocStyleChange::Details: /* emulation of the <details> tag */
- if (s.enable())
- {
- m_t << "\n";
- m_t << "<para>";
- }
- else
- {
- m_t << "</para>";
- m_t << "\n";
- }
- break;
case DocStyleChange::Summary: /* emulation of the <summary> tag inside a <details> tag */
- if (s.enable()) m_t << "<emphasis role=\"bold\">"; else m_t << "</emphasis>";
+ if (s.enable()) m_t << "<para><emphasis role=\"bold\">"; else m_t << "</emphasis></para>";
break;
}
}
}
else if (opt.name=="class")
{
- if (opt.value.left(13)=="markdownTable") // handle markdown generated attributes
+ if (opt.value.startsWith("markdownTable")) // handle markdown generated attributes
{
- if (opt.value.right(5)=="Right")
+ if (opt.value.endsWith("Right"))
{
m_t << " align='right'";
}
- else if (opt.value.right(4)=="Left")
+ else if (opt.value.endsWith("Left"))
{
m_t << " align='left'";
}
- else if (opt.value.right(6)=="Center")
+ else if (opt.value.endsWith("Center"))
{
m_t << " align='center'";
}
m_t << "</link>";
}
+void DocbookDocVisitor::operator()(const DocHtmlDetails &d)
+{
+DB_VIS_C
+ if (m_hide) return;
+ m_t << "\n";
+ m_t << "<para>";
+ visitChildren(d);
+ m_t << "</para>";
+ m_t << "\n";
+}
+
void DocbookDocVisitor::operator()(const DocHtmlHeader &h)
{
DB_VIS_C
void operator()(const DocHtmlCaption &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
#include "vhdldocgen.h"
#include "doctokenizer.h"
#include "plantuml.h"
+#include "language.h"
+#include "datetime.h"
// debug off
#define DBG(x) do {} while(0)
static QCString stripKnownExtensions(const QCString &text)
{
QCString result=text;
- if (result.right(4)==".tex")
+ if (result.endsWith(".tex"))
{
result=result.left(result.length()-4);
}
case DocStyleChange::Del: return "del";
case DocStyleChange::Underline: return "u";
case DocStyleChange::Ins: return "ins";
- case DocStyleChange::Details: return "details";
case DocStyleChange::Summary: return "summary";
}
return "<invalid>";
DocFormula::DocFormula(DocParser *parser,DocNodeVariant *parent,int id) : DocNode(parser,parent),
m_relPath(parser->context.relPath)
{
- QCString text = FormulaManager::instance().findFormula(id);
- if (!text.isEmpty())
+ const Formula *formula = FormulaManager::instance().findFormula(id);
+ if (formula && !formula->text().isEmpty())
{
m_id = id;
m_name.sprintf("form_%d",m_id);
- m_text = text;
+ m_text = formula->text();
}
else // wrong \_form#<n> command
{
bool ambig;
FileDef *fd = findFileDef(Doxygen::dotFileNameLinkedMap,p->name,ambig);
- if (fd==0 && p->name.right(4)!=".dot") // try with .dot extension as well
+ if (fd==0 && !p->name.endsWith(".dot")) // try with .dot extension as well
{
fd = findFileDef(Doxygen::dotFileNameLinkedMap,p->name+".dot",ambig);
}
bool ambig;
FileDef *fd = findFileDef(Doxygen::mscFileNameLinkedMap,p->name,ambig);
- if (fd==0 && p->name.right(4)!=".msc") // try with .msc extension as well
+ if (fd==0 && !p->name.endsWith(".msc")) // try with .msc extension as well
{
fd = findFileDef(Doxygen::mscFileNameLinkedMap,p->name+".msc",ambig);
}
bool ambig;
FileDef *fd = findFileDef(Doxygen::diaFileNameLinkedMap,p->name,ambig);
- if (fd==0 && p->name.right(4)!=".dia") // try with .dia extension as well
+ if (fd==0 && !p->name.endsWith(".dia")) // try with .dia extension as well
{
fd = findFileDef(Doxygen::diaFileNameLinkedMap,p->name+".dia",ambig);
}
}
//---------------------------------------------------------------------------
+int DocHtmlDetails::parse(DocNodeVariant *thisVariant)
+{
+ DBG(("DocHtmlHtmlDetails::parse() start\n"));
+ int retval=0;
+ auto ns = AutoNodeStack(parser(),thisVariant);
+
+ // parse one or more paragraphs
+ bool isFirst=TRUE;
+ DocPara *par=0;
+ do
+ {
+ auto vDocPara = children().append<DocPara>(parser(),thisVariant);
+ par = children().get_last<DocPara>();
+ if (isFirst) { par->markFirst(); isFirst=FALSE; }
+ retval=par->parse(vDocPara);
+ }
+ while (retval==TK_NEWPARA);
+ if (par) par->markLast();
+
+ DBG(("DocHtmlHtmlDetails::parse() end retval=%s\n",DocTokenizer::retvalToString(retval)));
+ return (retval==RetVal_EndHtmlDetails) ? RetVal_OK : retval;
+}
+
int DocHRef::parse(DocNodeVariant *thisVariant)
{
int retval=RetVal_OK;
return retval;
}
-void DocPara::handleIline(DocNodeVariant *)
+void DocPara::handleShowDate(DocNodeVariant *thisVariant)
{
- parser()->tokenizer.setStateIline();
+ DBG(("handleShowDate()\n"));
+ QCString fmt;
+ QCString date;
+ int tok=parser()->tokenizer.lex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after '\\%s' command",
+ qPrint("showdate"));
+ return;
+ }
+ parser()->tokenizer.setStateQuotedString();
+ tok = parser()->tokenizer.lex();
+ if (tok!=TK_WORD)
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <format> argument for command '\\showdate'");
+ parser()->tokenizer.setStatePara();
+ return;
+ }
+ fmt = parser()->context.token->name;
+
+ parser()->tokenizer.setStateShowDate();
+ tok = parser()->tokenizer.lex();
+
+ QCString specDate = parser()->context.token->name.stripWhiteSpace();
+ if (!specDate.isEmpty() && tok!=TK_WORD)
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <date_time> argument for command '\\showdate'");
+ parser()->tokenizer.setStatePara();
+ return;
+ }
+
+ std::tm dat{};
+ int specFormat=0;
+ QCString err = dateTimeFromString(specDate,dat,specFormat);
+ if (!err.isEmpty())
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"invalid <date_time> argument for command '\\showdate': %s",qPrint(err));
+ parser()->tokenizer.setStatePara();
+ return;
+ }
+
+ int usedFormat=0;
+ QCString dateTimeStr = formatDateTime(fmt,dat,usedFormat);
+
+ // warn the user if the format contains markers that are not explicitly filled in
+ for (int i=0;i<SF_NumBits;i++)
+ {
+ int bitMask = 1<<i;
+ if ((usedFormat&bitMask) && !(specFormat&bitMask)) // a part was used in the format string but its value was not specified.
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"'\\showdate' <format> parameter '%s' has %s related markers which are not specified in the <date_time> parameter '%s'. Filling in the current value for %s instead.",
+ qPrint(fmt),SF_bit2str(i),qPrint(specDate),SF_bit2str(i));
+ }
+ }
+
+ children().append<DocWord>(parser(),thisVariant,dateTimeStr);
+ parser()->tokenizer.setStatePara();
+}
+void DocPara::handleILine(DocNodeVariant *)
+{
+ DBG(("handleILine()\n"));
+ parser()->tokenizer.setStateILine();
int tok = parser()->tokenizer.lex();
if (tok!=TK_WORD)
{
parser()->tokenizer.setStatePara();
}
+void DocPara::handleIFile(DocNodeVariant *)
+{
+ DBG(("handleIFile()\n"));
+ int tok=parser()->tokenizer.lex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"expected whitespace after \\ifile command");
+ return;
+ }
+ parser()->tokenizer.setStateFile();
+ tok=parser()->tokenizer.lex();
+ parser()->tokenizer.setStatePara();
+ if (tok!=TK_WORD)
+ {
+ warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"unexpected token %s as the argument of \\ifile",
+ DocTokenizer::tokToString(tok));
+ return;
+ }
+ parser()->context.fileName = parser()->context.token->name;
+ parser()->tokenizer.setStatePara();
+}
+
+
void DocPara::handleIncludeOperator(DocNodeVariant *thisVariant,const QCString &cmdName,DocIncOperator::Type t)
{
QCString saveCmdName = cmdName;
retval = RetVal_Paragraph;
}
break;
+ case CMD_ISTARTCODE:
+ {
+ parser()->tokenizer.setStateICode();
+ retval = handleStartCode(thisVariant);
+ }
+ break;
case CMD_STARTCODE:
{
parser()->tokenizer.setStateCode();
parser()->tokenizer.setStatePara();
}
break;
+ case CMD_IVERBATIM:
case CMD_VERBATIM:
{
- parser()->tokenizer.setStateVerbatim();
+ if (cmdId == CMD_VERBATIM)
+ {
+ parser()->tokenizer.setStateVerbatim();
+ }
+ else
+ {
+ parser()->tokenizer.setStateIVerbatim();
+ }
retval = parser()->tokenizer.lex();
children().append<DocVerbatim>(parser(),thisVariant,parser()->context.context,parser()->context.token->verb,DocVerbatim::Verbatim,parser()->context.isExample,parser()->context.exampleName);
if (retval==0) warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"verbatim section ended without end marker");
case CMD_ENDPARBLOCK:
retval=RetVal_EndParBlock;
break;
+ case CMD_ENDICODE:
case CMD_ENDCODE:
case CMD_ENDHTMLONLY:
case CMD_ENDMANONLY:
case CMD_ENDDBONLY:
case CMD_ENDLINK:
case CMD_ENDVERBATIM:
+ case CMD_ENDIVERBATIM:
case CMD_ENDILITERAL:
case CMD_ENDDOT:
case CMD_ENDMSC:
case CMD_INHERITDOC:
handleInheritDoc(thisVariant);
break;
+ case CMD_SHOWDATE:
+ handleShowDate(thisVariant);
+ break;
case CMD_ILINE:
- handleIline(thisVariant);
+ handleILine(thisVariant);
+ break;
+ case CMD_IFILE:
+ handleIFile(thisVariant);
break;
default:
// we should not get here!
int retval=RetVal_OK;
int tagId = Mappers::htmlTagMapper->map(tagName);
if (parser()->context.token->emptyTag && !(tagId&XML_CmdMask) &&
- tagId!=HTML_UNKNOWN && tagId!=HTML_IMG && tagId!=HTML_BR && tagId!=HTML_HR && tagId!=HTML_P)
+ tagId!=HTML_UNKNOWN && tagId!=HTML_IMG && tagId!=HTML_BR && tagId!=HTML_HR && tagId!=HTML_P
+ && tagId!=HTML_DIV && tagId!=HTML_SPAN)
{
warn_doc_error(parser()->context.fileName,parser()->tokenizer.getLineNr(),"HTML tag ('<%s/>') may not use the 'empty tag' XHTML syntax.",
qPrint(tagName));
case HTML_INS:
if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Ins,tagName,&parser()->context.token->attribs);
break;
- case HTML_DETAILS:
- if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Details,tagName,&parser()->context.token->attribs);
- break;
case HTML_CODE:
if (parser()->context.token->emptyTag) break;
if (/*getLanguageFromFileName(parser()->context.fileName)==SrcLangExt_CSharp ||*/ parser()->context.xmlComment)
if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Italic,tagName,&parser()->context.token->attribs);
break;
case HTML_DIV:
- if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Div,tagName,&parser()->context.token->attribs);
+ parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Div,tagName,&parser()->context.token->attribs);
+ if (parser()->context.token->emptyTag) parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Div,tagName);
break;
case HTML_SPAN:
- if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Span,tagName,&parser()->context.token->attribs);
+ parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Span,tagName,&parser()->context.token->attribs);
+ if (parser()->context.token->emptyTag) parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Span,tagName);
break;
case HTML_SUB:
if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Subscript,tagName,&parser()->context.token->attribs);
parser()->handleImg(thisVariant,children(),tagHtmlAttribs);
}
break;
+ case HTML_DETAILS:
+ if (!parser()->context.token->emptyTag)
+ {
+ auto vDocHtmlDetails = children().append<DocHtmlDetails>(parser(),thisVariant,
+ tagHtmlAttribs);
+ retval=children().get_last<DocHtmlDetails>()->parse(vDocHtmlDetails);
+ }
+ break;
case HTML_BLOCKQUOTE:
if (!parser()->context.token->emptyTag)
{
break;
case XML_SUMMARY:
- if (insideDetails(parser()->context.styleStack))
+ if (insideDetails(thisVariant))
{
- if (!parser()->context.token->emptyTag) parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Summary,tagName,&parser()->context.token->attribs);
- break;
+ if (!parser()->context.token->emptyTag)
+ {
+ parser()->handleStyleEnter(thisVariant,children(),DocStyleChange::Summary,tagName,&parser()->context.token->attribs);
+ }
}
+ break;
case XML_REMARKS:
case XML_EXAMPLE:
parser()->context.xmlComment=TRUE;
// ignore </li> tags
}
break;
+ case HTML_DETAILS:
+ retval=RetVal_EndHtmlDetails;
+ break;
case HTML_BLOCKQUOTE:
retval=RetVal_EndBlockQuote;
break;
case HTML_INS:
parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Ins,tagName);
break;
- case HTML_DETAILS:
- parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Details,tagName);
- break;
case HTML_CODE:
parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Code,tagName);
break;
//children().push_back(std::make_unique<DocStyleChange>(this,parser()->context.nodeStack.size(),DocStyleChange::Bold,FALSE));
break;
case XML_SUMMARY:
- if (insideDetails(parser()->context.styleStack))
+ if (insideDetails(thisVariant))
{
parser()->handleStyleLeave(thisVariant,children(),DocStyleChange::Summary,tagName);
- break;
}
+ break;
case XML_REMARKS:
case XML_PARA:
case XML_VALUE:
// and whitespace after certain constructs
!holds_one_of_alternatives<DocHtmlDescList, DocHtmlTable, DocHtmlList, DocSimpleSect,
DocAutoList, DocSimpleList, DocHtmlHeader, DocHtmlBlockQuote,
- DocParamSect, DocXRefItem>(children().back())
+ DocParamSect, DocHtmlDetails, DocXRefItem>(children().back())
)
)
{
// so a new simple section will be started at this level.
// This is the same as unputting the last read token and continuing.
parser()->context.token->name = parser()->context.token->simpleSectName;
- if (parser()->context.token->name.left(4)=="rcs:") // RCS section
+ if (parser()->context.token->name.startsWith("rcs:")) // RCS section
{
parser()->context.token->name = parser()->context.token->name.mid(4);
parser()->context.token->text = parser()->context.token->simpleSectText;
// so a new simple section will be started at this level.
// This is the same as unputting the last read token and continuing.
parser()->context.token->name = parser()->context.token->simpleSectName;
- if (parser()->context.token->name.left(4)=="rcs:") // RCS section
+ if (parser()->context.token->name.startsWith("rcs:")) // RCS section
{
parser()->context.token->name = parser()->context.token->name.mid(4);
parser()->context.token->text = parser()->context.token->simpleSectText;
DBG(("DocRoot::parse() end\n"));
}
-static QCString extractCopyDocId(const char *data, uint &j, uint len)
-{
- uint s=j;
- int round=0;
- bool insideDQuote=FALSE;
- bool insideSQuote=FALSE;
- bool found=FALSE;
- while (j<len && !found)
- {
- if (!insideSQuote && !insideDQuote)
- {
- switch (data[j])
- {
- case '(': round++; break;
- case ')': round--; break;
- case '"': insideDQuote=TRUE; break;
- case '\'': insideSQuote=TRUE; break;
- case ' ': // fall through
- case '\t': // fall through
- case '\n':
- found=(round==0);
- break;
- }
- }
- else if (insideSQuote) // look for single quote end
- {
- if (data[j]=='\'' && (j==0 || data[j]!='\\'))
- {
- insideSQuote=FALSE;
- }
- }
- else if (insideDQuote) // look for double quote end
- {
- if (data[j]=='"' && (j==0 || data[j]!='\\'))
- {
- insideDQuote=FALSE;
- }
- }
- if (!found) j++;
- }
- if (qstrncmp(data+j," const",6)==0)
- {
- j+=6;
- }
- else if (qstrncmp(data+j," volatile",9)==0)
- {
- j+=9;
- }
- uint e=j;
- if (j>0 && data[j-1]=='.') { e--; } // do not include punctuation added by Definition::_setBriefDescription()
- QCString id(data+s,e-s);
- //printf("extractCopyDocId='%s' input='%s'\n",qPrint(id),&data[s]);
- return id;
-}
-
-// macro to check if the input starts with a specific command.
-// note that data[i] should point to the start of the command (\ or @ character)
-// and the sizeof(str) returns the size of str including the '\0' terminator;
-// a fact we abuse to skip over the start of the command character.
-#define CHECK_FOR_COMMAND(str,action) \
- do if ((i+sizeof(str)<len) && qstrncmp(data+i+1,str,sizeof(str)-1)==0) \
- { j=i+sizeof(str); action; } while(0)
-
-static uint isCopyBriefOrDetailsCmd(const char *data, uint i,uint len,bool &brief)
-{
- uint j=0;
- if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
- {
- CHECK_FOR_COMMAND("copybrief",brief=TRUE); // @copybrief or \copybrief
- CHECK_FOR_COMMAND("copydetails",brief=FALSE); // @copydetails or \copydetails
- }
- return j;
-}
-
-static uint isVerbatimSection(const char *data,uint i,uint len,QCString &endMarker)
-{
- uint j=0;
- if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
- {
- CHECK_FOR_COMMAND("dot",endMarker="enddot");
- CHECK_FOR_COMMAND("code",endMarker="endcode");
- CHECK_FOR_COMMAND("msc",endMarker="endmsc");
- CHECK_FOR_COMMAND("verbatim",endMarker="endverbatim");
- CHECK_FOR_COMMAND("iliteral",endMarker="endiliteral");
- CHECK_FOR_COMMAND("latexonly",endMarker="endlatexonly");
- CHECK_FOR_COMMAND("htmlonly",endMarker="endhtmlonly");
- CHECK_FOR_COMMAND("xmlonly",endMarker="endxmlonly");
- CHECK_FOR_COMMAND("rtfonly",endMarker="endrtfonly");
- CHECK_FOR_COMMAND("manonly",endMarker="endmanonly");
- CHECK_FOR_COMMAND("docbookonly",endMarker="enddocbookonly");
- CHECK_FOR_COMMAND("startuml",endMarker="enduml");
- }
- //printf("isVerbatimSection(%s)=%d)\n",qPrint(QCString(&data[i]).left(10)),j);
- return j;
-}
-
-static uint skipToEndMarker(const char *data,uint i,uint len,const QCString &endMarker)
-{
- while (i<len)
- {
- if ((data[i]=='@' || data[i]=='\\') && // start of command character
- (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
- {
- if (i+endMarker.length()+1<=len && qstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
- {
- return i+endMarker.length()+1;
- }
- }
- i++;
- }
- // oops no endmarker found...
- return i<len ? i+1 : len;
-}
-
-QCString DocParser::processCopyDoc(const char *data,uint &len)
-{
- //printf("processCopyDoc start '%s'\n",data);
- GrowBuf buf;
- uint i=0;
- while (i<len)
- {
- char c = data[i];
- if (c=='@' || c=='\\') // look for a command
- {
- bool isBrief=TRUE;
- uint j=isCopyBriefOrDetailsCmd(data,i,len,isBrief);
- if (j>0)
- {
- // skip whitespace
- while (j<len && (data[j]==' ' || data[j]=='\t')) j++;
- // extract the argument
- QCString id = extractCopyDocId(data,j,len);
- const Definition *def = 0;
- QCString doc,brief;
- //printf("resolving docs='%s'\n",qPrint(id));
- if (findDocsForMemberOrCompound(id,&doc,&brief,&def))
- {
- //printf("found it def=%p brief='%s' doc='%s' isBrief=%d\n",def,qPrint(brief),qPrint(doc),isBrief);
- auto it = std::find(context.copyStack.begin(),context.copyStack.end(),def);
- if (it==context.copyStack.end()) // definition not parsed earlier
- {
- context.copyStack.push_back(def);
- if (isBrief)
- {
- uint l=static_cast<uint>(brief.length());
- buf.addStr(processCopyDoc(brief.data(),l));
- }
- else
- {
- uint l=static_cast<uint>(doc.length());
- buf.addStr(processCopyDoc(doc.data(),l));
- }
- context.copyStack.pop_back();
- }
- else
- {
- warn_doc_error(context.fileName,tokenizer.getLineNr(),
- "Found recursive @copy%s or @copydoc relation for argument '%s'.\n",
- isBrief?"brief":"details",qPrint(id));
- }
- }
- else
- {
- warn_doc_error(context.fileName,tokenizer.getLineNr(),
- "@copy%s or @copydoc target '%s' not found", isBrief?"brief":"details",
- qPrint(id));
- }
- // skip over command
- i=j;
- }
- else
- {
- QCString endMarker;
- uint k = isVerbatimSection(data,i,len,endMarker);
- if (k>0)
- {
- uint orgPos = i;
- i=skipToEndMarker(data,k,len,endMarker);
- buf.addStr(data+orgPos,i-orgPos);
- }
- else
- {
- buf.addChar(c);
- i++;
- }
- }
- }
- else // not a command, just copy
- {
- buf.addChar(c);
- i++;
- }
- }
- len = static_cast<uint>(buf.getPos());
- buf.addChar(0);
- return buf.get();
-}
-
/* 35 */ DN(DocSecRefList) DN_SEP DN(DocInternal) DN_SEP DN(DocParBlock) DN_SEP DN(DocSimpleList) DN_SEP DN(DocHtmlList) DN_SEP \
/* 40 */ DN(DocSimpleSect) DN_SEP DN(DocSimpleSectSep) DN_SEP DN(DocParamSect) DN_SEP DN(DocPara) DN_SEP DN(DocParamList) DN_SEP \
/* 45 */ DN(DocSimpleListItem) DN_SEP DN(DocHtmlListItem) DN_SEP DN(DocHtmlDescData) DN_SEP DN(DocHtmlCell) DN_SEP DN(DocHtmlCaption) DN_SEP \
-/* 50 */ DN(DocHtmlRow) DN_SEP DN(DocHtmlTable) DN_SEP DN(DocHtmlBlockQuote) DN_SEP DN(DocText) DN_SEP DN(DocRoot) \
+/* 50 */ DN(DocHtmlRow) DN_SEP DN(DocHtmlTable) DN_SEP DN(DocHtmlBlockQuote) DN_SEP DN(DocText) DN_SEP DN(DocRoot) DN_SEP \
+/* 55 */ DN(DocHtmlDetails) \
// forward declarations
#define DN(x) class x;
#undef DN_SEP
// define a variant type
-using DocNodeVariant = std::variant<
#define DN(x) x
#define DN_SEP ,
+using DocNodeVariant = std::variant<
DOC_NODES
+>;
#undef DN
#undef DN_SEP
->;
// getter functions to return the name of a doc node type
#define DN(x) constexpr const char *docNodeName(const x &n) { return #x; }
Del = (1<<12),
Ins = (1<<13),
S = (1<<14),
- Details = (1<<15),
Summary = (1<<16),
Cite = (1<<17)
};
QCString m_file;
};
+/** Node Html details */
+class DocHtmlDetails : public DocCompoundNode
+{
+ public:
+ DocHtmlDetails(DocParser *parser,DocNodeVariant *parent,const HtmlAttribList &attribs) :
+ DocCompoundNode(parser,parent), m_attribs(attribs) {}
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ int parse(DocNodeVariant*);
+
+ private:
+ HtmlAttribList m_attribs;
+};
+
/** Node Html heading */
class DocHtmlHeader : public DocCompoundNode
{
void handleSection(DocNodeVariant *thisVariant,const QCString &cmdName);
void handleInheritDoc(DocNodeVariant *thisVariant);
void handleVhdlFlow(DocNodeVariant *thisVariant);
- void handleIline(DocNodeVariant *thisVariant);
+ void handleILine(DocNodeVariant *thisVariant);
+ void handleIFile(DocNodeVariant *thisVariant);
+ void handleShowDate(DocNodeVariant *thisVariant);
int handleStartCode(DocNodeVariant *thisVariant);
int handleHtmlHeader(DocNodeVariant *thisVariant,const HtmlAttribList &tagHtmlAttribs,int level);
return std::get_if<T>(&back());
}
-/// ---------------- Debug helpers -------------------------------
+// ---------------- Debug helpers -------------------------------
-inline const char *docNodeName(const DocNodeVariant &v)
-{
#define DN(x) #x
#define DN_SEP ,
+inline const char *docNodeName(const DocNodeVariant &v)
+{
static const char *table[] = { DOC_NODES };
-#undef DN
-#undef DN_SEP
return table[v.index()];
}
+#undef DN
+#undef DN_SEP
inline void dumpDocNodeSizes()
{
#include "portable.h"
#include "printdocvisitor.h"
#include "util.h"
+#include "indexlist.h"
// debug off
#define DBG(x) do {} while(0)
}
if (type==DocImage::Latex && Config_getBool(USE_PDFLATEX) &&
- fd->name().right(4)==".eps"
+ fd->name().endsWith(".eps")
)
{ // we have an .eps image in pdflatex mode => convert it to a pdf.
QCString outputDir = Config_getString(LATEX_OUTPUT);
else
{
result=fileName;
- if (result.left(5)!="http:" && result.left(6)!="https:" && doWarn)
+ if (!result.startsWith("http:") && !result.startsWith("https:") && doWarn)
{
warn_doc_error(context.fileName,tokenizer.getLineNr(),
"image file %s is not found in IMAGE_PATH: "
if (lang==SrcLangExt_Fortran) argName=argName.lower();
argName=argName.stripWhiteSpace();
//printf("argName='%s' aName=%s\n",qPrint(argName),qPrint(aName));
- if (argName.right(3)=="...") argName=argName.left(argName.length()-3);
+ if (argName.endsWith("...")) argName=argName.left(argName.length()-3);
if (aName==argName)
{
context.paramsFound.insert(aName.str());
if (lang==SrcLangExt_Fortran) argName = argName.lower();
argName=argName.stripWhiteSpace();
QCString aName = argName;
- if (argName.right(3)=="...") argName=argName.left(argName.length()-3);
+ if (argName.endsWith("...")) argName=argName.left(argName.length()-3);
if (lang==SrcLangExt_Python && (argName=="self" || argName=="cls"))
{
// allow undocumented self / cls parameter for Python
qPrint(substitute(errMsg,"%","%%")));
}
}
+ else
+ {
+ if (!context.paramsFound.size() && Config_getBool(WARN_IF_DOC_ERROR))
+ {
+ warn_doc_error(context.memberDef->docFile(),
+ context.memberDef->docLine(),
+ "%s",
+ qPrint(context.memberDef->qualifiedName() +
+ " has @param documentation sections but no arguments"));
+ }
+ }
}
}
}
else // normal non-linkable word
{
- if (context.token->name.left(1)=="#" || context.token->name.left(2)=="::")
+ if (context.token->name.startsWith("#") || context.token->name.startsWith("::"))
{
warn_doc_error(context.fileName,tokenizer.getLineNr(),"explicit link request to '%s' could not be resolved",qPrint(name));
children.append<DocWord>(this,parent,context.token->name);
// special case: no title, but we do have a size indicator
break;
}
+ else if (tok==TK_HTMLTAG)
+ {
+ tokenizer.unputString(context.token->name);
+ break;
+ }
if (!defaultHandleToken(parent,tok,children))
{
errorHandleDefaultToken(parent,tok,children,Mappers::cmdMapper->find(cmd));
}
while (tok==TK_WHITESPACE || tok==TK_WORD) // there are values following the title
{
- if(tok == TK_WORD)
+ if (tok==TK_WORD)
{
if (context.token->name=="width=" || context.token->name=="height=")
{
}
else
{
+ tokenizer.unputString(context.token->name);
warn_doc_error(context.fileName,tokenizer.getLineNr(),"Unknown option '%s' after \\%s command, expected 'width' or 'height'",
qPrint(context.token->name), qPrint(Mappers::cmdMapper->find(cmd)));
break;
}
tok=tokenizer.lex();
+ // if we found something we did not expect, push it back to the stream
+ // so it can still be processed
+ if (tok==TK_COMMAND_AT || tok==TK_COMMAND_BS)
+ {
+ tokenizer.unputString(context.token->name);
+ tokenizer.unputString(tok==TK_COMMAND_AT ? "@" : "\\");
+ }
+ else if (tok==TK_SYMBOL || tok==TK_HTMLTAG)
+ {
+ tokenizer.unputString(context.token->name);
+ }
}
tokenizer.setStatePara();
handleStyleLeave(parent,children,DocStyleChange::Ins,tokenName);
}
break;
- case HTML_DETAILS:
- if (!context.token->endTag)
- {
- handleStyleEnter(parent,children,DocStyleChange::Details,tokenName,&context.token->attribs);
- }
- else
- {
- handleStyleLeave(parent,children,DocStyleChange::Details,tokenName);
- }
- break;
case HTML_CODE:
case XML_C:
if (!context.token->endTag)
//---------------------------------------------------------------------------
+static QCString extractCopyDocId(const char *data, uint &j, uint len)
+{
+ uint s=j;
+ int round=0;
+ bool insideDQuote=FALSE;
+ bool insideSQuote=FALSE;
+ bool found=FALSE;
+ while (j<len && !found)
+ {
+ if (!insideSQuote && !insideDQuote)
+ {
+ switch (data[j])
+ {
+ case '(': round++; break;
+ case ')': round--; break;
+ case '"': insideDQuote=TRUE; break;
+ case '\'': insideSQuote=TRUE; break;
+ case ' ': // fall through
+ case '\t': // fall through
+ case '\n':
+ found=(round==0);
+ break;
+ }
+ }
+ else if (insideSQuote) // look for single quote end
+ {
+ if (data[j]=='\'' && (j==0 || data[j]!='\\'))
+ {
+ insideSQuote=FALSE;
+ }
+ }
+ else if (insideDQuote) // look for double quote end
+ {
+ if (data[j]=='"' && (j==0 || data[j]!='\\'))
+ {
+ insideDQuote=FALSE;
+ }
+ }
+ if (!found) j++;
+ }
+ if (qstrncmp(data+j," const",6)==0)
+ {
+ j+=6;
+ }
+ else if (qstrncmp(data+j," volatile",9)==0)
+ {
+ j+=9;
+ }
+ uint e=j;
+ if (j>0 && data[j-1]=='.') { e--; } // do not include punctuation added by Definition::_setBriefDescription()
+ QCString id(data+s,e-s);
+ //printf("extractCopyDocId='%s' input='%s'\n",qPrint(id),&data[s]);
+ return id;
+}
+
+// macro to check if the input starts with a specific command.
+// note that data[i] should point to the start of the command (\ or @ character)
+// and the sizeof(str) returns the size of str including the '\0' terminator;
+// a fact we abuse to skip over the start of the command character.
+#define CHECK_FOR_COMMAND(str,action) \
+ do if ((i+sizeof(str)<len) && qstrncmp(data+i+1,str,sizeof(str)-1)==0) \
+ { j=i+sizeof(str); action; } while(0)
+
+static uint isCopyBriefOrDetailsCmd(const char *data, uint i,uint len,bool &brief)
+{
+ uint j=0;
+ if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
+ {
+ CHECK_FOR_COMMAND("copybrief",brief=TRUE); // @copybrief or \copybrief
+ CHECK_FOR_COMMAND("copydetails",brief=FALSE); // @copydetails or \copydetails
+ }
+ return j;
+}
+
+static uint isVerbatimSection(const char *data,uint i,uint len,QCString &endMarker)
+{
+ uint j=0;
+ if (i==0 || (data[i-1]!='@' && data[i-1]!='\\')) // not an escaped command
+ {
+ CHECK_FOR_COMMAND("dot",endMarker="enddot");
+ CHECK_FOR_COMMAND("icode",endMarker="endicode");
+ CHECK_FOR_COMMAND("code",endMarker="endcode");
+ CHECK_FOR_COMMAND("msc",endMarker="endmsc");
+ CHECK_FOR_COMMAND("iverbatim",endMarker="endiverbatim");
+ CHECK_FOR_COMMAND("verbatim",endMarker="endverbatim");
+ CHECK_FOR_COMMAND("iliteral",endMarker="endiliteral");
+ CHECK_FOR_COMMAND("latexonly",endMarker="endlatexonly");
+ CHECK_FOR_COMMAND("htmlonly",endMarker="endhtmlonly");
+ CHECK_FOR_COMMAND("xmlonly",endMarker="endxmlonly");
+ CHECK_FOR_COMMAND("rtfonly",endMarker="endrtfonly");
+ CHECK_FOR_COMMAND("manonly",endMarker="endmanonly");
+ CHECK_FOR_COMMAND("docbookonly",endMarker="enddocbookonly");
+ CHECK_FOR_COMMAND("startuml",endMarker="enduml");
+ }
+ //printf("isVerbatimSection(%s)=%d)\n",qPrint(QCString(&data[i]).left(10)),j);
+ return j;
+}
+
+static uint skipToEndMarker(const char *data,uint i,uint len,const QCString &endMarker)
+{
+ while (i<len)
+ {
+ if ((data[i]=='@' || data[i]=='\\') && // start of command character
+ (i==0 || (data[i-1]!='@' && data[i-1]!='\\'))) // that is not escaped
+ {
+ if (i+endMarker.length()+1<=len && qstrncmp(data+i+1,endMarker.data(),endMarker.length())==0)
+ {
+ return i+endMarker.length()+1;
+ }
+ }
+ i++;
+ }
+ // oops no endmarker found...
+ return i<len ? i+1 : len;
+}
+
+
+QCString DocParser::processCopyDoc(const char *data,uint &len)
+{
+ //printf("processCopyDoc start '%s'\n",data);
+ GrowBuf buf;
+ uint i=0;
+ int lineNr = tokenizer.getLineNr();
+ while (i<len)
+ {
+ char c = data[i];
+ if (c=='@' || c=='\\') // look for a command
+ {
+ bool isBrief=TRUE;
+ uint j=isCopyBriefOrDetailsCmd(data,i,len,isBrief);
+ if (j>0)
+ {
+ // skip whitespace
+ while (j<len && (data[j]==' ' || data[j]=='\t')) j++;
+ // extract the argument
+ QCString id = extractCopyDocId(data,j,len);
+ const Definition *def = 0;
+ QCString doc,brief;
+ //printf("resolving docs='%s'\n",qPrint(id));
+ if (findDocsForMemberOrCompound(id,&doc,&brief,&def))
+ {
+ //printf("found it def=%p brief='%s' doc='%s' isBrief=%d\n",def,qPrint(brief),qPrint(doc),isBrief);
+ auto it = std::find(context.copyStack.begin(),context.copyStack.end(),def);
+ if (it==context.copyStack.end()) // definition not parsed earlier
+ {
+ QCString orgFileName = context.fileName;
+ context.copyStack.push_back(def);
+ if (isBrief)
+ {
+ buf.addStr("\\ifile \""+QCString(def->briefFile())+"\" ");
+ buf.addStr("\\iline "+QCString().setNum(def->briefLine())+" ");
+ uint l=static_cast<uint>(brief.length());
+ buf.addStr(processCopyDoc(brief.data(),l));
+ }
+ else
+ {
+ buf.addStr("\\ifile \""+QCString(def->docFile())+"\" ");
+ buf.addStr("\\iline "+QCString().setNum(def->docLine())+" ");
+ uint l=static_cast<uint>(doc.length());
+ buf.addStr(processCopyDoc(doc.data(),l));
+ }
+ context.copyStack.pop_back();
+ buf.addStr("\\ifile \""+context.fileName+"\" ");
+ buf.addStr("\\iline "+QCString().setNum(lineNr)+" ");
+ }
+ else
+ {
+ warn_doc_error(context.fileName,tokenizer.getLineNr(),
+ "Found recursive @copy%s or @copydoc relation for argument '%s'.\n",
+ isBrief?"brief":"details",qPrint(id));
+ }
+ }
+ else
+ {
+ warn_doc_error(context.fileName,tokenizer.getLineNr(),
+ "@copy%s or @copydoc target '%s' not found", isBrief?"brief":"details",
+ qPrint(id));
+ }
+ // skip over command
+ i=j;
+ }
+ else
+ {
+ QCString endMarker;
+ uint k = isVerbatimSection(data,i,len,endMarker);
+ if (k>0)
+ {
+ uint orgPos = i;
+ i=skipToEndMarker(data,k,len,endMarker);
+ buf.addStr(data+orgPos,i-orgPos);
+ // TODO: adjust lineNr
+ }
+ else
+ {
+ buf.addChar(c);
+ i++;
+ }
+ }
+ }
+ else // not a command, just copy
+ {
+ buf.addChar(c);
+ i++;
+ lineNr += (c=='\n') ? 1 : 0;
+ }
+ }
+ len = static_cast<uint>(buf.getPos());
+ buf.addChar(0);
+ return buf.get();
+}
+
+
+//---------------------------------------------------------------------------
+
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf,
const QCString &fileName,int startLine,
const Definition *ctx,const MemberDef *md,
const Definition *d,
const QCString &fileName);
-
#endif
//---------------------------------------------------------------------------
-inline bool insideDetails(DocStyleChangeStack styleStack)
+inline bool insideDetails(const DocNodeVariant *n)
{
- for (auto i : styleStack)
+ while (n)
{
- if (std::get<DocStyleChange>(*i).style() == DocStyleChange::Details) return true;
+ if (std::holds_alternative<DocHtmlDetails>(*n)) return TRUE;
+ n=parent(n);
}
- return false;
+ return FALSE;
}
};
-DocSets::DocSets() : p(std::make_unique<Private>())
-{
-}
-
-DocSets::~DocSets()
-{
-}
+DocSets::DocSets() : p(std::make_unique<Private>()) {}
+DocSets::~DocSets() = default;
+DocSets::DocSets(DocSets &&) = default;
void DocSets::initialize()
{
{
if (md && (md->isObjCMethod() || md->isObjCProperty()))
lang="occ"; // Objective C/C++
- else if (fd && fd->name().right(2).lower()==".c")
+ else if (fd && fd->name().lower().endsWith(".c"))
lang="c"; // Plain C
else if (cd==0 && nd==0)
lang="c"; // Plain C symbol outside any class or namespace
else if (cd->compoundType()==ClassDef::Protocol)
{
type="intf";
- if (scope.right(2)=="-p") scope=scope.left(scope.length()-2);
+ if (scope.endsWith("-p")) scope=scope.left(scope.length()-2);
}
else if (cd->compoundType()==ClassDef::Interface)
{
t << " <Token>\n";
t << " <TokenIdentifier>\n";
QCString name = d->name();
- if (name.right(2)=="-p") name=name.left(name.length()-2);
+ if (name.endsWith("-p")) name=name.left(name.length()-2);
t << " <Name>" << convertToXML(name) << "</Name>\n";
if (!lang.isEmpty())
{
#include <memory>
-#include "index.h"
+#include "qcstring.h"
class TextStream;
class Definition;
+class MemberDef;
/** A class that generates docset files.
*
* These files can be used to create context help
* for use within Apple's Xcode 3.0 development environment
*/
-class DocSets : public IndexIntf
+class DocSets
{
public:
DocSets();
- ~DocSets();
+ virtual ~DocSets();
+ DocSets(DocSets &&);
+
void initialize();
void finalize();
void incContentsDepth();
RetVal_EndBlockQuote = 0x10014,
RetVal_CopyDoc = 0x10015,
RetVal_EndInternal = 0x10016,
- RetVal_EndParBlock = 0x10017
+ RetVal_EndParBlock = 0x10017,
+ RetVal_EndHtmlDetails = 0x10018
};
#define TK_COMMAND_CHAR(token) ((token)==TK_COMMAND_AT ? "@" : "\\")
void pushContext();
bool popContext();
int lex();
+ void unputString(const QCString &tag);
void setStatePara();
void setStateTitle();
void setStateTitleAttrValue();
void setStateCode();
+ void setStateICode();
void setStateXmlCode();
void setStateHtmlOnly();
void setStateManOnly();
void setStateDbOnly();
void setStateRtfOnly();
void setStateVerbatim();
+ void setStateIVerbatim();
void setStateILiteral();
void setStateILiteralOpt();
void setStateDot();
void setStateOptions();
void setStateBlock();
void setStateEmoji();
- void setStateIline();
+ void setStateILine();
+ void setStateQuotedString();
+ void setStateShowDate();
private:
struct Private;
RCSID "$"("Author"|"Date"|"Header"|"Id"|"Locker"|"Log"|"Name"|"RCSfile"|"Revision"|"Source"|"State")":"[^:\n$][^\n$]*"$"
LINENR {BLANK}*[1-9][0-9]*
+SHOWDATE ([0-9]{4}"-"[0-9]{1,2}"-"[0-9]{1,2})?({WS}*[0-9]{1,2}":"[0-9]{1,2}(":"[0-9]{1,2})?)?
+
%option noyywrap
%x St_Para
%x St_TitleA
%x St_TitleV
%x St_Code
+%x St_iCode
%x St_CodeOpt
+%x St_iCodeOpt
%x St_XmlCode
%x St_HtmlOnly
%x St_HtmlOnlyOption
%x St_XmlOnly
%x St_DbOnly
%x St_Verbatim
+%x St_iVerbatim
%x St_ILiteral
%x St_ILiteralOpt
%x St_Dot
%x St_Options
%x St_Block
%x St_Emoji
-%x St_Iline
+%x St_ILine
+%x St_ShowDate
%x St_Sections
%s St_SecLabel1
%s St_SecTitle
%x St_SecSkip
+%x St_QuotedString
+%x St_QuotedContent
+
%%
<St_Para>\r /* skip carriage return */
<St_Para>^{LISTITEM} { /* list item */
yyextra->token->name = yyextra->token->name.mid(i+1,yyextra->token->name.length()-i-2);
BEGIN(St_Code);
}
+<St_iCodeOpt>{BLANK}*"{"(".")?{LABELID}"}" {
+ yyextra->token->name = yytext;
+ int i=yyextra->token->name.find('{'); /* } to keep vi happy */
+ yyextra->token->name = yyextra->token->name.mid(i+1,yyextra->token->name.length()-i-2);
+ BEGIN(St_iCode);
+ }
<St_CodeOpt>"\\ilinebr" |
<St_CodeOpt>\n |
<St_CodeOpt>. {
unput_string(yytext,yyleng);
BEGIN(St_Code);
}
+<St_iCodeOpt>"\\ilinebr" |
+<St_iCodeOpt>\n |
+<St_iCodeOpt>. {
+ unput_string(yytext,yyleng);
+ BEGIN(St_iCode);
+ }
<St_Code>{WS}*{CMD}"endcode" {
lineCount(yytext,yyleng);
return RetVal_OK;
}
+<St_iCode>{WS}*{CMD}"endicode" {
+ lineCount(yytext,yyleng);
+ return RetVal_OK;
+ }
<St_XmlCode>{WS}*"</code>" {
lineCount(yytext,yyleng);
return RetVal_OK;
}
-<St_Code,St_XmlCode>[^\\@\n<]+ |
-<St_Code,St_XmlCode>\n |
-<St_Code,St_XmlCode>. {
+<St_Code,St_iCode,St_XmlCode>[^\\@\n<]+ |
+<St_Code,St_iCode,St_XmlCode>\n |
+<St_Code,St_iCode,St_XmlCode>. {
lineCount(yytext,yyleng);
yyextra->token->verb+=yytext;
}
yyextra->token->verb=yyextra->token->verb.mid(1,yyextra->token->verb.length()-2);
return RetVal_OK;
}
-<St_Verbatim,St_ILiteral>[^\\@\n]+ |
-<St_Verbatim,St_ILiteral>\n |
-<St_Verbatim,St_ILiteral>. { /* Verbatim / javadac literal/code text */
+<St_iVerbatim>{CMD}"endiverbatim" {
+ yyextra->token->verb=stripEmptyLines(yyextra->token->verb);
+ return RetVal_OK;
+ }
+<St_Verbatim,St_iVerbatim,St_ILiteral>[^\\@\n]+ |
+<St_Verbatim,St_iVerbatim,St_ILiteral>\n |
+<St_Verbatim,St_iVerbatim,St_ILiteral>. { /* Verbatim text */
lineCount(yytext,yyleng);
yyextra->token->verb+=yytext;
}
return TK_SYMBOL;
}
<St_TitleN>{HTMLTAG} {
- lineCount(yytext,yyleng);
+ yyextra->token->name = yytext;
+ return TK_HTMLTAG;
}
<St_TitleN>\n { /* new line => end of title */
unput(*yytext);
unput(*yytext);
return 0;
}
-<St_Iline>{LINENR}/[\n\.] |
-<St_Iline>{LINENR}{BLANK} {
+<St_QuotedString>"\"" {
+ yyextra->token->name="";
+ BEGIN(St_QuotedContent);
+ }
+<St_QuotedString>(\n|"\\ilinebr") {
+ unput_string(yytext,yyleng);
+ return 0;
+ }
+<St_QuotedString>. {
+ unput(*yytext);
+ return 0;
+ }
+<St_QuotedContent>"\"" {
+ return TK_WORD;
+ }
+<St_QuotedContent>. {
+ yyextra->token->name+=yytext;
+ }
+<St_ShowDate>{WS}+{SHOWDATE} {
+ lineCount(yytext,yyleng);
+ yyextra->token->name=yytext;
+ return TK_WORD;
+ }
+<St_ShowDate>(\n|"\\ilinebr") {
+ unput_string(yytext,yyleng);
+ return 0;
+ }
+<St_ShowDate>. {
+ unput(*yytext);
+ return 0;
+ }
+<St_ILine>{LINENR}/[\n\.] |
+<St_ILine>{LINENR}{BLANK} {
bool ok = false;
int nr = QCString(yytext).toInt(&ok);
if (!ok)
}
return TK_WORD;
}
-<St_Iline>. {
+<St_ILine>. {
return 0;
}
<St_File>{FILEMASK} {
yyextra->endMarker="endverbatim";
BEGIN(St_SecSkip);
}
+<St_Sections>{CMD}"iverbatim"/[^a-z_A-Z0-9] {
+ yyextra->endMarker="endiverbatim";
+ BEGIN(St_SecSkip);
+ }
<St_Sections>{CMD}"iliteral"/[^a-z_A-Z0-9] {
yyextra->endMarker="endiliteral";
BEGIN(St_SecSkip);
yyextra->endMarker="endcode";
BEGIN(St_SecSkip);
}
+<St_Sections>{CMD}"icode"/[^a-z_A-Z0-9] {
+ yyextra->endMarker="endicode";
+ BEGIN(St_SecSkip);
+ }
<St_Sections>"<!--" {
yyextra->endMarker="-->";
BEGIN(St_SecSkip);
lineCount(yytext,yyleng);
yyextra->secTitle = yytext;
yyextra->secTitle = yyextra->secTitle.stripWhiteSpace();
- if (yyextra->secTitle.right(8)=="\\ilinebr")
+ if (yyextra->secTitle.endsWith("\\ilinebr"))
{
yyextra->secTitle.left(yyextra->secTitle.length()-8);
}
return doctokenizerYYlex(p->yyscanner);
}
+void DocTokenizer::unputString(const QCString &tag)
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ unput_string(tag.data(),tag.length());
+}
+
void DocTokenizer::findSections(const QCString &input,const Definition *d,
const QCString &fileName)
{
BEGIN(St_CodeOpt);
}
+void DocTokenizer::setStateICode()
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yyextra->token->verb="";
+ yyextra->token->name="";
+ BEGIN(St_iCodeOpt);
+}
+
void DocTokenizer::setStateXmlCode()
{
yyscan_t yyscanner = p->yyscanner;
BEGIN(St_Verbatim);
}
+void DocTokenizer::setStateIVerbatim()
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yyextra->token->verb="";
+ BEGIN(St_iVerbatim);
+}
+
void DocTokenizer::setStateDot()
{
yyscan_t yyscanner = p->yyscanner;
BEGIN(St_Emoji);
}
-void DocTokenizer::setStateIline()
+void DocTokenizer::setStateILine()
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ BEGIN(St_ILine);
+}
+
+void DocTokenizer::setStateQuotedString()
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ BEGIN(St_QuotedString);
+}
+
+void DocTokenizer::setStateShowDate()
{
yyscan_t yyscanner = p->yyscanner;
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- BEGIN(St_Iline);
+ BEGIN(St_ShowDate);
}
void DocTokenizer::cleanup()
#include "message.h"
#include "doxygen.h"
#include "language.h"
-#include "index.h"
+#include "indexlist.h"
#include "dir.h"
#define MAP_CMD "cmapx"
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DOTATTRIBUTES_H
+#define DOTATTRIBUTES_H
+
+#include <map>
+#include <string>
+
+#include "regex.h"
+#include "qcstring.h"
+
+//! Class representing an attribute list of a dot graph object.
+class DotAttributes
+{
+ public:
+ //! Creates an instance of a DotAttribute list given its initial string representation
+ DotAttributes(const QCString &input) : m_input(input) {}
+
+ //! Return the string representation of the attribute list
+ QCString str() const { return m_input; }
+
+ //! update a given attribute with a new value.
+ //! If the attribute is not found a new attribute will be appended.
+ void updateValue(const QCString &key,const QCString &value)
+ {
+ // look for key\s*=
+ const reg::Ex re = key.str()+R"(\s*=)";
+ reg::Match match;
+ std::string s = m_input.str();
+ if (reg::search(s,match,re)) // replace existing attribute
+ {
+ size_t len = s.length();
+ size_t startPos = match.position()+match.length(); // position after =
+ size_t pos = startPos;
+ while (pos<len && qisspace(s[pos])) pos++;
+ if (pos<len && s[pos]=='"') // quoted value, search for end quote, ignoring escaped quotes
+ {
+ char pc=s[pos];
+ pos++; // skip over start quote
+ while (pos<len && (s[pos]!='"' || (s[pos]=='"' && pc=='\\'))) pc=s[pos++];
+ if (pos<len) pos++; // skip over end quote
+ }
+ else // unquoted value, search for attribute separator (space,comma, or semicolon)
+ {
+ while (pos<len && s[pos]!=',' && s[pos]!=';' && !qisspace(s[pos])) pos++;
+ }
+ // pos is now the position after the value, so replace the part between [start..pos) with the new value
+ m_input=m_input.left(startPos)+value.quoted()+m_input.mid(pos);
+ }
+ else // append new attribute
+ {
+ if (!m_input.isEmpty()) m_input+=",";
+ m_input+=key+"="+value.quoted();
+ }
+ }
+
+ private:
+ QCString m_input;
+};
+
+#endif // DOTATTRIBUTES_H
#include "doxygen.h"
#include "config.h"
#include "image.h"
+#include "dotnode.h"
#include <algorithm>
#include <iterator>
/** Returns a DOT node style according to the directory properties. */
static std::string getDirectoryBorderStyle(const DotDirProperty &property)
{
- std::string style;
- if (!property.isPeripheral)
- {
- style += "filled,";
- }
+ std::string style = "filled";
if (property.isOriginal)
{
- style += "bold,";
+ style += ",bold";
}
if (property.isIncomplete)
{
- style += "dashed,";
+ style += ",dashed";
}
else if (property.isTruncated && property.isOrphaned)
{
- style += "dashed,";
+ style += ",dashed";
}
return style;
}
+static TextStream &common_attributes(TextStream &t, const DirDef *const dir, const DotDirProperty &prop)
+{
+ return t <<
+ "style=\"" << getDirectoryBorderStyle(prop) << "\", "
+ "URL=\"" << addHtmlExtensionIfMissing(dir->getOutputFileBase()) << "\","
+ "tooltip=\"" << escapeTooltip(dir->briefDescriptionAsTooltip()) << "\"";
+}
+
/**
* Puts DOT code for drawing directory to stream and adds it to the list.
* @param[in,out] t stream to which the DOT code is written to
DirDefMap &directoriesInGraph,int startLevel)
{
t << " " << directory->getOutputFileBase() << " ["
- "shape=box, "
- "label=\"" << directory->shortName() << "\", "
- "style=\"" << getDirectoryBorderStyle(property) << "\", "
+ "label=\"" << DotNode::convertLabel(directory->shortName()) << "\", "
"fillcolor=\"" << getDirectoryBackgroundColor(directory->level()-startLevel) << "\", "
- "color=\"" << getDirectoryBorderColor(property) << "\", "
- "URL=\"" << addHtmlExtensionIfMissing(directory->getOutputFileBase()) << "\""
- "];\n";
+ "color=\"" << getDirectoryBorderColor(property) << "\", ";
+ common_attributes(t, directory, property)
+ << "];\n";
directoriesInGraph.insert(std::make_pair(directory->getOutputFileBase().str(), directory));
}
" graph [ "
"bgcolor=\"" << getDirectoryBackgroundColor(directory->level()-startLevel) << "\", "
"pencolor=\"" << getDirectoryBorderColor(directoryProperty) << "\", "
- "style=\"" << getDirectoryBorderStyle(directoryProperty) << "\", "
"label=\"";
if (isAncestor)
{
- outputStream << directory->shortName();
+ outputStream << DotNode::convertLabel(directory->shortName());
}
outputStream << "\", "
- "fontname=\"" << Config_getString(DOT_FONTNAME) << "\", "
- "fontsize=\"" << Config_getInt(DOT_FONTSIZE) << "\", "
- "URL=\"" << addHtmlExtensionIfMissing(directory->getOutputFileBase()) << "\""
- "]\n";
+ << Config_getString(DOT_COMMON_ATTR) << " ";
+ common_attributes(outputStream, directory, directoryProperty)
+ << "]\n";
if (!isAncestor)
{
outputStream << " " << directory->getOutputFileBase() << " [shape=plaintext, "
- "label=\"" << directory->shortName() << "\""
+ "label=\"" << DotNode::convertLabel(directory->shortName()) << "\""
"];\n";
directoriesInGraph.insert(std::make_pair(directory->getOutputFileBase().str(), directory));
}
{
t << " headhref=\"" << addHtmlExtensionIfMissing(relationName) << "\"";
}
- t << "];\n";
+ t << " color=\"steelblue1\" fontcolor=\"steelblue1\"];\n";
}
}
}
QCString result;
if (urlOnly) // for user defined dot graphs
{
- if (link.left(5)=="\\ref " || link.left(5)=="@ref ") // \ref url
+ if (link.startsWith("\\ref ") || link.startsWith("@ref ")) // \ref url
{
result=href+"=\"";
// fake ref node to resolve the url
while (getline(f,line)) // foreach line
{
QCString buf = line+'\n';
- if (buf.left(5)=="<area")
+ if (buf.startsWith("<area"))
{
QCString replBuf = replaceRef(buf,relPath,urlOnly,context);
// strip id="..." from replBuf since the id's are not needed and not unique.
bool DotFilePatcher::isSVGFile() const
{
- return m_patchFile.right(4)==".svg";
+ return m_patchFile.endsWith(".svg");
}
int DotFilePatcher::addMap(const QCString &mapFile,const QCString &relPath,
{
//printf("DotFilePatcher::run(): %s\n",qPrint(m_patchFile));
bool interactiveSVG_local = Config_getBool(INTERACTIVE_SVG);
- bool isSVGFile = m_patchFile.right(4)==".svg";
+ bool isSVGFile = m_patchFile.endsWith(".svg");
int graphId = -1;
QCString relPath;
if (isSVGFile)
#include <sstream>
#include <mutex>
+#include <regex>
#include "config.h"
#include "doxygen.h"
-#include "index.h"
+#include "indexlist.h"
#include "md5.h"
#include "message.h"
#include "util.h"
void DotGraph::writeGraphHeader(TextStream &t,const QCString &title)
{
- int fontSize = Config_getInt(DOT_FONTSIZE);
- QCString fontName = Config_getString(DOT_FONTNAME);
t << "digraph ";
if (title.isEmpty())
{
t << " // INTERACTIVE_SVG=YES\n";
}
t << " // LATEX_PDF_SIZE\n"; // write placeholder for LaTeX PDF bounding box size replacement
- if (Config_getBool(DOT_TRANSPARENT))
- {
- t << " bgcolor=\"transparent\";\n";
- }
- t << " edge [fontname=\"" << fontName << "\","
- "fontsize=\"" << fontSize << "\","
- "labelfontname=\"" << fontName << "\","
- "labelfontsize=\"" << fontSize << "\"];\n";
- t << " node [fontname=\"" << fontName << "\","
- "fontsize=\"" << fontSize << "\",shape=record];\n";
+ t << " bgcolor=\"transparent\";\n";
+ QCString c = Config_getString(DOT_COMMON_ATTR);
+ if (!c.isEmpty()) c += ",";
+ t << " edge [" << c << Config_getString(DOT_EDGE_ATTR) << "];\n";
+ t << " node [" << c << Config_getString(DOT_NODE_ATTR) << "];\n";
}
void DotGraph::writeGraphFooter(TextStream &t)
#define DOTGRAPH_H
#include <iostream>
+#include <map>
#include "qcstring.h"
#include "dir.h"
void DotGroupCollaboration::writeGraphHeader(TextStream &t,const QCString &title) const
{
- int fontSize = Config_getInt(DOT_FONTSIZE);
- QCString fontName = Config_getString(DOT_FONTNAME);
- t << "digraph ";
- if (title.isEmpty())
- {
- t << "\"Dot Graph\"";
- }
- else
- {
- t << "\"" << convertToXML(title) << "\"";
- }
- t << "\n";
- t << "{\n";
- if (Config_getBool(DOT_TRANSPARENT))
- {
- t << " bgcolor=\"transparent\";\n";
- }
- t << " edge [fontname=\"" << fontName << "\",fontsize=\"" << fontSize << "\","
- "labelfontname=\"" << fontName << "\",labelfontsize=\"" << fontSize << "\"];\n";
- t << " node [fontname=\"" << fontName << "\",fontsize=\"" << fontSize << "\",shape=box];\n";
+ DotGraph::writeGraphHeader(t, title);
t << " rankdir=LR;\n";
}
#include "dot.h"
#include "language.h"
#include "dotfilepatcher.h"
+#include "dotnode.h"
void DotLegendGraph::writeGraph(const QCString &path)
{
void DotLegendGraph::computeTheGraph()
{
- int fontSize = Config_getInt(DOT_FONTSIZE);
- QCString fontName = Config_getString(DOT_FONTNAME);
TextStream md5stream;
writeGraphHeader(md5stream,theTranslator->trLegendTitle());
- md5stream << " Node9 [shape=\"box\",label=\"Inherited\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",fillcolor=\"grey75\",style=\"filled\" fontcolor=\"black\"];\n";
- md5stream << " Node10 -> Node9 [dir=\"back\",color=\"midnightblue\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node10 [shape=\"box\",label=\"PublicBase\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
- md5stream << " Node11 -> Node10 [dir=\"back\",color=\"midnightblue\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node11 [shape=\"box\",label=\"Truncated\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"red\"];\n";
- md5stream << " Node13 -> Node9 [dir=\"back\",color=\"darkgreen\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node13 [shape=\"box\",label=\"ProtectedBase\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
- md5stream << " Node14 -> Node9 [dir=\"back\",color=\"firebrick4\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node14 [shape=\"box\",label=\"PrivateBase\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
- md5stream << " Node15 -> Node9 [dir=\"back\",color=\"midnightblue\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node15 [shape=\"box\",label=\"Undocumented\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"grey75\"];\n";
- md5stream << " Node16 -> Node9 [dir=\"back\",color=\"midnightblue\",fontsize=\"" << fontSize << "\",style=\"solid\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node16 [shape=\"box\",label=\"Templ< int >\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
- md5stream << " Node17 -> Node16 [dir=\"back\",color=\"orange\",fontsize=\"" << fontSize << "\",style=\"dashed\",label=\"< int >\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node17 [shape=\"box\",label=\"Templ< T >\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
- md5stream << " Node18 -> Node9 [dir=\"back\",color=\"darkorchid3\",fontsize=\"" << fontSize << "\",style=\"dashed\",label=\"m_usedClass\",fontname=\"" << fontName << "\"];\n";
- md5stream << " Node18 [shape=\"box\",label=\"Used\",fontsize=\"" << fontSize << "\",height=0.2,width=0.4,fontname=\"" << fontName << "\",color=\"black\"];\n";
+
+ DotNode{9, "Inherited", "", "", TRUE}.writeBox(md5stream, CallGraph, GOF_BITMAP, false);
+ md5stream << " Node10 -> Node9 [dir=\"back\",color=\"steelblue1\",style=\"solid\"];\n";
+ DotNode{10, "PublicBase", "", "url"}.markHasDocumentation().writeBox(md5stream, CallGraph, GOF_BITMAP, false);
+ md5stream << " Node11 -> Node10 [dir=\"back\",color=\"steelblue1\",style=\"solid\"];\n";
+ DotNode{11, "Truncated", "", "url"}.markAsTruncated().markHasDocumentation().writeBox(md5stream, CallGraph, GOF_BITMAP, true);
+ md5stream << " Node13 -> Node9 [dir=\"back\",color=\"darkgreen\",style=\"solid\"];\n";
+ md5stream << " Node13 [label=\"ProtectedBase\",color=\"gray40\",fillcolor=\"white\",style=\"filled\"];\n";
+ md5stream << " Node14 -> Node9 [dir=\"back\",color=\"firebrick4\",style=\"solid\"];\n";
+ md5stream << " Node14 [label=\"PrivateBase\",color=\"gray40\",fillcolor=\"white\",style=\"filled\"];\n";
+ md5stream << " Node15 -> Node9 [dir=\"back\",color=\"steelblue1\",style=\"solid\"];\n";
+ DotNode{15, "Undocumented", "", ""}.writeBox(md5stream, CallGraph, GOF_BITMAP, false);
+ md5stream << " Node16 -> Node9 [dir=\"back\",color=\"steelblue1\",style=\"solid\"];\n";
+ md5stream << " Node16 [label=\"Templ\\< int \\>\",color=\"gray40\",fillcolor=\"white\",style=\"filled\"];\n";
+ md5stream << " Node17 -> Node16 [dir=\"back\",color=\"orange\",style=\"dashed\",label=\"< int >\",];\n";
+ md5stream << " Node17 [label=\"Templ\\< T \\>\",color=\"gray40\",fillcolor=\"white\",style=\"filled\"];\n";
+ md5stream << " Node18 -> Node9 [dir=\"back\",color=\"darkorchid3\",style=\"dashed\",label=\"m_usedClass\",];\n";
+ md5stream << " Node18 [label=\"Used\",color=\"gray40\",fillcolor=\"white\",style=\"filled\"];\n";
writeGraphFooter(md5stream);
m_theGraph = md5stream.str();
}
/*! mapping from protection levels to color names */
static const char *normalEdgeColorMap[] =
{
- "midnightblue", // Public
+ "steelblue1", // Public
"darkgreen", // Protected
"firebrick4", // Private
"darkorchid3", // "use" relation
static const char *umlEdgeColorMap[] =
{
- "midnightblue", // Public
+ "steelblue1", // Public
"darkgreen", // Protected
"firebrick4", // Private
"grey25", // "use" relation
umlEdgeColorMap, umlArrowStyleMap, umlEdgeStyleMap
};
-static QCString escapeTooltip(const QCString &tooltip)
+QCString escapeTooltip(const QCString &tooltip)
{
if (tooltip.isEmpty()) return tooltip;
QCString result;
}
}
-void DotNode::writeBox(TextStream &t,
- GraphType gt,
- GraphOutputFormat /*format*/,
- bool hasNonReachableChildren) const
+void DotNode::writeLabel(TextStream &t, GraphType gt) const
{
- const char *labCol;
- if (m_classDef)
- {
- if (m_classDef->hasDocumentation() && hasNonReachableChildren)
- labCol = "red";
- else if (m_classDef->hasDocumentation() && !hasNonReachableChildren)
- labCol = "black";
- else if (!m_classDef->hasDocumentation() && hasNonReachableChildren)
- labCol = "orangered";
- else // (!m_classDef->hasDocumentation() && !hasNonReachableChildren)
- {
- labCol = "grey75";
- if (m_classDef->templateMaster() && m_classDef->templateMaster()->hasDocumentation())
- labCol = "black";
- }
- }
- else
- {
- labCol = m_url.isEmpty() ? "grey75" : // non link
- (hasNonReachableChildren ? "red" : "black");
- }
- t << " Node" << m_number << " [label=\"";
-
+ t << "label=";
if (m_classDef && Config_getBool(UML_LOOK) && (gt==Inheritance || gt==Collaboration))
{
// add names shown as relations to a set, so we don't show
}
//printf("DotNode::writeBox for %s\n",qPrint(m_classDef->name()));
- t << "{" << convertLabel(m_label) << "\\n";
+ t << "\"{" << convertLabel(m_label) << "\\n";
auto dotUmlDetails = Config_getEnum(DOT_UML_DETAILS);
if (dotUmlDetails!=DOT_UML_DETAILS_t::NONE)
{
}
}
}
- t << "}";
+ t << "}\"";
+ }
+ else if (Config_getString(DOT_NODE_ATTR).contains("shape=plain"))
+ {
+ if (m_isRoot)
+ t << "<<b>" << convertToXML(m_label) << "</b>>";
+ else if (m_truncated == Truncated)
+ t << "<<i>" << convertToXML(m_label) << "</i>>";
+ else
+ t << '"' << convertLabel(m_label) << '"';
}
else // standard look
{
- t << convertLabel(m_label);
+ t << '"' << convertLabel(m_label) << '"';
}
- t << "\",height=0.2,width=0.4";
- if (m_isRoot)
+}
+
+void DotNode::writeUrl(TextStream &t) const
+{
+ if (m_url.isEmpty())
+ return;
+ int tagPos = m_url.findRev('$');
+ t << ",URL=\"";
+ QCString noTagURL = m_url;
+ if (tagPos!=-1)
+ {
+ t << m_url.left(tagPos);
+ noTagURL = m_url.mid(tagPos);
+ }
+ int anchorPos = noTagURL.findRev('#');
+ if (anchorPos==-1)
{
- t << ",color=\"black\", fillcolor=\"grey75\", style=\"filled\", fontcolor=\"black\"";
+ t << addHtmlExtensionIfMissing(noTagURL) << "\"";
}
else
{
- t << ",color=\"" << labCol << "\"";
- if (!Config_getBool(DOT_TRANSPARENT))
+ t << addHtmlExtensionIfMissing(noTagURL.left(anchorPos))
+ << noTagURL.right(noTagURL.length() - anchorPos) << "\"";
+ }
+}
+
+void DotNode::writeBox(TextStream &t,
+ GraphType gt,
+ GraphOutputFormat /*format*/,
+ bool hasNonReachableChildren) const
+{
+ const char *labCol;
+ const char *fillCol = "white";
+ if (m_classDef)
+ {
+ if (m_classDef->hasDocumentation() && hasNonReachableChildren)
{
- t << ", fillcolor=\"white\"";
- t << ", style=\"filled\"";
+ labCol = "red";
+ fillCol = "#FFF0F0";
}
- if (!m_url.isEmpty())
+ else if (m_classDef->hasDocumentation() && !hasNonReachableChildren)
+ labCol = "gray40";
+ else if (!m_classDef->hasDocumentation() && hasNonReachableChildren)
+ labCol = "orangered";
+ else // (!m_classDef->hasDocumentation() && !hasNonReachableChildren)
{
- int tagPos = m_url.findRev('$');
- t << ",URL=\"";
- QCString noTagURL = m_url;
- if (tagPos!=-1)
- {
- t << m_url.left(tagPos);
- noTagURL = m_url.mid(tagPos);
- }
- int anchorPos = noTagURL.findRev('#');
- if (anchorPos==-1)
- {
- t << addHtmlExtensionIfMissing(noTagURL) << "\"";
- }
- else
- {
- t << addHtmlExtensionIfMissing(noTagURL.left(anchorPos))
- << noTagURL.right(noTagURL.length()-anchorPos) << "\"";
- }
+ labCol = "grey75";
+ if (m_classDef->templateMaster() && m_classDef->templateMaster()->hasDocumentation())
+ labCol = "gray40";
}
}
+ else
+ {
+ labCol = m_url.isEmpty() ? "grey60" : // non link
+ (hasNonReachableChildren ? "red" : "grey40");
+ fillCol = m_url.isEmpty() ? "#E0E0E0" :
+ (hasNonReachableChildren ? "#FFF0F0" : "white");
+ }
+ t << " Node" << m_number << " [";
+ writeLabel(t,gt);
+ t << ",height=0.2,width=0.4";
+ if (m_isRoot)
+ {
+ t << ",color=\"gray40\", fillcolor=\"grey60\", style=\"filled\", fontcolor=\"black\"";
+ }
+ else
+ {
+ t << ",color=\"" << labCol << "\"";
+ t << ", fillcolor=\"" << fillCol << "\"";
+ t << ", style=\"filled\"";
+ writeUrl(t);
+ }
if (!m_tooltip.isEmpty())
{
t << ",tooltip=\"" << escapeTooltip(m_tooltip) << "\"";
bool umlUseArrow = aStyle=="odiamond";
if (pointBack && !umlUseArrow) t << "dir=\"back\",";
- t << "color=\"" << eProps->edgeColorMap[ei->color()]
- << "\",fontsize=\"" << Config_getInt(DOT_FONTSIZE) << "\",";
+ t << "color=\"" << eProps->edgeColorMap[ei->color()] << "\",";
t << "style=\"" << eProps->edgeStyleMap[ei->style()] << "\"";
if (!ei->label().isEmpty())
{
t << ",arrowhead=\"" << eProps->arrowStyleMap[ei->color()] << "\"";
}
- if (format==GOF_BITMAP) t << ",fontname=\"" << Config_getString(DOT_FONTNAME) << "\"";
t << "];\n";
}
void writeXML(TextStream &t,bool isClassGraph) const;
void writeDocbook(TextStream &t,bool isClassGraph) const;
void writeDEF(TextStream &t) const;
+ void writeLabel(TextStream &t, GraphType gt) const;
+ void writeUrl(TextStream &t) const;
void writeBox(TextStream &t,GraphType gt,GraphOutputFormat f,
bool hasNonReachableChildren) const;
void writeArrow(TextStream &t,GraphType gt,GraphOutputFormat f,const DotNode *cn,
void clearWriteFlag();
void renumberNodes(int &number);
void markRenumbered() { m_renumbered = true; }
- void markHasDocumentation() { m_hasDoc = true; }
+ DotNode& markHasDocumentation() { m_hasDoc = true; return *this;}
void setSubgraphId(int id) { m_subgraphId = id; }
void colorConnectedNodes(int curColor);
void setDistance(int distance);
void markAsVisible(bool b=TRUE) { m_visible=b; }
- void markAsTruncated(bool b=TRUE) { m_truncated=b ? Truncated : Untruncated; }
+ DotNode& markAsTruncated(bool b=TRUE) { m_truncated=b ? Truncated : Untruncated; return *this;}
const DotNodeRefVector &children() const { return m_children; }
const DotNodeRefVector &parents() const { return m_parents; }
const EdgeInfoVector &edgeInfo() const { return m_edgeInfo; }
{
};
+QCString escapeTooltip(const QCString &tooltip);
+
#endif
*/
#include <cassert>
+#include <cmath>
#include "dotrunner.h"
#include "util.h"
if (p) // found PageBoundingBox or /MediaBox string
{
int x,y;
+ double w,h;
fclose(f);
- if (sscanf(p+bblen,"%d %d %d %d",&x,&y,width,height)!=4)
+ if (sscanf(p+bblen,"%d %d %lf %lf",&x,&y,&w,&h)!=4)
{
//printf("readBoundingBox sscanf fail\n");
return FALSE;
}
+ *width = static_cast<int>(std::ceil(w));
+ *height = static_cast<int>(std::ceil(h));
return TRUE;
}
}
// As there should be only one pdf file be generated, we don't need code for regenerating multiple pdf files in one call
for (auto& s : m_jobs)
{
- if (s.format.left(3)=="pdf")
+ if (s.format.startsWith("pdf"))
{
int width=0,height=0;
if (!readBoundingBox(s.output,&width,&height,FALSE)) goto error;
}
}
- if (s.format.left(3)=="png")
+ if (s.format.startsWith("png"))
{
checkPngResult(s.output);
}
#include "scanner.h"
#include "entry.h"
#include "index.h"
+#include "indexlist.h"
#include "message.h"
#include "config.h"
#include "util.h"
SearchIndexIntf *Doxygen::searchIndex=0;
SymbolMap<Definition>*Doxygen::symbolMap;
ClangUsrMap *Doxygen::clangUsrMap = 0;
-Cache<std::string,LookupInfo> *Doxygen::lookupCache;
+Cache<std::string,LookupInfo> *Doxygen::typeLookupCache;
+Cache<std::string,LookupInfo> *Doxygen::symbolLookupCache;
DirLinkedMap *Doxygen::dirLinkedMap;
DirRelationLinkedMap Doxygen::dirRelations;
ParserManager *Doxygen::parserManager = 0;
bool Doxygen::clangAssistedParsing = FALSE;
QCString Doxygen::verifiedDotPath;
volatile bool Doxygen::terminating = false;
+InputFileEncodingList Doxygen::inputFileEncodingList;
// locally accessible globals
static std::multimap< std::string, const Entry* > g_classEntries;
* full qualified name \a name. Creates an artificial scope if the scope is
* not found and set the parent/child scope relation if the scope is found.
*/
+[[maybe_unused]]
static Definition *buildScopeFromQualifiedName(const QCString &name_,SrcLangExt lang,const TagInfo *tagInfo)
{
QCString name = stripTemplateSpecifiers(name_);
static ClassDefMutable *createTagLessInstance(const ClassDef *rootCd,const ClassDef *templ,const QCString &fieldName)
{
QCString fullName = removeAnonymousScopes(templ->name());
- if (fullName.right(2)=="::") fullName=fullName.left(fullName.length()-2);
+ if (fullName.endsWith("::")) fullName=fullName.left(fullName.length()-2);
fullName+="."+fieldName;
//printf("** adding class %s based on %s\n",qPrint(fullName),qPrint(templ->name()));
//printf("Found using directive %s at line %d of %s\n",
// qPrint(root->name),root->startLine,qPrint(root->fileName));
QCString name=substitute(root->name,".","::");
- if (name.right(2)=="::")
+ if (name.endsWith("::"))
{
name=name.left(name.length()-2);
}
{
QCString ttype = type;
ttype.stripPrefix("typedef ");
- if (ttype.left(7)=="struct " || ttype.left(6)=="union ")
+ if (ttype.stripPrefix("struct ") || ttype.stripPrefix("union "))
{
- ttype.stripPrefix("struct ");
- ttype.stripPrefix("union ");
static const reg::Ex re(R"(\a\w*)");
reg::Match match;
std::string typ = ttype.str();
result=FALSE;
goto done;
}
- else if ((fd != nullptr) && (fd->name().right(2)==".c" || fd->name().right(2)==".h"))
+ else if ((fd != nullptr) && (fd->name().endsWith(".c") || fd->name().endsWith(".h")))
{ // inside a .c file
result=FALSE;
goto done;
findAndRemoveWord(type,"static");
findAndRemoveWord(type,"volatile");
typePtrType = type.find('*')!=-1 || type.find('&')!=-1;
- //if (type.left(6)=="const ") type=type.right(type.length()-6);
if (!typePtrType)
{
typeIsClass = resolver.resolveClass(ctx,type)!=0;
name=removeRedundantWhiteSpace(name);
// find the scope of this variable
- Entry *p = root->parent();
- while ((p->section & Entry::SCOPE_MASK))
+ int index = computeQualifiedIndex(name);
+ if (index!=-1 && root->parent()->section==Entry::GROUPDOC_SEC && root->parent()->tagInfo())
+ // grouped members are stored with full scope
{
- QCString scopeName = p->name;
- if (!scopeName.isEmpty())
+ buildScopeFromQualifiedName(name.left(index+2),root->lang,root->tagInfo());
+ scope=name.left(index);
+ name=name.mid(index+2);
+ }
+ else
+ {
+ Entry *p = root->parent();
+ while ((p->section & Entry::SCOPE_MASK))
{
- scope.prepend(scopeName);
- break;
+ QCString scopeName = p->name;
+ if (!scopeName.isEmpty())
+ {
+ scope.prepend(scopeName);
+ break;
+ }
+ p=p->parent();
}
- p=p->parent();
}
MemberType mtype;
if (type=="@")
mtype=MemberType_EnumValue;
- else if (type.left(8)=="typedef ")
+ else if (type.startsWith("typedef "))
mtype=MemberType_Typedef;
- else if (type.left(7)=="friend ")
+ else if (type.startsWith("friend "))
mtype=MemberType_Friend;
else if (root->mtype==Property)
mtype=MemberType_Property;
QCString args = rargs;
QCString name=removeRedundantWhiteSpace(rname);
- if (name.left(2)=="::") name=name.right(name.length()-2);
+ name.stripPrefix("::");
MemberType mtype;
if (isFriend) mtype=MemberType_Friend;
int i = -1;
int j = -1;
if ((fd==0 || fd->getLanguage()==SrcLangExt_Cpp) &&
- name.left(9)!="operator " && // not operator
+ !name.startsWith("operator ") && // not operator
(i=name.find('<'))!=-1 && // containing <
(j=name.find('>'))!=-1 && // or >
(j!=i+2 || name.at(i+1)!='=') // but not the C++20 spaceship operator <=>
def=qualScope+scopeSeparator+name; //+optArgs;
}
}
- if (def.left(7)=="friend ") def=def.right(def.length()-7);
+ def.stripPrefix("friend ");
md->setDefinition(def);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
nd = getResolvedNamespaceMutable(nscope);
}
}
+ else if (root->parent()->section==Entry::GROUPDOC_SEC && !scope.isEmpty())
+ {
+ nd = getResolvedNamespaceMutable(sc);
+ }
if (!scope.isEmpty())
{
" '%s' '%s'::'%s' '%s' proto=%d\n"
" def='%s'\n",
qPrint(root->type),
- qPrint(root->parent()->name),
+ qPrint(scope),
qPrint(rname),
qPrint(root->args),
root->proto,
md->enableCallerGraph(root->callerGraph);
md->enableReferencedByRelation(root->referencedByRelation);
md->enableReferencesRelation(root->referencesRelation);
- //if (root->mGrpId!=-1)
- //{
- // md->setMemberGroup(memberGroupDict[root->mGrpId]);
- //}
md->setRefItems(root->sli);
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
QCString rname = removeRedundantWhiteSpace(root->name);
//printf("rname=%s\n",qPrint(rname));
- QCString scope=root->parent()->name; //stripAnonymousNamespaceScope(root->parent->name);
+ QCString scope;
+ int index = computeQualifiedIndex(rname);
+ if (index!=-1 && root->parent()->section==Entry::GROUPDOC_SEC && root->parent()->tagInfo())
+ // grouped members are stored with full scope
+ {
+ buildScopeFromQualifiedName(rname.left(index+2),root->lang,root->tagInfo());
+ scope=rname.left(index);
+ rname=rname.mid(index+2);
+ }
+ else
+ {
+ scope=root->parent()->name; //stripAnonymousNamespaceScope(root->parent->name);
+ }
if (!rname.isEmpty() && scope.find('@')==-1)
{
ClassDefMutable *cd=0;
) &&
!isMember &&
(root->relates.isEmpty() || root->relatesType == Duplicate) &&
- root->type.left(7)!="extern " && root->type.left(8)!="typedef "
+ !root->type.startsWith("extern ") && !root->type.startsWith("typedef ")
)
// no member => unrelated function
{
ClassDefMutable *usedCdm = toClassDefMutable(usedCd);
if (usedCd==0 && !Config_getBool(HIDE_UNDOC_RELATIONS))
{
- if (type.right(2)=="(*" || type.right(2)=="(^") // type is a function pointer
+ if (type.endsWith("(*") || type.endsWith("(^")) // type is a function pointer
{
type+=md->argsString();
}
QCString biName=bi->name;
bool explicitGlobalScope=FALSE;
//printf("findClassRelation: biName='%s'\n",qPrint(biName));
- if (biName.left(2)=="::") // explicit global scope
+ if (biName.startsWith("::")) // explicit global scope
{
biName=biName.right(biName.length()-2);
explicitGlobalScope=TRUE;
}
if (baseClass)
{
- if (biName.right(2)=="-p")
+ if (biName.endsWith("-p"))
{
biName="<"+biName.left(biName.length()-2)+">";
}
baseClass->setOuterScope(scope);
}
- if (baseClassName.right(2)=="-p")
+ if (baseClassName.endsWith("-p"))
{
baseClass->setCompoundType(ClassDef::Protocol);
}
}
size_t numMembers = cd ? cd->memberNameInfoLinkedMap().size() : 0;
if ((cd==0 || (!cd->hasDocumentation() && !cd->isReference())) && numMembers>0 &&
- bName.right(2)!="::")
+ !bName.endsWith("::"))
{
if (!root->name.isEmpty() && root->name.find('@')==-1 && // normal name
(guessSection(root->fileName)==Entry::HEADER_SEC ||
QCString tdaName = tda->name;
QCString tdaType = tda->type;
int vc=0;
- if (tdaType.left(6)=="class ") vc=6;
- else if (tdaType.left(9)=="typename ") vc=9;
+ if (tdaType.startsWith("class ")) vc=6;
+ else if (tdaType.startsWith("typename ")) vc=9;
if (vc>0) // convert type=="class T" to type=="class" name=="T"
{
tdaName = tdaType.mid(vc);
).stripWhiteSpace();
//printf("funcDecl='%s'\n",qPrint(funcDecl));
- if (isFriend && funcDecl.left(6)=="class ")
+ if (isFriend && funcDecl.startsWith("class "))
{
//printf("friend class\n");
funcDecl=funcDecl.right(funcDecl.length()-6);
funcName = funcDecl;
}
- else if (isFriend && funcDecl.left(7)=="struct ")
+ else if (isFriend && funcDecl.startsWith("struct "))
{
funcDecl=funcDecl.right(funcDecl.length()-7);
funcName = funcDecl;
}
}
- if (funcName.left(9)=="operator ") // strip class scope from cast operator
+ if (funcName.startsWith("operator ")) // strip class scope from cast operator
{
funcName = substitute(funcName,className+"::","");
}
//printf("Results type=%s,name=%s,args=%s\n",qPrint(type),qPrint(root->name),qPrint(args));
isFunc=FALSE;
}
- else if ((type.left(8)=="typedef " && args.find('(')!=-1))
+ else if ((type.startsWith("typedef ") && args.find('(')!=-1))
// detect function types marked as functions
{
isFunc=FALSE;
{
scope=root->name.left(i); // extract scope
name=root->name.right(root->name.length()-i-2); // extract name
- if ((cd=getClassMutable(scope))==0) nd=getResolvedNamespaceMutable(scope);
+ if ((cd=getClassMutable(scope))==0)
+ {
+ nd=toNamespaceDefMutable(buildScopeFromQualifiedName(root->name.left(i+2),root->lang,root->tagInfo()));
+ }
}
else // no scope, check the scope in which the docs where found
{
{
scope=root->name.left(i); // extract scope
name=root->name.right(root->name.length()-i-2); // extract name
- if ((cd=getClassMutable(scope))==0) nd=getResolvedNamespaceMutable(scope);
+ if ((cd=getClassMutable(scope))==0)
+ {
+ nd=toNamespaceDefMutable(buildScopeFromQualifiedName(root->name.left(i+2),root->lang,root->tagInfo()));
+ }
}
else // no scope, check the scope in which the docs where found
{
// use raw pointer in this loop, since we modify mn and can then invalidate mdp.
if (md && md->isEnumerate() && !root->children().empty())
{
- //printf(" enum with %d children\n",root->children()->count());
+ //printf(" enum with %zu children\n",root->children().size());
for (const auto &e : root->children())
{
- SrcLangExt sle;
- if (
- (sle=root->lang)==SrcLangExt_CSharp ||
- sle==SrcLangExt_Java ||
- sle==SrcLangExt_XML ||
+ SrcLangExt sle = root->lang;
+ bool isJavaLike = sle==SrcLangExt_CSharp || sle==SrcLangExt_Java || sle==SrcLangExt_XML;
+ if ( isJavaLike ||
(root->spec&Entry::Strong)
)
{
// values are only visible inside the enum scope, so we must create
// them here and only add them to the enum
//printf("md->qualifiedName()=%s e->name=%s tagInfo=%p name=%s\n",
- // qPrint(md->qualifiedName()),qPrint(e->name),e->tagInfo,qPrint(e->name));
- QCString qualifiedName = substitute(root->name,"::",".");
- if (!scope.isEmpty() && root->tagInfo())
+ // qPrint(md->qualifiedName()),qPrint(e->name),(void*)e->tagInfo(),qPrint(e->name));
+ QCString qualifiedName = root->name;
+ if (isJavaLike)
{
- qualifiedName=substitute(scope,"::",".")+"."+qualifiedName;
+ qualifiedName=substitute(qualifiedName,".","::");
}
- if (substitute(md->qualifiedName(),"::",".")== // TODO: add function to get canonical representation
- qualifiedName // enum value scope matches that of the enum
- )
+ if (md->qualifiedName()==qualifiedName) // enum value scope matches that of the enum
{
QCString fileName = e->fileName;
if (fileName.isEmpty() && e->tagInfo())
// queue the work
for (const auto &kv : *Doxygen::symbolMap)
{
- DefinitionMutable *dm = toDefinitionMutable(kv.second);
- if (dm && !isSymbolHidden(toDefinition(dm)) && toDefinition(dm)->isLinkableInProject())
+ for (const auto &def : kv.second)
{
- auto processTooltip = [dm]() {
- dm->computeTooltip();
- };
- results.emplace_back(threadPool.queue(processTooltip));
+ DefinitionMutable *dm = toDefinitionMutable(def);
+ if (dm && !isSymbolHidden(toDefinition(dm)) && toDefinition(dm)->isLinkableInProject())
+ {
+ auto processTooltip = [dm]() {
+ dm->computeTooltip();
+ };
+ results.emplace_back(threadPool.queue(processTooltip));
+ }
}
}
// wait for the results
{
for (const auto &kv : *Doxygen::symbolMap)
{
- DefinitionMutable *dm = toDefinitionMutable(kv.second);
- if (dm && !isSymbolHidden(toDefinition(dm)) && toDefinition(dm)->isLinkableInProject())
+ for (const auto &def : kv.second)
{
- dm->computeTooltip();
+ DefinitionMutable *dm = toDefinitionMutable(def);
+ if (dm && !isSymbolHidden(toDefinition(dm)) && toDefinition(dm)->isLinkableInProject())
+ {
+ dm->computeTooltip();
+ }
}
}
}
// to this class. Optimization: only remove those classes that
// have inheritance instances as direct or indirect sub classes.
StringVector elementsToRemove;
- for (const auto &ci : *Doxygen::lookupCache)
+ for (const auto &ci : *Doxygen::typeLookupCache)
{
const LookupInfo &li = ci.second;
- if (li.classDef)
+ if (li.definition)
{
elementsToRemove.push_back(ci.first);
}
}
for (const auto &k : elementsToRemove)
{
- Doxygen::lookupCache->remove(k);
+ Doxygen::typeLookupCache->remove(k);
}
// remove all cached typedef resolutions whose target is a
// class C : public B::I {};
StringVector elementsToRemove;
- for (const auto &ci : *Doxygen::lookupCache)
+ for (const auto &ci : *Doxygen::typeLookupCache)
{
const LookupInfo &li = ci.second;
- if (li.classDef==0 && li.typeDef==0)
+ if (li.definition==0 && li.typeDef==0)
{
elementsToRemove.push_back(ci.first);
}
}
for (const auto &k : elementsToRemove)
{
- Doxygen::lookupCache->remove(k);
+ Doxygen::typeLookupCache->remove(k);
}
// for each global function name
}
}
-static void compareDoxyfile(DoxyfileSettings diffList)
+static void compareDoxyfile(Config::CompareMode diffList)
{
std::ofstream f;
bool fileOpened=openOutputFile("-",f);
QCString htmlStyleSheet = Config_getString(HTML_STYLESHEET);
if (!htmlStyleSheet.isEmpty())
{
- FileInfo fi(htmlStyleSheet.str());
- if (!fi.exists())
+ if (!htmlStyleSheet.startsWith("http:") && !htmlStyleSheet.startsWith("https:"))
{
- err("Style sheet '%s' specified by HTML_STYLESHEET does not exist!\n",qPrint(htmlStyleSheet));
- htmlStyleSheet = Config_updateString(HTML_STYLESHEET,""); // revert to the default
- }
- else
- {
- QCString destFileName = Config_getString(HTML_OUTPUT)+"/"+fi.fileName();
- copyFile(htmlStyleSheet,destFileName);
+ FileInfo fi(htmlStyleSheet.str());
+ if (!fi.exists())
+ {
+ err("Style sheet '%s' specified by HTML_STYLESHEET does not exist!\n",qPrint(htmlStyleSheet));
+ htmlStyleSheet = Config_updateString(HTML_STYLESHEET,""); // revert to the default
+ }
+ else
+ {
+ QCString destFileName = Config_getString(HTML_OUTPUT)+"/"+fi.fileName();
+ copyFile(htmlStyleSheet,destFileName);
+ }
}
}
const StringVector &htmlExtraStyleSheet = Config_getList(HTML_EXTRA_STYLESHEET);
for (const auto &sheet : htmlExtraStyleSheet)
{
- std::string fileName = sheet;
- if (!fileName.empty())
+ QCString fileName(sheet);
+ if (!fileName.isEmpty() && !fileName.startsWith("http:") && !fileName.startsWith("https:"))
{
- FileInfo fi(fileName);
+ FileInfo fi(fileName.str());
if (!fi.exists())
{
- err("Style sheet '%s' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName.c_str());
+ err("Style sheet '%s' specified by HTML_EXTRA_STYLESHEET does not exist!\n",qPrint(fileName));
}
else if (fi.fileName()=="doxygen.css" || fi.fileName()=="tabs.css" || fi.fileName()=="navtree.css")
{
{
#if defined(_WIN32)
// UNC path, skip server and share name
- if (sepPos==0 && (result.left(2)=="//" || result.left(2)=="\\\\"))
+ if (sepPos==0 && (result.startsWith("//") || result.startsWith("\\\\")))
sepPos = result.find('/',2);
if (sepPos!=-1)
sepPos = result.find('/',sepPos+1);
TextStream t(&f);
for (const auto &kv : *Doxygen::symbolMap)
{
- dumpSymbol(t,kv.second);
+ for (const auto &def : kv.second)
+ {
+ dumpSymbol(t,def);
+ }
}
}
}
msg("7) Use doxygen to compare the used configuration file with the template configuration file\n");
msg(" %s -x [configFile]\n\n",qPrint(name));
msg(" Use doxygen to compare the used configuration file with the template configuration file\n");
- msg(" without replacing the environment variables\n");
+ msg(" without replacing the environment variables or CMake type replacement variables\n");
msg(" %s -x_noenv [configFile]\n\n",qPrint(name));
msg("8) Use doxygen to show a list of built-in emojis.\n");
msg(" %s -f emoji outputFileName\n\n",qPrint(name));
QCString listName;
bool genConfig=FALSE;
bool shortList=FALSE;
- DoxyfileSettings diffList=DoxyfileSettings::Full;
+ Config::CompareMode diffList=Config::CompareMode::Full;
bool updateConfig=FALSE;
int retVal;
bool quiet = false;
}
break;
case 'x':
- if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=DoxyfileSettings::CompressedNoEnv;
- else if (!strcmp(argv[optInd]+1,"x")) diffList=DoxyfileSettings::Compressed;
+ if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
+ else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
else
{
err("option should be \"-x\" or \"-x_noenv\", found: \"%s\".\n",argv[optInd]);
TextStream t(&f);
RTFGenerator::writeStyleSheetFile(t);
}
+ else
+ {
+ err("error opening RTF style sheet file %s!\n",argv[optInd+1]);
+ cleanUpDoxygen();
+ exit(1);
+ }
cleanUpDoxygen();
- exit(1);
+ exit(0);
}
else if (qstricmp(formatName.data(),"html")==0)
{
exit(0);
}
- if (!Config::parse(configName,updateConfig))
+ if (!Config::parse(configName,updateConfig,diffList))
{
err("could not open or read configuration file %s!\n",qPrint(configName));
cleanUpDoxygen();
exit(1);
}
- if (diffList!=DoxyfileSettings::Full)
+ if (diffList!=Config::CompareMode::Full)
{
Config::updateObsolete();
compareDoxyfile(diffList);
}
}
}
+ // create input file exncodings
+
+ // check INPUT_ENCODING
+ void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
+ if (cd==reinterpret_cast<void *>(-1))
+ {
+ term("unsupported character conversion: '%s'->'%s': %s\n"
+ "Check the 'INPUT_ENCODING' setting in the config file!\n",
+ qPrint(Config_getString(INPUT_ENCODING)),qPrint("UTF-8"),strerror(errno));
+ }
+ else
+ {
+ portable_iconv_close(cd);
+ }
+
+ // check and split INPUT_FILE_ENCODING
+ const StringVector &fileEncod = Config_getList(INPUT_FILE_ENCODING);
+ for (const auto &mapping : fileEncod)
+ {
+ QCString mapStr = mapping.c_str();
+ int i=mapStr.find('=');
+ if (i==-1)
+ {
+ continue;
+ }
+ else
+ {
+ QCString pattern = mapStr.left(i).stripWhiteSpace().lower();
+ QCString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
+ if (pattern.isEmpty() || encoding.isEmpty())
+ {
+ continue;
+ }
+ cd = portable_iconv_open("UTF-8",encoding.data());
+ if (cd==reinterpret_cast<void *>(-1))
+ {
+ term("unsupported character conversion: '%s'->'%s': %s\n"
+ "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
+ qPrint(encoding),qPrint("UTF-8"),strerror(errno));
+ }
+ else
+ {
+ portable_iconv_close(cd);
+ }
+
+ Doxygen::inputFileEncodingList.push_back(InputFileEncoding(pattern, encoding));
+ }
+ }
// add predefined macro name to a dictionary
const StringVector &expandAsDefinedList =Config_getList(EXPAND_AS_DEFINED);
});
}
}
+ if (Doxygen::inputNameLinkedMap->empty())
+ {
+ warn_uncond("No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE");
+ }
g_s.end();
}
if (cacheSize<0) cacheSize=0;
if (cacheSize>9) cacheSize=9;
uint lookupSize = 65536 << cacheSize;
- Doxygen::lookupCache = new Cache<std::string,LookupInfo>(lookupSize);
+ Doxygen::typeLookupCache = new Cache<std::string,LookupInfo>(lookupSize);
+ Doxygen::symbolLookupCache = new Cache<std::string,LookupInfo>(lookupSize);
#ifdef HAS_SIGNALS
signal(SIGINT, stopDoxygen);
if (Config_getBool(GENERATE_HTML) && !Config_getBool(USE_MATHJAX))
{
- FormulaManager::instance().readFormulas(Config_getString(HTML_OUTPUT));
+ FormulaManager::instance().initFromRepository(Config_getString(HTML_OUTPUT));
}
if (Config_getBool(GENERATE_RTF))
{
- // in case GENERRATE_HTML is set we just have to compare, both repositories should be identical
- FormulaManager::instance().readFormulas(Config_getString(RTF_OUTPUT),
- Config_getBool(GENERATE_HTML) &&
- !Config_getBool(USE_MATHJAX));
+ FormulaManager::instance().initFromRepository(Config_getString(RTF_OUTPUT));
}
if (Config_getBool(GENERATE_DOCBOOK))
{
- // in case GENERRATE_HTML is set we just have to compare, both repositories should be identical
- FormulaManager::instance().readFormulas(Config_getString(DOCBOOK_OUTPUT),
- (Config_getBool(GENERATE_HTML) &&
- !Config_getBool(USE_MATHJAX)) ||
- Config_getBool(GENERATE_RTF));
+ FormulaManager::instance().initFromRepository(Config_getString(DOCBOOK_OUTPUT));
}
+ FormulaManager::instance().checkRepositories();
+
/**************************************************************************
* Handle Tag Files *
**************************************************************************/
// calling buildClassList may result in cached relations that
// become invalid after resolveClassNestingRelations(), that's why
// we need to clear the cache here
- Doxygen::lookupCache->clear();
+ Doxygen::typeLookupCache->clear();
// we don't need the list of using declaration anymore
g_usingDeclarations.clear();
copyLogo(Config_getString(RTF_OUTPUT));
}
- const FormulaManager &fm = FormulaManager::instance();
+ FormulaManager &fm = FormulaManager::instance();
if (fm.hasFormulas() && generateHtml
&& !Config_getBool(USE_MATHJAX))
{
g_outputList->cleanup();
- int cacheParam;
- msg("lookup cache used %zu/%zu hits=%" PRIu64 " misses=%" PRIu64 "\n",
- Doxygen::lookupCache->size(),
- Doxygen::lookupCache->capacity(),
- Doxygen::lookupCache->hits(),
- Doxygen::lookupCache->misses());
- cacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::lookupCache->misses()*2/3)); // part of the cache is flushed, hence the 2/3 correction factor
+ msg("type lookup cache used %zu/%zu hits=%" PRIu64 " misses=%" PRIu64 "\n",
+ Doxygen::typeLookupCache->size(),
+ Doxygen::typeLookupCache->capacity(),
+ Doxygen::typeLookupCache->hits(),
+ Doxygen::typeLookupCache->misses());
+ msg("symbol lookup cache used %zu/%zu hits=%" PRIu64 " misses=%" PRIu64 "\n",
+ Doxygen::symbolLookupCache->size(),
+ Doxygen::symbolLookupCache->capacity(),
+ Doxygen::symbolLookupCache->hits(),
+ Doxygen::symbolLookupCache->misses());
+ int typeCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::typeLookupCache->misses()*2/3)); // part of the cache is flushed, hence the 2/3 correction factor
+ int symbolCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::symbolLookupCache->misses()));
+ int cacheParam = std::max(typeCacheParam,symbolCacheParam);
if (cacheParam>Config_getInt(LOOKUP_CACHE_SIZE))
{
msg("Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is %d at the cost of higher memory usage.\n",cacheParam);
struct LookupInfo
{
LookupInfo() = default;
- LookupInfo(const ClassDef *cd,const MemberDef *td,QCString ts,QCString rt)
- : classDef(cd), typeDef(td), templSpec(ts),resolvedType(rt) {}
- const ClassDef *classDef = 0;
+ LookupInfo(const Definition *d,const MemberDef *td,QCString ts,QCString rt)
+ : definition(d), typeDef(td), templSpec(ts),resolvedType(rt) {}
+ const Definition *definition = 0;
const MemberDef *typeDef = 0;
QCString templSpec;
QCString resolvedType;
};
+struct InputFileEncoding
+{
+ InputFileEncoding() {}
+ InputFileEncoding(const QCString &pat, const QCString &enc) : pattern(pat), encoding(enc) {}
+ QCString pattern;
+ QCString encoding;
+};
+
+using InputFileEncodingList = std::vector<InputFileEncoding>;
+
using ClangUsrMap = std::unordered_map<std::string,const Definition *>;
/*! \brief This class serves as a namespace for global variables used by doxygen.
static SearchIndexIntf *searchIndex;
static SymbolMap<Definition> *symbolMap;
static ClangUsrMap *clangUsrMap;
- static Cache<std::string,LookupInfo> *lookupCache;
+ static Cache<std::string,LookupInfo> *typeLookupCache;
+ static Cache<std::string,LookupInfo> *symbolLookupCache;
static DirLinkedMap *dirLinkedMap;
static DirRelationLinkedMap dirRelations;
static ParserManager *parserManager;
static bool clangAssistedParsing;
static QCString verifiedDotPath;
static volatile bool terminating;
+ static InputFileEncodingList inputFileEncodingList;
};
/** Deleter that only deletes an object if doxygen is not already terminating */
void parseInput();
void generateOutput();
void readAliases();
-void readFormulaRepository(QCString dir, bool cmp = FALSE);
void cleanUpDoxygen();
void readFileOrDirectory(const QCString &s,
FileNameLinkedMap *fnDict,
-Doxygen Internals {#mainpage}
+%Doxygen Internals {#mainpage}
=================
+Generated on \showdate "%A, %B %-d, %Y at %-I:%M %p"
+
Introduction
============
The format of the configuration file (options and types) is defined
by the file `config.xml`. As part of the build process,
-the python script `configgen.py` will create a file `configoptions.cpp`
-from this, which serves as the input for the configuration file parser
-that is invoked using Config::parse(). The script `configgen.py` will also
-create the documentation for the configuration items, creating the file
+the python script `configgen.py` will create the files `configoptions.cpp`,
+`configvalues.h` and `configvalues.cpp` from this, which serves as the input
+for the configuration file parser that is invoked using Config::parse().
+The script `configgen.py` will also create the documentation for the
+configuration items, creating the file
`config.doc`.
Gathering Input files
Parsing Input files
===================
-The function parseFiles() takes care of parsing all files.
-It uses the ParserManager singleton factory to create a suitable parser object
-for each file. Each parser implements the abstract interface ParserInterface.
+The function parseFilesSingleThreading() takes care of parsing all files
+(in case `NUM_PROC_THREADS!=1`, the function
+parseFilesMultiThreading() is used instead).
+
+These functions use the ParserManager singleton factory to create a suitable parser object
+for each file. Each parser implements two abstract interfaces: OutlineParserInterface
+en CodeParserInterface. The OutlineParserInterface is used to collect information
+about the symbols that can be documented but does not look into the body of functions.
+The CodeParserInterface is used for syntax highlighting, but also to collect the symbol
+references needed for cross reference relations.
If the parser indicates it needs preprocessing
-via ParserInterface::needsPreprocessing(), doxygen will call preprocessFile()
+via OutlineParserInterface::needsPreprocessing(), doxygen will call Preprocessor::processFile()
on the file.
A second step is to convert multiline C++-style comments into C style comments
now coupled to C/C++ code and does not work automatically for other languages!
The third step is the actual language parsing and is done by calling
-ParserInterface::parseInput() on the parser interface returned by
+OutlineParserInterface::parseInput() on the parser interface returned by
the ParserManager.
The result of parsing is a tree of Entry objects.
-These Entry objects are wrapped in a EntryNav object and stored on disk using
-Entry::createNavigationIndex() on the root node of the tree.
-
Each Entry object roughly contains the raw data for a symbol and is later
converted into a Definition object.
When a parser finds a special comment block in the input, it will do a first
-pass parsing via parseCommentBlock(). During this pass the comment block
+pass parsing via CommentScanner::parseCommentBlock(). During this pass the comment block
is split into multiple parts if needed. Some data that is later needed is
extracted like section labels, xref items, and formulas.
-Also Markdown markup is processed using processMarkdown() during this pass.
+Also Markdown markup is processed via Markdown::process() during this pass.
Resolving relations
===================
-The Entry objects created and filled during parsing are stored on disk
-(to keep memory needs low). The name, parent/child relation, and
-location on disk of each Entry is stored as a tree of EntryNav nodes, which is
-kept in memory.
+The Entry objects created and filled during parsing and stored as a tree of Entry nodes,
+which is kept in memory.
-Doxygen does a number of tree walks over the EntryNav nodes in the tree to
+%Doxygen does a number of tree walks over the Entry nodes in the tree to
build up the data structures needed to produce the output.
The resulting data structures are all children of the generic base class
Definition is an abstract base class. Concrete subclasses are
- ClassDef: for storing class/struct/union related data
+- ConceptDef: for storing C++20 concept definitions
- NamespaceDef: for storing namespace related data
- FileDef: for storing file related data
- DirDef: for storing directory related data
- PageDef: for storing page related data
Finally the data for members of classes, namespaces, and files is stored in
-the subclass MemberDef.
+the subclass MemberDef. This class is used for functions, variables, enums, etc, as indicated by
+MemberDef::memberType().
Producing debug output
======================
- set the item `Write used lex rules` to `Yes`
- see to it that the `.l` file is newer than the corresponding `.cpp` file
or remove the corresponding `.cpp` file
+ - when using `nmake` the same possibilities exist as described with "unices".
- unices
- global change<br>
In the chapter "Doxygen's internals" a `perl` script is given to toggle the
possibility of having the rules debug information.
- command line change<br>
- It is possible to the option `LEX="flex -d"` with the `make` command on the
+ It is possible to the option `LEX_FLAGS="-d"` with the `make` command on the
command line. In this case the `.l` that are converted to the corresponding
`.cpp` files during this `make` get the rules debug information.<br>
To undo the rules debug information output just recompile the file with
Shows the results of the preprocessing phase, i.e. results from include files,
<tt>\#define</tt> statements etc., definitions in the doxygen configuration file like:
`EXPAND_ONLY_PREDEF`, `PREDEFINED` and `MACRO_EXPANSION`.
+ - nolineno<br>
+ In case the line numbers in the results of the preprocessing phase are not wanted they
+ can be removed by means of this option (without `-d preprocessor` this option has no effect.
- commentcnv<br>
Shows the results of the comment conversion, the comment conversion does the
following:
Provide output of the `lex` files used. When a lexer is started and when a lexer
ends the name of the `lex` file is given so it is possible to see in which lexer the
problem occurs. This makes it easier to select the file to be compiled in `lex` debug mode.
+ - cite<br>
+ Retains the temporary files as created and used for the non LaTeX output results of the
+ generation of the bibliographical references.
+ - fortranfixed2free<br>
+ Shows the result ogf the conversion of Fortran fixed formatted files to Fortran free formatted
+ files as done by doxygen.
+ - plantuml<br>
+ Shows information about the plantuml process run and the used input / output filenames, the content of the
+ input file.
+ - rtf<br>
+ - Shows the original names and the anchors names (called bookmarks in RTF) where they are mapped to.
+ - At the end of the generation of the RTF files these files are merged into one large RTF file, with
+ this option the original files are retained.
+ - qhp<br>
+ - The qhp file is created with indentation for better readability (normally no indentation so the file is smaller).
+ - When the setting `QHG_LOCATION` is pointing to the `qhelpgenerator` besides generating the `qch` file
+ also some extra checks are done by means of the `-c` flag of the `qhelpgenerator`.
+ - tag<br>
+ Shows the results of reading the tag files.
Producing output
================
TODO
-Topics TODO
+Documentation Topics TODO
===========
- Grouping of files in Model / Parser / Generator categories
- Index files based on IndexIntf
* input used in their production; they are not affected by this license.
*
*/
+
+#include <fstream>
+
#include "eclipsehelp.h"
#include "util.h"
#include "config.h"
#include "message.h"
#include "doxygen.h"
-EclipseHelp::EclipseHelp() : m_depth(0), m_endtag(FALSE), m_openTags(0)
+struct EclipseHelp::Private
{
-}
+ int depth = 0;
+ bool endtag = false;
+ int openTags = 0;
-EclipseHelp::~EclipseHelp()
-{
-}
+ std::ofstream tocstream;
+ QCString pathprefix;
-void EclipseHelp::indent()
-{
- int i;
- for (i=0; i<m_depth; i++)
+ /* -- formatting helpers */
+ void indent()
{
- m_tocstream << " ";
+ for (int i=0; i<depth; i++)
+ {
+ tocstream << " ";
+ }
}
-}
-
-void EclipseHelp::closedTag()
-{
- if (m_endtag)
+ void closedTag()
{
- m_tocstream << "/>\n";
- m_endtag = FALSE;
+ if (endtag)
+ {
+ tocstream << "/>\n";
+ endtag = FALSE;
+ }
}
-}
-
-void EclipseHelp::openedTag()
-{
- if (m_endtag)
+ void openedTag()
{
- m_tocstream << ">\n";
- m_endtag = FALSE;
- ++m_openTags;
+ if (endtag)
+ {
+ tocstream << ">\n";
+ endtag = FALSE;
+ ++openTags;
+ }
}
-}
+};
+
+EclipseHelp::EclipseHelp() : p(std::make_unique<Private>()) {}
+EclipseHelp::~EclipseHelp() = default;
+EclipseHelp::EclipseHelp(EclipseHelp&&) = default;
/*!
* \brief Initialize the Eclipse generator
*/
void EclipseHelp::initialize()
{
- // -- read path prefix from the configuration
- //m_pathprefix = Config_getString(ECLIPSE_PATHPREFIX);
- //if (m_pathprefix.isEmpty()) m_pathprefix = "html/";
-
// -- open the contents file
QCString name = Config_getString(HTML_OUTPUT) + "/toc.xml";
- m_tocstream.open(name.str(), std::ofstream::out | std::ofstream::binary);
- if (!m_tocstream.is_open())
+ p->tocstream.open(name.str(), std::ofstream::out | std::ofstream::binary);
+ if (!p->tocstream.is_open())
{
term("Could not open file %s for writing\n", qPrint(name));
}
{
title = "Doxygen generated documentation";
}
- m_tocstream << "<toc label=\"" << convertToXML(title)
- << "\" topic=\"" << convertToXML(m_pathprefix)
+ p->tocstream << "<toc label=\"" << convertToXML(title)
+ << "\" topic=\"" << convertToXML(p->pathprefix)
<< "index" << Doxygen::htmlFileExtension << "\">\n";
- ++ m_depth;
+ ++ p->depth;
}
/*!
*/
void EclipseHelp::finalize()
{
- closedTag(); // -- close previous tag
+ p->closedTag(); // -- close previous tag
// -- write ending tag
- --m_depth;
- m_tocstream << "</toc>\n";
+ --p->depth;
+ p->tocstream << "</toc>\n";
// -- close the content file
- m_tocstream.close();
+ p->tocstream.close();
QCString name = Config_getString(HTML_OUTPUT) + "/plugin.xml";
std::ofstream t(name.str(),std::ofstream::out | std::ofstream::binary);
*/
void EclipseHelp::incContentsDepth()
{
- openedTag();
- ++m_depth;
+ p->openedTag();
+ ++p->depth;
}
/*!
void EclipseHelp::decContentsDepth()
{
// -- end of the opened topic
- closedTag();
- --m_depth;
+ p->closedTag();
+ --p->depth;
- if (m_openTags==m_depth)
+ if (p->openTags==p->depth)
{
- --m_openTags;
- indent();
- m_tocstream << "</topic>\n";
+ --p->openTags;
+ p->indent();
+ p->tocstream << "</topic>\n";
}
}
const Definition * /*def*/)
{
// -- write the topic tag
- closedTag();
+ p->closedTag();
if (!file.isEmpty())
{
switch (file[0]) // check for special markers (user defined URLs)
break;
case '!':
- indent();
- m_tocstream << "<topic label=\"" << convertToXML(name) << "\"";
- m_tocstream << " href=\"" << convertToXML(m_pathprefix) << &file[1] << "\"";
- m_endtag = TRUE;
+ p->indent();
+ p->tocstream << "<topic label=\"" << convertToXML(name) << "\"";
+ p->tocstream << " href=\"" << convertToXML(p->pathprefix) << &file[1] << "\"";
+ p->endtag = TRUE;
break;
default:
- indent();
- m_tocstream << "<topic label=\"" << convertToXML(name) << "\"";
- m_tocstream << " href=\"" << convertToXML(m_pathprefix)
+ p->indent();
+ p->tocstream << "<topic label=\"" << convertToXML(name) << "\"";
+ p->tocstream << " href=\"" << convertToXML(p->pathprefix)
<< addHtmlExtensionIfMissing(file);
if (!anchor.isEmpty())
{
- m_tocstream << "#" << anchor;
+ p->tocstream << "#" << anchor;
}
- m_tocstream << "\"";
- m_endtag = TRUE;
+ p->tocstream << "\"";
+ p->endtag = TRUE;
break;
}
}
else
{
- indent();
- m_tocstream << "<topic label=\"" << convertToXML(name) << "\"";
- m_endtag = TRUE;
+ p->indent();
+ p->tocstream << "<topic label=\"" << convertToXML(name) << "\"";
+ p->endtag = TRUE;
}
}
#ifndef ECLIPSEHELP_H
#define ECLIPSEHELP_H
-#include <fstream>
+#include <memory>
-#include "index.h"
+#include "qcstring.h"
/* -- forward declarations */
class Definition;
+class MemberDef;
/** Generator for Eclipse help files.
*
* These files can be used to generate a help plugin readable
* by the Eclipse IDE.
*/
-class EclipseHelp : public IndexIntf
+class EclipseHelp
{
public:
EclipseHelp();
virtual ~EclipseHelp();
+ EclipseHelp(EclipseHelp &&);
/* -- index interface */
virtual void initialize();
virtual void addStyleSheetFile(const QCString &name);
private:
- int m_depth;
- bool m_endtag;
- int m_openTags;
-
- std::ofstream m_tocstream;
- QCString m_pathprefix;
-
- /* -- avoid copying */
- EclipseHelp(const EclipseHelp &);
- EclipseHelp & operator = (const EclipseHelp &);
-
- /* -- formatting helpers */
- void indent();
- void closedTag();
- void openedTag();
+ struct Private;
+ std::unique_ptr<Private> p;
};
#endif /* ECLIPSEHELP_H */
*
*/
+#include <unordered_set>
+
#include "memberlist.h"
#include "classlist.h"
#include "filedef.h"
bool FileDefImpl::isDocumentationFile() const
{
- return name().right(4)==".doc" ||
- name().right(4)==".txt" ||
- name().right(4)==".dox" ||
- name().right(3)==".md" ||
- name().right(9)==".markdown" ||
+ static const std::unordered_set<std::string> docExtensions =
+ { "doc", "txt", "dox", "md", "markdown" };
+
+ int lastDot = name().findRev('.');
+ return (lastDot!=-1 && docExtensions.find(name().mid(lastDot+1).str())!=docExtensions.end()) ||
getLanguageFromFileName(getFileNameExtension(name())) == SrcLangExt_Markdown;
}
{
QCString vercmd = Config_getString(FILE_VERSION_FILTER);
if (!vercmd.isEmpty() && !m_filePath.isEmpty() &&
- m_filePath!="generated" && m_filePath!="graph_legend")
+ m_filePath!="generated" && m_filePath!="graph_legend.dox")
{
msg("Version of %s : ",qPrint(m_filePath));
QCString cmd = vercmd+" \""+m_filePath+"\"";
#include <set>
-#include "index.h"
#include "definition.h"
#include "memberlist.h"
#include "containers.h"
bool FileInfo::isSymLink() const
{
std::error_code ec;
- fs::file_status status = fs::status(m_name,ec);
+ fs::file_status status = fs::symlink_status(m_name,ec);
return !ec && fs::is_symlink(status);
}
#include <vector>
#include "linkedmap.h"
-#include "config.h"
#include "utf8.h"
+#include "util.h"
class FileDef;
std::string searchKey(std::string input) const
{
std::string key = input;
- if (!Config_getBool(CASE_SENSE_NAMES))
+ if (!getCaseSenseNames())
{
key = convertUTF8ToLower(key);
}
/******************************************************************************
*
- * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
#include "image.h"
#include "fileinfo.h"
#include "dir.h"
+#include "regex.h"
+#include "linkedmap.h"
#include <map>
#include <vector>
#include <fstream>
// TODO: remove these dependencies
-#include "doxygen.h" // for Doxygen::indexList
-#include "index.h" // for Doxygen::indexList
+#include "doxygen.h" // for Doxygen::indexList
+#include "indexlist.h" // for Doxygen::indexList
static int determineInkscapeVersion(Dir &thisDir);
struct FormulaManager::Private
{
- void storeDisplaySize(int id,int w,int h)
- {
- displaySizeMap.insert(std::make_pair(id,DisplaySize(w,h)));
- }
- DisplaySize getDisplaySize(int id)
- {
- auto it = displaySizeMap.find(id);
- if (it!=displaySizeMap.end())
- {
- return it->second;
- }
- return DisplaySize(-1,-1);
- }
- StringVector formulas;
- std::map<std::string,size_t> formulaMap;
- std::map<int,DisplaySize> displaySizeMap;
+ LinkedMap<Formula> formulas;
+ std::map<int,Formula *> formulaIdMap;
+ bool repositoriesValid = true;
+ StringVector tempFiles;
};
-FormulaManager::FormulaManager() : p(new Private)
+FormulaManager::FormulaManager() : p(std::make_unique<Private>())
{
}
return fm;
}
-void FormulaManager::readFormulas(const QCString &dir,bool doCompare)
+void FormulaManager::initFromRepository(const QCString &dir)
{
std::ifstream f(dir.str()+"/formula.repository",std::ifstream::in);
if (f.is_open())
line += "\n" + readLine;
}
- // format: \_form#<digits>=<digits>x<digits>:formula
- size_t hi=line.find('#');
- size_t ei=line.find('=');
- size_t se=line.find(':'); // find name and text separator.
- if (ei==std::string::npos || hi==std::string::npos || se==std::string::npos || hi>se || ei<hi || ei>se)
+ // new format: \_form#<digits>=<digits>x<digits>:formula
+ static const reg::Ex re_new(R"(\\_form#(\d+)=(\d+)x(\d+):)");
+ // old format: \_form#<digits>:formula
+ static const reg::Ex re_old(R"(\\_form#(\d+):)");
+
+ reg::Match match;
+ int id = -1;
+ int width = -1;
+ int height = -1;
+ std::string text;
+ if (reg::search(line,match,re_new)) // try new format first
+ {
+ id = std::stoi(match[1].str());
+ width = std::stoi(match[2].str());
+ height = std::stoi(match[3].str());
+ text = line.substr(match.position()+match.length());
+ //printf("new format found id=%d width=%d height=%d text=%s\n",id,width,height,text.c_str());
+ }
+ else if (reg::search(line,match,re_old)) // check for old format
{
- warn_uncond("%s/formula.repository is corrupted at line %d!\n",qPrint(dir),lineNr);
+ //id = std::stoi(match[1].str());
+ //text = line.substr(match.position()+match.length());
+ //printf("old format found id=%d text=%s\n",id,text.c_str());
+ msg("old formula.repository format detected; forcing upgrade.\n");
+ p->repositoriesValid = false;
break;
}
- else
+ else // unexpected content
{
- std::string formName = line.substr(0,se); // '\_form#<digits>=<digits>x<digits>' part
- std::string formText = line.substr(se+1); // 'formula' part
- int w=-1,h=-1;
- size_t xi=formName.find('x',ei);
- if (xi!=std::string::npos)
- {
- w=std::stoi(formName.substr(ei+1,xi-ei-1)); // digits from '=<digits>x' part as int
- h=std::stoi(formName.substr(xi+1)); // digits from 'x<digits>' part as int
- }
- formName = formName.substr(0,ei); // keep only the '\_form#<digits>' part
- if (doCompare)
- {
- int formId = std::stoi(formName.substr(hi+1));
- std::string storedFormText = FormulaManager::instance().findFormula(formId);
- if (storedFormText!=formText)
- {
- term("discrepancy between formula repositories! Remove "
- "formula.repository and from_* files from output directories.\n");
- }
- formulaCount++;
- }
- int id = addFormula(formText);
- if (w!=-1 && h!=-1)
+ warn_uncond("%s/formula.repository contains invalid content at line %d: found: '%s'\n",qPrint(dir),lineNr,line.c_str());
+ p->repositoriesValid = false;
+ break;
+ }
+
+ auto it = p->formulaIdMap.find(id);
+ Formula *formula=0;
+ if (it!=p->formulaIdMap.end()) // formula already found in a repository for another output format
+ {
+ formula = it->second;
+ if (formula->text().str()!=text) // inconsistency between repositories detected
{
- p->storeDisplaySize(id,w,h);
+ msg("differences detected between formula.repository files; forcing upgrade.\n");
+ p->repositoriesValid = false;
+ break;
}
+ formulaCount++;
+ }
+ else // create new formula from cache
+ {
+ //printf("formula not found adding it under id=%d\n",id);
+ formula = p->formulas.add(text.c_str(),id,width,height);
+ p->formulaIdMap.insert(std::make_pair(id,formula));
+ }
+
+ if (formula) // if an entry in the repository exists also check if there is a generated image
+ {
+ QCString formImgName;
+ formImgName.sprintf("form_%d",formula->id());
+ FileInfo fiPng((dir+"/"+formImgName+".png").str());
+ FileInfo fiSvg((dir+"/"+formImgName+".svg").str());
+ // mark formula as cached, so we do not need to regenerate the images
+ bool isCached = fiPng.exists() || fiSvg.exists();
+ formula->setCached(isCached);
+ //printf("formula %d: cached=%d\n",formula->id(),isCached);
+
+ FileInfo fiPngDark((dir+"/"+formImgName+"_dark.png").str());
+ FileInfo fiSvgDark((dir+"/"+formImgName+"_dark.svg").str());
+ bool isCachedDark = fiPngDark.exists() || fiSvgDark.exists();
+ formula->setCachedDark(isCachedDark);
+ //printf("formula %d: cachedDark=%d\n",formula->id(),isCachedDark);
}
}
- if (doCompare && formulaCount!=p->formulas.size())
+
+ // For the first repository all formulas should be new (e.g. formulaCount==0).
+ // For the other repositories the same number of formulas should be found
+ // (and number of formulas should be the same for all repositories, content is already check above)
+ if (formulaCount>0 && formulaCount!=p->formulas.size()) // inconsistency between repositories
{
- term("size discrepancy between formula repositories! Remove "
- "formula.repository and from_* files from output directories.\n");
+ msg("differences detected between formula.repository files; forcing upgrade.\n");
+ p->repositoriesValid = false;
}
}
+ else // no repository found for an output format
+ {
+ p->repositoriesValid = false;
+ }
}
-void FormulaManager::generateImages(const QCString &path,Format format,HighDPI hd) const
+void FormulaManager::checkRepositories()
{
- Dir d(path.str());
- // store the original directory
- if (!d.exists())
+ //printf("checkRepositories valid=%d\n",p->repositoriesValid);
+ if (!p->repositoriesValid)
{
- term("Output directory '%s' does not exist!\n",qPrint(path));
+ clear(); // clear cached formulas, so the corresponding images and repository files
+ // are regenerated
+ p->repositoriesValid = true;
}
- std::string oldDir = Dir::currentDirPath();
+}
+
+void FormulaManager::createLatexFile(const QCString &fileName,Format format,Mode mode,IntVector &formulasToGenerate)
+{
QCString macroFile = Config_getString(FORMULA_MACROFILE);
QCString stripMacroFile;
if (!macroFile.isEmpty())
stripMacroFile = fi.fileName();
}
- // go to the html output directory (i.e. path)
- Dir::setCurrent(d.absPath());
- Dir thisDir;
// generate a latex file containing one formula per page.
- QCString texName="_formulas.tex";
- IntVector formulasToGenerate;
+ QCString texName=fileName+".tex";
std::ofstream f(texName.str(),std::ofstream::out | std::ofstream::binary);
if (f.is_open())
{
t << "\\usepackage{ifthen}\n";
t << "\\usepackage{epsfig}\n"; // for those who want to include images
t << "\\usepackage[utf8]{inputenc}\n"; // looks like some older distributions with newunicode package 1.1 need this option.
+ t << "\\usepackage{xcolor}\n";
+
+ if (mode==Mode::Dark) // invert page and text colors
+ {
+ t << "\\color{white}\n";
+ t << "\\pagecolor{black}\n";
+ }
+
writeExtraLatexPackages(t);
writeLatexSpecialFormulaChars(t);
if (!macroFile.isEmpty())
}
t << "\\pagestyle{empty}\n";
t << "\\begin{document}\n";
- for (size_t i=0; i<p->formulas.size(); i++)
+ for (const auto &formula : p->formulas)
{
- QCString resultName;
- resultName.sprintf("form_%d.%s",static_cast<int>(i),format==Format::Vector?"svg":"png");
- // only formulas for which no image exists are generated
- FileInfo fi(resultName.str());
- if (!fi.exists())
+ int id = formula->id();
+ // only formulas for which no image is cached are generated
+ //printf("check formula %d: cached=%d cachedDark=%d\n",formula->id(),formula->isCached(),formula->isCachedDark());
+ if ((mode==Mode::Light && !formula->isCached()) ||
+ (mode==Mode::Dark && !formula->isCachedDark())
+ )
{
// we force a pagebreak after each formula
- t << p->formulas[i].c_str() << "\n\\pagebreak\n\n";
- formulasToGenerate.push_back(static_cast<int>(i));
+ t << formula->text() << "\n\\pagebreak\n\n";
+ formulasToGenerate.push_back(id);
}
+ QCString resultName;
+ resultName.sprintf("form_%d%s.%s",id, mode==Mode::Light?"":"_dark", format==Format::Vector?"svg":"png");
Doxygen::indexList->addImageFile(resultName);
}
t << "\\end{document}\n";
t.flush();
f.close();
}
- if (!formulasToGenerate.empty()) // there are new formulas
+}
+
+static bool createDVIFile(const QCString &fileName)
+{
+ QCString latexCmd = "latex";
+ char args[4096];
+ Portable::sysTimerStart();
+ int rerunCount=1;
+ while (rerunCount<8)
{
- QCString latexCmd = "latex";
- char args[4096];
- Portable::sysTimerStart();
- int rerunCount=1;
- while (rerunCount<8)
+ //printf("Running latex...\n");
+ sprintf(args,"-interaction=batchmode %s >%s",qPrint(fileName),Portable::devNull());
+ if ((Portable::system(latexCmd,args)!=0) || (Portable::system(latexCmd,args)!=0))
+ {
+ err("Problems running latex. Check your installation or look "
+ "for typos in %s.tex and check %s.log!\n",qPrint(fileName),qPrint(fileName));
+ Portable::sysTimerStop();
+ return false;
+ }
+ // check the log file if we need to run latex again to resolve references
+ QCString logFile = fileToString(fileName+".log");
+ if (logFile.isEmpty() ||
+ (logFile.find("Rerun to get cross-references right")==-1 && logFile.find("Rerun LaTeX")==-1))
+ {
+ break;
+ }
+ rerunCount++;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+static bool createPostscriptFile(const QCString &fileName,const QCString &formBase,int pageIndex)
+{
+ char args[4096];
+ // run dvips to convert the page with number pageIndex to an
+ // postscript file.
+ sprintf(args,"-q -D 600 -n 1 -p %d -o %s_tmp.ps %s.dvi",pageIndex,qPrint(formBase),qPrint(fileName));
+ Portable::sysTimerStart();
+ if (Portable::system("dvips",args)!=0)
+ {
+ err("Problems running dvips. Check your installation!\n");
+ Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+static bool createEPSbboxFile(const QCString &formBase)
+{
+ char args[4096];
+ // extract the bounding box for the postscript file
+ sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=bbox %s_tmp.ps 2>%s_tmp.epsi",
+ qPrint(formBase),qPrint(formBase));
+ Portable::sysTimerStart();
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
+ {
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
+ Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+static bool extractBoundingBox(const QCString &formBase,
+ int *x1,int *y1,int *x2,int *y2,
+ double *x1hi,double *y1hi,double *x2hi,double *y2hi)
+{
+ FileInfo fi((formBase+"_tmp.epsi").str());
+ if (fi.exists())
+ {
+ QCString eps = fileToString(formBase+"_tmp.epsi");
+ int i = eps.find("%%BoundingBox:");
+ if (i!=-1)
+ {
+ sscanf(eps.data()+i,"%%%%BoundingBox:%d %d %d %d",x1,y1,x2,y2);
+ }
+ else
+ {
+ err("Couldn't extract bounding box from %s_tmp.epsi",qPrint(formBase));
+ return false;
+ }
+ i = eps.find("%%HiResBoundingBox:");
+ if (i!=-1)
{
- //printf("Running latex...\n");
- sprintf(args,"-interaction=batchmode _formulas.tex >%s",Portable::devNull());
- if ((Portable::system(latexCmd,args)!=0) || (Portable::system(latexCmd,args)!=0))
+ sscanf(eps.data()+i,"%%%%HiResBoundingBox:%lf %lf %lf %lf",x1hi,y1hi,x2hi,y2hi);
+ }
+ else
+ {
+ err("Couldn't extract high resolution bounding box from %s_tmp.epsi",qPrint(formBase));
+ return false;
+ }
+ }
+ //printf("Bounding box [%d %d %d %d]\n",x1,y1,x2,y2);
+ return true;
+}
+
+double FormulaManager::updateFormulaSize(int pageNum,int x1,int y1,int x2,int y2)
+{
+ double scaleFactor = 1.25;
+ int zoomFactor = Config_getInt(FORMULA_FONTSIZE);
+ if (zoomFactor<8 || zoomFactor>50) zoomFactor=10;
+ scaleFactor *= zoomFactor/10.0;
+
+ auto it = p->formulaIdMap.find(pageNum);
+ if (it!=p->formulaIdMap.end())
+ {
+ Formula *formula = it->second;
+ formula->setWidth(static_cast<int>((x2-x1)*scaleFactor+0.5));
+ formula->setHeight(static_cast<int>((y2-y1)*scaleFactor+0.5));
+ }
+ return scaleFactor;
+}
+
+static bool createCroppedPDF(const QCString &formBase,int x1,int y1,int x2,int y2)
+{
+ char args[4096];
+ // crop the image to its bounding box
+ sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=pdfwrite"
+ " -o %s_tmp.pdf -c \"[/CropBox [%d %d %d %d] /PAGES pdfmark\" -f %s_tmp.ps",
+ qPrint(formBase),x1,y1,x2,y2,qPrint(formBase));
+ Portable::sysTimerStart();
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
+ {
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
+ Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+static bool createCroppedEPS(const QCString &formBase)
+{
+ char args[4096];
+ // crop the image to its bounding box
+ sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=eps2write"
+ " -o %s_tmp.eps -f %s_tmp.ps",qPrint(formBase),qPrint(formBase));
+ Portable::sysTimerStart();
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
+ {
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
+ Portable::sysTimerStop();
+ return false;
+ }
+ return true;
+}
+
+static bool createSVGFromPDF(const QCString &formBase,const QCString &outFile)
+{
+ char args[4096];
+ sprintf(args,"%s_tmp.pdf %s",qPrint(formBase),qPrint(outFile));
+ Portable::sysTimerStart();
+ if (Portable::system("pdf2svg",args)!=0)
+ {
+ err("Problems running pdf2svg. Check your installation!\n");
+ Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+static bool createSVGFromPDFviaInkscape(Dir &thisDir,const QCString &formBase,const QCString &outFile)
+{
+ char args[4096];
+ int inkscapeVersion = determineInkscapeVersion(thisDir);
+ if (inkscapeVersion == -1)
+ {
+ err("Problems determining the version of inkscape. Check your installation!\n");
+ return false;
+ }
+ else if (inkscapeVersion == 0)
+ {
+ sprintf(args,"-l %s -z %s_tmp.pdf 2>%s",qPrint(outFile),qPrint(formBase),Portable::devNull());
+ }
+ else // inkscapeVersion >= 1
+ {
+ sprintf(args,"--export-type=svg --export-filename=%s %s_tmp.pdf 2>%s",qPrint(outFile),qPrint(formBase),Portable::devNull());
+ }
+ Portable::sysTimerStart();
+ if (Portable::system("inkscape",args)!=0)
+ {
+ err("Problems running inkscape. Check your installation!\n");
+ Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+
+static bool updateEPSBoundingBox(const QCString &formBase,
+ int x1,int y1,int x2,int y2,
+ double x1hi,double y1hi,double x2hi,double y2hi)
+{
+ // read back %s_tmp.eps and replace
+ // bounding box values with x1,y1,x2,y2 and remove the HiResBoundingBox
+ std::ifstream epsIn(formBase.str()+"_tmp.eps",std::ifstream::in);
+ std::ofstream epsOut(formBase.str()+"_tmp_corr.eps",std::ofstream::out | std::ofstream::binary);
+ if (epsIn.is_open() && epsOut.is_open())
+ {
+ std::string line;
+ while (getline(epsIn,line))
+ {
+ if (line.rfind("%%BoundingBox",0)==0)
{
- err("Problems running latex. Check your installation or look "
- "for typos in _formulas.tex and check _formulas.log!\n");
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
+ epsOut << "%%BoundingBox: " << x1 << " " << y1 << " " << x2 << " " << y2 << "\n";
}
- // check the log file if we need to run latex again to resolve references
- QCString logFile = fileToString("_formulas.log");
- if (logFile.isEmpty() ||
- (logFile.find("Rerun to get cross-references right")==-1 && logFile.find("Rerun LaTeX")==-1))
+ else if (line.rfind("%%HiResBoundingBox",0)==0)
{
- break;
+ epsOut << "%%HiResBoundingBox: " << x1hi << " " << y1hi << " " << x2hi << " " << y2hi << "\n";
+ }
+ else
+ {
+ epsOut << line << "\n";
}
- rerunCount++;
}
+ epsIn.close();
+ epsOut.close();
+ }
+ else
+ {
+ err("Problems correcting the eps files from %s_tmp.eps to %s_tmp_corr.eps\n",
+ qPrint(formBase),qPrint(formBase));
+ return false;
+ }
+ return true;
+}
+
+static bool createPNG(const QCString &formBase,const QCString &outFile,double scaleFactor)
+{
+ char args[4096];
+ Portable::sysTimerStop();
+ sprintf(args,"-q -dNOSAFER -dBATCH -dNOPAUSE -dEPSCrop -sDEVICE=pnggray -dGraphicsAlphaBits=4 -dTextAlphaBits=4 "
+ "-r%d -sOutputFile=%s %s_tmp_corr.eps",static_cast<int>(scaleFactor*72),qPrint(outFile),qPrint(formBase));
+ Portable::sysTimerStart();
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
+ {
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
Portable::sysTimerStop();
+ return false;
+ }
+ Portable::sysTimerStop();
+ return true;
+}
+
+void FormulaManager::createFormulasTexFile(Dir &thisDir,Format format,HighDPI hd,Mode mode)
+{
+ IntVector formulasToGenerate;
+ QCString formulaFileName = mode==Mode::Light ? "_formulas" : "_formulas_dark";
+ createLatexFile(formulaFileName,format,mode,formulasToGenerate);
+
+ if (!formulasToGenerate.empty()) // there are new formulas
+ {
+ if (!createDVIFile(formulaFileName)) return;
+
//printf("Running dvips...\n");
int pageIndex=1;
for (int pageNum : formulasToGenerate)
{
- msg("Generating image form_%d.%s for formula\n",pageNum,(format==Format::Vector) ? "svg" : "png");
+ QCString outputFile;
+ outputFile.sprintf("form_%d%s.%s",pageNum, mode==Mode::Light?"":"_dark", format==Format::Vector?"svg":"png");
+ msg("Generating image %s for formula\n",qPrint(outputFile));
+
QCString formBase;
- formBase.sprintf("_form%d",pageNum);
- // run dvips to convert the page with number pageIndex to an
- // postscript file.
- sprintf(args,"-q -D 600 -n 1 -p %d -o %s_tmp.ps _formulas.dvi",
- pageIndex,qPrint(formBase));
- Portable::sysTimerStart();
- if (Portable::system("dvips",args)!=0)
- {
- err("Problems running dvips. Check your installation!\n");
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ formBase.sprintf("_form%d%s",pageNum,mode==Mode::Light?"":"_dark");
- // extract the bounding box for the postscript file
- sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=bbox %s_tmp.ps 2>%s_tmp.epsi",
- qPrint(formBase),qPrint(formBase));
- Portable::sysTimerStart();
- if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
- {
- err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ if (!createPostscriptFile(formulaFileName,formBase,pageIndex)) break;
- // extract the bounding box info from the generate .epsi file
int x1=0,y1=0,x2=0,y2=0;
- FileInfo fi((formBase+"_tmp.epsi").str());
- if (fi.exists())
+ double x1hi=0.0,y1hi=0.0,x2hi=0.0,y2hi=0.0;
+ if (mode==Mode::Light)
{
- QCString eps = fileToString(formBase+"_tmp.epsi");
- int i = eps.find("%%BoundingBox:");
- if (i!=-1)
- {
- sscanf(eps.data()+i,"%%%%BoundingBox:%d %d %d %d",&x1,&y1,&x2,&y2);
- }
- else
- {
- err("Couldn't extract bounding box from %s_tmp.epsi",qPrint(formBase));
- }
+ if (!createEPSbboxFile(formBase)) break;
+ // extract the bounding box info from the generated .epsi file
+ if (!extractBoundingBox(formBase,&x1,&y1,&x2,&y2,&x1hi,&y1hi,&x2hi,&y2hi)) break;
+ }
+ else // for dark images the bounding box is wrong (includes the black) so
+ // use the bounding box of the light image instead.
+ {
+ QCString formBaseLight;
+ formBaseLight.sprintf("_form%d",pageNum);
+ if (!extractBoundingBox(formBaseLight,&x1,&y1,&x2,&y2,&x1hi,&y1hi,&x2hi,&y2hi)) break;
}
- //printf("Bounding box [%d %d %d %d]\n",x1,y1,x2,y2);
// convert the corrected EPS to a bitmap
- double scaleFactor = 1.25;
- int zoomFactor = Config_getInt(FORMULA_FONTSIZE);
- if (zoomFactor<8 || zoomFactor>50) zoomFactor=10;
- scaleFactor *= zoomFactor/10.0;
-
- int width = static_cast<int>((x2-x1)*scaleFactor+0.5);
- int height = static_cast<int>((y2-y1)*scaleFactor+0.5);
- p->storeDisplaySize(pageNum,width,height);
+ double scaleFactor = updateFormulaSize(pageNum,x1,y1,x2,y2);
if (format==Format::Vector)
{
- // crop the image to its bounding box
- sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=pdfwrite"
- " -o %s_tmp.pdf -c \"[/CropBox [%d %d %d %d] /PAGES pdfmark\" -f %s_tmp.ps",
- qPrint(formBase),x1,y1,x2,y2,qPrint(formBase));
- Portable::sysTimerStart();
- if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
- {
- err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ if (!createCroppedPDF(formBase,x1,y1,x2,y2)) break;
// if we have pdf2svg available use it to create a SVG image
if (Portable::checkForExecutable("pdf2svg"))
{
- sprintf(args,"%s_tmp.pdf form_%d.svg",qPrint(formBase),pageNum);
- Portable::sysTimerStart();
- if (Portable::system("pdf2svg",args)!=0)
- {
- err("Problems running pdf2svg. Check your installation!\n");
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ createSVGFromPDF(formBase,outputFile);
}
else if (Portable::checkForExecutable("inkscape")) // alternative is to use inkscape
{
- int inkscapeVersion = determineInkscapeVersion(thisDir);
- if (inkscapeVersion == -1)
- {
- err("Problems determining the version of inkscape. Check your installation!\n");
- Dir::setCurrent(oldDir);
- return;
- }
- else if (inkscapeVersion == 0)
- {
- sprintf(args,"-l form_%d.svg -z %s_tmp.pdf 2>%s",pageNum,qPrint(formBase),Portable::devNull());
- }
- else // inkscapeVersion >= 1
- {
- sprintf(args,"--export-type=svg --export-filename=form_%d.svg %s_tmp.pdf 2>%s",pageNum,qPrint(formBase),Portable::devNull());
- }
- Portable::sysTimerStart();
- if (Portable::system("inkscape",args)!=0)
- {
- err("Problems running inkscape. Check your installation!\n");
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ createSVGFromPDFviaInkscape(thisDir,formBase,outputFile);
}
else
{
return;
}
- if (RM_TMP_FILES)
- {
- thisDir.remove(formBase.str()+"_tmp.pdf");
- }
+ p->tempFiles.push_back(formBase.str()+"_tmp.pdf");
}
else // format==Format::Bitmap
{
- // crop the image to its bounding box
- sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=eps2write"
- " -o %s_tmp.eps -f %s_tmp.ps",qPrint(formBase),qPrint(formBase));
- Portable::sysTimerStart();
- if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
- {
- err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
+ if (!createCroppedEPS(formBase)) break;
- // read back %s_tmp.eps and replace
- // bounding box values with x1,y1,x2,y2 and remove the HiResBoundingBox
- std::ifstream epsIn(formBase.str()+"_tmp.eps",std::ifstream::in);
- std::ofstream epsOut(formBase.str()+"_tmp_corr.eps",std::ofstream::out | std::ofstream::binary);
- if (epsIn.is_open() && epsOut.is_open())
- {
- std::string line;
- while (getline(epsIn,line))
- {
- if (line.rfind("%%BoundingBox",0)==0)
- {
- epsOut << "%%BoundingBox: " << x1 << " " << y1 << " " << x2 << " " << y2 << "\n";
- }
- else if (line.rfind("%%HiResBoundingBox",0)==0) // skip this one
- {
- }
- else
- {
- epsOut << line << "\n";
- }
- }
- epsIn.close();
- epsOut.close();
- }
- else
- {
- err("Problems correcting the eps files from %s_tmp.eps to %s_tmp_corr.eps\n",
- qPrint(formBase),qPrint(formBase));
- Dir::setCurrent(oldDir);
- return;
- }
+ if (!updateEPSBoundingBox(formBase,x1,y1,x2,y2,x1hi,y1hi,x2hi,y2hi)) break;
if (hd==HighDPI::On) // for high DPI display it looks much better if the
// image resolution is higher than the display resolution
scaleFactor*=2;
}
- Portable::sysTimerStop();
- sprintf(args,"-q -dNOSAFER -dBATCH -dNOPAUSE -dEPSCrop -sDEVICE=pnggray -dGraphicsAlphaBits=4 -dTextAlphaBits=4 "
- "-r%d -sOutputFile=form_%d.png %s_tmp_corr.eps",static_cast<int>(scaleFactor*72),pageNum,qPrint(formBase));
- Portable::sysTimerStart();
- if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
- {
- err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
- Portable::sysTimerStop();
- Dir::setCurrent(oldDir);
- return;
- }
- Portable::sysTimerStop();
+ if (!createPNG(formBase,outputFile,scaleFactor)) break;
- if (RM_TMP_FILES)
- {
- thisDir.remove(formBase.str()+"_tmp.eps");
- thisDir.remove(formBase.str()+"_tmp_corr.eps");
- }
+ p->tempFiles.push_back(formBase.str()+"_tmp.eps");
+ p->tempFiles.push_back(formBase.str()+"_tmp_corr.eps");
}
// remove intermediate image files
- if (RM_TMP_FILES)
+ p->tempFiles.push_back(formBase.str()+"_tmp.ps");
+ if (mode==Mode::Light)
{
- thisDir.remove(formBase.str()+"_tmp.ps");
- thisDir.remove(formBase.str()+"_tmp.epsi");
+ p->tempFiles.push_back(formBase.str()+"_tmp.epsi");
}
pageIndex++;
}
// remove intermediate files produced by latex
- if (RM_TMP_FILES)
- {
- thisDir.remove("_formulas.dvi");
- thisDir.remove("_formulas.log"); // keep file in case of errors
- thisDir.remove("_formulas.aux");
- }
+ p->tempFiles.push_back(formulaFileName.str()+".dvi");
+ p->tempFiles.push_back(formulaFileName.str()+".log");
+ p->tempFiles.push_back(formulaFileName.str()+".aux");
}
// remove the latex file itself
- if (RM_TMP_FILES) thisDir.remove("_formulas.tex");
+ p->tempFiles.push_back(formulaFileName.str()+".tex");
// write/update the formula repository so we know what text the
// generated images represent (we use this next time to avoid regeneration
// of the images, and to avoid forcing the user to delete all images in order
// to let a browser refresh the images).
+ std::ofstream f;
f.open("formula.repository",std::ofstream::out | std::ofstream::binary);
if (f.is_open())
{
TextStream t(&f);
- for (size_t i=0; i<p->formulas.size(); i++)
+ for (const auto &formula : p->formulas)
{
- DisplaySize size = p->getDisplaySize(static_cast<int>(i));
- t << "\\_form#" << i;
- if (size.width!=-1 && size.height!=-1)
+ t << "\\_form#" << formula->id();
+ if (formula->width()!=-1 && formula->height()!=-1)
{
- t << "=" << size.width << "x" << size.height;
+ t << "=" << formula->width() << "x" << formula->height();
}
- t << ":" << p->formulas[i].c_str() << "\n";
+ t << ":" << formula->text() << "\n";
}
}
+}
+
+void FormulaManager::generateImages(const QCString &path,Format format,HighDPI hd)
+{
+ Dir d(path.str());
+ // store the original directory
+ if (!d.exists())
+ {
+ term("Output directory '%s' does not exist!\n",qPrint(path));
+ }
+ std::string oldDir = Dir::currentDirPath();
+
+ // go to the html output directory (i.e. path)
+ Dir::setCurrent(d.absPath());
+ Dir thisDir;
+
+ createFormulasTexFile(thisDir,format,hd,Mode::Light);
+ if (Config_getEnum(HTML_COLORSTYLE)!=HTML_COLORSTYLE_t::LIGHT) // all modes other than light need a dark version
+ {
+ // note that the dark version reuses the bounding box of the light version so it needs to be
+ // created after the light version.
+ createFormulasTexFile(thisDir,format,hd,Mode::Dark);
+ }
+
+ // clean up temporary files
+ if (RM_TMP_FILES)
+ {
+ for (const auto &file : p->tempFiles)
+ {
+ thisDir.remove(file);
+ }
+ }
+
// reset the directory to the original location.
Dir::setCurrent(oldDir);
}
void FormulaManager::clear()
{
p->formulas.clear();
- p->formulaMap.clear();
+ p->formulaIdMap.clear();
}
-int FormulaManager::addFormula(const std::string &formulaText)
+int FormulaManager::addFormula(const std::string &formulaText,int width,int height)
{
- auto it = p->formulaMap.find(formulaText);
- if (it!=p->formulaMap.end()) // already stored
+ Formula *formula = p->formulas.find(formulaText);
+ if (formula) // same formula already stored
{
- return static_cast<int>(it->second);
+ return formula->id();
}
- // store new formula
- size_t id = p->formulas.size();
- p->formulaMap.insert(std::make_pair(formulaText,id));
- p->formulas.push_back(formulaText);
- return static_cast<int>(id);
+ // add new formula
+ int id = static_cast<int>(p->formulas.size());
+ formula = p->formulas.add(formulaText.c_str(),id,width,height);
+ p->formulaIdMap.insert(std::make_pair(id,formula));
+ return id;
}
-std::string FormulaManager::findFormula(int formulaId) const
+const Formula *FormulaManager::findFormula(int formulaId) const
{
- if (formulaId>=0 && formulaId<static_cast<int>(p->formulas.size()))
- {
- return p->formulas[formulaId];
- }
- return std::string();
+ auto it = p->formulaIdMap.find(formulaId);
+ return it != p->formulaIdMap.end() ? it->second : nullptr;
}
-bool FormulaManager::hasFormulas() const
+#if 0
+Formula *FormulaManager::findFormula(int formulaId)
{
- return !p->formulas.empty();
+ auto it = p->formulaIdMap.find(formulaId);
+ return it != p->formulaIdMap.end() ? it->second : nullptr;
}
+#endif
-FormulaManager::DisplaySize FormulaManager::displaySize(int formulaId) const
+
+bool FormulaManager::hasFormulas() const
{
- return p->getDisplaySize(formulaId);
+ return !p->formulas.empty();
}
// helper function to detect and return the major version of inkscape.
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
#include <string>
#include "qcstring.h"
+#include "containers.h"
+
+class Dir;
+
+/** Class representing a LaTeX formula as found in the documentation */
+class Formula
+{
+ public:
+ Formula(const QCString &text,int id,int width=-1,int height=-1)
+ : m_text(text), m_id(id), m_width(width), m_height(height) {}
+
+ int width() const { return m_width; }
+ int height() const { return m_height; }
+ int id() const { return m_id; }
+ QCString text() const { return m_text; }
+ bool isCached() const { return m_cached && !m_forceRegen; }
+ bool isCachedDark() const { return m_cached && !m_forceRegen; }
+
+ private:
+ friend class FormulaManager;
+ void setWidth(int width) { m_width = width; }
+ void setHeight(int height) { m_height = height; }
+ void setCached(bool cached) { m_cached = cached; m_forceRegen = m_forceRegen || !cached; }
+ void setCachedDark(bool cached) { m_cachedDark = cached; m_forceRegen = m_forceRegen || !cached; }
+
+ QCString m_text;
+ int m_id;
+ int m_width;
+ int m_height;
+ bool m_cached = false;
+ bool m_cachedDark = false; // dark version cached?
+ bool m_forceRegen = false; // true if there is an inconsistency in setCache calls
+};
/*! Manager class to handle formulas */
class FormulaManager
{
public:
- struct DisplaySize
- {
- DisplaySize(int w,int h) : width(w), height(h) {}
- int width;
- int height;
- };
+ static FormulaManager &instance();
+
+ //! @name repository functions
+ //! @{
+ void initFromRepository(const QCString &dir);
+ void checkRepositories();
+ //! @}
+
+ //! @name formula functions
+ //! @{
+ void clear();
+ int addFormula(const std::string &formulaText,int width=-1,int height=-1);
+ const Formula *findFormula(int formulaId) const;
+ bool hasFormulas() const;
+ //! @}
+
+ //! @name generator functions
+ //! @{
enum class Format { Bitmap, Vector };
enum class HighDPI { On, Off };
- static FormulaManager &instance();
- void readFormulas(const QCString &dir,bool doCompare=false);
- void clear();
- int addFormula(const std::string &formulaText);
- void generateImages(const QCString &outputDir,Format format,HighDPI hd = HighDPI::Off) const;
- std::string findFormula(int formulaId) const;
- bool hasFormulas() const;
- DisplaySize displaySize(int formulaId) const;
+ void generateImages(const QCString &outputDir,Format format,HighDPI hd = HighDPI::Off);
+ //! @}
+
private:
+ enum class Mode { Dark, Light };
+ void createFormulasTexFile(Dir &d,Format format,HighDPI hd,Mode mode);
+ void createLatexFile(const QCString &fileName,Format format,Mode mode,IntVector &formulasToGenerate);
+ double updateFormulaSize(int pageNum,int x1,int y1,int x2,int y2);
FormulaManager();
struct Private;
std::unique_ptr<Private> p;
#include "fortranscanner.h"
#include "containers.h"
-const int fixedCommentAfter = 72;
-
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
#define DBG_CTX(x) do { } while(0)
bool endComment = false;
TooltipManager tooltipManager;
+
+ int fixedCommentAfter = 72;
};
#if USE_STATE2STRING
static MemberDef *getFortranDefs(yyscan_t yyscanner,const QCString &memberName, const QCString &moduleName,
const UseMap &useMap);
static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
+static inline void pop_state(yyscan_t yyscanner);
//-------------------------------------------------------------------
}
<Use,UseOnly,Import>"\n" {
unput(*yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
YY_FTN_RESET
}
<*>"import"{BS}/"\n" |
yyextra->currentModule = yyextra->currentModule.lower();
}
generateLink(yyscanner,*yyextra->code,yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<ClassName>({ACCESS_SPEC}|ABSTRACT|EXTENDS)/[,:( ] { //| variable declaration
startFontClass(yyscanner,"keyword");
endFontClass(yyscanner);
}
<ClassName>\n { // interface may be without name
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
YY_FTN_REJECT;
}
<Start>^{BS}"end"({BS_}"enum").* {
}
<Subprog,Subprogend>"\n" { codifyLines(yyscanner,yytext);
yyextra->contLineNr++;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
YY_FTN_RESET
}
<Start>"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"enum"|"type"|"interface")?{BS} { // Fortran subroutine or function ends
}
<Subprogend>{ID}/{BS}(\n|!|;) {
generateLink(yyscanner,*yyextra->code,yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<Start>"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"enum"|"type"|"interface"){BS}/(\n|!|;) { // Fortran subroutine or function ends
//cout << "===> end function " << yytext << endl;
}
<DeclarationBinding>{ID} { // Type bound procedure link
generateLink(yyscanner,*yyextra->code, yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<Declaration>[(] { // start of array or type / class specification
yyextra->bracketCount++;
yyextra->contLineNr++;
codifyLines(yyscanner,yytext);
yyextra->bracketCount = 0;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
YY_FTN_RESET
}
<Declaration,DeclarationBinding>"\n" { // end declaration line (?)
if (!(yyextra->hasContLine && yyextra->hasContLine[yyextra->contLineNr - 1]))
{
yyextra->isExternal = false;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
YY_FTN_RESET
}
yyextra->insideBody=TRUE;
generateLink(yyscanner,*yyextra->code, yytext);
yyextra->insideBody=FALSE;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<Start>{ID}{BS}/"(" { // function call
if (yyextra->isFixedForm && yy_my_start == 6)
}
unput(*yytext);
yyextra->contLineNr--;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
YY_FTN_RESET
}
startFontClass(yyscanner,"stringliteral");
codifyLines(yyscanner,yyextra->str);
endFontClass(yyscanner);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<String>. {yyextra->str+=yytext;}
<*>^{BS}"type"{BS}"=" { yyextra->code->codify(QCString(yytext)); }
<*>[\x80-\xFF]* { // keep utf8 characters together...
- if (yyextra->isFixedForm && yy_my_start > fixedCommentAfter)
+ if (yyextra->isFixedForm && yy_my_start > yyextra->fixedCommentAfter)
{
startFontClass(yyscanner,"comment");
codifyLines(yyscanner,yytext);
}
}
<*>. {
- if (yyextra->isFixedForm && yy_my_start > fixedCommentAfter)
+ if (yyextra->isFixedForm && yy_my_start > yyextra->fixedCommentAfter)
{
//yy_push_state(YY_START,yyscanner);
//BEGIN(DocBlock);
yyextra->hasContLine = (int *) malloc((numLines) * sizeof(int));
for (i = 0; i < numLines; i++)
yyextra->hasContLine[i] = 0;
- p = prepassFixedForm(s, yyextra->hasContLine);
+ p = prepassFixedForm(s, yyextra->hasContLine,yyextra->fixedCommentAfter);
yyextra->hasContLine[0] = 0;
}
if (yyextra->isFixedForm)
{
checkContLines(yyscanner,yyextra->inputString);
+ yyextra->fixedCommentAfter = Config_getInt(FORTRAN_COMMENT_AFTER);
}
yyextra->currentFontClass = 0;
yyextra->insideCodeLine = FALSE;
printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? qPrint(fileDef->fileName()): NULL);
}
+static inline void pop_state(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if ( yyg->yy_start_stack_ptr <= 0 )
+ warn(yyextra->fileName,yyextra->yyLineNr,"Unexpected statement '%s'",yytext );
+ else
+ yy_pop_state(yyscanner);
+}
//---------------------------------------------------------
#if USE_STATE2STRING
FortranOutlineParserFixed() : FortranOutlineParser(FortranFormat_Fixed) { }
};
-const char* prepassFixedForm(const char* contents, int *hasContLine);
+const char* prepassFixedForm(const char* contents, int *hasContLine, int fixedCommentAfter);
#endif
#include "debug.h"
#include "markdown.h"
-const int fixedCommentAfter = 72;
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
//! Holds program scope->symbol name->symbol modifiers.
std::map<Entry*,std::map<std::string,SymbolModifiers> > modifiers;
int anonCount = 0 ;
+
+ int fixedCommentAfter = 72;
+ //! counter for the number of main programs in this file
+ int mainPrograms = 0;
};
//-----------------------------------------------------------------------------
static void addInterface(yyscan_t yyscanner,QCString name, InterfaceType type);
static Argument *getParameter(yyscan_t yyscanner,const QCString &name);
static void scanner_abort(yyscan_t yyscanner);
+static inline void pop_state(yyscan_t yyscanner);
static void startScope(yyscan_t yyscanner,Entry *scope);
static bool endScope(yyscan_t yyscanner,Entry *scope, bool isGlobalRoot=FALSE);
#include "doxygen_lex.h"
#define YY_USER_ACTION yyextra->colNr+=(int)yyleng;
#define INVALID_ENTRY ((Entry*)0x8)
+
+
//-----------------------------------------------------------------------------
%}
ACCESS_SPEC (PRIVATE|PUBLIC)
LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}((,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})|(,{BS}NAME{BS}"="{BS}"'"(.*)"'"{BS}))?")"
/* Assume that attribute statements are almost the same as attributes. */
-ATTR_STMT {ATTR_SPEC}|DIMENSION|{ACCESS_SPEC}
+ATTR_STMT {ATTR_SPEC}|DIMENSION
EXTERNAL_STMT (EXTERNAL)
CONTAINS CONTAINS
//printf("BUFFER:%s\n", (const char*)yyextra->inputStringPrepass);
pushBuffer(yyscanner,yyextra->inputStringPrepass);
yyextra->colNr = 0;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
else
{ // simple line
{
yyextra->initializer+=yytext;
}
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<String>. { if (yy_top_state(yyscanner) == Initialization ||
yy_top_state(yyscanner) == ArrayInitializer)
DBG_CTX((stderr,"start comment %d\n",yyextra->lineNr));
}
}
-<StrIgnore>.?/\n { yy_pop_state(yyscanner); // comment ends with endline character
+<StrIgnore>.?/\n { pop_state(yyscanner); // comment ends with endline character
DBG_CTX((stderr,"end comment %d %s\n",yyextra->lineNr,qPrint(yyextra->debugStr)));
} // comment line ends
<StrIgnore>. { yyextra->debugStr+=yytext; }
yyextra->current->section=Entry::USINGDIR_SEC;
yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
yyextra->current->lang = SrcLangExt_Fortran;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<Use>{ID}/, {
yyextra->useModuleName=yytext;
<Use,UseOnly>"\n" {
yyextra->colNr -= 1;
unput(*yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
/* INTERFACE definitions */
yyterminate();
}
yyextra->ifType = IF_NONE;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<InterfaceBody>module{BS}procedure { yy_push_state(YY_START,yyscanner);
BEGIN(ModuleProcedure);
}
-<ModuleProcedure>{ID} { if (yyextra->ifType == IF_ABSTRACT || yyextra->ifType == IF_SPECIFIC)
+<ModuleProcedure>{ID} { QCString name = QCString(yytext).lower();
+ if (yyextra->ifType == IF_ABSTRACT || yyextra->ifType == IF_SPECIFIC)
{
- addInterface(yyscanner,yytext, yyextra->ifType);
+ addInterface(yyscanner,name, yyextra->ifType);
startScope(yyscanner,yyextra->last_entry.get());
}
yyextra->current->section = Entry::FUNCTION_SEC ;
- yyextra->current->name = yytext;
+ yyextra->current->name = name;
yyextra->moduleProcedures.push_back(yyextra->current);
addCurrentEntry(yyscanner,true);
}
<ModuleProcedure>"\n" { yyextra->colNr -= 1;
unput(*yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<InterfaceBody>. {}
//if (!endScope(yyscanner,yyextra->current_root))
// yyterminate();
yyextra->defaultProtection = Public;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<Start,ModuleBody,ModuleBodyContains>"end"({BS}(module|program)({BS_}{ID})?)?{BS}/(\n|!|;) { // end module
resolveModuleProcedures(yyscanner,yyextra->current_root);
}
else
{
- yy_pop_state(yyscanner); // cannot pop artrificial entry
+ pop_state(yyscanner); // cannot pop artrificial entry
}
}
else
/*------- access specification --------------------------------------------------------------------------*/
-<ModuleBody>private/{BS}(\n|"!") { yyextra->defaultProtection = Private;
- yyextra->current->protection = yyextra->defaultProtection ;
- }
-<ModuleBody>public/{BS}(\n|"!") { yyextra->defaultProtection = Public;
- yyextra->current->protection = yyextra->defaultProtection ;
- }
+<ModuleBody,TypedefBody,TypedefBodyContains>private/{BS}(\n|"!") {
+ yyextra->defaultProtection = Private;
+ yyextra->current->protection = yyextra->defaultProtection ;
+ }
+<ModuleBody,TypedefBody,TypedefBodyContains>public/{BS}(\n|"!") {
+ yyextra->defaultProtection = Public;
+ yyextra->current->protection = yyextra->defaultProtection ;
+ }
/*------- type definition -------------------------------------------------------------------------------*/
}
yy_push_state(Typedef,yyscanner);
- yyextra->current->protection = yyextra->defaultProtection;
- yyextra->typeProtection = yyextra->defaultProtection;
+ yyextra->current->protection = Package; // invalid in Fortran, replaced below
+ yyextra->typeProtection = Public;
yyextra->typeMode = true;
}
<Typedef>{
}
public {
yyextra->current->protection = Public;
- yyextra->typeProtection = Public;
}
private {
yyextra->current->protection = Private;
- yyextra->typeProtection = Private;
}
{LANGUAGE_BIND_SPEC} {
/* ignored for now */
yyextra->current->name = yyextra->current_root->name + "::" + yyextra->current->name;
}
+ // set modifiers to allow adjusting public/private in surrounding module scope
+ if( yyextra->current->protection == Package )
+ {
+ yyextra->current->protection = yyextra->defaultProtection;
+ }
+ else if( yyextra->current->protection == Public )
+ {
+ yyextra->modifiers[yyextra->current_root][yyextra->current->name.lower().str()] |= QCString("public");
+ }
+ else if( yyextra->current->protection == Private )
+ {
+ yyextra->modifiers[yyextra->current_root][yyextra->current->name.lower().str()] |= QCString("private");
+ }
+
addCurrentEntry(yyscanner,true);
startScope(yyscanner,yyextra->last_entry.get());
BEGIN(TypedefBody);
yyterminate();
}
yyextra->typeMode = false;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
^{BS}"end"{BS}/(\n|!|;) { /* incorrect end type definition */
warn(yyextra->fileName,yyextra->lineNr, "Found 'END' instead of 'END TYPE'");
yyterminate();
}
yyextra->typeMode = false;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
}
}
yyextra->subrCurrent.pop_back();
yyextra->vtype = V_IGNORE;
- yy_pop_state(yyscanner) ;
+ pop_state(yyscanner) ;
}
<BlockData>{
{ID} {
{ATTR_STMT}/{BS}"::" {
/* attribute statement starts */
DBG_CTX((stderr,"5=========> Attribute statement: %s\n", yytext));
+ if (YY_START == Start)
+ {
+ addModule(yyscanner);
+ yy_push_state(ModuleBody,yyscanner); //anon program
+ }
QCString tmp = yytext;
yyextra->currentModifiers |= tmp.stripWhiteSpace();
yyextra->argType="";
yy_push_state(YY_START,yyscanner);
BEGIN( AttributeList ) ;
}
+"common" {
+ if (YY_START == Start)
+ {
+ addModule(yyscanner);
+ yy_push_state(ModuleBody,yyscanner); //anon program
+ }
+ }
{ID} {
+ if (YY_START == Start)
+ {
+ addModule(yyscanner);
+ yy_push_state(ModuleBody,yyscanner); //anon program
+ }
}
^{BS}"type"{BS_}"is"/{BT_} {}
^{BS}"type"{BS}"=" {}
/* work around for bug in QCString.replace (QCString works) */
QCString name=yytext;
name = name.lower();
+ /* if variable/type/etc is part of a module, mod name is necessary for output */
+ // get surrounding state
+ int currentState = YY_START;
+ yy_pop_state(yyscanner);
+ int outerState = YY_START;
+ yy_push_state(currentState,yyscanner);
+ if( outerState == Start || outerState == ModuleBody )
+ {
+ if ((yyextra->current_root) &&
+ (yyextra->current_root->section == Entry::CLASS_SEC
+ || yyextra->current_root->section == Entry::NAMESPACE_SEC))
+ {
+ name = yyextra->current_root->name + "::" + name;
+ }
+ }
/* remember attributes for the symbol */
yyextra->modifiers[yyextra->current_root][name.lower().str()] |= yyextra->currentModifiers;
yyextra->argName= name;
BEGIN(Initialization);
}
<Variable>"\n" { yyextra->currentModifiers = SymbolModifiers();
- yy_pop_state(yyscanner); // end variable declaration list
+ pop_state(yyscanner); // end variable declaration list
newLine(yyscanner);
yyextra->docBlock.resize(0);
}
<Variable>";".*"\n" { yyextra->currentModifiers = SymbolModifiers();
- yy_pop_state(yyscanner); // end variable declaration list
+ pop_state(yyscanner); // end variable declaration list
yyextra->docBlock.resize(0);
yyextra->inputStringSemi = " \n"+QCString(yytext+1);
yyextra->lineNr--;
<Initialization>{COMMA} { if (yyextra->initializerScope == 0)
{
updateVariablePrepassComment(yyscanner,yyextra->colNr-(int)yyleng, yyextra->colNr);
- yy_pop_state(yyscanner); // end initialization
+ pop_state(yyscanner); // end initialization
if (yyextra->last_enum)
{
yyextra->last_enum->initializer.str(yyextra->initializer.str());
}
}
<Initialization>"\n"|"!" { //|
- yy_pop_state(yyscanner); // end initialization
+ pop_state(yyscanner); // end initialization
if (yyextra->last_enum)
{
yyextra->last_enum->initializer.str(yyextra->initializer.str());
yyterminate();
}
yyextra->typeMode = false;
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
/*------ fortran subroutine/function handling ------------------------------------------------------------*/
/* Start is initial condition */
<Subprog>{BS} { /* ignore white space */ }
<Subprog>{ID} { yyextra->current->name = yytext;
//cout << "1a==========> got " << yyextra->current->type << " " << yytext << " " << yyextra->lineNr << endl;
- yyextra->modifiers[yyextra->current_root][yyextra->current->name.lower().str()].returnName = yyextra->current->name.lower();
+ QCString returnName = yyextra->current->name.lower();
+ /* if type is part of a module, mod name is necessary for output */
+ if ((yyextra->current_root) &&
+ (yyextra->current_root->section == Entry::CLASS_SEC ||
+ yyextra->current_root->section == Entry::NAMESPACE_SEC))
+ {
+ yyextra->current->name= yyextra->current_root->name + "::" + yyextra->current->name;
+ }
+ yyextra->modifiers[yyextra->current_root][yyextra->current->name.lower().str()].returnName = returnName;
if (yyextra->ifType == IF_ABSTRACT || yyextra->ifType == IF_SPECIFIC)
{
yyextra->current_root->name = substitute(
- yyextra->current_root->name, "$interface$", yytext);
+ yyextra->current_root->name, "$interface$", QCString(yytext).lower());
}
BEGIN(Parameterlist);
{
subrHandleCommentBlockResult(yyscanner,yyextra->docBlock,TRUE);
}
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
yyextra->docBlock.resize(0);
}
yyextra->colNr -= 1;
unput(*yytext);
handleCommentBlock(yyscanner,yyextra->docBlock,TRUE);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
/*-----Prototype parsing -------------------------------------------------------------------------*/
/* change yyextra->comments and bring line continuation character to previous line */
/* also used to set continuation marks in case of fortran code usage, done here as it is quite complicated code */
-const char* prepassFixedForm(const char* contents, int *hasContLine)
+const char* prepassFixedForm(const char* contents, int *hasContLine,int fixedCommentAfter)
{
int column=0;
int prevLineLength=0;
void resolveModuleProcedures(yyscan_t yyscanner,Entry *current_root)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- for (const auto &ce1 : yyextra->moduleProcedures)
+ if (yyextra->moduleProcedures.empty()) return;
+
+ // build up map of available functions
+ std::map<std::string,std::shared_ptr<Entry>> procMap;
{
- // check all entries in this module
- for (const auto &ce2 : current_root->children())
+ for (const auto& cf: current_root->children())
{
- if (ce1->name == ce2->name)
+ if (cf->section != Entry::FUNCTION_SEC)
+ continue;
+
+ // remove scope from name
+ QCString name = cf->name;
{
- copyEntry(ce1, ce2);
+ int end = name.findRev(":");
+ if (end != -1)
+ name.remove(0, end+1);
}
- } // for procedures in yyextra->current module
+
+ procMap.insert(std::make_pair(name.str(), cf));
+ }
+ }
+
+
+ // for all module procedures
+ for (const auto& ce1: yyextra->moduleProcedures)
+ {
+ if (procMap.find(ce1->name.str())!=procMap.end())
+ {
+ std::shared_ptr<Entry> proc = procMap[ce1->name.str()];
+ copyEntry(ce1, proc);
+ }
} // for all interface module procedures
yyextra->moduleProcedures.clear();
}
// iterate variables: get and apply yyextra->modifiers
for (const auto &ce : scope->children())
{
- if (ce->section != Entry::VARIABLE_SEC && ce->section != Entry::FUNCTION_SEC)
+ if (ce->section != Entry::VARIABLE_SEC && ce->section != Entry::FUNCTION_SEC && ce->section != Entry::CLASS_SEC && ce->section != Entry::FUNCTION_SEC)
continue;
//cout<<ce->name<<", "<<mdfsMap.contains(ce->name.lower())<<mdfsMap.count()<<endl;
if (mdfsMap.find(ce->name.lower().str())!=mdfsMap.end())
applyModifiers(ce.get(), mdfsMap[ce->name.lower().str()]);
+
+ // remove prefix for variable names
+ if (ce->section == Entry::VARIABLE_SEC || ce->section == Entry::FUNCTION_SEC)
+ {
+ int end = ce->name.findRev(":");
+ if (end != -1)
+ ce->name.remove(0, end+1);
+ }
}
}
QCString fname = yyextra->fileName;
int index = std::max(fname.findRev('/'), fname.findRev('\\'));
fname = fname.right(fname.length()-index-1);
+ if (yyextra->mainPrograms) fname += "__" + QCString().setNum(yyextra->mainPrograms);
+ yyextra->mainPrograms++;
fname = fname.prepend("__").append("__");
- yyextra->current->name = fname;
+ yyextra->current->name = substitute(fname, ".", "_");
}
yyextra->current->type = "program";
yyextra->current->fileName = yyextra->fileName;
if (yyextra->isFixedForm)
{
+ yyextra->fixedCommentAfter = Config_getInt(FORTRAN_COMMENT_AFTER);
msg("Prepassing fixed form of %s\n", qPrint(fileName));
//printf("---strlen=%d\n", strlen(fileBuf));
//clock_t start=clock();
//printf("Input fixed form string:\n%s\n", fileBuf);
//printf("===========================\n");
- yyextra->inputString = prepassFixedForm(fileBuf, nullptr);
+ yyextra->inputString = prepassFixedForm(fileBuf, nullptr,yyextra->fixedCommentAfter);
Debug::print(Debug::FortranFixed2Free,0,"======== Fixed to Free format =========\n---- Input fixed form string ------- \n%s\n", fileBuf);
Debug::print(Debug::FortranFixed2Free,0,"---- Resulting free form string ------- \n%s\n", yyextra->inputString);
//printf("Resulting free form string:\n%s\n", yyextra->inputString);
//exit(-1);
}
+static inline void pop_state(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if ( yyg->yy_start_stack_ptr <= 0 )
+ warn(yyextra->fileName,yyextra->lineNr,"Unexpected statement '%s'",yytext );
+ else
+ yy_pop_state(yyscanner);
+}
//----------------------------------------------------------------------------
#include "fortranscanner.l.h"
*/
)LIC";
+struct FTVNode;
+using FTVNodePtr = std::shared_ptr<FTVNode>;
+using FTVNodeWeakPtr = std::weak_ptr<FTVNode>;
+using FTVNodes = std::vector<FTVNodePtr>;
+
struct FTVNode
{
FTVNode(bool dir,const QCString &r,const QCString &f,const QCString &a,
const QCString &n,bool sepIndex,bool navIndex,const Definition *df)
- : isLast(TRUE), isDir(dir),ref(r),file(f),anchor(a),name(n), index(0),
- parent(0), separateIndex(sepIndex), addToNavIndex(navIndex),
+ : isLast(TRUE), isDir(dir), ref(r), file(f), anchor(a), name(n),
+ separateIndex(sepIndex), addToNavIndex(navIndex),
def(df) {}
- ~FTVNode() { for (const auto &child : children) delete child; }
+ ~FTVNode() = default;
int computeTreeDepth(int level) const;
int numNodesAtLevel(int level,int maxLevel) const;
bool isLast;
QCString file;
QCString anchor;
QCString name;
- int index;
- std::vector<FTVNode*> children;
- FTVNode *parent;
+ int index = 0;
+ FTVNodes children;
+ FTVNodeWeakPtr parent;
bool separateIndex;
bool addToNavIndex;
const Definition *def;
//----------------------------------------------------------------------------
+struct FTVHelp::Private
+{
+ Private(bool TLI) : topLevelIndex(TLI) { indentNodes.resize(1); }
+ std::vector<FTVNodes> indentNodes;
+ int indent = 0;
+ bool topLevelIndex;
+
+ void generateTree(TextStream &t,const FTVNodes &nl,int level,int maxLevel,int &index);
+ void generateLink(TextStream &t,const FTVNodePtr &n);
+};
+
/*! Constructs an ftv help object.
* The object has to be \link initialize() initialized\endlink before it can
* be used.
*/
-FTVHelp::FTVHelp(bool TLI)
-{
- /* initial depth */
- m_indentNodes.resize(1);
- m_indent=0;
- m_topLevelIndex = TLI;
-}
-
-/*! Destroys the ftv help object. */
-FTVHelp::~FTVHelp()
-{
- for (auto &idx : m_indentNodes)
- {
- for (auto &n : idx)
- {
- delete n;
- }
- idx.clear();
- }
- m_indentNodes.clear();
-}
+FTVHelp::FTVHelp(bool TLI) : p(std::make_unique<Private>(TLI)) {}
+FTVHelp::~FTVHelp() = default;
+FTVHelp::FTVHelp(FTVHelp &&) = default;
/*! This will create a folder tree view table of contents file (tree.js).
* \sa finalize()
*/
void FTVHelp::incContentsDepth()
{
- //printf("%p: incContentsDepth() indent=%d\n",this,m_indent);
- m_indent++;
- m_indentNodes.resize(m_indent+1);
+ //printf("%p: incContentsDepth() indent=%d\n",this,p->indent);
+ p->indent++;
+ p->indentNodes.resize(p->indent+1);
}
/*! Decrease the level of the contents hierarchy.
*/
void FTVHelp::decContentsDepth()
{
- //printf("%p: decContentsDepth() indent=%d\n",this,m_indent);
- ASSERT(m_indent>0);
- if (m_indent>0)
+ //printf("%p: decContentsDepth() indent=%d\n",this,p->indent);
+ ASSERT(p->indent>0);
+ if (p->indent>0)
{
- m_indent--;
- std::vector<FTVNode*> &nl = m_indentNodes[m_indent];
+ p->indent--;
+ auto &nl = p->indentNodes[p->indent];
if (!nl.empty())
{
- FTVNode *parent = nl.back();
- std::vector<FTVNode*> &children = m_indentNodes[m_indent+1];
+ auto &parent = nl.back();
+ auto &children = p->indentNodes[p->indent+1];
for (const auto &child : children)
{
parent->children.push_back(child);
const Definition *def
)
{
- //printf("%p: m_indent=%d addContentsItem(%s,%s,%s,%s)\n",this,m_indent,name,ref,file,anchor);
- std::vector<FTVNode*> &nl = m_indentNodes[m_indent];
- FTVNode *newNode = new FTVNode(isDir,ref,file,anchor,name,separateIndex,addToNavIndex,def);
+ //printf("%p: p->indent=%d addContentsItem(%s,%s,%s,%s)\n",this,p->indent,name,ref,file,anchor);
+ auto &nl = p->indentNodes[p->indent];
if (!nl.empty())
{
nl.back()->isLast=FALSE;
}
+ auto newNode = std::make_shared<FTVNode>(isDir,ref,file,anchor,name,separateIndex,addToNavIndex,def);
nl.push_back(newNode);
newNode->index = static_cast<int>(nl.size()-1);
- if (m_indent>0)
+ if (p->indent>0)
{
- std::vector<FTVNode*> &pnl = m_indentNodes[m_indent-1];
+ auto &pnl = p->indentNodes[p->indent-1];
if (!pnl.empty())
{
newNode->parent = pnl.back();
}
}
-static QCString node2URL(const FTVNode *n,bool overruleFile=FALSE,bool srcLink=FALSE)
+static QCString node2URL(const FTVNodePtr &n,bool overruleFile=FALSE,bool srcLink=FALSE)
{
QCString url = n->file;
if (!url.isEmpty() && url.at(0)=='!') // relative URL
return url;
}
-QCString FTVHelp::generateIndentLabel(FTVNode *n,int level)
+static QCString generateIndentLabel(const FTVNodePtr &n,int level)
{
QCString result;
- if (n->parent)
+ auto parent = n->parent.lock();
+ if (parent)
{
- result=generateIndentLabel(n->parent,level+1);
+ result=generateIndentLabel(parent,level+1);
}
result+=QCString().setNum(n->index)+"_";
return result;
}
-void FTVHelp::generateIndent(TextStream &t, FTVNode *n,bool opened)
+static void generateIndent(TextStream &t, const FTVNodePtr &n,bool opened)
{
int indent=0;
- FTVNode *p = n->parent;
- while (p) { indent++; p=p->parent; }
+ auto parent = n->parent.lock();
+ while (parent) { indent++; parent=parent->parent.lock(); }
if (n->isDir)
{
QCString dir = opened ? "▼" : "►";
}
}
-void FTVHelp::generateLink(TextStream &t,FTVNode *n)
+void FTVHelp::Private::generateLink(TextStream &t,const FTVNodePtr &n)
{
//printf("FTVHelp::generateLink(ref=%s,file=%s,anchor=%s\n",
// qPrint(n->ref),qPrint(n->file),qPrint(n->anchor));
t << node2URL(n);
if (!setTarget)
{
- if (m_topLevelIndex)
+ if (topLevelIndex)
t << "\" target=\"basefrm\">";
else
t << "\" target=\"_self\">";
return icon;
}
-void FTVHelp::generateTree(TextStream &t, const std::vector<FTVNode*> &nl,int level,int maxLevel,int &index)
+void FTVHelp::Private::generateTree(TextStream &t, const FTVNodes &nl,int level,int maxLevel,int &index)
{
for (const auto &n : nl)
{
t << "<tr id=\"row_" << generateIndentLabel(n,0) << "\"";
if ((index&1)==0) // even row
t << " class=\"even\"";
+ else
+ t << " class=\"odd\"";
if (level>=maxLevel) // item invisible by default
t << " style=\"display:none;\"";
else // item visible by default
{
};
-static QCString pathToNode(const FTVNode *leaf,const FTVNode *n)
+static QCString pathToNode(const FTVNodePtr &leaf,const FTVNodePtr &n)
{
QCString result;
- if (n->parent)
+ auto parent = n->parent.lock();
+ if (parent)
{
- result+=pathToNode(leaf,n->parent);
+ result+=pathToNode(leaf,parent);
}
result+=QCString().setNum(n->index);
if (leaf!=n) result+=",";
return result;
}
-static bool dupOfParent(const FTVNode *n)
+static bool dupOfParent(const FTVNodePtr &n)
{
- if (n->parent==0) return FALSE;
- if (n->file==n->parent->file) return TRUE;
+ auto parent = n->parent.lock();
+ if (!parent) return FALSE;
+ if (n->file==parent->file) return TRUE;
return FALSE;
}
-static void generateJSLink(TextStream &t,const FTVNode *n)
+static void generateJSLink(TextStream &t,const FTVNodePtr &n)
{
if (n->file.isEmpty()) // no link
{
}
static bool generateJSTree(NavIndexEntryList &navIndex,TextStream &t,
- const std::vector<FTVNode*> &nl,int level,bool &first)
+ const FTVNodes &nl,int level,bool &first)
{
QCString htmlOutput = Config_getString(HTML_OUTPUT);
QCString indentStr;
indentStr.fill(' ',level*2);
+
bool found=FALSE;
for (const auto &n : nl)
{
return found;
}
-static void generateJSNavTree(const std::vector<FTVNode*> &nodeList)
+static void generateJSNavTree(const FTVNodes &nodeList)
{
QCString htmlOutput = Config_getString(HTML_OUTPUT);
std::ofstream f(htmlOutput.str()+"/navtreedata.js",std::ofstream::out | std::ofstream::binary);
QCString dname=Config_getString(HTML_OUTPUT);
const ResourceMgr &rm = ResourceMgr::instance();
rm.copyResource("doc.luma",dname);
+ rm.copyResource("docd.luma",dname);
rm.copyResource("folderopen.luma",dname);
rm.copyResource("folderclosed.luma",dname);
rm.copyResource("splitbar.lum",dname);
+ rm.copyResource("splitbard.lum",dname);
}
// new style scripts
QCString htmlOutput = Config_getString(HTML_OUTPUT);
// generate navtree.js & navtreeindex.js
- generateJSNavTree(m_indentNodes[0]);
+ generateJSNavTree(p->indentNodes[0]);
// copy resize.js & navtree.css
- ResourceMgr::instance().copyResource("resize.js",htmlOutput);
- ResourceMgr::instance().copyResource("navtree.css",htmlOutput);
+ auto &mgr = ResourceMgr::instance();
+ {
+ std::ofstream f(htmlOutput.str()+"/resize.js",std::ofstream::out | std::ofstream::binary);
+ if (f.is_open())
+ {
+ TextStream t(&f);
+ t << substitute(mgr.getAsString("resize.js"), "$TREEVIEW_WIDTH", QCString().setNum(Config_getInt(TREEVIEW_WIDTH)));
+ }
+ }
+ {
+ std::ofstream f(htmlOutput.str()+"/navtree.css",std::ofstream::out | std::ofstream::binary);
+ if (f.is_open())
+ {
+ TextStream t(&f);
+ t << HtmlGenerator::getNavTreeCss();
+ }
+ }
}
// write tree inside page
int preferredNumEntries = Config_getInt(HTML_INDEX_NUM_ENTRIES);
t << "<div class=\"directory\">\n";
int d=1, depth=1;
- for (const auto &n : m_indentNodes[0])
+ for (const auto &n : p->indentNodes[0])
{
if (!n->children.empty())
{
for (int i=1;i<=depth;i++)
{
int num=0;
- for (const auto &n : m_indentNodes[0])
+ for (const auto &n : p->indentNodes[0])
{
num+=n->numNodesAtLevel(0,i);
}
}
//printf("preferred depth=%d\n",preferredDepth);
- if (!m_indentNodes[0].empty())
+ if (!p->indentNodes[0].empty())
{
t << "<table class=\"directory\">\n";
int index=0;
- generateTree(t,m_indentNodes[0],0,preferredDepth,index);
+ p->generateTree(t,p->indentNodes[0],0,preferredDepth,index);
t << "</table>\n";
}
#ifndef FTVHELP_H
#define FTVHELP_H
+#include <memory>
#include <vector>
-#include "index.h"
+#include "qcstring.h"
class Definition;
+class MemberDef;
class TextStream;
-struct FTVNode;
+
/** A class that generates a dynamic tree view side panel.
*/
-class FTVHelp : public IndexIntf
+class FTVHelp
{
public:
FTVHelp(bool LTI);
~FTVHelp();
+ FTVHelp(FTVHelp &&);
void initialize();
void finalize();
void incContentsDepth();
static void generateTreeViewImages();
void generateTreeViewScripts();
private:
- void generateTree(TextStream &t,const std::vector<FTVNode*> &nl,int level,int maxLevel,int &index);
- QCString generateIndentLabel(FTVNode *n,int level);
- void generateIndent(TextStream &t,FTVNode *n,bool opened);
- void generateLink(TextStream &t,FTVNode *n);
- std::vector< std::vector<FTVNode*> > m_indentNodes;
- int m_indent;
- bool m_topLevelIndex;
+ struct Private;
+ std::unique_ptr<Private> p;
};
extern const char *JAVASCRIPT_LICENSE_TEXT;
MemberList * ml = getMemberList(lmd->type);
if (ml)
{
- ml->writeTagFile(tagFile);
+ ml->writeTagFile(tagFile,true);
}
}
}
{
for (const auto &mg : m_memberGroups)
{
- mg->writeTagFile(tagFile);
+ mg->writeTagFile(tagFile,true);
}
}
break;
m_pos+=l;
}
}
+ void addInt(const char *fmt,int value) {
+ char tmp[50];
+ snprintf(tmp,50,fmt,value);
+ addStr(tmp);
+ }
char *get() { return m_str; }
const char *get() const { return m_str; }
size_t getPos() const { return m_pos; }
#include "plantuml.h"
#include "formula.h"
#include "fileinfo.h"
+#include "indexlist.h"
+#include "growbuf.h"
static const int NUM_HTML_LIST_TYPES = 4;
static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
/* <hr> */ DocHorRuler,
/* <blockquote> */ DocHtmlBlockQuote,
/* \parblock */ DocParBlock,
+ /* <details> */ DocHtmlDetails,
DocIncOperator >(n))
{
return TRUE;
case DocStyleChange::Span:
if (s.enable()) m_t << "<span" << htmlAttribsToString(s.attribs()) << ">"; else m_t << "</span>";
break;
- case DocStyleChange::Details:
- if (s.enable()) m_t << "<details" << htmlAttribsToString(s.attribs()) << ">\n"; else m_t << "</details>\n";
- break;
case DocStyleChange::Summary:
if (s.enable()) m_t << "<summary" << htmlAttribsToString(s.attribs()) << ">"; else m_t << "</summary>";
break;
}
else
{
- m_t << "<img class=\"formula"
- << (bDisplay ? "Dsp" : "Inl");
- m_t << "\" alt=\"";
- filterQuotedCdataAttr(f.text());
- m_t << "\"";
- m_t << " src=\"" << f.relPath() << f.name();
- if (Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg)
- {
- m_t << ".svg";
- }
- else
- {
- m_t << ".png";
- }
- FormulaManager::DisplaySize size = FormulaManager::instance().displaySize(f.id());
- if (size.width!=-1)
- {
- m_t << "\" width=\"" << size.width;
- }
- if (size.height!=-1)
+ const Formula *formula = FormulaManager::instance().findFormula(f.id());
+
+ enum class ImageType { Light, Dark };
+ enum class Visibility { Always, Dark, Light, AutoDark, AutoLight };
+ auto writeFormula = [&](ImageType imgType,Visibility visibility) -> QCString {
+ // see https://chipcullen.com/how-to-have-dark-mode-image-that-works-with-user-choice for the design idea
+ TextStream t;
+ QCString extension = Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ? ".svg":".png" ;
+ if (visibility==Visibility::AutoDark || visibility==Visibility::AutoLight)
+ {
+ t << "<picture>";
+ t << "<source srcset=\"" << f.relPath() << f.name();
+ if (visibility==Visibility::AutoDark)
+ {
+ t << extension;
+ t << "\" media=\"(prefers-color-scheme: light)\"";
+ }
+ else // AutoLight
+ {
+ t << "_dark";
+ t << extension;
+ t << "\" media=\"(prefers-color-scheme: dark)\"";
+ }
+ t << "/>";
+ }
+ t << "<img class=\"formula";
+ t << (bDisplay ? "Dsp" : "Inl");
+ if (visibility==Visibility::Light) t << " light-mode-visible";
+ else if (visibility==Visibility::Dark) t << " dark-mode-visible";
+ t << "\" alt=\"" << filterQuotedCdataAttr(f.text()) << "\"" << " src=\"" << f.relPath() << f.name();
+ if (imgType==ImageType::Dark) t << "_dark";
+ t << extension;
+ if (formula && formula->width()!=-1)
+ {
+ t << "\" width=\"";
+ t << formula->width();
+ }
+ if (formula && formula->height()!=-1)
+ {
+ t << "\" height=\"";
+ t << formula->height();
+ }
+ t << "\"/>";
+ if (visibility==Visibility::AutoDark || visibility==Visibility::AutoLight)
+ {
+ t << "</picture>";
+ }
+ return QCString(t.str());
+ };
+
+ auto colorStyle = Config_getEnum(HTML_COLORSTYLE);
+ switch(colorStyle)
{
- m_t << "\" height=\"" << size.height;
+ case HTML_COLORSTYLE_t::LIGHT:
+ m_t << writeFormula(ImageType::Light,Visibility::Always);
+ break;
+ case HTML_COLORSTYLE_t::DARK:
+ m_t << writeFormula(ImageType::Dark, Visibility::Always);
+ break;
+ case HTML_COLORSTYLE_t::AUTO_LIGHT:
+ m_t << writeFormula(ImageType::Light, Visibility::AutoLight);
+ break;
+ case HTML_COLORSTYLE_t::AUTO_DARK:
+ m_t << writeFormula(ImageType::Dark, Visibility::AutoDark);
+ break;
+ case HTML_COLORSTYLE_t::TOGGLE:
+ // write the image twice and use javascript (darkmode_toggle.js) to show only one of them
+ m_t << writeFormula(ImageType::Light,Visibility::Light);
+ m_t << writeFormula(ImageType::Dark, Visibility::Dark);
+ break;
}
- m_t << "\"/>";
}
if (bDisplay)
{
DocSimpleSect,
DocXRefItem,
DocHtmlBlockQuote,
- DocParBlock
+ DocParBlock,
+ DocHtmlDetails
>(*p.parent()))
{
needsTag = TRUE;
void HtmlDocVisitor::operator()(const DocHRef &href)
{
if (m_hide) return;
- if (href.url().left(7)=="mailto:")
+ if (href.url().startsWith("mailto:"))
{
writeObfuscatedMailAddress(href.url().mid(7));
}
m_t << "</a>";
}
+void HtmlDocVisitor::operator()(const DocHtmlDetails &d)
+{
+ if (m_hide) return;
+ forceEndParagraph(d);
+ m_t << "<details " << htmlAttribsToString(d.attribs()) << ">\n";
+ visitChildren(d);
+ m_t << "</details>\n";
+ forceStartParagraph(d);
+}
+
void HtmlDocVisitor::operator()(const DocHtmlHeader &header)
{
if (m_hide) return;
{
if (m_hide) return;
forceEndParagraph(b);
- QCString attrs = htmlAttribsToString(b.attribs());
m_t << "<blockquote class=\"doxtable\"" << htmlAttribsToString(b.attribs()) << ">\n";
visitChildren(b);
m_t << "</blockquote>\n";
/// Escape basic entities to produce a valid CDATA attribute value,
/// assume that the outer quoting will be using the double quote "
-void HtmlDocVisitor::filterQuotedCdataAttr(const QCString &str)
+QCString HtmlDocVisitor::filterQuotedCdataAttr(const QCString &str)
{
- if (str.isEmpty()) return;
+ GrowBuf growBuf;
+ if (str.isEmpty()) return str;
const char *p=str.data();
char c;
while (*p)
c=*p++;
switch(c)
{
- case '&': m_t << "&"; break;
- case '"': m_t << """; break;
- case '<': m_t << "<"; break;
- case '>': m_t << ">"; break;
- case '\\': if ((*p == '(') || (*p == ')'))
- m_t << "\\‍" << *p++;
+ case '&': growBuf.addStr("&"); break;
+ case '"': growBuf.addStr("""); break;
+ case '<': growBuf.addStr("<"); break;
+ case '>': growBuf.addStr(">"); break;
+ case '\\':
+ if ((*p == '(') || (*p == ')'))
+ {
+ growBuf.addStr("\\‍");
+ growBuf.addChar(*p++);
+ }
else
- m_t << c;
+ {
+ growBuf.addChar(c);
+ }
break;
default:
{
uchar uc = static_cast<uchar>(c);
if (uc<32 && !isspace(c)) // non-printable control characters
{
- m_t << "$" << hex[uc>>4] << hex[uc&0xF] << ";";
+ growBuf.addStr("$");
+ growBuf.addChar(hex[uc>>4]);
+ growBuf.addChar(hex[uc&0xF]);
+ growBuf.addStr(";");
}
else
{
- m_t << c;
+ growBuf.addChar(c);
}
}
break;
}
}
+ growBuf.addChar(0);
+ return growBuf.get();
}
void HtmlDocVisitor::startLink(const QCString &ref,const QCString &file,
void operator()(const DocHtmlCaption &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
void writeObfuscatedMailAddress(const QCString &url);
void filter(const QCString &str, const bool retainNewline = false);
- void filterQuotedCdataAttr(const QCString &str);
+ QCString filterQuotedCdataAttr(const QCString &str);
void startLink(const QCString &ref,const QCString &file,
const QCString &relPath,const QCString &anchor,
const QCString &tooltip = "");
for (int i=0;i<g_numHtmlEntities - g_numberHtmlMappedCmds;i++)
{
QCString bareName = g_htmlEntities[i].xml;
- if (!bareName.isEmpty() && bareName.at(0)=='<' && bareName.right(2)=="/>")
+ if (!bareName.isEmpty() && bareName.at(0)=='<' && bareName.endsWith("/>"))
{
bareName = bareName.mid(1,bareName.length()-3); // strip < and />
t << " <xsd:element name=\"" << bareName << "\" type=\"docEmptyType\" />\n";
#include "dir.h"
#include "utf8.h"
#include "textstream.h"
+#include "indexlist.h"
//#define DBG_HTML(x) x;
#define DBG_HTML(x)
{
t << " <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
t << " <span class=\"left\">\n";
- t << " <img id=\"MSearchSelect\" src=\"" << relPath << "search/mag_sel.svg\"\n";
- t << " onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
- t << " onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
- t << " alt=\"\"/>\n";
- t << " <input type=\"text\" id=\"MSearchField\" value=\""
+ t << " <span id=\"MSearchSelect\" ";
+ t << " onmouseover=\"return searchBox.OnSearchSelectShow()\" ";
+ t << " onmouseout=\"return searchBox.OnSearchSelectHide()\"> </span>\n";
+ t << " <input type=\"text\" id=\"MSearchField\" value=\"\" placeholder=\""
<< theTranslator->trSearch() << "\" accesskey=\"S\"\n";
t << " onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
t << " onblur=\"searchBox.OnSearchFieldFocus(false)\" \n";
t << "search.php";
}
t << "\" method=\"get\">\n";
- t << " <img id=\"MSearchSelect\" src=\"" << relPath << "search/mag.svg\" alt=\"\"/>\n";
+ t << " <span id=\"MSearchSelectExt\"> </span>\n";
if (!highlightSearch)
{
- t << " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\""
+ t << " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"\" placeholder=\""
<< theTranslator->trSearch() << "\" size=\"20\" accesskey=\"S\" \n";
t << " onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
t << " onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
}
else
{
- FileInfo cssfi(cssFile.str());
- if (cssfi.exists())
+ if (!cssFile.startsWith("http:") && !cssFile.startsWith("https:"))
{
- cssFile = cssfi.fileName();
- }
- else
- {
- cssFile = "doxygen.css";
+ FileInfo cssfi(cssFile.str());
+ if (cssfi.exists())
+ {
+ cssFile = cssfi.fileName();
+ }
+ else
+ {
+ cssFile = "doxygen.css";
+ }
}
}
{
if (!fileName.empty())
{
- FileInfo fi(fileName);
- if (fi.exists())
+ QCString htmlStyleSheet = fileName.c_str();
+ if (htmlStyleSheet.startsWith("http:") || htmlStyleSheet.startsWith("https:"))
{
- extraCssText += "<link href=\"$relpath^"+stripPath(fileName.c_str())+"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ extraCssText += "<link href=\""+htmlStyleSheet+"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ }
+ else
+ {
+ FileInfo fi(fileName);
+ if (fi.exists())
+ {
+ extraCssText += "<link href=\"$relpath^"+stripPath(fileName.c_str())+"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ }
}
}
}
{
auto mathJaxVersion = Config_getEnum(MATHJAX_VERSION);
QCString path = Config_getString(MATHJAX_RELPATH);
- if (path.isEmpty() || path.left(2)=="..") // relative path
+ if (path.isEmpty() || path.startsWith("..")) // relative path
{
path.prepend(relPath);
}
}
}
+ QCString darkModeJs;
+ if (Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
+ {
+ darkModeJs="<script type=\"text/javascript\" src=\"$relpath^darkmode_toggle.js\"></script>\n";
+ }
+
// first substitute generic keywords
QCString result = substituteKeywords(str,title,
convertToHtml(Config_getString(PROJECT_NAME)),
result = substitute(result,"$searchbox",searchBox);
result = substitute(result,"$search",searchCssJs);
result = substitute(result,"$mathjax",mathJaxJs);
+ result = substitute(result,"$darkmode",darkModeJs);
result = substitute(result,"$generatedby",generatedBy);
result = substitute(result,"$extrastylesheet",extraCssText);
result = substitute(result,"$relpath$",relPath); //<-- obsolete: for backwards compatibility only
return result;
}
+//---------------------------------------------------------------------------------------------
+
+static StringUnorderedMap g_lightMap;
+static StringUnorderedMap g_darkMap;
+
+static void fillColorStyleMap(const QCString &definitions,StringUnorderedMap &map)
+{
+ int p=0,i=0;
+ while ((i=definitions.find('\n',p))!=-1)
+ {
+ QCString line = definitions.mid(p,i-p);
+ if (line.startsWith("--"))
+ {
+ int separator = line.find(':');
+ assert(separator!=-1);
+ std::string key = line.left(separator).str();
+ int semi = line.find(';');
+ assert(semi!=-1);
+ std::string value = line.mid(separator+1,semi-separator-1).stripWhiteSpace().str();
+ map.insert(std::make_pair(key,value));
+ //printf("var(%s)=%s\n",qPrint(key),qPrint(value));
+ }
+ p=i+1;
+ }
+}
+
+static QCString replaceVariables(const QCString &input)
+{
+ auto doReplacements = [&input](const StringUnorderedMap &mapping) -> QCString
+ {
+ GrowBuf output;
+ int p=0,i=0;
+ while ((i=input.find("var(",p))!=-1)
+ {
+ output.addStr(input.data()+p,i-p);
+ int j=input.find(")",i+4);
+ assert(j!=-1);
+ auto it = mapping.find(input.mid(i+4,j-i-4).str()); // find variable
+ assert(it!=mapping.end()); // should be found
+ output.addStr(it->second); // add it value
+ //printf("replace '%s' by '%s'\n",qPrint(input.mid(i+4,j-i-4)),qPrint(it->second));
+ p=j+1;
+ }
+ output.addStr(input.data()+p,input.length()-p);
+ output.addChar(0);
+ return output.get();
+ };
+
+ auto colorStyle = Config_getEnum(HTML_COLORSTYLE);
+ if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
+ {
+ return doReplacements(g_lightMap);
+ }
+ else if (colorStyle==HTML_COLORSTYLE_t::DARK)
+ {
+ return doReplacements(g_darkMap);
+ }
+ else
+ {
+ return input;
+ }
+}
+
+//----------------------------------------------------------------------------------------------
+
+
//--------------------------------------------------------------------------
HtmlCodeGenerator::HtmlCodeGenerator(TextStream &t) : m_t(t)
//printf("HtmlGenerator::~HtmlGenerator()\n");
}
-
void HtmlGenerator::init()
{
QCString dname = Config_getString(HTML_OUTPUT);
createSubDirs(d);
ResourceMgr &mgr = ResourceMgr::instance();
- if (Config_getBool(HTML_DYNAMIC_MENUS))
+ auto colorStyle = Config_getEnum(HTML_COLORSTYLE);
+ if (colorStyle==HTML_COLORSTYLE_t::LIGHT)
{
- mgr.copyResourceAs("tabs.css",dname,"tabs.css");
+ fillColorStyleMap(replaceColorMarkers(mgr.getAsString("lightmode_settings.css")),g_lightMap);
}
- else // stylesheet for the 'old' static tabs
+ else if (colorStyle==HTML_COLORSTYLE_t::DARK)
{
- mgr.copyResourceAs("fixed_tabs.css",dname,"tabs.css");
+ fillColorStyleMap(replaceColorMarkers(mgr.getAsString("darkmode_settings.css")),g_darkMap);
+ }
+
+ {
+ QCString tabsCss;
+ if (Config_getBool(HTML_DYNAMIC_MENUS))
+ {
+ tabsCss = mgr.getAsString("tabs.css");
+ }
+ else // stylesheet for the 'old' static tabs
+ {
+ tabsCss = mgr.getAsString("fixed_tabs.css");
+ }
+
+ std::ofstream f(dname.str()+"/tabs.css",std::ofstream::out | std::ofstream::binary);
+ if (f.is_open())
+ {
+ TextStream t(&f);
+ t << replaceVariables(tabsCss);
+ }
}
+
+
mgr.copyResource("jquery.js",dname);
if (Config_getBool(INTERACTIVE_SVG))
{
mgr.copyResource("menu.js",dname);
}
+ if (colorStyle==HTML_COLORSTYLE_t::TOGGLE)
+ {
+ //mgr.copyResource("darkmode_toggle.js",dname);
+ std::ofstream f(dname.str()+"/darkmode_toggle.js",std::ofstream::out | std::ofstream::binary);
+ if (f.is_open())
+ {
+ TextStream t(&f);
+ t << replaceColorMarkers(mgr.getAsString("darkmode_toggle.js"));
+ }
+ }
+
{
std::ofstream f(dname.str()+"/dynsections.js",std::ofstream::out | std::ofstream::binary);
if (f.is_open())
QCString dname=Config_getString(HTML_OUTPUT);
ResourceMgr &mgr = ResourceMgr::instance();
//writeColoredImgData(dname,colored_tab_data);
- mgr.copyResource("tab_a.lum",dname);
- mgr.copyResource("tab_b.lum",dname);
- mgr.copyResource("tab_h.lum",dname);
- mgr.copyResource("tab_s.lum",dname);
- mgr.copyResource("nav_h.lum",dname);
- mgr.copyResource("nav_f.lum",dname);
- mgr.copyResource("bc_s.luma",dname);
+ mgr.copyResource("tab_a.lum",dname); // active, light mode
+ mgr.copyResource("tab_b.lum",dname); // normal, light mode
+ mgr.copyResource("tab_h.lum",dname); // highlight, light mode
+ mgr.copyResource("tab_s.lum",dname); // separator, light mode
+ mgr.copyResource("tab_ad.lum",dname); // active, dark mode
+ mgr.copyResource("tab_bd.lum",dname); // normal, dark mode
+ mgr.copyResource("tab_hd.lum",dname); // highlight, dark mode
+ mgr.copyResource("tab_sd.lum",dname); // separator, light mode
+ mgr.copyResource("nav_h.lum",dname); // header gradient, light mode
+ mgr.copyResource("nav_hd.lum",dname); // header gradient, dark mode
+ mgr.copyResource("nav_f.lum",dname); // member definition header, light mode
+ mgr.copyResource("nav_fd.lum",dname); // member definition header, dark mode
+ mgr.copyResource("bc_s.luma",dname); // breadcrumb separator, light mode
+ mgr.copyResource("bc_sd.luma",dname); // breadcrumb separator, dark mode
mgr.copyResource("doxygen.svg",dname);
Doxygen::indexList->addImageFile("doxygen.svg");
mgr.copyResource("closed.luma",dname);
void HtmlGenerator::writeSearchData(const QCString &dname)
{
- bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
+ //bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
//writeImgData(dname,serverBasedSearch ? search_server_data : search_client_data);
ResourceMgr &mgr = ResourceMgr::instance();
- mgr.copyResource("search_l.png",dname);
- Doxygen::indexList->addImageFile("search/search_l.png");
- mgr.copyResource("search_m.png",dname);
- Doxygen::indexList->addImageFile("search/search_m.png");
- mgr.copyResource("search_r.png",dname);
- Doxygen::indexList->addImageFile("search/search_r.png");
- if (serverBasedSearch)
- {
- mgr.copyResource("mag.svg",dname);
- Doxygen::indexList->addImageFile("search/mag.svg");
- }
- else
- {
- mgr.copyResource("close.svg",dname);
- Doxygen::indexList->addImageFile("search/close.svg");
- mgr.copyResource("mag_sel.svg",dname);
- Doxygen::indexList->addImageFile("search/mag_sel.svg");
- }
+ // server side search resources
+ mgr.copyResource("mag.svg",dname);
+ mgr.copyResource("mag_d.svg",dname);
+ Doxygen::indexList->addImageFile("search/mag.svg");
+ Doxygen::indexList->addImageFile("search/mag_d.svg");
+
+ // client side search resources
+ mgr.copyResource("close.svg",dname);
+ Doxygen::indexList->addImageFile("search/close.svg");
+ mgr.copyResource("mag_sel.svg",dname);
+ mgr.copyResource("mag_seld.svg",dname);
+ Doxygen::indexList->addImageFile("search/mag_sel.svg");
+ Doxygen::indexList->addImageFile("search/mag_seld.svg");
QCString searchDirName = dname;
std::ofstream f(searchDirName.str()+"/search.css",std::ofstream::out | std::ofstream::binary);
{
TextStream t(&f);
QCString searchCss;
+ // the position of the search box depends on a number of settings.
+ // Insert the right piece of CSS code depending on which options are selected
if (Config_getBool(DISABLE_INDEX))
{
if (Config_getBool(GENERATE_TREEVIEW) && Config_getBool(FULL_SIDEBAR))
{
- searchCss = mgr.getAsString("search_sidebar.css");
+ searchCss = mgr.getAsString("search_sidebar.css"); // we have a full height side bar
+ }
+ else if (Config_getBool(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
+ {
+ searchCss = mgr.getAsString("search_nomenu_toggle.css"); // we have no tabs but do have a darkmode button
}
else
{
- searchCss = mgr.getAsString("search_nomenu.css");
+ searchCss = mgr.getAsString("search_nomenu.css"); // we have no tabs and no darkmode button
}
}
else if (!Config_getBool(HTML_DYNAMIC_MENUS))
{
- searchCss = mgr.getAsString("search_fixedtabs.css");
+ searchCss = mgr.getAsString("search_fixedtabs.css"); // we have tabs, but they are static
}
else
{
- searchCss = mgr.getAsString("search.css");
+ searchCss = mgr.getAsString("search.css"); // default case with a dynamic menu bar
}
+ // and then add the option independent part of the styling
searchCss += mgr.getAsString("search_common.css");
- searchCss = substitute(replaceColorMarkers(searchCss),"$doxygenversion",getDoxygenVersion());
- t << searchCss;
+ searchCss = substitute(searchCss,"$doxygenversion",getDoxygenVersion());
+ t << replaceVariables(searchCss);
Doxygen::indexList->addStyleSheetFile("search/search.css");
}
}
+static void writeDefaultStyleSheet(TextStream &t)
+{
+ t << "/* The standard CSS for doxygen " << getDoxygenVersion() << "*/\n\n";
+ switch (Config_getEnum(HTML_COLORSTYLE))
+ {
+ case HTML_COLORSTYLE_t::LIGHT:
+ case HTML_COLORSTYLE_t::DARK:
+ /* variables will be resolved while writing to the CSS file */
+ break;
+ case HTML_COLORSTYLE_t::AUTO_LIGHT:
+ case HTML_COLORSTYLE_t::TOGGLE:
+ t << "html {\n";
+ t << replaceColorMarkers(ResourceMgr::instance().getAsString("lightmode_settings.css"));
+ t << "}\n\n";
+ break;
+ case HTML_COLORSTYLE_t::AUTO_DARK:
+ t << "html {\n";
+ t << replaceColorMarkers(ResourceMgr::instance().getAsString("darkmode_settings.css"));
+ t << "}\n\n";
+ break;
+ }
+ if (Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_LIGHT)
+ {
+ t << "@media (prefers-color-scheme: dark) {\n";
+ t << " html:not(.dark-mode) {\n";
+ t << " color-scheme: dark;\n\n";
+ t << replaceColorMarkers(ResourceMgr::instance().getAsString("darkmode_settings.css"));
+ t << "}}\n";
+ }
+ else if (Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::AUTO_DARK)
+ {
+ t << "@media (prefers-color-scheme: light) {\n";
+ t << " html:not(.light-mode) {\n";
+ t << " color-scheme: light;\n\n";
+ t << replaceColorMarkers(ResourceMgr::instance().getAsString("lightmode_settings.css"));
+ t << "}}\n";
+ }
+ else if (Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
+ {
+ t << "html.dark-mode {\n";
+ t << replaceColorMarkers(ResourceMgr::instance().getAsString("darkmode_settings.css"));
+ t << "}\n\n";
+ }
+
+ t << replaceVariables(ResourceMgr::instance().getAsString("doxygen.css"));
+}
+
void HtmlGenerator::writeStyleSheetFile(TextStream &t)
{
- t << replaceColorMarkers(substitute(ResourceMgr::instance().getAsString("doxygen.css"),"$doxygenversion",getDoxygenVersion()));
+ writeDefaultStyleSheet(t);
}
void HtmlGenerator::writeHeaderFile(TextStream &t, const QCString & /*cssname*/)
m_t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen "
<< getDoxygenVersion() << " -->\n";
- //bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
bool searchEngine = Config_getBool(SEARCHENGINE);
if (searchEngine /*&& !generateTreeView*/)
{
m_t << "<script type=\"text/javascript\">\n";
m_t << "/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */\n";
m_t << "var searchBox = new SearchBox(\"searchBox\", \""
- << m_relPath<< "search\",'" << theTranslator->trSearch() << "','" << Doxygen::htmlFileExtension << "');\n";
+ << m_relPath<< "search/\",'" << Doxygen::htmlFileExtension << "');\n";
m_t << "/* @license-end */\n";
m_t << "</script>\n";
}
- //generateDynamicSections(t,relPath);
m_sectionCount=0;
}
t << "\n";
t << "<!-- iframe showing the search results (closed by default) -->\n";
t << "<div id=\"MSearchResultsWindow\">\n";
- t << "<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n";
- t << " name=\"MSearchResults\" id=\"MSearchResults\">\n";
- t << "</iframe>\n";
- t << "</div>\n";
+ t << "<div id=\"MSearchResults\">\n";
+ t << "<div class=\"SRPage\">\n";
+ t << "<div id=\"SRIndex\">\n";
+ t << "<div id=\"SRResults\"></div>\n"; // here the results will be inserted
+ t << "<div class=\"SRStatus\" id=\"Loading\">" << theTranslator->trLoading() << "</div>\n";
+ t << "<div class=\"SRStatus\" id=\"Searching\">" << theTranslator->trSearching() << "</div>\n";
+ t << "<div class=\"SRStatus\" id=\"NoMatches\">" << theTranslator->trNoMatches() << "</div>\n";
+ t << "</div>\n"; // SRIndex
+ t << "</div>\n"; // SRPage
+ t << "</div>\n"; // MSearchResults
+ t << "</div>\n"; // MSearchResultsWindow
t << "\n";
}
}
{
//printf("write doxygen.css\n");
startPlainFile("doxygen.css");
-
- // alternative, cooler looking titles
- //t << "H1 { text-align: center; border-width: thin none thin none;\n";
- //t << " border-style : double; border-color : blue; padding-left : 1em; padding-right : 1em }\n";
-
- m_t << replaceColorMarkers(substitute(ResourceMgr::instance().getAsString("doxygen.css"),"$doxygenversion",getDoxygenVersion()));
+ writeDefaultStyleSheet(m_t);
endPlainFile();
Doxygen::indexList->addStyleSheetFile("doxygen.css");
}
else // write user defined style sheet
{
- QCString cssname=Config_getString(HTML_STYLESHEET);
- FileInfo cssfi(cssname.str());
- if (!cssfi.exists() || !cssfi.isFile() || !cssfi.isReadable())
- {
- err("style sheet %s does not exist or is not readable!", qPrint(Config_getString(HTML_STYLESHEET)));
- }
- else
+ QCString cssName=Config_getString(HTML_STYLESHEET);
+ if (!cssName.startsWith("http:") && !cssName.startsWith("https:"))
{
- // convert style sheet to string
- QCString fileStr = fileToString(cssname);
- // write the string into the output dir
- startPlainFile(cssfi.fileName().c_str());
- m_t << fileStr;
- endPlainFile();
+ FileInfo cssfi(cssName.str());
+ if (!cssfi.exists() || !cssfi.isFile() || !cssfi.isReadable())
+ {
+ err("style sheet %s does not exist or is not readable!", qPrint(Config_getString(HTML_STYLESHEET)));
+ }
+ else
+ {
+ // convert style sheet to string
+ QCString fileStr = fileToString(cssName);
+ // write the string into the output dir
+ startPlainFile(cssfi.fileName().c_str());
+ m_t << fileStr;
+ endPlainFile();
+ }
+ Doxygen::indexList->addStyleSheetFile(cssfi.fileName().c_str());
}
- Doxygen::indexList->addStyleSheetFile(cssfi.fileName().c_str());
}
const StringVector &extraCssFiles = Config_getList(HTML_EXTRA_STYLESHEET);
for (const auto &fileName : extraCssFiles)
Doxygen::indexList->addStyleSheetFile("dynsections.js");
+ if (Config_getEnum(HTML_COLORSTYLE)==HTML_COLORSTYLE_t::TOGGLE)
+ {
+ Doxygen::indexList->addStyleSheetFile("darkmode_toggle.js");
+ }
+
if (Config_getBool(INTERACTIVE_SVG))
{
Doxygen::indexList->addStyleSheetFile("svgpan.js");
void HtmlGenerator::startIndexKey()
{
- // inserted 'class = ...', 02 jan 2002, jh
- m_t << " <tr><td class=\"indexkey\">";
+ //m_t << " <tr><td class=\"indexkey\">";
}
void HtmlGenerator::endIndexKey()
{
- m_t << "</td>";
+ //m_t << "</td>";
}
void HtmlGenerator::startIndexValue(bool)
{
- // inserted 'class = ...', 02 jan 2002, jh
- m_t << "<td class=\"indexvalue\">";
+ //m_t << "<td class=\"indexvalue\">";
}
void HtmlGenerator::endIndexValue(const QCString &,bool)
{
- m_t << "</td></tr>\n";
+ //m_t << "</td></tr>\n";
}
void HtmlGenerator::startMemberDocList()
{
DBG_HTML(m_t << "<!-- startMemberDoc -->\n";)
m_t << "\n<h2 class=\"memtitle\">"
- << "<span class=\"permalink\"><a href=\"#" << anchor << "\">◆ </a></span>";
+ << "<span class=\"permalink\"><a href=\"#" << anchor << "\">◆ </a></span>";
docify(title);
if (memTotal>1)
{
case LayoutNavEntry::ClassIndex: return annotatedClasses>0;
case LayoutNavEntry::ClassHierarchy: return hierarchyClasses>0;
case LayoutNavEntry::ClassMembers: return documentedClassMembers[CMHL_All]>0;
- case LayoutNavEntry::Files: return documentedFiles>0;
- case LayoutNavEntry::FileList: return documentedFiles>0;
- case LayoutNavEntry::FileGlobals: return documentedFileMembers[FMHL_All]>0;
+ case LayoutNavEntry::Files: return Config_getBool(SHOW_FILES) && documentedFiles>0;
+ case LayoutNavEntry::FileList: return Config_getBool(SHOW_FILES) && documentedFiles>0;
+ case LayoutNavEntry::FileGlobals: return Config_getBool(SHOW_FILES) && documentedFileMembers[FMHL_All]>0;
case LayoutNavEntry::Examples: return !Doxygen::exampleLinkedMap->empty();
case LayoutNavEntry::Interfaces: return annotatedInterfaces>0;
case LayoutNavEntry::InterfaceList: return annotatedInterfaces>0;
t << "<script type=\"text/javascript\">\n";
t << "/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */\n";
t << "var searchBox = new SearchBox(\"searchBox\", \""
- << "search\",'" << theTranslator->trSearch() << "','" << Doxygen::htmlFileExtension << "');\n";
+ << "search/\",'" << Doxygen::htmlFileExtension << "');\n";
t << "/* @license-end */\n";
t << "</script>\n";
if (!Config_getBool(DISABLE_INDEX))
t << "<script type=\"text/javascript\">\n";
t << "/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */\n";
t << "var searchBox = new SearchBox(\"searchBox\", \""
- << "search\",'" << theTranslator->trSearch() << "','" << Doxygen::htmlFileExtension << "');\n";
+ << "search/\",'" << Doxygen::htmlFileExtension << "');\n";
t << "/* @license-end */\n";
t << "</script>\n";
if (!Config_getBool(DISABLE_INDEX))
{
writeDefaultQuickLinks(t,TRUE,HLI_Search,QCString(),QCString());
- t << " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"\" size=\"20\" accesskey=\"S\" onfocus=\"searchBox.OnSearchFieldFocus(true)\" onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
+ if (!Config_getBool(HTML_DYNAMIC_MENUS)) // for dynamic menus, menu.js creates this part
+ {
+ t << " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"\" placeholder=\"" << theTranslator->trSearch() <<
+ "\" size=\"20\" accesskey=\"S\" onfocus=\"searchBox.OnSearchFieldFocus(true)\" onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
+ }
t << " </form>\n";
t << " </div><div class=\"right\"></div>\n";
t << " </div>\n";
{
return getConvertLatexMacro();
}
+
+QCString HtmlGenerator::getNavTreeCss()
+{
+ ResourceMgr &mgr = ResourceMgr::instance();
+ return replaceVariables(mgr.getAsString("navtree.css"));
+}
+
static QCString writeLogoAsString(const QCString &path);
static QCString writeSplitBarAsString(const QCString &name,const QCString &relpath);
static QCString getMathJaxMacros();
+ static QCString getNavTreeCss();
// ---- CodeOutputInterface
void codify(const QCString &text)
Private() : index(recoder) {}
void createProjectFile();
std::ofstream cts,kts;
+ QCString prevFile;
+ QCString prevAnc;
bool ctsItemPresent = false;
int dc = 0;
StringSet indexFiles;
* The object has to be \link initialize() initialized\endlink before it can
* be used.
*/
-HtmlHelp::HtmlHelp() : p(std::make_unique<Private>())
-{
-}
-
-HtmlHelp::~HtmlHelp()
-{
-}
+HtmlHelp::HtmlHelp() : p(std::make_unique<Private>()) {}
+HtmlHelp::~HtmlHelp() = default;
+HtmlHelp::HtmlHelp(HtmlHelp &&) = default;
/*! This will create a contents file (index.hhc) and a index file (index.hhk)
* and write the header of those files.
bool /* addToNavIndex */,
const Definition * /* def */)
{
- bool binaryTOC = Config_getBool(BINARY_TOC);
- // If we're using a binary toc then folders cannot have links.
- // Tried this and I didn't see any problems, when not using
- // the resetting of file and anchor the TOC works better
- // (prev / next button)
- //if(Config_getBool(BINARY_TOC) && isDir)
- //{
- //file = 0;
- //anchor = 0;
- //}
p->ctsItemPresent = true;
int i; for (i=0;i<p->dc;i++) p->cts << " ";
p->cts << "<LI><OBJECT type=\"text/sitemap\">";
}
else
{
- if (!(binaryTOC && isDir))
+ QCString currFile = addHtmlExtensionIfMissing(file);
+ QCString currAnc = anchor;
+ p->cts << "<param name=\"Local\" value=\"";
+ p->cts << currFile;
+ if (p->prevFile == currFile && p->prevAnc.isEmpty() && currAnc.isEmpty())
{
- p->cts << "<param name=\"Local\" value=\"";
- p->cts << addHtmlExtensionIfMissing(file);
- if (!anchor.isEmpty()) p->cts << "#" << anchor;
- p->cts << "\">";
+ currAnc = "top";
}
+ if (!currAnc.isEmpty()) p->cts << "#" << currAnc;
+ p->cts << "\">";
+ p->prevFile = currFile;
+ p->prevAnc = currAnc;
}
}
p->cts << "<param name=\"ImageNumber\" value=\"";
#define HTMLHELP_H
#include <memory>
-#include "index.h"
+#include "qcstring.h"
class Definition;
+class MemberDef;
/** A class that generated the HTML Help specific files.
*
* These files can be used with the Microsoft HTML Help workshop
* to generate compressed HTML files (.chm).
*/
-class HtmlHelp : public IndexIntf
+class HtmlHelp
{
/*! used in imageNumber param of HTMLHelp::addContentsItem() function
to specify document icon in tree view.
//static HtmlHelp *getInstance();
HtmlHelp();
~HtmlHelp();
+ HtmlHelp(HtmlHelp &&);
void initialize();
void finalize();
void incContentsDepth();
{ 0x00, 0x00, 0x00, 0xff },
{ 0xff, 0xff, 0xc0, 0xff },
{ 0x9f, 0x9f, 0x60, 0xff },
- { 0x90, 0x00, 0x00, 0xff },
- { 0x00, 0x90, 0x00, 0xff },
- { 0x00, 0x00, 0x90, 0xff },
- { 0xc0, 0xc0, 0xc0, 0xff }
-};
-
-// for alpha we use x^(1/1.3)
-static Color palette2[] =
-{
- { 0x00, 0x00, 0x00, 0x00 },
- { 0x00, 0x00, 0x00, 0x2e },
- { 0x00, 0x00, 0x00, 0x48 },
- { 0x00, 0x00, 0x00, 0x5d },
- { 0x00, 0x00, 0x00, 0x6f },
- { 0x00, 0x00, 0x00, 0x80 },
- { 0x00, 0x00, 0x00, 0x8f },
- { 0x00, 0x00, 0x00, 0x9e },
- { 0x00, 0x00, 0x00, 0xac },
- { 0x00, 0x00, 0x00, 0xb9 },
- { 0x00, 0x00, 0x00, 0xc5 },
- { 0x00, 0x00, 0x00, 0xd2 },
- { 0x00, 0x00, 0x00, 0xdd },
- { 0x00, 0x00, 0x00, 0xe9 },
- { 0x00, 0x00, 0x00, 0xf4 },
- { 0x00, 0x00, 0x00, 0xff }
-};
-
-static Color palette3[] =
-{
- { 0xff, 0xff, 0xff, 0xff },
- { 0xe0, 0xe0, 0xe0, 0xff },
- { 0xd0, 0xd0, 0xd0, 0xff },
+ { 0xa7, 0x38, 0x30, 0xff },
+ { 0x29, 0x70, 0x18, 0xff },
+ { 0x97, 0xCC, 0xE8, 0xff },
{ 0xc0, 0xc0, 0xc0, 0xff },
- { 0xb0, 0xb0, 0xb0, 0xff },
- { 0xa0, 0xa0, 0xa0, 0xff },
- { 0x90, 0x90, 0x90, 0xff },
- { 0x80, 0x80, 0x80, 0xff },
- { 0x70, 0x70, 0x70, 0xff },
- { 0x60, 0x60, 0x60, 0xff },
- { 0x50, 0x50, 0x50, 0xff },
- { 0x40, 0x40, 0x40, 0xff },
- { 0x30, 0x30, 0x30, 0xff },
- { 0x20, 0x20, 0x20, 0xff },
- { 0x10, 0x10, 0x10, 0xff },
- { 0x00, 0x00, 0x00, 0xff }
+ { 0xff, 0xff, 0xff, 0xff }
};
-
Image::Image(uint w,uint h)
{
int hue = Config_getInt(HTML_COLORSTYLE_HUE);
setPixel(xp,yp,colIndex);
}
-bool Image::save(const QCString &fileName,int mode)
+bool Image::save(const QCString &fileName)
{
- bool useTransparency = Config_getBool(FORMULA_TRANSPARENT);
uchar* buffer;
size_t bufferSize;
LodePNG_Encoder encoder;
LodePNG_Encoder_init(&encoder);
- uint numCols = mode==0 ? 8 : 16;
- Color *pPal = mode==0 ? palette :
- useTransparency ? palette2 :
- palette3 ;
+ uint numCols = 9;
+ Color *pPal = palette;
uint i;
for (i=0;i<numCols;i++,pPal++)
{
void drawVertArrow(uint x,uint ys,uint ye,uchar colIndex,uint mask);
void drawRect(uint x,uint y,uint width,uint height,uchar colIndex,uint mask);
void fillRect(uint x,uint y,uint width,uint height,uchar colIndex,uint mask);
- bool save(const QCString &fileName,int mode=0);
+ bool save(const QCString &fileName);
friend uint stringLength(const QCString &s);
uint width() const { return m_width; }
uint height() const { return m_height; }
#include "message.h"
#include "index.h"
+#include "indexlist.h"
#include "doxygen.h"
#include "config.h"
#include "filedef.h"
static void writeUserGroupStubPage(OutputList &ol,LayoutNavEntry *lne)
{
- if (lne->baseFile().left(9)=="usergroup")
+ if (lne->baseFile().startsWith("usergroup"))
{
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
static void writeIndexHierarchyEntries(OutputList &ol,const LayoutNavEntryList &entries)
{
+ auto isRef = [](const QCString &s)
+ {
+ return s.startsWith("@ref") || s.startsWith("\\ref");
+ };
bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
for (const auto &lne : entries)
{
{
url.prepend("^"); // prepend ^ to absolute URL
}
- bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref";
- Doxygen::indexList->addContentsItem(TRUE,lne->title(),QCString(),url,QCString(),FALSE,isRef || isRelative);
+ Doxygen::indexList->addContentsItem(TRUE,lne->title(),QCString(),
+ url,QCString(),FALSE,isRef(lne->baseFile()) || isRelative);
}
break;
case LayoutNavEntry::UserGroup:
{
url.prepend("^"); // prepend ^ to absolute URL
}
- bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref";
- Doxygen::indexList->addContentsItem(TRUE,lne->title(),QCString(),url,QCString(),FALSE,isRef || isRelative);
+ Doxygen::indexList->addContentsItem(TRUE,lne->title(),QCString(),
+ url,QCString(),FALSE,isRef(lne->baseFile()) || isRelative);
}
}
else
#ifndef INDEX_H
#define INDEX_H
-#include <utility>
-#include <vector>
-#include <memory>
-#include <mutex>
-
#include "qcstring.h"
class Definition;
+class OutputList;
class DefinitionMutable;
class NamespaceDef;
class MemberDef;
-class OutputList;
-
-/** \brief Abstract interface for index generators. */
-class IndexIntf
-{
- public:
- virtual ~IndexIntf() = default;
- virtual void initialize() = 0;
- virtual void finalize() = 0;
- virtual void incContentsDepth() = 0;
- virtual void decContentsDepth() = 0;
- virtual void addContentsItem(bool isDir, const QCString &name, const QCString &ref,
- const QCString &file, const QCString &anchor, bool separateIndex,
- bool addToNavIndex,const Definition *def) = 0;
- virtual void addIndexItem(const Definition *context,const MemberDef *md,
- const QCString §ionAnchor,const QCString &title) = 0;
- virtual void addIndexFile(const QCString &name) = 0;
- virtual void addImageFile(const QCString &name) = 0;
- virtual void addStyleSheetFile(const QCString &name) = 0;
-};
-
-/** \brief A list of index interfaces.
- *
- * This class itself implements all methods of IndexIntf and
- * just forwards the calls to all items in the list (composite design pattern).
- */
-class IndexList : public IndexIntf
-{
- private:
- std::vector< std::unique_ptr<IndexIntf> > m_intfs;
-
- // For each index format we forward the method call.
- // We use C++11 variadic templates and perfect forwarding to implement foreach() generically,
- // and split the types of the methods from the arguments passed to allow implicit conversions.
- template<class... Ts,class... As>
- void foreach(void (IndexIntf::*methodPtr)(Ts...),As&&... args)
- {
- for (const auto &intf : m_intfs)
- {
- (intf.get()->*methodPtr)(std::forward<As>(args)...);
- }
- }
- // For each version with locking
- template<class... Ts,class... As>
- void foreach_locked(void (IndexIntf::*methodPtr)(Ts...),As&&... args)
- {
- std::lock_guard<std::mutex> lock(m_mutex);
- foreach(methodPtr,std::forward<As>(args)...);
- }
-
- public:
- /** Creates a list of indexes */
- IndexList() { m_enabled=TRUE; }
-
- /** Add an index generator to the list, using a syntax similar to std::make_unique<T>() */
- template<class T,class... As>
- void addIndex(As&&... args)
- { m_intfs.push_back(std::make_unique<T>(std::forward<As>(args)...)); }
-
- void disable()
- { m_enabled = FALSE; }
- void enable()
- { m_enabled = TRUE; }
- bool isEnabled() const
- { return m_enabled; }
-
- // IndexIntf implementation
- void initialize()
- { foreach(&IndexIntf::initialize); }
- void finalize()
- { foreach(&IndexIntf::finalize); }
- void incContentsDepth()
- { if (m_enabled) foreach_locked(&IndexIntf::incContentsDepth); }
- void decContentsDepth()
- { if (m_enabled) foreach_locked(&IndexIntf::decContentsDepth); }
- void addContentsItem(bool isDir, const QCString &name, const QCString &ref,
- const QCString &file, const QCString &anchor,bool separateIndex=FALSE,bool addToNavIndex=FALSE,
- const Definition *def=0)
- { if (m_enabled) foreach_locked(&IndexIntf::addContentsItem,isDir,name,ref,file,anchor,separateIndex,addToNavIndex,def); }
- void addIndexItem(const Definition *context,const MemberDef *md,const QCString §ionAnchor=QCString(),const QCString &title=QCString())
- { if (m_enabled) foreach_locked(&IndexIntf::addIndexItem,context,md,sectionAnchor,title); }
- void addIndexFile(const QCString &name)
- { if (m_enabled) foreach_locked(&IndexIntf::addIndexFile,name); }
- void addImageFile(const QCString &name)
- { if (m_enabled) foreach_locked(&IndexIntf::addImageFile,name); }
- void addStyleSheetFile(const QCString &name)
- { if (m_enabled) foreach_locked(&IndexIntf::addStyleSheetFile,name); }
-
- private:
- bool m_enabled;
- std::mutex m_mutex;
-};
-
enum IndexSections
{
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2021 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef INDEXLIST_H
+#define INDEXLIST_H
+
+#include <utility>
+#include <vector>
+#include <memory>
+#include <mutex>
+#include <variant>
+
+#include "qcstring.h"
+#include "dispatcher.h"
+
+#include "docsets.h"
+#include "eclipsehelp.h"
+#include "ftvhelp.h"
+#include "htmlhelp.h"
+#include "qhp.h"
+
+class Definition;
+class MemberDef;
+class OutputList;
+
+/** Namespace containing typed wrappers to refer to member functions for each method of the indices using a fixed `method` static variable.
+ * Based on this idea https://stackoverflow.com/a/71357544/784672
+ */
+namespace IndexIntf
+{
+ template <class T> struct initialize { static constexpr auto method = &T::initialize; };
+ template <class T> struct finalize { static constexpr auto method = &T::finalize; };
+ template <class T> struct incContentsDepth { static constexpr auto method = &T::incContentsDepth; };
+ template <class T> struct decContentsDepth { static constexpr auto method = &T::decContentsDepth; };
+ template <class T> struct addContentsItem { static constexpr auto method = &T::addContentsItem; };
+ template <class T> struct addIndexItem { static constexpr auto method = &T::addIndexItem; };
+ template <class T> struct addIndexFile { static constexpr auto method = &T::addIndexFile; };
+ template <class T> struct addImageFile { static constexpr auto method = &T::addImageFile; };
+ template <class T> struct addStyleSheetFile { static constexpr auto method = &T::addStyleSheetFile; };
+}
+
+/** \brief A list of index interfaces.
+ *
+ * This class itself implements all methods of IndexIntf and
+ * just forwards the calls to all items in the list (composite design pattern).
+ */
+class IndexList
+{
+ using IndexVariant = std::variant<DocSets, EclipseHelp, FTVHelp, HtmlHelp, Qhp>;
+
+ template<template <class> class IndexT, class... As>
+ void foreach(As&&... args)
+ {
+ for (auto &v : m_indices)
+ {
+ dispatch_call<IndexT>(v,std::forward<As>(args)...);
+ }
+ }
+ template<template <class> class IndexT, class... As>
+ void foreach_locked(As&&... args)
+ {
+ std::lock_guard<std::mutex> lock(m_mutex);
+ for (auto &v : m_indices)
+ {
+ dispatch_call<IndexT>(v,std::forward<As>(args)...);
+ }
+ }
+
+ public:
+ /** disable the indices */
+ void disable()
+ { m_enabled = FALSE; }
+
+ /** enable the indices */
+ void enable()
+ { m_enabled = TRUE; }
+
+ /** returns true iff the indices are enabled */
+ bool isEnabled() const
+ { return m_enabled; }
+
+ /** Add an index generator to the list, using a syntax similar to std::make_unique<T>() */
+ template<class T,class... As>
+ void addIndex(As&&... args)
+ { m_indices.push_back(std::move(T{std::forward<As>(args)...})); }
+
+ void initialize()
+ { foreach<IndexIntf::initialize>(); }
+
+ void finalize()
+ { foreach<IndexIntf::finalize>(); }
+
+ void incContentsDepth()
+ { if (m_enabled) foreach_locked<IndexIntf::incContentsDepth>(); }
+
+ void decContentsDepth()
+ { if (m_enabled) foreach_locked<IndexIntf::decContentsDepth>(); }
+
+ void addContentsItem(bool isDir, const QCString &name, const QCString &ref,
+ const QCString &file, const QCString &anchor,bool separateIndex=FALSE,bool addToNavIndex=FALSE,
+ const Definition *def=0)
+ { if (m_enabled) foreach_locked<IndexIntf::addContentsItem>(isDir,name,ref,file,anchor,separateIndex,addToNavIndex,def); }
+
+ void addIndexItem(const Definition *context,const MemberDef *md,const QCString §ionAnchor=QCString(),const QCString &title=QCString())
+ { if (m_enabled) foreach_locked<IndexIntf::addIndexItem>(context,md,sectionAnchor,title); }
+
+ void addIndexFile(const QCString &name)
+ { if (m_enabled) foreach_locked<IndexIntf::addIndexFile>(name); }
+
+ void addImageFile(const QCString &name)
+ { if (m_enabled) foreach_locked<IndexIntf::addImageFile>(name); }
+
+ void addStyleSheetFile(const QCString &name)
+ { if (m_enabled) foreach_locked<IndexIntf::addStyleSheetFile>(name); }
+
+ private:
+ bool m_enabled = true;
+ std::mutex m_mutex;
+ std::vector<IndexVariant> m_indices;
+};
+
+#endif // INDEXLIST_H
break;
case DocStyleChange::Div: /* HTML only */ break;
case DocStyleChange::Span: /* HTML only */ break;
- case DocStyleChange::Details: /* emulation of the <details> tag */
- if (!s.enable()) m_t << "\n\n";
- break;
case DocStyleChange::Summary: /* emulation of the <summary> tag inside a <details> tag */
- if (s.enable()) m_t << "{\\bfseries{"; else m_t << "}}";
+ if (s.enable()) m_t << "{\\bfseries{"; else m_t << "}}\\newline";
break;
}
}
m_t << "}}";
}
+void LatexDocVisitor::operator()(const DocHtmlDetails &d)
+{
+ if (m_hide) return;
+ m_t << "\n\n";
+ visitChildren(d);
+ m_t << "\n\n";
+}
+
void LatexDocVisitor::operator()(const DocHtmlHeader &header)
{
if (m_hide) return;
{
if (m_hide) return;
QCString gfxName = img.name();
- if (gfxName.right(4)==".eps" || gfxName.right(4)==".pdf")
+ if (gfxName.endsWith(".eps") || gfxName.endsWith(".pdf"))
{
gfxName=gfxName.left(gfxName.length()-4);
}
void operator()(const DocHtmlCell &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
}
t << "\techo \"Rerunning latex....\"\n"
<< "\t$(LATEX_CMD) $(MANUAL_FILE).tex\n"
- << "\tlatex_count=%(LATEX_COUNT) ; \\\n"
+ << "\tlatex_count=$(LATEX_COUNT) ; \\\n"
<< "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\\\n"
<< "\t do \\\n"
<< "\t echo \"Rerunning latex....\" ;\\\n"
#endif
QCString fileName=name;
m_relPath = relativePathToRoot(fileName);
- if (fileName.right(4)!=".tex" && fileName.right(4)!=".sty") fileName+=".tex";
+ if (!fileName.endsWith(".tex") && !fileName.endsWith(".sty")) fileName+=".tex";
startPlainFile(fileName);
m_codeGen.setRelativePath(m_relPath);
m_codeGen.setSourceFileName(stripPath(fileName));
copyFile(formulaMacrofile,Config_getString(LATEX_OUTPUT) + "/" + stripMacroFile);
}
+ QCString projectNumber = Config_getString(PROJECT_NUMBER);
+
// first substitute generic keywords
QCString result = substituteKeywords(str,title,
convertToLaTeX(Config_getString(PROJECT_NAME)),
- convertToLaTeX(Config_getString(PROJECT_NUMBER)),
+ convertToLaTeX(projectNumber),
convertToLaTeX(Config_getString(PROJECT_BRIEF)));
// additional LaTeX only keywords
result = selectBlock(result,"LATEX_BATCHMODE",latexBatchmode,OutputGenerator::Latex);
result = selectBlock(result,"LATEX_FONTENC",!latexFontenc.isEmpty(),OutputGenerator::Latex);
result = selectBlock(result,"FORMULA_MACROFILE",!formulaMacrofile.isEmpty(),OutputGenerator::Latex);
+ result = selectBlock(result,"PROJECT_NUMBER",!projectNumber.isEmpty(),OutputGenerator::Latex);
result = removeEmptyLines(result);
{
QCString url = baseFile().stripWhiteSpace();
if ((kind()!=LayoutNavEntry::User && kind()!=LayoutNavEntry::UserGroup) ||
- (kind()==LayoutNavEntry::UserGroup && url.left(9)=="usergroup"))
+ (kind()==LayoutNavEntry::UserGroup && url.startsWith("usergroup")))
{
url = addHtmlExtensionIfMissing(url);
}
- else if (url.left(5)=="@ref " || url.left(5)=="\\ref ")
+ else if (url.startsWith("@ref ") || url.startsWith("\\ref "))
{
const Definition *d = 0;
QCString anchor;
break;
case DocStyleChange::Div: /* HTML only */ break;
case DocStyleChange::Span: /* HTML only */ break;
- case DocStyleChange::Details: /* emulation of the <details> tag */
- if (!s.enable())
- {
- if (!m_firstCol) m_t << "\n";
- m_t << ".PP\n";
- m_firstCol=TRUE;
- }
- break;
case DocStyleChange::Summary: /* emulation of the <summary> tag inside a <details> tag */
- if (s.enable()) m_t << "\\fB"; else m_t << "\\fP";
+ if (s.enable()) m_t << "\\fB"; else m_t << "\\fP\n.PP\n";
m_firstCol=FALSE;
break;
}
m_t << "\\fP";
}
+void ManDocVisitor::operator()(const DocHtmlDetails &d)
+{
+ if (m_hide) return;
+ if (!m_firstCol)
+ {
+ m_t << "\n";
+ m_t << ".PP\n";
+ }
+ m_t << ".RS 4\n"; // TODO: add support for nested detailes sections
+ visitChildren(d);
+ if (!m_firstCol) m_t << "\n";
+ m_t << ".RE\n";
+ m_t << ".PP\n";
+ m_firstCol=TRUE;
+}
+
void ManDocVisitor::operator()(const DocHtmlHeader &header)
{
if (m_hide) return;
void operator()(const DocHtmlCell &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
}
else
{
- m_t << "\n";
+ m_t << "\n.PP\n";
m_firstCol=TRUE;
m_paragraph=FALSE;
m_inHeader=FALSE;
case '\\': if (!insideQuote) { growBuf.addChar('\\'); } growBuf.addChar('\\'); break;
case '@': if (!insideQuote) { growBuf.addChar('\\'); } growBuf.addChar('@'); break;
case '#': if (!insideQuote) { growBuf.addChar('\\'); } growBuf.addChar('#'); break;
+ case '$': if (!insideQuote) { growBuf.addChar('\\'); } growBuf.addChar('$'); break;
+ case '&': if (!insideQuote) { growBuf.addChar('\\'); } growBuf.addChar('&'); break;
default: growBuf.addChar(c); break;
}
pc=c;
{
{ "dot", getEndBlock },
{ "code", getEndCode },
+ { "icode", getEndBlock },
{ "msc", getEndBlock },
{ "verbatim", getEndBlock },
+ { "iverbatim", getEndBlock },
{ "iliteral", getEndBlock },
{ "latexonly", getEndBlock },
{ "htmlonly", getEndBlock },
int i=0,end;
//printf("writeCodeBlock: data={%s}\n",qPrint(QCString(data).left(size)));
// no need for \ilinebr here as the previous line was empty and was skipped
- m_out.addStr("@verbatim\n");
+ m_out.addStr("@iverbatim\n");
int emptyLines=0;
while (i<size)
{
break;
}
}
- m_out.addStr("@endverbatim\\ilinebr ");
+ m_out.addStr("@endiverbatim\\ilinebr ");
while (emptyLines>0) // write skipped empty lines
{
// add empty line
blockStart--;
blockEnd--;
}
- m_out.addStr("@code");
+ m_out.addStr("@icode");
if (!lang.isEmpty())
{
m_out.addStr("{"+lang+"}");
}
addStrEscapeUtf8Nbsp(data+blockStart,blockEnd-blockStart);
- m_out.addStr("@endcode");
+ m_out.addStr("@endicode");
}
QCString Markdown::processQuotations(const QCString &s,int refIndent)
virtual void writeMemberDocSimple(OutputList &ol,const Definition *container) const;
virtual void writeEnumDeclaration(OutputList &typeDecl,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd) const;
- virtual void writeTagFile(TextStream &) const;
+ virtual void writeTagFile(TextStream &,bool useQualifiedName) const;
virtual void warnIfUndocumented() const;
virtual void warnIfUndocumentedParams() const;
virtual bool visibleInIndex() const;
hasDocumentedParams = FALSE;
hasDocumentedReturnType = FALSE;
docProvider = 0;
- isDMember = d->getDefFileName().right(2).lower()==".d";
+ isDMember = d->getDefFileName().lower().endsWith(".d");
}
cname=getNamespaceDef()->name();
}
QCString ltype(m_impl->type);
- // strip 'static' keyword from ltype
- //if (ltype.left(7)=="static ") ltype=ltype.right(ltype.length()-7);
// strip 'friend' keyword from ltype
ltype.stripPrefix("friend ");
static QCString simplifyTypeForTable(const QCString &s)
{
QCString ts=removeAnonymousScopes(s);
- if (ts.right(2)=="::") ts = ts.left(ts.length()-2);
+ if (ts.endsWith("::")) ts = ts.left(ts.length()-2);
static const reg::Ex re1(R"(\a\w*::)"); // non-template version
static const reg::Ex re2(R"(\a\w*<[^>]*>::)"); // template version
reg::Match match;
{
linkifyText(TextGeneratorOLImpl(ol),getOuterScope(),getBodyDef(),this,m_impl->bitfields);
}
+ if (hasOneLineInitializer() && !isDefine())
+ {
+ ol.writeString(" ");
+ linkifyText(TextGeneratorOLImpl(ol),getOuterScope(),getBodyDef(),this,m_impl->initializer.simplifyWhiteSpace());
+ }
ol.endInlineMemberName();
ol.startInlineMemberDoc();
bool isFortran = getLanguage()==SrcLangExt_Fortran;
bool isFortranSubroutine = isFortran && returnType.find("subroutine")!=-1;
- bool isVoidReturn = (returnType=="void") || (returnType.right(5)==" void");
+ bool isVoidReturn = (returnType=="void") || (returnType.endsWith(" void"));
if (!isVoidReturn && returnType == "auto")
{
const ArgumentList &defArgList=isDocsForDefinition() ? argumentList() : declArgumentList();
if (!defArgList.trailingReturnType().isEmpty())
{
QCString strippedTrailingReturn = stripTrailingReturn(defArgList.trailingReturnType());
- isVoidReturn = (strippedTrailingReturn=="void") || (strippedTrailingReturn.right(5)==" void");
+ isVoidReturn = (strippedTrailingReturn=="void") || (strippedTrailingReturn.endsWith(" void"));
}
}
if (!Config_getBool(EXTRACT_ALL) &&
}
QCString methodName=name();
- if (methodName.left(9)=="operator ") // conversion operator
+ if (methodName.startsWith("operator ")) // conversion operator
{
methodName=substituteTemplateArgumentsInString(methodName,formalArgs,actualArgs);
}
return v;
}
-void MemberDefImpl::writeTagFile(TextStream &tagFile) const
+void MemberDefImpl::writeTagFile(TextStream &tagFile,bool useQualifiedName) const
{
if (!isLinkableInProject()) return;
tagFile << " <member kind=\"";
{
tagFile << " <type>" << convertToXML(typeString()) << "</type>\n";
}
- tagFile << " <name>" << convertToXML(name()) << "</name>\n";
+ tagFile << " <name>" << convertToXML(useQualifiedName ? qualifiedName() : name()) << "</name>\n";
tagFile << " <anchorfile>" << addHtmlExtensionIfMissing(getOutputFileBase()) << "</anchorfile>\n";
tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>\n";
QCString idStr = id();
bool inGroup,bool showEnumValues=FALSE,bool
showInline=FALSE) const = 0;
virtual void writeMemberDocSimple(OutputList &ol,const Definition *container) const = 0;
- virtual void writeTagFile(TextStream &) const = 0;
+ virtual void writeTagFile(TextStream &,bool useQualifiedName) const = 0;
virtual void writeLink(OutputList &ol,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
bool onlyText=FALSE) const = 0;
m_xrefListItems.insert(m_xrefListItems.end(), sli.cbegin(), sli.cend());
}
-void MemberGroup::writeTagFile(TextStream &tagFile)
+void MemberGroup::writeTagFile(TextStream &tagFile,bool qualifiedName)
{
- memberList->writeTagFile(tagFile);
+ memberList->writeTagFile(tagFile,qualifiedName);
}
//--------------------------------------------------------------------------
const Definition *container,bool showEnumValues,bool showInline) const;
void writeDocumentationPage(OutputList &ol,const QCString &scopeName,
const DefinitionMutable *container) const;
- void writeTagFile(TextStream &);
+ void writeTagFile(TextStream &,bool qualifiedName=false);
void addGroupedInheritedMembers(OutputList &ol,const ClassDef *cd,
MemberListType lt,
const ClassDef *inheritedFrom,const QCString &inheritId) const;
return "";
}
-void MemberList::writeTagFile(TextStream &tagFile)
+void MemberList::writeTagFile(TextStream &tagFile,bool useQualifiedName)
{
for (const auto &imd : m_members)
{
{
if (md->getLanguage()!=SrcLangExt_VHDL)
{
- md->writeTagFile(tagFile);
+ md->writeTagFile(tagFile,useQualifiedName);
if (md->memberType()==MemberType_Enumeration && !md->isStrong())
{
for (const auto &ivmd : md->enumFieldList())
MemberDefMutable *vmd = toMemberDefMutable(ivmd);
if (vmd)
{
- vmd->writeTagFile(tagFile);
+ vmd->writeTagFile(tagFile,useQualifiedName);
}
}
}
}
for (const auto &mg : m_memberGroupRefList)
{
- mg->writeTagFile(tagFile);
+ mg->writeTagFile(tagFile,useQualifiedName);
}
}
void writeSimpleDocumentation(OutputList &ol,const Definition *container) const;
void writeDocumentationPage(OutputList &ol,
const QCString &scopeName, const DefinitionMutable *container) const;
- void writeTagFile(TextStream &);
+ void writeTagFile(TextStream &,bool useQualifiedName=false);
bool declVisible() const;
void addMemberGroup(MemberGroup *mg);
void addListReferences(Definition *def);
#include "docparser.h"
#include "docnode.h"
#include "doxygen.h"
-#include "index.h"
+#include "indexlist.h"
#include "util.h"
#include "mscgen_api.h"
#include "dir.h"
#include <vector>
#include <memory>
-#include "index.h" // for IndexSections
#include "outputgen.h"
#include "searchindex.h" // for SIDataCollection
#include "doxygen.h"
void operator()(const DocHtmlCaption &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
case DocStyleChange::Preformatted: style = "preformatted"; break;
case DocStyleChange::Div: style = "div"; break;
case DocStyleChange::Span: style = "span"; break;
- case DocStyleChange::Details: /* emulation of the <details> tag */
- style = "details";
- break;
case DocStyleChange::Summary: /* emulation of the <summary> tag inside a <details> tag */
style = "summary";
break;
#endif
}
+void PerlModDocVisitor::operator()(const DocHtmlDetails &details)
+{
+ openItem("details");
+ openSubBlock("content");
+ visitChildren(details);
+ closeSubBlock();
+ closeItem();
+}
+
void PerlModDocVisitor::operator()(const DocHtmlHeader &header)
{
#if 0
case MemberType_Dictionary: memType="dictionary"; break;
}
+ bool isFortran = md->getLanguage()==SrcLangExt_Fortran;
name = md->name();
if (md->isAnonymous()) name = "__unnamed" + name.right(name.length() - 1)+"__";
if (defArg && !defArg->name.isEmpty() && defArg->name!=a.name)
m_output.addFieldQuotedString("definition_name", defArg->name);
- if (!a.type.isEmpty())
+ if (isFortran && defArg && !defArg->type.isEmpty())
+ m_output.addFieldQuotedString("type", defArg->type);
+ else if (!a.type.isEmpty())
m_output.addFieldQuotedString("type", a.type);
if (!a.array.isEmpty())
#include "debug.h"
#include "fileinfo.h"
#include "dir.h"
+#include "indexlist.h"
QCString PlantumlManager::writePlantUMLSource(const QCString &outDirArg,const QCString &fileName,
const QCString &content,OutputFormat format, const QCString &engine,
void run();
/** Write a PlantUML compatible file.
- * @param[in] outDir the output directory to write the file to.
- * @param[in] fileName the name of the file. If empty a name will be chosen automatically.
- * @param[in] content the contents of the PlantUML file.
- * @param[in] format the image format to generate.
- * @param[in] engine the plantuml engine to use.
- * @param[in] srcFile the source file resulting in the write command.
- * @param[in] srcLine the line number resulting in the write command.
+ * @param[in] outDirArg the output directory to write the file to.
+ * @param[in] fileName the name of the file. If empty a name will be chosen automatically.
+ * @param[in] content the contents of the PlantUML file.
+ * @param[in] format the image format to generate.
+ * @param[in] engine the plantuml engine to use.
+ * @param[in] srcFile the source file resulting in the write command.
+ * @param[in] srcLine the line number resulting in the write command.
* @returns The name of the generated file.
*/
- QCString writePlantUMLSource(const QCString &outDir,const QCString &fileName,
+ QCString writePlantUMLSource(const QCString &outDirArg,const QCString &fileName,
const QCString &content, OutputFormat format,
const QCString &engine,const QCString &srcFile,
int srcLine);
--- /dev/null
+#!/usr/bin/python
+# python script to correct the linenumbers due to inclusion of common parts in lex files
+#
+# Copyright (C) 1997-2022 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+import sys
+import os
+import re
+
+def main():
+ if len(sys.argv)!=6:
+ sys.exit('Usage: {0} <input_cpp_file> <output_cpp_file> <correction_file> <original_lex_file> <generated_lex_file>'.format(sys.argv[0]))
+
+ inp_cpp_file, out_cpp_file, corr_cpp_file, org_lex, gen_lex = sys.argv[1:]
+
+ quoted_inp_cpp_file = '"' + inp_cpp_file + '"'
+ quoted_gen_lex = '"' + gen_lex + '"'
+
+ corr_list = []
+ if (os.path.exists(corr_cpp_file)):
+ # read correction file as list of tuples
+ with open(corr_cpp_file,"r") as corr_file:
+ corr_list = [tuple(map(int, line.split(' '))) for line in corr_file]
+
+ if (os.path.exists(inp_cpp_file)):
+ with open(out_cpp_file,"w") as out_file:
+ rule_correction = False
+ with open(inp_cpp_file) as in_file:
+ for line in in_file:
+ # helper function to find the correction needed for the given line number
+ def get_line_correction(line_no):
+ corr_cnt = 0
+ for elem in corr_list:
+ if elem[0] <= line_no:
+ corr_cnt = elem[1]
+ return corr_cnt
+
+ if re.search(r'^#line ', line): # statement added by C-preprocessing
+ inc_line, inc_file = line.split()[1:3]
+ if inc_file == quoted_gen_lex:
+ line_cnt = int(inc_line)
+ line_cnt -= get_line_correction(line_cnt) # adjust line number
+ out_file.write("#line {0} \"{1}\"\n".format(line_cnt,org_lex))
+ else:
+ out_file.write(line)
+ elif re.search(r'^ /\* #line ', line): # statement added by lex-preprocessing
+ inc_line, inc_file = line.split()[2:4] # first token is `/*` part
+ out_file.write("#line {0} \"{1}\"\n".format(inc_line,inc_file))
+ elif re.search(r'static .* yy_rule_linenum', line): # linenum table generated in debug mode (flex -d)
+ out_file.write(line)
+ rule_correction = True
+ # read next lines till } and correct numbers
+ # Assumption structure is like:
+ # static const flex_int16_t yy_rule_linenum[26] =
+ # { 0,
+ # 981, 985, 989, 995, 1093, 1151, 1153, 1154, 1179, 1182,
+ # 1195, 1198, 1201, 1207, 1211, 1214, 1217, 1223, 1226, 1228,
+ # 1230, 1235, 1236, 1237, 1238
+ # } ;
+ elif rule_correction:
+ if re.search(r'{', line): # start of yy_rule_linenum array
+ out_file.write(line)
+ elif re.search(r'}', line): # end of yy_rule_linenum array
+ out_file.write(line)
+ rule_correction = False
+ else: # inside the table
+ out_file.write(" ")
+ out_list = []
+ rule_list = line.replace(',',' ').split()
+ for rule_cnt in rule_list:
+ rule_num = int(rule_cnt)
+ rule_num -= get_line_correction(rule_num)
+ out_list.append("{0:5d}".format(rule_num))
+ out_file.write(','.join(out_list));
+ if re.search(r',$', line): # re-add trailing comma
+ out_file.write(",")
+ out_file.write("\n")
+ else: # normal line -> just copy
+ out_file.write(line)
+ else: # input file does not exist
+ sys.exit("Input cpp file '{0}' does not exist.".format(sys.argv[1]))
+ exit(1)
+
+if __name__ == '__main__':
+ main()
BEGIN(CopyLine);
}
<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\(\)\n]*"("[^\)\n]*")"[^\)\n]*")"{B}*\n | // function list macro with one (...) argument, e.g. for K_GLOBAL_STATIC_WITH_ARGS
-<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\)\n]*")"{B}*\n { // function like macro
+<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\)\n]*")"{B}*\n | // function like macro
+<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\(\)\n]*"("[^\)\n]*")"[^\)\n]*")"/{B}*("//"|"/\*") | // function list macro with one (...) argument followed by comment
+<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\)\n]*")"/{B}*("//"|"/\*") { // function like macro followed by comment
bool skipFuncMacros = Config_getBool(SKIP_FUNCTION_MACROS);
QCString name(yytext);
int pos = name.find('(');
)
)
{
- outputChar(yyscanner,'\n');
- yyextra->yyLineNr++;
+ // Only when ends on \n
+ if (yytext[yyleng-1] == '\n')
+ {
+ outputChar(yyscanner,'\n');
+ yyextra->yyLineNr++;
+ }
}
else // don't skip
{
if ((yyextra->includeStack.empty() || yyextra->curlyCount>0) &&
yyextra->macroExpansion &&
(def=isDefined(yyscanner,yytext)) &&
- /*(def->isPredefined || macroIsAccessible(def)) && */
(!yyextra->expandOnlyPredef || def->isPredefined)
)
{
yyextra->defArgsStr=yytext;
if (def->nargs==-1) // no function macro
{
- QCString result = def->isPredefined ? def->definition : expandMacro(yyscanner,yyextra->defArgsStr);
+ QCString result = def->isPredefined && !def->expandAsDefined ?
+ def->definition :
+ expandMacro(yyscanner,yyextra->defArgsStr);
outputString(yyscanner,result);
}
else // zero or more arguments
yyextra->macroExpansion &&
(def=isDefined(yyscanner,yytext)) &&
def->nargs==-1 &&
- /*(def->isPredefined || macroIsAccessible(def)) &&*/
(!yyextra->expandOnlyPredef || def->isPredefined)
)
{
- QCString result=def->isPredefined ? def->definition : expandMacro(yyscanner,yytext);
+ QCString result=def->isPredefined && !def->expandAsDefined ?
+ def->definition :
+ expandMacro(yyscanner,yytext);
outputString(yyscanner,result);
}
else
{
if (yyextra->ccomment)
{
- outputArray(yyscanner,"/** ",4);
+ outputArray(yyscanner,"/** ",4); // */
}
BEGIN(yyextra->condCtx);
}
{
i++;
}
- // only /*!< or /**< are treated as a comment for the macro name,
+ // only /*!< ... */ or /**< ... */ are treated as a comment for the macro name,
// otherwise the comment is treated as part of the macro definition
return ((s[i+1]=='*' || s[i+1]=='!') && s[i+2]=='<') ? &s[i-1] : "";
}
*/
static bool expandExpression(yyscan_t yyscanner,QCString &expr,QCString *rest,int pos,int level)
{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
//printf(">expandExpression(expr='%s',rest='%s',pos=%d,level=%d)\n",qPrint(expr),rest ? qPrint(*rest) : "", pos, level);
if (expr.isEmpty())
if (state->expandedDict.find(macroName.str())==state->expandedDict.end()) // expand macro
{
Define *def=isDefined(yyscanner,macroName);
+ // In case EXPAND_ONLY_PREDEF is enabled prevent expansion unless the macro was explicitly
+ // predefined
+ if (yyextra->expandOnlyPredef && def && !def->isPredefined) def=nullptr;
if (macroName=="defined")
{
//printf("found defined inside macro definition '%s'\n",qPrint(expr.right(expr.length()-p)));
expanded = expandExpression(yyscanner,resultExpr,&restExpr,0,level+1);
state->expandedDict.erase(toStdString(macroName));
}
- else if (def && def->nonRecursive)
- {
- expanded = true;
- }
+ else if (def && def->nonRecursive)
+ {
+ expanded = true;
+ }
if (expanded)
{
expr=expr.left(p)+resultExpr+restExpr;
Doxygen::expandAsDefinedSet.find(def.name.str())!=Doxygen::expandAsDefinedSet.end())
{
def.isPredefined=TRUE;
+ def.expandAsDefined=TRUE;
}
auto it = state->localDefines.find(def.name.str());
if (it!=state->localDefines.end()) // redefine
{
// extract include path+name
QCString incFileName=inc.mid(s,i-s).stripWhiteSpace();
-
- QCString dosExt = incFileName.right(4);
- if (dosExt==".exe" || dosExt==".dll" || dosExt==".tlb")
+ if (incFileName.endsWith(".exe") || incFileName.endsWith(".dll") || incFileName.endsWith(".tlb"))
{
// skip imported binary files (e.g. M$ type libraries)
return;
--- /dev/null
+#!/usr/bin/python
+# python script to include common parts in lex file
+#
+# Copyright (C) 1997-2022 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+import sys
+import os
+import re
+
+def main():
+ if len(sys.argv)!=6:
+ sys.exit('Usage: {0} <input_lex_file> <output_lex_file> <correction_file> <dependency_lex_file> <include_path>'.format(sys.argv[0]))
+
+ inp_lex_file, out_lex_file, corr_lex_file, dep_lex_file, inc_path = sys.argv[1:]
+
+ out_cnt = rd_cnt = add_cnt = 0
+ if (os.path.exists(inp_lex_file)):
+ with open(out_lex_file,"w") as out_file:
+ with open(corr_lex_file,"w") as corr_file:
+ first_corr = True
+ with open(dep_lex_file,"w") as dep_file:
+ dep_file.write("{0}:".format(out_lex_file))
+ with open(inp_lex_file) as in_file:
+ for line in in_file:
+ if re.search(r'^%doxygen', line): # special include file marker
+ inc_file = inc_path + "/" + line.split()[1]
+ dep_file.write(" {0}".format(inc_file))
+ first_line = True
+ with open(inc_file) as f_inc:
+ for inc_line in f_inc:
+ if first_line:
+ first_line = False
+ out_file.write(" /* #line 1 {0} */\n".format(inc_file))
+ out_cnt += 1
+ add_cnt += 1
+ out_file.write(inc_line)
+ f_inc.close()
+ if not first_line:
+ out_file.write(" /* #line {0} {1} */\n".format(rd_cnt+2,inp_lex_file))
+ out_cnt += 2
+ add_cnt += 1
+ if first_corr:
+ corr_file.write("{0} {1}\n".format(0,0))
+ first_corr = False
+ corr_file.write("{0} {1}\n".format(out_cnt,add_cnt))
+ else:
+ out_cnt += 1
+ rd_cnt += 1
+ out_file.write(line)
+ dep_file.write("\n")
+ else: # input file does not exist
+ sys.exit("Input lex file '{0}' does not exist.".format(sys.argv[1]))
+
+if __name__ == '__main__':
+ main()
case DocStyleChange::Span:
if (s.enable()) printf("<span>"); else printf("</span>");
break;
- case DocStyleChange::Details:
- if (s.enable())
- {
- indent_pre();
- printf("<details>\n");
- }
- else
- {
- indent_post();
- printf("</details>\n");
- }
- break;
case DocStyleChange::Summary:
if (s.enable())
{
indent_post();
printf("</a>\n");
}
+ void operator()(const DocHtmlDetails &details)
+ {
+ indent_pre();
+ printf("<details");
+ for (const auto &opt : details.attribs())
+ {
+ printf(" %s=\"%s\"",qPrint(opt.name),qPrint(opt.value));
+ }
+ printf(">\n");
+ visitChildren(details);
+ indent_post();
+ printf("</details>\n");
+ }
void operator()(const DocHtmlHeader &header)
{
indent_pre();
static void generateFunctionLink(yyscan_t yyscanner, CodeOutputInterface &ol,
const QCString &funcName);
static bool findMemberLink(yyscan_t yyscanner, CodeOutputInterface &ol,
- Definition *sym, const QCString &symName);
+ const Definition *sym, const QCString &symName);
static void findMemberLink(yyscan_t yyscanner, CodeOutputInterface &ol,
const QCString &symName);
static void adjustScopesAndSuites(yyscan_t yyscanner,unsigned indentLength);
static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
+static inline void pop_state(yyscan_t yyscanner);
#if 0 // TODO: call me to store local variables and get better syntax highlighting, see code.l
static void addVariable(yyscan_t yyscanner, QCString type, QCString name);
endFontClass(yyscanner);
}
unput(*yytext);
- yy_pop_state(yyscanner);
+ pop_state(yyscanner);
}
<*>{POUNDCOMMENT}.* {
if (YY_START==SingleQuoteString ||
static bool findMemberLink(yyscan_t yyscanner,
CodeOutputInterface &ol,
- Definition *sym,
+ const Definition *sym,
const QCString &symName)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool found = false;
if (yyextra->currentDefinition)
{
- auto range = Doxygen::symbolMap->find(symName);
- for (auto it = range.first; it!=range.second; ++it)
+ auto v = Doxygen::symbolMap->find(symName);
+ for (auto p : v)
{
- if (findMemberLink(yyscanner,ol,it->second,symName)) found = true;
+ if (findMemberLink(yyscanner,ol,p,symName)) found = true;
}
}
//printf("sym %s not found\n",&yytext[5]);
printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? qPrint(fileDef->fileName()): NULL);
}
+static inline void pop_state(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if ( yyg->yy_start_stack_ptr <= 0 )
+ warn(yyextra->fileName,yyextra->yyLineNr,"Unexpected statement '%s'",yytext );
+ else
+ yy_pop_state(yyscanner);
+}
+
#if USE_STATE2STRING
#include "pycode.l.h"
#endif
yyextra->start_init = FALSE;
yyextra->current->initializer << yytext;
}
+ "\\\n" {
+ yyextra->current->initializer << yytext;
+ incLineNr(yyscanner);
+ }
. {
yyextra->start_init = FALSE;
yyextra->current->initializer << *yytext;
if (!actualDoc.isEmpty())
{
stripIndentation(actualDoc,yyextra->commentIndent);
- actualDoc.prepend("\\verbatim\n");
- actualDoc.append("\\endverbatim ");
+ actualDoc.prepend("@iverbatim\n");
+ actualDoc.append("@endiverbatim ");
}
}
//printf("-------> yyextra->current=%p yyextra->bodyEntry=%p\n",yyextra->current,yyextra->bodyEntry);
if (!actualDoc.isEmpty())
{
stripIndentation(actualDoc,yyextra->commentIndent);
- actualDoc.prepend("\\verbatim\n");
- actualDoc.append("\\endverbatim ");
+ actualDoc.prepend("@iverbatim\n");
+ actualDoc.append("@endiverbatim ");
}
}
if (yyextra->moduleScope.startsWith("__") && yyextra->moduleScope.endsWith("__"))
static void newFunction(yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (yyextra->current->name.left(2)=="__" && yyextra->current->name.right(2)=="__")
+ if (yyextra->current->name.startsWith("__") && yyextra->current->name.endsWith("__"))
{
// special method name, see
// http://docs.python.org/ref/specialnames.html
return result+"#"+anchor;
}
-Qhp::Qhp() : p(std::make_unique<Private>())
-{
-}
-
-Qhp::~Qhp()
-{
-}
+Qhp::Qhp() : p(std::make_unique<Private>()) {}
+Qhp::~Qhp() = default;
+Qhp::Qhp(Qhp &&) = default;
void Qhp::initialize()
{
#include <memory>
-#include "index.h"
+#include "qcstring.h"
-class Qhp : public IndexIntf
+class Definition;
+class MemberDef;
+
+class Qhp
{
public:
Qhp();
~Qhp();
+ Qhp(Qhp &&);
void initialize();
void finalize();
* - `\s` matches any whitespace as defined by `std::isspace()`
* - `\d` matches any digit as defined by `std::digit()`
* - `\a` matches any alphabetical characters, same as `[a-z_A-Z\x80-\xFF]`
- * - `\w` matches any alpha numercial character, same as `[a-z_A-Z0-9\x80-\xFF]`
+ * - `\w` matches any alpha numerical character, same as `[a-z_A-Z0-9\x80-\xFF]`
* - `\xHH` matches a hexadecimal character, e.g. `\xA0` matches character code 160.
*
* A character range can be used to match a character that falls inside a range
-#!/usr/bin/python
+#!/usr/bin/env python
# Script that compiles a set of resources into a single C++ source file. The C++ file
# offers an initResources() function, which registers the resources with the resource
# manager (class ResourceMgr)
import sys
class File(object):
- def __init__(self,directory,subdir,fileName,mode):
- self.directory = directory
- self.subdir = subdir
- self.fileName = fileName
- filePath = join(directory,subdir,fileName)
- self.fileSize = stat(filePath).st_size
- self.bareName = fileName.replace('.','_')
- self.inputFile = open(filePath,mode)
+ def __init__(self,directory,subdir,fileName,mode):
+ self.directory = directory
+ self.subdir = subdir
+ self.fileName = fileName
+ filePath = join(directory,subdir,fileName)
+ self.fileSize = stat(filePath).st_size
+ self.bareName = fileName.replace('.','_')
+ self.inputFile = open(filePath,mode)
- def formatByte(self,byte):
- if isinstance(byte,int):
- return "%02x" % byte
- else:
- return format(ord(byte),'02x')
+ def formatByte(self,byte):
+ if isinstance(byte,int):
+ return "%02x" % byte
+ else:
+ return format(ord(byte),'02x')
- def writeBytes(self,data,outputFile):
- bytes_per_line=16
- print("static const unsigned char %s_data[] = " % self.bareName,file=outputFile)
- print("{",file=outputFile)
- lines = [data[x:x+bytes_per_line] for x in range(0,len(data),bytes_per_line)]
- linesAsString = ',\n '.join([', '.join(['0x'+self.formatByte(byte) for byte in line]) for line in lines])
- print(' %s' % linesAsString,file=outputFile)
- print("};",file=outputFile)
- print("const int %s_len = %d;\n" % (self.bareName,len(data)),file=outputFile)
+ def writeBytes(self,data,outputFile):
+ bytes_per_line=16
+ print("static const unsigned char %s_data[] = " % self.bareName,file=outputFile)
+ print("{",file=outputFile)
+ lines = [data[x:x+bytes_per_line] for x in range(0,len(data),bytes_per_line)]
+ linesAsString = ',\n '.join([', '.join(['0x'+self.formatByte(byte) for byte in line]) for line in lines])
+ print(' %s' % linesAsString,file=outputFile)
+ print("};",file=outputFile)
+ print("const int %s_len = %d;\n" % (self.bareName,len(data)),file=outputFile)
- def convertToBytes(self,outputFile):
- lines = [x for x in self.inputFile.readlines() if not x.startswith('#')]
- w,h = (int(x) for x in lines[0].split())
- data = "".join(map(chr,[int(w>>8),int(w&0xFF),int(h>>8),int(h&0xFF)]+
- [int(x) for line in lines[1:] for x in line.split()]))
- self.writeBytes(data,outputFile)
+ def convertToBytes(self,outputFile):
+ lines = [x for x in self.inputFile.readlines() if not x.startswith('#')]
+ w,h = (int(x) for x in lines[0].split())
+ data = "".join(map(chr,[int(w>>8),int(w&0xFF),int(h>>8),int(h&0xFF)]+
+ [int(x) for line in lines[1:] for x in line.split()]))
+ self.writeBytes(data,outputFile)
- @staticmethod
- def factory(directory,subdir,fname):
- ext = splitext(fname)[1]
- if ext=='.lum': return LumFile(directory,subdir,fname)
- if ext=='.luma': return LumaFile(directory,subdir,fname)
- if ext=='.css': return CSSFile(directory,subdir,fname)
- if ext=='.svg': return SVGFile(directory,subdir,fname)
- return VerbatimFile(directory,subdir,fname)
+ @staticmethod
+ def factory(directory,subdir,fname):
+ ext = splitext(fname)[1]
+ if ext=='.lum': return LumFile(directory,subdir,fname)
+ if ext=='.luma': return LumaFile(directory,subdir,fname)
+ if ext=='.css': return CSSFile(directory,subdir,fname)
+ if ext=='.svg': return SVGFile(directory,subdir,fname)
+ return VerbatimFile(directory,subdir,fname)
class VerbatimFile(File):
- def __init__(self,directory,subdir,fileName):
- File.__init__(self,directory,subdir,fileName,"rb")
- def writeContents(self,outputFile):
- self.writeBytes(self.inputFile.read(),outputFile)
- def writeDirEntry(self,outputFile):
- print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Verbatim }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+ def __init__(self,directory,subdir,fileName):
+ File.__init__(self,directory,subdir,fileName,"rb")
+ def writeContents(self,outputFile):
+ self.writeBytes(self.inputFile.read(),outputFile)
+ def writeDirEntry(self,outputFile):
+ print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Verbatim }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
class CSSFile(File):
- def __init__(self,directory,subdir,fileName):
- File.__init__(self,directory,subdir,fileName,"r")
- def writeContents(self,outputFile):
- self.writeBytes(self.inputFile.read(),outputFile)
- def writeDirEntry(self,outputFile):
- print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::CSS }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+ def __init__(self,directory,subdir,fileName):
+ File.__init__(self,directory,subdir,fileName,"r")
+ def writeContents(self,outputFile):
+ self.writeBytes(self.inputFile.read(),outputFile)
+ def writeDirEntry(self,outputFile):
+ print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::CSS }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
class SVGFile(File):
- def __init__(self,directory,subdir,fileName):
- File.__init__(self,directory,subdir,fileName,"r")
- def writeContents(self,outputFile):
- self.writeBytes(self.inputFile.read(),outputFile)
- def writeDirEntry(self,outputFile):
- print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::SVG }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+ def __init__(self,directory,subdir,fileName):
+ File.__init__(self,directory,subdir,fileName,"r")
+ def writeContents(self,outputFile):
+ self.writeBytes(self.inputFile.read(),outputFile)
+ def writeDirEntry(self,outputFile):
+ print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::SVG }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
class LumFile(File):
- def __init__(self,directory,subdir,fileName):
- File.__init__(self,directory,subdir,fileName,"r")
- def writeContents(self,outputFile):
- self.convertToBytes(outputFile)
- def writeDirEntry(self,outputFile):
- print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Luminance }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+ def __init__(self,directory,subdir,fileName):
+ File.__init__(self,directory,subdir,fileName,"r")
+ def writeContents(self,outputFile):
+ self.convertToBytes(outputFile)
+ def writeDirEntry(self,outputFile):
+ print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::Luminance }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
class LumaFile(File):
- def __init__(self,directory,subdir,fileName):
- File.__init__(self,directory,subdir,fileName,"r")
- def writeContents(self,outputFile):
- self.convertToBytes(outputFile)
- def writeDirEntry(self,outputFile):
- print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::LumAlpha }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+ def __init__(self,directory,subdir,fileName):
+ File.__init__(self,directory,subdir,fileName,"r")
+ def writeContents(self,outputFile):
+ self.convertToBytes(outputFile)
+ def writeDirEntry(self,outputFile):
+ print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::LumAlpha }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
def main():
- if len(sys.argv)<3:
- sys.exit('Usage: %s directory output_file.cpp' % sys.argv[0])
- directory = sys.argv[1]
- files = []
- for dirName, subdirList, fileList in walk(directory):
- for fname in fileList:
- subdir = dirName[len(directory)+1:] if dirName.startswith(directory) else dirName
- if subdir:
- files.append(File.factory(directory,subdir,fname))
- files.sort(key=lambda f: f.subdir + "/" + f.fileName)
- outputFile = open(sys.argv[2],"w")
- print("#include \"resourcemgr.h\"\n",file=outputFile)
- for f in files:
- f.writeContents(outputFile)
- print("void initResources() { ResourceMgr::instance().registerResources({",file=outputFile)
- for f in files:
- f.writeDirEntry(outputFile)
- print("});}",file=outputFile)
+ if len(sys.argv)<3:
+ sys.exit('Usage: %s directory output_file.cpp' % sys.argv[0])
+ directory = sys.argv[1]
+ files = []
+ for dirName, subdirList, fileList in walk(directory):
+ for fname in fileList:
+ subdir = dirName[len(directory)+1:] if dirName.startswith(directory) else dirName
+ if subdir:
+ files.append(File.factory(directory,subdir,fname))
+ files.sort(key=lambda f: f.subdir + "/" + f.fileName)
+ outputFile = open(sys.argv[2],"w")
+ print("#include \"resourcemgr.h\"\n",file=outputFile)
+ for f in files:
+ f.writeContents(outputFile)
+ print("void initResources() { ResourceMgr::instance().registerResources({",file=outputFile)
+ for f in files:
+ f.writeDirEntry(outputFile)
+ print("});}",file=outputFile)
if __name__ == '__main__':
- main()
+ main()
break;
case DocStyleChange::Div: /* HTML only */ break;
case DocStyleChange::Span: /* HTML only */ break;
- case DocStyleChange::Details: /* emulation of the <details> tag */
- if (s.enable())
- {
- m_t << "{\n";
- m_t << "\\par\n";
- }
- else
- {
- m_t << "\\par";
- m_t << "}\n";
- }
- m_lastIsPara=TRUE;
- break;
case DocStyleChange::Summary: /* emulation of the <summary> tag inside a <details> tag */
- if (s.enable()) m_t << "{\\b "; else m_t << "} ";
+ if (s.enable()) m_t << "{\\b "; else m_t << "}\\par ";
break;
}
}
m_lastIsPara=FALSE;
}
+void RTFDocVisitor::operator()(const DocHtmlDetails &d)
+{
+ if (m_hide) return;
+ //m_lastIsPara=TRUE;
+ //m_t << "{\n";
+ //m_t << "\\par\n";
+ //visitChildren(d);
+ //m_t << "\\par";
+ //m_t << "}\n";
+ //m_lastIsPara=TRUE;
+ DBG_RTF("{\\comment RTFDocVisitor::operator()(const DocHtmlDetails &)}\n");
+ if (!m_lastIsPara) m_t << "\\par\n";
+ m_t << "{"; // start desc
+ incIndentLevel();
+ m_t << rtf_Style_Reset << getStyle("DescContinue");
+ visitChildren(d);
+ if (!m_lastIsPara) m_t << "\\par\n";
+ decIndentLevel();
+ m_t << "}"; // end desc
+ m_lastIsPara=TRUE;
+}
+
void RTFDocVisitor::operator()(const DocHtmlHeader &header)
{
if (m_hide) return;
void operator()(const DocHtmlCell &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
*
*/
-#include <chrono>
-#include <ctime>
#include <stdlib.h>
#include "rtfgen.h"
#include "dir.h"
#include "utf8.h"
#include "debug.h"
-
+#include "datetime.h"
//#define DBG_RTF(x) x;
#define DBG_RTF(x)
static QCString dateToRTFDateString()
{
- auto now = std::chrono::system_clock::now();
- auto time = std::chrono::system_clock::to_time_t(now);
- auto tm = *localtime(&time);
-
+ auto tm = getCurrentDateTime();
QCString result;
result.sprintf("\\yr%d\\mo%d\\dy%d\\hr%d\\min%d\\sec%d",
tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
QCString fileName=name;
m_relPath = relativePathToRoot(fileName);
- if (fileName.right(4)!=".rtf" ) fileName+=".rtf";
+ if (!fileName.endsWith(".rtf")) fileName+=".rtf";
startPlainFile(fileName);
setRelativePath(m_relPath);
setSourceFileName(stripPath(fileName));
-#!/usr/bin/python
-# python script to generate an overview of the staes based on the input lex file.
+#!/usr/bin/env python
+# python script to generate an overview of the states based on the input lex file.
#
# Copyright (C) 1997-2019 by Dimitri van Heesch.
#
std::vector< std::pair<Entry*,std::shared_ptr<Entry> > > outerScopeEntries;
QCString programStr;
- ClangTUParser * clangParser = 0;
+ ClangTUParser *clangParser = 0;
+
+ int fakeNS = 0; //<! number of file scoped namespaces in CSharp file
+ TextStream dummyTextStream;
};
#if USE_STATE2STRING
if (yyextra->insideCli) yyextra->current->spec |= Entry::Initonly;
lineCount(yyscanner);
}
+<FindMembers>{B}*"static"{BN}*/"{" { yyextra->current->type += " static ";
+ yyextra->current->stat = TRUE;
+ lineCount(yyscanner);
+ }
<FindMembers>{B}*"static"{BN}+ { yyextra->current->type += " static ";
yyextra->current->stat = TRUE;
lineCount(yyscanner);
}
}
<HereDocEnd>. { }
-<CopyHereDocEnd>^{ID} { // id at start of the line could mark the end of the block
+<CopyHereDocEnd>^{Bopt}{ID} { // id at start of the line could mark the end of the block
*yyextra->pCopyHereDocGString << yytext;
- if (yyextra->delimiter==yytext) // it is the end marker
+ if (yyextra->delimiter==QCString(yytext).stripWhiteSpace()) // it is the end marker
{
BEGIN(yyextra->lastHereDocContext);
}
<CopyHereDocEnd>. {
*yyextra->pCopyHereDocGString << yytext;
}
-<FindMembers>"Q_OBJECT" { // Qt object macro
+<FindMembers>"Q_OBJECT"|"Q_GADGET" { // Qt object / gadget macro
}
<FindMembers>"Q_PROPERTY" { // Qt property declaration
yyextra->current->protection = Public ; // see bug734245 & bug735462
yyextra->current->name = yytext;
else
yyextra->current->name += yytext;
- if (yyextra->current->name.left(7)=="static ")
+ if (yyextra->current->name.startsWith("static "))
{
yyextra->current->stat = TRUE;
yyextra->current->name= yyextra->current->name.mid(7);
}
- else if (yyextra->current->name.left(7)=="inline ")
+ else if (yyextra->current->name.startsWith("inline "))
{
if (yyextra->current->type.isEmpty())
{
}
yyextra->current->name= yyextra->current->name.mid(7);
}
- else if (yyextra->current->name.left(10)=="constexpr ")
+ else if (yyextra->current->name.startsWith("constexpr "))
{
if (yyextra->current->type.isEmpty())
{
}
yyextra->current->name=yyextra->current->name.mid(10);
}
- else if (yyextra->current->name.left(6)=="const ")
+ else if (yyextra->current->name.startsWith("const "))
{
if (yyextra->current->type.isEmpty())
{
}
yyextra->current->name=yyextra->current->name.mid(6);
}
- else if (yyextra->current->name.left(9)=="volatile ")
+ else if (yyextra->current->name.startsWith("volatile "))
{
if (yyextra->current->type.isEmpty())
{
}
yyextra->current->name=yyextra->current->name.mid(9);
}
- else if (yyextra->current->name.left(8)=="typedef ")
+ else if (yyextra->current->name.startsWith("typedef "))
{
if (yyextra->current->type.isEmpty())
{
yyextra->lastStringContext=YY_START;
BEGIN(CopyGString);
}
+<GCopySquare>\' {
+ *yyextra->pCopySquareGString << *yytext;
+ if (yyextra->insidePHP)
+ {
+ yyextra->pCopyQuotedGString=yyextra->pCopySquareGString;
+ yyextra->lastStringContext=YY_START;
+ BEGIN(CopyPHPGString);
+ }
+ }
<GCopySquare>"[" {
*yyextra->pCopySquareGString << *yytext;
yyextra->squareCount++;
*yyextra->pCopySquareGString << yytext;
}
}
-<GCopySquare>[^"\[\]\n\/,]+ {
+<GCopySquare>[^"'\[\]\n\/,]+ {
*yyextra->pCopySquareGString << yytext;
}
<GCopySquare>. {
yyextra->current->bodyLine = yyextra->yyLineNr;
yyextra->current->bodyColumn = yyextra->yyColNr;
}
- if ( yyextra->insidePHP && yyextra->current->type.left(3) == "var" )
+ if ( yyextra->insidePHP && yyextra->current->type.startsWith("var"))
{
yyextra->current->type = yyextra->current->type.mid(3);
}
- if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
+ if (yyextra->isTypedef && !yyextra->current->type.startsWith("typedef "))
{
yyextra->current->type.prepend("typedef ");
}
yyextra->current->type += *yytext;
}
<FindMembers>"("/{BN}*{ID}{BN}*"*"{BN}*{ID}*")"{BN}*"(" { // for catching typedef void (__stdcall *f)() like definitions
- if (yyextra->current->type.left(7)=="typedef" && yyextra->current->bodyLine==-1)
+ if (yyextra->current->type.startsWith("typedef") &&
+ yyextra->current->bodyLine==-1)
// the bodyLine check is to prevent this guard to be true more than once
{
yyextra->current->bodyLine = yyextra->yyLineNr;
int te=yyextra->current->type.findRev('>');
// bug677315: A<int(void *, char *)> get(); is not a function pointer
+ bool startsWithTypedef = yyextra->current->type.startsWith("typedef ");
bool isFunction = ti==-1 || // not a (...*...) pattern
(ts!=-1 && ts<te && ts<ti && ti<te); // (...*...) is part of a template argument list
- bool isVariable = (!yyextra->current->type.isEmpty() &&
- (!isFunction || yyextra->current->type.left(8)=="typedef "));
+ bool isVariable = !yyextra->current->type.isEmpty() &&
+ (!isFunction || startsWithTypedef);
//printf("type=%s ts=%d te=%d ti=%d isFunction=%d\n",
// qPrint(yyextra->current->type),ts,te,ti,isFunction);
if (isVariable)
{
//printf("Scanner.l: found in class variable: '%s' '%s' '%s'\n", qPrint(yyextra->current->type),qPrint(yyextra->current->name),qPrint(yyextra->current->args));
- if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
+ if (yyextra->isTypedef && !startsWithTypedef)
{
yyextra->current->type.prepend("typedef ");
}
//printf("Scanner.l: prototype? type='%s' name='%s' args='%s'\n",qPrint(yyextra->current->type),qPrint(yyextra->current->name),qPrint(yyextra->current->args));
if (isVariable)
{
- if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
+ if (yyextra->isTypedef && !startsWithTypedef)
{
yyextra->current->type.prepend("typedef ");
}
<SkipInits,SkipCurly,SkipCurlyCpp>@\" {
if (!yyextra->insideCS) REJECT;
// C# verbatim string
+ // we want to discard the string, due to reuse of states we need a dummy stream
yyextra->lastSkipVerbStringContext=YY_START;
- yyextra->pSkipVerbString=&yyextra->current->initializer;
+ yyextra->pSkipVerbString=&yyextra->dummyTextStream;
+ yyextra->dummyTextStream.clear(); // remove old data so it won't grow too much
BEGIN(SkipVerbString);
}
<SkipInits,SkipCurly,SkipCurlyCpp>{CHARLIT} {
<ClassTemplSpec>. {
yyextra->current->name += yytext;
}
-<CompoundName>{SCOPENAME}{BN}*";" { // forward declaration
- if (!yyextra->current->tArgLists.empty())
+<CompoundName>{SCOPENAME}{BN}*";" { // forward declaration?
+ if (yyextra->insideCS && yyextra->current->type == "namespace")
+ {
+ // file scoped CSharp namespace
+ lineCount(yyscanner);
+ yyextra->current->name = yytext;
+ yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
+ yyextra->fakeNS++;
+ unput('{'); // fake start of body
+ BEGIN( ClassVar );
+ }
+ else if (!yyextra->current->tArgLists.empty())
{
// found a forward template declaration, this has
// a purpose of its own
yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
}
- unput(';');
- yyextra->current->reset();
- initEntry(yyscanner);
- if (yyextra->insideObjC) // see bug746361
- {
- yyextra->language = yyextra->current->lang = SrcLangExt_Cpp;
- yyextra->insideObjC = FALSE;
- }
- if (yyextra->isTypedef) // typedef of a class, put typedef keyword back
+ if (!(yyextra->insideCS && yyextra->current->type == "namespace"))
{
- yyextra->current->type.prepend("typedef");
+ unput(';');
+ yyextra->current->reset();
+ initEntry(yyscanner);
+ if (yyextra->insideObjC) // see bug746361
+ {
+ yyextra->language = yyextra->current->lang = SrcLangExt_Cpp;
+ yyextra->insideObjC = FALSE;
+ }
+ if (yyextra->isTypedef) // typedef of a class, put typedef keyword back
+ {
+ yyextra->current->type.prepend("typedef");
+ }
+ BEGIN( FindMembers );
}
- BEGIN( FindMembers );
}
<CompoundName>{SCOPENAME}/{BN}*"(" {
yyextra->current->name = yytext ;
yyextra->lastCContext = YY_START ;
BEGIN( SkipCxxComment ) ;
}
+<<EOF>> {
+ if (yyextra->insideCS && yyextra->fakeNS)
+ {
+ yyextra->fakeNS--;
+ unput('}');
+ BEGIN ( ReadNSBody);
+ }
+ else
+ {
+ yyterminate();
+ }
+ }
%%
//----------------------------------------------------------------------------
static bool checkForKnRstyleC(yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (((QCString)yyextra->fileName).right(2).lower()!=".c") return FALSE; // must be a C file
+ if (!yyextra->fileName.lower().endsWith(".c")) return FALSE; // must be a C file
if (yyextra->current->argList.empty()) return FALSE; // must have arguments
for (const Argument &a : yyextra->current->argList)
{
if (a.type==name)
{
a.type=type.stripWhiteSpace();
- if (a.type.left(9)=="register ") // strip keyword
- {
- a.type=a.type.mid(9);
- }
+ a.type.stripPrefix("register ");
a.name=name.stripWhiteSpace();
if (!brief.isEmpty() && !docs.isEmpty())
{
//--------------------------------------------------------------------
-struct URL
-{
- URL(QCString n,QCString u) : name(n), url(u) {}
- QCString name;
- QCString url;
-};
-
-struct URLInfo
-{
- URLInfo(int idx,int f) : urlIdx(idx), freq(f) {}
- int urlIdx;
- int freq;
-};
-
-class IndexWord
-{
- public:
- using URLInfoMap = std::unordered_map<int,URLInfo>;
- IndexWord(QCString word);
- void addUrlIndex(int,bool);
- URLInfoMap urls() const { return m_urls; }
- QCString word() const { return m_word; }
-
- private:
- QCString m_word;
- URLInfoMap m_urls;
-};
-
-IndexWord::IndexWord(QCString word) : m_word(word)
-{
- //printf("IndexWord::IndexWord(%s)\n",word);
-}
-
-void IndexWord::addUrlIndex(int idx,bool hiPriority)
+void SearchIndex::IndexWord::addUrlIndex(int idx,bool hiPriority)
{
//printf("IndexWord::addUrlIndex(%d,%d)\n",idx,hiPriority);
auto it = m_urls.find(idx);
//--------------------------------------------------------------------
-class SearchIndex : public SearchIndexIntf
-{
- public:
- SearchIndex();
- void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile) override;
- void addWord(const QCString &word,bool hiPriority) override;
- void write(const QCString &file) override;
- private:
- void addWord(const QCString &word,bool hiPrio,bool recurse);
- std::unordered_map<std::string,int> m_words;
- std::vector< std::vector< IndexWord> > m_index;
- std::unordered_map<std::string,int> m_url2IdMap;
- std::map<int,URL> m_urls;
- int m_urlIndex = -1;
-};
-
-SearchIndex::SearchIndex() : SearchIndexIntf(Internal)
+SearchIndex::SearchIndex()
{
m_index.resize(numIndexEntries);
}
return c1*256+c2;
}
-void SearchIndex::addWord(const QCString &word,bool hiPriority,bool recurse)
+void SearchIndex::addWordRec(const QCString &word,bool hiPriority,bool recurse)
{
if (word.isEmpty()) return;
QCString wStr = QCString(word).lower();
i=getPrefixIndex(word);
if (i>0)
{
- addWord(word.data()+i,hiPriority,TRUE);
+ addWordRec(word.data()+i,hiPriority,TRUE);
found=TRUE;
}
}
}
if (word[i]!=0 && i>=1)
{
- addWord(word.data()+i+1,hiPriority,TRUE);
+ addWordRec(word.data()+i+1,hiPriority,TRUE);
}
}
}
void SearchIndex::addWord(const QCString &word,bool hiPriority)
{
- addWord(word,hiPriority,FALSE);
+ addWordRec(word,hiPriority,FALSE);
}
static void writeInt(std::ostream &f,size_t index)
//---------------------------------------------------------------------------
// the following part is for writing an external search index
-struct SearchDocEntry
-{
- QCString type;
- QCString name;
- QCString args;
- QCString extId;
- QCString url;
- GrowBuf importantText;
- GrowBuf normalText;
-};
-
-class SearchIndexExternal : public SearchIndexIntf
-{
- struct Private;
- public:
- SearchIndexExternal();
- void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile) override;
- void addWord(const QCString &word,bool hiPriority) override;
- void write(const QCString &file) override;
- private:
- std::unique_ptr<Private> p;
-};
-
-struct SearchIndexExternal::Private
-{
- std::map<std::string,SearchDocEntry> docEntries;
- SearchDocEntry *current = 0;
-};
-
-SearchIndexExternal::SearchIndexExternal() : SearchIndexIntf(External), p(std::make_unique<Private>())
+SearchIndexExternal::SearchIndexExternal()
{
}
if (!anchor.isEmpty()) url+=QCString("#")+anchor;
QCString key = extId+";"+url;
- auto it = p->docEntries.find(key.str());
- if (it == p->docEntries.end())
+ auto it = m_docEntries.find(key.str());
+ if (it == m_docEntries.end())
{
SearchDocEntry e;
e.type = isSourceFile ? QCString("source") : definitionToName(ctx);
}
e.extId = extId;
e.url = url;
- it = p->docEntries.insert({key.str(),e}).first;
+ it = m_docEntries.insert({key.str(),e}).first;
//printf("searchIndexExt %s : %s\n",qPrint(e->name),qPrint(e->url));
}
- p->current = &it->second;
+ m_current = &it->second;
}
void SearchIndexExternal::addWord(const QCString &word,bool hiPriority)
{
- if (word.isEmpty() || !isId(word[0]) || p->current==0) return;
- GrowBuf *pText = hiPriority ? &p->current->importantText : &p->current->normalText;
+ if (word.isEmpty() || !isId(word[0]) || m_current==0) return;
+ GrowBuf *pText = hiPriority ? &m_current->importantText : &m_current->normalText;
if (pText->getPos()>0) pText->addChar(' ');
pText->addStr(word);
//printf("addWord %s\n",word);
{
t << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
t << "<add>\n";
- for (auto &kv : p->docEntries)
+ for (auto &kv : m_docEntries)
{
SearchDocEntry &doc = kv.second;
doc.normalText.addChar(0); // make sure buffer ends with a 0 terminator
bool externalSearch = Config_getBool(EXTERNAL_SEARCH);
if (searchEngine && serverBasedSearch)
{
- if (externalSearch) // external tools produce search index and engine
- {
- Doxygen::searchIndex = new SearchIndexExternal;
- }
- else // doxygen produces search index and engine
- {
- Doxygen::searchIndex = new SearchIndex;
- }
+ Doxygen::searchIndex = new SearchIndexIntf(externalSearch ? SearchIndexIntf::External : SearchIndexIntf::Internal);
}
else // no search engine or pure javascript based search function
{
/******************************************************************************
*
- * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ * Copyright (C) 1997-2022 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
#include <memory>
#include <vector>
+#include <map>
+#include <unordered_map>
#include <string>
#include <array>
#include <variant>
#include "qcstring.h"
+#include "growbuf.h"
+#include "dispatcher.h"
class Definition;
class SearchIndexIntf;
//-----------------------------
+/** Writes search index for doxygen provided server based search engine that uses PHP. */
+class SearchIndex
+{
+ struct URL
+ {
+ URL(QCString n,QCString u) : name(n), url(u) {}
+ QCString name;
+ QCString url;
+ };
+
+ struct URLInfo
+ {
+ URLInfo(int idx,int f) : urlIdx(idx), freq(f) {}
+ int urlIdx;
+ int freq;
+ };
+
+ class IndexWord
+ {
+ public:
+ using URLInfoMap = std::unordered_map<int,URLInfo>;
+ IndexWord(QCString word) : m_word(word) {}
+ void addUrlIndex(int,bool);
+ URLInfoMap urls() const { return m_urls; }
+ QCString word() const { return m_word; }
+
+ private:
+ QCString m_word;
+ URLInfoMap m_urls;
+ };
+
+ public:
+ SearchIndex();
+ void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile);
+ void addWord(const QCString &word,bool hiPriority);
+ void write(const QCString &file);
+ private:
+ void addWordRec(const QCString &word,bool hiPrio,bool recurse);
+ std::unordered_map<std::string,int> m_words;
+ std::vector< std::vector< IndexWord> > m_index;
+ std::unordered_map<std::string,int> m_url2IdMap;
+ std::map<int,URL> m_urls;
+ int m_urlIndex = -1;
+};
+
+/** Writes search index that should be used with an externally provided search engine,
+ * e.g. doxyindexer and doxysearch.cgi.
+ */
+class SearchIndexExternal
+{
+ struct SearchDocEntry
+ {
+ QCString type;
+ QCString name;
+ QCString args;
+ QCString extId;
+ QCString url;
+ GrowBuf importantText;
+ GrowBuf normalText;
+ };
+
+ public:
+ SearchIndexExternal();
+ void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile);
+ void addWord(const QCString &word,bool hiPriority);
+ void write(const QCString &file);
+ private:
+ std::map<std::string,SearchDocEntry> m_docEntries;
+ SearchDocEntry *m_current = 0;
+};
+
+namespace SearchIndexMethods
+{
+ template <class T> struct setCurrentDoc { static constexpr auto method = &T::setCurrentDoc; };
+ template <class T> struct addWord { static constexpr auto method = &T::addWord; };
+ template <class T> struct write { static constexpr auto method = &T::write; };
+}
+
+/** Abstract proxy interface for non-javascript based search indices.
+ * It forwards calls to either SearchIndex or SearchIndexExternal depending
+ * on the Kind passed during construction.
+ */
class SearchIndexIntf
{
public:
+ using SearchIndexVariant = std::variant<SearchIndex,SearchIndexExternal>;
enum Kind { Internal, External };
- SearchIndexIntf(Kind k) : m_kind(k) {}
- virtual ~SearchIndexIntf() = default;
- virtual void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile) = 0;
- virtual void addWord(const QCString &word,bool hiPriority) = 0;
- virtual void write(const QCString &file) = 0;
+ SearchIndexIntf(Kind k) : m_kind(k),
+ m_variant(k==Internal ? SearchIndexVariant(SearchIndex()) :
+ SearchIndexVariant(SearchIndexExternal())) { }
+ void setCurrentDoc(const Definition *ctx,const QCString &anchor,bool isSourceFile)
+ {
+ dispatch_call<SearchIndexMethods::setCurrentDoc>(m_variant,ctx,anchor,isSourceFile);
+ }
+ void addWord(const QCString &word,bool hiPriority)
+ {
+ dispatch_call<SearchIndexMethods::addWord>(m_variant,word,hiPriority);
+ }
+ void write(const QCString &file)
+ {
+ dispatch_call<SearchIndexMethods::write>(m_variant,file);
+ }
Kind kind() const { return m_kind; }
private:
Kind m_kind;
+ SearchIndexVariant m_variant;
};
#include "version.h"
#include "message.h"
#include "resourcemgr.h"
+#include "indexlist.h"
QCString searchName(const Definition *d)
{
QCString baseName;
baseName.sprintf("%s_%x",sii.name.data(),p);
- QCString fileName = searchDirName + "/"+baseName+Doxygen::htmlFileExtension;
QCString dataFileName = searchDirName + "/"+baseName+".js";
- std::ofstream t(fileName.str(), std::ofstream::out | std::ofstream::binary);
std::ofstream ti(dataFileName.str(), std::ofstream::out | std::ofstream::binary);
- if (t.is_open() && ti.is_open())
+ if (ti.is_open())
{
- {
- t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
- " \"https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
- t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
- t << "<head><title></title>\n";
- t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n";
- t << "<meta name=\"generator\" content=\"Doxygen " << getDoxygenVersion() << "\"/>\n";
- t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n";
- t << "<script type=\"text/javascript\" src=\"" << baseName << ".js\"></script>\n";
- t << "<script type=\"text/javascript\" src=\"search.js\"></script>\n";
- t << "</head>\n";
- t << "<body class=\"SRPage\">\n";
- t << "<div id=\"SRIndex\">\n";
- t << "<div class=\"SRStatus\" id=\"Loading\">" << theTranslator->trLoading() << "</div>\n";
- t << "<div id=\"SRResults\"></div>\n"; // here the results will be inserted
- t << "<script type=\"text/javascript\">\n";
- t << "/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */\n";
- t << "createResults();\n"; // this function will insert the results
- t << "/* @license-end */\n";
- t << "</script>\n";
- t << "<div class=\"SRStatus\" id=\"Searching\">"
- << theTranslator->trSearching() << "</div>\n";
- t << "<div class=\"SRStatus\" id=\"NoMatches\">"
- << theTranslator->trNoMatches() << "</div>\n";
-
- t << "<script type=\"text/javascript\">\n";
- t << "/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */\n";
- t << "document.getElementById(\"Loading\").style.display=\"none\";\n";
- t << "document.getElementById(\"NoMatches\").style.display=\"none\";\n";
- t << "var searchResults = new SearchResults(\"searchResults\");\n";
- t << "searchResults.Search();\n";
- t << "window.addEventListener(\"message\", function(event) {\n";
- t << " if (event.data == \"take_focus\") {\n";
- t << " var elem = searchResults.NavNext(0);\n";
- t << " if (elem) elem.focus();\n";
- t << " }\n";
- t << "});\n";
- t << "/* @license-end */\n";
- t << "</script>\n";
- t << "</div>\n"; // SRIndex
- t << "</body>\n";
- t << "</html>\n";
- }
ti << "var searchData=\n";
// format
}
else
{
- err("Failed to open file '%s' for writing...\n",qPrint(fileName));
+ err("Failed to open file '%s' for writing...\n",qPrint(dataFileName));
}
p++;
}
ResourceMgr::instance().copyResource("search.js",searchDirName);
}
- {
- QCString noMatchesFileName =searchDirName+"/nomatches"+Doxygen::htmlFileExtension;
- std::ofstream t(noMatchesFileName.str(), std::ofstream::out | std::ofstream::binary);
- if (t.is_open())
- {
- t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" "
- "\"https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
- t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
- t << "<head><title></title>\n";
- t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n";
- t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n";
- t << "<script type=\"text/javascript\" src=\"search.js\"></script>\n";
- t << "</head>\n";
- t << "<body class=\"SRPage\">\n";
- t << "<div id=\"SRIndex\">\n";
- t << "<div class=\"SRStatus\" id=\"NoMatches\">"
- << theTranslator->trNoMatches() << "</div>\n";
- t << "</div>\n";
- t << "</body>\n";
- t << "</html>\n";
- }
- }
-
Doxygen::indexList->addStyleSheetFile("search/search.js");
}
#define SYMBOLMAP_H
#include <algorithm>
-#include <map>
+#include <unordered_map>
#include <vector>
#include <string>
#include <utility>
{
public:
using Ptr = T *;
- using Map = std::multimap<std::string,Ptr>;
+ using VectorPtr = std::vector<Ptr>;
+ using Map = std::unordered_map<std::string,VectorPtr>;
using iterator = typename Map::iterator;
using const_iterator = typename Map::const_iterator;
//! Add a symbol \a def into the map under key \a name
void add(const QCString &name,Ptr def)
{
- m_map.insert({name.str(),def});
+ auto it = m_map.find(name.str());
+ if (it!=m_map.end())
+ {
+ it->second.push_back(def);
+ }
+ else
+ {
+ m_map.emplace(std::make_pair(name.str(),VectorPtr({def})));
+ }
}
//! Remove a symbol \a def from the map that was stored under key \a name
void remove(const QCString &name,Ptr def)
{
- auto range = find(name);
- for (auto it=range.first; it!=range.second; )
+ VectorPtr &v = find(name);
+ auto it = std::find(v.begin(),v.end(),def);
+ if (it!=v.end())
{
- if (it->second==def) it = m_map.erase(it); else ++it;
+ v.erase(it);
+ if (v.empty())
+ {
+ m_map.erase(name.str());
+ }
}
}
//! Find the list of symbols stored under key \a name
//! Returns a pair of iterators pointing to the start and end of the range of matching symbols
- std::pair<const_iterator,const_iterator> find(const QCString &name) const
+ const VectorPtr &find(const QCString &name) const
{
- return m_map.equal_range(name.str());
+ auto it = m_map.find(name.str());
+ return it==m_map.end() ? m_noMatch : it->second;
}
//! Find the list of symbols stored under key \a name
//! Returns a pair of iterators pointing to the start and end of the range of matching symbols
- std::pair<iterator,iterator> find(const QCString &name)
+ VectorPtr &find(const QCString &name)
{
- return m_map.equal_range(name.str());
+ auto it = m_map.find(name.str());
+ return it==m_map.end() ? m_noMatch : it->second;
}
iterator begin() { return m_map.begin(); }
const_iterator begin() const { return m_map.cbegin(); }
const_iterator end() const { return m_map.cend(); }
bool empty() const { return m_map.empty(); }
- size_t size() const { return m_map.size(); }
private:
Map m_map;
+ VectorPtr m_noMatch;
};
#endif
/** Element in the stack. */
struct AccessElem
{
- AccessElem(const Definition *d,const FileDef *f,const Definition *i,QCString e = QCString()) : scope(d), fileScope(f), item(i), expScope(e) {}
+ AccessElem(const Definition *d,const FileDef *f,const Definition *i) : scope(d), fileScope(f), item(i) {}
+ AccessElem(const Definition *d,const FileDef *f,const Definition *i,const QCString &e) : scope(d), fileScope(f), item(i), expScope(e) {}
const Definition *scope;
const FileDef *fileScope;
const Definition *item;
const MemberDef *typeDef = 0;
QCString templateSpec;
- const ClassDef *getResolvedClassRec(
+ const ClassDef *getResolvedTypeRec(
const Definition *scope, // in
- const QCString &n, // in
+ const QCString &n, // in
+ const MemberDef **pTypeDef, // out
+ QCString *pTemplSpec, // out
+ QCString *pResolvedType); // out
+ //
+ const Definition *getResolvedSymbolRec(
+ const Definition *scope, // in
+ const QCString &n, // in
+ const QCString &args, // in
+ bool checkCV, // in
const MemberDef **pTypeDef, // out
QCString *pTemplSpec, // out
QCString *pResolvedType); // out
const QCString &explicitScopePart);
private:
- void getResolvedSymbol(const Definition *scope, // in
+ void getResolvedType( const Definition *scope, // in
const Definition *d, // in
const QCString &explicitScopePart, // in
const std::unique_ptr<ArgumentList> &actTemplParams, // in
const MemberDef *&bestTypedef, // out
QCString &bestTemplSpec, // out
QCString &bestResolvedType // out
+ );
+
+ void getResolvedSymbol(const Definition *scope, // in
+ const Definition *d, // in
+ const QCString &args, // in
+ bool checkCV, // in
+ const QCString &explicitScopePart, // in
+ const std::unique_ptr<ArgumentList> &actTemplParams, // in
+ int &minDistance, // inout
+ const Definition *&bestMatch, // out
+ const MemberDef *&bestTypedef, // out
+ QCString &bestTemplSpec, // out
+ QCString &bestResolvedType // out
);
const ClassDef *newResolveTypedef(
-const ClassDef *SymbolResolver::Private::getResolvedClassRec(
+const ClassDef *SymbolResolver::Private::getResolvedTypeRec(
const Definition *scope,
const QCString &n,
const MemberDef **pTypeDef,
{
if (n.isEmpty()) return 0;
//static int level=0;
- //fprintf(stderr,"%d [getResolvedClassRec(%s,%s)\n",level++,scope?qPrint(scope->name()):"<global>",n);
- QCString name;
+ //printf("\n%d [getResolvedTypeRec(%s,%s)\n",level++,scope?qPrint(scope->name()):"<global>",qPrint(n));
QCString explicitScopePart;
QCString strippedTemplateParams;
- name=stripTemplateSpecifiersFromScope
- (removeRedundantWhiteSpace(n),TRUE,
- &strippedTemplateParams);
+ QCString name=stripTemplateSpecifiersFromScope(n,TRUE,&strippedTemplateParams);
std::unique_ptr<ArgumentList> actTemplParams;
if (!strippedTemplateParams.isEmpty()) // template part that was stripped
{
if (name.isEmpty())
{
- //fprintf(stderr,"%d ] empty name\n",--level);
+ //printf("%d ] empty name\n",--level);
return 0; // empty name
}
- //printf("Looking for symbol %s\n",qPrint(name));
- auto range = Doxygen::symbolMap->find(name);
- // the -g (for C# generics) and -p (for ObjC protocols) are now already
- // stripped from the key used in the symbolMap, so that is not needed here.
- if (range.first==range.second)
+ //printf("Looking for type %s\n",qPrint(name));
+ auto &range = Doxygen::symbolMap->find(name);
+ if (range.empty())
{
- range = Doxygen::symbolMap->find(name+"-p");
- if (range.first==range.second)
- {
- //fprintf(stderr,"%d ] no such symbol!\n",--level);
- return 0;
- }
+ return 0;
}
- //printf("found symbol!\n");
+ //printf("found type!\n");
bool hasUsingStatements =
(m_fileScope && (!m_fileScope->getUsedNamespaces().empty() ||
int fileScopeLen = hasUsingStatements ? 1+m_fileScope->absFilePath().length() : 0;
// below is a more efficient coding of
- // QCString key=scope->name()+"+"+name+"+"+explicitScopePart;
+ // QCString key=scope->name()+"+"+name+"+"+explicitScopePart+args+typesOnly?'T':'F';
QCString key(scopeNameLen+nameLen+explicitPartLen+fileScopeLen+1);
char *pk=key.rawData();
qstrcpy(pk,scope->name().data()); *(pk+scopeNameLen-1)='+';
{
std::lock_guard<std::mutex> lock(g_cacheMutex);
- LookupInfo *pval = Doxygen::lookupCache->find(key.str());
- //printf("Searching for %s result=%p\n",qPrint(key),pval);
+ LookupInfo *pval = Doxygen::typeLookupCache->find(key.str());
+ //printf("Searching for %s result=%p\n",qPrint(key),(void*)pval);
if (pval)
{
//printf("LookupInfo %p %p '%s' %p\n",
if (pTemplSpec) *pTemplSpec=pval->templSpec;
if (pTypeDef) *pTypeDef=pval->typeDef;
if (pResolvedType) *pResolvedType=pval->resolvedType;
- //fprintf(stderr,"%d ] cachedMatch=%s\n",--level,
- // pval->classDef?qPrint(pval->classDef->name()):"<none>");
+ //printf("%d ] cachedMatch=%s\n",--level,
+ // pval->definition?qPrint(pval->definition->name()):"<none>");
//if (pTemplSpec)
// printf("templSpec=%s\n",pTemplSpec->data());
- return pval->classDef;
+ return toClassDef(pval->definition);
}
else // not found yet; we already add a 0 to avoid the possibility of
// endless recursion.
{
- Doxygen::lookupCache->insert(key.str(),LookupInfo());
+ Doxygen::typeLookupCache->insert(key.str(),LookupInfo());
}
}
QCString bestResolvedType;
int minDistance=10000; // init at "infinite"
- for (auto it=range.first ; it!=range.second; ++it)
+ for (Definition *d : range)
{
- Definition *d = it->second;
- getResolvedSymbol(scope,d,explicitScopePart,actTemplParams,
+ getResolvedType(scope,d,explicitScopePart,actTemplParams,
+ minDistance,bestMatch,bestTypedef,bestTemplSpec,bestResolvedType);
+ if (minDistance==0) break; // we can stop reaching if we already reached distance 0
+ }
+
+ if (pTypeDef)
+ {
+ *pTypeDef = bestTypedef;
+ }
+ if (pTemplSpec)
+ {
+ *pTemplSpec = bestTemplSpec;
+ }
+ if (pResolvedType)
+ {
+ *pResolvedType = bestResolvedType;
+ }
+
+ //printf("getResolvedSymbolRec: bestMatch=%p pval->resolvedType=%s\n",
+ // bestMatch,qPrint(bestResolvedType));
+
+ {
+ // we need to insert the item in the cache again, as it could be removed in the meantime
+ std::lock_guard<std::mutex> lock(g_cacheMutex);
+ Doxygen::typeLookupCache->insert(key.str(),
+ LookupInfo(bestMatch,bestTypedef,bestTemplSpec,bestResolvedType));
+ }
+ //printf("%d ] bestMatch=%s distance=%d\n",--level,
+ // bestMatch?qPrint(bestMatch->name()):"<none>",minDistance);
+ //if (pTemplSpec)
+ // printf("templSpec=%s\n",pTemplSpec->data());
+ return bestMatch;
+}
+
+const Definition *SymbolResolver::Private::getResolvedSymbolRec(
+ const Definition *scope,
+ const QCString &n,
+ const QCString &args,
+ bool checkCV,
+ const MemberDef **pTypeDef,
+ QCString *pTemplSpec,
+ QCString *pResolvedType)
+{
+ if (n.isEmpty()) return 0;
+ //static int level=0;
+ //printf("\n%d [getResolvedSymbolRec(%s,%s)\n",level++,scope?qPrint(scope->name()):"<global>",qPrint(n));
+ QCString explicitScopePart;
+ QCString strippedTemplateParams;
+ QCString name=stripTemplateSpecifiersFromScope(n,TRUE,&strippedTemplateParams);
+ std::unique_ptr<ArgumentList> actTemplParams;
+ if (!strippedTemplateParams.isEmpty()) // template part that was stripped
+ {
+ actTemplParams = stringToArgumentList(scope->getLanguage(),strippedTemplateParams);
+ }
+
+ int qualifierIndex = computeQualifiedIndex(name);
+ //printf("name=%s qualifierIndex=%d\n",qPrint(name),qualifierIndex);
+ if (qualifierIndex!=-1) // qualified name
+ {
+ // split off the explicit scope part
+ explicitScopePart=name.left(qualifierIndex);
+ // todo: improve namespace alias substitution
+ replaceNamespaceAliases(explicitScopePart,explicitScopePart.length());
+ name=name.mid(qualifierIndex+2);
+ }
+
+ if (name.isEmpty())
+ {
+ //printf("%d ] empty name\n",--level);
+ return 0; // empty name
+ }
+
+ //printf("Looking for symbol %s\n",qPrint(name));
+ auto &range = Doxygen::symbolMap->find(name);
+ if (range.empty())
+ {
+ //printf("%d ] not symbols\n",--level);
+ return 0;
+ }
+ //printf("found symbol %zu times!\n",range.size());
+
+ bool hasUsingStatements =
+ (m_fileScope && (!m_fileScope->getUsedNamespaces().empty() ||
+ !m_fileScope->getUsedClasses().empty())
+ );
+ //printf("hasUsingStatements=%d\n",hasUsingStatements);
+ // Since it is often the case that the same name is searched in the same
+ // scope over an over again (especially for the linked source code generation)
+ // we use a cache to collect previous results. This is possible since the
+ // result of a lookup is deterministic. As the key we use the concatenated
+ // scope, the name to search for and the explicit scope prefix. The speedup
+ // achieved by this simple cache can be enormous.
+ int scopeNameLen = scope->name().length()+1;
+ int nameLen = name.length()+1;
+ int explicitPartLen = explicitScopePart.length();
+ int fileScopeLen = hasUsingStatements ? 1+m_fileScope->absFilePath().length() : 0;
+ int argsLen = args.length()+1;
+
+ // below is a more efficient coding of
+ // QCString key=scope->name()+"+"+name+"+"+explicitScopePart+args+typesOnly?'T':'F';
+ QCString key(scopeNameLen+nameLen+explicitPartLen+fileScopeLen+argsLen+1);
+ char *pk=key.rawData();
+ qstrcpy(pk,scope->name().data()); *(pk+scopeNameLen-1)='+';
+ pk+=scopeNameLen;
+ qstrcpy(pk,name.data()); *(pk+nameLen-1)='+';
+ pk+=nameLen;
+ qstrcpy(pk,explicitScopePart.data());
+ pk+=explicitPartLen;
+
+ // if a file scope is given and it contains using statements we should
+ // also use the file part in the key (as a class name can be in
+ // two different namespaces and a using statement in a file can select
+ // one of them).
+ if (hasUsingStatements)
+ {
+ // below is a more efficient coding of
+ // key+="+"+m_fileScope->name();
+ *pk++='+';
+ qstrcpy(pk,m_fileScope->absFilePath().data());
+ pk+=fileScopeLen-1;
+ }
+ if (argsLen>0)
+ {
+ qstrcpy(pk,args.data());
+ pk+=argsLen-1;
+ }
+ *pk='\0';
+
+ {
+ std::lock_guard<std::mutex> lock(g_cacheMutex);
+ LookupInfo *pval = Doxygen::symbolLookupCache->find(key.str());
+ //printf("Searching for %s result=%p\n",qPrint(key),(void*)pval);
+ if (pval)
+ {
+ //printf("LookupInfo %p %p '%s' %p\n",
+ // pval->classDef, pval->typeDef, qPrint(pval->templSpec),
+ // qPrint(pval->resolvedType));
+ if (pTemplSpec) *pTemplSpec=pval->templSpec;
+ if (pTypeDef) *pTypeDef=pval->typeDef;
+ if (pResolvedType) *pResolvedType=pval->resolvedType;
+ //printf("%d ] cachedMatch=%s\n",--level,
+ // pval->definition?qPrint(pval->definition->name()):"<none>");
+ //if (pTemplSpec)
+ // printf("templSpec=%s\n",pTemplSpec->data());
+ return pval->definition;
+ }
+ else // not found yet; we already add a 0 to avoid the possibility of
+ // endless recursion.
+ {
+ Doxygen::symbolLookupCache->insert(key.str(),LookupInfo());
+ }
+ }
+
+ const Definition *bestMatch=0;
+ const MemberDef *bestTypedef=0;
+ QCString bestTemplSpec;
+ QCString bestResolvedType;
+ int minDistance=10000; // init at "infinite"
+
+ for (Definition *d : range)
+ {
+ getResolvedSymbol(scope,d,args,checkCV,explicitScopePart,actTemplParams,
+ minDistance,bestMatch,bestTypedef,bestTemplSpec,bestResolvedType);
+ if (minDistance==0) break; // we can stop reaching if we already reached distance 0
+ }
+
+ // in case we are looking for e.g. func() and the real function is func(int x) we also
+ // accept func(), see example 036 in the test set.
+ if (bestMatch==0 && args=="()")
+ {
+ for (Definition *d : range)
+ {
+ getResolvedSymbol(scope,d,QCString(),false,explicitScopePart,actTemplParams,
minDistance,bestMatch,bestTypedef,bestTemplSpec,bestResolvedType);
+ if (minDistance==0) break; // we can stop reaching if we already reached distance 0
+ }
}
if (pTypeDef)
*pResolvedType = bestResolvedType;
}
- //printf("getResolvedClassRec: bestMatch=%p pval->resolvedType=%s\n",
+ //printf("getResolvedSymbolRec: bestMatch=%p pval->resolvedType=%s\n",
// bestMatch,qPrint(bestResolvedType));
{
// we need to insert the item in the cache again, as it could be removed in the meantime
std::lock_guard<std::mutex> lock(g_cacheMutex);
- Doxygen::lookupCache->insert(key.str(),
+ Doxygen::symbolLookupCache->insert(key.str(),
LookupInfo(bestMatch,bestTypedef,bestTemplSpec,bestResolvedType));
}
- //fprintf(stderr,"%d ] bestMatch=%s distance=%d\n",--level,
+ //printf("%d ] bestMatch=%s distance=%d\n",--level,
// bestMatch?qPrint(bestMatch->name()):"<none>",minDistance);
//if (pTemplSpec)
// printf("templSpec=%s\n",pTemplSpec->data());
return bestMatch;
}
-void SymbolResolver::Private::getResolvedSymbol(
+void SymbolResolver::Private::getResolvedType(
const Definition *scope, // in
const Definition *d, // in
const QCString &explicitScopePart, // in
QCString &bestResolvedType // out
)
{
- //fprintf(stderr,"getResolvedSymbol(%s,%s)\n",qPrint(scope->name()),qPrint(d->qualifiedName()));
+ //fprintf(stderr,"getResolvedType(%s,%s)\n",qPrint(scope->name()),qPrint(d->qualifiedName()));
// only look at classes and members that are enums or typedefs
if (d->definitionType()==Definition::TypeClass ||
(d->definitionType()==Definition::TypeMember &&
//printf(" bestMatch=%p bestResolvedType=%s\n",bestMatch,qPrint(bestResolvedType));
}
+
+void SymbolResolver::Private::getResolvedSymbol(
+ const Definition *scope, // in
+ const Definition *d, // in
+ const QCString &args, // in
+ bool checkCV, // in
+ const QCString &explicitScopePart, // in
+ const std::unique_ptr<ArgumentList> &actTemplParams, // in
+ int &minDistance, // inout
+ const Definition *&bestMatch, // out
+ const MemberDef *&bestTypedef, // out
+ QCString &bestTemplSpec, // out
+ QCString &bestResolvedType // out
+ )
+{
+ //fprintf(stderr,"getResolvedSymbol(%s,%s)\n",qPrint(scope->name()),qPrint(d->qualifiedName()));
+ // only look at classes and members that are enums or typedefs
+ VisitedNamespaces visitedNamespaces;
+ AccessStack accessStack;
+ // test accessibility of definition within scope.
+ int distance = isAccessibleFromWithExpScope(visitedNamespaces,accessStack,scope,d,explicitScopePart);
+ //fprintf(stderr," %s; distance %s (%p) is %d\n",qPrint(scope->name()),qPrint(d->name()),d,distance);
+ //printf("%s: distance=%d scope=%s explScope=%s\n",qPrint(d->name()),distance,qPrint(scope?scope->name():QCString()),qPrint(explicitScopePart));
+ if (distance!=-1) // definition is accessible
+ {
+ // see if we are dealing with a class or a typedef
+ if (d->definitionType()==Definition::TypeClass) // d is a class
+ {
+ const ClassDef *cd = toClassDef(d);
+ //printf("cd=%s\n",qPrint(cd->name()));
+ if (!cd->isTemplateArgument()) // skip classes that
+ // are only there to
+ // represent a template
+ // argument
+ {
+ //printf("is not a templ arg\n");
+ if (distance<minDistance) // found a definition that is "closer"
+ {
+ minDistance=distance;
+ bestMatch = d;
+ bestTypedef = 0;
+ bestTemplSpec.resize(0);
+ bestResolvedType = cd->qualifiedName();
+ }
+ else if (distance==minDistance &&
+ m_fileScope && bestMatch &&
+ !m_fileScope->getUsedNamespaces().empty() &&
+ d->getOuterScope()->definitionType()==Definition::TypeNamespace &&
+ bestMatch->getOuterScope()==Doxygen::globalScope
+ )
+ {
+ // in case the distance is equal it could be that a class X
+ // is defined in a namespace and in the global scope. When searched
+ // in the global scope the distance is 0 in both cases. We have
+ // to choose one of the definitions: we choose the one in the
+ // namespace if the fileScope imports namespaces and the definition
+ // found was in a namespace while the best match so far isn't.
+ // Just a non-perfect heuristic but it could help in some situations
+ // (kdecore code is an example).
+ minDistance=distance;
+ bestMatch = d;
+ bestTypedef = 0;
+ bestTemplSpec.resize(0);
+ bestResolvedType = cd->qualifiedName();
+ }
+ }
+ else
+ {
+ //printf(" is a template argument!\n");
+ }
+ }
+ else if (d->definitionType()==Definition::TypeMember)
+ {
+ const MemberDef *md = toMemberDef(d);
+
+ bool match = true;
+ //printf("@@ checking %s\n",qPrint(md->name()));
+ if (md->isFunction() && !args.isEmpty())
+ {
+ std::unique_ptr<ArgumentList> argList = stringToArgumentList(md->getLanguage(),args);
+ const ArgumentList &mdAl = md->argumentList();
+ match = matchArguments2(md->getOuterScope(),md->getFileDef(),&mdAl,
+ scope, md->getFileDef(),argList.get(),
+ checkCV,md->getLanguage());
+ //printf("@@ %s (%p): matching %s against %s -> %d\n",qPrint(md->name()),(void*)md,qPrint(args),qPrint(argListToString(mdAl)),match);
+ }
+
+ //fprintf(stderr," member isTypedef()=%d\n",md->isTypedef());
+ if (match && distance<minDistance)
+ {
+ minDistance=distance;
+ bestMatch = md;
+ bestTypedef = md;
+ bestTemplSpec = "";
+ bestResolvedType = md->qualifiedName();
+ }
+ }
+ else if ((d->definitionType()==Definition::TypeNamespace ||
+ d->definitionType()==Definition::TypeFile))
+ {
+ if (distance<minDistance) // found a definition that is "closer"
+ {
+ minDistance=distance;
+ bestMatch = d;
+ bestTypedef = 0;
+ bestTemplSpec.resize(0);
+ bestResolvedType.resize(0);
+ }
+ }
+ } // if definition accessible
+ else
+ {
+ //printf(" Not accessible!\n");
+ }
+ //printf("bestMatch=%s bestResolvedType=%s\n",qPrint(bestMatch?bestMatch->name():"<none>"),qPrint(bestResolvedType));
+}
+
+
const ClassDef *SymbolResolver::Private::newResolveTypedef(
const Definition *scope, // in
const MemberDef *md, // in
tl=type.length(); // length may have been changed
while (sp<tl && type.at(sp)==' ') sp++;
const MemberDef *memTypeDef = 0;
- const ClassDef *result = getResolvedClassRec(md->getOuterScope(),type,
+ const ClassDef *result = getResolvedTypeRec(md->getOuterScope(),type,
&memTypeDef,0,pResolvedType);
// if type is a typedef then return what it resolves to.
if (memTypeDef && memTypeDef->isTypedef())
if (si==-1 && i!=-1) // typedef of a template => try the unspecialized version
{
if (pTemplSpec) *pTemplSpec = type.mid(i);
- result = getResolvedClassRec(md->getOuterScope(),type.left(i),0,0,pResolvedType);
+ result = getResolvedTypeRec(md->getOuterScope(),type.left(i),0,0,pResolvedType);
//printf("result=%p pRresolvedType=%s sp=%d ip=%d tl=%d\n",
// result,pResolvedType?pResolvedType->data():"<none>",sp,ip,tl);
}
{
if (pTemplSpec) *pTemplSpec = type.mid(i);
}
- result = getResolvedClassRec(md->getOuterScope(),
+ result = getResolvedTypeRec(md->getOuterScope(),
stripTemplateSpecifiersFromScope(type.left(i),FALSE),0,0,pResolvedType);
}
done:
if (pResolvedType)
{
- if (result)
+ if (result && result->definitionType()==Definition::TypeClass)
{
*pResolvedType = result->qualifiedName();
//printf("*pResolvedType=%s\n",pResolvedType->data());
return result;
}
+#if 0
+static bool isParentScope(const Definition *parent,const Definition *item)
+{
+ if (parent==item || item==0 || item==Doxygen::globalScope) return false;
+ if (parent==0 || parent==Doxygen::globalScope) return true;
+ return isParentScope(parent->getOuterScope(),item);
+}
+#endif
+
int SymbolResolver::Private::isAccessibleFromWithExpScope(
VisitedNamespaces &visitedNamespaces,
AccessStack &accessStack,
accessStack.push(scope,m_fileScope,item,explicitScopePart);
- //printf(" <isAccessibleFromWithExpScope(%s,%s,%s)\n",scope?qPrint(scope->name()):"<global>",
- // item?qPrint(item->name()):"<none>",
+ //printf(" <isAccessibleFromWithExpScope(%s,%s,%s)\n",scope?qPrint(scope->name()):"<global>",
+ // item?qPrint(item->qualifiedName()):"<none>",
// qPrint(explicitScopePart));
int result=0; // assume we found it
const Definition *newScope = followPath(scope,explicitScopePart);
if (newScope) // explicitScope is inside scope => newScope is the result
{
Definition *itemScope = item->getOuterScope();
+
//printf(" scope traversal successful %s<->%s!\n",qPrint(itemScope->name()),qPrint(newScope->name()));
+
+ bool nestedClassInsideBaseClass =
+ itemScope &&
+ itemScope->definitionType()==Definition::TypeClass &&
+ newScope->definitionType()==Definition::TypeClass &&
+ (toClassDef(newScope))->isBaseClass(toClassDef(itemScope),TRUE);
+
+ bool enumValueWithinEnum =
+ item->definitionType()==Definition::TypeMember &&
+ toMemberDef(item)->isEnumValue() &&
+ toMemberDef(item)->getEnumScope()==newScope;
+
//if (newScope && newScope->definitionType()==Definition::TypeClass)
//{
// ClassDef *cd = (ClassDef *)newScope;
//}
if (itemScope==newScope) // exact match of scopes => distance==0
{
- //printf("> found it\n");
+ //printf(" > found it\n");
}
- else if (itemScope && newScope &&
- itemScope->definitionType()==Definition::TypeClass &&
- newScope->definitionType()==Definition::TypeClass &&
- (toClassDef(newScope))->isBaseClass(toClassDef(itemScope),TRUE,0)
- )
+ else if (nestedClassInsideBaseClass)
{
// inheritance is also ok. Example: looking for B::I, where
// class A { public: class I {} };
//printf("scope(%s) is base class of newScope(%s)\n",
// qPrint(scope->name()),qPrint(newScope->name()));
}
+ else if (enumValueWithinEnum)
+ {
+ result=1;
+ }
else
{
int i=-1;
}
}
}
+#if 0 // this caused problems resolving A::f() in the docs when there was a A::f(int) but also a
+ // global function f() that exactly matched the argument list.
+ else if (isParentScope(scope,newScope) && newScope->definitionType()==Definition::TypeClass)
+ {
+ // if we a look for a type B and have explicit scope A, then it is also fine if B
+ // is found at the global scope.
+ result = 1;
+ goto done;
+ }
+#endif
// repeat for the parent scope
if (scope!=Doxygen::globalScope)
{
}
else // failed to resolve explicitScope
{
- //printf(" failed to resolve: scope=%s\n",qPrint(scope->name()));
+ //printf(" failed to resolve explicitScope=%s: scope=%s\n",qPrint(explicitScopePart), qPrint(scope->name()));
if (scope->definitionType()==Definition::TypeNamespace)
{
const NamespaceDef *nscope = toNamespaceDef(scope);
StringUnorderedSet visited;
if (accessibleViaUsingNamespace(visited,nscope->getUsedNamespaces(),item,explicitScopePart))
{
- //printf("> found in used namespace\n");
+ //printf(" > found in used namespace\n");
goto done;
}
}
StringUnorderedSet visited;
if (accessibleViaUsingNamespace(visited,m_fileScope->getUsedNamespaces(),item,explicitScopePart))
{
- //printf("> found in used namespace\n");
+ //printf(" > found in used namespace\n");
goto done;
}
}
- //printf("> not found\n");
+ //printf(" > not found\n");
result=-1;
}
else // continue by looking into the parent scope
{
int i=isAccessibleFromWithExpScope(visitedNamespaces,accessStack,scope->getOuterScope(),item,explicitScopePart);
- //printf("> result=%d\n",i);
+ //printf(" > result=%d\n",i);
result= (i==-1) ? -1 : i+2;
}
}
done:
- //printf(" > result=%d\n",result);
+ //printf(" > result=%d\n",result);
accessStack.pop();
return result;
}
// try to resolve the part if it is a typedef
const MemberDef *memTypeDef=0;
QCString qualScopePart = substTypedef(current,path.mid(is,l),&memTypeDef);
- //printf(" qualScopePart=%s\n",qPrint(qualScopePart));
+ //printf(" qualScopePart=%s\n",qPrint(qualScopePart));
if (memTypeDef)
{
const ClassDef *type = newResolveTypedef(m_fileScope,memTypeDef,0,0,0);
// qPrint(qualScopePart),
// qPrint(current->name()),
// next?qPrint(next->name()):"<null>");
+ if (next==0)
+ {
+ next = current->findInnerCompound(qualScopePart+"-p");
+ }
+ if (current->definitionType()==Definition::TypeClass)
+ {
+ const MemberDef *classMember = toClassDef(current)->getMemberByName(qualScopePart);
+ if (classMember && classMember->isEnumerate())
+ {
+ next = classMember;
+ }
+ }
+ else if (current->definitionType()==Definition::TypeNamespace)
+ {
+ const MemberDef *namespaceMember = toNamespaceDef(current)->getMemberByName(qualScopePart);
+ if (namespaceMember && namespaceMember->isEnumerate())
+ {
+ next = namespaceMember;
+ }
+ }
+ else if (current==Doxygen::globalScope || current->definitionType()==Definition::TypeFile)
+ {
+ auto &range = Doxygen::symbolMap->find(qualScopePart);
+ for (Definition *def : range)
+ {
+ const Definition *outerScope = def->getOuterScope();
+ if (
+ (outerScope==Doxygen::globalScope || // global scope or
+ (outerScope && // anonymous namespace in the global scope
+ outerScope->name().startsWith("anonymous_namespace{") &&
+ outerScope->getOuterScope()==Doxygen::globalScope
+ )
+ ) &&
+ (def->definitionType()==Definition::TypeClass ||
+ def->definitionType()==Definition::TypeMember ||
+ def->definitionType()==Definition::TypeNamespace
+ )
+ )
+ {
+ next=def;
+ break;
+ }
+ }
+ }
if (next==0) // failed to follow the path
{
//printf("==> next==0!\n");
else // continue to follow scope
{
current = next;
- //printf("==> current = %p\n",current);
+ //printf("==> current = %p\n",(void*)current);
}
ps=is+l;
}
int result=0; // assume we found it
int i;
- Definition *itemScope=item->getOuterScope();
+ const Definition *itemScope=item->getOuterScope();
+ bool itemIsMember = item->definitionType()==Definition::TypeMember;
+ bool itemIsClass = item->definitionType()==Definition::TypeClass;
+
+ // if item is a global member and scope points to a specific file
+ // we adjust the scope so the file gets preference over members with the same name in
+ // other files.
+ if ((itemIsMember || itemIsClass) &&
+ (itemScope==Doxygen::globalScope || // global
+ (itemScope && itemScope->name().startsWith("anonymous_namespace{")) // member of an anonymous namespace
+ ) &&
+ scope->definitionType()==Definition::TypeFile)
+ {
+ if (itemIsMember)
+ {
+ itemScope = toMemberDef(item)->getFileDef();
+ }
+ else if (itemIsClass)
+ {
+ itemScope = toClassDef(item)->getFileDef();
+ }
+ //printf("adjust scope to %s\n",qPrint(itemScope?itemScope->name():QCString()));
+ }
+
bool memberAccessibleFromScope =
- (item->definitionType()==Definition::TypeMember && // a member
+ (itemIsMember && // a member
itemScope && itemScope->definitionType()==Definition::TypeClass && // of a class
scope->definitionType()==Definition::TypeClass && // accessible
(toClassDef(scope))->isAccessibleMember(toMemberDef(item)) // from scope
);
bool nestedClassInsideBaseClass =
- (item->definitionType()==Definition::TypeClass && // a nested class
+ (itemIsClass && // a nested class
itemScope && itemScope->definitionType()==Definition::TypeClass && // inside a base
scope->definitionType()==Definition::TypeClass && // class of scope
(toClassDef(scope))->isBaseClass(toClassDef(itemScope),TRUE)
);
+ bool enumValueOfStrongEnum =
+ (itemIsMember &&
+ toMemberDef(item)->isStrongEnumValue() &&
+ scope->definitionType()==Definition::TypeMember &&
+ toMemberDef(scope)->isEnumerate() &&
+ scope==toMemberDef(item)->getEnumScope()
+ );
- if (itemScope==scope || memberAccessibleFromScope || nestedClassInsideBaseClass)
+ if (itemScope==scope || memberAccessibleFromScope || nestedClassInsideBaseClass || enumValueOfStrongEnum)
{
- //printf("> found it\n");
- if (nestedClassInsideBaseClass) result++; // penalty for base class to prevent
+ //printf("> found it memberAccessibleFromScope=%d nestedClassInsideBaseClass=%d enumValueOfStrongEnum=%d\n",memberAccessibleFromScope,nestedClassInsideBaseClass,enumValueOfStrongEnum);
+ int distanceToBase=0;
+ if (nestedClassInsideBaseClass)
+ {
+ result++; // penalty for base class to prevent
// this is preferred over nested class in this class
// see bug 686956
+ }
+ else if (memberAccessibleFromScope &&
+ itemScope &&
+ itemScope->definitionType()==Definition::TypeClass &&
+ scope->definitionType()==Definition::TypeClass &&
+ (distanceToBase=toClassDef(scope)->isBaseClass(toClassDef(itemScope),TRUE))>0
+ )
+ {
+ result+=distanceToBase; // penalty if member is accessible via a base class
+ }
}
else if (scope==Doxygen::globalScope)
{
+ if (itemScope &&
+ itemScope->definitionType()==Definition::TypeNamespace &&
+ toNamespaceDef(itemScope)->isAnonymous() &&
+ itemScope->getOuterScope()==Doxygen::globalScope)
+ { // item is in an anonymous namespace in the global scope and we are
+ // looking in the global scope
+ //printf("> found in anonymous namespace\n");
+ result++;
+ goto done;
+ }
if (m_fileScope)
{
if (accessibleViaUsingClass(m_fileScope->getUsedClasses(),item))
}
}
// repeat for the parent scope
- i=isAccessibleFrom(accessStack,scope->getOuterScope(),item);
+ const Definition *parentScope = scope->getOuterScope();
+ if (parentScope==Doxygen::globalScope)
+ {
+ if (scope->definitionType()==Definition::TypeClass)
+ {
+ const FileDef *fd = toClassDef(scope)->getFileDef();
+ if (fd)
+ {
+ parentScope = fd;
+ }
+ }
+ }
+ i=isAccessibleFrom(accessStack,parentScope,item);
//printf("> result=%d\n",i);
result= (i==-1) ? -1 : i+2;
}
QCString result=name;
if (name.isEmpty()) return result;
- auto range = Doxygen::symbolMap->find(name);
- if (range.first==range.second)
+ auto &range = Doxygen::symbolMap->find(name);
+ if (range.empty())
return result; // no matches
MemberDef *bestMatch=0;
int minDistance=10000; // init at "infinite"
- for (auto it = range.first; it!=range.second; ++it)
+ for (Definition *d : range)
{
- Definition *d = it->second;
// only look at members
if (d->definitionType()==Definition::TypeMember)
{
// qPrint(name),
// mayBeUnlinkable
// );
- const ClassDef *result;
+ const ClassDef *result=0;
if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
{
result = getClass(name);
}
else
{
- result = p->getResolvedClassRec(scope,name,&p->typeDef,&p->templateSpec,&p->resolvedType);
+ result = p->getResolvedTypeRec(scope,name,&p->typeDef,&p->templateSpec,&p->resolvedType);
if (result==0) // for nested classes imported via tag files, the scope may not
// present, so we check the class name directly as well.
// See also bug701314
return result;
}
+const Definition *SymbolResolver::resolveSymbol(const Definition *scope,
+ const QCString &name,
+ const QCString &args,
+ bool checkCV)
+{
+ p->reset();
+ if (scope==0) scope=Doxygen::globalScope;
+ const Definition *result = p->getResolvedSymbolRec(scope,name,args,checkCV,&p->typeDef,&p->templateSpec,&p->resolvedType);
+ //printf("resolveSymbol(%s,%s,%s,%d)=%s\n",qPrint(scope?scope->name():QCString()),qPrint(name),qPrint(args),checkCV,qPrint(result?result->qualifiedName():QCString()));
+ return result;
+}
+
int SymbolResolver::isAccessibleFrom(const Definition *scope,const Definition *item)
{
p->reset();
return toClassDefMutable(resolveClass(scope,name,mayBeUnlinkable,mayBeHidden));
}
+ /** Find the symbool definition matching name within the scope set.
+ * @param scope The scope to search from.
+ * @param name The name of the symbol.
+ * @param args Argument list associated with the symbol (for functions)
+ * @param checkCV Check const/volatile qualifiers (for methods)
+ */
+ const Definition *resolveSymbol(const Definition *scope,
+ const QCString &name,
+ const QCString &args=QCString(),
+ bool checkCV=false);
+
/** Checks if symbol \a item is accessible from within \a scope.
* @returns -1 if \a item is not accessible or a number indicating how
* many scope levels up the nearest match was found.
case InMember:
case InPackage:
case InDir:
- if (m_curString.right(10)=="autotoc_md") return;
+ if (m_curString.endsWith("autotoc_md")) return;
break;
default:
warn("Unexpected tag 'docanchor' found");
public:
static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &)
{
- if (v.isValid() && v.isString() && v.toString().left(2)=="..")
+ if (v.isValid() && v.isString() && v.toString().startsWith(".."))
{
return TRUE;
}
auto tok = parser->takeNextToken();
// elif 'nodes'
- while (tok && tok->data.left(5)=="elif ")
+ while (tok && tok->data.startsWith("elif "))
{
m_ifGuardedNodes.push_back(std::make_unique<GuardedNodes>());
auto &guardedNodes = m_ifGuardedNodes.back();
void operator()(const DocHtmlCaption &c) { visitChildren(c); }
void operator()(const DocInternal &i) { visitChildren(i); }
void operator()(const DocHRef &h) { visitChildren(h); }
+ void operator()(const DocHtmlDetails &d) { visitChildren(d); }
void operator()(const DocHtmlHeader &h) { visitChildren(h); }
void operator()(const DocImage &i) { visitChildren(i); }
void operator()(const DocDotFile &df) { visitChildren(df); }
virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
int hour,int minutes,int seconds,
bool includeTime) = 0;
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full) = 0;
+ virtual QCString trMonth(int month, bool first_capital, bool full) = 0;
+ virtual QCString trDayPeriod(int period) = 0;
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
int hour,int minutes,int seconds,
bool includeTime)
{ return english.trDateTime(year,month,day,dayOfWeek,hour,minutes,seconds,includeTime); }
+ virtual QCString trDayPeriod(int period)
+ { return english.trDayPeriod(period); }
+
};
/** Adapter class for languages that only contain translations up to
-/******************************************************************************\r
- *\r
- *\r
- *\r
- * Copyright (C) 1997-2015 by Dimitri van Heesch.\r
- *\r
- * Permission to use, copy, modify, and distribute this software and its\r
- * documentation under the terms of the GNU General Public License is hereby\r
- * granted. No representations are made about the suitability of this software\r
- * for any purpose. It is provided "as is" without express or implied warranty.\r
- * See the GNU General Public License for more details.\r
- *\r
- * Documents produced by Doxygen are derivative works derived from the\r
- * input used in their production; they are not affected by this license.\r
- */\r
-\r
-/*\r
- * Translation by\r
- * Armen Tangamyan <armen.tangamyan@anu.edu.au>\r
- */\r
-\r
-#ifndef TRANSLATOR_AM_H\r
-#define TRANSLATOR_AM_H\r
-\r
-class TranslatorArmenian : public TranslatorAdapter_1_8_0\r
-{\r
- public:\r
- /*! Used for identification of the language. */\r
- virtual QCString idLanguage()\r
- { return "armenian"; }\r
-\r
- /* Used to get the command(s) for the language support. */\r
- virtual QCString latexLanguageSupportCommand()\r
- {\r
- return "\\usepackage[latin]{armtex}\n"\r
- "\\usepackage[armscii8]{inputenc}\n";\r
- }\r
- virtual QCString trISOLang()\r
- { return "hy"; }\r
- virtual QCString getLanguageString()\r
- {\r
- return "0x42b Armenian";\r
- }\r
-\r
- // --- Language translation methods -------------------\r
-\r
- /*! used in the compound documentation before a list of related functions. */\r
- virtual QCString trRelatedFunctions()\r
- { return "Դասին վերաբերվող ֆունկցիաներ"; }\r
-\r
- /*! subscript for the related functions. */\r
- virtual QCString trRelatedSubscript()\r
- { return "(Հաշվի առեք, որ սրանք անդամ ֆունկցիաներ չեն)"; }\r
-\r
- /*! header that is put before the detailed description of files, classes and namespaces. */\r
- virtual QCString trDetailedDescription()\r
- { return "Մանրամասն նկարագրություն"; }\r
-\r
- /*! header that is put before the list of typedefs. */\r
- virtual QCString trMemberTypedefDocumentation()\r
- { return "Անդամ տիպի սահմանումներ (typedef)"; }\r
-\r
- /*! header that is put before the list of enumerations. */\r
- virtual QCString trMemberEnumerationDocumentation()\r
- { return "Անդամ hամարակալումներ"; }\r
-\r
- /*! header that is put before the list of member functions. */\r
- virtual QCString trMemberFunctionDocumentation()\r
- { return "Անդամ ֆունկցիաներ"; }\r
-\r
- /*! header that is put before the list of member attributes. */\r
- virtual QCString trMemberDataDocumentation()\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- return "Դաշտեր";\r
- }\r
- else\r
- {\r
- return "Անդամ տվյալներ";\r
- }\r
- }\r
-\r
- /*! this is the text of a link put after brief descriptions. */\r
- virtual QCString trMore()\r
- { return "Մանրամասն..."; }\r
-\r
- /*! put in the class documentation */\r
- /* Isn't used when optimization for C is on. */\r
- virtual QCString trListOfAllMembers()\r
- {\r
- return "Բոլոր անդամների ցուցակը";\r
- }\r
-\r
- /*! used as the title of the "list of all members" page of a class */\r
- /* Isn't used when optimization for C is on. */\r
- virtual QCString trMemberList()\r
- {\r
- return "Անդամների ցուցակ";\r
- }\r
-\r
- /*! this is the first part of a sentence that is followed by a class name */\r
- /* Isn't used when optimization for C is on. */\r
- virtual QCString trThisIsTheListOfAllMembers()\r
- { return "Սա դասի անդամների ամբողջական ցուցակն է "; }\r
-\r
- /*! this is the remainder of the sentence after the class name */\r
- /* Isn't used when optimization for C is on. */\r
- virtual QCString trIncludingInheritedMembers()\r
- { return ", ներառյալ բոլոր ժառանգված անդամները"; }\r
-\r
- /*! this is put at the author sections at the bottom of man pages.\r
- * parameter s is name of the project name.\r
- */\r
- virtual QCString trGeneratedAutomatically(const QCString &s)\r
- { QCString result="Ավտոմատ ստեղծված է ելքային կոդից, Doxygen-ի միջոցով, ";\r
- if (!s.isEmpty()) result+=s+" համար:";\r
- return result;\r
- }\r
-\r
- /*! put after an enum name in the list of all members */\r
- virtual QCString trEnumName()\r
- { return "համարակալման անուն"; }\r
-\r
- /*! put after an enum value in the list of all members */\r
- virtual QCString trEnumValue()\r
- { return "համարակալման արժեք"; }\r
-\r
- /*! put after an undocumented member in the list of all members */\r
- virtual QCString trDefinedIn()\r
- { return "սահմանված"; }\r
-\r
- // quick reference sections\r
-\r
- /*! This is put above each page as a link to the list of all groups of\r
- * compounds or files (see the \\group command).\r
- */\r
- virtual QCString trModules()\r
- { return "Մոդուլներ"; }\r
-\r
- /*! This is put above each page as a link to the class hierarchy */\r
- virtual QCString trClassHierarchy()\r
- { return "Դասերի հիերարխա"; }\r
-\r
- /*! This is put above each page as a link to the list of annotated classes */\r
- virtual QCString trCompoundList()\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- return "Տվյալների կառուցվածք";\r
- }\r
- else\r
- {\r
- return "Դասերի ցուցակ";\r
- }\r
- }\r
-\r
- /*! This is put above each page as a link to the list of documented files */\r
- virtual QCString trFileList()\r
- { return "Ֆայլերի ցուցակ"; }\r
-\r
- /*! This is put above each page as a link to all members of compounds. */\r
- virtual QCString trCompoundMembers()\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- return "Տվյալների դաշտեր";\r
- }\r
- else\r
- {\r
- return "Դասի անդամներ";\r
- }\r
- }\r
-\r
- /*! This is put above each page as a link to all members of files. */\r
- /*??*/\r
- virtual QCString trFileMembers()\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- return "Գլոբալներ";\r
- }\r
- else\r
- {\r
- return "Ֆայլի անդամներ";\r
- }\r
- }\r
-\r
- /*! This is put above each page as a link to all related pages. */\r
- virtual QCString trRelatedPages()\r
- { return "Նմանատիպ էջեր"; }\r
-\r
- /*! This is put above each page as a link to all examples. */\r
- virtual QCString trExamples()\r
- { return "Օրինակներ"; }\r
-\r
- /*! This is put above each page as a link to the search engine. */\r
- virtual QCString trSearch()\r
- { return "Որոնում"; }\r
-\r
- /*! This is an introduction to the class hierarchy. */\r
- virtual QCString trClassHierarchyDescription()\r
- { return "Այս ժառանգման ցուցակը կոպտորեն է տեսակավորված, "\r
- "բայց ոչ ամբողջապես, այբբենական կարգով.";\r
- }\r
-\r
- /*! This is an introduction to the list with all files. */\r
- virtual QCString trFileListDescription(bool extractAll)\r
- {\r
- QCString result="Բոլոր ";\r
- if (!extractAll) result+="փաստագրված ";\r
- result+="ֆայլերի մի ցուցակ` կարճ բացատրություններով:";\r
- return result;\r
- }\r
-\r
- /*! This is an introduction to the annotated compound list. */\r
- virtual QCString trCompoundListDescription()\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- return "Տվյալների կառուցվածքը` կարճ բացատրություններով.";\r
- }\r
- else\r
- {\r
- return "Դասերը, կառուցվածքները, միավորումները "\r
- "և ինտերֆեյսները` կարճ բացատրություններով.";\r
- }\r
- }\r
-\r
- /*! This is an introduction to the page with all class members. */\r
- virtual QCString trCompoundMembersDescription(bool extractAll)\r
- {\r
- QCString result="Բոլոր ";\r
- if(!extractAll) result+="փաստագրված ";\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- result+="կառուցվածքների և միավորումների դաշտերի ";\r
- else\r
- result+="դասի անդամների ";\r
- result+="ցուցակը`";\r
- result+=" հղումներով դեպի ";\r
- if(!extractAll)\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- result+="կառուցվածք/միավորում փաստագրությունները բոլոր անդամների համար.";\r
- else\r
- result+="դասի փաստագրությունը բոլոր անդամների համար.";\r
- }\r
- else\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- result += "կառուցվածքները/միավորումները, որոնց նրանք պատկանում են.";\r
- else\r
- result += "դասերը, որոնց նրանք պատկանում են.";\r
- }\r
- return result;\r
- }\r
-\r
- /*! This is an introduction to the page with all file members. */\r
- virtual QCString trFileMembersDescription(bool extractAll)\r
- {\r
- QCString result="Բոլոր ";\r
- if (!extractAll) result+="փաստագրված ";\r
-\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- result+="ֆունկցիաների, փոփոխականների, մակրո-հայտարարությունների, "\r
- "համարակալումների և տիպի սահմանումների (typedef)";\r
- }\r
- else\r
- {\r
- result+="ֆայլի անդամների ";\r
- }\r
- result+="ցուցակը`";\r
- result+=" հղումներով դեպի ";\r
- if (extractAll)\r
- result+="ֆայլերը, որոնց նրանք պատկանում են.";\r
- else\r
- result+="փաստագրությունը.";\r
- return result;\r
- }\r
-\r
- /*! This is an introduction to the page with the list of all examples */\r
- virtual QCString trExamplesDescription()\r
- { return "Բոլոր օրինակների ցուցակը."; }\r
-\r
- /*! This is an introduction to the page with the list of related pages */\r
- virtual QCString trRelatedPagesDescription()\r
- { return "Բոլոր նմանատիպ փաստագրության էջերի ցուցակը."; }\r
-\r
- /*! This is an introduction to the page with the list of class/file groups */\r
- virtual QCString trModulesDescription()\r
- { return "Բոլոր մոդուլների ցուցակը."; }\r
-\r
- // index titles (the project name is prepended for these)\r
-\r
-\r
- /*! This is used in HTML as the title of index.html. */\r
- virtual QCString trDocumentation()\r
- { return " - Փաստագրություն"; }\r
-\r
- /*! This is used in LaTeX as the title of the chapter with the\r
- * index of all groups.\r
- */\r
- virtual QCString trModuleIndex()\r
- { return "Մոդուլներ"; }\r
-\r
- /*! This is used in LaTeX as the title of the chapter with the\r
- * class hierarchy.\r
- */\r
- virtual QCString trHierarchicalIndex()\r
- { return "Դասակարգումներ"; }\r
-\r
- /*! This is used in LaTeX as the title of the chapter with the\r
- * annotated compound index.\r
- */\r
- virtual QCString trCompoundIndex()\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- return "Տվյալների կառուցվածք";\r
- }\r
- else\r
- {\r
- return "Դասեր";\r
- }\r
- }\r
-\r
- /*! This is used in LaTeX as the title of the chapter with the\r
- * list of all files.\r
- */\r
- virtual QCString trFileIndex()\r
- { return "Ֆայլեր"; }\r
-\r
- /*! This is used in LaTeX as the title of the chapter containing\r
- * the documentation of all groups.\r
- */\r
- virtual QCString trModuleDocumentation()\r
- { return "Մոդուլներ"; }\r
-\r
- /*! This is used in LaTeX as the title of the chapter containing\r
- * the documentation of all classes, structs and unions.\r
- */\r
- virtual QCString trClassDocumentation()\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- return "Տվյալների կառուցվածքներ";\r
- }\r
- else if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))\r
- {\r
- return trDesignUnitDocumentation();\r
- }\r
- else\r
- {\r
- return "Դասեր";\r
- }\r
- }\r
-\r
- /*! This is used in LaTeX as the title of the chapter containing\r
- * the documentation of all files.\r
- */\r
- virtual QCString trFileDocumentation()\r
- { return "Ֆայլեր"; }\r
-\r
- /*! This is used in LaTeX as the title of the chapter containing\r
- * the documentation of all examples.\r
- */\r
- virtual QCString trExampleDocumentation()\r
- { return "Օրինակներ"; }\r
-\r
- /*! This is used in LaTeX as the title of the document */\r
- virtual QCString trReferenceManual()\r
- { return "Հղումների ձեռնարկ"; }\r
-\r
- /*! This is used in the documentation of a file as a header before the\r
- * list of defines\r
- */\r
- virtual QCString trDefines()\r
- { return "Մակրոսներ"; }\r
-\r
- /*! This is used in the documentation of a file as a header before the\r
- * list of typedefs\r
- */\r
- virtual QCString trTypedefs()\r
- { return "Տիպի սահմանումներ (typedef)"; }\r
-\r
- /*! This is used in the documentation of a file as a header before the\r
- * list of enumerations\r
- */\r
- virtual QCString trEnumerations()\r
- { return "Համարակալումներ"; }\r
-\r
- /*! This is used in the documentation of a file as a header before the\r
- * list of (global) functions\r
- */\r
- virtual QCString trFunctions()\r
- { return "Ֆունկցիաներ"; }\r
-\r
- /*! This is used in the documentation of a file as a header before the\r
- * list of (global) variables\r
- */\r
- virtual QCString trVariables()\r
- { return "Փոփոխականներ"; }\r
-\r
- /*! This is used in the documentation of a file as a header before the\r
- * list of (global) variables\r
- */\r
- virtual QCString trEnumerationValues()\r
- { return "Հաշվիչ"; }\r
-\r
- /*! This is used in the documentation of a file before the list of\r
- * documentation blocks for defines\r
- */\r
- virtual QCString trDefineDocumentation()\r
- { return "Մակրոսներ"; }\r
-\r
- /*! This is used in the documentation of a file/namespace before the list\r
- * of documentation blocks for typedefs\r
- */\r
- virtual QCString trTypedefDocumentation()\r
- { return "Տիպի սահմանումներ (typedef)"; }\r
-\r
- /*! This is used in the documentation of a file/namespace before the list\r
- * of documentation blocks for enumeration types\r
- */\r
- virtual QCString trEnumerationTypeDocumentation()\r
- { return "Համարակալման տիպեր"; }\r
-\r
- /*! This is used in the documentation of a file/namespace before the list\r
- * of documentation blocks for functions\r
- */\r
- virtual QCString trFunctionDocumentation()\r
- { return "Ֆունկցիաներ"; }\r
-\r
- /*! This is used in the documentation of a file/namespace before the list\r
- * of documentation blocks for variables\r
- */\r
- virtual QCString trVariableDocumentation()\r
- { return "Փոփոխականներ"; }\r
-\r
- /*! This is used in the documentation of a file/namespace/group before\r
- * the list of links to documented compounds\r
- */\r
- virtual QCString trCompounds()\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- return "Տվյալների կառուցվածք";\r
- }\r
- else\r
- {\r
- return "Դասեր";\r
- }\r
- }\r
-\r
- /*! This is used in the documentation of a group before the list of\r
- * links to documented files\r
- */\r
- /*! This is used in the standard footer of each page and indicates when\r
- * the page was generated\r
- */\r
- virtual QCString trGeneratedAt(const QCString &date,const QCString &projName)\r
- {\r
- QCString result=QCString("Ստեղծվել է ")+date;\r
- if (!projName.isEmpty()) result+=projName+" -ի համար,";\r
- result+=" հետևյալ համակարգով.";\r
- return result;\r
- }\r
-\r
- /*! this text is put before a class diagram */\r
- virtual QCString trClassDiagram(const QCString &clName)\r
- {\r
- return clName+QCString(" -ի ժառանգման գծագիրը.");\r
- }\r
-\r
- /*! this text is generated when the \\warning command is used. */\r
- virtual QCString trWarning()\r
- { return "Զգուշացում"; }\r
-\r
- /*! this text is generated when the \\version command is used. */\r
- virtual QCString trVersion()\r
- { return "Տարբերակ"; }\r
-\r
- /*! this text is generated when the \\date command is used. */\r
- virtual QCString trDate()\r
- { return "Տարեթիվ"; }\r
-\r
- /*! this text is generated when the \\return command is used. */\r
- virtual QCString trReturns()\r
- { return "Վերադարձնում է"; }\r
-\r
- /*! this text is generated when the \\sa command is used. */\r
- virtual QCString trSeeAlso()\r
- { return "Տեսեք նաև"; }\r
-\r
- /*! this text is generated when the \\param command is used. */\r
- virtual QCString trParameters()\r
- { return "Պարամետրեր"; }\r
-\r
- /*! this text is generated when the \\exception command is used. */\r
- virtual QCString trExceptions()\r
- { return "Բացառություններ"; }\r
-\r
- /*! this text is used in the title page of a LaTeX document. */\r
- virtual QCString trGeneratedBy()\r
- { return "Ստեղծված է հետևյալ համակարգի կողմից"; }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 0.49-990307\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! used as the title of page containing all the index of all namespaces. */\r
- virtual QCString trNamespaceList()\r
- { return "Անունների տարածությունների ցուցակ"; }\r
-\r
- /*! used as an introduction to the namespace list */\r
- virtual QCString trNamespaceListDescription(bool extractAll)\r
- {\r
- QCString result="Բոլոր ";\r
- if (!extractAll) result+="փաստագրված ";\r
- result+="անունների տարածությունների ցուցակը` կարճ բացատրություններով.";\r
- return result;\r
- }\r
-\r
- /*! used in the class documentation as a header before the list of all\r
- * friends of a class\r
- */\r
- virtual QCString trFriends()\r
- { return "Ընկերներ"; }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 0.49-990405\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! used in the class documentation as a header before the list of all\r
- * related classes\r
- */\r
- virtual QCString trRelatedFunctionDocumentation()\r
- { return "Դասի ընկերներ և կապված ֆունկցիաներ"; }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 0.49-990425\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! used as the title of the HTML page of a class/struct/union */\r
- virtual QCString trCompoundReference(const QCString &clName,\r
- ClassDef::CompoundType compType,\r
- bool isTemplate)\r
- {\r
- QCString result=clName;\r
- if (isTemplate)\r
- {\r
- switch(compType)\r
- {\r
- case ClassDef::Class: result+=" Դասի"; break;\r
- case ClassDef::Struct: result+=" Կառուցվածքի"; break;\r
- case ClassDef::Union: result+=" Միավորման"; break;\r
- case ClassDef::Interface: result+=" Ինտերֆեյսի"; break;\r
- case ClassDef::Protocol: result+=" Արձանագրության"; break;\r
- case ClassDef::Category: result+=" Դասակարգման"; break;\r
- case ClassDef::Exception: result+=" Բացառության"; break;\r
- default: break;\r
- }\r
- result+=" Ձևանմուշներ";\r
- }\r
- else\r
- {\r
- switch(compType)\r
- {\r
- case ClassDef::Class: result+=" Դաս"; break;\r
- case ClassDef::Struct: result+=" Կառուցվածք"; break;\r
- case ClassDef::Union: result+=" Միավորում"; break;\r
- case ClassDef::Interface: result+=" Ինտերֆեյս"; break;\r
- case ClassDef::Protocol: result+=" Արձանագրություն"; break;\r
- case ClassDef::Category: result+=" Դասակարգում"; break;\r
- case ClassDef::Exception: result+=" Բացառություն"; break;\r
- default: break;\r
- }\r
- }\r
- return result;\r
- }\r
-\r
- /*! used as the title of the HTML page of a file */\r
- virtual QCString trFileReference(const QCString &fileName)\r
- {\r
- return fileName+QCString(" ֆայլեր");\r
- }\r
-\r
- /*! used as the title of the HTML page of a namespace */\r
- virtual QCString trNamespaceReference(const QCString &namespaceName)\r
- {\r
- QCString result=namespaceName;\r
- result+=" անունների տարածություններ";\r
- return result;\r
- }\r
-\r
- virtual QCString trPublicMembers()\r
- { return "Բաց անդամ ֆունկցիաներ"; }\r
- virtual QCString trPublicSlots()\r
- { return "Բաց սլոթեր"; }\r
- virtual QCString trSignals()\r
- { return "Ազդանշաններ"; }\r
- virtual QCString trStaticPublicMembers()\r
- { return "Բաց ստատիկ անդամ ֆունկցիաներ"; }\r
- virtual QCString trProtectedMembers()\r
- { return "Պաշտպանված անդամ ֆունկցիաներ"; }\r
- virtual QCString trProtectedSlots()\r
- { return "Պաշտպանված սլոթեր"; }\r
- virtual QCString trStaticProtectedMembers()\r
- { return "Պաշտպանված ստատիկ անդամ ֆունկցիաներ"; }\r
- virtual QCString trPrivateMembers()\r
- { return "Փակ ֆունկցիաներ"; }\r
- virtual QCString trPrivateSlots()\r
- { return "Փակ սլոթեր"; }\r
- virtual QCString trStaticPrivateMembers()\r
- { return "Փակ ստատիկ անդամ ֆունկցիաներ"; }\r
-\r
- /*! this function is used to produce a comma-separated list of items.\r
- * use generateMarker(i) to indicate where item i should be put.\r
- */\r
- virtual QCString trWriteList(int numEntries)\r
- {\r
- QCString result;\r
- int i;\r
- // the inherits list contain `numEntries' classes\r
- for (i=0;i<numEntries;i++)\r
- {\r
- // use generateMarker to generate placeholders for the class links!\r
- result+=generateMarker(i); // generate marker for entry i in the list\r
- // (order is left to right)\r
-\r
- if (i!=numEntries-1) // not the last entry, so we need a separator\r
- {\r
- if (i<numEntries-2) // not the fore last entry\r
- result+=", ";\r
- else // the fore last entry\r
- result+=" և ";\r
- }\r
- }\r
- return result;\r
- }\r
-\r
- /*! used in class documentation to produce a list of base classes,\r
- * if class diagrams are disabled.\r
- */\r
- virtual QCString trInheritsList(int numEntries)\r
- {\r
- return "Հենքային դասեր - "+trWriteList(numEntries)+":";\r
- }\r
-\r
- /*! used in class documentation to produce a list of super classes,\r
- * if class diagrams are disabled.\r
- */\r
- virtual QCString trInheritedByList(int numEntries)\r
- {\r
- return "Ժառանգորդ դասեր - "+trWriteList(numEntries)+":";\r
- }\r
-\r
- /*! used in member documentation blocks to produce a list of\r
- * members that are hidden by this one.\r
- */\r
- virtual QCString trReimplementedFromList(int numEntries)\r
- {\r
- return "Վերասահմանված ֆունկցիաներ - "+trWriteList(numEntries)+":";\r
- }\r
-\r
- /*! used in member documentation blocks to produce a list of\r
- * all member that overwrite the implementation of this member.\r
- */\r
- virtual QCString trReimplementedInList(int numEntries)\r
- {\r
- return "Վերասահմանված է "+trWriteList(numEntries)+" ում:";\r
- }\r
-\r
- /*! This is put above each page as a link to all members of namespaces. */\r
- virtual QCString trNamespaceMembers()\r
- { return "Անունների տարածության անդամներ"; }\r
-\r
- /*! This is an introduction to the page with all namespace members */\r
- virtual QCString trNamespaceMemberDescription(bool extractAll)\r
- {\r
- QCString result="Բոլոր ";\r
- if (!extractAll) result+="փաստագրված ";\r
- result+="անունների տարածության անդամների ցուցակը` "\r
- "հղումներով դեպի ";\r
- if (extractAll)\r
- result+="բոլոր անդամների անունների տարածության փաստագրությունը.";\r
- else\r
- result+="անունների տարածությունը, որին նրանք պատկանում են.";\r
- return result;\r
- }\r
-\r
- /*! This is used in LaTeX as the title of the chapter with the\r
- * index of all namespaces.\r
- */\r
- virtual QCString trNamespaceIndex()\r
- { return "Անունների տարածություններ"; }\r
-\r
- /*! This is used in LaTeX as the title of the chapter containing\r
- * the documentation of all namespaces.\r
- */\r
- virtual QCString trNamespaceDocumentation()\r
- { return "Անունների տարածություն"; }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 0.49-990522\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! This is used in the documentation before the list of all\r
- * namespaces in a file.\r
- */\r
- virtual QCString trNamespaces()\r
- { return "Անունների տարածություններ"; }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 0.49-990728\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! This is put at the bottom of a class documentation page and is\r
- * followed by a list of files that were used to generate the page.\r
- */\r
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,\r
- bool single)\r
- {\r
- QCString result = "Այս ";\r
- switch(compType)\r
- {\r
- case ClassDef::Class: result+="դասի"; break;\r
- case ClassDef::Struct: result+="կառուցվածքի"; break;\r
- case ClassDef::Union: result+="միավորման"; break;\r
- case ClassDef::Interface: result+="ինտերֆեյսի"; break;\r
- case ClassDef::Protocol: result+="արձանագրության"; break;\r
- case ClassDef::Category: result+="դասակարգման"; break;\r
- case ClassDef::Exception: result+="բացառության"; break;\r
- default: break;\r
- }\r
- result+=" փաստագրությունը ստեղծվել է հետևյալ ֆայլ";\r
- if (single) result+="ից."; else result+="երից.";\r
- return result;\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 0.49-990901\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! This is used as the heading text for the retval command. */\r
- virtual QCString trReturnValues()\r
- { return "Վերադարձվող արժեքներ"; }\r
-\r
- /*! This is in the (quick) index as a link to the main page (index.html)\r
- */\r
- virtual QCString trMainPage()\r
- { return "Գլխավոր էջ"; }\r
-\r
- /*! This is used in references to page that are put in the LaTeX\r
- * documentation. It should be an abbreviation of the word page.\r
- */\r
- virtual QCString trPageAbbreviation()\r
- { return "էջ:"; }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 0.49-991106\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- virtual QCString trDefinedAtLineInSourceFile()\r
- {\r
- return "Սահմանումը @1 ֆայլի @0 տողում է:";\r
- }\r
- virtual QCString trDefinedInSourceFile()\r
- {\r
- return "Սահմանումը @0 ֆայլում է:";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 0.49-991205\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- virtual QCString trDeprecated()\r
- {\r
- return "Հնացած է";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.0.0\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! this text is put before a collaboration diagram */\r
- virtual QCString trCollaborationDiagram(const QCString &clName)\r
- {\r
- return clName+"-ի համագործակցությունների գծագիր.";\r
- }\r
- /*! this text is put before an include dependency graph */\r
- virtual QCString trInclDepGraph(const QCString &fName)\r
- {\r
- return fName+"-ի ներառումների կախվածությունների գծագիր.";\r
- }\r
- /*! header that is put before the list of constructor/destructors. */\r
- virtual QCString trConstructorDocumentation()\r
- {\r
- return "Կառուցիչներ";\r
- }\r
- /*! Used in the file documentation to point to the corresponding sources. */\r
- virtual QCString trGotoSourceCode()\r
- {\r
- return "Տե'ս այս ֆայլի ելքային կոդը";\r
- }\r
- /*! Used in the file sources to point to the corresponding documentation. */\r
- virtual QCString trGotoDocumentation()\r
- {\r
- return "Տե'ս այս ֆայլի փաստագրությունը:";\r
- }\r
- /*! Text for the \\pre command */\r
- virtual QCString trPrecondition()\r
- {\r
- return "Նախապայման";\r
- }\r
- /*! Text for the \\post command */\r
- virtual QCString trPostcondition()\r
- {\r
- return "Հետպայման";\r
- }\r
- /*! Text for the \\invariant command */\r
- virtual QCString trInvariant()\r
- {\r
- return "Անփոփոխ";\r
- }\r
- /*! Text shown before a multi-line variable/enum initialization */\r
- virtual QCString trInitialValue()\r
- {\r
- return "Նախնական արժեք";\r
- }\r
- /*! Text used the source code in the file index */\r
- virtual QCString trCode()\r
- {\r
- return "Ելքային կոդ";\r
- }\r
- virtual QCString trGraphicalHierarchy()\r
- {\r
- return "Գրաֆիկական դասերի հիերարխիա:";\r
- }\r
- virtual QCString trGotoGraphicalHierarchy()\r
- {\r
- return "Տե'ս դասերի գրաֆիկական հիերարխիան:";\r
- }\r
- virtual QCString trGotoTextualHierarchy()\r
- {\r
- return "Տե'ս դասերի տեքստային հիերարխիան:";\r
- }\r
- virtual QCString trPageIndex()\r
- {\r
- return "էջեր";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.1.0\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- virtual QCString trNote()\r
- {\r
- return "Նշում";\r
- }\r
- virtual QCString trPublicTypes()\r
- {\r
- return "Բաց տիպեր";\r
- }\r
- virtual QCString trPublicAttribs()\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- return "Տվյալների դաշտեր";\r
- }\r
- else\r
- {\r
- return "Բաց ատրիբուտներ";\r
- }\r
- }\r
- virtual QCString trStaticPublicAttribs()\r
- {\r
- return "Բաց ստատիկ ատրիբուտներ";\r
- }\r
- virtual QCString trProtectedTypes()\r
- {\r
- return "Պաշտպանված տիպեր";\r
- }\r
- virtual QCString trProtectedAttribs()\r
- {\r
- return "Պաշտպանված ատրիբուտներ";\r
- }\r
- virtual QCString trStaticProtectedAttribs()\r
- {\r
- return "Պաշտպանված ստատիկ ատրիբուտներ";\r
- }\r
- virtual QCString trPrivateTypes()\r
- {\r
- return "Փակ տիպեր";\r
- }\r
- virtual QCString trPrivateAttribs()\r
- {\r
- return "Փակ ատրիբուտներ";\r
- }\r
- virtual QCString trStaticPrivateAttribs()\r
- {\r
- return "Փակ ստատիկ ատրիբուտներ";\r
- }\r
-\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.1.3\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! Used as a marker that is put before a todo item */\r
- virtual QCString trTodo()\r
- /*??*/\r
- {\r
- return "Կատարման ենթակա";\r
- }\r
- /*! Used as the header of the todo list */\r
- virtual QCString trTodoList()\r
- /*??*/\r
- {\r
- return "Խնդիրների ցուցակ";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.1.4\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- virtual QCString trReferencedBy()\r
- {\r
- return "Օգտագործվում է հետևյալում - ";\r
- }\r
- virtual QCString trRemarks()\r
- {\r
- return "Դիտողություններ";\r
- }\r
- virtual QCString trAttention()\r
- {\r
- return "Ուշադրություն";\r
- }\r
- virtual QCString trInclByDepGraph()\r
- {\r
- return "Այս գրաֆը ցույց է տալիս, թե որ ֆայլերն են "\r
- "ուղղակի կամ անուղղակի ներառում տվյալ ֆայլը.";\r
- }\r
- virtual QCString trSince()\r
- /*??*/\r
- {\r
- return "Սկսած";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.1.5\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! title of the graph legend page */\r
- virtual QCString trLegendTitle()\r
- {\r
- return "Լեգենդ";\r
- }\r
- /*! page explaining how the dot graph's should be interpreted\r
- * The %A in the text below are to prevent link to classes called "A".\r
- */\r
- virtual QCString trLegendDocs()\r
- {\r
- return\r
- "Այս էջը նկարագրում է, թե ինչպես մեկնաբանել doxygen-ի ստեղծած գրաֆները:<p>\n"\r
- "Դիտարկենք հետևյալ օրինակը.\n"\r
- "\\code\n"\r
- "/*! Կրճատման հետևանքով անտեսանելի դաս */\n"\r
- "class Invisible { };\n\n"\r
- "/*! Կրճատված դաս, ժառանգությունների հարաբերությունը փակ է */\n"\r
- "class Truncated : public Invisible { };\n\n"\r
- "/* Չփաստագրված դաս */\n"\r
- "class Undocumented { };\n\n"\r
- "/*! Բաց ժառանգում */\n"\r
- "class PublicBase : public Truncated { };\n\n"\r
- "/*! Դասի ձևաչափ */\n"\r
- "template<class T> class Templ {};\n\n"\r
- "/*! Պաշտպանված ժառանգում */\n"\r
- "class ProtectedBase { };\n\n"\r
- "/*! Փակ ժառանգում */\n"\r
- "class PrivateBase { };\n\n"\r
- "/*! Դաս, որը օգտագործվում է Inherited դասի կողմից */\n"\r
- "class Used { };\n\n"\r
- "/*! Դաս, որը ժառանգում է մի շարք այլ դասերից */\n"\r
- "class Inherited : public PublicBase,\n"\r
- " protected ProtectedBase,\n"\r
- " private PrivateBase,\n"\r
- " public Undocumented,\n"\r
- " public Templ<int>\n"\r
- "{\n"\r
- " private:\n"\r
- " Used *m_usedClass;\n"\r
- "};\n"\r
- "\\endcode\n"\r
- "Սրանով կստանանք հետևյալ գրաֆը."\r
- "<p><center><img src=\"graph_legend."+getDotImageExtension()+"\"></center>\n"\r
- "<p>\n"\r
- "Այս գրաֆի ուղղանկյունները ունեն հետևյալ իմաստը.\n"\r
- "<ul>\n"\r
- "<li>%A լցոնվաց մոխրագույն ուղղանկյունը ներկայացնում է այն դասը կամ կառուցվածքը, "\r
- "որի համար ստեղծվել է տվյալ գրաֆը:</li>\n"\r
- "<li>%A սև եզրերով ուղղանկյունը նշանակում է փաստագրված դաս կամ կարուցվածք:</li>\n"\r
- "<li>%A մոխրագույն եզրերով ուղղանկյունը նշանակում է չփաստագրված դաս կամ կառուցվածք:</li>\n"\r
- "<li>%A կարմիր եզրերով ուղղանկյունը նշանակում է դաս կամ կառուցվածք, որի համար\n"\r
- " ոչ բոլոր ժառանգում/պարունակում կապերն են ցուցադրված: Գրաֆը կրճատված է, "\r
- "եթե այն չի տեղավորվում նշված սահմաններում:</li>\n"\r
- "</ul>\n"\r
- "Սլաքները ունեն հետևյալ իմաստը.\n"\r
- "<ul>\n"\r
- "<li>%A մուգ կապույտ սլաքը օգտագործվում է երկու դասերի միջև բաց ժառանգում "\r
- "կապը ցուցադրելու համար:</li>\n"\r
- "<li>%A մուգ կանաչ սլաքը օգտագործվում է պաշտպանված ժառանգման համար:</li>\n"\r
- "<li>%A մուգ կարմիր սլաքը օգտագործվում է փակ ժառանգման համար:</li>\n"\r
- "<li>%A մանուշակագույն կետագիծ սլաքը օգտագորշվում է, եթե դասը պարունակվում է"\r
- "այլ դասում կամ օգտագորշվում է այլ դասի կողմից: Սլաքը պիտակավորվաշ է"\r
- "փոփոխական(ներ)ով, որի միջոցով մատնանշված դասը կամ կառուցվածքը հասանելի է:</li>\n"\r
- "<li>Դեզին կետագիծ սլաքը ցույց է տալիս ձևանմուշի օրինակի կապը այն ձևանմուշի հետ, "\r
- "որից այն իրականցվել է. Սլաքը պիտակավորված է օրինակի ձևանմուշային պարամետրերով:</li>\n"\r
- "</ul>\n";\r
- }\r
- /*! text for the link to the legend page */\r
- virtual QCString trLegend()\r
- {\r
- return "լեգենդ";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.2.0\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! Used as a marker that is put before a test item */\r
- virtual QCString trTest()\r
- {\r
- return "Թեստ";\r
- }\r
- /*! Used as the header of the test list */\r
- virtual QCString trTestList()\r
- {\r
- return "Թեստերի ցուցակ";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.2.2\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! Used as a section header for IDL properties */\r
- virtual QCString trProperties()\r
- {\r
- return "Հատկություններ";\r
- }\r
- /*! Used as a section header for IDL property documentation */\r
- virtual QCString trPropertyDocumentation()\r
- {\r
- return "Հատկություններ";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.2.4\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! Used for Java classes in the summary section of Java packages */\r
- virtual QCString trClasses()\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- return "Տվյալների կառուցվածք";\r
- }\r
- else\r
- {\r
- return "Դասեր";\r
- }\r
- }\r
- /*! Used as the title of a Java package */\r
- virtual QCString trPackage(const QCString &name)\r
- {\r
- return "Փաթեթ "+name;\r
- }\r
- /*! The description of the package index page */\r
- virtual QCString trPackageListDescription()\r
- {\r
- return "Բոլոր փաթեթները` կարճ բացատրություններով (եթե հասանելի են).";\r
- }\r
- /*! The link name in the Quick links header for each page */\r
- virtual QCString trPackages()\r
- {\r
- return "Փաթեթներ";\r
- }\r
- /*! Text shown before a multi-line define */\r
- virtual QCString trDefineValue()\r
- {\r
- return "Արժեքներ";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.2.5\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! Used as a marker that is put before a \\bug item */\r
- virtual QCString trBug()\r
- {\r
- return "Սխալ";\r
- }\r
- /*! Used as the header of the bug list */\r
- virtual QCString trBugList()\r
- {\r
- return "Սխալների ցուցակ";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.2.6\r
-//////////////////////////////////////////////////////////////////////////\r
- /*! Used as ansicpg for RTF file */\r
- virtual QCString trRTFansicp()\r
- {\r
- return "armscii-8";\r
- }\r
- /*! Used as ansicpg for RTF fcharset */\r
- virtual QCString trRTFCharSet()\r
- {\r
- return "0";\r
- }\r
- /*! Used as header RTF general index */\r
- virtual QCString trRTFGeneralIndex()\r
- {\r
- return "Ցուցիչ";\r
- }\r
-\r
- /*! This is used for translation of the word that will possibly\r
- * be followed by a single name or by a list of names\r
- * of the category.\r
- */\r
- virtual QCString trClass(bool first_capital, bool singular)\r
- {\r
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))\r
- {\r
- QCString result((first_capital ? "Տվյալների կառուցվածք" : "տվյալների կառուցվածք"));\r
- return result;\r
- }\r
- else\r
- {\r
- QCString result((first_capital ? "Դաս" : "դաս"));\r
- if(!singular) result+="եր";\r
- return result;\r
- }\r
- }\r
-\r
- /*! This is used for translation of the word that will possibly\r
- * be followed by a single name or by a list of names\r
- * of the category.\r
- */\r
- virtual QCString trFile(bool first_capital, bool singular)\r
- {\r
- QCString result((first_capital ? "Ֆայլ" : "ֆայլ"));\r
- if (!singular) result+="եր";\r
- return result;\r
- }\r
-\r
- /*! This is used for translation of the word that will possibly\r
- * be followed by a single name or by a list of names\r
- * of the category.\r
- */\r
- virtual QCString trNamespace(bool first_capital, bool singular)\r
- {\r
- QCString result((first_capital ? "Անունների տարածություն" : "անունների տարածություն"));\r
- if (!singular) result+="ներ";\r
- return result;\r
- }\r
-\r
- /*! This is used for translation of the word that will possibly\r
- * be followed by a single name or by a list of names\r
- * of the category.\r
- */\r
- virtual QCString trGroup(bool first_capital, bool singular)\r
- {\r
- QCString result((first_capital ? "Խ" : "խ"));\r
- result+=(singular ? "ումբ" : "մբեր");\r
- return result;\r
- }\r
-\r
- /*! This is used for translation of the word that will possibly\r
- * be followed by a single name or by a list of names\r
- * of the category.\r
- */\r
- virtual QCString trPage(bool first_capital, bool singular)\r
- {\r
- QCString result((first_capital ? "Էջ" : "էջ"));\r
- if (!singular) result+="եր";\r
- return result;\r
- }\r
-\r
- /*! This is used for translation of the word that will possibly\r
- * be followed by a single name or by a list of names\r
- * of the category.\r
- */\r
- virtual QCString trMember(bool first_capital, bool singular)\r
- {\r
- QCString result((first_capital ? "Անդամ" : "անդամ"));\r
- if (!singular) result+="ներ";\r
- return result;\r
- }\r
-\r
- /*! This is used for translation of the word that will possibly\r
- * be followed by a single name or by a list of names\r
- * of the category.\r
- */\r
- virtual QCString trGlobal(bool first_capital, bool singular)\r
- {\r
- QCString result((first_capital ? "Գլոբալ" : "գլոբալ"));\r
- if (!singular) result+="ներ";\r
- return result;\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.2.7\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! This text is generated when the \\author command is used and\r
- * for the author section in man pages. */\r
- virtual QCString trAuthor(bool first_capital, bool singular)\r
- {\r
- QCString result((first_capital ? "Հեղինակ" : "հեղինակ"));\r
- if (!singular) result+="ներ";\r
- return result;\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.2.11\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! This text is put before the list of members referenced by a member\r
- */\r
- virtual QCString trReferences()\r
- {\r
- return "Հղումներ - ";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.2.13\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! used in member documentation blocks to produce a list of\r
- * members that are implemented by this one.\r
- */\r
- virtual QCString trImplementedFromList(int numEntries)\r
- {\r
- return "Իրագործում է հետևյալ դաս(եր)ի ֆունկցիաները - "+trWriteList(numEntries)+":";\r
- }\r
-\r
- /*! used in member documentation blocks to produce a list of\r
- * all members that implementation this member.\r
- */\r
- virtual QCString trImplementedInList(int numEntries)\r
- {\r
- return "Իրագործվում է հետևյալում - "+trWriteList(numEntries)+":";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.2.16\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! used in RTF documentation as a heading for the Table\r
- * of Contents.\r
- */\r
- virtual QCString trRTFTableOfContents()\r
- {\r
- return "Բովանդակություն";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.2.17\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! Used as the header of the list of item that have been\r
- * flagged deprecated\r
- */\r
- virtual QCString trDeprecatedList()\r
- {\r
- return "Հնացած սահմանումների ցուցակը";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.2.18\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! Used as a header for declaration section of the events found in\r
- * a C# program\r
- */\r
- virtual QCString trEvents()\r
- {\r
- return "Պատահարներ";\r
- }\r
- /*! Header used for the documentation section of a class' events. */\r
- virtual QCString trEventDocumentation()\r
- {\r
- return "Պատահարների ցուցակը";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.3\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! Used as a heading for a list of Java class types with package scope.\r
- */\r
- virtual QCString trPackageTypes()\r
- {\r
- return "Փաթեթի տիպեր";\r
- }\r
- /*! Used as a heading for a list of Java class functions with package\r
- * scope.\r
- */\r
- virtual QCString trPackageFunctions()\r
- {\r
- return "Փաթեթի ֆունկցիաներ";\r
- }\r
- virtual QCString trPackageMembers()\r
- {\r
- return "Փաթեթի անդամներ";\r
- }\r
- /*! Used as a heading for a list of static Java class functions with\r
- * package scope.\r
- */\r
- virtual QCString trStaticPackageFunctions()\r
- {\r
- return "Փաթեթի ստատիկ ֆունկցիաներ";\r
- }\r
- /*! Used as a heading for a list of Java class variables with package\r
- * scope.\r
- */\r
- virtual QCString trPackageAttribs()\r
- {\r
- return "Փաթեթի ատրիբուտներ";\r
- }\r
- /*! Used as a heading for a list of static Java class variables with\r
- * package scope.\r
- */\r
- virtual QCString trStaticPackageAttribs()\r
- {\r
- return "Փաթեթի ստատիկ ատրիբուտներ";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.3.1\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! Used in the quick index of a class/file/namespace member list page\r
- * to link to the unfiltered list of all members.\r
- */\r
- virtual QCString trAll()\r
- {\r
- return "Բոլոր";\r
- }\r
- /*! Put in front of the call graph for a function. */\r
- virtual QCString trCallGraph()\r
- {\r
- return "Այս ֆունկցիայի կանչերի գրաֆը.";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.3.3\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! This string is used as the title for the page listing the search\r
- * results.\r
- */\r
- virtual QCString trSearchResultsTitle()\r
- {\r
- return "Որոնման արդյունքները";\r
- }\r
- /*! This string is put just before listing the search results. The\r
- * text can be different depending on the number of documents found.\r
- * Inside the text you can put the special marker $num to insert\r
- * the number representing the actual number of search results.\r
- * The @a numDocuments parameter can be either 0, 1 or 2, where the\r
- * value 2 represents 2 or more matches. HTML markup is allowed inside\r
- * the returned string.\r
- */\r
- virtual QCString trSearchResults(int numDocuments)\r
- {\r
- if (numDocuments==0)\r
- {\r
- return "Ներեցեք, բայց Ձեր որոնումը արդյունք չտվեց:";\r
- }\r
- else if( numDocuments == 1 )\r
- {\r
- return "Հայտնաբերվել է 1 փաստաթուղթ:";\r
- }\r
- else\r
- {\r
- return "Հայտնաբերվել է <b>$num</b> փաստաթուղթ:"\r
- "Փաստաթղթերը դասակարգված են ըստ համապասխանության";\r
- }\r
- }\r
- /*! This string is put before the list of matched words, for each search\r
- * result. What follows is the list of words that matched the query.\r
- */\r
- virtual QCString trSearchMatches()\r
- {\r
- return "Որոնման արդյունքներ:";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.3.8\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! This is used in HTML as the title of page with source code for file filename\r
- */\r
- virtual QCString trSourceFile(QCString& filename)\r
- {\r
- return "Ելակետային ֆայլ " + filename;\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.3.9\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! This is used as the name of the chapter containing the directory\r
- * hierarchy.\r
- */\r
- virtual QCString trDirIndex()\r
- { return "Ֆայլադարանների հիերարխիա"; }\r
-\r
- /*! This is used as the name of the chapter containing the documentation\r
- * of the directories.\r
- */\r
- virtual QCString trDirDocumentation()\r
- { return "Ֆայլադարաններ"; }\r
-\r
- /*! This is used as the title of the directory index and also in the\r
- * Quick links of a HTML page, to link to the directory hierarchy.\r
- */\r
- virtual QCString trDirectories()\r
- { return "Ֆայլադրաններ"; }\r
-\r
- /*! This returns the title of a directory page. The name of the\r
- * directory is passed via \a dirName.\r
- */\r
- virtual QCString trDirReference(const QCString &dirName)\r
- { QCString result=dirName; result+=" Ֆայլադարան"; return result; }\r
-\r
- /*! This returns the word directory with or without starting capital\r
- * (\a first_capital) and in sigular or plural form (\a singular).\r
- */\r
- virtual QCString trDir(bool first_capital, bool singular)\r
- {\r
- QCString result((first_capital ? "Ֆայլադարան" : "ֆայլադարան"));\r
- if (!singular) result+="ներ";\r
- return result;\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.4.1\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! This text is added to the documentation when the \\overload command\r
- * is used for a overloaded function.\r
- */\r
- virtual QCString trOverloadText()\r
- {\r
- return "Սա վերաբեռնված ֆունկցիա է` տրամադրված հարմարության համար: "\r
- "Այն տարբերվում է նախնականից միայն արգումնետներով:";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.4.6\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! This is used to introduce a caller (or called-by) graph */\r
- virtual QCString trCallerGraph()\r
- {\r
- return "Այս ֆունկցիայի կանչերի գրաֆը.";\r
- }\r
-\r
- /*! This is used in the documentation of a file/namespace before the list\r
- * of documentation blocks for enumeration values\r
- */\r
- virtual QCString trEnumerationValueDocumentation()\r
- { return "Համարակալումներ"; }\r
-\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.5.4 (mainly for Fortran)\r
-//////////////////////////////////////////////////////////////////////////\r
- /*! header that is put before the list of member subprograms (Fortran). */\r
- virtual QCString trMemberFunctionDocumentationFortran()\r
- { return "Անդամ ֆունցիաներ/ենթածրագրեր"; }\r
-\r
- /*! This is put above each page as a link to the list of annotated data types (Fortran). */\r
- virtual QCString trCompoundListFortran()\r
- { return "Տվյալների տիպերի ցուցակը"; }\r
-\r
- /*! This is put above each page as a link to all members of compounds (Fortran). */\r
- virtual QCString trCompoundMembersFortran()\r
- { return "Տվյալների դաշտեր"; }\r
-\r
- /*! This is an introduction to the annotated compound list (Fortran). */\r
- virtual QCString trCompoundListDescriptionFortran()\r
- { return "Տվյալների տիպերը` կարճ բացատրություններով."; }\r
-\r
- /*! This is an introduction to the page with all data types (Fortran). */\r
- virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)\r
- {\r
- QCString result="Բոլոր ";\r
- if (!extractAll)\r
- {\r
- result+="փաստագրված ";\r
- }\r
- result+="տվյալների տիպերի անդամների ցուցակը` հղումներով դեպի ";\r
- if (!extractAll)\r
- {\r
- result+="բոլոր անդամների տվյալների կառուցվածքի փաստագրությունը";\r
- }\r
- else\r
- {\r
- result+="տվյալների տիպերը, որոնց նրանք պատկանում են";\r
- }\r
- return result;\r
- }\r
-\r
- /*! This is used in LaTeX as the title of the chapter with the\r
- * annotated compound index (Fortran).\r
- */\r
- virtual QCString trCompoundIndexFortran()\r
- { return "Տվյալների տիպեր"; }\r
-\r
- /*! This is used in LaTeX as the title of the chapter containing\r
- * the documentation of all data types (Fortran).\r
- */\r
- virtual QCString trTypeDocumentation()\r
- { return "Տվյալների տիպեր"; }\r
-\r
- /*! This is used in the documentation of a file as a header before the\r
- * list of (global) subprograms (Fortran).\r
- */\r
- virtual QCString trSubprograms()\r
- { return "Ֆունկցիաներ/ենթածրագրեր"; }\r
-\r
- /*! This is used in the documentation of a file/namespace before the list\r
- * of documentation blocks for subprograms (Fortran)\r
- */\r
- virtual QCString trSubprogramDocumentation()\r
- { return "Ֆունկցիաներ/ենթածրագրեր"; }\r
-\r
- /*! This is used in the documentation of a file/namespace/group before\r
- * the list of links to documented compounds (Fortran)\r
- */\r
- virtual QCString trDataTypes()\r
- { return "Տվյալների տիպեր"; }\r
-\r
- /*! used as the title of page containing all the index of all modules (Fortran). */\r
- virtual QCString trModulesList()\r
- { return "Մոդուլների ցուցակ"; }\r
-\r
- /*! used as an introduction to the modules list (Fortran) */\r
- virtual QCString trModulesListDescription(bool extractAll)\r
- {\r
- QCString result="Բոլոր";\r
- if (!extractAll) result+="փաստագրված ";\r
- result+="մոդուլների ցուցակը` կարճ բացատրություններով.";\r
- return result;\r
- }\r
-\r
- /*! used as the title of the HTML page of a module/type (Fortran) */\r
- virtual QCString trCompoundReferenceFortran(const QCString &clName,\r
- ClassDef::CompoundType compType,\r
- bool isTemplate)\r
- {\r
- QCString result=clName;\r
- if (!isTemplate)\r
- {\r
- switch(compType)\r
- {\r
- case ClassDef::Class: result+=" Մոդուլ"; break;\r
- case ClassDef::Struct: result+=" Տիպ"; break;\r
- case ClassDef::Union: result+=" Միավորում"; break;\r
- case ClassDef::Interface: result+=" Ինտերֆեյս"; break;\r
- case ClassDef::Protocol: result+=" Արձանագրություն"; break;\r
- case ClassDef::Category: result+=" Դասակարգում"; break;\r
- case ClassDef::Exception: result+=" Բացառություն"; break;\r
- default: break;\r
- }\r
- }\r
- else\r
- {\r
- switch(compType)\r
- {\r
- case ClassDef::Class: result+=" Մոդուլի"; break;\r
- case ClassDef::Struct: result+=" Տիպի"; break;\r
- case ClassDef::Union: result+=" Միավորման"; break;\r
- case ClassDef::Interface: result+=" Ինտերֆեյսի"; break;\r
- case ClassDef::Protocol: result+=" Արձանագրության"; break;\r
- case ClassDef::Category: result+=" Դասակարգման"; break;\r
- case ClassDef::Exception: result+=" Բացառության"; break;\r
- default: break;\r
- }\r
- result+=" Ձևանմուշ";\r
- }\r
- return result;\r
- }\r
- /*! used as the title of the HTML page of a module (Fortran) */\r
- virtual QCString trModuleReference(const QCString &namespaceName)\r
- {\r
- return QCString("Մոդուլ ") + namespaceName;\r
- }\r
-\r
- /*! This is put above each page as a link to all members of modules. (Fortran) */\r
- virtual QCString trModulesMembers()\r
- { return "Մոդուլի անդամներ"; }\r
-\r
- /*! This is an introduction to the page with all modules members (Fortran) */\r
- virtual QCString trModulesMemberDescription(bool extractAll)\r
- {\r
- QCString result="Մոդուլի բոլոր ";\r
- if (!extractAll) result+="փաստագրված ";\r
- result+="անդամների ցուցակը` հղումներով դեպի ";\r
- if (extractAll)\r
- {\r
- result+="բոլոր անդամների փաստագրությունները.";\r
- }\r
- else\r
- {\r
- result+="մոդուլները, որոնց նրանք պատկանում են.";\r
- }\r
- return result;\r
- }\r
-\r
- /*! This is used in LaTeX as the title of the chapter with the\r
- * index of all modules (Fortran).\r
- */\r
- virtual QCString trModulesIndex()\r
- { return "Մոդուլներ"; }\r
-\r
- /*! This is used for translation of the word that will possibly\r
- * be followed by a single name or by a list of names\r
- * of the category.\r
- */\r
- virtual QCString trModule(bool first_capital, bool singular)\r
- {\r
- QCString result((first_capital ? "Մոդուլ" : "մոդուլ"));\r
- if (!singular) result+="ներ";\r
- return result;\r
- }\r
- /*! This is put at the bottom of a module documentation page and is\r
- * followed by a list of files that were used to generate the page.\r
- */\r
- virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,\r
- bool single)\r
- { // here s is one of " Module", " Struct" or " Union"\r
- // single is true implies a single file\r
- QCString result="Այս ";\r
- switch(compType)\r
- {\r
- case ClassDef::Class: result+="մոդուլի"; break;\r
- case ClassDef::Struct: result+="տիպի"; break;\r
- case ClassDef::Union: result+="միավորման"; break;\r
- case ClassDef::Interface: result+="ինտերֆեյսի"; break;\r
- case ClassDef::Protocol: result+="արձանագրության"; break;\r
- case ClassDef::Category: result+="դասակարգման"; break;\r
- case ClassDef::Exception: result+="բացառության"; break;\r
- default: break;\r
- }\r
- result+=" փաստագրությունը ստեղծվել է հետևալ ֆայլ";\r
- if (single) result+="ից."; else result+="երից.";\r
- return result;\r
- }\r
- /*! This is used for translation of the word that will possibly\r
- * be followed by a single name or by a list of names\r
- * of the category.\r
- */\r
- virtual QCString trType(bool first_capital, bool singular)\r
- {\r
- QCString result((first_capital ? "Տիպ" : "տիպ"));\r
- if (!singular) result+="եր";\r
- return result;\r
- }\r
- /*! This is used for translation of the word that will possibly\r
- * be followed by a single name or by a list of names\r
- * of the category.\r
- */\r
- virtual QCString trSubprogram(bool first_capital, bool singular)\r
- {\r
- QCString result((first_capital ? "Ե" : "ե"));\r
- if (singular) result+="նթածրագիր"; else result+="նթածրագրեր";\r
- return result;\r
- }\r
-\r
- /*! C# Type Constraint list */\r
- virtual QCString trTypeConstraints()\r
- {\r
- return "Տիպերի Սահմանափակումներ";\r
- }\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.6.0 (mainly for the new search engine)\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! directory relation for \a name */\r
- virtual QCString trDirRelation(const QCString &name)\r
- {\r
- return QCString(name)+" Կապ";\r
- }\r
-\r
- /*! Loading message shown when loading search results */\r
- virtual QCString trLoading()\r
- {\r
- return "Բեռնում...";\r
- }\r
-\r
- /*! Label used for search results in the global namespace */\r
- virtual QCString trGlobalNamespace()\r
- {\r
- return "Գլոբալ անունների տարածություն";\r
- }\r
-\r
- /*! Message shown while searching */\r
- virtual QCString trSearching()\r
- {\r
- return "Որոնում...";\r
- }\r
-\r
- /*! Text shown when no search results are found */\r
- virtual QCString trNoMatches()\r
- {\r
- return "Անարդյունք";\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.6.3 (missing items for the directory pages)\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! when clicking a directory dependency label, a page with a\r
- * table is shown. The heading for the first column mentions the\r
- * source file that has a relation to another file.\r
- */\r
- virtual QCString trFileIn(const QCString &name)\r
- {\r
- return "Ֆայլը " + name + " ում";\r
- }\r
-\r
- /*! when clicking a directory dependency label, a page with a\r
- * table is shown. The heading for the second column mentions the\r
- * destination file that is included.\r
- */\r
- virtual QCString trIncludesFileIn(const QCString &name)\r
- {\r
- return "Ներառում է ֆայլը " + name + " ում";\r
- }\r
-\r
- /** Compiles a date string.\r
- * @param year Year in 4 digits\r
- * @param month Month of the year: 1=January\r
- * @param day Day of the Month: 1..31\r
- * @param dayOfWeek Day of the week: 1=Monday..7=Sunday\r
- * @param hour Hour of the day: 0..23\r
- * @param minutes Minutes in the hour: 0..59\r
- * @param seconds Seconds within the minute: 0..59\r
- * @param includeTime Include time in the result string?\r
- */\r
- virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,\r
- int hour,int minutes,int seconds,\r
- bool includeTime)\r
- {\r
- static const char *days[] = { "Երկուշաբթի,","Երեքշաբթի,","Չորեքշաբթի,","Հինգշաբթի,",\r
- "Ուրբաթ,","Շաբաթ,","Կիրակի," };\r
- static const char *months[] = { "Հունիսի","Փետրվարի","Մարտի","Ապրրիլի","Մայիսի","Հունիսի",\r
- "Հուլիսի","Օգոստոսի","Սեպտեմբերի","Հոկտեբմերի","Նոյեմբերի","Դեկտեմբերի" };\r
- QCString sdate;\r
- sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);\r
- if (includeTime)\r
- {\r
- QCString stime;\r
- stime.sprintf(" %.2d:%.2d:%.2d ",hour,minutes,seconds);\r
- sdate+=stime;\r
- }\r
- return sdate;\r
- }\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// new since 1.7.5\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
- /*! Header for the page with bibliographic citations */\r
- virtual QCString trCiteReferences()\r
- { return "Գրականություն"; }\r
-\r
- /*! Text for copyright paragraph */\r
- virtual QCString trCopyright()\r
- { return "Հեղինակային իրավունք"; }\r
-\r
- /*! Header for the graph showing the directory dependencies */\r
- virtual QCString trDirDepGraph(const QCString &name)\r
- { return name + QCString("-ի ֆայլադարանների կախվածությունների գծագիր:"); }\r
-\r
-};\r
-#endif\r
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ */
+
+/*
+ * Translation by
+ * Armen Tangamyan <armen.tangamyan@anu.edu.au>
+ */
+
+#ifndef TRANSLATOR_AM_H
+#define TRANSLATOR_AM_H
+
+class TranslatorArmenian : public TranslatorAdapter_1_8_0
+{
+ public:
+ /*! Used for identification of the language. */
+ virtual QCString idLanguage()
+ { return "armenian"; }
+
+ /* Used to get the command(s) for the language support. */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[latin]{armtex}\n"
+ "\\usepackage[armscii8]{inputenc}\n";
+ }
+ virtual QCString trISOLang()
+ { return "hy"; }
+ virtual QCString getLanguageString()
+ {
+ return "0x42b Armenian";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Դասին վերաբերվող ֆունկցիաներ"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Հաշվի առեք, որ սրանք անդամ ֆունկցիաներ չեն)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Մանրամասն նկարագրություն"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Անդամ տիպի սահմանումներ (typedef)"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Անդամ hամարակալումներ"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Անդամ ֆունկցիաներ"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Դաշտեր";
+ }
+ else
+ {
+ return "Անդամ տվյալներ";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Մանրամասն..."; }
+
+ /*! put in the class documentation */
+ /* Isn't used when optimization for C is on. */
+ virtual QCString trListOfAllMembers()
+ {
+ return "Բոլոր անդամների ցուցակը";
+ }
+
+ /*! used as the title of the "list of all members" page of a class */
+ /* Isn't used when optimization for C is on. */
+ virtual QCString trMemberList()
+ {
+ return "Անդամների ցուցակ";
+ }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ /* Isn't used when optimization for C is on. */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Սա դասի անդամների ամբողջական ցուցակն է "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ /* Isn't used when optimization for C is on. */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", ներառյալ բոլոր ժառանգված անդամները"; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const QCString &s)
+ { QCString result="Ավտոմատ ստեղծված է ելքային կոդից, Doxygen-ի միջոցով, ";
+ if (!s.isEmpty()) result+=s+" համար:";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "համարակալման անուն"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "համարակալման արժեք"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "սահմանված"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Մոդուլներ"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Դասերի հիերարխա"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ return "Դասերի ցուցակ";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Ֆայլերի ցուցակ"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների դաշտեր";
+ }
+ else
+ {
+ return "Դասի անդամներ";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ /*??*/
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Գլոբալներ";
+ }
+ else
+ {
+ return "Ֆայլի անդամներ";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Նմանատիպ էջեր"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Օրինակներ"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Որոնում"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Այս ժառանգման ցուցակը կոպտորեն է տեսակավորված, "
+ "բայց ոչ ամբողջապես, այբբենական կարգով.";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+ result+="ֆայլերի մի ցուցակ` կարճ բացատրություններով:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածքը` կարճ բացատրություններով.";
+ }
+ else
+ {
+ return "Դասերը, կառուցվածքները, միավորումները "
+ "և ինտերֆեյսները` կարճ բացատրություններով.";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if(!extractAll) result+="փաստագրված ";
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ result+="կառուցվածքների և միավորումների դաշտերի ";
+ else
+ result+="դասի անդամների ";
+ result+="ցուցակը`";
+ result+=" հղումներով դեպի ";
+ if(!extractAll)
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ result+="կառուցվածք/միավորում փաստագրությունները բոլոր անդամների համար.";
+ else
+ result+="դասի փաստագրությունը բոլոր անդամների համար.";
+ }
+ else
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ result += "կառուցվածքները/միավորումները, որոնց նրանք պատկանում են.";
+ else
+ result += "դասերը, որոնց նրանք պատկանում են.";
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ result+="ֆունկցիաների, փոփոխականների, մակրո-հայտարարությունների, "
+ "համարակալումների և տիպի սահմանումների (typedef)";
+ }
+ else
+ {
+ result+="ֆայլի անդամների ";
+ }
+ result+="ցուցակը`";
+ result+=" հղումներով դեպի ";
+ if (extractAll)
+ result+="ֆայլերը, որոնց նրանք պատկանում են.";
+ else
+ result+="փաստագրությունը.";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Բոլոր օրինակների ցուցակը."; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Բոլոր նմանատիպ փաստագրության էջերի ցուցակը."; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Բոլոր մոդուլների ցուցակը."; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return " - Փաստագրություն"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Մոդուլներ"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Դասակարգումներ"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ return "Դասեր";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Ֆայլեր"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Մոդուլներ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածքներ";
+ }
+ else if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
+ {
+ return trDesignUnitDocumentation();
+ }
+ else
+ {
+ return "Դասեր";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Ֆայլեր"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Օրինակներ"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Հղումների ձեռնարկ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Մակրոսներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Տիպի սահմանումներ (typedef)"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Համարակալումներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Ֆունկցիաներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Փոփոխականներ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Հաշվիչ"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Մակրոսներ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Տիպի սահմանումներ (typedef)"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Համարակալման տիպեր"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Ֆունկցիաներ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Փոփոխականներ"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ return "Դասեր";
+ }
+ }
+
+ /*! This is used in the documentation of a group before the list of
+ * links to documented files
+ */
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const QCString &date,const QCString &projName)
+ {
+ QCString result=QCString("Ստեղծվել է ")+date;
+ if (!projName.isEmpty()) result+=projName+" -ի համար,";
+ result+=" հետևյալ համակարգով.";
+ return result;
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const QCString &clName)
+ {
+ return clName+QCString(" -ի ժառանգման գծագիրը.");
+ }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Զգուշացում"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Տարբերակ"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Տարեթիվ"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Վերադարձնում է"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Տեսեք նաև"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Պարամետրեր"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Բացառություններ"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Ստեղծված է հետևյալ համակարգի կողմից"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Անունների տարածությունների ցուցակ"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+ result+="անունների տարածությունների ցուցակը` կարճ բացատրություններով.";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Ընկերներ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Դասի ընկերներ և կապված ֆունկցիաներ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const QCString &clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=clName;
+ if (isTemplate)
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Դասի"; break;
+ case ClassDef::Struct: result+=" Կառուցվածքի"; break;
+ case ClassDef::Union: result+=" Միավորման"; break;
+ case ClassDef::Interface: result+=" Ինտերֆեյսի"; break;
+ case ClassDef::Protocol: result+=" Արձանագրության"; break;
+ case ClassDef::Category: result+=" Դասակարգման"; break;
+ case ClassDef::Exception: result+=" Բացառության"; break;
+ default: break;
+ }
+ result+=" Ձևանմուշներ";
+ }
+ else
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Դաս"; break;
+ case ClassDef::Struct: result+=" Կառուցվածք"; break;
+ case ClassDef::Union: result+=" Միավորում"; break;
+ case ClassDef::Interface: result+=" Ինտերֆեյս"; break;
+ case ClassDef::Protocol: result+=" Արձանագրություն"; break;
+ case ClassDef::Category: result+=" Դասակարգում"; break;
+ case ClassDef::Exception: result+=" Բացառություն"; break;
+ default: break;
+ }
+ }
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const QCString &fileName)
+ {
+ return fileName+QCString(" ֆայլեր");
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const QCString &namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" անունների տարածություններ";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Բաց անդամ ֆունկցիաներ"; }
+ virtual QCString trPublicSlots()
+ { return "Բաց սլոթեր"; }
+ virtual QCString trSignals()
+ { return "Ազդանշաններ"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Բաց ստատիկ անդամ ֆունկցիաներ"; }
+ virtual QCString trProtectedMembers()
+ { return "Պաշտպանված անդամ ֆունկցիաներ"; }
+ virtual QCString trProtectedSlots()
+ { return "Պաշտպանված սլոթեր"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Պաշտպանված ստատիկ անդամ ֆունկցիաներ"; }
+ virtual QCString trPrivateMembers()
+ { return "Փակ ֆունկցիաներ"; }
+ virtual QCString trPrivateSlots()
+ { return "Փակ սլոթեր"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Փակ ստատիկ անդամ ֆունկցիաներ"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" և ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Հենքային դասեր - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Ժառանգորդ դասեր - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Վերասահմանված ֆունկցիաներ - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Վերասահմանված է "+trWriteList(numEntries)+" ում:";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Անունների տարածության անդամներ"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+ result+="անունների տարածության անդամների ցուցակը` "
+ "հղումներով դեպի ";
+ if (extractAll)
+ result+="բոլոր անդամների անունների տարածության փաստագրությունը.";
+ else
+ result+="անունների տարածությունը, որին նրանք պատկանում են.";
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Անունների տարածություններ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Անունների տարածություն"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Անունների տարածություններ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ {
+ QCString result = "Այս ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="դասի"; break;
+ case ClassDef::Struct: result+="կառուցվածքի"; break;
+ case ClassDef::Union: result+="միավորման"; break;
+ case ClassDef::Interface: result+="ինտերֆեյսի"; break;
+ case ClassDef::Protocol: result+="արձանագրության"; break;
+ case ClassDef::Category: result+="դասակարգման"; break;
+ case ClassDef::Exception: result+="բացառության"; break;
+ default: break;
+ }
+ result+=" փաստագրությունը ստեղծվել է հետևյալ ֆայլ";
+ if (single) result+="ից."; else result+="երից.";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Վերադարձվող արժեքներ"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Գլխավոր էջ"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "էջ:"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991106
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Սահմանումը @1 ֆայլի @0 տողում է:";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Սահմանումը @0 ֆայլում է:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Հնացած է";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const QCString &clName)
+ {
+ return clName+"-ի համագործակցությունների գծագիր.";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const QCString &fName)
+ {
+ return fName+"-ի ներառումների կախվածությունների գծագիր.";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Կառուցիչներ";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Տե'ս այս ֆայլի ելքային կոդը";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Տե'ս այս ֆայլի փաստագրությունը:";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Նախապայման";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Հետպայման";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Անփոփոխ";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Նախնական արժեք";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "Ելքային կոդ";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Գրաֆիկական դասերի հիերարխիա:";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Տե'ս դասերի գրաֆիկական հիերարխիան:";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Տե'ս դասերի տեքստային հիերարխիան:";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "էջեր";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Նշում";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Բաց տիպեր";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների դաշտեր";
+ }
+ else
+ {
+ return "Բաց ատրիբուտներ";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Բաց ստատիկ ատրիբուտներ";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Պաշտպանված տիպեր";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Պաշտպանված ատրիբուտներ";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Պաշտպանված ստատիկ ատրիբուտներ";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Փակ տիպեր";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Փակ ատրիբուտներ";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Փակ ստատիկ ատրիբուտներ";
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ /*??*/
+ {
+ return "Կատարման ենթակա";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ /*??*/
+ {
+ return "Խնդիրների ցուցակ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Օգտագործվում է հետևյալում - ";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Դիտողություններ";
+ }
+ virtual QCString trAttention()
+ {
+ return "Ուշադրություն";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Այս գրաֆը ցույց է տալիս, թե որ ֆայլերն են "
+ "ուղղակի կամ անուղղակի ներառում տվյալ ֆայլը.";
+ }
+ virtual QCString trSince()
+ /*??*/
+ {
+ return "Սկսած";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Լեգենդ";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Այս էջը նկարագրում է, թե ինչպես մեկնաբանել doxygen-ի ստեղծած գրաֆները:<p>\n"
+ "Դիտարկենք հետևյալ օրինակը.\n"
+ "\\code\n"
+ "/*! Կրճատման հետևանքով անտեսանելի դաս */\n"
+ "class Invisible { };\n\n"
+ "/*! Կրճատված դաս, ժառանգությունների հարաբերությունը փակ է */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Չփաստագրված դաս */\n"
+ "class Undocumented { };\n\n"
+ "/*! Բաց ժառանգում */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Դասի ձևաչափ */\n"
+ "template<class T> class Templ {};\n\n"
+ "/*! Պաշտպանված ժառանգում */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Փակ ժառանգում */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Դաս, որը օգտագործվում է Inherited դասի կողմից */\n"
+ "class Used { };\n\n"
+ "/*! Դաս, որը ժառանգում է մի շարք այլ դասերից */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Սրանով կստանանք հետևյալ գրաֆը."
+ "<p><center><img src=\"graph_legend."+getDotImageExtension()+"\"></center>\n"
+ "<p>\n"
+ "Այս գրաֆի ուղղանկյունները ունեն հետևյալ իմաստը.\n"
+ "<ul>\n"
+ "<li>%A լցոնվաց մոխրագույն ուղղանկյունը ներկայացնում է այն դասը կամ կառուցվածքը, "
+ "որի համար ստեղծվել է տվյալ գրաֆը:</li>\n"
+ "<li>%A սև եզրերով ուղղանկյունը նշանակում է փաստագրված դաս կամ կարուցվածք:</li>\n"
+ "<li>%A մոխրագույն եզրերով ուղղանկյունը նշանակում է չփաստագրված դաս կամ կառուցվածք:</li>\n"
+ "<li>%A կարմիր եզրերով ուղղանկյունը նշանակում է դաս կամ կառուցվածք, որի համար\n"
+ " ոչ բոլոր ժառանգում/պարունակում կապերն են ցուցադրված: Գրաֆը կրճատված է, "
+ "եթե այն չի տեղավորվում նշված սահմաններում:</li>\n"
+ "</ul>\n"
+ "Սլաքները ունեն հետևյալ իմաստը.\n"
+ "<ul>\n"
+ "<li>%A մուգ կապույտ սլաքը օգտագործվում է երկու դասերի միջև բաց ժառանգում "
+ "կապը ցուցադրելու համար:</li>\n"
+ "<li>%A մուգ կանաչ սլաքը օգտագործվում է պաշտպանված ժառանգման համար:</li>\n"
+ "<li>%A մուգ կարմիր սլաքը օգտագործվում է փակ ժառանգման համար:</li>\n"
+ "<li>%A մանուշակագույն կետագիծ սլաքը օգտագորշվում է, եթե դասը պարունակվում է"
+ "այլ դասում կամ օգտագորշվում է այլ դասի կողմից: Սլաքը պիտակավորվաշ է"
+ "փոփոխական(ներ)ով, որի միջոցով մատնանշված դասը կամ կառուցվածքը հասանելի է:</li>\n"
+ "<li>Դեզին կետագիծ սլաքը ցույց է տալիս ձևանմուշի օրինակի կապը այն ձևանմուշի հետ, "
+ "որից այն իրականցվել է. Սլաքը պիտակավորված է օրինակի ձևանմուշային պարամետրերով:</li>\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "լեգենդ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Թեստ";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Թեստերի ցուցակ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Հատկություններ";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Հատկություններ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Տվյալների կառուցվածք";
+ }
+ else
+ {
+ return "Դասեր";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const QCString &name)
+ {
+ return "Փաթեթ "+name;
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Բոլոր փաթեթները` կարճ բացատրություններով (եթե հասանելի են).";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Փաթեթներ";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Արժեքներ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Սխալ";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Սխալների ցուցակ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+ /*! Used as ansicpg for RTF file */
+ virtual QCString trRTFansicp()
+ {
+ return "armscii-8";
+ }
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Ցուցիչ";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ QCString result((first_capital ? "Տվյալների կառուցվածք" : "տվյալների կառուցվածք"));
+ return result;
+ }
+ else
+ {
+ QCString result((first_capital ? "Դաս" : "դաս"));
+ if(!singular) result+="եր";
+ return result;
+ }
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ֆայլ" : "ֆայլ"));
+ if (!singular) result+="եր";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Անունների տարածություն" : "անունների տարածություն"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Խ" : "խ"));
+ result+=(singular ? "ումբ" : "մբեր");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Էջ" : "էջ"));
+ if (!singular) result+="եր";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Անդամ" : "անդամ"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Գլոբալ" : "գլոբալ"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Հեղինակ" : "հեղինակ"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Հղումներ - ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Իրագործում է հետևյալ դաս(եր)ի ֆունկցիաները - "+trWriteList(numEntries)+":";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implementation this member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Իրագործվում է հետևյալում - "+trWriteList(numEntries)+":";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Բովանդակություն";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Հնացած սահմանումների ցուցակը";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Պատահարներ";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Պատահարների ցուցակը";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Փաթեթի տիպեր";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageFunctions()
+ {
+ return "Փաթեթի ֆունկցիաներ";
+ }
+ virtual QCString trPackageMembers()
+ {
+ return "Փաթեթի անդամներ";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageFunctions()
+ {
+ return "Փաթեթի ստատիկ ֆունկցիաներ";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Փաթեթի ատրիբուտներ";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Փաթեթի ստատիկ ատրիբուտներ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Բոլոր";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Այս ֆունկցիայի կանչերի գրաֆը.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Որոնման արդյունքները";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Ներեցեք, բայց Ձեր որոնումը արդյունք չտվեց:";
+ }
+ else if( numDocuments == 1 )
+ {
+ return "Հայտնաբերվել է 1 փաստաթուղթ:";
+ }
+ else
+ {
+ return "Հայտնաբերվել է <b>$num</b> փաստաթուղթ:"
+ "Փաստաթղթերը դասակարգված են ըստ համապասխանության";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Որոնման արդյունքներ:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Ելակետային ֆայլ " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Ֆայլադարանների հիերարխիա"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Ֆայլադարաններ"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Ֆայլադրաններ"; }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const QCString &dirName)
+ { QCString result=dirName; result+=" Ֆայլադարան"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ֆայլադարան" : "ֆայլադարան"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Սա վերաբեռնված ֆունկցիա է` տրամադրված հարմարության համար: "
+ "Այն տարբերվում է նախնականից միայն արգումնետներով:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Այս ֆունկցիայի կանչերի գրաֆը.";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Համարակալումներ"; }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Անդամ ֆունցիաներ/ենթածրագրեր"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Տվյալների տիպերի ցուցակը"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Տվյալների դաշտեր"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Տվյալների տիպերը` կարճ բացատրություններով."; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Բոլոր ";
+ if (!extractAll)
+ {
+ result+="փաստագրված ";
+ }
+ result+="տվյալների տիպերի անդամների ցուցակը` հղումներով դեպի ";
+ if (!extractAll)
+ {
+ result+="բոլոր անդամների տվյալների կառուցվածքի փաստագրությունը";
+ }
+ else
+ {
+ result+="տվյալների տիպերը, որոնց նրանք պատկանում են";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Տվյալների տիպեր"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Տվյալների տիպեր"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Ֆունկցիաներ/ենթածրագրեր"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Ֆունկցիաներ/ենթածրագրեր"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Տվյալների տիպեր"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Մոդուլների ցուցակ"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Բոլոր";
+ if (!extractAll) result+="փաստագրված ";
+ result+="մոդուլների ցուցակը` կարճ բացատրություններով.";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const QCString &clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=clName;
+ if (!isTemplate)
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Մոդուլ"; break;
+ case ClassDef::Struct: result+=" Տիպ"; break;
+ case ClassDef::Union: result+=" Միավորում"; break;
+ case ClassDef::Interface: result+=" Ինտերֆեյս"; break;
+ case ClassDef::Protocol: result+=" Արձանագրություն"; break;
+ case ClassDef::Category: result+=" Դասակարգում"; break;
+ case ClassDef::Exception: result+=" Բացառություն"; break;
+ default: break;
+ }
+ }
+ else
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Մոդուլի"; break;
+ case ClassDef::Struct: result+=" Տիպի"; break;
+ case ClassDef::Union: result+=" Միավորման"; break;
+ case ClassDef::Interface: result+=" Ինտերֆեյսի"; break;
+ case ClassDef::Protocol: result+=" Արձանագրության"; break;
+ case ClassDef::Category: result+=" Դասակարգման"; break;
+ case ClassDef::Exception: result+=" Բացառության"; break;
+ default: break;
+ }
+ result+=" Ձևանմուշ";
+ }
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const QCString &namespaceName)
+ {
+ return QCString("Մոդուլ ") + namespaceName;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Մոդուլի անդամներ"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Մոդուլի բոլոր ";
+ if (!extractAll) result+="փաստագրված ";
+ result+="անդամների ցուցակը` հղումներով դեպի ";
+ if (extractAll)
+ {
+ result+="բոլոր անդամների փաստագրությունները.";
+ }
+ else
+ {
+ result+="մոդուլները, որոնց նրանք պատկանում են.";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Մոդուլներ"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Մոդուլ" : "մոդուլ"));
+ if (!singular) result+="ներ";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result="Այս ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="մոդուլի"; break;
+ case ClassDef::Struct: result+="տիպի"; break;
+ case ClassDef::Union: result+="միավորման"; break;
+ case ClassDef::Interface: result+="ինտերֆեյսի"; break;
+ case ClassDef::Protocol: result+="արձանագրության"; break;
+ case ClassDef::Category: result+="դասակարգման"; break;
+ case ClassDef::Exception: result+="բացառության"; break;
+ default: break;
+ }
+ result+=" փաստագրությունը ստեղծվել է հետևալ ֆայլ";
+ if (single) result+="ից."; else result+="երից.";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Տիպ" : "տիպ"));
+ if (!singular) result+="եր";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ե" : "ե"));
+ if (singular) result+="նթածրագիր"; else result+="նթածրագրեր";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Տիպերի Սահմանափակումներ";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const QCString &name)
+ {
+ return QCString(name)+" Կապ";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Բեռնում...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Գլոբալ անունների տարածություն";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Որոնում...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Անարդյունք";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const QCString &name)
+ {
+ return "Ֆայլը " + name + " ում";
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const QCString &name)
+ {
+ return "Ներառում է ֆայլը " + name + " ում";
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Երկուշաբթի,","Երեքշաբթի,","Չորեքշաբթի,","Հինգշաբթի,",
+ "Ուրբաթ,","Շաբաթ,","Կիրակի," };
+ static const char *months[] = { "Հունիսի","Փետրվարի","Մարտի","Ապրրիլի","Մայիսի","Հունիսի",
+ "Հուլիսի","Օգոստոսի","Սեպտեմբերի","Հոկտեբմերի","Նոյեմբերի","Դեկտեմբերի" };
+ QCString sdate;
+ sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d ",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Երկ", "Երք", "Չրք", "Հնգ", "Ուր", "Շբթ", "Կիր" };
+ static const char *days_full[] = { "Երկուշաբթի", "Երեքշաբթի", "Չորեքշաբթի", "Հինգշաբթի", "Ուրբաթ", "Շաբաթ", "Կիրակի" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Հնվ", "Փտվ", "Մրտ", "Ապր", "Մյս", "Հնս", "Հլս", "Օգս", "Սպտ", "Հկտ", "Նյմ", "Դկտ" };
+ static const char *months_full[] = { "Հունվար", "Փետրվար", "Մարտ", "Ապրիլ", "Մայիս", "Հունիս", "Հուլիս", "Օգոստոս", "Սեպտեմբեր", "Հոկտեմբեր", "Նոյեմբեր", "Դեկտեմբեր" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Header for the page with bibliographic citations */
+ virtual QCString trCiteReferences()
+ { return "Գրականություն"; }
+
+ /*! Text for copyright paragraph */
+ virtual QCString trCopyright()
+ { return "Հեղինակային իրավունք"; }
+
+ /*! Header for the graph showing the directory dependencies */
+ virtual QCString trDirDepGraph(const QCString &name)
+ { return name + QCString("-ի ֆայլադարանների կախվածությունների գծագիր:"); }
+
+};
+#endif
"فقط في نوعية ال argument(s) التي تقبلها.";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "الإثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد" };
+ static const char *days_full[] = { "الإثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر" };
+ static const char *months_full[] = { "يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "ص", "م" };
+ return dayPeriod[period];
+ }
};
#endif
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "пон", "вт", "ср", "четв", "пет", "съб", "нед" };
+ static const char *days_full[] = { "понеделник", "вторник", "сряда", "четвъртък", "петък", "събота", "неделя" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "яну", "фев", "мар", "апр", "май", "юни", "юли", "авг", "сеп", "окт", "ное", "дек" };
+ static const char *months_full[] = { "януари", "февруари", "март", "април", "май", "юни", "юли", "август", "септември", "октомври", "ноември", "декември" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "пр.об.", "сл.об." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
* Thanks to Jorge Ramos, Fernando Carijo and others for their contributions.
*
* History:
+ * 20220525:
+ * - Updated to 1.9.4;
* 20211003:
* - Updated to 1.9.3;
* 20200112:
#ifndef TRANSLATOR_BR_H
#define TRANSLATOR_BR_H
-class TranslatorBrazilian : public TranslatorAdapter_1_9_4
+class TranslatorBrazilian : public Translator
{
public:
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "seg", "ter", "qua", "qui", "sex", "sáb", "dom" };
+ static const char *days_full[] = { "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado", "domingo" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez" };
+ static const char *months_full[] = { "janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
{
return "Definição de conceito";
}
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.9.4
+ //////////////////////////////////////////////////////////////////////////
+ virtual QCString trPackageList()
+ { return "Lista de pacotes"; }
};
#endif
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "dl.", "dt.", "dc.", "dj.", "dv.", "ds.", "dg." };
+ static const char *days_full[] = { "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte", "diumenge" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "gen.", "febr.", "març", "abr.", "maig", "juny", "jul.", "ag.", "set.", "oct.", "nov.", "des." };
+ static const char *months_full[] = { "gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "a.m.", "p.m." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
bool includeTime)
{
static const char *days[] = { "一","二","三","四","五","六","日" };
- static const char *months[] = { "一","二","三","四","五","六","七","八","九","十","十一","十二" };
+ static const char *months[] = { "一","二","三","四","五","六","七","八","九","十","十一","十二" };
QCString sdate;
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "周一", "周二", "周三", "周四", "周五", "周六", "周日" };
+ static const char *days_full[] = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" };
+ static const char *months_full[] = { "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "上午", "下午" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
// Updates:
// --------
-// 2021/08/31 - Updated for 1.9.3 version by: <petyovsky@feec.vutbr.cz>.
-// 2021/01/22 - Updated for 1.9.2 version by: <petyovsky@feec.vutbr.cz>.
+// 2022/08/25 - Updated for "new since 1.9.4" by: <petyovsky@vut.cz>
+// removed all implicit conversion from QCString to const char *,
+// fixed issues: #7434, #8404, #9192,
+// fixed typo and spacing in: `trLegendDocs()`,
+// fixed plural in: `trTemplateParameters()`,
+// better translation considering the context: `trMemberTypedefDocumentation()`,
+// `trMemberEnumerationDocumentation()`, `trMemberFunctionDocumentation()`,
+// `trMemberDataDocumentation()`, `trDefineDocumentation()`, `trDirDocumentation()`,
+// `trTypeDocumentation()`.
+// updated translation in context of non OO languages: `trHierarchicalIndex()`
+// `trGotoGraphicalHierarchy()`, `trGotoTextualHierarchy()`, `trCompoundMembersFortran()`.
+// updated translation in: `trNoMatches()`, trPackageAttribs(), trStaticPackageAttribs().
+// fixed wrong translation in: `trCompoundReferenceFortran()` of `case ClassDef::Class:`.
+// unified translation string in: `trGeneratedFromFilesFortran` according to `trGeneratedFromFiles()`.
+// fixed wrong wording in: `trCompoundReferenceSlice` of `case ClassDef::Interface:` when `isLocal==true`.
+// minor spacing and comments changes for better convergence to the reference file: `translator_en.h`.
+// all unclear or fuzzy czech translations marked with ???.
+// 2021/08/31 - Updated for "new since 1.9.3" by: <petyovsky@vut.cz>.
+// 2021/01/22 - Updated for "new since 1.9.2" by: <petyovsky@vut.cz>.
// 2013/04/11 - Updates for "new since 1.8.4".
// 2012/07/31 - Updates for "new since 1.8.2".
// 2012/04/10 - Updates for "new since 1.8.0".
// something else. It is difficult to find the general translation
// for all kinds in the Czech language.
-class TranslatorCzech : public TranslatorAdapter_1_9_4
+/*!
+ When defining a translator class for the new language, follow
+ the description in the documentation. One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file. Your new language should use the
+ Translator class as the base class. This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does. Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here. The files are included in the
+ language.cpp correctly. Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why. This holds namely for localized translators because their
+ base class is changed occasionally to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+class TranslatorCzech : public Translator
{
public:
+
// --- Language control methods -------------------
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
virtual QCString idLanguage()
{ return "czech"; }
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
virtual QCString latexLanguageSupportCommand()
{
return "\\usepackage[T2A]{fontenc}\n"
{
return "cs";
}
+
virtual QCString getLanguageString()
{
return "0x405 Czech";
}
-
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
/*! header that is put before the list of typedefs. */
virtual QCString trMemberTypedefDocumentation()
- { return "Dokumentace k členským typům"; }
+ { return "Dokumentace členských typů"; }
/*! header that is put before the list of enumerations. */
virtual QCString trMemberEnumerationDocumentation()
- { return "Dokumentace k členským výčtům"; }
+ { return "Dokumentace členských výčtů"; }
/*! header that is put before the list of member functions. */
virtual QCString trMemberFunctionDocumentation()
- { return "Dokumentace k metodám"; }
+ { return "Dokumentace členských funkcí"; }
/*! header that is put before the list of member attributes. */
virtual QCString trMemberDataDocumentation()
{
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- return "Dokumentace k položkám";
+ return "Dokumentace položek";
}
else
{
- return "Dokumentace k datovým členům";
+ return "Dokumentace datových členů";
}
}
* parameter s is name of the project name.
*/
virtual QCString trGeneratedAutomatically(const QCString &s)
- { QCString result("Vygenerováno automaticky programem Doxygen "
- "ze zdrojových textů");
- if (!s.isEmpty()) result += QCString(" projektu ") + s;
- result += ".";
+ { QCString result="Vygenerováno automaticky programem Doxygen "
+ "ze zdrojových textů";
+ if (!s.isEmpty()) result+=" projektu "+s;
+ result+=".";
return result;
}
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
return "Následující seznam obsahuje identifikace datových "
- "struktur a jejich stručné popisy:";
+ "struktur a jejich stručné popisy:";
}
else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
{
return "Následující seznam obsahuje identifikace tříd. "
- "V seznamu jsou uvedeny jejich stručné popisy:";
+ "V seznamu jsou uvedeny jejich stručné popisy:";
}
else
{
return "Následující seznam obsahuje především identifikace "
- "tříd, ale nacházejí se zde i další netriviální prvky, "
- "jako jsou struktury (struct), unie (union) a rozhraní "
- "(interface). V seznamu jsou uvedeny jejich stručné "
- "popisy:";
+ "tříd, ale nacházejí se zde i další netriviální prvky, "
+ "jako jsou struktury (struct), unie (union) a rozhraní "
+ "(interface). V seznamu jsou uvedeny jejich stručné "
+ "popisy:";
}
}
/*! This is an introduction to the page with all class members. */
virtual QCString trCompoundMembersDescription(bool extractAll)
{
- QCString result= "Zde naleznete seznam všech ";
+ QCString result="Zde naleznete seznam všech ";
if (!extractAll)
{
- result += "dokumentovaných ";
+ result+="dokumentovaných ";
}
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- result += "položek struktur (struct) a unií (union) ";
+ result+="položek struktur (struct) a unií (union)";
}
else
{
- result += "členů tříd ";
+ result+="členů tříd";
}
- result += "s odkazy na ";
+ result+=" s odkazy na ";
if (!extractAll)
{
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- result += "dokumentaci struktur/unií, ke kterým příslušejí:";
+ result+="dokumentaci struktur/unií, ke kterým příslušejí:";
}
else
{
- result += "dokumentaci tříd, ke kterým příslušejí:";
+ result+="dokumentaci tříd, ke kterým příslušejí:";
}
}
return result;
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
result+="funkcí, proměnných, maker, výčtů a definic typů (typedef) "
- "s odkazy na ";
+ "s odkazy";
}
else
{
result+="symbolů, které jsou definovány na úrovni svých souborů. "
- "Pro každý symbol je uveden odkaz na ";
+ "Pro každý symbol je uveden odkaz";
}
-
+ result+=" na ";
if (extractAll)
result+="soubory, ke kterým příslušejí:";
else
* class hierarchy.
*/
virtual QCString trHierarchicalIndex()
- { return "Rejstřík hierarchie tříd"; }
+ { return "Rejstřík hierarchie"; }
/*! This is used in LaTeX as the title of the chapter with the
* annotated compound index.
* documentation blocks for defines
*/
virtual QCString trDefineDocumentation()
- { return "Dokumentace k definicím maker"; }
+ { return "Dokumentace definic maker"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for typedefs
virtual QCString trGeneratedAt(const QCString &date,const QCString &projName)
{
QCString result="Vygenerováno dne: "+date;
- if (!projName.isEmpty()) result += QCString(", pro projekt: ") + projName;
+ if (!projName.isEmpty()) result +=", pro projekt: "+projName;
result+=", programem";
return result;
}
/*! this text is put before a class diagram */
virtual QCString trClassDiagram(const QCString &clName)
{
- return QCString("Diagram dědičnosti pro třídu ") + clName+":";
+ return "Diagram dědičnosti pro třídu "+clName+":";
}
/*! this text is generated when the \\warning command is used. */
ClassDef::CompoundType compType,
bool isTemplate)
{
- QCString result("Dokumentace ");
+ QCString result="Dokumentace ";
if (isTemplate) result += "šablony ";
switch(compType)
{
- case ClassDef::Class: result += "třídy "; break;
- case ClassDef::Struct: result += "struktury "; break;
- case ClassDef::Union: result += "unie "; break;
- case ClassDef::Interface: result += "rozhraní "; break;
- case ClassDef::Protocol: result += "protokolu "; break;
- case ClassDef::Category: result += "kategorie "; break;
- case ClassDef::Exception: result += "výjimky "; break;
+ case ClassDef::Class: result+="třídy "; break;
+ case ClassDef::Struct: result+="struktury "; break;
+ case ClassDef::Union: result+="unie "; break;
+ case ClassDef::Interface: result+="rozhraní "; break;
+ case ClassDef::Protocol: result+="protokolu "; break;
+ case ClassDef::Category: result+="kategorie "; break;
+ case ClassDef::Exception: result+="výjimky "; break;
default: break;
}
result += clName;
/*! used as the title of the HTML page of a file */
virtual QCString trFileReference(const QCString &fileName)
{
- QCString result("Dokumentace souboru ");
+ QCString result="Dokumentace souboru ";
result+=fileName;
return result;
}
/*! used as the title of the HTML page of a namespace */
virtual QCString trNamespaceReference(const QCString &namespaceName)
{
- QCString result("Dokumentace jmenného prostoru ");
+ QCString result="Dokumentace jmenného prostoru ";
result+=namespaceName;
return result;
}
*/
virtual QCString trInheritsList(int numEntries)
{
- QCString result("Dědí z ");
+ QCString result="Dědí z ";
result += (numEntries == 1) ? "bázové třídy " : "bázových tříd ";
result += trWriteList(numEntries) + ".";
return result;
*/
virtual QCString trInheritedByList(int numEntries)
{
- QCString result("Zděděna ");
+ QCString result="Zděděna ";
result += (numEntries == 1) ? "třídou " : "třídami ";
result += trWriteList(numEntries) + ".";
return result;
*/
virtual QCString trReimplementedFromList(int numEntries)
{
- QCString result("Reimplementuje stejnojmenný prvek z ");
+ QCString result="Reimplementuje stejnojmenný prvek z ";
result += trWriteList(numEntries) + ".";
return result;
}
virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
bool single)
{ // single is true implies a single file
+ bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
QCString result="Dokumentace pro ";
switch(compType)
{
- case ClassDef::Class: result+="tuto třídu"; break;
+ case ClassDef::Class: result+=vhdlOpt?"tuto návrhovou jednotku":"tuto třídu"; break;
case ClassDef::Struct: result+="tuto strukturu"; break;
case ClassDef::Union: result+="tuto unii"; break;
case ClassDef::Interface: result+="toto rozhraní"; break;
case ClassDef::Exception: result+="tuto výjimku"; break;
default: break;
}
- result+=" byla vygenerována z ";
- if (single) result+="následujícího souboru:";
- else result+="následujících souborů:";
+ result+=" byla vygenerována z následující";
+ if (single) result+="ho souboru:";
+ else result+="ch souborů:";
return result;
}
{
return "Zobrazit dokumentaci tohoto souboru.";
}
+
+ /*! ??? Jak to prelozit? Bylo by dobre, kdyby se ozval nekdo, kdo to pouziva.*/
/*! Text for the \\pre command */
virtual QCString trPrecondition()
{
- return "Precondition";
+ return "Precondition"; // ???
}
/*! Text for the \\post command */
virtual QCString trPostcondition()
{
- return "Postcondition";
+ return "Postcondition"; // ???
}
/*! Text for the \\invariant command */
virtual QCString trInvariant()
{
- return "Invariant";
+ return "Invariant"; // ???
}
/*! Text shown before a multi-line variable/enum initialization */
virtual QCString trInitialValue()
}
virtual QCString trGotoGraphicalHierarchy()
{
- return "Zobrazit grafickou podobu hierarchie tříd";
+ return "Zobrazit grafickou podobu hierarchie";
}
virtual QCString trGotoTextualHierarchy()
{
- return "Zobrazit textovou podobu hierarchie tříd";
+ return "Zobrazit textovou podobu hierarchie";
}
virtual QCString trPageIndex()
{
}
virtual QCString trRemarks()
{
- return "Poznámky"; // ??? not checked in a context
+ return "Poznámky"; // ??? not checked in a context
}
virtual QCString trAttention()
{
- return "Upozornění"; // ??? not checked in a context
+ return "Upozornění"; // ??? not checked in a context
}
virtual QCString trInclByDepGraph()
{
}
virtual QCString trSince()
{
- return "Od"; // ??? not checked in a context
+ return "Od"; // ??? not checked in a context
}
//////////////////////////////////////////////////////////////////////////
{
return "Vysvětlivky ke grafu";
}
- /*! page explaining how the dot graph's should be interpreted */
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
virtual QCString trLegendDocs()
{
return
"Šipky (tj. hrany grafu) mají následující význam:\n"
"</p>\n"
"<ul>\n"
- "<li>Tmavě modrá šipka se používá pro označení vztahu veřejné "
+ "<li>Modrá šipka se používá pro označení vztahu veřejné "
"dědičnosti (public) mezi dvěma třídami.</li>\n"
"<li>Tmavě zelená šipka označuje vztah chráněné dědičnosti "
"(protected).</li>\n"
"(private).</li>\n"
"<li>Purpurová šipka kreslená čárkovaně se používá v případě, "
"kdy je třída obsažena v jiné třídě,\n"
- "nebo kdy je používána jinou třídou. Je označena identifikátorem "
- "jedné nebo více proměných, přes které\n"
+ "nebo kdy je používána jinou třídou. Šipka je označena "
+ "identifikátorem jedné nebo více proměnných, přes které\n"
"je třída nebo struktura zpřístupněna.</li>\n"
"<li>Žlutá šipka kreslená čárkovaně vyjadřuje vztah mezi instancí šablony "
"a šablonou třídy, na základě které byla\n"
- "instance šablony vytvořena. V popisu šipky jsou uvedeny příslušné"
- " parametry šablony.</li>\n"
+ "instance šablony vytvořena. V popisu šipky jsou uvedeny příslušné "
+ "parametry šablony.</li>\n"
"</ul>\n";
}
/*! text for the link to the legend page */
/*! Used as a section header for IDL property documentation */
virtual QCString trPropertyDocumentation()
{
- return "Dokumentace k vlastnosti";
+ return "Dokumentace vlastností";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.4
/*! Used as the title of a Java package */
virtual QCString trPackage(const QCString &name)
{
- return QCString("Balík ") + name;
+ return "Balík "+name;
}
/*! The description of the package index page */
virtual QCString trPackageListDescription()
{
- return "Zde naleznete seznam balíků se stručným popisem "
- "(pokud byl uveden):";
+ return "Zde naleznete seznam balíků se stručným popisem (pokud byl uveden):";
}
/*! The link name in the Quick links header for each page */
virtual QCString trPackages()
return result;
}
- /*! ??? Jak to prelozit? Bylo by dobre, kdyby se ozval nekdo,
- * kdo to pouziva.
- */
+ /*! ??? Jak to prelozit? Bylo by dobre, kdyby se ozval nekdo, kdo to pouziva.*/
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
}
/*! used in member documentation blocks to produce a list of
- * all members that implement this member.
+ * all members that implement this abstract member.
*/
virtual QCString trImplementedInList(int numEntries)
{
}
virtual QCString trPackageMembers()
{
- return "Členy v balíku";
+ return "Členy v balíku"; // ??? not checked in a context
}
/*! Used as a heading for a list of static Java class functions with
* package scope.
*/
virtual QCString trPackageAttribs()
{
- return "Atributy balíku";
+ return "Atributy v balíku"; // ??? not checked in a context
}
/*! Used as a heading for a list of static Java class variables with
* package scope.
*/
virtual QCString trStaticPackageAttribs()
{
- return "Statické atributy balíku";
+ return "Statické atributy v balíku"; // ??? not checked in a context
}
//////////////////////////////////////////////////////////////////////////
*/
virtual QCString trSourceFile(QCString& filename)
{
- return QCString("Zdrojový soubor ") + filename;
+ return "Zdrojový soubor " + filename;
}
//////////////////////////////////////////////////////////////////////////
* of the directories.
*/
virtual QCString trDirDocumentation()
- { return "Dokumentace k adresářům"; }
+ { return "Dokumentace adresářů"; }
/*! This is used as the title of the directory index and also in the
* Quick links of an HTML page, to link to the directory hierarchy.
* directory is passed via \a dirName.
*/
virtual QCString trDirReference(const QCString &dirName)
- {
- QCString result = "Reference k adresáři ";
- result += dirName;
- return result;
- }
+ { QCString result="Reference k adresáři "; result+=dirName; return result; }
/*! This returns the word directory with or without starting capital
* (\a first_capital) and in singular or plural form (\a singular).
virtual QCString trDir(bool first_capital, bool singular)
{
QCString result((first_capital ? "Adresář" : "adresář"));
- if (!singular)
- result += "e";
+ if (!singular) result+="e";
return result;
}
/*! This is put above each page as a link to all members of compounds (Fortran). */
virtual QCString trCompoundMembersFortran()
- { return "Datová pole"; }
+ { return "Datové položky"; }
/*! This is an introduction to the annotated compound list (Fortran). */
virtual QCString trCompoundListDescriptionFortran()
}
else
{
- result+="příslušné datové typy:";
+ result+="příslušné datové typy:";
}
return result;
}
* the documentation of all data types (Fortran).
*/
virtual QCString trTypeDocumentation()
- { return "Dokumentace k datovým typům"; }
+ { return "Dokumentace datových typů"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) subprograms (Fortran).
ClassDef::CompoundType compType,
bool isTemplate)
{
- QCString result("Dokumentace ");
+ QCString result="Dokumentace ";
if (isTemplate) result += "šablony ";
switch(compType)
{
- case ClassDef::Class: result += "třídy "; break;
- case ClassDef::Struct: result += "typu "; break;
- case ClassDef::Union: result += "unie "; break;
- case ClassDef::Interface: result += "rozhraní "; break;
- case ClassDef::Protocol: result += "protokolu "; break;
- case ClassDef::Category: result += "kategorie "; break;
- case ClassDef::Exception: result += "výjimky "; break;
+ case ClassDef::Class: result+="modulu "; break;
+ case ClassDef::Struct: result+="typu "; break;
+ case ClassDef::Union: result+="unie "; break;
+ case ClassDef::Interface: result+="rozhraní "; break;
+ case ClassDef::Protocol: result+="protokolu "; break;
+ case ClassDef::Category: result+="kategorie "; break;
+ case ClassDef::Exception: result+="výjimky "; break;
default: break;
}
- result += clName;
+ result+=clName;
return result;
-
}
/*! used as the title of the HTML page of a module (Fortran) */
virtual QCString trModuleReference(const QCString &namespaceName)
bool single)
{
// single is true implies a single file
- QCString result="Dokumentace ";
+ QCString result="Dokumentace pro ";
switch(compType)
{
- case ClassDef::Class: result+="k tomuto modulu"; break;
- case ClassDef::Struct: result+="k tomuto typu"; break;
- case ClassDef::Union: result+="k této unii"; break;
- case ClassDef::Interface: result+="k tomuto rozhraní"; break;
- case ClassDef::Protocol: result+="k tomuto protokolu"; break;
- case ClassDef::Category: result+="k této kategorii"; break;
- case ClassDef::Exception: result+="k této výjimce"; break;
+ case ClassDef::Class: result+="tento modul"; break;
+ case ClassDef::Struct: result+="tento typ"; break;
+ case ClassDef::Union: result+="tuto unii"; break;
+ case ClassDef::Interface: result+="toto rozhraní"; break;
+ case ClassDef::Protocol: result+="tento protokol"; break;
+ case ClassDef::Category: result+="tuto kategorii"; break;
+ case ClassDef::Exception: result+="tuto výjimku"; break;
default: break;
}
- result+=" byla vygenerována z ";
- if (single) result+="následujícího souboru:";
- else result+="následujících souborů:";
+ result+=" byla vygenerována z následující";
+ if (single) result+="ho souboru:";
+ else result+="ch souborů:";
return result;
}
/*! directory relation for \a name */
virtual QCString trDirRelation(const QCString &name)
{
- return "Relace " + QCString(name);
+ return "Relace "+name; // ??? not checked in a context
}
/*! Loading message shown when loading search results */
/*! Text shown when no search results are found */
virtual QCString trNoMatches()
{
- return "Nic se nenašlo";
+ return "Nebylo nic nalezeno";
}
//////////////////////////////////////////////////////////////////////////
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "po", "út", "st", "čt", "pá", "so", "ne" };
+ static const char *days_full[] = { "pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota", "neděle" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "led", "úno", "bře", "dub", "kvě", "čvn", "čvc", "srp", "zář", "říj", "lis", "pro" };
+ static const char *months_full[] = { "leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "dop.", "odp." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
/*! Header for the graph showing the directory dependencies */
virtual QCString trDirDepGraph(const QCString &name)
- { return QCString("Graf závislosti na adresářích pro ")+name+":"; }
+ { return "Graf závislosti na adresářích pro "+name+":"; } // ??? not checked in a context
//////////////////////////////////////////////////////////////////////////
// new since 1.8.0
/*! Section header for list of template parameters */
virtual QCString trTemplateParameters()
- { return "Parametry šablon"; }
+ { return "Parametry šablony"; }
/*! Used in dot graph when UML_LOOK is enabled and there are many fields */
virtual QCString trAndMore(const QCString &number)
/*! Used file list for a Java enum */
virtual QCString trEnumGeneratedFromFiles(bool single)
- { QCString result = "Dokumentace pro tento výčet byla vygenerována z ";
+ { QCString result = "Dokumentace pro tento výčet byla vygenerována z následující";
if (single)
- result += "následujícího souboru:";
+ result += "ho souboru:";
else
- result += "následujících souborů:";
+ result += "ch souborů:";
return result;
}
/*! Header of a Java enum page (Java enums are represented as classes). */
virtual QCString trEnumReference(const QCString &name)
- { return "Reference k výčtu "+QCString(name); }
+ { return "Reference k výčtu "+name; }
/*! Used for a section containing inherited members */
virtual QCString trInheritedFrom(const QCString &members,const QCString &what)
- { return QCString(members)+" dědí se z "+what; }
+ { return members+" dědí se z "+what; }
/*! Header of the sections with inherited members specific for the
* base class(es)
virtual QCString trConstantGroupReference(const QCString &namespaceName)
{
QCString result="Konstantní skupiny z ";
- result += namespaceName;
+ result+=namespaceName;
return result;
}
/** UNO IDL service page title */
virtual QCString trServiceReference(const QCString &sName)
{
QCString result="Popis služby ";
- result += sName;
+ result+=sName;
return result;
}
/** UNO IDL singleton page title */
virtual QCString trSingletonReference(const QCString &sName)
{
QCString result="Popis singletonu ";
- result += sName;
+ result+=sName;
return result;
}
/** UNO IDL service page */
virtual QCString trServiceGeneratedFromFiles(bool single)
{
// single is true implies a single file
- QCString result="Dokumentace k této službě byla vygenerována ";
- if (single) result+="z následujícího souboru:";
- else result+="z následujících souborů:";
+ QCString result="Dokumentace k této službě byla vygenerována z následující";
+ if (single) result+="ho souboru:";
+ else result+="ch souborů:";
return result;
}
/** UNO IDL singleton page */
virtual QCString trSingletonGeneratedFromFiles(bool single)
{
// single is true implies a single file
- QCString result="Dokumentace k tomuto singletonu byla vygenerována ";
- if (single) result+="z následujícího souboru:";
- else result+="z následujících souborů:";
+ QCString result="Dokumentace k tomuto singletonu byla vygenerována z následující";
+ if (single) result+="ho souboru:";
+ else result+="ch souborů:";
return result;
}
{ return "Seznam návrhových jednotek"; }
/** VHDL design unit members */
virtual QCString trDesignUnitMembers()
- { return "Seznam členů návrhových jednotky"; }
+ { return "Seznam členů návrhových jednotek"; }
/** VHDL design unit list description */
virtual QCString trDesignUnitListDescription()
{
}
}
virtual QCString trCustomReference(const QCString &name)
- { return "Dokumentace pro "+QCString(name); }
+ { return "Dokumentace pro "+name; }
/* Slice */
virtual QCString trConstants()
}
virtual QCString trCompoundReferenceSlice(const QCString &clName, ClassDef::CompoundType compType, bool isLocal)
{
- QCString result("Dokumentace ");
+ QCString result="Dokumentace";
if (isLocal) result+=" lokální";
switch(compType)
{
case ClassDef::Class: result+=" třídy "; break;
case ClassDef::Struct: result+=" struktury "; break;
case ClassDef::Union: result+=" unie "; break;
- case ClassDef::Interface: result+=" rozhraní "; break;
+ case ClassDef::Interface:
+ if (isLocal) result+="ho";
+ result+=" rozhraní "; break;
case ClassDef::Protocol:
- if (isLocal) result+="ho";
- result+=" protokolu ";
- break;
+ if (isLocal) result+="ho";
+ result+=" protokolu "; break;
case ClassDef::Category: result+=" kategorie "; break;
case ClassDef::Exception: result+=" vyjímky "; break;
default: break;
}
- result += clName;
+ result+=clName;
return result;
}
virtual QCString trOperations()
/*! used as the title of the HTML page of a C++20 concept page */
virtual QCString trConceptReference(const QCString &conceptName)
{
- QCString result("Dokumentace konceptu ");
+ QCString result="Dokumentace konceptu ";
result+=conceptName;
return result;
}
{
return "Definice konceptů";
}
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.9.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trPackageList()
+ { return "Seznam balíků"; }
};
#endif // TRANSLATOR_CZ_H
"Die Pfeile bedeuten:\n"
"</p>\n"
"<ul>\n"
- "<li>Ein dunkelblauer Pfeil stellt eine öffentliche Vererbungsbeziehung "
+ "<li>Ein blauer Pfeil stellt eine öffentliche Vererbungsbeziehung "
"zwischen zwei Klassen dar.</li>\n"
"<li>Ein dunkelgrüner Pfeil stellt geschützte Vererbung dar.</li>\n"
"<li>Ein dunkelroter Pfeil stellt private Vererbung dar.</li>\n"
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So" };
+ static const char *days_full[] = { "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez" };
+ static const char *months_full[] = { "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "ma", "ti", "on", "to", "fr", "lø", "sø" };
+ static const char *days_full[] = { "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag", "søndag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
"The arrows have the following meaning:\n"
"</p>\n"
"<ul>\n"
- "<li>%A dark blue arrow is used to visualize a public inheritance "
+ "<li>%A blue arrow is used to visualize a public inheritance "
"relation between two classes.</li>\n"
"<li>%A dark green arrow is used for protected inheritance.</li>\n"
"<li>%A dark red arrow is used for private inheritance.</li>\n"
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
+ static const char *days_full[] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+ static const char *months_full[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "lu", "ma", "me", "ĵa", "ve", "sa", "di" };
+ static const char *days_full[] = { "lundo", "mardo", "merkredo", "ĵaŭdo", "vendredo", "sabato", "dimanĉo" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "aŭg", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "januaro", "februaro", "marto", "aprilo", "majo", "junio", "julio", "aŭgusto", "septembro", "oktobro", "novembro", "decembro" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "atm", "ptm" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
* Updated to 1.8.4 by Bartomeu Creus Navarro (17-julio-2013)
*/
-class TranslatorSpanish : public TranslatorAdapter_1_8_15
+class TranslatorSpanish : public TranslatorAdapter_1_8_19
{
public:
"Las flechas tienen el siguiente significado:\n"
"</p>\n"
"<ul>\n"
- "<li>Una flecha azul oscuro es usada para visualizar una relación herencia publica entre dos clases.\n"
+ "<li>Una azul oscuro es usada para visualizar una relación herencia publica entre dos clases.\n"
"<li>Una flecha verde oscuro es usada para herencia protegida.\n"
"<li>Una flecha rojo oscuro es usada para herencia privada.\n"
"<li>Una flecha segmentada púrpura se usa si la clase es contenida o "
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "lu.", "ma.", "mi.", "ju.", "vi.", "sá.", "do." };
+ static const char *days_full[] = { "lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "domingo" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "ene.", "feb.", "mar.", "abr.", "may.", "jun.", "jul.", "ago.", "sep.", "oct.", "nov.", "dic." };
+ static const char *months_full[] = { "enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "a. m.", "p. m." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return convertDigitsToFarsi(sdate);
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه", "يكشنبه" };
+ static const char *days_full[] = { "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه", "يكشنبه" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "ژانويه", "فوريه", "مارس", "آوريل", "مه", "ژوئن", "ژوئيه", "اوت", "سپتامبر", "اُكتبر", "نوامبر", "دسامبر" };
+ static const char *months_full[] = { "ژانويه", "فوريه", "مارس", "آوريل", "مه", "ژوئن", "ژوئيه", "اوت", "سپتامبر", "اُكتبر", "نوامبر", "دسامبر" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "قبلازظهر", "بعدازظهر" };
+ return dayPeriod[period];
+ }
};
return "Tyyppien rajoitteet"; // "Type Constraints"
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "ma", "ti", "ke", "to", "pe", "la", "su" };
+ static const char *days_full[] = { "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "tammi", "helmi", "maalis", "huhti", "touko", "kesä", "heinä", "elo", "syys", "loka", "marras", "joulu" };
+ static const char *months_full[] = { "tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "ap.", "ip." };
+ return dayPeriod[period];
+ }
};
#endif
// Translator class (by the local maintainer) when the localized
// translator is made up-to-date again.
-class TranslatorFrench : public TranslatorAdapter_1_8_15
+class TranslatorFrench : public TranslatorAdapter_1_8_19
{
public:
"</ul>\n"
"Les flèches ont la signification suivante :\n"
"<ul>\n"
- "<li>Une flèche bleu foncé est utilisée pour visualiser une relation d'héritage publique "
+ "<li>Une bleu foncé est utilisée pour visualiser une relation d'héritage publique "
"entre deux classes.\n"
"<li>Une flèche vert foncé est utilisée pour une relation d'héritage protégée.\n"
"<li>Une flèche rouge foncé est utilisée pour une relation d'héritage privée.\n"
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "lun.", "mar.", "mer.", "jeu.", "ven.", "sam.", "dim." };
+ static const char *days_full[] = { "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc." };
+ static const char *months_full[] = { "janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ" };
+ static const char *days_full[] = { "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο", "Κυριακή" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Ιαν", "Φεβ", "Μαρ", "Απρ", "Μαϊ", "Ιουν", "Ιουλ", "Αυγ", "Σεπ", "Οκτ", "Νοε", "Δεκ" };
+ static const char *months_full[] = { "Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "π.μ.", "μ.μ." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
* instantiations = उदाहरणीकरणगण
* interface = अंतराफलक
* interfaces = अंतराफलकगण
- * inherit =
+ * inherit =
* inheritance = वरासत
* inherited = वरासित
* library = संग्रह
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "सोम.", "मंगल.", "बुध.", "गुरु.", "शुक्र.", "शनि.", "रवि." };
+ static const char *days_full[] = { "सोमवार", "मंगलवार", "बुधवार", "गुरुवार", "शुक्रवार", "शनिवार", "रविवार" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "जनवरी", "फरवरी", "मार्च", "अप्रैल", "मई", "जून", "जुलाई", "अगस्त", "सितम्बर", "अक्तूबर", "नवम्बर", "दिसम्बर" };
+ static const char *months_full[] = { "जनवरी", "फरवरी", "मार्च", "अप्रैल", "मई", "जून", "जुलाई", "अगस्त", "सितम्बर", "अक्तूबर", "नवम्बर", "दिसम्बर" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "am", "pm" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "pon", "uto", "sri", "čet", "pet", "sub", "ned" };
+ static const char *days_full[] = { "ponedjeljak", "utorak", "srijeda", "četvrtak", "petak", "subota", "nedjelja" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "sij", "vlj", "ožu", "tra", "svi", "lip", "srp", "kol", "ruj", "lis", "stu", "pro" };
+ static const char *months_full[] = { "siječanj", "veljača", "ožujak", "travanj", "svibanj", "lipanj", "srpanj", "kolovoz", "rujan", "listopad", "studeni", "prosinac" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
+
+
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
//////////////////////////////////////////////////////////////////////////
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "H", "K", "Sze", "Cs", "P", "Szo", "V" };
+ static const char *days_full[] = { "hétfő", "kedd", "szerda", "csütörtök", "péntek", "szombat", "vasárnap" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan.", "febr.", "márc.", "ápr.", "máj.", "jún.", "júl.", "aug.", "szept.", "okt.", "nov.", "dec." };
+ static const char *months_full[] = { "január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "de.", "du." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Sen", "Sel", "Rab", "Kam", "Jum", "Sab", "Min" };
+ static const char *days_full[] = { "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu" };
+ return full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des" };
+ static const char *months_full[] = { "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember" };
+ return full? months_full[month-1] : months_short[month-1];
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "lun", "mar", "mer", "gio", "ven", "sab", "dom" };
+ static const char *days_full[] = { "lunedì", "martedì", "mercoledì", "giovedì", "venerdì", "sabato", "domenica" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic" };
+ static const char *months_full[] = { "gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "月", "火", "水", "木", "金", "土", "日" };
+ static const char *days_full[] = { "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" };
+ static const char *months_full[] = { "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "午前", "午後" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "월", "화", "수", "목", "금", "토", "일" };
+ static const char *days_full[] = { "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" };
+ static const char *months_full[] = { "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "오전", "오후" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "pr", "an", "tr", "kt", "pn", "št", "sk" };
+ static const char *days_full[] = { "pirmadienis", "antradienis", "trečiadienis", "ketvirtadienis", "penktadienis", "šeštadienis", "sekmadienis" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "saus.", "vas.", "kov.", "bal.", "geg.", "birž.", "liep.", "rugp.", "rugs.", "spal.", "lapkr.", "gruod." };
+ static const char *months_full[] = { "sausis", "vasaris", "kovas", "balandis", "gegužė", "birželis", "liepa", "rugpjūtis", "rugsėjis", "spalis", "lapkritis", "gruodis" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "priešpiet", "popiet" };
+ return dayPeriod[period];
+ }
};
#endif
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "pirmd.", "otrd.", "trešd.", "ceturtd.", "piektd.", "sestd.", "svētd." };
+ static const char *days_full[] = { "pirmdiena", "otrdiena", "trešdiena", "ceturtdiena", "piektdiena", "sestdiena", "svētdiena" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "janv.", "febr.", "marts", "apr.", "maijs", "jūn.", "jūl.", "aug.", "sept.", "okt.", "nov.", "dec." };
+ static const char *months_full[] = { "janvāris", "februāris", "marts", "aprīlis", "maijs", "jūnijs", "jūlijs", "augusts", "septembris", "oktobris", "novembris", "decembris" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "priekšp.", "pēcp." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
return "Ограничувања на Тип";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "пон.", "вт.", "сре.", "чет.", "пет.", "саб.", "нед." };
+ static const char *days_full[] = { "понеделник", "вторник", "среда", "четврток", "петок", "сабота", "недела" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "јан.", "фев.", "мар.", "апр.", "мај", "јун.", "јул.", "авг.", "септ.", "окт.", "ноем.", "дек." };
+ static const char *months_full[] = { "јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "претпл.", "попл." };
+ return dayPeriod[period];
+ }
};
#endif
"</ul>\n"
"De pijlen hebben de volgende betekenis:\n"
"<ul>\n"
- "<li>Een donkerblauwe pijl visualizeert een public inheritance "
+ "<li>Een blauwe pijl visualizeert een public inheritance "
"relatie tussen twee klassen.\n"
"<li>Een donkergroene pijl wordt gebruikt voor protected inheritance.\n"
"<li>Een donkerrode pijl wordt gebruikt voor private inheritance.\n"
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "ma", "di", "wo", "do", "vr", "za", "zo" };
+ static const char *days_full[] = { "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag", "zondag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "a.m.", "p.m." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
"funksjonen ovenfor i argument(ene) den aksepterer.";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "må.", "ty.", "on.", "to.", "fr.", "la.", "sø." };
+ static const char *days_full[] = { "måndag", "tysdag", "onsdag", "torsdag", "fredag", "laurdag", "søndag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "des" };
+ static const char *months_full[] = { "januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "f.m.", "e.m." };
+ return dayPeriod[period];
+ }
};
#endif
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "pon.", "wt.", "śr.", "czw.", "pt.", "sob.", "niedz." };
+ static const char *days_full[] = { "poniedziałek", "wtorek", "środa", "czwartek", "piątek", "sobota", "niedziela" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "paź", "lis", "gru" };
+ static const char *months_full[] = { "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
* VERSION HISTORY
* ---------------
* History:
+ * 20220525:
+ * - Updated to 1.9.4;
* 20211003:
* - Updated to 1.9.3;
* 20200112:
#define TRANSLATOR_PT_H
-class TranslatorPortuguese : public TranslatorAdapter_1_9_4
+class TranslatorPortuguese : public Translator
{
public:
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "seg", "ter", "qua", "qui", "sex", "sáb", "dom" };
+ static const char *days_full[] = { "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado", "domingo" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez" };
+ static const char *months_full[] = { "janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
{
return "Definição de conceito";
}
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.9.4
+ //////////////////////////////////////////////////////////////////////////
+ virtual QCString trPackageList()
+ { return "Lista de pacotes"; }
};
#endif
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "lun.", "mar.", "mie.", "joi", "vin.", "sâm.", "dum." };
+ static const char *days_full[] = { "luni", "mar?i", "miercuri", "joi", "vineri", "sâmbătă", "duminică" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "ian.", "feb.", "mar.", "apr.", "mai", "iun.", "iul.", "aug.", "sept.", "oct.", "nov.", "dec." };
+ static const char *months_full[] = { "ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "a.m.", "p.m." };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс" };
+ static const char *days_full[] = { "понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек" };
+ static const char *months_full[] = { "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
///////////////////////////////////////////////////////////////////////
// new since 1.7.5
return "Ограничења типова";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "пон", "уто", "сри", "чет", "пет", "суб", "нед" };
+ static const char *days_full[] = { "Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота", "Недеља" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Јан", "Феб", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", " новембар", "дец" };
+ static const char *months_full[] = { "јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", " Новембар Децембар" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "пре подне", "по подне" };
+ return dayPeriod[period];
+ }
};
#endif
"samo v številu in/ali tipu formalnih argumentov.";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "pon.", "tor.", "sre.", "čet.", "pet.", "sob.", "ned." };
+ static const char *days_full[] = { "ponedeljek", "torek", "sreda", "četrtek", "petek", "sobota", "nedelja" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan.", "feb.", "mar.", "apr.", "maj", "jun.", "jul.", "avg.", "sep.", "okt.", "nov.", "dec." };
+ static const char *months_full[] = { "januar", "februar", "marec", "april", "maj", "junij", "julij", "avgust", "september", "oktober", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "dop.", "pop." };
+ return dayPeriod[period];
+ }
};
#endif
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "po", "ut", "st", "št", "pi", "so", "ne" };
+ static const char *days_full[] = { "pondelok", "utorok", "streda", "štvrtok", "piatok", "sobota", "nedeľa" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "máj", "jún", "júl", "aug", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "január", "február", "marec", "apríl", "máj", "jún", "júl", "august", "september", "október", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "AM", "PM" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
return "Interfejsi"; //!< Radna okruzenja. Ali to je dve reci.
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "pon", "uto", "sre", "čet", "pet", "sub", "ned" };
+ static const char *days_full[] = { "ponedeljak", "utorak", "sreda", "četvrtak", "petak", "subota", "nedelja" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "avg", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "januar", "februar", "mart", "april", "maj", "jun", "jul", "avgust", "septembar", "oktobar", "novembar", "decembar" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "pre podne", "po podne" };
+ return dayPeriod[period];
+ }
};
#endif
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "mån", "tis", "ons", "tor", "fre", "lör", "sön" };
+ static const char *days_full[] = { "måndag", "tisdag", "onsdag", "torsdag", "fredag", "lördag", "söndag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec" };
+ static const char *months_full[] = { "januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "fm", "em" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz" };
+ static const char *days_full[] = { "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara" };
+ static const char *months_full[] = { "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "ÖÖ", "ÖS" };
+ return dayPeriod[period];
+ }
};
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "周一", "周二", "周三", "周四", "周五", "周六", "周日" };
+ static const char *days_full[] = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" };
+ static const char *months_full[] = { "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "上午", "下午" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
}
return sdate;
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Нд" };
+ static const char *days_full[] = { "понеділок", "вівторок", "середа", "четвер", "п'ятниця", "субота", "неділя" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру" };
+ static const char *months_full[] = { "січень", "лютий", "березень", "квітень", "травень", "червень", "липень", "серпень", "вересень", "жовтень", "листопад", "грудень" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "дп", "пп" };
+ return dayPeriod[period];
+ }
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
return "Ràng buộc của kiểu (Type)";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool, bool full)
+ {
+ static const char *days_short[] = { "T2", "T3", "T4", "T5", "T6", "T7", "CN" };
+ static const char *days_full[] = { "Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ return text;
+ }
+ virtual QCString trMonth(int month, bool, bool full)
+ {
+ static const char *months_short[] = { "Thg1", "Thg2", "Thg3", "Thg4", "Thg5", "Thg6", "Thg7", "Thg8", "Thg9", "Thg10", "Thg11", "Thg12" };
+ static const char *months_full[] = { "Tháng Giêng", "Tháng Hai", "Tháng Ba", "Tháng Tư", "Tháng Năm", "Tháng Sáu", "Tháng Bảy", "Tháng Tám", "Tháng Chín", "Tháng Mười", "Tháng Mười Một", "Tháng Mười Hai" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "SA", "CH" };
+ return dayPeriod[period];
+ }
};
#endif
return "Tipe Limiete";
}
+ virtual QCString trDayOfWeek(int dayOfWeek, bool first_capital, bool full)
+ {
+ static const char *days_short[] = { "Ma.", "Di.", "Wo.", "Do.", "Vr.", "Sa.", "So." };
+ static const char *days_full[] = { "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrydag", "Saterdag", "Sondag" };
+ QCString text = full? days_full[dayOfWeek-1] : days_short[dayOfWeek-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trMonth(int month, bool first_capital, bool full)
+ {
+ static const char *months_short[] = { "Jan.", "Feb.", "Mrt.", "Apr.", "Mei", "Jun.", "Jul.", "Aug.", "Sep.", "Okt.", "Nov.", "Des." };
+ static const char *months_full[] = { "Januarie", "Februarie", "Maart", "April", "Mei", "Junie", "Julie", "Augustus", "September", "Oktober", "November", "Desember" };
+ QCString text = full? months_full[month-1] : months_short[month-1];
+ if (first_capital) return text.mid(0,1).upper()+text.mid(1);
+ else return text;
+ }
+ virtual QCString trDayPeriod(int period)
+ {
+ static const char *dayPeriod[] = { "vm.", "nm." };
+ return dayPeriod[period];
+ }
};
#endif
FortranFormat_Fixed
};
+
class LocalToc
{
public:
#include "dir.h"
#include "utf8.h"
#include "textstream.h"
+#include "indexlist.h"
+#include "datetime.h"
#define ENABLE_TRACINGSUPPORT 0
int guessSection(const QCString &name)
{
QCString n=name.lower();
- if (n.right(2)==".c" || // source
- n.right(3)==".cc" ||
- n.right(4)==".cxx" ||
- n.right(4)==".cpp" ||
- n.right(4)==".c++" ||
- n.right(5)==".java" ||
- n.right(2)==".m" ||
- n.right(3)==".mm" ||
- n.right(3)==".ii" || // inline
- n.right(4)==".ixx" ||
- n.right(4)==".ipp" ||
- n.right(4)==".i++" ||
- n.right(4)==".inl" ||
- n.right(4)==".xml" ||
- n.right(4)==".lex" ||
- n.right(4)==".sql"
- ) return Entry::SOURCE_SEC;
- if (n.right(2)==".h" || // header
- n.right(3)==".hh" ||
- n.right(4)==".hxx" ||
- n.right(4)==".hpp" ||
- n.right(4)==".h++" ||
- n.right(4)==".idl" ||
- n.right(4)==".ddl" ||
- n.right(5)==".pidl" ||
- n.right(4)==".ice"
- ) return Entry::HEADER_SEC;
+ static const std::unordered_set<std::string> sourceExt = {
+ "c","cc","cxx","cpp","c++", // C/C++
+ "java", // Java
+ "cs", // C#
+ "m","mm", // Objective-C
+ "ii","ixx","ipp","i++","inl", // C/C++ inline
+ "xml","lex","sql" // others
+ };
+ static const std::unordered_set<std::string> headerExt = {
+ "h", "hh", "hxx", "hpp", "h++" // C/C++ header
+ "idl", "ddl", "pidl", "ice" // IDL like
+ };
+ int lastDot = n.findRev('.');
+ if (lastDot!=-1)
+ {
+ QCString extension = n.mid(lastDot+1); // part after the last dot
+ if (sourceExt.find(extension.str())!=sourceExt.end())
+ {
+ return Entry::SOURCE_SEC;
+ }
+ if (headerExt.find(extension.str())!=headerExt.end())
+ {
+ return Entry::HEADER_SEC;
+ }
+ }
return 0;
}
}
-int computeQualifiedIndex(const QCString &name)
-{
- int i = name.find('<');
- return name.findRev("::",i==-1 ? name.length() : i);
-}
-
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
size_t strLen = txtStr.length();
if (strLen==0) return;
- static const reg::Ex regExp(R"((::)?\a[\w~!\\.:$]*)");
+ static const reg::Ex regExp(R"((::)?\a[\w~!\\.:$"]*)");
reg::Iterator it(txtStr,regExp);
reg::Iterator end;
for (size_t i=index;i<newIndex;i++)
{
if (txtStr.at(i)=='"') insideString=!insideString;
+ if (txtStr.at(i)=='\\') i++; // skip next character it is escaped
}
//printf("floatingIndex=%d strlen=%d autoBreak=%d\n",floatingIndex,strLen,autoBreak);
if (md!=self && (self==0 || md->name()!=self->name()))
// name check is needed for overloaded members, where getDefs just returns one
{
- /* in case of Fortran scop and the variable is a non Fortran variable: don't link,
+ /* in case of Fortran scope and the variable is a non Fortran variable: don't link,
* see also getLink in fortrancode.l
*/
if (!(scope && (scope->getLanguage() == SrcLangExt_Fortran) && md->isVariable() && (md->getLanguage() != SrcLangExt_Fortran)))
else
{
/* remove surrounding double quotes */
- if ((filterName.right(1) == "\"") && (filterName.left(1) == "\""))
+ if (filterName.length()>=2 && filterName[0]=='"' && filterName[filterName.length()-1]=='"')
{
- filterName.remove(filterName.length() - 1, 1);
- filterName.remove(0, 1);
+ filterName = filterName.mid(1,filterName.length()-2);
}
return filterName;
}
}
-QCString transcodeCharacterStringToUTF8(const QCString &input)
+QCString transcodeCharacterStringToUTF8(const QCString &inputEncoding, const QCString &input)
{
bool error=FALSE;
- QCString inputEncoding = Config_getString(INPUT_ENCODING);
const char *outputEncoding = "UTF-8";
if (inputEncoding.isEmpty() || qstricmp(inputEncoding,outputEncoding)==0) return input;
int inputSize=input.length();
qPrint(inputEncoding),outputEncoding,qPrint(input));
error=TRUE;
}
+ portable_iconv_close(cd);
}
- portable_iconv_close(cd);
return error ? input : output;
}
return "";
}
-static std::tm getCurrentDateTime()
-{
- QCString sourceDateEpoch = Portable::getenv("SOURCE_DATE_EPOCH");
- if (!sourceDateEpoch.isEmpty()) // see https://reproducible-builds.org/specs/source-date-epoch/
- {
- bool ok;
- uint64 epoch = sourceDateEpoch.toUInt64(&ok);
- if (!ok)
- {
- static bool warnedOnce=FALSE;
- if (!warnedOnce)
- {
- warn_uncond("Environment variable SOURCE_DATE_EPOCH does not contain a valid number; value is '%s'\n",
- qPrint(sourceDateEpoch));
- warnedOnce=TRUE;
- }
- }
- else // use given epoch value as current 'built' time
- {
- auto epoch_start = std::chrono::time_point<std::chrono::system_clock>{};
- auto epoch_seconds = std::chrono::seconds(epoch);
- auto build_time = epoch_start + epoch_seconds;
- std::time_t time = std::chrono::system_clock::to_time_t(build_time);
- return *gmtime(&time);
- }
- }
-
- // return current local time
- auto now = std::chrono::system_clock::now();
- std::time_t time = std::chrono::system_clock::to_time_t(now);
- return *localtime(&time);
-}
-
-QCString dateToString(bool includeTime)
-{
- auto current = getCurrentDateTime();
- return theTranslator->trDateTime(current.tm_year + 1900,
- current.tm_mon + 1,
- current.tm_mday,
- (current.tm_wday+6)%7+1, // map: Sun=0..Sat=6 to Mon=1..Sun=7
- current.tm_hour,
- current.tm_min,
- current.tm_sec,
- includeTime);
-}
-
-QCString yearToString()
-{
- auto current = getCurrentDateTime();
- return QCString().setNum(current.tm_year+1900);
-}
-
void trimBaseClassScope(const BaseClassList &bcl,QCString &s,int level=0)
{
//printf("trimBaseClassScope level=%d '%s'\n",level,qPrint(s));
}
}
+//---------------------------------------------------------------------------------------
+
static void findMembersWithSpecificName(const MemberName *mn,
const QCString &args,
bool checkStatics,
}
}
+//---------------------------------------------------------------------------------------
+
+bool getDefsNew(const QCString &scName,
+ const QCString &mbName,
+ const QCString &args,
+ const MemberDef *&md,
+ const ClassDef *&cd,
+ const FileDef *&fd,
+ const NamespaceDef *&nd,
+ const GroupDef *&gd,
+ bool forceEmptyScope,
+ const FileDef *currentFile,
+ bool checkCV
+ )
+{
+ fd=0, md=0, cd=0, nd=0, gd=0;
+ if (mbName.isEmpty()) return false;
+
+ //printf("@@ --- getDefsNew(%s,%s)-----------\n",qPrint(scName),qPrint(mbName));
+ const Definition *scope = Doxygen::globalScope;
+ SymbolResolver resolver;
+ if (currentFile) resolver.setFileScope(currentFile);
+ if (!scName.isEmpty())
+ {
+ scope = resolver.resolveSymbol(scope,scName);
+ }
+ if (scope==Doxygen::globalScope)
+ {
+ scope = currentFile;
+ }
+ //printf("@@ -> found scope scope=%s member=%s out=%s\n",qPrint(scName),qPrint(mbName),qPrint(scope?scope->name():""));
+ //
+ const Definition *symbol = resolver.resolveSymbol(scope,mbName,args,checkCV);
+ //printf("@@ -> found symbol in=%s out=%s\n",qPrint(mbName),qPrint(symbol?symbol->qualifiedName():QCString()));
+ if (symbol && symbol->definitionType()==Definition::TypeMember)
+ {
+ md = toMemberDef(symbol);
+ cd = md->getClassDef();
+ if (cd==0) nd = md->getNamespaceDef();
+ if (cd==0 && nd==0) fd = md->getFileDef();
+ gd = md->getGroupDef();
+ }
+ return md!=0;
+}
+
/*!
* Searches for a member definition given its name 'memberName' as a string.
* memberName may also include a (partial) scope to indicate the scope
* - if 'fd' is non zero, the member was found in the global namespace of
* file fd.
*/
-bool getDefs(const QCString &scName,
+bool getDefsOld(const QCString &scName,
const QCString &mbName,
const QCString &args,
const MemberDef *&md,
)
{
fd=0, md=0, cd=0, nd=0, gd=0;
- if (mbName.isEmpty()) return FALSE; /* empty name => nothing to link */
+ bool result = FALSE;
+ QCString scopeName;
+ QCString memberName;
+ QCString mName;
+ QCString mScope;
+ MemberName *mn = 0;
+ int is,im=0,pm=0;
+
+ if (mbName.isEmpty()) goto exit; /* empty name => nothing to link */
- QCString scopeName=scName;
- QCString memberName=mbName;
- scopeName = substitute(scopeName,"\\","::"); // for PHP
+ scopeName = scName;
+ scopeName = substitute(scopeName,"\\","::"); // for PHP
+ memberName = mbName;
memberName = substitute(memberName,"\\","::"); // for PHP
//printf("Search for name=%s args=%s in scope=%s forceEmpty=%d\n",
// qPrint(memberName),qPrint(args),qPrint(scopeName),forceEmptyScope);
- int is,im=0,pm=0;
// strip common part of the scope from the scopeName
while ((is=scopeName.findRev("::"))!=-1 &&
(im=memberName.find("::",pm))!=-1 &&
//printf("result after scope corrections scope=%s name=%s\n",
// qPrint(scopeName), qPrint(memberName));
- QCString mName=memberName;
- QCString mScope;
- if (memberName.left(9)!="operator " && // treat operator conversion methods
+ mName=memberName;
+ if (!memberName.startsWith("operator ") && // treat operator conversion methods
// as a special case
(im=memberName.findRev("::"))!=-1 &&
im<static_cast<int>(memberName.length())-2 // not A::
//printf("mScope='%s' mName='%s'\n",qPrint(mScope),qPrint(mName));
- MemberName *mn = Doxygen::memberNameLinkedMap->find(mName);
+ mn = Doxygen::memberNameLinkedMap->find(mName);
//printf("mName=%s mn=%p\n",qPrint(mName),mn);
if ((!forceEmptyScope || scopeName.isEmpty()) && // this was changed for bug638856, forceEmptyScope => empty scopeName
{
md=0; // avoid returning things we cannot link to
cd=0;
- return FALSE; // match found, but was not linkable
+ result=FALSE; // match found, but was not linkable
+ goto exit;
}
else
{
gd=md->getGroupDef();
if (gd) cd=0;
- return TRUE; /* found match */
+ result=TRUE; /* found match */
+ goto exit;
}
}
}
{
cd=tmd->getClassDef();
md=emd;
- return TRUE;
+ result=TRUE;
+ goto exit;
}
else
{
cd=0;
md=0;
- return FALSE;
+ result=FALSE;
+ goto exit;
}
}
}
{
md = fuzzy_mmd;
cd = fuzzy_mmd->getClassDef();
- return TRUE;
+ result=TRUE;
+ goto exit;
}
}
{
md=0;
cd=0;
- return FALSE;
+ result=FALSE;
+ goto exit;
}
}
else if (mmd->getOuterScope()==fnd /* && mmd->isLinkable() */ )
{
md=0; // avoid returning things we cannot link to
nd=0;
- return FALSE; // match found but not linkable
+ result=FALSE; // match found but not linkable
+ goto exit;
}
else
{
gd=md->resolveAlias()->getGroupDef();
if (gd && gd->isLinkable()) nd=0; else gd=0;
- return TRUE;
+ result=TRUE;
+ goto exit;
}
}
}
if (gd && gd->isLinkable()) fd=0; else gd=0;
//printf("Found scoped enum %s fd=%p gd=%p\n",
// qPrint(mmd->name()),fd,gd);
- return TRUE;
+ result=TRUE;
+ goto exit;
}
}
}
gd=md->getGroupDef();
//printf("fd=%p gd=%p gd->isLinkable()=%d\n",fd,gd,gd->isLinkable());
if (gd && gd->isLinkable()) fd=0; else gd=0;
- return TRUE;
+ result=TRUE;
+ goto exit;
}
}
}
- // no nothing found
- return FALSE;
+exit:
+ return result;
+}
+
+bool getDefs(const QCString &scName,
+ const QCString &mbName,
+ const QCString &args,
+ const MemberDef *&md,
+ const ClassDef *&cd,
+ const FileDef *&fd,
+ const NamespaceDef *&nd,
+ const GroupDef *&gd,
+ bool forceEmptyScope,
+ const FileDef *currentFile,
+ bool checkCV
+ )
+{
+ if (false) // set this to true to try the old and new routine side-by-side and compare the results
+ {
+ printf("@@ ------ getDefsOld start\n");
+ bool result = getDefsOld(scName,mbName,args,md,cd,fd,nd,gd,forceEmptyScope,currentFile,checkCV);
+ printf("@@ ------ getDefsOld end\n");
+ const MemberDef *nmd = 0;
+ const ClassDef *ncd = 0;
+ const FileDef *nfd = 0;
+ const NamespaceDef *nnd = 0;
+ const GroupDef *ngd = 0;
+ printf("@@ ------ getDefsNew start\n");
+ bool newResult = getDefsNew(scName,mbName,args,
+ nmd,ncd,nfd,nnd,ngd,
+ forceEmptyScope,currentFile,checkCV);
+ printf("@@ ------ getDefsNew end\n");
+ if (result!=newResult || nmd!=md || ncd!=cd || nfd!=fd || nnd!=nd || ngd!=gd)
+ {
+ printf("@@ getDefsOld(scName=%s, mbName=%s, args=%s, forceEmptyScope=%d "
+ "currentFile=%s checkCV=%d)=%d md=%s (%p) cd=%s fd=%s nd=%s gd=%s\n",
+ qPrint(scName), qPrint(mbName), qPrint(args),
+ forceEmptyScope, qPrint(currentFile?currentFile->name():QCString()),
+ checkCV,
+ result,
+ qPrint(md?md->name():QCString()),
+ (void*)md,
+ qPrint(cd?cd->name():QCString()),
+ qPrint(fd?fd->name():QCString()),
+ qPrint(nd?nd->name():QCString()),
+ qPrint(gd?gd->name():QCString())
+ );
+ printf("@@ ------ getDefsOld start\n");
+ printf("@@ getDefsNew(scName=%s, mbName=%s, args=%s, forceEmptyScope=%d "
+ "currentFile=%s checkCV=%d)=%d md=%s (%p) cd=%s fd=%s nd=%s gd=%s\n",
+ qPrint(scName), qPrint(mbName), qPrint(args),
+ forceEmptyScope, qPrint(currentFile?currentFile->name():QCString()),
+ checkCV,
+ newResult,
+ qPrint(nmd?nmd->name():QCString()),
+ (void*)nmd,
+ qPrint(ncd?ncd->name():QCString()),
+ qPrint(nfd?nfd->name():QCString()),
+ qPrint(nnd?nnd->name():QCString()),
+ qPrint(ngd?ngd->name():QCString())
+ );
+ }
+ return result; // use return newResult to use the result of the new routine
+ }
+ else // do one of the two getDefs routines (comment out the other one)
+ {
+ return getDefsNew(scName,mbName,args,md,cd,fd,nd,gd,forceEmptyScope,currentFile,checkCV);
+ //return getDefsOld(scName,mbName,args,md,cd,fd,nd,gd,forceEmptyScope,currentFile,checkCV);
+ }
}
+
/*!
* Searches for a scope definition given its name as a string via parameter
* `scope`.
int bracePos=findParameterList(fullName);
int endNamePos=bracePos!=-1 ? bracePos : fullName.length();
int scopePos=fullName.findRev("::",endNamePos);
- bool explicitScope = fullName.left(2)=="::" && // ::scope or #scope
- (scopePos>2 || // ::N::A
- tsName.left(2)=="::" || // ::foo in local scope
- scName==0 // #foo in global scope
+ bool explicitScope = fullName.startsWith("::") && // ::scope or #scope
+ (scopePos>2 || // ::N::A
+ tsName.startsWith("::") || // ::foo in local scope
+ scName==0 // #foo in global scope
);
// default result values
result = substitute(result,"$projectnumber",projNum);
result = substitute(result,"$projectbrief",projBrief);
result = substitute(result,"$projectlogo",stripPath(Config_getString(PROJECT_LOGO)));
+ result = substitute(result,"$langISO",theTranslator->trISOLang());
return result;
}
}
#endif
+bool getCaseSenseNames()
+{
+ auto caseSenseNames = Config_getEnum(CASE_SENSE_NAMES);
+
+ if (caseSenseNames == CASE_SENSE_NAMES_t::YES) return true;
+ else if (caseSenseNames == CASE_SENSE_NAMES_t::NO) return false;
+ else return Portable::fileSystemIsCaseSensitive();
+}
+
// note that this function is not reentrant due to the use of static growBuf!
QCString escapeCharsInString(const QCString &name,bool allowDots,bool allowUnderscore)
{
if (name.isEmpty()) return name;
- bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
+ bool caseSenseNames = getCaseSenseNames();
bool allowUnicodeNames = Config_getBool(ALLOW_UNICODE_NAMES);
GrowBuf growBuf;
signed char c;
QCString unescapeCharsInString(const QCString &s)
{
if (s.isEmpty()) return s;
- bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
+ bool caseSenseNames = getCaseSenseNames();
QCString result;
const char *p = s.data();
if (p)
}
//printf("extractNamespace '%s' => '%s|%s'\n",qPrint(scopeName),
// qPrint(className),qPrint(namespaceName));
- if (/*className.right(2)=="-g" ||*/ className.right(2)=="-p")
+ if (className.endsWith("-p"))
{
className = className.left(className.length()-2);
}
if (lang == SrcLangExt_Fortran)
{
if (type[pos]==',') return -1;
- if (QCString(type).left(4).lower()!="type")
+ if (!type.lower().startsWith("type"))
{
re = &re_fortran;
}
{
actArg = *actIt;
}
- if (formArg.type.left(6)=="class " && formArg.name.isEmpty())
+ if (formArg.type.startsWith("class ") && formArg.name.isEmpty())
{
formArg.name = formArg.type.mid(6);
formArg.type = "class";
}
- if (formArg.type.left(9)=="typename " && formArg.name.isEmpty())
+ if (formArg.type.startsWith("typename ") && formArg.name.isEmpty())
{
formArg.name = formArg.type.mid(9);
formArg.type = "typename";
}
- if (formArg.type=="class" || formArg.type=="typename" || formArg.type.left(8)=="template")
+ if (formArg.type=="class" || formArg.type=="typename" || formArg.type.startsWith("template"))
{
//printf("n=%s formArg->type='%s' formArg->name='%s' formArg->defval='%s'\n",
// qPrint(n),qPrint(formArg->type),qPrint(formArg->name),qPrint(formArg->defval));
if (newPage) // new page
{
QCString baseName=name;
- if (baseName.right(4)==".tex")
+ if (baseName.endsWith(".tex"))
baseName=baseName.left(baseName.length()-4);
else if (baseName.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension)
baseName=baseName.left(baseName.length()-Doxygen::htmlFileExtension.length());
if (name.isEmpty())
return 0; // no name was given
- auto range = Doxygen::symbolMap->find(name);
- if (range.first==range.second)
+ auto &range = Doxygen::symbolMap->find(name);
+ if (range.empty())
return 0; // could not find any matching symbols
// mostly copied from getResolvedClassRec()
int minDistance = 10000;
MemberDef *bestMatch = 0;
- for (auto it=range.first; it!=range.second; ++it)
+ for (Definition *d : range)
{
- Definition *d = it->second;
if (d->definitionType()==Definition::TypeMember)
{
SymbolResolver resolver(fileScope);
static QCString expandAliasRec(StringUnorderedSet &aliasesProcessed,const QCString &s,bool allowRecursion)
{
QCString result;
- static const reg::Ex re(R"([\\@](\a\w*))");
+ static const reg::Ex re(R"([\\@](\a[\w-]*))");
std::string str = s.str();
reg::Match match;
size_t p = 0;
result+=s.right(s.length()-p);
//printf("expandAliases '%s'->'%s'\n",s.data(),result.data());
+ if (result == s)
+ {
+ std::string orgStr = s.str();
+ int ridx = orgStr.rfind('-');
+ if (ridx != -1) return expandAliasRec(aliasesProcessed,s.left(ridx),allowRecursion) + s.right(s.length() - ridx);
+ }
+
return result;
}
{
// do character transcoding if needed.
transcodeCharacterBuffer(fileName,inBuf,inBuf.curPos(),
- Config_getString(INPUT_ENCODING),"UTF-8");
+ getEncoding(fi),"UTF-8");
}
//inBuf.addChar('\n'); /* to prevent problems under Windows ? */
return QCString(tf);
}
-//----------------------------------------------------------------------------
-// returns TRUE if the name of the file represented by 'fi' matches
-// one of the file patterns in the 'patList' list.
+//---------------------------------------------------------------------------------------------------
-bool patternMatch(const FileInfo &fi,const StringVector &patList)
+template<class PatternList, class PatternElem, typename PatternGet = QCString(*)(const PatternElem &)>
+bool genericPatternMatch(const FileInfo &fi,
+ const PatternList &patList,
+ PatternElem &elem,
+ PatternGet getter)
{
- bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
+ bool caseSenseNames = getCaseSenseNames();
bool found = FALSE;
// For platforms where the file system is non case sensitive overrule the setting
std::string fp = fi.filePath();
std::string afp= fi.absFilePath();
- for (auto pattern: patList)
+ for (const auto &li : patList)
{
+ std::string pattern = getter(li).str();
if (!pattern.empty())
{
size_t i=pattern.find('=');
found = re.isValid() && (reg::match(fn,re) ||
(fn!=fp && reg::match(fp,re)) ||
(fn!=afp && fp!=afp && reg::match(afp,re)));
- if (found) break;
+ if (found)
+ {
+ elem = li;
+ break;
+ }
//printf("Matching '%s' against pattern '%s' found=%d\n",
// qPrint(fi->fileName()),qPrint(pattern),found);
}
return found;
}
+//----------------------------------------------------------------------------
+// returns TRUE if the name of the file represented by 'fi' matches
+// one of the file patterns in the 'patList' list.
+
+bool patternMatch(const FileInfo &fi,const StringVector &patList)
+{
+ std::string elem;
+ auto getter = [](std::string s) { return QCString(s); };
+ return genericPatternMatch(fi,patList,elem,getter);
+}
+
+QCString getEncoding(const FileInfo &fi)
+{
+ InputFileEncoding elem;
+ auto getter = [](const InputFileEncoding &e) { return e.pattern; };
+ if (genericPatternMatch(fi,Doxygen::inputFileEncodingList,elem,getter)) // check for file specific encoding
+ {
+ return elem.encoding;
+ }
+ else // fall back to default encoding
+ {
+ return Config_getString(INPUT_ENCODING);
+ }
+}
+
QCString externalLinkTarget(const bool parent)
{
bool extLinksInWindow = Config_getBool(EXT_LINKS_IN_WINDOW);
/** Checks whether the given url starts with a supported protocol */
bool isURL(const QCString &url)
{
+ static const std::unordered_set<std::string> schemes = {
+ "http", "https", "ftp", "ftps", "sftp", "file", "news", "irc", "ircs"
+ };
QCString loc_url = url.stripWhiteSpace();
- return loc_url.left(5)=="http:" || loc_url.left(6)=="https:" ||
- loc_url.left(4)=="ftp:" || loc_url.left(5)=="ftps:" ||
- loc_url.left(5)=="sftp:" || loc_url.left(5)=="file:" ||
- loc_url.left(5)=="news:" || loc_url.left(4)=="irc:" ||
- loc_url.left(5)=="ircs:";
+ int colonPos = loc_url.find(':');
+ return colonPos!=-1 && schemes.find(loc_url.left(colonPos).str())!=schemes.end();
}
/** Corrects URL \a url according to the relative path \a relPath.
* Returns the corrected URL. For absolute URLs no correction will be done.
SrcLangExt lang=SrcLangExt_Unknown
);
+bool getCaseSenseNames();
+
QCString escapeCharsInString(const QCString &name,bool allowDots,bool allowUnderscore=FALSE);
QCString unescapeCharsInString(const QCString &s);
void replaceNamespaceAliases(QCString &scope,int i);
-int computeQualifiedIndex(const QCString &name);
+//! Return the index of the last :: in the string \a name that is still before the first <
+inline int computeQualifiedIndex(const QCString &name)
+{
+ int l = static_cast<int>(name.length());
+ int lastSepPos = -1;
+ const char *p = name.data();
+ for (int i=0;i<l-1;i++)
+ {
+ char c=*p++;
+ if (c==':' && *p==':') lastSepPos=i;
+ if (c=='<') break;
+ }
+ return lastSepPos;
+}
void addDirPrefix(QCString &fileName);
QCString parseCommentAsText(const Definition *scope,const MemberDef *member,const QCString &doc,const QCString &fileName,int lineNr);
-QCString transcodeCharacterStringToUTF8(const QCString &input);
+QCString transcodeCharacterStringToUTF8(const QCString &inputEncoding,const QCString &input);
QCString recodeString(const QCString &str,const char *fromEncoding,const char *toEncoding);
QCString integerToAlpha(int n, bool upper=true);
QCString integerToRoman(int n, bool upper=true);
+QCString getEncoding(const FileInfo &fi);
+
#endif
#include "util.h"
#include "language.h"
#include "commentscan.h"
-#include "index.h"
#include "definition.h"
#include "searchindex.h"
#include "outputlist.h"
// fprintf(stderr,"\naddInstance %s to %s %s %s\n",qPrint( classEntity->name()),qPrint(cd->name()),qPrint(ar->name()),cur->name);
n1=classEntity->name();
- if (!cd->isBaseClass(classEntity, true, 0))
+ if (!cd->isBaseClass(classEntity, true))
{
cd->insertBaseClass(classEntity,n1,Public,Normal,QCString());
}
{
err("Possible recursive class relation while inside %s and looking for %s\n",qPrint(cd->name()),qPrint(scd->name()));
abort();
- return FALSE;
+ return false;
}
for (const auto &bcd :cd->subClasses())
//printf("isSubClass() subclass %s\n",qPrint(ccd->name()));
if (ccd==scd)
{
- found=TRUE;
+ found=true;
}
else
{
if (level <256)
{
- found=ccd->isBaseClass(scd,followInstances,level+1);
+ level = ccd->isBaseClass(scd,followInstances);
+ if (level>0)
+ {
+ found=true;
+ }
}
}
}
#include "util.h"
#include "language.h"
#include "commentscan.h"
-#include "index.h"
#include "definition.h"
#include "searchindex.h"
#include "outputlist.h"
break;
case DocStyleChange::Div: /* HTML only */ break;
case DocStyleChange::Span: /* HTML only */ break;
- case DocStyleChange::Details:
- if (s.enable()) m_t << "<details>"; else m_t << "</details>";
- break;
case DocStyleChange::Summary:
if (s.enable()) m_t << "<summary>"; else m_t << "</summary>";
break;
}
else if (opt.name=="class") // handle markdown generated attributes
{
- if (opt.value.left(13)=="markdownTable") // handle markdown generated attributes
+ if (opt.value.startsWith("markdownTable")) // handle markdown generated attributes
{
- if (opt.value.right(5)=="Right")
+ if (opt.value.endsWith("Right"))
{
m_t << " align='right'";
}
- else if (opt.value.right(4)=="Left")
+ else if (opt.value.endsWith("Left"))
{
m_t << " align='left'";
}
- else if (opt.value.right(6)=="Center")
+ else if (opt.value.endsWith("Center"))
{
m_t << " align='center'";
}
m_t << "</ulink>";
}
+void XmlDocVisitor::operator()(const DocHtmlDetails &d)
+{
+ if (m_hide) return;
+ m_t << "<details>";
+ visitChildren(d);
+ m_t << "</details>";
+}
+
void XmlDocVisitor::operator()(const DocHtmlHeader &header)
{
if (m_hide) return;
void operator()(const DocHtmlCaption &);
void operator()(const DocInternal &);
void operator()(const DocHRef &);
+ void operator()(const DocHtmlDetails &);
void operator()(const DocHtmlHeader &);
void operator()(const DocImage &);
void operator()(const DocDotFile &);
{
const ArgumentList &declAl = md->declArgumentList();
const ArgumentList &defAl = md->argumentList();
+ bool isFortran = md->getLanguage()==SrcLangExt_Fortran;
if (declAl.hasParameters())
{
auto defIt = defAl.begin();
writeXMLString(t,a.attrib);
t << "</attributes>\n";
}
- if (!a.type.isEmpty())
+ if (isFortran && defArg && !defArg->type.isEmpty())
+ {
+ t << " <type>";
+ linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,defArg->type);
+ t << "</type>\n";
+ }
+ else if (!a.type.isEmpty())
{
t << " <type>";
linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a.type);
--- /dev/null
+# breadcrumb tabs
+# width & height
+8 30
+# luma data
+ 45 82 82 43 43 43 43 43
+ 42 70 81 42 42 42 42 42
+ 41 48 80 80 41 41 41 41
+ 39 39 72 78 39 39 39 39
+ 39 39 54 77 39 39 39 39
+ 38 38 39 74 76 38 38 38
+ 37 37 37 60 75 37 37 37
+ 36 36 36 39 73 73 36 36
+ 34 34 34 34 62 71 34 34
+ 32 32 32 32 41 69 32 32
+ 32 32 32 32 32 64 68 32
+ 30 30 30 30 30 45 66 30
+ 28 28 28 28 28 30 62 64
+ 27 27 27 27 27 27 49 62
+ 24 24 24 24 24 24 35 59
+ 24 24 24 24 24 24 49 58
+ 22 22 22 22 22 23 56 56
+ 20 20 20 20 20 36 53 20
+ 18 18 18 18 18 47 51 18
+ 16 16 16 16 24 49 16 16
+ 15 15 15 15 38 47 15 15
+ 13 13 13 15 45 45 13 13
+ 12 12 12 27 43 12 12 12
+ 9 9 9 37 40 9 9 9
+ 8 8 15 38 8 8 8 8
+ 6 6 28 36 6 6 6 6
+ 5 7 35 35 5 5 5 5
+ 4 19 33 4 4 4 4 4
+ 2 28 31 2 2 2 2 2
+ 6 29 1 1 1 1 1 1
+ 0 0 0 0 0 0 0 0
+# alpha data
+241 241 21 0 0 0 0 0
+162 205 117 0 0 0 0 0
+ 54 231 225 3 0 0 0 0
+ 0 198 215 78 0 0 0 0
+ 0 93 211 186 0 0 0 0
+ 0 6 232 235 42 0 0 0
+ 0 0 132 203 147 0 0 0
+ 0 0 27 242 241 15 0 0
+ 0 0 0 168 205 108 0 0
+ 0 0 0 63 228 219 0 0
+ 0 0 0 0 207 221 72 0
+ 0 0 0 0 102 208 177 0
+ 0 0 0 0 9 238 240 36
+ 0 0 0 0 0 138 201 138
+ 0 0 0 0 0 77 187 158
+ 0 0 0 0 0 159 204 120
+ 0 0 0 0 15 241 241 21
+ 0 0 0 0 111 208 171 0
+ 0 0 0 0 210 222 66 0
+ 0 0 0 60 227 219 0 0
+ 0 0 0 162 204 114 0 0
+ 0 0 18 238 238 21 0 0
+ 0 0 114 205 165 0 0 0
+ 0 0 216 225 60 0 0 0
+ 0 66 226 216 0 0 0 0
+ 0 165 204 111 0 0 0 0
+ 21 241 241 18 0 0 0 0
+117 203 159 0 0 0 0 0
+219 227 57 0 0 0 0 0
+211 201 0 0 0 0 0 0
+
s/\\\{/\002/g;
s/\\\}/\003/g;
s/\\\$/\004/g;
+ s/\n / /g;
{
local ($c, $l, $z) = (0, 0, ());
s/([\{\}])/join("","\001",($1 eq "\{" ? $z[$l++]=$c++ : $z[--$l]),$1)/ge;
--- /dev/null
+/* page base colors */
+--page-background-color: black;
+--page-foreground-color: #C9D1D9;
+--page-link-color: ##A0;
+--page-visited-link-color: ##B0;
+
+/* index */
+--index-odd-item-bg-color: ##0A;
+--index-even-item-bg-color: black;
+--index-header-color: ##CC;
+--index-separator-color: ##40;
+
+/* header */
+--header-background-color: ##06;
+--header-separator-color: ##14;
+--header-gradient-image: url('nav_hd.png');
+--group-header-separator-color: ##30;
+--group-header-color: ##A0;
+--inherit-header-color: #A0A0A0;
+
+--footer-foreground-color: ##76;
+--footer-logo-width: 60px;
+--citation-label-color: ##A0;
+--glow-color: cyan;
+
+--title-background-color: ##08;
+--title-separator-color: ##43;
+--directory-separator-color: ##30;
+--separator-color: ##30;
+
+--blockquote-background-color: ##10;
+--blockquote-border-color: ##30;
+
+--scrollbar-thumb-color: ##30;
+--scrollbar-background-color: ##06;
+
+--icon-background-color: ##40;
+--icon-foreground-color: ##CC;
+--icon-doc-image: url('docd.png');
+
+/* brief member declaration list */
+--memdecl-background-color: ##0A;
+--memdecl-separator-color: ##35;
+--memdecl-foreground-color: #BBB;
+--memdecl-template-color: ##90;
+
+/* detailed member list */
+--memdef-border-color: ##28;
+--memdef-title-background-color: ##1E;
+--memdef-title-gradient-image: url('nav_fd.png');
+--memdef-proto-background-color: ##1B;
+--memdef-proto-text-color: ##AB;
+--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9);
+--memdef-doc-background-color: black;
+--memdef-param-name-color: #D28757;
+--memdef-template-color: ##90;
+
+/* tables */
+--table-cell-border-color: ##30;
+--table-header-background-color: ##30;
+--table-header-foreground-color: ##CC;
+
+/* labels */
+--label-background-color: ##44;
+--label-left-top-border-color: ##60;
+--label-right-bottom-border-color: ##30;
+--label-foreground-color: #CCCCCC;
+
+/** navigation bar/tree/menu */
+--nav-background-color: ##10;
+--nav-foreground-color: ##45;
+--nav-gradient-image: url('tab_bd.png');
+--nav-gradient-hover-image: url('tab_hd.png');
+--nav-gradient-active-image: url('tab_ad.png');
+--nav-gradient-active-image-parent: url("../tab_ad.png");
+--nav-separator-image: url('tab_sd.png');
+--nav-breadcrumb-image: url('bc_sd.png');
+--nav-breadcrumb-border-color: ##33;
+--nav-splitbar-image: url('splitbard.png');
+--nav-font-size-level1: 13px;
+--nav-font-size-level2: 10px;
+--nav-font-size-level3: 9px;
+--nav-text-normal-color: ##C0;
+--nav-text-hover-color: ##E0;
+--nav-text-active-color: ##E0;
+--nav-text-normal-shadow: 0px 1px 1px black;
+--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+--nav-menu-button-color: ##C0;
+--nav-menu-background-color: ##04;
+--nav-menu-foreground-color: #BBBBBB;
+--nav-menu-toggle-color: rgba(255, 255, 255, 0.2);
+--nav-arrow-color: ##40;
+--nav-arrow-selected-color: ##A0;
+
+/* table of contents */
+--toc-background-color: ##15;
+--toc-border-color: ##24;
+--toc-header-color: ##B0;
+
+/** search field */
+--search-background-color: black;
+--search-foreground-color: #C5C5C5;
+--search-magnification-image: url('mag_d.svg');
+--search-magnification-select-image: url('mag_seld.svg');
+--search-active-color: #C5C5C5;
+--search-filter-background-color: ##10;
+--search-filter-foreground-color: ##A0;
+--search-filter-border-color: ##90;
+--search-filter-highlight-text-color: ##C5;
+--search-filter-highlight-bg-color: ##30;
+--search-results-background-color: ##10;
+--search-results-foreground-color: ##A0;
+--search-results-border-color: ##90;
+--search-box-shadow: inset 0.5px 0.5px 3px 0px ##3A;
+
+/** code fragments */
+--code-keyword-color: #CC99CD;
+--code-type-keyword-color: #AB99CD;
+--code-flow-keyword-color: #E08000;
+--code-comment-color: #717790;
+--code-preprocessor-color: #65CABE;
+--code-string-literal-color: #7EC699;
+--code-char-literal-color: #00E0F0;
+--code-vhdl-digit-color: #FF00FF;
+--code-vhdl-char-color: #000000;
+--code-vhdl-keyword-color: #700070;
+--code-vhdl-logic-color: #FF0000;
+--code-link-color: #79C0FF;
+--code-external-link-color: #79C0FF;
+--fragment-foreground-color: #C9D1D9;
+--fragment-background-color: black;
+--fragment-border-color: #30363D;
+--fragment-lineno-border-color: #30363D;
+--fragment-lineno-background-color: black;
+--fragment-lineno-foreground-color: #6E7681;
+--fragment-lineno-link-fg-color: #6E7681;
+--fragment-lineno-link-bg-color: #303030;
+--fragment-lineno-link-hover-fg-color: #8E96A1;
+--fragment-lineno-link-hover-bg-color: #505050;
+--tooltip-foreground-color: #C9D1D9;
+--tooltip-background-color: #202020;
+--tooltip-border-color: #C9D1D9;
+--tooltip-doc-color: #D9E1E9;
+--tooltip-declaration-color: #20C348;
+--tooltip-link-color: #79C0FF;
+--tooltip-shadow: none;
+
+/** font-family */
+--font-family-normal: Roboto,sans-serif;
+--font-family-monospace: monospace,fixed;
+--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+--font-family-title: Tahoma,Arial,sans-serif;
+--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif;
+--font-family-search: Arial,Verdana,sans-serif;
+--font-family-icon: Arial,Helvetica;
+--font-family-tooltip: Roboto,sans-serif;
+
--- /dev/null
+/**
+
+The code below is based on the Doxygen Awesome project with some minor modifications
+https://github.com/jothepro/doxygen-awesome-css
+
+MIT License
+
+Copyright (c) 2021 - 2022 jothepro
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+*/
+
+class DarkModeToggle extends HTMLElement {
+ static icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="1em" width="1em"><g fill="none" fill-rule="evenodd"><path d="M0 0h24v24H0z"></path><rect width="1" height="3" x="12" fill="currentColor" rx=".5"></rect><rect width="1" height="3" x="12" y="21" fill="currentColor" rx=".5"></rect><rect width="1" height="3" x="22" y="10.5" fill="currentColor" rx=".5" transform="rotate(90 22.5 12)"></rect><rect width="1" height="3" x="1" y="10.5" fill="currentColor" rx=".5" transform="rotate(90 1.5 12)"></rect><rect width="1" height="3" x="19" y="3" fill="currentColor" rx=".5" transform="rotate(-135 19.5 4.5)"></rect><rect width="1" height="3" x="19" y="18" fill="currentColor" rx=".5" transform="rotate(135 19.5 19.5)"></rect><rect width="1" height="3" x="4" y="3" fill="currentColor" rx=".5" transform="scale(1 -1) rotate(45 15.37 0)"></rect><rect width="1" height="3" x="4" y="18" fill="currentColor" rx=".5" transform="scale(1 -1) rotate(-45 -42.57 0)"></rect><circle cx="12" cy="12" r="6.5" stroke="currentColor"></circle><path fill="currentColor" stroke="currentColor" d="M12.5 18.48V5.52a6.5 6.5 0 010 12.96z"></path></g></svg>';
+ static title = "Toggle Light/Dark Mode"
+
+ static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode"
+ static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode"
+
+ static _staticConstructor = function() {
+ DarkModeToggle.enableDarkMode(DarkModeToggle.userPreference)
+ // Update the color scheme when the browsers preference changes
+ // without user interaction on the website.
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
+ DarkModeToggle.onSystemPreferenceChanged()
+ })
+ // Update the color scheme when the tab is made visible again.
+ // It is possible that the appearance was changed in another tab
+ // while this tab was in the background.
+ document.addEventListener("visibilitychange", visibilityState => {
+ if (document.visibilityState === 'visible') {
+ DarkModeToggle.onSystemPreferenceChanged()
+ }
+ });
+ }()
+
+ static init() {
+ $(function() {
+ $(document).ready(function() {
+ const toggleButton = document.createElement('dark-mode-toggle')
+ toggleButton.title = DarkModeToggle.title
+ toggleButton.innerHTML = DarkModeToggle.icon
+
+ function addButton() {
+ var titleArea = document.getElementById("titlearea");
+ var searchBox = document.getElementById("MSearchBox");
+ var mainMenu = document.getElementById("main-menu");
+ var navRow1 = document.getElementById("navrow1");
+ var mainMenuVisible = false;
+ if (mainMenu) {
+ var menuStyle = window.getComputedStyle(mainMenu);
+ mainMenuVisible = menuStyle.display!=='none'
+ }
+ var searchBoxPos1 = document.getElementById("searchBoxPos1");
+ if (searchBox) { // (1) search box visible
+ searchBox.parentNode.appendChild(toggleButton)
+ } else if (navRow1) { // (2) no search box, static menu bar
+ var li = document.createElement('li');
+ li.style = 'float: right;'
+ li.appendChild(toggleButton);
+ toggleButton.style = 'width: 24px; height: 25px; padding-top: 11px; float: right;';
+ var row = document.querySelector('#navrow1 > ul:first-of-type');
+ row.appendChild(li)
+ } else if (mainMenu && mainMenuVisible) { // (3) no search box + dynamic menu bar expanded
+ var li = document.createElement('li');
+ li.style = 'float: right;'
+ li.appendChild(toggleButton);
+ toggleButton.style = 'width: 14px; height: 36px; padding-top: 10px; float: right;';
+ mainMenu.appendChild(li)
+ } else if (searchBoxPos1) { // (4) no search box + dynamic menu bar collapsed
+ toggleButton.style = 'width: 24px; height: 36px; padding-top: 10px; float: right;';
+ searchBoxPos1.style = 'top: 0px;'
+ searchBoxPos1.appendChild(toggleButton);
+ } else if (titleArea) { // (5) no search box and no navigation tabs
+ toggleButton.style = 'width: 24px; height: 24px; position: absolute; right: 0px; top: 34px;';
+ titleArea.append(toggleButton);
+ }
+ }
+
+ $(document).ready(function(){
+ addButton();
+ })
+ $(window).resize(function(){
+ addButton();
+ })
+ DarkModeToggle.setDarkModeVisibility(DarkModeToggle.darkModeEnabled)
+ })
+ })
+ }
+
+ constructor() {
+ super();
+ this.onclick=this.toggleDarkMode
+ }
+
+ static createCookie(name, value, days) {
+ if (days) {
+ var date = new Date();
+ date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+ var expires = "; expires=" + date.toGMTString();
+ }
+ else var expires = "";
+
+ document.cookie = name + "=" + value + expires + "; path=/";
+ }
+
+ static readCookie(name) {
+ var nameEQ = name + "=";
+ var ca = document.cookie.split(';');
+ for (var i = 0; i < ca.length; i++) {
+ var c = ca[i];
+ while (c.charAt(0) == ' ') c = c.substring(1, c.length);
+ if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
+ }
+ return null;
+ }
+
+ static eraseCookie(name) {
+ DarkModeToggle.createCookie(name, "", -1);
+ }
+
+ /**
+ * @returns `true` for dark-mode, `false` for light-mode system preference
+ */
+ static get systemPreference() {
+ return window.matchMedia('(prefers-color-scheme: dark)').matches
+ }
+
+ static get prefersDarkModeInLightMode() {
+ if (window.chrome) { // Chrome supports localStorage in combination with file:// but not cookies
+ return localStorage.getItem(DarkModeToggle.prefersDarkModeInLightModeKey)
+ } else { // Other browsers support cookies in combination with file:// but not localStorage
+ return DarkModeToggle.readCookie('doxygen_prefers_dark')=='1'
+ }
+ }
+
+ static set prefersDarkModeInLightMode(preference) {
+ if (window.chrome) {
+ if (preference) {
+ localStorage.setItem(DarkModeToggle.prefersDarkModeInLightModeKey, true)
+ } else {
+ localStorage.removeItem(DarkModeToggle.prefersDarkModeInLightModeKey)
+ }
+ } else {
+ if (preference) {
+ DarkModeToggle.createCookie('doxygen_prefers_dark','1',365)
+ } else {
+ DarkModeToggle.eraseCookie('doxygen_prefers_dark')
+ }
+ }
+ }
+
+ static get prefersLightModeInDarkMode() {
+ if (window.chrome) { // Chrome supports localStorage in combination with file:// but not cookies
+ return localStorage.getItem(DarkModeToggle.prefersLightModeInDarkModeKey)
+ } else { // Other browsers support cookies in combination with file:// but not localStorage
+ return DarkModeToggle.readCookie('doxygen_prefers_light')=='1'
+ }
+ }
+
+ static set prefersLightModeInDarkMode(preference) {
+ if (window.chrome) {
+ if (preference) {
+ localStorage.setItem(DarkModeToggle.prefersLightModeInDarkModeKey, true)
+ } else {
+ localStorage.removeItem(DarkModeToggle.prefersLightModeInDarkModeKey)
+ }
+ } else {
+ if (preference) {
+ DarkModeToggle.createCookie('doxygen_prefers_light','1',365)
+ } else {
+ DarkModeToggle.eraseCookie('doxygen_prefers_light')
+ }
+ }
+ }
+
+
+ /**
+ * @returns `true` for dark-mode, `false` for light-mode user preference
+ */
+ static get userPreference() {
+ return (!DarkModeToggle.systemPreference && DarkModeToggle.prefersDarkModeInLightMode) ||
+ (DarkModeToggle.systemPreference && !DarkModeToggle.prefersLightModeInDarkMode)
+ }
+
+ static set userPreference(userPreference) {
+ DarkModeToggle.darkModeEnabled = userPreference
+ if (!userPreference) {
+ if (DarkModeToggle.systemPreference) {
+ DarkModeToggle.prefersLightModeInDarkMode = true
+ } else {
+ DarkModeToggle.prefersDarkModeInLightMode = false
+ }
+ } else {
+ if (!DarkModeToggle.systemPreference) {
+ DarkModeToggle.prefersDarkModeInLightMode = true
+ } else {
+ DarkModeToggle.prefersLightModeInDarkMode = false
+ }
+ }
+ DarkModeToggle.onUserPreferenceChanged()
+ }
+
+ static setDarkModeVisibility(enable) {
+ var darkModeStyle, lightModeStyle;
+ if(enable) {
+ darkModeStyle = 'inline-block';
+ lightModeStyle = 'none'
+ } else {
+ darkModeStyle = 'none';
+ lightModeStyle = 'inline-block'
+ }
+ document.querySelectorAll('.dark-mode-visible').forEach(function(el) {
+ el.style.display = darkModeStyle;
+ });
+ document.querySelectorAll('.light-mode-visible').forEach(function(el) {
+ el.style.display = lightModeStyle;
+ });
+ }
+ static enableDarkMode(enable) {
+ if(enable) {
+ DarkModeToggle.darkModeEnabled = true
+ document.documentElement.classList.add("dark-mode")
+ document.documentElement.classList.remove("light-mode")
+ } else {
+ DarkModeToggle.darkModeEnabled = false
+ document.documentElement.classList.remove("dark-mode")
+ document.documentElement.classList.add("light-mode")
+ }
+ DarkModeToggle.setDarkModeVisibility(enable)
+ }
+
+ static onSystemPreferenceChanged() {
+ DarkModeToggle.darkModeEnabled = DarkModeToggle.userPreference
+ DarkModeToggle.enableDarkMode(DarkModeToggle.darkModeEnabled)
+ }
+
+ static onUserPreferenceChanged() {
+ DarkModeToggle.enableDarkMode(DarkModeToggle.darkModeEnabled)
+ }
+
+ toggleDarkMode() {
+ DarkModeToggle.userPreference = !DarkModeToggle.userPreference
+ }
+}
+
+customElements.define("dark-mode-toggle", DarkModeToggle);
+
+DarkModeToggle.init();
--- /dev/null
+# document icon for dark mode
+# width & height
+24 22
+# luma data
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 148 144 138 138 134 121 109 120 127 139 161 255 255 255 255 255 255 255 255
+255 255 255 255 255 125 154 156 156 152 144 134 111 133 159 118 155 255 255 255 255 255 255 255
+255 255 255 255 255 128 156 158 157 157 154 145 133 110 182 159 114 154 255 255 255 255 255 255
+255 255 255 255 255 128 159 160 159 159 158 154 144 84 182 182 159 117 165 255 255 255 255 255
+255 255 255 255 255 128 162 163 163 162 161 160 153 106 84 74 95 107 146 255 255 255 255 255
+255 255 255 255 255 128 166 166 146 156 168 149 162 155 139 120 119 96 123 255 255 255 255 255
+255 255 255 255 255 128 169 170 108 107 160 105 99 114 118 149 138 119 117 255 255 255 255 255
+255 255 255 255 255 128 171 172 170 148 167 166 170 165 171 174 151 138 112 255 255 255 255 255
+255 255 255 255 255 128 173 173 118 84 113 88 96 70 115 128 161 149 107 255 255 255 255 255
+255 255 255 255 255 128 173 175 178 158 171 171 156 179 167 157 169 162 107 255 255 255 255 255
+255 255 255 255 255 128 174 176 143 102 93 79 101 130 97 79 172 169 107 255 255 255 255 255
+255 255 255 255 255 128 179 178 170 148 167 166 170 165 171 174 174 172 107 255 255 255 255 255
+255 255 255 255 255 128 179 181 118 85 114 88 96 70 115 128 176 174 107 255 255 255 255 255
+255 255 255 255 255 128 181 183 178 158 171 171 156 179 167 157 179 176 107 255 255 255 255 255
+255 255 255 255 255 126 183 182 182 182 182 181 181 180 180 179 179 178 105 255 255 255 255 255
+255 255 255 255 255 124 0 0 0 0 0 0 0 0 0 0 0 0 118 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+# alpha data
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 155 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 155 0 0 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 155 0 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 155 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 155 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
-/* The standard CSS for doxygen $doxygenversion */
+body {
+ background-color: var(--page-background-color);
+ color: var(--page-foreground-color);
+ scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color);
+}
-body, table, div, p, dl {
- font: 400 14px/22px Roboto,sans-serif;
+::-webkit-scrollbar {
+ background-color: var(--scrollbar-background-color);
+ height: 10px;
+ width: 10px;
+}
+::-webkit-scrollbar-thumb {
+ background-color: var(--scrollbar-thumb-color);
+ border-radius: 8px;
+}
+::-webkit-scrollbar-corner {
+ background-color: var(--scrollbar-background-color);
}
-p.reference, p.definition {
- font: 400 14px/22px Roboto,sans-serif;
+body, table, div, p, dl {
+ font-weight: 400;
+ font-size: 14px;
+ font-family: var(--font-family-normal);
+ line-height: 22px;
}
/* @group Heading Levels */
-h1.groupheader {
- font-size: 150%;
-}
-
.title {
- font: 400 14px/28px Roboto,sans-serif;
+ font-weight: 400;
+ font-size: 14px;
+ font-family: var(--font-family-normal);
+ line-height: 28px;
font-size: 150%;
font-weight: bold;
margin: 10px 2px;
}
+h1.groupheader {
+ font-size: 150%;
+}
+
h2.groupheader {
- border-bottom: 1px solid ##99;
- color: ##44;
+ border-bottom: 1px solid var(--group-header-separator-color);
+ color: var(--group-header-color);
font-size: 150%;
font-weight: normal;
margin-top: 1.75em;
}
h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
- text-shadow: 0 0 15px cyan;
+ text-shadow: 0 0 15px var(--glow-color);
}
dt {
font-weight: bold;
}
-ul.multicol {
- -moz-column-gap: 1em;
- -webkit-column-gap: 1em;
- column-gap: 1em;
- -moz-column-count: 3;
- -webkit-column-count: 3;
- column-count: 3;
-}
-
p.startli, p.startdd {
margin-top: 2px;
}
}
div.navtab {
- border-right: 1px solid ##b0;
padding-right: 15px;
text-align: right;
line-height: 110%;
padding-right: 6px;
padding-left: 6px;
}
+
td.navtabHL {
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
padding-right: 6px;
padding-left: 6px;
}
td.navtabHL a, td.navtabHL a:visited {
- color: #fff;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ color: var(--nav-text-hover-color);
+ text-shadow: var(--nav-text-hover-shadow);
}
a.navtab {
width: 100%;
line-height: 140%;
font-size: 130%;
- color: #A0A0A0;
+ color: var(--index-separator-color);
}
dt.alphachar{
}
.alphachar a{
- color: black;
+ color: var(--index-header-color);
}
.alphachar a:hover, .alphachar a:visited{
line-height: 1.15em;
}
+.classindex dl.even {
+ background-color: var(--index-even-item-bg-color);
+}
+
.classindex dl.odd {
- background-color: ##F9;
+ background-color: var(--index-odd-item-bg-color);
}
@media(min-width: 1120px) {
/* @group Link Styling */
a {
- color: ##50;
+ color: var(--page-link-color);
font-weight: normal;
text-decoration: none;
}
.contents a:visited {
- color: ##60;
+ color: var(--page-visited-link-color);
}
a:hover {
text-decoration: underline;
}
-.contents a.qindexHL:visited {
- color: ##ff;
-}
-
a.el {
font-weight: bold;
}
}
a.code, a.code:visited, a.line, a.line:visited {
- color: ##60;
+ color: var(--code-link-color);
}
a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
- color: ##60;
+ color: var(--code-external-link-color);
}
a.code.hl_class { /* style for links to class names in code snippets */ }
}
pre.fragment {
- border: 1px solid ##CC;
- background-color: ##FC;
+ border: 1px solid var(--fragment-border-color);
+ background-color: var(--fragment-background-color);
+ color: var(--fragment-foreground-color);
padding: 4px 6px;
margin: 4px 8px 4px 2px;
overflow: auto;
word-wrap: break-word;
font-size: 9pt;
line-height: 125%;
- font-family: monospace, fixed;
+ font-family: var(--font-family-monospace);
font-size: 105%;
}
div.fragment {
- padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/
- margin: 4px 8px 4px 2px;
- background-color: ##FC;
- border: 1px solid ##CC;
+ padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/
+ margin: 4px 8px 4px 2px;
+ color: var(--fragment-foreground-color);
+ background-color: var(--fragment-background-color);
+ border: 1px solid var(--fragment-border-color);
}
div.line {
- font-family: monospace, fixed;
+ font-family: var(--font-family-monospace);
font-size: 13px;
min-height: 13px;
line-height: 1.0;
}
div.line.glow {
- background-color: cyan;
- box-shadow: 0 0 10px cyan;
+ background-color: var(--glow-color);
+ box-shadow: 0 0 10px var(--glow-color);
}
padding-right: 4px;
margin-right: 9px;
text-align: right;
- border-right: 2px solid #0F0;
- background-color: #E8E8E8;
+ border-right: 2px solid var(--fragment-lineno-border-color);
+ color: var(--fragment-lineno-foreground-color);
+ background-color: var(--fragment-lineno-background-color);
white-space: pre;
}
-span.lineno a {
- background-color: #D8D8D8;
+span.lineno a, span.lineno a:visited {
+ color: var(--fragment-lineno-link-fg-color);
+ background-color: var(--fragment-lineno-link-bg-color);
}
span.lineno a:hover {
- background-color: #C8C8C8;
+ color: var(--fragment-lineno-link-hover-fg-color);
+ background-color: var(--fragment-lineno-link-hover-bg-color);
}
.lineno {
user-select: none;
}
-div.ah, span.ah {
- background-color: black;
- font-weight: bold;
- color: ##ff;
- margin-bottom: 3px;
- margin-top: 3px;
- padding: 0.2em;
- border: solid thin #333;
- border-radius: 0.5em;
- -webkit-border-radius: .5em;
- -moz-border-radius: .5em;
- box-shadow: 2px 2px 3px #999;
- -webkit-box-shadow: 2px 2px 3px #999;
- -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
- background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
-}
-
div.classindex ul {
list-style: none;
padding-left: 0;
}
body {
- background-color: white;
- color: black;
+ color: var(--page-foreground-color);
margin: 0;
}
margin-right: 8px;
}
-td.indexkey {
- background-color: ##ee;
- font-weight: bold;
- border: 1px solid ##cc;
- margin: 2px 0px 2px 0;
- padding: 2px 10px;
- white-space: nowrap;
- vertical-align: top;
-}
-
-td.indexvalue {
- background-color: ##ee;
- border: 1px solid ##cc;
- padding: 2px 10px;
- margin: 2px 0px;
+p.formulaDsp {
+ text-align: center;
}
-tr.memlist {
- background-color: ##f0;
+img.dark-mode-visible {
+ display: none;
}
-
-p.formulaDsp {
- text-align: center;
+img.light-mode-visible {
+ display: none;
}
img.formulaDsp {
img.footer {
border: 0px;
vertical-align: middle;
+ width: var(--footer-logo-width);
}
.compoundTemplParams {
- color: ##60;
+ color: var(--memdecl-template-color);
font-size: 80%;
line-height: 120%;
}
/* @group Code Colorization */
span.keyword {
- color: #008000
+ color: var(--code-keyword-color);
}
span.keywordtype {
- color: #604020
+ color: var(--code-type-keyword-color);
}
span.keywordflow {
- color: #e08000
+ color: var(--code-flow-keyword-color);
}
span.comment {
- color: #800000
+ color: var(--code-comment-color);
}
span.preprocessor {
- color: #806020
+ color: var(--code-preprocessor-color);
}
span.stringliteral {
- color: #002080
+ color: var(--code-string-literal-color);
}
span.charliteral {
- color: #008080
+ color: var(--code-char-literal-color);
}
span.vhdldigit {
- color: #ff00ff
+ color: var(--code-vhdl-digit-color);
}
span.vhdlchar {
- color: #000000
+ color: var(--code-vhdl-char-color);
}
span.vhdlkeyword {
- color: #700070
+ color: var(--code-vhdl-keyword-color);
}
span.vhdllogic {
- color: #ff0000
+ color: var(--code-vhdl-logic-color);
}
blockquote {
- background-color: ##F8;
- border-left: 2px solid ##AA;
+ background-color: var(--blockquote-background-color);
+ border-left: 2px solid var(--blockquote-border-color);
margin: 0 24px 0 4px;
padding: 0 12px 0 16px;
}
-blockquote.DocNodeRTL {
- border-left: 0;
- border-right: 2px solid ##AA;
- margin: 0 4px 0 24px;
- padding: 0 16px 0 12px;
-}
-
/* @end */
-/*
-.search {
- color: #003399;
- font-weight: bold;
-}
-
-form.search {
- margin-bottom: 0px;
- margin-top: 0px;
-}
-
-input.search {
- font-size: 75%;
- color: #000080;
- font-weight: normal;
- background-color: #e8eef2;
-}
-*/
-
td.tiny {
font-size: 75%;
}
.dirtab {
padding: 4px;
border-collapse: collapse;
- border: 1px solid ##b0;
+ border: 1px solid var(--table-cell-border-color);
}
th.dirtab {
- background: ##ee;
+ background-color: var(--table-header-background-color);
+ color: var(--table-header-foreground-color);
font-weight: bold;
}
hr {
height: 0px;
border: none;
- border-top: 1px solid ##66;
+ border-top: 1px solid var(--separator-color);
}
hr.footer {
}
.memberdecls td.glow, .fieldtable tr.glow {
- background-color: cyan;
- box-shadow: 0 0 15px cyan;
+ background-color: var(--glow-color);
+ box-shadow: 0 0 15px var(--glow-color);
}
.mdescLeft, .mdescRight,
.memItemLeft, .memItemRight,
.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
- background-color: ##FA;
+ background-color: var(--memdecl-background-color);
border: none;
margin: 4px;
padding: 1px 0 0 8px;
.mdescLeft, .mdescRight {
padding: 0px 8px 4px 8px;
- color: #555;
+ color: var(--memdecl-foreground-color);
}
.memSeparator {
- border-bottom: 1px solid ##E2;
+ border-bottom: 1px solid var(--memdecl-separator-color);
line-height: 1px;
margin: 0px;
padding: 0px;
}
.memTemplParams {
- color: ##60;
+ color: var(--memdecl-template-color);
white-space: nowrap;
font-size: 80%;
}
.memtitle {
padding: 8px;
- border-top: 1px solid ##B4;
- border-left: 1px solid ##B4;
- border-right: 1px solid ##B4;
+ border-top: 1px solid var(--memdef-border-color);
+ border-left: 1px solid var(--memdef-border-color);
+ border-right: 1px solid var(--memdef-border-color);
border-top-right-radius: 4px;
border-top-left-radius: 4px;
margin-bottom: -1px;
- background-image: url('nav_f.png');
+ background-image: var(--memdef-title-gradient-image);
background-repeat: repeat-x;
- background-color: ##e6;
+ background-color: var(--memdef-title-background-color);
line-height: 1.25;
font-weight: 300;
float:left;
.memtemplate {
font-size: 80%;
- color: ##60;
+ color: var(--memdef-template-color);
font-weight: normal;
margin-left: 9px;
}
-.memnav {
- background-color: ##ee;
- border: 1px solid ##b0;
- text-align: center;
- margin: 2px;
- margin-right: 15px;
- padding: 2px;
-}
-
.mempage {
width: 100%;
}
}
.memitem.glow {
- box-shadow: 0 0 15px cyan;
+ box-shadow: 0 0 15px var(--glow-color);
}
.memname {
}
.memproto, dl.reflist dt {
- border-top: 1px solid ##B4;
- border-left: 1px solid ##B4;
- border-right: 1px solid ##B4;
+ border-top: 1px solid var(--memdef-border-color);
+ border-left: 1px solid var(--memdef-border-color);
+ border-right: 1px solid var(--memdef-border-color);
padding: 6px 0px 6px 0px;
- color: ##2b;
+ color: var(--memdef-proto-text-color);
font-weight: bold;
- text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
- background-color: ##E3;
- /* opera specific markup */
+ text-shadow: var(--memdef-proto-text-shadow);
+ background-color: var(--memdef-proto-background-color);
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
border-top-right-radius: 4px;
- /* firefox specific markup */
- -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
- -moz-border-radius-topright: 4px;
- /* webkit specific markup */
- -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
- -webkit-border-top-right-radius: 4px;
-
}
.overload {
- font-family: "courier new",courier,monospace;
+ font-family: var(--font-family-monospace);
font-size: 65%;
}
.memdoc, dl.reflist dd {
- border-bottom: 1px solid ##B4;
- border-left: 1px solid ##B4;
- border-right: 1px solid ##B4;
+ border-bottom: 1px solid var(--memdef-border-color);
+ border-left: 1px solid var(--memdef-border-color);
+ border-right: 1px solid var(--memdef-border-color);
padding: 6px 10px 2px 10px;
- background-color: ##FC;
border-top-width: 0;
background-image:url('nav_g.png');
background-repeat:repeat-x;
- background-color: ##ff;
+ background-color: var(--memdef-doc-background-color);
/* opera specific markup */
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
.paramname {
- color: #602020;
+ color: var(--memdef-param-name-color);
white-space: nowrap;
}
.paramname em {
.params, .retval, .exception, .tparams {
margin-left: 0px;
padding-left: 0px;
-}
+}
.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname {
font-weight: bold;
vertical-align: top;
}
-
+
.params .paramtype, .tparams .paramtype {
font-style: italic;
vertical-align: top;
-}
-
+}
+
.params .paramdir, .tparams .paramdir {
- font-family: "courier new",courier,monospace;
+ font-family: var(--font-family-monospace);
vertical-align: top;
}
}
span.mlabel {
- background-color: ##88;
- border-top:1px solid ##70;
- border-left:1px solid ##70;
- border-right:1px solid ##CC;
- border-bottom:1px solid ##CC;
+ background-color: var(--label-background-color);
+ border-top:1px solid var(--label-left-top-border-color);
+ border-left:1px solid var(--label-left-top-border-color);
+ border-right:1px solid var(--label-right-bottom-border-color);
+ border-bottom:1px solid var(--label-right-bottom-border-color);
text-shadow: none;
- color: white;
+ color: var(--label-foreground-color);
margin-right: 4px;
padding: 2px 3px;
border-radius: 3px;
div.directory {
margin: 10px 0px;
- border-top: 1px solid ##AA;
- border-bottom: 1px solid ##AA;
+ border-top: 1px solid var(--directory-separator-color);
+ border-bottom: 1px solid var(--directory-separator-color);
width: 100%;
}
border-left: 1px solid rgba(0,0,0,0.05);
}
+.directory tr.odd {
+ padding-left: 6px;
+ background-color: var(--index-odd-item-bg-color);
+}
+
.directory tr.even {
padding-left: 6px;
- background-color: ##F8;
+ background-color: var(--index-even-item-bg-color);
}
.directory img {
cursor: pointer;
padding-left: 2px;
padding-right: 2px;
- color: ##50;
+ color: var(--page-link-color);
}
.arrow {
- color: ##AA;
+ color: var(--nav-arrow-color);
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
}
.icon {
- font-family: Arial, Helvetica;
+ font-family: var(--font-family-icon);
+ line-height: normal;
font-weight: bold;
font-size: 12px;
height: 14px;
width: 16px;
display: inline-block;
- background-color: ##88;
- color: white;
+ background-color: var(--icon-background-color);
+ color: var(--icon-foreground-color);
text-align: center;
border-radius: 4px;
margin-left: 2px;
width: 24px;
height: 18px;
margin-bottom: 4px;
- background-image:url('doc.png');
+ background-image:var(--icon-doc-image);
background-position: 0px -4px;
background-repeat: repeat-y;
vertical-align:top;
display: inline-block;
}
-table.directory {
- font: 400 14px Roboto,sans-serif;
-}
-
/* @end */
div.dynheader {
address {
font-style: normal;
- color: ##33;
+ color: var(--footer-foreground-color);
}
table.doxtable caption {
}
table.doxtable td, table.doxtable th {
- border: 1px solid ##37;
+ border: 1px solid var(--table-cell-border-color);
padding: 3px 7px 2px;
}
table.doxtable th {
- background-color: ##47;
- color: ##ff;
+ background-color: var(--table-header-background-color);
+ color: var(--table-header-foreground-color);
font-size: 110%;
padding-bottom: 4px;
padding-top: 5px;
}
table.fieldtable {
- /*width: 100%;*/
margin-bottom: 10px;
- border: 1px solid ##B4;
+ border: 1px solid var(--memdef-border-color);
border-spacing: 0px;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
border-radius: 4px;
- -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
- -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
}
.fieldtable td.fieldtype, .fieldtable td.fieldname {
white-space: nowrap;
- border-right: 1px solid ##B4;
- border-bottom: 1px solid ##B4;
+ border-right: 1px solid var(--memdef-border-color);
+ border-bottom: 1px solid var(--memdef-border-color);
vertical-align: top;
}
}
.fieldtable td.fielddoc {
- border-bottom: 1px solid ##B4;
- /*width: 100%;*/
+ border-bottom: 1px solid var(--memdef-border-color);
}
.fieldtable td.fielddoc p:first-child {
margin-top: 0px;
-}
-
+}
+
.fieldtable td.fielddoc p:last-child {
margin-bottom: 2px;
}
}
.fieldtable th {
- background-image:url('nav_f.png');
+ background-image: var(--memdef-title-gradient-image);
background-repeat:repeat-x;
- background-color: ##E6;
+ background-color: var(--memdef-title-background-color);
font-size: 90%;
- color: ##2B;
+ color: var(--memdef-proto-text-color);
padding-bottom: 4px;
padding-top: 5px;
text-align:left;
font-weight: 400;
- -moz-border-radius-topleft: 4px;
- -moz-border-radius-topright: 4px;
- -webkit-border-top-left-radius: 4px;
- -webkit-border-top-right-radius: 4px;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
- border-bottom: 1px solid ##B4;
+ border-bottom: 1px solid var(--memdef-border-color);
}
top: 0px;
left: 10px;
height: 36px;
- background-image: url('tab_b.png');
+ background-image: var(--nav-gradient-image);
z-index: 101;
overflow: hidden;
font-size: 13px;
.navpath ul
{
font-size: 11px;
- background-image:url('tab_b.png');
+ background-image: var(--nav-gradient-image);
background-repeat:repeat-x;
background-position: 0 -5px;
height:30px;
line-height:30px;
- color:##9b;
- border:solid 1px ##ca;
+ color:var(--nav-text-normal-color);
+ border:solid 1px var(--nav-breadcrumb-border-color);
overflow:hidden;
margin:0px;
padding:0px;
float:left;
padding-left:10px;
padding-right:15px;
- background-image:url('bc_s.png');
+ background-image:var(--nav-breadcrumb-image);
background-repeat:no-repeat;
background-position:right;
- color:##45;
+ color: var(--nav-foreground-color);
}
.navpath li.navelem a
display:block;
text-decoration: none;
outline: none;
- color: ##30;
- font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
- text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
- text-decoration: none;
+ color: var(--nav-text-normal-color);
+ font-family: var(--font-family-nav);
+ text-shadow: var(--nav-text-normal-shadow);
+ text-decoration: none;
}
.navpath li.navelem a:hover
{
- color:##80;
+ color: var(--nav-text-hover-color);
+ text-shadow: var(--nav-text-hover-shadow);
}
.navpath li.footer
background-image:none;
background-repeat:no-repeat;
background-position:right;
- color:##45;
+ color: var(--footer-foreground-color);
font-size: 8pt;
}
padding-right: 5px;
width: 50%;
text-align: right;
-}
+}
div.summary a
{
margin-right: 3%;
width: 94%;
border: 0;
- border-spacing: 0;
+ border-spacing: 0;
padding: 0;
}
div.header
{
- background-image:url('nav_h.png');
+ background-image: var(--header-gradient-image);
background-repeat:repeat-x;
- background-color: ##FA;
+ background-color: var(--header-background-color);
margin: 0px;
- border-bottom: 1px solid ##CC;
+ border-bottom: 1px solid var(--header-separator-color);
}
div.headertitle
padding-left: 0px;
}
-dl.section.DocNodeRTL {
- margin-right: 0px;
- padding-right: 0px;
-}
-
dl.note {
margin-left: -7px;
padding-left: 3px;
border-color: #D0C000;
}
-dl.note.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #D0C000;
-}
-
dl.warning, dl.attention {
margin-left: -7px;
padding-left: 3px;
border-color: #FF0000;
}
-dl.warning.DocNodeRTL, dl.attention.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #FF0000;
-}
-
dl.pre, dl.post, dl.invariant {
margin-left: -7px;
padding-left: 3px;
border-color: #00D000;
}
-dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #00D000;
-}
-
dl.deprecated {
margin-left: -7px;
padding-left: 3px;
border-color: #505050;
}
-dl.deprecated.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #505050;
-}
-
dl.todo {
margin-left: -7px;
padding-left: 3px;
border-color: #00C0E0;
}
-dl.todo.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #00C0E0;
-}
-
dl.test {
margin-left: -7px;
padding-left: 3px;
border-color: #3030E0;
}
-dl.test.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #3030E0;
-}
-
dl.bug {
margin-left: -7px;
padding-left: 3px;
border-color: #C08050;
}
-dl.bug.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #C08050;
-}
-
dl.section dd {
margin-bottom: 6px;
}
#projectname
{
- font: 200% Tahoma, Arial,sans-serif;
+ font-size: 200%;
+ font-family: var(--font-family-title);
margin: 0px;
padding: 2px 0px;
}
-
+
#projectbrief
{
- font: 90% Tahoma, Arial,sans-serif;
+ font-size: 90%;
+ font-family: var(--font-family-title);
margin: 0px;
padding: 0px;
}
#projectnumber
{
- font: 50% Tahoma, Arial,sans-serif;
+ font-size: 50%;
+ font-family: 50% var(--font-family-title);
margin: 0px;
padding: 0px;
}
padding: 0px;
margin: 0px;
width: 100%;
- border-bottom: 1px solid ##70;
+ border-bottom: 1px solid var(--title-separator-color);
+ background-color: var(--title-background-color);
}
.image
font-weight: bold;
}
-div.zoom
-{
- border: 1px solid ##A0;
-}
-
dl.citelist {
margin-bottom:50px;
}
dl.citelist dt {
- color:##40;
+ color:var(--citation-label-color);
float:left;
font-weight:bold;
margin-right:10px;
div.toc {
padding: 14px 25px;
- background-color: ##F6;
- border: 1px solid ##DD;
+ background-color: var(--toc-background-color);
+ border: 1px solid var(--toc-border-color);
border-radius: 7px 7px 7px 7px;
float: right;
height: auto;
width: 200px;
}
-.PageDocRTL-title div.toc {
- float: left !important;
- text-align: right;
-}
-
div.toc li {
background: url("bdwn.png") no-repeat scroll 0 5px transparent;
- font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ font: 10px/1.2 var(--font-family-toc);
margin-top: 5px;
padding-left: 10px;
padding-top: 2px;
}
-.PageDocRTL-title div.toc li {
- background-position-x: right !important;
- padding-left: 0 !important;
- padding-right: 10px;
-}
-
div.toc h3 {
- font: bold 12px/1.2 Arial,FreeSans,sans-serif;
- color: ##60;
+ font: bold 12px/1.2 var(--font-family-toc);
+ color: var(--toc-header-color);
border-bottom: 0 none;
margin: 0;
}
list-style: none outside none;
border: medium none;
padding: 0px;
-}
+}
div.toc li.level1 {
margin-left: 0px;
display: none;
}
-.PageDocRTL-title div.toc li.level1 {
- margin-left: 0 !important;
- margin-right: 0;
-}
-
-.PageDocRTL-title div.toc li.level2 {
- margin-left: 0 !important;
- margin-right: 15px;
-}
-
-.PageDocRTL-title div.toc li.level3 {
- margin-left: 0 !important;
- margin-right: 30px;
-}
-
-.PageDocRTL-title div.toc li.level4 {
- margin-left: 0 !important;
- margin-right: 45px;
-}
-
.inherit_header {
font-weight: bold;
- color: gray;
+ color: var(--inherit-header-color);
cursor: pointer;
-webkit-touch-callout: none;
-webkit-user-select: none;
#powerTip {
cursor: default;
/*white-space: nowrap;*/
- background-color: white;
- border: 1px solid gray;
+ color: var(--tooltip-foreground-color);
+ background-color: var(--tooltip-background-color);
+ border: 1px solid var(--tooltip-border-color);
border-radius: 4px 4px 4px 4px;
- box-shadow: 1px 1px 7px gray;
+ box-shadow: var(--tooltip-shadow);
display: none;
font-size: smaller;
max-width: 80%;
}
#powerTip div.ttdoc {
- color: grey;
+ color: var(--tooltip-doc-color);
font-style: italic;
}
font-weight: bold;
}
+#powerTip a {
+ color: var(--tooltip-link-color);
+}
+
#powerTip div.ttname {
font-weight: bold;
}
#powerTip div.ttdeci {
- color: #006318;
+ color: var(--tooltip-declaration-color);
}
#powerTip div {
margin: 0px;
padding: 0px;
- font: 12px/16px Roboto,sans-serif;
+ font-size: 12px;
+ font-family: var(--font-family-tooltip);
+ line-height: 16px;
}
#powerTip:before, #powerTip:after {
}
#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
- border-top-color: ##ff;
+ border-top-color: var(--tooltip-background-color);
border-width: 10px;
margin: 0px -10px;
}
-#powerTip.n:before {
- border-top-color: #808080;
+#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before {
+ border-top-color: var(--tooltip-border-color);
border-width: 11px;
margin: 0px -11px;
}
}
#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
- border-bottom-color: ##ff;
+ border-bottom-color: var(--tooltip-background-color);
border-width: 10px;
margin: 0px -10px;
}
#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
- border-bottom-color: #808080;
+ border-bottom-color: var(--tooltip-border-color);
border-width: 11px;
margin: 0px -11px;
}
left: 100%;
}
#powerTip.e:after {
- border-left-color: ##ff;
+ border-left-color: var(--tooltip-border-color);
border-width: 10px;
top: 50%;
margin-top: -10px;
}
#powerTip.e:before {
- border-left-color: #808080;
+ border-left-color: var(--tooltip-border-color);
border-width: 11px;
top: 50%;
margin-top: -11px;
right: 100%;
}
#powerTip.w:after {
- border-right-color: ##ff;
+ border-right-color: var(--tooltip-border-color);
border-width: 10px;
top: 50%;
margin-top: -10px;
}
#powerTip.w:before {
- border-right-color: #808080;
+ border-right-color: var(--tooltip-border-color);
border-width: 11px;
top: 50%;
margin-top: -11px;
}
table.markdownTable td, table.markdownTable th {
- border: 1px solid ##37;
+ border: 1px solid var(--table-cell-border-color);
padding: 3px 7px 2px;
}
}
th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
- background-color: ##47;
- color: ##ff;
+ background-color: var(--table-header-background-color);
+ color: var(--table-header-foreground-color);
font-size: 110%;
padding-bottom: 4px;
padding-top: 5px;
text-align: center
}
-.DocNodeRTL {
- text-align: right;
- direction: rtl;
-}
-
-.DocNodeLTR {
- text-align: left;
- direction: ltr;
-}
-
-table.DocNodeRTL {
- width: auto;
- margin-right: 0;
- margin-left: auto;
-}
-
-table.DocNodeLTR {
- width: auto;
- margin-right: auto;
- margin-left: 0;
-}
-
-code.JavaDocCode {
- direction:ltr;
-}
-
tt, code, kbd, samp
{
display: inline-block;
- direction:ltr;
}
/* @end */
{
$('table.directory tr').
removeClass('even').filter(':visible:even').addClass('even');
+ $('table.directory tr').
+ removeClass('odd').filter(':visible:odd').addClass('odd');
}
function toggleLevel(level)
@licend The above is the entire license notice for the JavaScript code in this file
*/
-function SearchBox(name, resultsPath, inFrame, label)
+function SearchBox(name, resultsPath, extension)
{
- this.searchLabel = label;
this.DOMSearchField = function()
{ return document.getElementById("MSearchField"); }
this.DOMSearchBox = function()
if (isActive)
{
this.DOMSearchBox().className = 'MSearchBoxActive';
- var searchField = this.DOMSearchField();
- if (searchField.value == this.searchLabel)
- {
- searchField.value = '';
- }
}
else
{
this.DOMSearchBox().className = 'MSearchBoxInactive';
- this.DOMSearchField().value = this.searchLabel;
}
}
}
r+='<div class="searchpages">';
if (data.page>0)
{
- r+='<span class="pages"><a href="javascript:searchFor(\''+escapeHtml(query)+'\','+(page-1).toString()+','+count.toString()+')">«</a></span> ';
+ r+='<span class="pages"><a href="javascript:searchFor(\''+escapeHtml(query)+'\','+(page-1).toString()+','+count.toString()+')">«</a></span> ';
}
var firstPage = data.page-5;
var lastPage = data.page+5;
{
if (i==data.page)
{
- r+='<span class="pages"><b>'+(i+1).toString()+'</b></span> ';
+ r+='<span class="pages"><b>'+(i+1).toString()+'</b></span> ';
}
else
{
- r+='<span class="pages"><a href="javascript:searchFor(\''+escapeHtml(query)+'\','+i.toString()+','+count.toString()+')">'+(i+1).toString()+'</a></span> ';
+ r+='<span class="pages"><a href="javascript:searchFor(\''+escapeHtml(query)+'\','+i.toString()+','+count.toString()+')">'+(i+1).toString()+'</a></span> ';
}
}
if (data.page+1<data.pages)
.tabs, .tabs2, .tabs3 {
- background-image: url('tab_b.png');
+ background-image: var(--nav-gradient-image);
width: 100%;
z-index: 101;
- font-size: 13px;
- font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ font-size: var(--nav-font-size-level1);
+ font-family: var(--font-family-nav);
+ display: table;
}
.tabs2 {
- font-size: 10px;
+ font-size: var(--nav-font-size-level2);
}
.tabs3 {
- font-size: 9px;
+ font-size: var(--nav-font-size-level3);
}
.tablist {
margin: 0;
padding: 0;
- display: table;
+ display: block;
}
.tablist li {
float: left;
display: table-cell;
- background-image: url('tab_b.png');
+ background-image: var(--nav-gradient-image);
line-height: 36px;
list-style: none;
}
display: block;
padding: 0 20px;
font-weight: bold;
- background-image:url('tab_s.png');
+ background-image:var(--nav-separator-image);
background-repeat:no-repeat;
background-position:right;
- color: ##30;
- text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ color: var(--nav-text-normal-color);
+ text-shadow: var(--nav-text-normal-shadow);
text-decoration: none;
outline: none;
}
}
.tablist a:hover {
- background-image: url('tab_h.png');
+ background-image: var(--nav-gradient-hover-image);
background-repeat:repeat-x;
- color: #fff;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ color: var(--nav-text-hover-color);
+ text-shadow: var(--nav-text-hover-shadow);
text-decoration: none;
}
.tablist li.current a {
- background-image: url('tab_a.png');
+ background-image: var(--nav-gradient-active-image);
background-repeat:repeat-x;
- color: #fff;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ color: var(--nav-text-active-color);
+ text-shadow: var(--nav-text-active-shadow);
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="$langISO">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
$treeview
$search
$mathjax
+$darkmode
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
$extrastylesheet
</head>
<div class="left">
<form id="FSearchBox" action="{{ page.relPath }}{% if config.EXTERNAL_SEARCH %}search{{ doxygen.htmlFileExtension }}{% else %}search.php{% endif %}" method="get">
<img id="MSearchSelect" src="{{ page.relPath }}search/mag.svg" alt=""/>
- <input type="text" id="MSearchField" name="query" value="{{ tr.search }}" size="20" accesskey="S"
+ <input type="text" id="MSearchField" name="query" value="" placeholder="{{ tr.search }}" size="20" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"/>
</form>
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
- <input type="text" id="MSearchField" value="{{ tr.search }}" accesskey="S"
+ <input type="text" id="MSearchField" value="" placeholder="{{ tr.search }}" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
{% if config.SEARCHENGINE %}
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
- var searchBox = new SearchBox("searchBox", "{{ page.relPath }}search",'{{ tr.search }}','{{ config.HTML_FILE_EXTENSION }}');
+ var searchBox = new SearchBox("searchBox", "{{ page.relPath }}search", '{{ config.HTML_FILE_EXTENSION }}');
/* @license-end */
</script>
{% endif %}
{% resource 'splitbar.lum' %}
{# general search resources #}
-{% resource 'search_l.png' as 'search/search_l.png' %}
-{% resource 'search_m.png' as 'search/search_m.png' %}
-{% resource 'search_r.png' as 'search/search_r.png' %}
{% if config.DISABLE_INDEX %}
{% if config.GENERATE_TREEVIEW and config.FULL_SIDEBAR %}
{% resource 'search_sidebar.css' as 'search/search.css' %}
{% for member in memberListInfo.members %}
{% if member.detailsVisibleFor:compound.compoundKind %}
<a id="{{ member.anchor }}" name="{{ member.anchor }}"></a>
- <h2 class="memtitle"><span class="permalink"><a href="#{{ member.anchor }}">◆ </a></span>{{ member.name }}{% if member.isFunction and not member.isObjCMethod %}(){% endif %}
+ <h2 class="memtitle"><span class="permalink"><a href="#{{ member.anchor }}">◆ </a></span>{{ member.name }}{% if member.isFunction and not member.isObjCMethod %}(){% endif %}
{% if memberListInfo.members|length>1 %}<span class="overload">[{{ forloop.counter }}/{{ memberListInfo.members|length }}]</a>{% endif %}
</h2>
<div class="memitem">
/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,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"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
-/*! jQuery UI - v1.12.1 - 2019-01-27
+/*! jQuery UI - v1.13.2 - 2022-08-01
* http://jqueryui.com
-* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/resizable.js, widgets/mouse.js
+* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/resizable.js, widgets/mouse.js
* Copyright jQuery Foundation and other contributors; Licensed MIT */
-(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}t.ui=t.ui||{},t.ui.version="1.12.1";var i=0,s=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,n,o=s.call(arguments,1),a=0,r=o.length;r>a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,m,g,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),x={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,m=_.offset,g=t.extend({},m),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),x[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?g.left+=p:"center"===n.at[0]&&(g.left+=p/2),"bottom"===n.at[1]?g.top+=f:"center"===n.at[1]&&(g.top+=f/2),u=e(x.at,p,f),g.left+=u[0],g.top+=u[1],this.each(function(){var s,r,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),k=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},g),T=e(x.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=T[0],D.top+=T[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:l,elemHeight:c,collisionPosition:s,collisionWidth:k,collisionHeight:C,offset:[u[0]+T[0],u[1]+T[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=m.left-D.left,i=e+p-l,s=m.top-D.top,r=s+f-c,u={target:{element:v,left:m.left,top:m.top,width:p,height:f},element:{element:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("<div>"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element
-},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/**
+!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(y){"use strict";y.ui=y.ui||{};y.ui.version="1.13.2";var n,i=0,h=Array.prototype.hasOwnProperty,a=Array.prototype.slice;y.cleanData=(n=y.cleanData,function(t){for(var e,i,s=0;null!=(i=t[s]);s++)(e=y._data(i,"events"))&&e.remove&&y(i).triggerHandler("remove");n(t)}),y.widget=function(t,i,e){var s,n,o,h={},a=t.split(".")[0],r=a+"-"+(t=t.split(".")[1]);return e||(e=i,i=y.Widget),Array.isArray(e)&&(e=y.extend.apply(null,[{}].concat(e))),y.expr.pseudos[r.toLowerCase()]=function(t){return!!y.data(t,r)},y[a]=y[a]||{},s=y[a][t],n=y[a][t]=function(t,e){if(!this||!this._createWidget)return new n(t,e);arguments.length&&this._createWidget(t,e)},y.extend(n,s,{version:e.version,_proto:y.extend({},e),_childConstructors:[]}),(o=new i).options=y.widget.extend({},o.options),y.each(e,function(e,s){function n(){return i.prototype[e].apply(this,arguments)}function o(t){return i.prototype[e].apply(this,t)}h[e]="function"==typeof s?function(){var t,e=this._super,i=this._superApply;return this._super=n,this._superApply=o,t=s.apply(this,arguments),this._super=e,this._superApply=i,t}:s}),n.prototype=y.widget.extend(o,{widgetEventPrefix:s&&o.widgetEventPrefix||t},h,{constructor:n,namespace:a,widgetName:t,widgetFullName:r}),s?(y.each(s._childConstructors,function(t,e){var i=e.prototype;y.widget(i.namespace+"."+i.widgetName,n,e._proto)}),delete s._childConstructors):i._childConstructors.push(n),y.widget.bridge(t,n),n},y.widget.extend=function(t){for(var e,i,s=a.call(arguments,1),n=0,o=s.length;n<o;n++)for(e in s[n])i=s[n][e],h.call(s[n],e)&&void 0!==i&&(y.isPlainObject(i)?t[e]=y.isPlainObject(t[e])?y.widget.extend({},t[e],i):y.widget.extend({},i):t[e]=i);return t},y.widget.bridge=function(o,e){var h=e.prototype.widgetFullName||o;y.fn[o]=function(i){var t="string"==typeof i,s=a.call(arguments,1),n=this;return t?this.length||"instance"!==i?this.each(function(){var t,e=y.data(this,h);return"instance"===i?(n=e,!1):e?"function"!=typeof e[i]||"_"===i.charAt(0)?y.error("no such method '"+i+"' for "+o+" widget instance"):(t=e[i].apply(e,s))!==e&&void 0!==t?(n=t&&t.jquery?n.pushStack(t.get()):t,!1):void 0:y.error("cannot call methods on "+o+" prior to initialization; attempted to call method '"+i+"'")}):n=void 0:(s.length&&(i=y.widget.extend.apply(null,[i].concat(s))),this.each(function(){var t=y.data(this,h);t?(t.option(i||{}),t._init&&t._init()):y.data(this,h,new e(i,this))})),n}},y.Widget=function(){},y.Widget._childConstructors=[],y.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n<i.length-1;n++)s[i[n]]=s[i[n]]||{},s=s[i[n]];if(t=i.pop(),1===arguments.length)return void 0===s[t]?null:s[t];s[t]=e}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=e}return this._setOptions(o),this},_setOptions:function(t){for(var e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(t){var e,i,s;for(e in t)s=this.classesElementLookup[e],t[e]!==this.options.classes[e]&&s&&s.length&&(i=y(s.get()),this._removeClass(s,e),i.addClass(this._classes({element:i,keys:e,classes:t,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(n){var o=[],h=this;function t(t,e){for(var i,s=0;s<t.length;s++)i=h.classesElementLookup[t[s]]||y(),i=n.add?(function(){var i=[];n.element.each(function(t,e){y.map(h.classesElementLookup,function(t){return t}).some(function(t){return t.is(e)})||i.push(e)}),h._on(y(i),{remove:"_untrackClassesElement"})}(),y(y.uniqueSort(i.get().concat(n.element.get())))):y(i.not(n.element).get()),h.classesElementLookup[t[s]]=i,o.push(t[s]),e&&n.classes[t[s]]&&o.push(n.classes[t[s]])}return(n=y.extend({element:this.element,classes:this.options.classes||{}},n)).keys&&t(n.keys.match(/\S+/g)||[],!0),n.extra&&t(n.extra.match(/\S+/g)||[]),o.join(" ")},_untrackClassesElement:function(i){var s=this;y.each(s.classesElementLookup,function(t,e){-1!==y.inArray(i.target,e)&&(s.classesElementLookup[t]=y(e.not(i.target).get()))}),this._off(y(i.target))},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){var n="string"==typeof t||null===t,i={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s="boolean"==typeof s?s:i};return i.element.toggleClass(this._classes(i),s),this},_on:function(n,o,t){var h,a=this;"boolean"!=typeof n&&(t=o,o=n,n=!1),t?(o=h=y(o),this.bindings=this.bindings.add(o)):(t=o,o=this.element,h=this.widget()),y.each(t,function(t,e){function i(){if(n||!0!==a.options.disabled&&!y(this).hasClass("ui-state-disabled"))return("string"==typeof e?a[e]:e).apply(a,arguments)}"string"!=typeof e&&(i.guid=e.guid=e.guid||i.guid||y.guid++);var s=t.match(/^([\w:-]*)\s*(.*)$/),t=s[1]+a.eventNamespace,s=s[2];s?h.on(t,s,i):o.on(t,i)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.off(e),this.bindings=y(this.bindings.not(t).get()),this.focusable=y(this.focusable.not(t).get()),this.hoverable=y(this.hoverable.not(t).get())},_delay:function(t,e){var i=this;return setTimeout(function(){return("string"==typeof t?i[t]:t).apply(i,arguments)},e||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){this._addClass(y(t.currentTarget),null,"ui-state-hover")},mouseleave:function(t){this._removeClass(y(t.currentTarget),null,"ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){this._addClass(y(t.currentTarget),null,"ui-state-focus")},focusout:function(t){this._removeClass(y(t.currentTarget),null,"ui-state-focus")}})},_trigger:function(t,e,i){var s,n,o=this.options[t];if(i=i||{},(e=y.Event(e)).type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),e.target=this.element[0],n=e.originalEvent)for(s in n)s in e||(e[s]=n[s]);return this.element.trigger(e,i),!("function"==typeof o&&!1===o.apply(this.element[0],[e].concat(i))||e.isDefaultPrevented())}},y.each({show:"fadeIn",hide:"fadeOut"},function(o,h){y.Widget.prototype["_"+o]=function(e,t,i){var s,n=(t="string"==typeof t?{effect:t}:t)?!0!==t&&"number"!=typeof t&&t.effect||h:o;"number"==typeof(t=t||{})?t={duration:t}:!0===t&&(t={}),s=!y.isEmptyObject(t),t.complete=i,t.delay&&e.delay(t.delay),s&&y.effects&&y.effects.effect[n]?e[o](t):n!==o&&e[n]?e[n](t.duration,t.easing,i):e.queue(function(t){y(this)[o](),i&&i.call(e[0]),t()})}});var s,x,D,o,r,l,u,p,W;y.widget;function E(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function H(t,e){return parseInt(y.css(t,e),10)||0}function S(t){return null!=t&&t===t.window}x=Math.max,D=Math.abs,o=/left|center|right/,r=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,u=/^\w+/,p=/%$/,W=y.fn.position,y.position={scrollbarWidth:function(){if(void 0!==s)return s;var t,e=y("<div style='display:block;position:absolute;width:200px;height:200px;overflow:hidden;'><div style='height:300px;width:auto;'></div></div>"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.width<t.element[0].scrollWidth;return{width:"scroll"===i||"auto"===i&&t.height<t.element[0].scrollHeight?y.position.scrollbarWidth():0,height:e?y.position.scrollbarWidth():0}},getWithinInfo:function(t){var e=y(t||window),i=S(e[0]),s=!!e[0]&&9===e[0].nodeType;return{element:e,isWindow:i,isDocument:s,offset:!i&&!s?y(t).offset():{left:0,top:0},scrollLeft:e.scrollLeft(),scrollTop:e.scrollTop(),width:e.outerWidth(),height:e.outerHeight()}}},y.fn.position=function(p){if(!p||!p.of)return W.apply(this,arguments);var d,c,f,g,m,t,_="string"==typeof(p=y.extend({},p)).of?y(document).find(p.of):y(p.of),w=y.position.getWithinInfo(p.within),v=y.position.getScrollInfo(w),b=(p.collision||"flip").split(" "),z={},e=9===(t=(e=_)[0]).nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:S(t)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:t.preventDefault?{width:0,height:0,offset:{top:t.pageY,left:t.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()};return _[0].preventDefault&&(p.at="left top"),c=e.width,f=e.height,m=y.extend({},g=e.offset),y.each(["my","at"],function(){var t,e,i=(p[this]||"").split(" ");(i=1===i.length?o.test(i[0])?i.concat(["center"]):r.test(i[0])?["center"].concat(i):["center","center"]:i)[0]=o.test(i[0])?i[0]:"center",i[1]=r.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),z[this]=[t?t[0]:0,e?e[0]:0],p[this]=[u.exec(i[0])[0],u.exec(i[1])[0]]}),1===b.length&&(b[1]=b[0]),"right"===p.at[0]?m.left+=c:"center"===p.at[0]&&(m.left+=c/2),"bottom"===p.at[1]?m.top+=f:"center"===p.at[1]&&(m.top+=f/2),d=E(z.at,c,f),m.left+=d[0],m.top+=d[1],this.each(function(){var i,t,h=y(this),a=h.outerWidth(),r=h.outerHeight(),e=H(this,"marginLeft"),s=H(this,"marginTop"),n=a+e+H(this,"marginRight")+v.width,o=r+s+H(this,"marginBottom")+v.height,l=y.extend({},m),u=E(z.my,h.outerWidth(),h.outerHeight());"right"===p.my[0]?l.left-=a:"center"===p.my[0]&&(l.left-=a/2),"bottom"===p.my[1]?l.top-=r:"center"===p.my[1]&&(l.top-=r/2),l.left+=u[0],l.top+=u[1],i={marginLeft:e,marginTop:s},y.each(["left","top"],function(t,e){y.ui.position[b[t]]&&y.ui.position[b[t]][e](l,{targetWidth:c,targetHeight:f,elemWidth:a,elemHeight:r,collisionPosition:i,collisionWidth:n,collisionHeight:o,offset:[d[0]+u[0],d[1]+u[1]],my:p.my,at:p.at,within:w,elem:h})}),p.using&&(t=function(t){var e=g.left-l.left,i=e+c-a,s=g.top-l.top,n=s+f-r,o={target:{element:_,left:g.left,top:g.top,width:c,height:f},element:{element:h,left:l.left,top:l.top,width:a,height:r},horizontal:i<0?"left":0<e?"right":"center",vertical:n<0?"top":0<s?"bottom":"middle"};c<a&&D(e+i)<c&&(o.horizontal="center"),f<r&&D(s+n)<f&&(o.vertical="middle"),x(D(e),D(i))>x(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0<h&&a<=0?(i=t.left+h+e.collisionWidth-n-s,t.left+=h-i):t.left=!(0<a&&h<=0)&&a<h?s+n-e.collisionWidth:s:0<h?t.left+=h:0<a?t.left-=a:t.left=x(t.left-o,t.left)},top:function(t,e){var i=e.within,s=i.isWindow?i.scrollTop:i.offset.top,n=e.within.height,o=t.top-e.collisionPosition.marginTop,h=s-o,a=o+e.collisionHeight-n-s;e.collisionHeight>n?0<h&&a<=0?(i=t.top+h+e.collisionHeight-n-s,t.top+=h-i):t.top=!(0<a&&h<=0)&&a<h?s+n-e.collisionHeight:s:0<h?t.top+=h:0<a?t.top-=a:t.top=x(t.top-o,t.top)}},flip:{left:function(t,e){var i=e.within,s=i.offset.left+i.scrollLeft,n=i.width,o=i.isWindow?i.scrollLeft:i.offset.left,h=t.left-e.collisionPosition.marginLeft,a=h-o,r=h+e.collisionWidth-n-o,l="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,i="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,h=-2*e.offset[0];a<0?((s=t.left+l+i+h+e.collisionWidth-n-s)<0||s<D(a))&&(t.left+=l+i+h):0<r&&(0<(o=t.left-e.collisionPosition.marginLeft+l+i+h-o)||D(o)<r)&&(t.left+=l+i+h)},top:function(t,e){var i=e.within,s=i.offset.top+i.scrollTop,n=i.height,o=i.isWindow?i.scrollTop:i.offset.top,h=t.top-e.collisionPosition.marginTop,a=h-o,r=h+e.collisionHeight-n-o,l="top"===e.my[1]?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,i="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,h=-2*e.offset[1];a<0?((s=t.top+l+i+h+e.collisionHeight-n-s)<0||s<D(a))&&(t.top+=l+i+h):0<r&&(0<(o=t.top-e.collisionPosition.marginTop+l+i+h-o)||D(o)<r)&&(t.top+=l+i+h)}},flipfit:{left:function(){y.ui.position.flip.left.apply(this,arguments),y.ui.position.fit.left.apply(this,arguments)},top:function(){y.ui.position.flip.top.apply(this,arguments),y.ui.position.fit.top.apply(this,arguments)}}};var t;y.ui.position,y.extend(y.expr.pseudos,{data:y.expr.createPseudo?y.expr.createPseudo(function(e){return function(t){return!!y.data(t,e)}}):function(t,e,i){return!!y.data(t,i[3])}}),y.fn.extend({disableSelection:(t="onselectstart"in document.createElement("div")?"selectstart":"mousedown",function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}),enableSelection:function(){return this.off(".ui-disableSelection")}});y.ui.focusable=function(t,e){var i,s,n,o,h=t.nodeName.toLowerCase();return"area"===h?(s=(i=t.parentNode).name,!(!t.href||!s||"map"!==i.nodeName.toLowerCase())&&(0<(s=y("img[usemap='#"+s+"']")).length&&s.is(":visible"))):(/^(input|select|textarea|button|object)$/.test(h)?(n=!t.disabled)&&(o=y(t).closest("fieldset")[0])&&(n=!o.disabled):n="a"===h&&t.href||e,n&&y(t).is(":visible")&&function(t){var e=t.css("visibility");for(;"inherit"===e;)t=t.parent(),e=t.css("visibility");return"visible"===e}(y(t)))},y.extend(y.expr.pseudos,{focusable:function(t){return y.ui.focusable(t,null!=y.attr(t,"tabindex"))}});var e,d;y.ui.focusable,y.fn._form=function(){return"string"==typeof this[0].form?this.closest("form"):y(this[0].form)},y.ui.formResetMixin={_formResetHandler:function(){var e=y(this);setTimeout(function(){var t=e.data("ui-form-reset-instances");y.each(t,function(){this.refresh()})})},_bindFormResetHandler:function(){var t;this.form=this.element._form(),this.form.length&&((t=this.form.data("ui-form-reset-instances")||[]).length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t))},_unbindFormResetHandler:function(){var t;this.form.length&&((t=this.form.data("ui-form-reset-instances")).splice(y.inArray(this,t),1),t.length?this.form.data("ui-form-reset-instances",t):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset"))}};y.expr.pseudos||(y.expr.pseudos=y.expr[":"]),y.uniqueSort||(y.uniqueSort=y.unique),y.escapeSelector||(e=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,d=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},y.escapeSelector=function(t){return(t+"").replace(e,d)}),y.fn.even&&y.fn.odd||y.fn.extend({even:function(){return this.filter(function(t){return t%2==0})},odd:function(){return this.filter(function(t){return t%2==1})}});y.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},y.fn.labels=function(){var t,e,i;return this.length?this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(e=this.eq(0).parents("label"),(t=this.attr("id"))&&(i=(i=this.eq(0).parents().last()).add((i.length?i:this).siblings()),t="label[for='"+y.escapeSelector(t)+"']",e=e.add(i.find(t).addBack(t))),this.pushStack(e)):this.pushStack([])},y.fn.scrollParent=function(t){var e=this.css("position"),i="absolute"===e,s=t?/(auto|scroll|hidden)/:/(auto|scroll)/,t=this.parents().filter(function(){var t=y(this);return(!i||"static"!==t.css("position"))&&s.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==e&&t.length?t:y(this[0].ownerDocument||document)},y.extend(y.expr.pseudos,{tabbable:function(t){var e=y.attr(t,"tabindex"),i=null!=e;return(!i||0<=e)&&y.ui.focusable(t,i)}}),y.fn.extend({uniqueId:(c=0,function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++c)})}),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&y(this).removeAttr("id")})}}),y.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var c,f=!1;y(document).on("mouseup",function(){f=!1});y.widget("ui.mouse",{version:"1.13.2",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(t){if(!0===y.data(t.target,e.widgetName+".preventClickEvent"))return y.removeData(t.target,e.widgetName+".preventClickEvent"),t.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!f){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var e=this,i=1===t.which,s=!("string"!=typeof this.options.cancel||!t.target.nodeName)&&y(t.target).closest(this.options.cancel).length;return i&&!s&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(t),!this._mouseStarted)?(t.preventDefault(),!0):(!0===y.data(t.target,this.widgetName+".preventClickEvent")&&y.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return e._mouseMove(t)},this._mouseUpDelegate=function(t){return e._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),f=!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(y.ui.ie&&(!document.documentMode||document.documentMode<9)&&!t.button)return this._mouseUp(t);if(!t.which)if(t.originalEvent.altKey||t.originalEvent.ctrlKey||t.originalEvent.metaKey||t.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(this._mouseDownEvent,t),this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&y.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,f=!1,t.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n<o.length;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}};y.widget("ui.resizable",y.ui.mouse,{version:"1.13.2",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(t,e){if("hidden"===y(t).css("overflow"))return!1;var i=e&&"left"===e?"scrollLeft":"scrollTop",e=!1;if(0<t[i])return!0;try{t[i]=1,e=0<t[i],t[i]=0}catch(t){}return e},_create:function(){var t,e=this.options,i=this;this._addClass("ui-resizable"),y.extend(this,{_aspectRatio:!!e.aspectRatio,aspectRatio:e.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:e.helper||e.ghost||e.animate?e.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(y("<div class='ui-wrapper'></div>").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e<i.length;e++)s="ui-resizable-"+(t=String.prototype.trim.call(i[e])),n=y("<div>"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),s<n.maxWidth&&(n.maxWidth=s),t<n.maxHeight&&(n.maxHeight=t)),this._vBoundaries=n},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e<this._proportionallyResizeElements.length;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,e=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||y("<div></div>").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidth<d,g=i.maxHeight&&i.maxHeight<c,m=i.minWidth&&i.minWidth>d,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0<c-l?(e.size.height=c,e.position.top=o.top-p):(c=l-t.height,e.size.height=c,e.position.top=o.top+n.height-c),0<d-r?(e.size.width=d,e.position.left=o.left-u):(d=r-t.width,e.size.width=d,e.position.left=o.left+n.width-d))}});y.ui.resizable});/**
* Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler
* Licensed under MIT
* @author Ariel Flesler
--- /dev/null
+/* page base colors */
+--page-background-color: white;
+--page-foreground-color: black;
+--page-link-color: ##50;
+--page-visited-link-color: ##60;
+
+/* index */
+--index-odd-item-bg-color: ##F9;
+--index-even-item-bg-color: white;
+--index-header-color: black;
+--index-separator-color: #A0A0A0;
+
+/* header */
+--header-background-color: ##FA;
+--header-separator-color: ##CC;
+--header-gradient-image: url('nav_h.png');
+--group-header-separator-color: ##99;
+--group-header-color: ##44;
+--inherit-header-color: gray;
+
+--footer-foreground-color: ##33;
+--footer-logo-width: 104px;
+--citation-label-color: ##40;
+--glow-color: cyan;
+
+--title-background-color: white;
+--title-separator-color: ##70;
+--directory-separator-color: ##AA;
+--separator-color: ##66;
+
+--blockquote-background-color: ##F8;
+--blockquote-border-color: ##AA;
+
+--scrollbar-thumb-color: ##AA;
+--scrollbar-background-color: ##FA;
+
+--icon-background-color: ##88;
+--icon-foreground-color: white;
+--icon-doc-image: url('doc.png');
+
+/* brief member declaration list */
+--memdecl-background-color: ##FA;
+--memdecl-separator-color: ##E2;
+--memdecl-foreground-color: #555;
+--memdecl-template-color: ##60;
+
+/* detailed member list */
+--memdef-border-color: ##B4;
+--memdef-title-background-color: ##E6;
+--memdef-title-gradient-image: url('nav_f.png');
+--memdef-proto-background-color: ##E3;
+--memdef-proto-text-color: ##2b;
+--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+--memdef-doc-background-color: white;
+--memdef-param-name-color: #602020;
+--memdef-template-color: ##60;
+
+/* tables */
+--table-cell-border-color: ##37;
+--table-header-background-color: ##47;
+--table-header-foreground-color: ##ff;
+
+/* labels */
+--label-background-color: ##88;
+--label-left-top-border-color: ##70;
+--label-right-bottom-border-color: ##CC;
+--label-foreground-color: white;
+
+/** navigation bar/tree/menu */
+--nav-background-color: ##FA;
+--nav-foreground-color: ##45;
+--nav-gradient-image: url('tab_b.png');
+--nav-gradient-hover-image: url('tab_h.png');
+--nav-gradient-active-image: url('tab_a.png');
+--nav-gradient-active-image-parent: url("../tab_a.png");
+--nav-separator-image: url('tab_s.png');
+--nav-breadcrumb-image: url('bc_s.png');
+--nav-breadcrumb-border-color: ##CA;
+--nav-splitbar-image: url('splitbar.png');
+--nav-font-size-level1: 13px;
+--nav-font-size-level2: 10px;
+--nav-font-size-level3: 9px;
+--nav-text-normal-color: ##30;
+--nav-text-hover-color: white;
+--nav-text-active-color: white;
+--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+--nav-menu-button-color: ##45;
+--nav-menu-background-color: white;
+--nav-menu-foreground-color: #555555;
+--nav-menu-toggle-color: rgba(255, 255, 255, 0.5);
+--nav-arrow-color: ##AA;
+--nav-arrow-selected-color: ##AA;
+
+/* table of contents */
+--toc-background-color: ##F6;
+--toc-border-color: ##DD;
+--toc-header-color: ##60;
+
+/** search field */
+--search-background-color: white;
+--search-foreground-color: #909090;
+--search-magnification-image: url('mag.svg');
+--search-magnification-select-image: url('mag_sel.svg');
+--search-active-color: black;
+--search-filter-background-color: ##FA;
+--search-filter-foreground-color: black;
+--search-filter-border-color: ##A0;
+--search-filter-highlight-text-color: white;
+--search-filter-highlight-bg-color: ##50;
+--search-results-foreground-color: ##58;
+--search-results-background-color: ##F0;
+--search-results-border-color: black;
+--search-box-shadow: inset 0.5px 0.5px 3px 0px #555;
+
+/** code fragments */
+--code-keyword-color: #008000;
+--code-type-keyword-color: #604020;
+--code-flow-keyword-color: #E08000;
+--code-comment-color: #800000;
+--code-preprocessor-color: #806020;
+--code-string-literal-color: #002080;
+--code-char-literal-color: #008080;
+--code-vhdl-digit-color: #FF00FF;
+--code-vhdl-char-color: #000000;
+--code-vhdl-keyword-color: #700070;
+--code-vhdl-logic-color: #FF0000;
+--code-link-color: ##60;
+--code-external-link-color: ##60;
+--fragment-foreground-color: black;
+--fragment-background-color: ##FC;
+--fragment-border-color: ##CC;
+--fragment-lineno-border-color: #00FF00;
+--fragment-lineno-background-color: #E8E8E8;
+--fragment-lineno-foreground-color: black;
+--fragment-lineno-link-fg-color: ##60;
+--fragment-lineno-link-bg-color: #D8D8D8;
+--fragment-lineno-link-hover-fg-color: ##60;
+--fragment-lineno-link-hover-bg-color: #C8C8C8;
+--tooltip-foreground-color: black;
+--tooltip-background-color: white;
+--tooltip-border-color: gray;
+--tooltip-doc-color: grey;
+--tooltip-declaration-color: #006318;
+--tooltip-link-color: ##60;
+--tooltip-shadow: 1px 1px 7px gray;
+
+/** font-family */
+--font-family-normal: Roboto,sans-serif;
+--font-family-monospace: monospace,fixed;
+--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+--font-family-title: Tahoma,Arial,sans-serif;
+--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif;
+--font-family-search: Arial,Verdana,sans-serif;
+--font-family-icon: Arial,Helvetica;
+--font-family-tooltip: Roboto,sans-serif;
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ viewBox="0 0 20 19"
+ height="19"
+ width="20"
+ id="svg2"
+ version="1.1">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <circle
+ r="3.5"
+ cy="8.5"
+ cx="5.5"
+ id="path4611"
+ style="fill:#000000;fill-opacity:0;stroke:#C5C5C5;stroke-width:1.4;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
+ <path
+ id="path4630"
+ d="m 8.1085854,11.109059 2.7823556,2.782356"
+ style="fill:none;stroke:#C5C5C5;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="svg2"
+ width="20"
+ height="19"
+ viewBox="0 0 20 19"
+ sodipodi:docname="mag_sel.svg"
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="2096"
+ id="namedview4"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="32"
+ inkscape:cx="5.9792688"
+ inkscape:cy="1.1436277"
+ inkscape:window-x="1920"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <circle
+ style="fill:#000000;fill-opacity:0;stroke:#C5C5C5;stroke-width:1.4;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ id="path4611"
+ cx="5.5"
+ cy="8.5"
+ r="3.5" />
+ <path
+ style="fill:#C5C5C5;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 11,7 13.5,10 16,7 Z"
+ id="path4609"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#C5C5C5;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.1085854,11.109059 2.7823556,2.782356"
+ id="path4630"
+ inkscape:connector-curvature="0" />
+</svg>
}
return result;
}
- var searchBox;
+ var searchBoxHtml;
if (searchEnabled) {
if (serverSide) {
- searchBox='<div id="MSearchBox" class="MSearchBoxInactive">'+
+ searchBoxHtml='<div id="MSearchBox" class="MSearchBoxInactive">'+
'<div class="left">'+
'<form id="FSearchBox" action="'+relPath+searchPage+
- '" method="get"><img id="MSearchSelect" src="'+
- relPath+'search/mag.svg" alt=""/>'+
- '<input type="text" id="MSearchField" name="query" value="'+search+
+ '" method="get"><span id="MSearchSelectExt"> </span>'+
+ '<input type="text" id="MSearchField" name="query" value="" placeholder="'+search+
'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)"'+
- ' onblur="searchBox.OnSearchFieldFocus(false)">'+
+ ' onblur="searchBox.OnSearchFieldFocus(false)"/>'+
'</form>'+
'</div>'+
'<div class="right"></div>'+
'</div>';
} else {
- searchBox='<div id="MSearchBox" class="MSearchBoxInactive">'+
+ searchBoxHtml='<div id="MSearchBox" class="MSearchBoxInactive">'+
'<span class="left">'+
- '<img id="MSearchSelect" src="'+relPath+
- 'search/mag_sel.svg" onmouseover="return searchBox.OnSearchSelectShow()"'+
- ' onmouseout="return searchBox.OnSearchSelectHide()" alt=""/>'+
- '<input type="text" id="MSearchField" value="'+search+
+ '<span id="MSearchSelect" onmouseover="return searchBox.OnSearchSelectShow()"'+
+ ' onmouseout="return searchBox.OnSearchSelectHide()"> </span>'+
+ '<input type="text" id="MSearchField" value="" placeholder="'+search+
'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" '+
'onblur="searchBox.OnSearchFieldFocus(false)" '+
'onkeyup="searchBox.OnSearchFieldChange(event)"/>'+
'<span class="right"><a id="MSearchClose" '+
'href="javascript:searchBox.CloseResultsWindow()">'+
'<img id="MSearchCloseImg" border="0" src="'+relPath+
- 'search/close.svg" alt=""/></a>'
- '</span>'
+ 'search/close.svg" alt=""/></a>'+
+ '</span>'+
'</div>';
}
}
'</div>');
$('#main-nav').append(makeTree(menudata,relPath));
$('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
- if (searchBox) {
+ if (searchBoxHtml) {
$('#main-menu').append('<li id="searchBoxPos2" style="float:right"></li>');
}
var $mainMenuState = $('#main-menu-state');
if (newWidth!=prevWidth) {
if ($(window).outerWidth()<768) {
$mainMenuState.prop('checked',false); $menu.hide();
- $('#searchBoxPos1').html(searchBox);
+ $('#searchBoxPos1').html(searchBoxHtml);
$('#searchBoxPos2').hide();
} else {
$menu.show();
$('#searchBoxPos1').empty();
- $('#searchBoxPos2').html(searchBox);
+ $('#searchBoxPos2').html(searchBoxHtml);
$('#searchBoxPos2').show();
}
+ if (typeof searchBox!=='undefined') {
+ searchBox.CloseResultsWindow();
+ }
prevWidth = newWidth;
}
}
--- /dev/null
+# function header in dark mode
+# width & height
+1 56
+# luma data
+48 47 46 45 44 43 42 41
+40 39 38 37 36 35 34 33
+32 31 30 29 28 23 23 23
+23 23 23 23 23 23 23 23
+24 24 24 24 25 25 25 25
+25 26 26 26 27 27 27 27
+28 28 28 29 29 29 29 29
-# shadowed header
+# shadowed header for light mode
# width & height
1 12
# luma data
--- /dev/null
+# shadowed header for dark mode
+# width & height
+1 12
+# luma data
+ 23 16 15 14 13 12
+ 11 10 9 8 7 6
+
#nav-tree .selected {
background-image: url('tab_a.png');
background-repeat:repeat-x;
- color: #fff;
- text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ color: var(--nav-text-active-color);
+ text-shadow: var(--nav-text-active-shadow);
+}
+
+#nav-tree .selected .arrow {
+ color: var(--nav-arrow-selected-color);
+ text-shadow: none;
}
#nav-tree img {
#nav-tree .label {
margin:0px;
padding:0px;
- font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ font: 12px var(--font-family-nav);
}
#nav-tree .label a {
#nav-tree .selected a {
text-decoration:none;
- color:#fff;
+ color:var(--nav-text-active-color);
}
#nav-tree .children_ul {
#nav-tree {
padding: 0px 0px;
- background-color: #FAFAFF;
font-size:14px;
overflow:auto;
}
}
.ui-resizable-e {
- background-image:url("splitbar.png");
+ background-image:var(--nav-splitbar-image);
background-size:100%;
background-repeat:repeat-y;
background-attachment: scroll;
}
#nav-tree {
- background-image:url('nav_h.png');
background-repeat:repeat-x;
- background-color: ##FA;
+ background-color: var(--nav-background-color);
-webkit-overflow-scrolling : touch; /* iOS 5+ */
}
@licend The above is the entire license notice for the JavaScript code in this file
*/
+var once=1;
function initResizable()
{
var cookie_namespace = 'doxygen';
- var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight;
+ var sidenav,navtree,content,header,barWidth=6,desktop_vp=768,titleHeight;
- function readCookie(cookie)
+ function readSetting(cookie)
{
- var myCookie = cookie_namespace+"_"+cookie+"=";
- if (document.cookie) {
- var index = document.cookie.indexOf(myCookie);
- if (index != -1) {
- var valStart = index + myCookie.length;
- var valEnd = document.cookie.indexOf(";", valStart);
- if (valEnd == -1) {
- valEnd = document.cookie.length;
+ if (window.chrome) {
+ var val = localStorage.getItem(cookie_namespace+'_width');
+ if (val) return val;
+ } else {
+ var myCookie = cookie_namespace+"_"+cookie+"=";
+ if (document.cookie) {
+ var index = document.cookie.indexOf(myCookie);
+ if (index != -1) {
+ var valStart = index + myCookie.length;
+ var valEnd = document.cookie.indexOf(";", valStart);
+ if (valEnd == -1) {
+ valEnd = document.cookie.length;
+ }
+ var val = document.cookie.substring(valStart, valEnd);
+ return val;
}
- var val = document.cookie.substring(valStart, valEnd);
- return val;
}
}
- return 0;
+ return $TREEVIEW_WIDTH;
}
- function writeCookie(cookie, val, expiration)
+ function writeSetting(cookie, val)
{
- if (val==undefined) return;
- if (expiration == null) {
+ if (window.chrome) {
+ localStorage.setItem(cookie_namespace+"_width",val);
+ } else {
var date = new Date();
date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
expiration = date.toGMTString();
+ document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; SameSite=Lax; expires=" + expiration+"; path=/";
}
- document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; SameSite=Lax; expires=" + expiration+"; path=/";
}
function resizeWidth()
var windowWidth = $(window).width() + "px";
var sidenavWidth = $(sidenav).outerWidth();
content.css({marginLeft:parseInt(sidenavWidth)+"px"});
- writeCookie('width',sidenavWidth-barWidth, null);
+ if (typeof page_layout!=='undefined' && page_layout==1) {
+ footer.css({marginLeft:parseInt(sidenavWidth)+"px"});
+ }
+ writeSetting('width',sidenavWidth-barWidth);
}
function restoreWidth(navWidth)
{
var windowWidth = $(window).width() + "px";
content.css({marginLeft:parseInt(navWidth)+barWidth+"px"});
+ if (typeof page_layout!=='undefined' && page_layout==1) {
+ footer.css({marginLeft:parseInt(navWidth)+barWidth+"px"});
+ }
sidenav.css({width:navWidth + "px"});
}
content.css({height:contentHeight + "px"});
navtree.css({height:navtreeHeight + "px"});
sidenav.css({height:sideNavHeight + "px"});
- var width=$(window).width();
- if (width!=collapsedWidth) {
- if (width<desktop_vp && collapsedWidth>=desktop_vp) {
- if (!collapsed) {
- collapseExpand();
- }
- } else if (width>desktop_vp && collapsedWidth<desktop_vp) {
- if (collapsed) {
- collapseExpand();
- }
- }
- collapsedWidth=width;
- }
if (location.hash.slice(1)) {
(document.getElementById(location.hash.slice(1))||document.body).scrollIntoView();
}
function collapseExpand()
{
+ var newWidth;
if (sidenav.width()>0) {
- restoreWidth(0);
- collapsed=true;
+ newWidth=0;
}
else {
- var width = readCookie('width');
- if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); }
- collapsed=false;
+ var width = readSetting('width');
+ newWidth = (width>$TREEVIEW_WIDTH && width<$(window).width()) ? width : $TREEVIEW_WIDTH;
}
+ restoreWidth(newWidth);
+ var sidenavWidth = $(sidenav).outerWidth();
+ writeSetting('width',sidenavWidth-barWidth);
}
header = $("#top");
$('#nav-sync').css({ right:'34px' });
barWidth=20;
}
- var width = readCookie('width');
+ var width = readSetting('width');
if (width) { restoreWidth(width); } else { resizeWidth(); }
resizeHeight();
var url = location.href;
if (i>=0) window.location.hash=url.substr(i);
var _preventDefault = function(evt) { evt.preventDefault(); };
$("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);
- $(".ui-resizable-handle").dblclick(collapseExpand);
+ if (once) {
+ $(".ui-resizable-handle").dblclick(collapseExpand);
+ once=0
+ }
$(window).on('load',resizeHeight);
}
/* @license-end */
-/*---------------- Search Box */
-
-#MSearchBox {
- white-space : nowrap;
- background: white;
- border-radius: 0.65em;
- box-shadow: inset 0.5px 0.5px 3px 0px #555;
- z-index: 102;
-}
-
-#MSearchBox .left {
- display: inline-block;
- vertical-align: middle;
- height: 1.4em;
-}
-
-#MSearchSelect {
- display: inline-block;
- vertical-align: middle;
- height: 19px;
- padding: 0 0 0 0.3em;
- margin: 0;
-}
-
-#MSearchField {
- display: inline-block;
- vertical-align: middle;
- width: 7.5em;
- height: 19px;
- margin: 0 0.15em;
- padding: 0;
- line-height: 1em;
- border:none;
- color: #909090;
- outline: none;
- font-family: Arial, Verdana, sans-serif;
- -webkit-border-radius: 0px;
- border-radius: 0px;
- background: none;
-}
-
-@media(hover: none) {
- /* to avoid zooming on iOS */
- #MSearchField {
- font-size: 16px;
- }
-}
-
-#MSearchBox .right {
- display: inline-block;
- vertical-align: middle;
- width: 1.4em;
- height: 1.4em;
-}
-
-#MSearchClose {
- display: none;
- font-size: inherit;
- background : none;
- border: none;
- margin: 0;
- padding: 0;
- outline: none;
-
-}
-
-#MSearchCloseImg {
- height: 1.4em;
- padding: 0.3em;
- margin: 0;
-}
-
-.MSearchBoxActive #MSearchField {
- color: #000000;
-}
+/*---------------- Search Box positioning */
#main-menu > li:last-child {
/* This <li> object is the parent of the search bar */
return y;
}
+var searchResults = new SearchResults("searchResults");
+
/* A class handling everything associated with the search panel.
Parameters:
storing this instance. Is needed to be able to set timeouts.
resultPath - path to use for external files
*/
-function SearchBox(name, resultsPath, label, extension)
+function SearchBox(name, resultsPath, extension)
{
if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
if (!extension || extension == "") { extension = ".html"; }
this.hideTimeout = 0;
this.searchIndex = 0;
this.searchActive = false;
- this.searchLabel = label;
this.extension = extension;
// ----------- DOM Elements
}
else
{
- window.frames.MSearchResults.postMessage("take_focus", "*");
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
}
}
else if (e.keyCode==27) // Escape out of the search field
idxChar = searchValue.substr(0, 2);
}
- var resultsPage;
- var resultsPageWithSearch;
- var hasResultsPage;
+ var jsFile;
var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
if (idx!=-1)
{
var hexCode=idx.toString(16);
- resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension;
- resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
- hasResultsPage = true;
+ jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js';
}
- else // nothing available for this search term
- {
- resultsPage = this.resultsPath + '/nomatches' + this.extension;
- resultsPageWithSearch = resultsPage;
- hasResultsPage = false;
+
+ var loadJS = function(url, impl, loc){
+ var scriptTag = document.createElement('script');
+ scriptTag.src = url;
+ scriptTag.onload = impl;
+ scriptTag.onreadystatechange = impl;
+ loc.appendChild(scriptTag);
}
- window.frames.MSearchResults.location = resultsPageWithSearch;
var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+ var domSearchBox = this.DOMSearchBox();
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ var domSearchClose = this.DOMSearchClose();
+ var resultsPath = this.resultsPath;
+
+ var handleResults = function() {
+ document.getElementById("Loading").style.display="none";
+ if (typeof searchData !== 'undefined') {
+ createResults(resultsPath);
+ document.getElementById("NoMatches").style.display="none";
+ }
+
+ searchResults.Search(searchValue);
- if (domPopupSearchResultsWindow.style.display!='block')
- {
- var domSearchBox = this.DOMSearchBox();
- this.DOMSearchClose().style.display = 'inline-block';
- var domPopupSearchResults = this.DOMPopupSearchResults();
- var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
- var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
- domPopupSearchResultsWindow.style.display = 'block';
- left -= domPopupSearchResults.offsetWidth;
- var maxWidth = document.body.clientWidth;
- var width = 400;
- if (left<10) left=10;
- if (width+left+8>maxWidth) width=maxWidth-left-8;
- domPopupSearchResultsWindow.style.top = top + 'px';
- domPopupSearchResultsWindow.style.left = left + 'px';
- domPopupSearchResultsWindow.style.width = width + 'px';
+ if (domPopupSearchResultsWindow.style.display!='block')
+ {
+ domSearchClose.style.display = 'inline-block';
+ var left = getXPos(domSearchBox) + 150;
+ var top = getYPos(domSearchBox) + 20;
+ domPopupSearchResultsWindow.style.display = 'block';
+ left -= domPopupSearchResults.offsetWidth;
+ var maxWidth = document.body.clientWidth;
+ var maxHeight = document.body.clientHeight;
+ var width = 300;
+ if (left<10) left=10;
+ if (width+left+8>maxWidth) width=maxWidth-left-8;
+ var height = 400;
+ if (height+top+8>maxHeight) height=maxHeight-top-8;
+ domPopupSearchResultsWindow.style.top = top + 'px';
+ domPopupSearchResultsWindow.style.left = left + 'px';
+ domPopupSearchResultsWindow.style.width = width + 'px';
+ domPopupSearchResultsWindow.style.height = height + 'px';
+ }
+ }
+
+ if (jsFile) {
+ loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow());
+ } else {
+ handleResults();
}
this.lastSearchValue = searchValue;
- this.lastResultsPage = resultsPage;
}
// -------- Activation Functions
)
{
this.DOMSearchBox().className = 'MSearchBoxActive';
-
- var searchField = this.DOMSearchField();
-
- if (searchField.value == this.searchLabel) // clear "Search" term upon entry
- {
- searchField.value = '';
- this.searchActive = true;
- }
+ this.searchActive = true;
}
else if (!isActive) // directly remove the panel
{
this.DOMSearchBox().className = 'MSearchBoxInactive';
- this.DOMSearchField().value = this.searchLabel;
this.searchActive = false;
this.lastSearchValue = ''
this.lastResultsPage = '';
+ this.DOMSearchField().value = '';
}
}
}
}
else // return focus to search field
{
- parent.document.getElementById("MSearchField").focus();
+ document.getElementById("MSearchField").focus();
}
}
else if (this.lastKey==40) // Down
}
else if (this.lastKey==27) // Escape
{
- parent.searchBox.CloseResultsWindow();
- parent.document.getElementById("MSearchField").focus();
+ searchBox.CloseResultsWindow();
+ document.getElementById("MSearchField").focus();
}
else if (this.lastKey==13) // Enter
{
}
else if (this.lastKey==27) // Escape
{
- parent.searchBox.CloseResultsWindow();
- parent.document.getElementById("MSearchField").focus();
+ searchBox.CloseResultsWindow();
+ document.getElementById("MSearchField").focus();
}
else if (this.lastKey==13) // Enter
{
elem.setAttribute('className',attr);
}
-function createResults()
+function createResults(resultsPath)
{
var results = document.getElementById("SRResults");
+ results.innerHTML = '';
for (var e=0; e<searchData.length; e++)
{
var id = searchData[e][0];
srEntry.appendChild(srLink);
if (searchData[e][1].length==2) // single result
{
- srLink.setAttribute('href',searchData[e][1][1][0]);
- srLink.setAttribute('onclick','parent.searchBox.CloseResultsWindow()');
+ srLink.setAttribute('href',resultsPath+searchData[e][1][1][0]);
+ srLink.setAttribute('onclick','searchBox.CloseResultsWindow()');
if (searchData[e][1][1][1])
{
srLink.setAttribute('target','_parent');
srChild.setAttribute('id','Item'+e+'_c'+c);
setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
setClassAttr(srChild,'SRScope');
- srChild.setAttribute('href',searchData[e][1][c+1][0]);
- srChild.setAttribute('onclick','parent.searchBox.CloseResultsWindow()');
+ srChild.setAttribute('href',resultsPath+searchData[e][1][c+1][0]);
+ srChild.setAttribute('onclick','searchBox.CloseResultsWindow()');
if (searchData[e][1][c+1][1])
{
srChild.setAttribute('target','_parent');
+/*---------------- Search box styling */
+
+.SRPage * {
+ font-weight: normal;
+ line-height: normal;
+}
+
+dark-mode-toggle {
+ margin-left: 5px;
+ display: flex;
+ float: right;
+}
+
+#MSearchBox {
+ display: inline-block;
+ white-space : nowrap;
+ background: var(--search-background-color);
+ border-radius: 0.65em;
+ box-shadow: var(--search-box-shadow);
+ z-index: 102;
+}
+
+#MSearchBox .left {
+ display: inline-block;
+ vertical-align: middle;
+ height: 1.4em;
+}
+
+#MSearchSelect {
+ display: inline-block;
+ vertical-align: middle;
+ width: 20px;
+ height: 19px;
+ background-image: var(--search-magnification-select-image);
+ margin: 0 0 0 0.3em;
+ padding: 0;
+}
+
+#MSearchSelectExt {
+ display: inline-block;
+ vertical-align: middle;
+ width: 10px;
+ height: 19px;
+ background-image: var(--search-magnification-image);
+ margin: 0 0 0 0.5em;
+ padding: 0;
+}
+
+
+#MSearchField {
+ display: inline-block;
+ vertical-align: middle;
+ width: 7.5em;
+ height: 19px;
+ margin: 0 0.15em;
+ padding: 0;
+ line-height: 1em;
+ border:none;
+ color: var(--search-foreground-color);
+ outline: none;
+ font-family: var(--font-family-search);
+ -webkit-border-radius: 0px;
+ border-radius: 0px;
+ background: none;
+}
+
+@media(hover: none) {
+ /* to avoid zooming on iOS */
+ #MSearchField {
+ font-size: 16px;
+ }
+}
+
+#MSearchBox .right {
+ display: inline-block;
+ vertical-align: middle;
+ width: 1.4em;
+ height: 1.4em;
+}
+
+#MSearchClose {
+ display: none;
+ font-size: inherit;
+ background : none;
+ border: none;
+ margin: 0;
+ padding: 0;
+ outline: none;
+
+}
+
+#MSearchCloseImg {
+ padding: 0.3em;
+ margin: 0;
+}
+
+.MSearchBoxActive #MSearchField {
+ color: var(--search-active-color);
+}
+
+
+
/*---------------- Search filter selection */
#MSearchSelectWindow {
display: none;
position: absolute;
left: 0; top: 0;
- border: 1px solid ##A0;
- background-color: ##FA;
+ border: 1px solid var(--search-filter-border-color);
+ background-color: var(--search-filter-background-color);
z-index: 10001;
padding-top: 4px;
padding-bottom: 4px;
}
.SelectItem {
- font: 8pt Arial, Verdana, sans-serif;
+ font: 8pt var(--font-family-search);
padding-left: 2px;
padding-right: 12px;
border: 0px;
span.SelectionMark {
margin-right: 4px;
- font-family: monospace;
+ font-family: var(--font-family-monospace);
outline-style: none;
text-decoration: none;
}
a.SelectItem {
display: block;
outline-style: none;
- color: #000000;
+ color: var(--search-filter-foreground-color);
text-decoration: none;
padding-left: 6px;
padding-right: 12px;
a.SelectItem:focus,
a.SelectItem:active {
- color: #000000;
+ color: var(--search-filter-foreground-color);
outline-style: none;
text-decoration: none;
}
a.SelectItem:hover {
- color: #FFFFFF;
- background-color: ##50;
+ color: var(--search-filter-highlight-text-color);
+ background-color: var(--search-filter-highlight-bg-color);
outline-style: none;
text-decoration: none;
cursor: pointer;
display: none;
position: absolute;
left: 0; top: 0;
- border: 1px solid #000;
- background-color: ##F0;
+ border: 1px solid var(--search-results-border-color);
+ background-color: var(--search-results-background-color);
z-index:10000;
+ width: 300px;
+ height: 400px;
+ overflow: auto;
}
/* ----------------------------------- */
#SRIndex {
clear:both;
- padding-bottom: 15px;
}
.SREntry {
padding: 1px 5px;
}
-body.SRPage {
+div.SRPage {
margin: 5px 2px;
+ background-color: var(--search-results-background-color);
}
.SRChildren {
}
.SRSymbol {
- font-weight: bold;
- color: ##58;
- font-family: Arial, Verdana, sans-serif;
+ font-weight: bold;
+ color: var(--search-results-foreground-color);
+ font-family: var(--font-family-search);
text-decoration: none;
outline: none;
}
a.SRScope {
display: block;
- color: ##58;
- font-family: Arial, Verdana, sans-serif;
+ color: var(--search-results-foreground-color);
+ font-family: var(--font-family-search);
+ font-size: 8pt;
text-decoration: none;
outline: none;
}
span.SRScope {
padding-left: 4px;
- font-family: Arial, Verdana, sans-serif;
+ font-family: var(--font-family-search);
}
.SRPage .SRStatus {
padding: 2px 5px;
font-size: 8pt;
font-style: italic;
- font-family: Arial, Verdana, sans-serif;
+ font-family: var(--font-family-search);
}
.SRResult {
/*---------------- External search page results */
-.searchresult {
- background-color: ##F2;
-}
-
.pages b {
color: white;
padding: 5px 5px 3px 5px;
- background-image: url("../tab_a.png");
+ background-image: var(--nav-gradient-active-image-parent);
background-repeat: repeat-x;
text-shadow: 0 1px 1px #000000;
}
-/*---------------- Search Box */
-
-#FSearchBox {
- float: left;
-}
-
-#MSearchBox {
- white-space : nowrap;
- position: absolute;
- float: none;
- display: inline;
- margin-top: 8px;
- right: 0px;
- width: 170px;
- z-index: 102;
- background-color: white;
-}
-
-#MSearchBox .left
-{
- display:block;
- position:absolute;
- left:10px;
- width:20px;
- height:19px;
- background:url('search_l.png') no-repeat;
- background-position:right;
-}
-
-#MSearchSelect {
- display:block;
- position:absolute;
- width:20px;
- height:19px;
-}
-
-.left #MSearchSelect {
- left:4px;
-}
-
-.right #MSearchSelect {
- right:5px;
-}
-
-#MSearchField {
- display:block;
- position:absolute;
- height:19px;
- background:url('search_m.png') repeat-x;
- border:none;
- width:111px;
- margin-left:20px;
- padding-left:4px;
- color: #909090;
- outline: none;
- font: 9pt Arial, Verdana, sans-serif;
-}
-
-#FSearchBox #MSearchField {
- margin-left:15px;
-}
-
-#MSearchBox .right {
- display:block;
- position:absolute;
- right:10px;
- top:0px;
- width:20px;
- height:19px;
- background:url('search_r.png') no-repeat;
- background-position:left;
-}
-
-#MSearchClose {
- display: none;
- position: absolute;
- top: 4px;
- background : none;
- border: none;
- margin: 0px 4px 0px 0px;
- padding: 0px 0px;
- outline: none;
-}
-
-.left #MSearchClose {
- left: 6px;
-}
-
-.right #MSearchClose {
- right: 2px;
-}
-
-.MSearchBoxActive #MSearchField {
- color: #000000;
+/*---------------- Search Box positioning */
+
+#navrow1 .tablist > li:last-child {
+ /* This <li> object is the parent of the search bar */
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 36px;
+ margin-right: 1em;
+ float: right;
}
/*---------------- Search Box */
-#FSearchBox {
- float: left;
-}
-
#MSearchBox {
- white-space : nowrap;
- float: none;
- margin-top: 0px;
- width: 161px;
- height: 24px;
- z-index: 102;
- right: 10px;
- display: inline;
- position: absolute;
-}
-
-#MSearchBox .left
-{
- display:block;
- position:absolute;
- left:10px;
- width:20px;
- height:19px;
- background:url('search_l.png') no-repeat;
- background-position:right;
-}
-
-#MSearchSelect {
- display:block;
- position:absolute;
- width:20px;
- height:19px;
-}
-
-.left #MSearchSelect {
- left:4px;
-}
-
-.right #MSearchSelect {
- right:5px;
-}
-
-#MSearchField {
- display:block;
- position:absolute;
- height:19px;
- background:url('search_m.png') repeat-x;
- border:none;
- width:111px;
- margin-left:20px;
- padding-left:4px;
- color: #909090;
- outline: none;
- font: 9pt Arial, Verdana, sans-serif;
- -webkit-border-radius: 0px;
-}
-
-#FSearchBox #MSearchField {
- margin-left:15px;
-}
-
-#MSearchBox .right {
- display:block;
- position:absolute;
- left:141px;
- width:20px;
- height:19px;
- background:url('search_r.png') no-repeat;
- background-position:left;
-}
-
-#MSearchClose {
- display: none;
position: absolute;
- top: 4px;
- background : none;
- border: none;
- margin: 0px 4px 0px 0px;
- padding: 0px 0px;
- outline: none;
+ right: 5px;
}
-
-.left #MSearchClose {
- left: 6px;
-}
-
-.right #MSearchClose {
- right: 2px;
-}
-
-.MSearchBoxActive #MSearchField {
- color: #000000;
-}
-
--- /dev/null
+/*---------------- Search Box */
+
+.titlearea table {
+ width: 100%;
+}
+
+dark-mode-toggle {
+ position: absolute;
+ right: 5px;
+ padding-top: 3px;
+}
+
+#MSearchBox {
+ position: absolute;
+ right: 34px;
+}
+
-/*---------------- Search Box */
-
-#FSearchBox {
- float: left;
-}
+/*---------------- Search Box positioning */
#MSearchBox {
- white-space : nowrap;
- float: none;
- margin-top: 0px;
- width: 161px;
- height: 24px;
- z-index: 102;
-}
-
-#MSearchBox .left
-{
- display:block;
- position:absolute;
- left:10px;
- width:20px;
- height:19px;
- background:url('search_l.png') no-repeat;
- background-position:right;
-}
-
-#MSearchSelect {
- display:block;
- position:absolute;
- width:20px;
- height:19px;
-}
-
-.left #MSearchSelect {
- left:4px;
-}
-
-.right #MSearchSelect {
- right:5px;
-}
-
-#MSearchField {
- display:block;
- position:absolute;
- height:19px;
- background:url('search_m.png') repeat-x;
- border:none;
- width:111px;
- margin-left:20px;
- padding-left:4px;
- color: #909090;
- outline: none;
- font: 9pt Arial, Verdana, sans-serif;
- -webkit-border-radius: 0px;
+ margin: 5px;
}
-#FSearchBox #MSearchField {
- margin-left:15px;
+dark-mode-toggle {
+ padding-top: 8px;
}
-
-#MSearchBox .right {
- display:block;
- position:absolute;
- left:141px;
- width:20px;
- height:19px;
- background:url('search_r.png') no-repeat;
- background-position:left;
-}
-
-#MSearchClose {
- display: none;
- position: absolute;
- top: 4px;
- background : none;
- border: none;
- margin: 0px 4px 0px 0px;
- padding: 0px 0px;
- outline: none;
-}
-
-.left #MSearchClose {
- left: 6px;
-}
-
-.right #MSearchClose {
- right: 2px;
-}
-
-.MSearchBoxActive #MSearchField {
- color: #000000;
-}
-
--- /dev/null
+# vertical split bar for treeview
+# width & height
+6 1024
+# luma data
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 20 52 20 20
+20 93 74 155 33 155
+20 92 20 52 20 20
+20 93 74 155 33 155
+20 92 20 52 20 20
+20 93 74 155 33 155
+20 92 20 52 20 20
+20 93 74 155 33 155
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
+20 92 74 52 33 20
--- /dev/null
+# active tab background luma for dark mode
+# width & height
+1 36
+# luma data
+ 0 0 9 19 23 24 25 27 27
+27 29 30 30 31 32 33 34 36
+37 38 39 40 41 41 43 44 44
+46 46 47 48 48 49 49 34 3
--- /dev/null
+# normal tab background luma for dark mode
+# width & height
+1 36
+# luma data
+ 33 43 50 48 45 42 40 37 36
+ 33 32 30 29 28 27 26 25 24
+ 24 12 13 14 15 16 17 18 19
+ 20 22 24 26 28 32 34 21 3
--- /dev/null
+# hovering tab background luma for dark mode
+# width & height
+1 36
+# luma data
+ 81 91 98 96 93 90 88 85 84
+ 81 80 78 77 76 75 74 73 72
+ 72 54 55 56 57 58 59 60 61
+ 62 64 66 68 70 74 76 63 45
--- /dev/null
+# tab separator for dark mode
+# width & height
+1 36
+# luma data
+ 67 66 65 63 62 61 60 58 56
+ 54 53 51 49 47 44 43 41 38
+ 36 34 32 30 28 25 23 21 20
+ 18 16 14 11 11 8 6 5 4
-.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#666;-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}}
\ No newline at end of file
+.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}}
\ No newline at end of file
\vspace*{7cm}
\begin{center}%
{\Large $title}\\
+%%BEGIN PROJECT_NUMBER
+ [1ex]\large $projectnumber \\
+%%END PROJECT_NUMBER
\vspace*{1cm}
{\large $generatedby Doxygen $doxygenversion}\\
%%BEGIN LATEX_TIMESTAMP
<xsd:element name="cite" type="docMarkupType" />
<xsd:element name="del" type="docMarkupType" />
<xsd:element name="ins" type="docMarkupType" />
- <xsd:element name="details" type="docMarkupType" />
<xsd:element name="summary" type="docMarkupType" />
<xsd:element name="htmlonly" type="docHtmlOnlyType" />
<xsd:element name="manonly" type="xsd:string" />
<xsd:element name="parameterlist" type="docParamListType" />
<xsd:element name="xrefsect" type="docXRefSectType" />
<xsd:element name="copydoc" type="docCopyType" />
+ <xsd:element name="details" type="docDetailsType" />
<xsd:element name="blockquote" type="docBlockQuoteType" />
<xsd:element name="parblock" type="docParBlockType" />
</xsd:choice>
<xsd:attribute name="link" type="xsd:string" />
</xsd:complexType>
+ <xsd:complexType name="docDetailsType">
+ <xsd:sequence>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
<xsd:complexType name="docBlockQuoteType">
<xsd:sequence>
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
<xsd:enumeration value="XML" />
<xsd:enumeration value="SQL" />
<xsd:enumeration value="Markdown" />
+ <xsd:enumeration value="Slice" />
+ <xsd:enumeration value="Lex" />
</xsd:restriction>
</xsd:simpleType>
/** @mainpage
Here are some formulas:
--# The distance between \f$(x_1,y_1)\f$ and \f$(x_2,y_2)\f$ is
+-# The distance between \f$(x_1,y_1)\f$ and \f$(x_2,y_2)\f$ is
\f$\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\f$.
-# Unnumbered formula:
- \f[ |I_2|=\left| \int_{0}^T \psi(t) \left\{ u(a,t)- \int_{\gamma(t)}^a
+ \f[ |I_2|=\left| \int_{0}^T \psi(t) \left\{ u(a,t)- \int_{\gamma(t)}^a
\frac{d\theta}{k(\theta,t)} \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi \right\} dt \right| \f]
-# Formula in different environment
- \f{eqnarray*}{ g &=& \frac{Gm_2}{r^2} \\
+ \f{eqnarray*}{ g &=& \frac{Gm_2}{r^2} \\
&=& \frac{(6.673 \times 10^{-11}\,\mbox{m}^3\,\mbox{kg}^{-1}\,
- \mbox{s}^{-2})(5.9736 \times 10^{24}\,\mbox{kg})}{(6371.01\,\mbox{km})^2} \\
+ \mbox{s}^{-2})(5.9736 \times 10^{24}\,\mbox{kg})}{(6371.01\,\mbox{km})^2} \\
&=& 9.82066032\,\mbox{m/s}^2
\f}
*/
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structmymodule_1_1t1" kind="type" language="Fortran" prot="public">
+ <compoundname>mymodule::t1</compoundname>
+ <sectiondef kind="public-attrib">
+ <memberdef kind="variable" id="structmymodule_1_1t1_1a40dabbcb827e13ffbb38bb7e9e5957cc" prot="public" static="no" mutable="no">
+ <type>integer</type>
+ <definition>integer mymodule::t1::publicvariable</definition>
+ <argsstring/>
+ <name>publicvariable</name>
+ <qualifiedname>mymodule::t1::publicvariable</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="087_public_type.F90" line="16" column="1" bodyfile="087_public_type.F90" bodystart="16" bodyend="16"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="087_public_type.F90" line="15" column="1" bodyfile="087_public_type.F90" bodystart="15" bodyend="17"/>
+ <listofallmembers>
+ <member refid="structmymodule_1_1t1_1a40dabbcb827e13ffbb38bb7e9e5957cc" prot="public" virt="non-virtual">
+ <scope>mymodule::t1</scope>
+ <name>publicvariable</name>
+ </member>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structmymodule_1_1t2" kind="type" language="Fortran" prot="public">
+ <compoundname>mymodule::t2</compoundname>
+ <sectiondef kind="public-attrib">
+ <memberdef kind="variable" id="structmymodule_1_1t2_1af907af6c7950c587a50eadd26987799a" prot="public" static="no" mutable="no">
+ <type>integer</type>
+ <definition>integer mymodule::t2::publicvariable</definition>
+ <argsstring/>
+ <name>publicvariable</name>
+ <qualifiedname>mymodule::t2::publicvariable</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="087_public_type.F90" line="22" column="1" bodyfile="087_public_type.F90" bodystart="22" bodyend="22"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="087_public_type.F90" line="21" column="1" bodyfile="087_public_type.F90" bodystart="21" bodyend="24"/>
+ <listofallmembers>
+ <member refid="structmymodule_1_1t2_1af907af6c7950c587a50eadd26987799a" prot="public" virt="non-virtual">
+ <scope>mymodule::t2</scope>
+ <name>publicvariable</name>
+ </member>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structmymodule_1_1t3" kind="type" language="Fortran" prot="public">
+ <compoundname>mymodule::t3</compoundname>
+ <sectiondef kind="private-attrib">
+ <memberdef kind="variable" id="structmymodule_1_1t3_1a8c70e7ad082657d4ddd9967c11ea5c68" prot="private" static="no" mutable="no">
+ <type>integer</type>
+ <definition>integer mymodule::t3::privatevariable</definition>
+ <argsstring/>
+ <name>privatevariable</name>
+ <qualifiedname>mymodule::t3::privatevariable</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="087_public_type.F90" line="28" column="1" bodyfile="087_public_type.F90" bodystart="28" bodyend="28"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="087_public_type.F90" line="26" column="1" bodyfile="087_public_type.F90" bodystart="26" bodyend="29"/>
+ <listofallmembers>
+ <member refid="structmymodule_1_1t3_1a8c70e7ad082657d4ddd9967c11ea5c68" prot="private" virt="non-virtual">
+ <scope>mymodule::t3</scope>
+ <name>privatevariable</name>
+ </member>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structmymodule_1_1t4" kind="type" language="Fortran" prot="private">
+ <compoundname>mymodule::t4</compoundname>
+ <sectiondef kind="public-attrib">
+ <memberdef kind="variable" id="structmymodule_1_1t4_1aca212dfbb52db21b5c166b416b3019ac" prot="public" static="no" mutable="no">
+ <type>integer</type>
+ <definition>integer mymodule::t4::publicvariable</definition>
+ <argsstring/>
+ <name>publicvariable</name>
+ <qualifiedname>mymodule::t4::publicvariable</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="087_public_type.F90" line="32" column="1" bodyfile="087_public_type.F90" bodystart="32" bodyend="32"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="087_public_type.F90" line="31" column="1" bodyfile="087_public_type.F90" bodystart="31" bodyend="33"/>
+ <listofallmembers>
+ <member refid="structmymodule_1_1t4_1aca212dfbb52db21b5c166b416b3019ac" prot="public" virt="non-virtual">
+ <scope>mymodule::t4</scope>
+ <name>publicvariable</name>
+ </member>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+!// objective: test visibility of types in modules
+!// check: structmymodule_1_1t1.xml
+!// check: structmymodule_1_1t2.xml
+!// check: structmymodule_1_1t3.xml
+!// check: structmymodule_1_1t4.xml
+!// config: OPTIMIZE_FOR_FORTRAN=YES
+!// config: WARN_IF_UNDOCUMENTED=NO
+
+module myModule
+ implicit none
+ private
+
+ public :: T3
+
+ type T1
+ integer :: publicVariable
+ end type T1
+
+ public :: T1
+
+ type, public :: T2
+ integer :: publicVariable
+ contains
+ end type
+
+ type T3
+ private
+ integer :: privateVariable
+ end type
+
+ type, private :: T4
+ integer :: publicVariable
+ end type
+
+end module myModule
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem1" kind="namespace" language="Fortran">
+ <compoundname>m1</compoundname>
+ <sectiondef kind="var">
+ <memberdef kind="variable" id="088__module__var_8f90_1a55e8d6a2f6109fb1922ad6632985d31e" prot="public" static="no" mutable="no">
+ <type>integer, public</type>
+ <definition>integer, public m1::v1</definition>
+ <argsstring/>
+ <name>v1</name>
+ <qualifiedname>m1::v1</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="12" column="1" bodyfile="088_module_var.f90" bodystart="12" bodyend="12"/>
+ </memberdef>
+ <memberdef kind="variable" id="088__module__var_8f90_1a7b21adea511c81513d1be2f1f3b6b9eb" prot="public" static="no" mutable="no">
+ <type>integer, public</type>
+ <definition>integer, public m1::v2</definition>
+ <argsstring/>
+ <name>v2</name>
+ <qualifiedname>m1::v2</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="15" column="1" bodyfile="088_module_var.f90" bodystart="15" bodyend="15"/>
+ </memberdef>
+ <memberdef kind="variable" id="088__module__var_8f90_1a1ef6299cbb534bef991fc651df8274ec" prot="public" static="no" mutable="no">
+ <type>integer, public</type>
+ <definition>integer, public m1::v3</definition>
+ <argsstring/>
+ <name>v3</name>
+ <qualifiedname>m1::v3</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="16" column="1" bodyfile="088_module_var.f90" bodystart="16" bodyend="16"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="088_module_var.f90" line="6" column="1"/>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem2" kind="namespace" language="Fortran">
+ <compoundname>m2</compoundname>
+ <sectiondef kind="var">
+ <memberdef kind="variable" id="088__module__var_8f90_1aa9535f64b6a936c2e53e2f4ddd2f7043" prot="private" static="no" mutable="no">
+ <type>integer, private</type>
+ <definition>integer, private m2::v1</definition>
+ <argsstring/>
+ <name>v1</name>
+ <qualifiedname>m2::v1</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="24" column="1" bodyfile="088_module_var.f90" bodystart="24" bodyend="24"/>
+ </memberdef>
+ <memberdef kind="variable" id="088__module__var_8f90_1aab4499a13318c88c757d70bbfc8278e5" prot="public" static="no" mutable="no">
+ <type>integer</type>
+ <definition>integer m2::v2</definition>
+ <argsstring/>
+ <name>v2</name>
+ <qualifiedname>m2::v2</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="26" column="1" bodyfile="088_module_var.f90" bodystart="26" bodyend="26"/>
+ </memberdef>
+ <memberdef kind="variable" id="088__module__var_8f90_1a14cb0c2e7f4f108ca3a06b79f6635c5c" prot="private" static="no" mutable="no">
+ <type>integer, private</type>
+ <definition>integer, private m2::v3</definition>
+ <argsstring/>
+ <name>v3</name>
+ <qualifiedname>m2::v3</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="28" column="1" bodyfile="088_module_var.f90" bodystart="28" bodyend="28"/>
+ </memberdef>
+ <memberdef kind="variable" id="088__module__var_8f90_1a7e7474396674938ae25b1a2300109b1c" prot="public" static="no" mutable="no">
+ <type>integer, public</type>
+ <definition>integer, public m2::v4</definition>
+ <argsstring/>
+ <name>v4</name>
+ <qualifiedname>m2::v4</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="088_module_var.f90" line="30" column="1" bodyfile="088_module_var.f90" bodystart="30" bodyend="30"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="088_module_var.f90" line="20" column="1"/>
+ </compounddef>
+</doxygen>
--- /dev/null
+!// objective: test visibility of variables in modules
+!// check: namespacem1.xml
+!// check: namespacem2.xml
+!// config: OPTIMIZE_FOR_FORTRAN=YES
+
+module M1
+ implicit none
+ private
+
+ public :: V3
+
+ integer :: V1
+ public :: V1
+
+ integer, public :: V2
+ integer :: V3
+
+end module M1
+
+module M2
+ implicit none
+
+ private :: V1
+ integer :: V1
+
+ integer :: V2
+
+ integer, private :: V3
+
+ integer :: V4
+ public :: V4
+
+end module M2
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem1" kind="namespace" language="Fortran">
+ <compoundname>m1</compoundname>
+ <sectiondef kind="func">
+ <memberdef kind="function" id="089__module__proc_8f90_1ad35985ac837c9f6b7d8eda2d753144a1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>subroutine, public</type>
+ <definition>subroutine, public m1::f1</definition>
+ <argsstring/>
+ <name>f1</name>
+ <qualifiedname>m1::f1</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="15" column="1" bodyfile="089_module_proc.f90" bodystart="16" bodyend="15"/>
+ </memberdef>
+ <memberdef kind="function" id="089__module__proc_8f90_1a8b970b4cce0abecdba010cc682e9894e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>subroutine, public</type>
+ <definition>subroutine, public m1::f2</definition>
+ <argsstring/>
+ <name>f2</name>
+ <qualifiedname>m1::f2</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="18" column="1" bodyfile="089_module_proc.f90" bodystart="19" bodyend="18"/>
+ </memberdef>
+ <memberdef kind="function" id="089__module__proc_8f90_1abee3d0fa94615ec38bca901754207860" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>subroutine, public</type>
+ <definition>subroutine, public m1::f3</definition>
+ <argsstring/>
+ <name>f3</name>
+ <qualifiedname>m1::f3</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="21" column="1" bodyfile="089_module_proc.f90" bodystart="22" bodyend="21"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="089_module_proc.f90" line="6" column="1"/>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem2" kind="namespace" language="Fortran">
+ <compoundname>m2</compoundname>
+ <sectiondef kind="func">
+ <memberdef kind="function" id="089__module__proc_8f90_1aa7111755564ab9d350b9ad05c9272ddb" prot="private" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>subroutine, private</type>
+ <definition>subroutine, private m2::f1</definition>
+ <argsstring/>
+ <name>f1</name>
+ <qualifiedname>m2::f1</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="35" column="1" bodyfile="089_module_proc.f90" bodystart="36" bodyend="35"/>
+ </memberdef>
+ <memberdef kind="function" id="089__module__proc_8f90_1a43afff306423f5c42342d1e8a484ffa8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>integer function, public</type>
+ <definition>integer function, public m2::f2</definition>
+ <argsstring/>
+ <name>f2</name>
+ <qualifiedname>m2::f2</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="38" column="1" bodyfile="089_module_proc.f90" bodystart="39" bodyend="39"/>
+ </memberdef>
+ <memberdef kind="function" id="089__module__proc_8f90_1a924eff4c3fc96894fa67cc3f86fd2690" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>subroutine, public</type>
+ <definition>subroutine, public m2::f3</definition>
+ <argsstring/>
+ <name>f3</name>
+ <qualifiedname>m2::f3</qualifiedname>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="089_module_proc.f90" line="42" column="1" bodyfile="089_module_proc.f90" bodystart="43" bodyend="42"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="089_module_proc.f90" line="26" column="1"/>
+ </compounddef>
+</doxygen>
--- /dev/null
+!// objective: test visibility of variables in modules
+!// check: namespacem1.xml
+!// check: namespacem2.xml
+!// config: OPTIMIZE_FOR_FORTRAN=YES
+
+module M1
+ implicit none
+ private
+
+ public :: f1
+ public :: f2, f3
+
+contains
+
+ subroutine f1
+ end subroutine
+
+ subroutine f2
+ end subroutine
+
+ subroutine f3
+ end subroutine
+
+end module M1
+
+module M2
+ implicit none
+
+ private :: f1
+ public :: f2
+ public :: f3
+
+contains
+
+ subroutine f1
+ end subroutine
+
+ function f2
+ integer :: f2
+ end subroutine
+
+ subroutine f3
+ end subroutine
+
+end module M2
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem1" kind="namespace" language="Fortran">
+ <compoundname>m1</compoundname>
+ <innerclass refid="structm1_1_1t1" prot="public">m1::t1</innerclass>
+ <innerclass refid="structm1_1_1t2" prot="public">m1::t2</innerclass>
+ <innerclass refid="structm1_1_1t3" prot="public">m1::t3</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="095_inheritance.f03" line="12" column="1"/>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem2" kind="namespace" language="Fortran">
+ <compoundname>m2</compoundname>
+ <innerclass refid="structm2_1_1t3" prot="public">m2::t3</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="095_inheritance.f03" line="28" column="1"/>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem3" kind="namespace" language="Fortran">
+ <compoundname>m3</compoundname>
+ <innerclass refid="structm3_1_1t4" prot="public">m3::t4</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="095_inheritance.f03" line="37" column="1"/>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t1" kind="type" language="Fortran" prot="public">
+ <compoundname>m1::t1</compoundname>
+ <derivedcompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</derivedcompoundref>
+ <derivedcompoundref refid="structm3_1_1t4" prot="public" virt="non-virtual">m3::t4</derivedcompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="1">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="3">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="4">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="5">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <location file="095_inheritance.f03" line="16" column="1" bodyfile="095_inheritance.f03" bodystart="16" bodyend="-1"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t2" kind="type" language="Fortran" prot="public">
+ <compoundname>m1::t2</compoundname>
+ <basecompoundref refid="structm1_1_1t1" prot="public" virt="non-virtual">m1::t1</basecompoundref>
+ <derivedcompoundref refid="structm1_1_1t3" prot="public" virt="non-virtual">m1::t3</derivedcompoundref>
+ <derivedcompoundref refid="structm2_1_1t3" prot="public" virt="non-virtual">m2::t3</derivedcompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="3">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="4">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="095_inheritance.f03" line="19" column="1" bodyfile="095_inheritance.f03" bodystart="19" bodyend="-1"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t3" kind="type" language="Fortran" prot="public">
+ <compoundname>m1::t3</compoundname>
+ <basecompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="095_inheritance.f03" line="23" column="1" bodyfile="095_inheritance.f03" bodystart="23" bodyend="-1"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm2_1_1t3" kind="type" language="Fortran" prot="public">
+ <compoundname>m2::t3</compoundname>
+ <basecompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="095_inheritance.f03" line="32" column="1" bodyfile="095_inheritance.f03" bodystart="32" bodyend="-1"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm3_1_1t4" kind="type" language="Fortran" prot="public">
+ <compoundname>m3::t4</compoundname>
+ <basecompoundref refid="structm1_1_1t1" prot="public" virt="non-virtual">m1::t1</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="095_inheritance.f03" line="41" column="1" bodyfile="095_inheritance.f03" bodystart="41" bodyend="-1"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+!// objective: test inheritance in Fortran
+!// check: structm1_1_1t1.xml
+!// check: structm1_1_1t2.xml
+!// check: structm1_1_1t3.xml
+!// check: structm2_1_1t3.xml
+!// check: structm3_1_1t4.xml
+!// check: namespacem1.xml
+!// check: namespacem2.xml
+!// check: namespacem3.xml
+!// config: OPTIMIZE_FOR_FORTRAN=YES
+
+module M1
+ implicit none
+ public
+
+ type T1
+ end type T1
+
+ type, extends(T1) :: T2
+ contains
+ end type
+
+ type, extends(T2) :: T3
+ end type
+
+end module M1
+
+module M2
+ use M1
+ implicit none
+
+ type, extends(T2) :: T3
+ end type
+
+end module M2
+
+module M3
+ use M2, only: T1
+ implicit none
+
+ type, extends(T1) :: T4
+ end type
+
+end module M3
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem1" kind="namespace" language="C++">
+ <compoundname>m1</compoundname>
+ <innerclass refid="structm1_1_1t1" prot="public">m1::t1</innerclass>
+ <innerclass refid="structm1_1_1t2" prot="public">m1::t2</innerclass>
+ <innerclass refid="structm1_1_1t3" prot="public">m1::t3</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="096_namespace_inheritance.cpp" line="11" column="1"/>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem2" kind="namespace" language="C++">
+ <compoundname>m2</compoundname>
+ <innerclass refid="structm2_1_1t3" prot="public">m2::t3</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="096_namespace_inheritance.cpp" line="26" column="1"/>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacem3" kind="namespace" language="C++">
+ <compoundname>m3</compoundname>
+ <innerclass refid="structm3_1_1t4" prot="public">m3::t4</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="096_namespace_inheritance.cpp" line="35" column="1"/>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t1" kind="struct" language="C++" prot="public">
+ <compoundname>m1::t1</compoundname>
+ <derivedcompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</derivedcompoundref>
+ <derivedcompoundref refid="structm3_1_1t4" prot="public" virt="non-virtual">m3::t4</derivedcompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="1">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="3">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="4">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="5">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <location file="096_namespace_inheritance.cpp" line="13" column="3" bodyfile="096_namespace_inheritance.cpp" bodystart="14" bodyend="15"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t2" kind="struct" language="C++" prot="public">
+ <compoundname>m1::t2</compoundname>
+ <basecompoundref refid="structm1_1_1t1" prot="public" virt="non-virtual">m1::t1</basecompoundref>
+ <derivedcompoundref refid="structm1_1_1t3" prot="public" virt="non-virtual">m1::t3</derivedcompoundref>
+ <derivedcompoundref refid="structm2_1_1t3" prot="public" virt="non-virtual">m2::t3</derivedcompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="3">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="4">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="1" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="096_namespace_inheritance.cpp" line="17" column="3" bodyfile="096_namespace_inheritance.cpp" bodystart="18" bodyend="19"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm1_1_1t3" kind="struct" language="C++" prot="public">
+ <compoundname>m1::t3</compoundname>
+ <basecompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m1::t3</label>
+ <link refid="structm1_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="096_namespace_inheritance.cpp" line="21" column="3" bodyfile="096_namespace_inheritance.cpp" bodystart="22" bodyend="23"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm2_1_1t3" kind="struct" language="C++" prot="public">
+ <compoundname>m2::t3</compoundname>
+ <basecompoundref refid="structm1_1_1t2" prot="public" virt="non-virtual">m1::t2</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="3">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="2">
+ <label>m1::t2</label>
+ <link refid="structm1_1_1t2"/>
+ <childnode refid="3" relation="public-inheritance">
+ </childnode>
+ </node>
+ <node id="1">
+ <label>m2::t3</label>
+ <link refid="structm2_1_1t3"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="096_namespace_inheritance.cpp" line="30" column="3" bodyfile="096_namespace_inheritance.cpp" bodystart="31" bodyend="32"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="structm3_1_1t4" kind="struct" language="C++" prot="public">
+ <compoundname>m3::t4</compoundname>
+ <basecompoundref refid="structm1_1_1t1" prot="public" virt="non-virtual">m1::t1</basecompoundref>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inheritancegraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </inheritancegraph>
+ <collaborationgraph>
+ <node id="2">
+ <label>m1::t1</label>
+ <link refid="structm1_1_1t1"/>
+ </node>
+ <node id="1">
+ <label>m3::t4</label>
+ <link refid="structm3_1_1t4"/>
+ <childnode refid="2" relation="public-inheritance">
+ </childnode>
+ </node>
+ </collaborationgraph>
+ <location file="096_namespace_inheritance.cpp" line="39" column="3" bodyfile="096_namespace_inheritance.cpp" bodystart="40" bodyend="41"/>
+ <listofallmembers>
+ </listofallmembers>
+ </compounddef>
+</doxygen>
--- /dev/null
+// objective: test inheritance over namespace works the same in C++ and Fortran (see test 095)
+// check: structm1_1_1t1.xml
+// check: structm1_1_1t2.xml
+// check: structm1_1_1t3.xml
+// check: structm2_1_1t3.xml
+// check: structm3_1_1t4.xml
+// check: namespacem1.xml
+// check: namespacem2.xml
+// check: namespacem3.xml
+
+namespace m1
+{
+ struct t1
+ {
+ };
+
+ struct t2: public t1
+ {
+ };
+
+ struct t3: public t2
+ {
+ };
+}
+
+namespace m2
+{
+ using namespace m1;
+
+ struct t3: public t2
+ {
+ };
+}
+
+namespace m3
+{
+ using m2::t1;
+
+ struct t4: public t1
+ {
+ };
+}
<!ATTLIST script
added
async (async) #IMPLIED
+
+ Adjustemens:
+ - added picture tag
+ - added source tag
+ - adjusted possible children of a number of elements so they support the picture tag
-->
<!--================ Character mnemonic entities =========================-->
<!--=================== Text Elements ====================================-->
<!ENTITY % special.extra
- "object | applet | img | map | iframe">
+ "object | applet | img | map | iframe | picture">
<!ENTITY % special.basic
"br | span | bdo">
"p | %heading; | div | %lists; | %blocktext; | isindex |fieldset | table">
<!-- %Flow; mixes block and inline and is used for list items etc. -->
-<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
+<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc; | picture)*">
<!--================== Content models for exclusions =====================-->
vspace %Pixels; #IMPLIED
>
+<!ELEMENT source EMPTY>
+<!ATTLIST source
+ %attrs;
+ media %MediaDesc; #REQUIRED
+ srcset %URI; #REQUIRED
+ >
+
+<!ELEMENT picture (source+, img)>
+<!ATTLIST picture %attrs;>
+
<!-- usemap points to a map element which may be in this document
or an external document, although the latter is not widely supported -->
--- /dev/null
+# Manual test for function Config::updateObsolete
+#
+# Usage:
+#
+# cat obsolete | ../build/bin/doxygen -s -u - | grep -e 'DOT_COMMON_ATTR.*F1.*123' -e 'DOT_EDGE_ATTR.*F1.*123'
+#
+# Check output manually. Expected two lines in stderr and two lines in stdout.
+
+# obsoleted attributes:
+DOT_FONTNAME=F1
+DOT_FONTSIZE=123
-#!/usr/bin/python
+#!/usr/bin/env python
from __future__ import print_function
import argparse, glob, itertools, re, shutil, os, sys
def xopen(fname, mode='r', encoding='utf-8'):
- '''Unified file opening for Python 2 an Python 3.
+ '''Unified file opening for Python 2 an Python 3.
- Python 2 does not have the encoding argument. Python 3 has one.
- '''
+ Python 2 does not have the encoding argument. Python 3 has one.
+ '''
- if sys.version_info[0] == 2:
- return open(fname, mode=mode) # Python 2 without encoding
- else:
- return open(fname, mode=mode, encoding=encoding) # Python 3 with encoding
+ if sys.version_info[0] == 2:
+ return open(fname, mode=mode) # Python 2 without encoding
+ else:
+ return open(fname, mode=mode, encoding=encoding) # Python 3 with encoding
def xpopen(cmd, cmd1="",encoding='utf-8-sig', getStderr=False):
- '''Unified file pipe opening for Python 2 an Python 3.
+ '''Unified file pipe opening for Python 2 an Python 3.
- Python 2 does not have the encoding argument. Python 3 has one. and
- '''
+ Python 2 does not have the encoding argument. Python 3 has one. and
+ '''
- if sys.version_info[0] == 2:
- return os.popen(cmd).read() # Python 2 without encoding
- else:
- if (getStderr):
- proc = subprocess.Popen(shlex.split(cmd1),stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding=encoding) # Python 3 with encoding
- return proc.stderr.read()
- else:
- proc = subprocess.Popen(shlex.split(cmd),stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding=encoding) # Python 3 with encoding
- return proc.stdout.read()
+ if sys.version_info[0] == 2:
+ return os.popen(cmd).read() # Python 2 without encoding
+ else:
+ if (getStderr):
+ proc = subprocess.Popen(shlex.split(cmd1),stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding=encoding) # Python 3 with encoding
+ return proc.stderr.read()
+ else:
+ proc = subprocess.Popen(shlex.split(cmd),stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding=encoding) # Python 3 with encoding
+ return proc.stdout.read()
def clean_header(errmsg):
- # messages (due to the usage of more) have a contents like:
- # ::::::::::::
- # <file name>
- # ::::::::::::
- # we want to skip these
- msg = errmsg.split('\n')
- rtnmsg = ""
- cnt = -1
- for o in msg:
- if (o):
- if (cnt == -1):
- if o.startswith(":::::::"):
- cnt = 3
- if (cnt > 0):
- cnt-=1
- else:
- rtnmsg+=o
- return rtnmsg
+ # messages (due to the usage of more) have a contents like:
+ # ::::::::::::
+ # <file name>
+ # ::::::::::::
+ # we want to skip these
+ msg = errmsg.split('\n')
+ rtnmsg = ""
+ cnt = -1
+ for o in msg:
+ if (o):
+ if (cnt == -1):
+ if o.startswith(":::::::"):
+ cnt = 3
+ if (cnt > 0):
+ cnt-=1
+ else:
+ rtnmsg+=o
+ return rtnmsg
class Tester:
- def __init__(self,args,test):
- self.args = args
- self.test = test
- self.update = args.updateref
- self.config = self.get_config()
- self.test_name = '[%s]: %s' % (self.test,self.config['objective'][0])
- self.test_id = self.test.split('_')[0]
- if self.update:
- self.test_out = self.args.inputdir+'/'+self.test_id
- else:
- self.test_out = self.args.outputdir+'/test_output_'+self.test_id
- self.prepare_test()
-
- def compare_ok(self,got_file,expected_file,name):
- if not os.path.isfile(got_file):
- return (True,'%s absent' % got_file)
- elif not os.path.isfile(expected_file):
- return (True,'%s absent' % expected_file)
- else:
- diff = xpopen('diff -b -w -u %s %s' % (got_file,expected_file))
- if diff and not diff.startswith("No differences"):
- return (True,'Difference between generated output and reference:\n%s' % diff)
- return (False,'')
-
- def cleanup_xmllint(self,errmsg):
- msg = errmsg.split('\n')
- rtnmsg = ""
- for o in msg:
- if (o):
- if (o.startswith("I/O error : Attempt")):
- pass
- else:
- if (rtnmsg):
- rtnmsg += '\n'
- rtnmsg += o
- return rtnmsg
-
- def cleanup_xmllint_docbook(self,errmsg):
- # For future work, first get everything valid XML
- msg = self.cleanup_xmllint(errmsg).split('\n')
- rtnmsg = ""
- cnt = 0
- for o in msg:
- if (o):
- if (cnt):
- cnt -= 1
- pass
- elif (o.endswith("does not validate")):
- pass
- elif (o.find("no DTD found!")!=-1):
- pass
- elif (o.find("is not an NCName")!=-1):
- cnt = 2
- else:
- if (rtnmsg):
- rtnmsg += '\n'
- rtnmsg += o
- return rtnmsg
-
- def get_config(self):
- config = {}
- with xopen(self.args.inputdir+'/'+self.test,'r') as f:
- for line in f.readlines():
- m = config_reg.match(line)
- if m:
- key = m.group('name')
- value = m.group('value')
- if (key=='config'):
- value = value.replace('$INPUTDIR',self.args.inputdir)
- # print('key=%s value=%s' % (key,value))
- config.setdefault(key, []).append(value)
- return config
-
- def prepare_test(self):
- # prepare test environment
- shutil.rmtree(self.test_out,ignore_errors=True)
- os.mkdir(self.test_out)
- shutil.copy(self.args.inputdir+'/Doxyfile',self.test_out)
- with xopen(self.test_out+'/Doxyfile','a') as f:
- print('INPUT=%s/%s' % (self.args.inputdir,self.test), file=f)
- print('STRIP_FROM_PATH=%s' % self.args.inputdir, file=f)
- print('EXAMPLE_PATH=%s' % self.args.inputdir, file=f)
- print('WARN_LOGFILE=%s/warnings.log' % self.test_out, file=f)
- if 'config' in self.config:
- for option in self.config['config']:
- print(option, file=f)
- if (self.args.xml or self.args.xmlxsd):
- print('GENERATE_XML=YES', file=f)
- print('XML_OUTPUT=%s/out' % self.test_out, file=f)
- else:
- print('GENERATE_XML=NO', file=f)
- if (self.args.rtf):
- print('GENERATE_RTF=YES', file=f)
- print('RTF_HYPERLINKS=YES', file=f)
- print('RTF_OUTPUT=%s/rtf' % self.test_out, file=f)
- else:
- print('GENERATE_RTF=NO', file=f)
- if (self.args.docbook):
- print('GENERATE_DOCBOOK=YES', file=f)
- print('DOCBOOK_OUTPUT=%s/docbook' % self.test_out, file=f)
- else:
- print('GENERATE_DOCBOOK=NO', file=f)
- if (self.args.qhp):
- print('GENERATE_QHP=YES', file=f)
- if (self.args.xhtml or self.args.qhp):
- print('GENERATE_HTML=YES', file=f)
- # HTML_OUTPUT can also have been set locally
- print('HTML_OUTPUT=%s/html' % self.test_out, file=f)
- print('HTML_FILE_EXTENSION=.xhtml', file=f)
- if (self.args.pdf):
- print('GENERATE_LATEX=YES', file=f)
- print('LATEX_BATCHMODE=YES', file=f)
- print('LATEX_OUTPUT=%s/latex' % self.test_out, file=f)
- if self.args.subdirs:
- print('CREATE_SUBDIRS=YES', file=f)
- if (self.args.clang):
- print('CLANG_ASSISTED_PARSING=YES', file=f)
- if (self.args.cfgs):
- for cfg in self.args.cfgs:
- if cfg[0].find('=') == -1:
- print("Not a doxygen configuration item, missing '=' sign: '%s'."%cfg)
- sys.exit(1)
- print(cfg[0], file=f)
-
- if 'check' not in self.config or not self.config['check']:
- print('Test doesn\'t specify any files to check')
- sys.exit(1)
-
- # run doxygen
- if (sys.platform == 'win32'):
- redir=' > nul: 2>&1'
- else:
- redir=' 2> /dev/null > /dev/null'
-
- if (self.args.noredir):
- redir=''
-
- if os.system('%s %s/Doxyfile %s' % (self.args.doxygen,self.test_out,redir))!=0:
- print('Error: failed to run %s on %s/Doxyfile' % (self.args.doxygen,self.test_out))
- sys.exit(1)
-
-
- def check_link_rtf_file(self,fil):
- bkmk_res = []
- hyper_res = []
- pageref_res = []
- with xopen(fil,'r') as f:
- for line in f.readlines():
- if ("bkmkstart" in line) or ("HYPERLINK" in line) or ("PAGEREF" in line):
- msg = line.split('}')
- for m in msg:
- if bkmk_reg.match(m):
- m1 = re.sub(bkmk_reg, '\\1', m)
- bkmk_res.append(m1)
- elif hyper_reg.match(m):
- m1 = re.sub(hyper_reg, '\\1', m)
- hyper_res.append(m1)
- elif pageref_reg.match(m):
- m1 = re.sub(pageref_reg, '\\1', m)
- pageref_res.append(m1)
- # Has been commented out as in the test 57, inline namespace, there is still a small problem.
- #if sorted(bkmk_res) != sorted(set(bkmk_res)):
- # return (False, "RTF: one (or more) bookmark(s) has(have) been defined multiple times")
- hyper_res = sorted(set(hyper_res))
- for h in hyper_res:
- if h not in bkmk_res:
- #print(bkmk_res)
- #print(hyper_res)
- return (False, "RTF: Not all used hyperlinks have been defined")
- pageref_res = sorted(set(pageref_res))
- for p in pageref_res:
- if p not in bkmk_res:
- #print(bkmk_res)
- #print(pageref_res)
- return (False, "RTF: Not all used page reference bookmarks have been defined")
- return (True,"")
-
-
- # update the reference data for this test
- def update_test(self,testmgr):
- print('Updating reference for %s' % self.test_name)
-
- if 'check' in self.config:
- for check in self.config['check']:
- check_file='%s/out/%s' % (self.test_out,check)
- # check if the file we need to check is actually generated
- if not os.path.isfile(check_file):
- print('Non-existing file %s after \'check:\' statement' % check_file)
- return False
- # convert output to canonical form
- data = xpopen('%s --format --noblanks --nowarning %s' % (self.args.xmllint,check_file))
- if data:
- # strip version
- data = re.sub(r'xsd" version="[0-9.-]+"','xsd" version=""',data).rstrip('\n')
- else:
- print('Failed to run %s on the doxygen output file %s' % (self.args.xmllint,self.test_out))
- return False
- out_file='%s/%s' % (self.test_out,check)
- with xopen(out_file,'w') as f:
- print(data,file=f)
- shutil.rmtree(self.test_out+'/out',ignore_errors=True)
- os.remove(self.test_out+'/Doxyfile')
- return True
-
- # check the relevant files of a doxygen run with the reference material
- def perform_test(self,testmgr):
- if (sys.platform == 'win32'):
- redir=' > nul:'
- separ='&'
- else:
- redir=' 2> /dev/null'
- separ=';'
-
- if (self.args.noredir):
- redir=''
-
- failed_xml=False
- failed_html=False
- failed_qhp=False
- failed_latex=False
- failed_docbook=False
- failed_rtf=False
- failed_xmlxsd=False
- msg = ()
- # look for files to check against the reference
- if self.args.xml or self.args.xmlxsd:
- failed_xml=False
- if 'check' in self.config and self.args.xml:
- failed_xml=True
- for check in self.config['check']:
- check_file='%s/out/%s' % (self.test_out,check)
- # check if the file we need to check is actually generated
- if not os.path.isfile(check_file):
- # try with sub dirs
- check_file = glob.glob('%s/out/*/*/%s' % (self.test_out,check))
- if not check_file:
- check_file='%s/out/%s' % (self.test_out,check)
- msg += ('Non-existing file %s after \'check:\' statement' % check_file,)
- break
- else:
- check_file = check_file[0]
- # convert output to canonical form
- check_file = check_file.replace('\\','/')
- data = xpopen('%s --format --noblanks --nowarning %s' % (self.args.xmllint,check_file))
- if data:
- # strip version
- data = re.sub(r'xsd" version="[0-9.-]+"','xsd" version=""',data).rstrip('\n')
- else:
- msg += ('Failed to run %s on the doxygen output file %s' % (self.args.xmllint,self.test_out),)
- break
- if self.args.subdirs:
- data = re.sub('d[0-9a-f]/d[0-9a-f][0-9a-f]/','',data)
- out_file='%s/%s' % (self.test_out,check)
- with xopen(out_file,'w') as f:
- print(data,file=f)
- ref_file='%s/%s/%s' % (self.args.inputdir,self.test_id,check)
- (failed_xml,xml_msg) = self.compare_ok(out_file,ref_file,self.test_name)
- if failed_xml:
- msg+= (xml_msg,)
- break
- failed_xmlxsd=False
- if self.args.xmlxsd:
- xmlxsd_output='%s/out' % self.test_out
- if (sys.platform == 'win32'):
- redirx=' 2> %s/temp >nul:'%xmlxsd_output
- else:
- redirx='2>%s/temp >/dev/null'%xmlxsd_output
- #
- index_xml = []
- index_xml.append(glob.glob('%s/index.xml' % (xmlxsd_output)))
- index_xml.append(glob.glob('%s/*/*/index.xml' % (xmlxsd_output)))
- index_xml = ' '.join(list(itertools.chain.from_iterable(index_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
- index_xsd = []
- index_xsd.append(glob.glob('%s/index.xsd' % (xmlxsd_output)))
- index_xsd.append(glob.glob('%s/*/*/index.xsd' % (xmlxsd_output)))
- index_xsd = ' '.join(list(itertools.chain.from_iterable(index_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
- exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,index_xsd,index_xml)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
-
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- if xmllint_out:
- xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
- else:
- msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,index_xsd,index_xml),)
- failed_xmlxsd=True
- if xmllint_out:
- xmllint_out = clean_header(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_xmlxsd=True
- #
- doxyfile_xml = []
- doxyfile_xml.append(glob.glob('%s/Doxyfile.xml' % (xmlxsd_output)))
- doxyfile_xml.append(glob.glob('%s/*/*/Doxyfile.xml' % (xmlxsd_output)))
- doxyfile_xml = ' '.join(list(itertools.chain.from_iterable(doxyfile_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
- doxyfile_xsd = []
- doxyfile_xsd.append(glob.glob('%s/doxyfile.xsd' % (xmlxsd_output)))
- doxyfile_xsd.append(glob.glob('%s/*/*/doxyfile.xsd' % (xmlxsd_output)))
- doxyfile_xsd = ' '.join(list(itertools.chain.from_iterable(doxyfile_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
- exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,doxyfile_xsd,doxyfile_xml)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
-
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- if xmllint_out:
- xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
- else:
- msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,doxyfile_xsd,doxyfile_xml),)
- failed_xmlxsd=True
- if xmllint_out:
- xmllint_out = clean_header(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_xmlxsd=True
- #
- compound_xml = []
- compound_xml.append(glob.glob('%s/*.xml' % (xmlxsd_output)))
- compound_xml.append(glob.glob('%s/*/*/*.xml' % (xmlxsd_output)))
- compound_xml = ' '.join(list(itertools.chain.from_iterable(compound_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
- compound_xml = re.sub(r' [^ ]*/index.xml','',compound_xml)
- compound_xml = re.sub(r'[^ ]*/index.xml ','',compound_xml)
- compound_xml = re.sub(r' [^ ]*/Doxyfile.xml','',compound_xml)
- compound_xml = re.sub(r'[^ ]*/Doxyfile.xml ','',compound_xml)
-
- compound_xsd = []
- compound_xsd.append(glob.glob('%s/compound.xsd' % (xmlxsd_output)))
- compound_xsd.append(glob.glob('%s/*/*/compound.xsd' % (xmlxsd_output)))
- compound_xsd = ' '.join(list(itertools.chain.from_iterable(compound_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
- exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,compound_xsd,compound_xml)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
-
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- if xmllint_out:
- xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
- else:
- msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,compound_xsd,compound_xml),)
- failed_xmlxsd=True
- if xmllint_out:
- xmllint_out = clean_header(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_xmlxsd=True
-
- if not failed_xml and not failed_xmlxsd and not self.args.keep:
- xml_output='%s/out' % self.test_out
- shutil.rmtree(xml_output,ignore_errors=True)
-
- if (self.args.rtf):
- (res, msg1) = self.check_link_rtf_file("%s/rtf/refman.rtf" % self.test_out)
- if not res:
- #msg += ("RTF: Not all used hyperlinks have been defined",)
- msg += (msg1,)
- failed_rtf=True
-
- if (self.args.docbook):
- docbook_output='%s/docbook' % self.test_out
- if (sys.platform == 'win32'):
- redirx=' 2> %s/temp >nul:'%docbook_output
- else:
- redirx='2>%s/temp >/dev/null'%docbook_output
- # For future work, first get everything valid XML
- # exe_string = '%s --relaxng db/docbook.rng --nonet --postvalid %s/*xml %s % (self.args.xmllint,docbook_output,redirx)
- tests = []
- tests.append(glob.glob('%s/*.xml' % (docbook_output)))
- tests.append(glob.glob('%s/*/*/*.xml' % (docbook_output)))
- tests = ' '.join(list(itertools.chain.from_iterable(tests))).replace(self.args.outputdir +'/','').replace('\\','/')
- exe_string = '%s --noout --nonet --postvalid %s' % (self.args.xmllint,tests)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,docbook_output)
-
- failed_docbook=False
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- xmllint_out = self.cleanup_xmllint_docbook(xmllint_out)
- if xmllint_out:
- xmllint_out = clean_header(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_docbook=True
- elif not self.args.keep:
- shutil.rmtree(docbook_output,ignore_errors=True)
-
- if (self.args.xhtml or self.args.qhp):
- html_output='%s/html' % self.test_out
- if (sys.platform == 'win32'):
- redirx=' 2> %s/temp >nul:'%html_output
- else:
- redirx='2>%s/temp >/dev/null'%html_output
- check_file = []
- check_file.append(glob.glob('%s/*.xhtml' % (html_output)))
- check_file.append(glob.glob('%s/*/*/*.xhtml' % (html_output)))
- check_file = ' '.join(list(itertools.chain.from_iterable(check_file))).replace(self.args.outputdir +'/','').replace('\\','/')
- exe_string = '%s --noout --path dtd --nonet --postvalid %s' % (self.args.xmllint,check_file)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,html_output)
- failed_html=False
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- xmllint_out = self.cleanup_xmllint(xmllint_out)
- if xmllint_out:
- xmllint_out = clean_header(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_html=True
-
- failed_qhp=False
- if not failed_html and self.args.qhp:
- check_file = "%s/index.qhp"%(html_output)
- exe_string = '%s --noout %s' % (self.args.xmllint,check_file)
- exe_string1 = exe_string
- exe_string += ' %s' % (redirx)
- exe_string += ' %s more "%s/temp"' % (separ,html_output)
- xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
- xmllint_out = self.cleanup_xmllint(xmllint_out)
- if xmllint_out:
- msg += (xmllint_out,)
- failed_qhp=True
- if not failed_html and not failed_qhp and not self.args.keep:
- shutil.rmtree(html_output,ignore_errors=True)
- if (self.args.pdf):
- failed_latex=False
- latex_output='%s/latex' % self.test_out
- # with languages like Hungarian we had problems with some tests on windows when stderr was used.
- if (sys.platform == 'win32'):
- outType=False
- redirl='>nul: 2>temp'
- mk='make.bat'
- else:
- outType=True
- redirl='>/dev/null 2>temp'
- mk='make'
- cur_directory = os.getcwd()
- os.chdir(latex_output)
- exe_string = mk
- exe_string1 = exe_string
- exe_string += ' %s' % (redirl)
- if outType:
- exe_string += ' %s more temp' % (separ)
- latex_out = xpopen(exe_string,exe_string1,getStderr=outType)
- os.chdir(cur_directory);
- if (outType and latex_out.find("Error")!=-1):
- msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
- failed_latex=True
- elif (not outType and xopen(latex_output + "/temp",'r').read().find("Error")!= -1):
- msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
- failed_latex=True
- elif xopen(latex_output + "/refman.log",'r',encoding='ISO-8859-1').read().find("Error")!= -1:
- msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
- failed_latex=True
- elif xopen(latex_output + "/refman.log",'r',encoding='ISO-8859-1').read().find("Emergency stop")!= -1:
- msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
- failed_latex=True
- elif not self.args.keep:
- shutil.rmtree(latex_output,ignore_errors=True)
-
- warnings = xopen(self.test_out + "/warnings.log",'r',encoding='ISO-8859-1').read()
- failed_warn = len(warnings)!=0
- if failed_warn:
- msg += (warnings,)
-
- if failed_warn or failed_xml or failed_html or failed_qhp or failed_latex or failed_docbook or failed_rtf or failed_xmlxsd:
- testmgr.ok(False,self.test_name,msg)
- return False
-
- testmgr.ok(True,self.test_name)
- if not self.args.keep:
- shutil.rmtree(self.test_out,ignore_errors=True)
- return True
-
- def run(self,testmgr):
- if self.update:
- return self.update_test(testmgr)
- else:
- return self.perform_test(testmgr)
+ def __init__(self,args,test):
+ self.args = args
+ self.test = test
+ self.update = args.updateref
+ self.config = self.get_config()
+ self.test_name = '[%s]: %s' % (self.test,self.config['objective'][0])
+ self.test_id = self.test.split('_')[0]
+ if self.update:
+ self.test_out = self.args.inputdir+'/'+self.test_id
+ else:
+ self.test_out = self.args.outputdir+'/test_output_'+self.test_id
+ self.prepare_test()
+
+ def compare_ok(self,got_file,expected_file,name):
+ if not os.path.isfile(got_file):
+ return (True,'%s absent' % got_file)
+ elif not os.path.isfile(expected_file):
+ return (True,'%s absent' % expected_file)
+ else:
+ diff = xpopen('diff -b -w -u %s %s' % (got_file,expected_file))
+ if diff and not diff.startswith("No differences"):
+ return (True,'Difference between generated output and reference:\n%s' % diff)
+ return (False,'')
+
+ def cleanup_xmllint(self,errmsg):
+ msg = errmsg.split('\n')
+ rtnmsg = ""
+ for o in msg:
+ if (o):
+ if (o.startswith("I/O error : Attempt")):
+ pass
+ else:
+ if (rtnmsg):
+ rtnmsg += '\n'
+ rtnmsg += o
+ return rtnmsg
+
+ def cleanup_xmllint_docbook(self,errmsg):
+ # For future work, first get everything valid XML
+ msg = self.cleanup_xmllint(errmsg).split('\n')
+ rtnmsg = ""
+ cnt = 0
+ for o in msg:
+ if (o):
+ if (cnt):
+ cnt -= 1
+ pass
+ elif (o.endswith("does not validate")):
+ pass
+ elif (o.find("no DTD found!")!=-1):
+ pass
+ elif (o.find("is not an NCName")!=-1):
+ cnt = 2
+ else:
+ if (rtnmsg):
+ rtnmsg += '\n'
+ rtnmsg += o
+ return rtnmsg
+
+ def get_config(self):
+ config = {}
+ with xopen(self.args.inputdir+'/'+self.test,'r') as f:
+ for line in f.readlines():
+ m = config_reg.match(line)
+ if m:
+ key = m.group('name')
+ value = m.group('value')
+ if (key=='config'):
+ value = value.replace('$INPUTDIR',self.args.inputdir)
+ # print('key=%s value=%s' % (key,value))
+ config.setdefault(key, []).append(value)
+ return config
+
+ def prepare_test(self):
+ # prepare test environment
+ shutil.rmtree(self.test_out,ignore_errors=True)
+ os.mkdir(self.test_out)
+ shutil.copy(self.args.inputdir+'/Doxyfile',self.test_out)
+ with xopen(self.test_out+'/Doxyfile','a') as f:
+ print('INPUT=%s/%s' % (self.args.inputdir,self.test), file=f)
+ print('STRIP_FROM_PATH=%s' % self.args.inputdir, file=f)
+ print('EXAMPLE_PATH=%s' % self.args.inputdir, file=f)
+ print('WARN_LOGFILE=%s/warnings.log' % self.test_out, file=f)
+ if 'config' in self.config:
+ for option in self.config['config']:
+ print(option, file=f)
+ if (self.args.xml or self.args.xmlxsd):
+ print('GENERATE_XML=YES', file=f)
+ print('XML_OUTPUT=%s/out' % self.test_out, file=f)
+ else:
+ print('GENERATE_XML=NO', file=f)
+ if (self.args.rtf):
+ print('GENERATE_RTF=YES', file=f)
+ print('RTF_HYPERLINKS=YES', file=f)
+ print('RTF_OUTPUT=%s/rtf' % self.test_out, file=f)
+ else:
+ print('GENERATE_RTF=NO', file=f)
+ if (self.args.docbook):
+ print('GENERATE_DOCBOOK=YES', file=f)
+ print('DOCBOOK_OUTPUT=%s/docbook' % self.test_out, file=f)
+ else:
+ print('GENERATE_DOCBOOK=NO', file=f)
+ if (self.args.qhp):
+ print('GENERATE_QHP=YES', file=f)
+ if (self.args.xhtml or self.args.qhp):
+ print('GENERATE_HTML=YES', file=f)
+ # HTML_OUTPUT can also have been set locally
+ print('HTML_OUTPUT=%s/html' % self.test_out, file=f)
+ print('HTML_FILE_EXTENSION=.xhtml', file=f)
+ if (self.args.pdf):
+ print('GENERATE_LATEX=YES', file=f)
+ print('LATEX_BATCHMODE=YES', file=f)
+ print('LATEX_OUTPUT=%s/latex' % self.test_out, file=f)
+ if self.args.subdirs:
+ print('CREATE_SUBDIRS=YES', file=f)
+ if (self.args.clang):
+ print('CLANG_ASSISTED_PARSING=YES', file=f)
+ if (self.args.cfgs):
+ for cfg in self.args.cfgs:
+ if cfg[0].find('=') == -1:
+ print("Not a doxygen configuration item, missing '=' sign: '%s'."%cfg)
+ sys.exit(1)
+ print(cfg[0], file=f)
+
+ if 'check' not in self.config or not self.config['check']:
+ print('Test doesn\'t specify any files to check')
+ sys.exit(1)
+
+ # run doxygen
+ if (sys.platform == 'win32'):
+ redir=' > nul: 2>&1'
+ else:
+ redir=' 2> /dev/null > /dev/null'
+
+ if (self.args.noredir):
+ redir=''
+
+ if os.system('%s %s/Doxyfile %s' % (self.args.doxygen,self.test_out,redir))!=0:
+ print('Error: failed to run %s on %s/Doxyfile' % (self.args.doxygen,self.test_out))
+ sys.exit(1)
+
+
+ def check_link_rtf_file(self,fil):
+ bkmk_res = []
+ hyper_res = []
+ pageref_res = []
+ with xopen(fil,'r') as f:
+ for line in f.readlines():
+ if ("bkmkstart" in line) or ("HYPERLINK" in line) or ("PAGEREF" in line):
+ msg = line.split('}')
+ for m in msg:
+ if bkmk_reg.match(m):
+ m1 = re.sub(bkmk_reg, '\\1', m)
+ bkmk_res.append(m1)
+ elif hyper_reg.match(m):
+ m1 = re.sub(hyper_reg, '\\1', m)
+ hyper_res.append(m1)
+ elif pageref_reg.match(m):
+ m1 = re.sub(pageref_reg, '\\1', m)
+ pageref_res.append(m1)
+ # Has been commented out as in the test 57, inline namespace, there is still a small problem.
+ #if sorted(bkmk_res) != sorted(set(bkmk_res)):
+ # return (False, "RTF: one (or more) bookmark(s) has(have) been defined multiple times")
+ hyper_res = sorted(set(hyper_res))
+ for h in hyper_res:
+ if h not in bkmk_res:
+ #print(bkmk_res)
+ #print(hyper_res)
+ return (False, "RTF: Not all used hyperlinks have been defined")
+ pageref_res = sorted(set(pageref_res))
+ for p in pageref_res:
+ if p not in bkmk_res:
+ #print(bkmk_res)
+ #print(pageref_res)
+ return (False, "RTF: Not all used page reference bookmarks have been defined")
+ return (True,"")
+
+
+ # update the reference data for this test
+ def update_test(self,testmgr):
+ print('Updating reference for %s' % self.test_name)
+
+ if 'check' in self.config:
+ for check in self.config['check']:
+ check_file='%s/out/%s' % (self.test_out,check)
+ # check if the file we need to check is actually generated
+ if not os.path.isfile(check_file):
+ print('Non-existing file %s after \'check:\' statement' % check_file)
+ return False
+ # convert output to canonical form
+ data = xpopen('%s --format --noblanks --nowarning %s' % (self.args.xmllint,check_file))
+ if data:
+ # strip version
+ data = re.sub(r'xsd" version="[0-9.-]+"','xsd" version=""',data).rstrip('\n')
+ else:
+ print('Failed to run %s on the doxygen output file %s' % (self.args.xmllint,self.test_out))
+ return False
+ out_file='%s/%s' % (self.test_out,check)
+ with xopen(out_file,'w') as f:
+ print(data,file=f)
+ shutil.rmtree(self.test_out+'/out',ignore_errors=True)
+ os.remove(self.test_out+'/Doxyfile')
+ return True
+
+ # check the relevant files of a doxygen run with the reference material
+ def perform_test(self,testmgr):
+ if (sys.platform == 'win32'):
+ redir=' > nul:'
+ separ='&'
+ else:
+ redir=' 2> /dev/null'
+ separ=';'
+
+ if (self.args.noredir):
+ redir=''
+
+ failed_xml=False
+ failed_html=False
+ failed_qhp=False
+ failed_latex=False
+ failed_docbook=False
+ failed_rtf=False
+ failed_xmlxsd=False
+ msg = ()
+ # look for files to check against the reference
+ if self.args.xml or self.args.xmlxsd:
+ failed_xml=False
+ if 'check' in self.config and self.args.xml:
+ failed_xml=True
+ for check in self.config['check']:
+ check_file='%s/out/%s' % (self.test_out,check)
+ # check if the file we need to check is actually generated
+ if not os.path.isfile(check_file):
+ # try with sub dirs
+ check_file = glob.glob('%s/out/*/*/%s' % (self.test_out,check))
+ if not check_file:
+ check_file='%s/out/%s' % (self.test_out,check)
+ msg += ('Non-existing file %s after \'check:\' statement' % check_file,)
+ break
+ else:
+ check_file = check_file[0]
+ # convert output to canonical form
+ check_file = check_file.replace('\\','/')
+ data = xpopen('%s --format --noblanks --nowarning %s' % (self.args.xmllint,check_file))
+ if data:
+ # strip version
+ data = re.sub(r'xsd" version="[0-9.-]+"','xsd" version=""',data).rstrip('\n')
+ else:
+ msg += ('Failed to run %s on the doxygen output file %s' % (self.args.xmllint,self.test_out),)
+ break
+ if self.args.subdirs:
+ data = re.sub('d[0-9a-f]/d[0-9a-f][0-9a-f]/','',data)
+ out_file='%s/%s' % (self.test_out,check)
+ with xopen(out_file,'w') as f:
+ print(data,file=f)
+ ref_file='%s/%s/%s' % (self.args.inputdir,self.test_id,check)
+ (failed_xml,xml_msg) = self.compare_ok(out_file,ref_file,self.test_name)
+ if failed_xml:
+ msg+= (xml_msg,)
+ break
+ failed_xmlxsd=False
+ if self.args.xmlxsd:
+ xmlxsd_output='%s/out' % self.test_out
+ if (sys.platform == 'win32'):
+ redirx=' 2> %s/temp >nul:'%xmlxsd_output
+ else:
+ redirx='2>%s/temp >/dev/null'%xmlxsd_output
+ #
+ index_xml = []
+ index_xml.append(glob.glob('%s/index.xml' % (xmlxsd_output)))
+ index_xml.append(glob.glob('%s/*/*/index.xml' % (xmlxsd_output)))
+ index_xml = ' '.join(list(itertools.chain.from_iterable(index_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
+ index_xsd = []
+ index_xsd.append(glob.glob('%s/index.xsd' % (xmlxsd_output)))
+ index_xsd.append(glob.glob('%s/*/*/index.xsd' % (xmlxsd_output)))
+ index_xsd = ' '.join(list(itertools.chain.from_iterable(index_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
+ exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,index_xsd,index_xml)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
+
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ if xmllint_out:
+ xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
+ else:
+ msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,index_xsd,index_xml),)
+ failed_xmlxsd=True
+ if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_xmlxsd=True
+ #
+ doxyfile_xml = []
+ doxyfile_xml.append(glob.glob('%s/Doxyfile.xml' % (xmlxsd_output)))
+ doxyfile_xml.append(glob.glob('%s/*/*/Doxyfile.xml' % (xmlxsd_output)))
+ doxyfile_xml = ' '.join(list(itertools.chain.from_iterable(doxyfile_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
+ doxyfile_xsd = []
+ doxyfile_xsd.append(glob.glob('%s/doxyfile.xsd' % (xmlxsd_output)))
+ doxyfile_xsd.append(glob.glob('%s/*/*/doxyfile.xsd' % (xmlxsd_output)))
+ doxyfile_xsd = ' '.join(list(itertools.chain.from_iterable(doxyfile_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
+ exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,doxyfile_xsd,doxyfile_xml)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
+
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ if xmllint_out:
+ xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
+ else:
+ msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,doxyfile_xsd,doxyfile_xml),)
+ failed_xmlxsd=True
+ if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_xmlxsd=True
+ #
+ compound_xml = []
+ compound_xml.append(glob.glob('%s/*.xml' % (xmlxsd_output)))
+ compound_xml.append(glob.glob('%s/*/*/*.xml' % (xmlxsd_output)))
+ compound_xml = ' '.join(list(itertools.chain.from_iterable(compound_xml))).replace(self.args.outputdir +'/','').replace('\\','/')
+ compound_xml = re.sub(r' [^ ]*/index.xml','',compound_xml)
+ compound_xml = re.sub(r'[^ ]*/index.xml ','',compound_xml)
+ compound_xml = re.sub(r' [^ ]*/Doxyfile.xml','',compound_xml)
+ compound_xml = re.sub(r'[^ ]*/Doxyfile.xml ','',compound_xml)
+
+ compound_xsd = []
+ compound_xsd.append(glob.glob('%s/compound.xsd' % (xmlxsd_output)))
+ compound_xsd.append(glob.glob('%s/*/*/compound.xsd' % (xmlxsd_output)))
+ compound_xsd = ' '.join(list(itertools.chain.from_iterable(compound_xsd))).replace(self.args.outputdir +'/','').replace('\\','/')
+ exe_string = '%s --noout --schema %s %s' % (self.args.xmllint,compound_xsd,compound_xml)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,xmlxsd_output)
+
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ if xmllint_out:
+ xmllint_out = re.sub(r'.*validates','',xmllint_out).rstrip('\n')
+ else:
+ msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,compound_xsd,compound_xml),)
+ failed_xmlxsd=True
+ if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_xmlxsd=True
+
+ if not failed_xml and not failed_xmlxsd and not self.args.keep:
+ xml_output='%s/out' % self.test_out
+ shutil.rmtree(xml_output,ignore_errors=True)
+
+ if (self.args.rtf):
+ (res, msg1) = self.check_link_rtf_file("%s/rtf/refman.rtf" % self.test_out)
+ if not res:
+ #msg += ("RTF: Not all used hyperlinks have been defined",)
+ msg += (msg1,)
+ failed_rtf=True
+
+ if (self.args.docbook):
+ docbook_output='%s/docbook' % self.test_out
+ if (sys.platform == 'win32'):
+ redirx=' 2> %s/temp >nul:'%docbook_output
+ else:
+ redirx='2>%s/temp >/dev/null'%docbook_output
+ # For future work, first get everything valid XML
+ # exe_string = '%s --relaxng db/docbook.rng --nonet --postvalid %s/*xml %s % (self.args.xmllint,docbook_output,redirx)
+ tests = []
+ tests.append(glob.glob('%s/*.xml' % (docbook_output)))
+ tests.append(glob.glob('%s/*/*/*.xml' % (docbook_output)))
+ tests = ' '.join(list(itertools.chain.from_iterable(tests))).replace(self.args.outputdir +'/','').replace('\\','/')
+ exe_string = '%s --noout --nonet --postvalid %s' % (self.args.xmllint,tests)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,docbook_output)
+
+ failed_docbook=False
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ xmllint_out = self.cleanup_xmllint_docbook(xmllint_out)
+ if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_docbook=True
+ elif not self.args.keep:
+ shutil.rmtree(docbook_output,ignore_errors=True)
+
+ if (self.args.xhtml or self.args.qhp):
+ html_output='%s/html' % self.test_out
+ if (sys.platform == 'win32'):
+ redirx=' 2> %s/temp >nul:'%html_output
+ else:
+ redirx='2>%s/temp >/dev/null'%html_output
+ check_file = []
+ check_file.append(glob.glob('%s/*.xhtml' % (html_output)))
+ check_file.append(glob.glob('%s/*/*/*.xhtml' % (html_output)))
+ check_file = ' '.join(list(itertools.chain.from_iterable(check_file))).replace(self.args.outputdir +'/','').replace('\\','/')
+ exe_string = '%s --noout --path dtd --nonet --postvalid %s' % (self.args.xmllint,check_file)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,html_output)
+ failed_html=False
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ xmllint_out = self.cleanup_xmllint(xmllint_out)
+ if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_html=True
+
+ failed_qhp=False
+ if not failed_html and self.args.qhp:
+ check_file = "%s/index.qhp"%(html_output)
+ exe_string = '%s --noout %s' % (self.args.xmllint,check_file)
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirx)
+ exe_string += ' %s more "%s/temp"' % (separ,html_output)
+ xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
+ xmllint_out = self.cleanup_xmllint(xmllint_out)
+ if xmllint_out:
+ msg += (xmllint_out,)
+ failed_qhp=True
+ if not failed_html and not failed_qhp and not self.args.keep:
+ shutil.rmtree(html_output,ignore_errors=True)
+ if (self.args.pdf):
+ failed_latex=False
+ latex_output='%s/latex' % self.test_out
+ # with languages like Hungarian we had problems with some tests on windows when stderr was used.
+ if (sys.platform == 'win32'):
+ outType=False
+ redirl='>nul: 2>temp'
+ mk='make.bat'
+ else:
+ outType=True
+ redirl='>/dev/null 2>temp'
+ mk='make'
+ cur_directory = os.getcwd()
+ os.chdir(latex_output)
+ exe_string = mk
+ exe_string1 = exe_string
+ exe_string += ' %s' % (redirl)
+ if outType:
+ exe_string += ' %s more temp' % (separ)
+ latex_out = xpopen(exe_string,exe_string1,getStderr=outType)
+ os.chdir(cur_directory);
+ if (outType and latex_out.find("Error")!=-1):
+ msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
+ failed_latex=True
+ elif (not outType and xopen(latex_output + "/temp",'r').read().find("Error")!= -1):
+ msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
+ failed_latex=True
+ elif xopen(latex_output + "/refman.log",'r',encoding='ISO-8859-1').read().find("Error")!= -1:
+ msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
+ failed_latex=True
+ elif xopen(latex_output + "/refman.log",'r',encoding='ISO-8859-1').read().find("Emergency stop")!= -1:
+ msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
+ failed_latex=True
+ elif not self.args.keep:
+ shutil.rmtree(latex_output,ignore_errors=True)
+
+ warnings = xopen(self.test_out + "/warnings.log",'r',encoding='ISO-8859-1').read()
+ failed_warn = len(warnings)!=0
+ if failed_warn:
+ msg += (warnings,)
+
+ if failed_warn or failed_xml or failed_html or failed_qhp or failed_latex or failed_docbook or failed_rtf or failed_xmlxsd:
+ testmgr.ok(False,self.test_name,msg)
+ return False
+
+ testmgr.ok(True,self.test_name)
+ if not self.args.keep:
+ shutil.rmtree(self.test_out,ignore_errors=True)
+ return True
+
+ def run(self,testmgr):
+ if self.update:
+ return self.update_test(testmgr)
+ else:
+ return self.perform_test(testmgr)
def do_generation_work(test):
- tester = Tester(test[0].args,test[1])
- return tester.run(test[0])
+ tester = Tester(test[0].args,test[1])
+ return tester.run(test[0])
class TestManager:
- def __init__(self,args,tests):
- self.args = args
- self.tests = tests
- self.num_tests = len(tests)
- self.count=1
- self.passed=0
- if (self.args.xhtml or self.args.qhp):
- self.prepare_dtd()
- print('1..%d' % self.num_tests)
-
- def ok(self,result,test_name,msg='Ok'):
- if result:
- print('ok - %s' % (test_name))
- self.passed = self.passed + 1
- else:
- print('not ok - %s' % (test_name))
- print('-------------------------------------')
- for o in msg:
- print(o)
- print('-------------------------------------')
- self.count = self.count + 1
-
- def result(self):
- if self.passed==self.num_tests:
- print('All tests passed!')
- else:
- print('%d out of %s tests failed' % (self.num_tests-self.passed,self.num_tests))
- return 0 if self.passed==self.num_tests else 1
-
- def perform_tests(self):
- if (self.args.pool == 1):
- passed = 0
- for test in self.tests:
- tester = Tester(self.args,test)
- passed += tester.run(self)
- self.passed = passed
- else:
- dl = []
- for test in self.tests:
- dl += [(self, test)]
- import multiprocessing as mp
- p = mp.Pool(processes=self.args.pool)
- passed = p.map(do_generation_work, dl)
- self.passed = sum(passed)
- res=self.result()
- if (self.args.xhtml or self.args.qhp) and self.args.inputdir!='.' and not res and not self.args.keep:
- shutil.rmtree("dtd",ignore_errors=True)
- return 0 if self.args.updateref else res
-
- def prepare_dtd(self):
- if self.args.inputdir!='.':
- shutil.rmtree("dtd",ignore_errors=True)
- shutil.copytree(self.args.inputdir+"/dtd", "dtd")
+ def __init__(self,args,tests):
+ self.args = args
+ self.tests = tests
+ self.num_tests = len(tests)
+ self.count=1
+ self.passed=0
+ if (self.args.xhtml or self.args.qhp):
+ self.prepare_dtd()
+ print('1..%d' % self.num_tests)
+
+ def ok(self,result,test_name,msg='Ok'):
+ if result:
+ print('ok - %s' % (test_name))
+ self.passed = self.passed + 1
+ else:
+ print('not ok - %s' % (test_name))
+ print('-------------------------------------')
+ for o in msg:
+ print(o)
+ print('-------------------------------------')
+ self.count = self.count + 1
+
+ def result(self):
+ if self.passed==self.num_tests:
+ print('All tests passed!')
+ else:
+ print('%d out of %s tests failed' % (self.num_tests-self.passed,self.num_tests))
+ return 0 if self.passed==self.num_tests else 1
+
+ def perform_tests(self):
+ if (self.args.pool == 1):
+ passed = 0
+ for test in self.tests:
+ tester = Tester(self.args,test)
+ passed += tester.run(self)
+ self.passed = passed
+ else:
+ dl = []
+ for test in self.tests:
+ dl += [(self, test)]
+ import multiprocessing as mp
+ p = mp.Pool(processes=self.args.pool)
+ passed = p.map(do_generation_work, dl)
+ self.passed = sum(passed)
+ res=self.result()
+ if (self.args.xhtml or self.args.qhp) and self.args.inputdir!='.' and not res and not self.args.keep:
+ shutil.rmtree("dtd",ignore_errors=True)
+ return 0 if self.args.updateref else res
+
+ def prepare_dtd(self):
+ if self.args.inputdir!='.':
+ shutil.rmtree("dtd",ignore_errors=True)
+ shutil.copytree(self.args.inputdir+"/dtd", "dtd")
def split_and_keep(s,sep):
s = s.replace('"','') # add token separator
return s
def main():
- # argument handling
- parser = argparse.ArgumentParser(description='run doxygen tests')
- parser.add_argument('--updateref',help=
- 'update the reference files. Should be used in combination with --id to '
- 'update the reference file(s) for the given test',action="store_true")
- parser.add_argument('--doxygen',nargs='?',default='doxygen',help=
- 'path/name of the doxygen executable')
- parser.add_argument('--xmllint',nargs='?',default='xmllint',help=
- 'path/name of the xmllint executable')
- parser.add_argument('--id',nargs='+',dest='ids',action='append',type=int,help=
- 'run test with number n only (the option can be specified to run test with '
- 'number n only (the option can be specified multiple times')
- parser.add_argument('--start_id',dest='start_id',type=int,help=
- 'run tests starting with number n')
- parser.add_argument('--end_id',dest='end_id',type=int,help=
- 'run tests ending with number n')
- parser.add_argument('--all',help=
- 'can be used in combination with -updateref to update the reference files '
- 'for all tests.',action="store_true")
- parser.add_argument('--inputdir',nargs='?',default='.',help=
- 'input directory containing the tests')
- parser.add_argument('--outputdir',nargs='?',default='.',help=
- 'output directory to write the doxygen output to')
- parser.add_argument('--noredir',help=
- 'disable redirection of doxygen warnings',action="store_true")
- parser.add_argument('--pool',nargs='?',default='1',type=int,help=
- 'pool size of multiprocess tests')
- parser.add_argument('--xml',help='create xml output and check',
- action="store_true")
- parser.add_argument('--rtf',help=
- 'create rtf output',action="store_true")
- parser.add_argument('--docbook',help=
- 'create docbook output and check with xmllint',action="store_true")
- parser.add_argument('--xhtml',help=
- 'create xhtml output and check with xmllint',action="store_true")
- parser.add_argument('--qhp',help=
- 'create qhp output and check with xmllint',action="store_true")
- parser.add_argument('--xmlxsd',help=
- 'create xml output and check with xmllint against xsd',action="store_true")
- parser.add_argument('--pdf',help='create LaTeX output and create pdf from it',
- action="store_true")
- parser.add_argument('--subdirs',help='use the configuration parameter CREATE_SUBDIRS=YES',
- action="store_true")
- parser.add_argument('--clang',help='use CLANG_ASSISTED_PARSING, works only when '
+ # argument handling
+ parser = argparse.ArgumentParser(description='run doxygen tests')
+ parser.add_argument('--updateref',help=
+ 'update the reference files. Should be used in combination with --id to '
+ 'update the reference file(s) for the given test',action="store_true")
+ parser.add_argument('--doxygen',nargs='?',default='doxygen',help=
+ 'path/name of the doxygen executable')
+ parser.add_argument('--xmllint',nargs='?',default='xmllint',help=
+ 'path/name of the xmllint executable')
+ parser.add_argument('--id',nargs='+',dest='ids',action='append',type=int,help=
+ 'run test with number n only (the option can be specified to run test with '
+ 'number n only (the option can be specified multiple times')
+ parser.add_argument('--start_id',dest='start_id',type=int,help=
+ 'run tests starting with number n')
+ parser.add_argument('--end_id',dest='end_id',type=int,help=
+ 'run tests ending with number n')
+ parser.add_argument('--all',help=
+ 'can be used in combination with -updateref to update the reference files '
+ 'for all tests.',action="store_true")
+ parser.add_argument('--inputdir',nargs='?',default='.',help=
+ 'input directory containing the tests')
+ parser.add_argument('--outputdir',nargs='?',default='.',help=
+ 'output directory to write the doxygen output to')
+ parser.add_argument('--noredir',help=
+ 'disable redirection of doxygen warnings',action="store_true")
+ parser.add_argument('--pool',nargs='?',default='1',type=int,help=
+ 'pool size of multiprocess tests')
+ parser.add_argument('--xml',help='create xml output and check',
+ action="store_true")
+ parser.add_argument('--rtf',help=
+ 'create rtf output',action="store_true")
+ parser.add_argument('--docbook',help=
+ 'create docbook output and check with xmllint',action="store_true")
+ parser.add_argument('--xhtml',help=
+ 'create xhtml output and check with xmllint',action="store_true")
+ parser.add_argument('--qhp',help=
+ 'create qhp output and check with xmllint',action="store_true")
+ parser.add_argument('--xmlxsd',help=
+ 'create xml output and check with xmllint against xsd',action="store_true")
+ parser.add_argument('--pdf',help='create LaTeX output and create pdf from it',
+ action="store_true")
+ parser.add_argument('--subdirs',help='use the configuration parameter CREATE_SUBDIRS=YES',
+ action="store_true")
+ parser.add_argument('--clang',help='use CLANG_ASSISTED_PARSING, works only when '
'doxygen has been compiled with "use_libclang"',
- action="store_true")
- parser.add_argument('--keep',help='keep result directories',
- action="store_true")
- parser.add_argument('--cfg',nargs='+',dest='cfgs',action='append',help=
- 'run test with extra doxygen configuration settings '
- '(the option may be specified multiple times')
-
- test_flags = split_and_keep(os.getenv('TEST_FLAGS', default=''), '--')
-
- args = parser.parse_args(test_flags + sys.argv[1:])
-
- # sanity check
- if (not args.xml) and (not args.pdf) and (not args.xhtml) and (not args.qhp) and (not args.docbook and (not args.rtf) and (not args.xmlxsd)):
- args.xml=True
- if (not args.updateref is None) and (args.ids is None) and (args.all is None):
- parser.error('--updateref requires either --id or --all')
-
- starting_directory = os.getcwd()
- os.chdir(args.inputdir)
- # find the tests to run
- tests = []
- if args.start_id:
- if args.end_id:
- for id in range(args.start_id, args.end_id + 1):
- tests.append(glob.glob('%s_*'%id))
- tests.append(glob.glob('0%s_*'%id))
- tests.append(glob.glob('00%s_*'%id))
- else:
- parser.error('--start_id requires --end_id')
- elif args.end_id:
- parser.error('--end_id requires --start_id')
- if args.ids: # test ids are given by user
- for id in list(itertools.chain.from_iterable(args.ids)):
- tests.append(glob.glob('%s_*'%id))
- tests.append(glob.glob('0%s_*'%id))
- tests.append(glob.glob('00%s_*'%id))
- if (not args.ids and not args.start_id): # find all tests
- tests = sorted(glob.glob('[0-9][0-9][0-9]_*'))
- else:
- tests = list(itertools.chain.from_iterable(tests))
- os.chdir(starting_directory)
-
- # create test manager to run the tests
- testManager = TestManager(args,tests)
- sys.exit(testManager.perform_tests())
+ action="store_true")
+ parser.add_argument('--keep',help='keep result directories',
+ action="store_true")
+ parser.add_argument('--cfg',nargs='+',dest='cfgs',action='append',help=
+ 'run test with extra doxygen configuration settings '
+ '(the option may be specified multiple times')
+
+ test_flags = split_and_keep(os.getenv('TEST_FLAGS', default=''), '--')
+
+ args = parser.parse_args(test_flags + sys.argv[1:])
+
+ # sanity check
+ if (not args.xml) and (not args.pdf) and (not args.xhtml) and (not args.qhp) and (not args.docbook and (not args.rtf) and (not args.xmlxsd)):
+ args.xml=True
+ if (not args.updateref is None) and (args.ids is None) and (args.all is None):
+ parser.error('--updateref requires either --id or --all')
+
+ starting_directory = os.getcwd()
+ os.chdir(args.inputdir)
+ # find the tests to run
+ tests = []
+ if args.start_id:
+ if args.end_id:
+ for id in range(args.start_id, args.end_id + 1):
+ tests.append(glob.glob('%s_*'%id))
+ tests.append(glob.glob('0%s_*'%id))
+ tests.append(glob.glob('00%s_*'%id))
+ else:
+ parser.error('--start_id requires --end_id')
+ elif args.end_id:
+ parser.error('--end_id requires --start_id')
+ if args.ids: # test ids are given by user
+ for id in list(itertools.chain.from_iterable(args.ids)):
+ tests.append(glob.glob('%s_*'%id))
+ tests.append(glob.glob('0%s_*'%id))
+ tests.append(glob.glob('00%s_*'%id))
+ if (not args.ids and not args.start_id): # find all tests
+ tests = sorted(glob.glob('[0-9][0-9][0-9]_*'))
+ else:
+ tests = list(itertools.chain.from_iterable(tests))
+ os.chdir(starting_directory)
+
+ # create test manager to run the tests
+ testManager = TestManager(args,tests)
+ sys.exit(testManager.perform_tests())
if __name__ == '__main__':
- main()
+ main()
-#! /usr/bin/python
+#!/usr/bin/env python
from xml.etree import cElementTree as ET
import os
import sqlite3
-#!/usr/bin/python
+#!/usr/bin/env python
# python script to adjust generated VhdlParser.cc
#
# Copyright (C) 1997-2021 by Dimitri van Heesch.