diff --git a/docs/_static/_css/shared.css b/docs/_static/_css/shared.css index f423ba9b9..a5b40bd09 100644 --- a/docs/_static/_css/shared.css +++ b/docs/_static/_css/shared.css @@ -123,7 +123,7 @@ svg.sn-flow-chart { } table.needs-grid-example { - border: 1px solid var(--color-table-border); + border: 1px solid var(--sn-color-table-border); } :root { diff --git a/docs/_static/_css/sphinx_rtd_theme.css b/docs/_static/_css/sphinx_rtd_theme.css index bc412cd02..d269120f0 100644 --- a/docs/_static/_css/sphinx_rtd_theme.css +++ b/docs/_static/_css/sphinx_rtd_theme.css @@ -10,9 +10,3 @@ div.wy-table-responsive { overflow-x: auto !important; } -/* a lot of components, like paragraphs and header, do not have a top margin -so the datatable does not have a gap to the subsequent element -*/ -div.dataTables_wrapper { - margin-bottom: 2em; -} diff --git a/requirements-dev.lock b/requirements-dev.lock new file mode 100644 index 000000000..7ab551c4f --- /dev/null +++ b/requirements-dev.lock @@ -0,0 +1,86 @@ +# generated by rye +# use `rye lock` or `rye sync` to update this lockfile +# +# last locked with the following flags: +# pre: false +# features: [] +# all-features: false +# with-sources: false +# generate-hashes: false +# universal: false + +-e file:. +alabaster==0.7.16 + # via sphinx +attrs==25.3.0 + # via jsonschema + # via referencing +babel==2.17.0 + # via sphinx +certifi==2025.4.26 + # via requests +charset-normalizer==3.4.2 + # via requests +docutils==0.21.2 + # via sphinx +idna==3.10 + # via requests +imagesize==1.4.1 + # via sphinx +importlib-metadata==8.7.0 + # via sphinx +jinja2==3.1.6 + # via sphinx +jsonschema==4.24.0 + # via sphinx-needs +jsonschema-specifications==2025.4.1 + # via jsonschema +markupsafe==3.0.2 + # via jinja2 +packaging==25.0 + # via sphinx +pygments==2.19.1 + # via sphinx +referencing==0.36.2 + # via jsonschema + # via jsonschema-specifications +requests==2.32.4 + # via requests-file + # via sphinx + # via sphinx-needs +requests-file==2.1.0 + # via sphinx-needs +rpds-py==0.25.1 + # via jsonschema + # via referencing +snowballstemmer==3.0.1 + # via sphinx +sphinx==7.4.7 + # via sphinx-data-viewer + # via sphinx-needs + # via sphinxcontrib-jquery +sphinx-data-viewer==0.1.5 + # via sphinx-needs +sphinxcontrib-applehelp==2.0.0 + # via sphinx +sphinxcontrib-devhelp==2.0.0 + # via sphinx +sphinxcontrib-htmlhelp==2.1.0 + # via sphinx +sphinxcontrib-jquery==4.1 + # via sphinx-needs +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==2.0.0 + # via sphinx +sphinxcontrib-serializinghtml==2.0.0 + # via sphinx +tomli==2.2.1 + # via sphinx + # via sphinx-needs +typing-extensions==4.14.0 + # via referencing +urllib3==2.4.0 + # via requests +zipp==3.23.0 + # via importlib-metadata diff --git a/requirements.lock b/requirements.lock new file mode 100644 index 000000000..7ab551c4f --- /dev/null +++ b/requirements.lock @@ -0,0 +1,86 @@ +# generated by rye +# use `rye lock` or `rye sync` to update this lockfile +# +# last locked with the following flags: +# pre: false +# features: [] +# all-features: false +# with-sources: false +# generate-hashes: false +# universal: false + +-e file:. +alabaster==0.7.16 + # via sphinx +attrs==25.3.0 + # via jsonschema + # via referencing +babel==2.17.0 + # via sphinx +certifi==2025.4.26 + # via requests +charset-normalizer==3.4.2 + # via requests +docutils==0.21.2 + # via sphinx +idna==3.10 + # via requests +imagesize==1.4.1 + # via sphinx +importlib-metadata==8.7.0 + # via sphinx +jinja2==3.1.6 + # via sphinx +jsonschema==4.24.0 + # via sphinx-needs +jsonschema-specifications==2025.4.1 + # via jsonschema +markupsafe==3.0.2 + # via jinja2 +packaging==25.0 + # via sphinx +pygments==2.19.1 + # via sphinx +referencing==0.36.2 + # via jsonschema + # via jsonschema-specifications +requests==2.32.4 + # via requests-file + # via sphinx + # via sphinx-needs +requests-file==2.1.0 + # via sphinx-needs +rpds-py==0.25.1 + # via jsonschema + # via referencing +snowballstemmer==3.0.1 + # via sphinx +sphinx==7.4.7 + # via sphinx-data-viewer + # via sphinx-needs + # via sphinxcontrib-jquery +sphinx-data-viewer==0.1.5 + # via sphinx-needs +sphinxcontrib-applehelp==2.0.0 + # via sphinx +sphinxcontrib-devhelp==2.0.0 + # via sphinx +sphinxcontrib-htmlhelp==2.1.0 + # via sphinx +sphinxcontrib-jquery==4.1 + # via sphinx-needs +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==2.0.0 + # via sphinx +sphinxcontrib-serializinghtml==2.0.0 + # via sphinx +tomli==2.2.1 + # via sphinx + # via sphinx-needs +typing-extensions==4.14.0 + # via referencing +urllib3==2.4.0 + # via requests +zipp==3.23.0 + # via importlib-metadata diff --git a/sphinx_needs/css/common/needstable.css b/sphinx_needs/css/common/needstable.css index 0fd90cb18..7fbe86069 100644 --- a/sphinx_needs/css/common/needstable.css +++ b/sphinx_needs/css/common/needstable.css @@ -21,86 +21,149 @@ div.needstable_wrapper { padding: 0; } -/* These are "overrides" for CSS added by the bundled https://datatables.net JS package */ +table.docutils.docutils td, table.docutils.docutils th { + background: var(--sn-color-datatable-body-bg); + border: 0.05rem solid color-mix(in srgb, var(--sn-color-table-border) 40%, transparent); + color: var(--sn-color-datatable-label); +} -table.dataTable { - border-collapse: collapse; +table.docutils.docutils th { + border-bottom: 0.05rem solid color-mix(in srgb, var(--sn-color-datatable-btn-border) 40%, transparent); +} +/* GridJS styles for to override the default GridJS styles +to match the Sphinx Needs theme and to ensure a consistent look and feel +with the rest of the Sphinx Needs documentation. + +The 3 sections of a GridJS container .gridjs-head, .gridjs-wrapper and .gridjs-footer */ +div.gridjs-container { + color: var(--sn-color-datatable-label); +} + +div.gridjs-wrapper { border: none; + border-radius: 0px; + box-shadow: 0 1px 3px 0 color-mix(in srgb, var(--sn-color-datatable-btn-border) 10%, transparent),0 1px 2px 0 color-mix(in srgb, var(--sn-color-datatable-btn-border) 26%, transparent); } -table.dataTable tbody tr { +div.gridjs-footer { background-color: var(--sn-color-datatable-body-bg); + border: none; + box-shadow: none; + padding: 12px; + border-top-width: 0px; } -div.dataTables_length { - margin-bottom: 10px; +/* .gridjs-head */ +.gridjs-search { + float: left; } -div.dataTables_wrapper { - overflow-x: auto; - padding: 0px 5px; - /*Space needed for table borders */ +div.gridjs-pagination-limit-div { + display: inline-block; + margin-left: 6px; } -.dataTables_wrapper .dataTables_paginate .paginate_button { - padding: 0.15em 0.75em; - background: none; +div.gridjs-pagination-limit-div select.gridjs-pagination-limit { + margin: 0 6px; + padding: 2px; } -.dataTables_wrapper .dataTables_paginate .paginate_button.current, -.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { - background: none; +div.gridjs-download-btns, div.gridjs-pagination-limit-div { + float: right; } -div.dataTables_length select { - background: none; +div.gridjs-download-btns button, select.gridjs-pagination-limit { + background-color: var(--sn-color-datatable-body-bg); color: var(--sn-color-datatable-label); - border: 1px solid var(--sn-color-datatable-btn-border); - border-radius: 2px; + border: 0.05rem solid color-mix(in srgb, var(--sn-color-datatable-btn-border) 30%, transparent); + padding: 4px; + border-radius: 3px; + outline: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; cursor: pointer; + margin-left: 6px; +} + +div.gridjs-download-btns button::before{ + content: ''; + display: inline-block; + width: 14px; + height: 14px; + background-size: contain; + background-repeat: no-repeat; + background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZT0iI2EyYTJhMiI+PHBhdGggc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBkPSJNMyAxNi41djIuMjVBMi4yNSAyLjI1IDAgMCAwIDUuMjUgMjFoMTMuNUEyLjI1IDIuMjUgMCAwIDAgMjEgMTguNzVWMTYuNU0xNi41IDEyIDEyIDE2LjVtMCAwTDcuNSAxMm00LjUgNC41VjMiIC8+PC9zdmc+'); + margin-right: 2px; +} + +/* .gridjs-wrapper */ +.gridjs-wrapper.scrolled .gridjs-th-fixed { + background-color: #a2a2a2; + color: #1c1c1c; + z-index: 999; + outline: 0.05rem solid color-mix(in srgb, var(--sn-color-table-border) 70%, transparent); +} + +table thead.gridjs-thead th.gridjs-th { + padding: 8px; +} + +th.gridjs-th .gridjs-th-content { + text-overflow: initial; + white-space: normal; + word-wrap: break-word; } -div.dt-buttons { - margin-left: 0.5em; +button.gridjs-sort-neutral, button.gridjs-sort-asc, button.gridjs-sort-desc{ + filter: brightness(0) saturate(100%) invert(40%) sepia(10%) saturate(366%) hue-rotate(182deg) brightness(94%) contrast(89%); +} +tbody.gridjs-tbody { + background-color: var(--sn-color-datatable-body-bg); } -div.dt-buttons button { - padding: 0.1em 1em; - border: 1px solid var(--sn-color-datatable-btn-border); - border-radius: 2px; - font-size: 0.88em; - line-height: inherit; +table tbody.gridjs-tbody td.gridjs-td { + padding: 8px; +} +/* .gridjs-footer */ +.gridjs-pagination { color: var(--sn-color-datatable-label); - white-space: nowrap; - overflow: hidden; - background-color: inherit; - background-image: none; } -.dataTables_wrapper .dataTables_filter input { - max-width: 100px; - border: 1px solid var(--sn-color-datatable-btn-border); - margin-bottom: 10px; - background-color: transparent; - border-radius: 2px; +.gridjs-pagination .gridjs-pages button { + background-color: var(--sn-color-datatable-body-bg); + color: var(--sn-color-datatable-label); + border: none; + padding: 8px; } -.dataTables_wrapper.dataTables_wrapper .dataTables_length, -.dataTables_wrapper.dataTables_wrapper .dataTables_filter, -.dataTables_wrapper.dataTables_wrapper .dataTables_info, -.dataTables_wrapper.dataTables_wrapper .dataTables_processing { +.gridjs-pagination .gridjs-pages button:hover { + background-color: var(--sn-color-datatable-body-bg); color: var(--sn-color-datatable-label); + opacity: 0.7; } -.dataTables_wrapper.dataTables_wrapper .dataTables_paginate, -.dataTables_wrapper.dataTables_wrapper .dataTables_paginate a.paginate_button, -.dataTables_wrapper.dataTables_wrapper .dataTables_paginate a.paginate_button.current { - /* datatables set this as !important, so unfortunately we have to do the same */ - color: var(--sn-color-datatable-label) !important; +.gridjs-pagination .gridjs-pages button:disabled, .gridjs-pagination .gridjs-pages button:hover:disabled, .gridjs-pagination .gridjs-pages button[disabled] { + background-color: var(--sn-color-datatable-body-bg); + filter: saturate(0.25); +} +.gridjs-pagination .gridjs-pages button.gridjs-currentPage { + background-color: var(--sn-color-datatable-body-bg); + color: var(--sn-color-datatable-label); + font-weight: bolder; +} +.gridjs-pagination .gridjs-pages button.gridjs-spread { + background-color: var(--sn-color-datatable-body-bg); } -.dataTables_wrapper.dataTables_wrapper .dataTables_paginate a.paginate_button.disabled { - filter: saturate(0.5); +.gridjs-pagination .gridjs-pages button:last-child { + border: none; } -/* TODO: Ideally, if there is only one page, then the paginate buttons should be hidden. */ +/* Other GridJS style override */ +input.gridjs-input { + background-color: var(--sn-color-datatable-body-bg); + color: var(--sn-color-datatable-label); + border: 0.05rem solid color-mix(in srgb, var(--sn-color-datatable-btn-border) 40%, transparent); + padding: 4px; +} diff --git a/sphinx_needs/css/themes/blank.css b/sphinx_needs/css/themes/blank.css index 740db07ca..2aa686ef7 100644 --- a/sphinx_needs/css/themes/blank.css +++ b/sphinx_needs/css/themes/blank.css @@ -31,6 +31,7 @@ --sn-color-datatable-body-bg: transparent; --sn-color-datatable-label: #333; --sn-color-datatable-btn-border: #999; + --sn-color-table-border: #a3a3a3; --sn-color-debug-btn-border: #333; --sn-color-debug-btn-on-text: #f43333; diff --git a/sphinx_needs/css/themes/dark.css b/sphinx_needs/css/themes/dark.css index c1eb95350..c57f8be51 100644 --- a/sphinx_needs/css/themes/dark.css +++ b/sphinx_needs/css/themes/dark.css @@ -31,6 +31,7 @@ --sn-color-datatable-body-bg: transparent; --sn-color-datatable-label: #eee; --sn-color-datatable-btn-border: #999; + --sn-color-table-border: #a3a3a3; --sn-color-debug-btn-border: #888; --sn-color-debug-btn-on-text: #ff3f34; @@ -38,107 +39,3 @@ --sn-color-forbidden-dead-link: #dc3545; } - - -/* DataTable layout*/ -/* TODO this should not be part of the theme */ -.dataTables_wrapper .dataTables_paginate .paginate_button.current, -.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { - color: inherit !important; -} - -.dataTables_wrapper .dataTables_paginate .paginate_button { - color: inherit !important; -} - -.dataTables_wrapper .dataTables_paginate .paginate_button:hover { - border: none; - background: inherit; -} - -.dataTables_wrapper .dataTables_length, -.dataTables_wrapper .dataTables_filter, -.dataTables_wrapper .dataTables_info, -.dataTables_wrapper .dataTables_processing, -.dataTables_wrapper .dataTables_paginate { - color: inherit; -} - -table.dataTable tbody tr { - background-color: inherit; -} - -div.dataTables_length select { - color: inherit; - border: none; -} - -div.dataTables_length select option { - background: #333; - color: inherit; - border: none; -} - -div.dataTables_filter input { - background: inherit; - color: inherit; - border: 1px solid #666; -} - -div.dataTables_filter input:focus { - outline: none; -} - -table.dataTable thead th, table.dataTable thead td { - border-bottom: inherit; -} - -/*DataTables Download Buttons*/ - -button.dt-button:hover:not(.disabled), -div.dt-button:hover:not(.disabled), -a.dt-button:hover:not(.disabled) { - background-color: inherit; - background-image: none; - border: inherit; -} - -/*DataTables Column visibility Select list*/ -div.dt-button-collection { - background-color: #333; -} - -/* Button active*/ -div.dt-button-collection button.dt-button:active:not(.disabled), -div.dt-button-collection button.dt-button.active:not(.disabled), -div.dt-button-collection div.dt-button:active:not(.disabled), -div.dt-button-collection div.dt-button.active:not(.disabled), -div.dt-button-collection a.dt-button:active:not(.disabled), -div.dt-button-collection a.dt-button.active:not(.disabled) { - background: #444 none; - box-shadow: none; -} - -/* Button active hover*/ -button.dt-button:hover:not(.disabled), -div.dt-button:hover:not(.disabled), -a.dt-button:hover:not(.disabled) { - background: #333 none; - box-shadow: none; -} - -/* Button deactivated hover*/ -button.dt-button:active:not(.disabled):hover:not(.disabled), -button.dt-button.active:not(.disabled):hover:not(.disabled), -div.dt-button:active:not(.disabled):hover:not(.disabled), -div.dt-button.active:not(.disabled):hover:not(.disabled), -a.dt-button:active:not(.disabled):hover:not(.disabled), -a.dt-button.active:not(.disabled):hover:not(.disabled) { - background: #555 none; - box-shadow: none; -} - -/* DataTablesScrollWrapper*/ -div.DTS div.dataTables_scrollBody { - background: inherit; -} diff --git a/sphinx_needs/css/themes/modern.css b/sphinx_needs/css/themes/modern.css index 9f8a83fc9..b3c549305 100644 --- a/sphinx_needs/css/themes/modern.css +++ b/sphinx_needs/css/themes/modern.css @@ -31,6 +31,7 @@ --sn-color-datatable-body-bg: transparent; --sn-color-datatable-label: #333; --sn-color-datatable-btn-border: #999; + --sn-color-table-border: #a3a3a3; --sn-color-debug-btn-border: #333; --sn-color-debug-btn-on-text: #f43333; diff --git a/sphinx_needs/environment.py b/sphinx_needs/environment.py index aae33af5d..112855a9f 100644 --- a/sphinx_needs/environment.py +++ b/sphinx_needs/environment.py @@ -90,20 +90,22 @@ def install_lib_static_files(app: Sphinx, env: BuildEnvironment) -> None: if builder.name == "needs": return - logger.info("Copying static files for sphinx-needs datatables support") + logger.info("Copying static files for sphinx-needs gridJS support") statics_dir = Path(builder.outdir) / _STATIC_DIR_NAME source_dir = Path(__file__).parent / "libs" / "html" destination_dir = statics_dir / "sphinx-needs" / "libs" / "html" - # "Copying static files for sphinx-needs datatables support..." + # "Copying static files for sphinx-needs gridJS support..." copy_asset(str(source_dir), str(destination_dir)) - # Add the needed datatables js and css file + # Add the needed gridJS js and css file lib_path = Path("sphinx-needs") / "libs" / "html" - _add_js_file(app, lib_path.joinpath("datatables.min.js")) - _add_js_file(app, lib_path.joinpath("datatables_loader.js")) - _add_css_file(app, lib_path.joinpath("datatables.min.css")) + _add_css_file(app, lib_path.joinpath("GridJS/gridjs-theme.min.css")) + _add_js_file(app, lib_path.joinpath("GridJS/gridjs.umd.js")) + _add_js_file(app, lib_path.joinpath("GridJS/jspdf.umd.min.js")) + _add_js_file(app, lib_path.joinpath("GridJS/jspdf.plugin.autotable.min.js")) + _add_js_file(app, lib_path.joinpath("gridjs_loader.js")) _add_js_file(app, lib_path.joinpath("sphinx_needs_collapse.js")) diff --git a/sphinx_needs/libs/html/Buttons-1.5.1/css/buttons.dataTables.min.css b/sphinx_needs/libs/html/Buttons-1.5.1/css/buttons.dataTables.min.css deleted file mode 100644 index a178fc155..000000000 --- a/sphinx_needs/libs/html/Buttons-1.5.1/css/buttons.dataTables.min.css +++ /dev/null @@ -1 +0,0 @@ -@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:0.333em;margin-bottom:0.333em;padding:0.5em 1em;border:1px solid #999;border-radius:2px;cursor:pointer;font-size:0.88em;line-height:1.6em;color:black;white-space:nowrap;overflow:hidden;background-color:#e9e9e9;background-image:-webkit-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-o-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:linear-gradient(to bottom, #fff 0%, #e9e9e9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white', EndColorStr='#e9e9e9');-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled{color:#999;border:1px solid #d0d0d0;cursor:default;background-color:#f9f9f9;background-image:-webkit-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-o-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:linear-gradient(to bottom, #fff 0%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9')}button.dt-button:active:not(.disabled),button.dt-button.active:not(.disabled),div.dt-button:active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button:active:not(.disabled),a.dt-button.active:not(.disabled){background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:linear-gradient(to bottom, #f3f3f3 0%, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#e2e2e2');box-shadow:inset 1px 1px 3px #999999}button.dt-button:active:not(.disabled):hover:not(.disabled),button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button:active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button:active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999999;background-color:#cccccc;background-image:-webkit-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-moz-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-ms-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-o-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:linear-gradient(to bottom, #eaeaea 0%, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea', EndColorStr='#cccccc')}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled){border:1px solid #666;background-color:#e0e0e0;background-image:-webkit-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-moz-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:linear-gradient(to bottom, #f9f9f9 0%, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9', EndColorStr='#e0e0e0')}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled){border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#79ace9;background-image:-webkit-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-moz-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-ms-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-o-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:linear-gradient(to bottom, #bddef4 0%, #79ace9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4', EndColorStr='#79ace9')}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,0.3);z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background-image:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada');box-shadow:inset 1px 1px 3px #666}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0,0,0,0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear} diff --git a/sphinx_needs/libs/html/Buttons-1.5.1/css/common.scss b/sphinx_needs/libs/html/Buttons-1.5.1/css/common.scss deleted file mode 100644 index 8312ccd84..000000000 --- a/sphinx_needs/libs/html/Buttons-1.5.1/css/common.scss +++ /dev/null @@ -1,27 +0,0 @@ - -div.dt-button-info { - position: fixed; - top: 50%; - left: 50%; - width: 400px; - margin-top: -100px; - margin-left: -200px; - background-color: white; - border: 2px solid #111; - box-shadow: 3px 3px 8px rgba( 0, 0, 0, 0.3); - border-radius: 3px; - text-align: center; - z-index: 21; - - h2 { - padding: 0.5em; - margin: 0; - font-weight: normal; - border-bottom: 1px solid #ddd; - background-color: #f3f3f3; - } - - > div { - padding: 1em; - } -} diff --git a/sphinx_needs/libs/html/Buttons-1.5.1/css/mixins.scss b/sphinx_needs/libs/html/Buttons-1.5.1/css/mixins.scss deleted file mode 100644 index 632894289..000000000 --- a/sphinx_needs/libs/html/Buttons-1.5.1/css/mixins.scss +++ /dev/null @@ -1,141 +0,0 @@ - -@mixin dtb-two-stop-gradient($fromColor, $toColor) { - background-color: $toColor; /* Fallback */ - background-image: -webkit-linear-gradient(top, $fromColor 0%, $toColor 100%); /* Chrome 10+, Saf5.1+, iOS 5+ */ - background-image: -moz-linear-gradient(top, $fromColor 0%, $toColor 100%); /* FF3.6 */ - background-image: -ms-linear-gradient(top, $fromColor 0%, $toColor 100%); /* IE10 */ - background-image: -o-linear-gradient(top, $fromColor 0%, $toColor 100%); /* Opera 11.10+ */ - background-image: linear-gradient(to bottom, $fromColor 0%, $toColor 100%); - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#{nth( $fromColor, 1 )}', EndColorStr='#{nth( $toColor, 1 )}'); -} - -@mixin dtb-radial-gradient ($fromColor, $toColor ) { - background: $toColor; /* Fallback */ - background: -ms-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* IE10 Consumer Preview */ - background: -moz-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* Firefox */ - background: -o-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* Opera */ - background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, $fromColor), color-stop(1, $toColor)); /* Webkit (Safari/Chrome 10) */ - background: -webkit-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* Webkit (Chrome 11+) */ - background: radial-gradient(ellipse farthest-corner at center, $fromColor 0%, $toColor 100%); /* W3C Markup, IE10 Release Preview */ -} - - -@mixin dtb-fixed-collection { - // Fixed positioning feature - &.fixed { - position: fixed; - top: 50%; - left: 50%; - margin-left: -75px; - border-radius: 0; - - &.two-column { - margin-left: -150px; - } - - &.three-column { - margin-left: -225px; - } - - &.four-column { - margin-left: -300px; - } - } - - // Multi-column layout feature - -webkit-column-gap: 8px; - -moz-column-gap: 8px; - -ms-column-gap: 8px; - -o-column-gap: 8px; - column-gap: 8px; - - > * { - -webkit-column-break-inside: avoid; - break-inside: avoid; - } - - &.two-column { - width: 300px; - padding-bottom: 1px; - - -webkit-column-count: 2; - -moz-column-count: 2; - -ms-column-count: 2; - -o-column-count: 2; - column-count: 2; - } - - &.three-column { - width: 450px; - padding-bottom: 1px; - - -webkit-column-count: 3; - -moz-column-count: 3; - -ms-column-count: 3; - -o-column-count: 3; - column-count: 3; - } - - &.four-column { - width: 600px; - padding-bottom: 1px; - - -webkit-column-count: 4; - -moz-column-count: 4; - -ms-column-count: 4; - -o-column-count: 4; - column-count: 4; - } - - // Chrome fix - 531528 - .dt-button { - border-radius: 0; - } -} - - -@mixin dtb-processing { - color: rgba(0, 0, 0, 0.2); - - &:after { - position: absolute; - top: 50%; - left: 50%; - width: 16px; - height: 16px; - margin: -8px 0 0 -8px; - box-sizing: border-box; - - display: block; - content: ' '; - border: 2px solid rgb(40,40,40); - border-radius: 50%; - border-left-color: transparent; - border-right-color: transparent; - animation: dtb-spinner 1500ms infinite linear; - -o-animation: dtb-spinner 1500ms infinite linear; - -ms-animation: dtb-spinner 1500ms infinite linear; - -webkit-animation: dtb-spinner 1500ms infinite linear; - -moz-animation: dtb-spinner 1500ms infinite linear; - } -} - -@keyframes dtb-spinner { - 100%{ transform: rotate(360deg); } -} - -@-o-keyframes dtb-spinner { - 100%{ -o-transform: rotate(360deg); transform: rotate(360deg); } -} - -@-ms-keyframes dtb-spinner { - 100%{ -ms-transform: rotate(360deg); transform: rotate(360deg); } -} - -@-webkit-keyframes dtb-spinner { - 100%{ -webkit-transform: rotate(360deg); transform: rotate(360deg); } -} - -@-moz-keyframes dtb-spinner { - 100%{ -moz-transform: rotate(360deg); transform: rotate(360deg); } -} diff --git a/sphinx_needs/libs/html/Buttons-1.5.1/js/buttons.colVis.min.js b/sphinx_needs/libs/html/Buttons-1.5.1/js/buttons.colVis.min.js deleted file mode 100644 index 1afd98d02..000000000 --- a/sphinx_needs/libs/html/Buttons-1.5.1/js/buttons.colVis.min.js +++ /dev/null @@ -1,6 +0,0 @@ -(function(g){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(d){return g(d,window,document)}):"object"===typeof exports?module.exports=function(d,e){d||(d=window);if(!e||!e.fn.dataTable)e=require("datatables.net")(d,e).$;e.fn.dataTable.Buttons||require("datatables.net-buttons")(d,e);return g(e,d,d.document)}:g(jQuery,window,document)})(function(g,d,e,h){d=g.fn.dataTable;g.extend(d.ext.buttons,{colvis:function(b,a){return{extend:"collection", -text:function(a){return a.i18n("buttons.colvis","Column visibility")},className:"buttons-colvis",buttons:[{extend:"columnsToggle",columns:a.columns,columnText:a.columnText}]}},columnsToggle:function(b,a){return b.columns(a.columns).indexes().map(function(b){return{extend:"columnToggle",columns:b,columnText:a.columnText}}).toArray()},columnToggle:function(b,a){return{extend:"columnVisibility",columns:a.columns,columnText:a.columnText}},columnsVisibility:function(b,a){return b.columns(a.columns).indexes().map(function(b){return{extend:"columnVisibility", -columns:b,visibility:a.visibility,columnText:a.columnText}}).toArray()},columnVisibility:{columns:h,text:function(b,a,c){return c._columnText(b,c)},className:"buttons-columnVisibility",action:function(b,a,c,f){b=a.columns(f.columns);a=b.visible();b.visible(f.visibility!==h?f.visibility:!(a.length&&a[0]))},init:function(b,a,c){var f=this;b.on("column-visibility.dt"+c.namespace,function(a,d){!d.bDestroying&&d.nTable==b.settings()[0].nTable&&f.active(b.column(c.columns).visible())}).on("column-reorder.dt"+ -c.namespace,function(a,d,e){1===b.columns(c.columns).count()&&("number"===typeof c.columns&&(c.columns=e.mapping[c.columns]),a=b.column(c.columns),f.text(c._columnText(b,c)),f.active(a.visible()))});this.active(b.column(c.columns).visible())},destroy:function(b,a,c){b.off("column-visibility.dt"+c.namespace).off("column-reorder.dt"+c.namespace)},_columnText:function(b,a){var c=b.column(a.columns).index(),f=b.settings()[0].aoColumns[c].sTitle.replace(/\n/g," ").replace(//gi," ").replace(//g, -"").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,"");return a.columnText?a.columnText(b,c,f):f}},colvisRestore:{className:"buttons-colvisRestore",text:function(b){return b.i18n("buttons.colvisRestore","Restore visibility")},init:function(b,a,c){c._visOriginal=b.columns().indexes().map(function(a){return b.column(a).visible()}).toArray()},action:function(b,a,c,d){a.columns().every(function(b){b=a.colReorder&&a.colReorder.transpose?a.colReorder.transpose(b,"toOriginal"):b;this.visible(d._visOriginal[b])})}}, -colvisGroup:{className:"buttons-colvisGroup",action:function(b,a,c,d){a.columns(d.show).visible(!0,!1);a.columns(d.hide).visible(!1,!1);a.columns.adjust()},show:[],hide:[]}});return d.Buttons}); diff --git a/sphinx_needs/libs/html/Buttons-1.5.1/js/buttons.flash.min.js b/sphinx_needs/libs/html/Buttons-1.5.1/js/buttons.flash.min.js deleted file mode 100644 index a6a6ec211..000000000 --- a/sphinx_needs/libs/html/Buttons-1.5.1/js/buttons.flash.min.js +++ /dev/null @@ -1,32 +0,0 @@ -(function(g){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(k){return g(k,window,document)}):"object"===typeof exports?module.exports=function(k,l){k||(k=window);if(!l||!l.fn.dataTable)l=require("datatables.net")(k,l).$;l.fn.dataTable.Buttons||require("datatables.net-buttons")(k,l);return g(l,k,k.document)}:g(jQuery,window,document)})(function(g,k,l,q){function v(a){for(var b="";0<=a;)b=String.fromCharCode(a%26+65)+b,a=Math.floor(a/26)- -1;return b}function n(a,b,d){var c=a.createElement(b);d&&(d.attr&&g(c).attr(d.attr),d.children&&g.each(d.children,function(a,b){c.appendChild(b)}),null!==d.text&&d.text!==q&&c.appendChild(a.createTextNode(d.text)));return c}function B(a,b){var d=a.header[b].length,c;a.footer&&a.footer[b].length>d&&(d=a.footer[b].length);for(var e=0,f=a.body.length;ed&&(d=c),40'+c),c=c.replace(/_dt_b_namespace_token_/g,":"));c=c.replace(/<([^<>]*?) xmlns=""([^<>]*?)>/g,"<$1 $2>");a[b]=c}})}var h=g.fn.dataTable,i={version:"1.0.4-TableTools2",clients:{},moviePath:"",nextId:1,$:function(a){"string"==typeof a&&(a=l.getElementById(a));a.addClass||(a.hide=function(){this.style.display="none"},a.show=function(){this.style.display= -""},a.addClass=function(a){this.removeClass(a);this.className+=" "+a},a.removeClass=function(a){this.className=this.className.replace(RegExp("\\s*"+a+"\\s*")," ").replace(/^\s+/,"").replace(/\s+$/,"")},a.hasClass=function(a){return!!this.className.match(RegExp("\\s*"+a+"\\s*"))});return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(a,b,d){(a=this.clients[a])&&a.receiveEvent(b,d)},log:function(a){console.log("Flash: "+a)},register:function(a,b){this.clients[a]=b},getDOMObjectPosition:function(a){var b= -{left:0,top:0,width:a.width?a.width:a.offsetWidth,height:a.height?a.height:a.offsetHeight};""!==a.style.width&&(b.width=a.style.width.replace("px",""));""!==a.style.height&&(b.height=a.style.height.replace("px",""));for(;a;)b.left+=a.offsetLeft,b.top+=a.offsetTop,a=a.offsetParent;return b},Client:function(a){this.handlers={};this.id=i.nextId++;this.movieId="ZeroClipboard_TableToolsMovie_"+this.id;i.register(this.id,this);a&&this.glue(a)}};i.Client.prototype={id:0,ready:!1,movie:null,clipText:"",fileName:"", -action:"copy",handCursorEnabled:!0,cssEffects:!0,handlers:null,sized:!1,sheetName:"",glue:function(a,b){this.domElement=i.$(a);var d=99;this.domElement.style.zIndex&&(d=parseInt(this.domElement.style.zIndex,10)+1);var c=i.getDOMObjectPosition(this.domElement);this.div=l.createElement("div");var e=this.div.style;e.position="absolute";e.left="0px";e.top="0px";e.width=c.width+"px";e.height=c.height+"px";e.zIndex=d;"undefined"!=typeof b&&""!==b&&(this.div.title=b);0!==c.width&&0!==c.height&&(this.sized= -!0);this.domElement&&(this.domElement.appendChild(this.div),this.div.innerHTML=this.getHTML(c.width,c.height).replace(/&/g,"&"))},positionElement:function(){var a=i.getDOMObjectPosition(this.domElement),b=this.div.style;b.position="absolute";b.width=a.width+"px";b.height=a.height+"px";0!==a.width&&0!==a.height&&(this.sized=!0,b=this.div.childNodes[0],b.width=a.width,b.height=a.height)},getHTML:function(a,b){var d="",c="id="+this.id+"&width="+a+"&height="+b;if(navigator.userAgent.match(/MSIE/))var e= -location.href.match(/^https/i)?"https://":"http://",d=d+('');else d+='';return d},hide:function(){this.div&&(this.div.style.left="-2000px")}, -show:function(){this.reposition()},destroy:function(){var a=this;this.domElement&&this.div&&(g(this.div).remove(),this.div=this.domElement=null,g.each(i.clients,function(b,d){d===a&&delete i.clients[b]}))},reposition:function(a){a&&((this.domElement=i.$(a))||this.hide());if(this.domElement&&this.div){var a=i.getDOMObjectPosition(this.domElement),b=this.div.style;b.left=""+a.left+"px";b.top=""+a.top+"px"}},clearText:function(){this.clipText="";this.ready&&this.movie.clearText()},appendText:function(a){this.clipText+= -a;this.ready&&this.movie.appendText(a)},setText:function(a){this.clipText=a;this.ready&&this.movie.setText(a)},setFileName:function(a){this.fileName=a;this.ready&&this.movie.setFileName(a)},setSheetData:function(a){this.ready&&this.movie.setSheetData(JSON.stringify(a))},setAction:function(a){this.action=a;this.ready&&this.movie.setAction(a)},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");this.handlers[a]||(this.handlers[a]=[]);this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled= -a;this.ready&&this.movie.setHandCursor(a)},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(a,b){var d,a=a.toString().toLowerCase().replace(/^on/,"");switch(a){case "load":this.movie=l.getElementById(this.movieId);if(!this.movie){d=this;setTimeout(function(){d.receiveEvent("load",null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){d=this;setTimeout(function(){d.receiveEvent("load",null)},100);this.ready=!0;return}this.ready= -!0;this.movie.clearText();this.movie.appendText(this.clipText);this.movie.setFileName(this.fileName);this.movie.setAction(this.action);this.movie.setHandCursor(this.handCursorEnabled);break;case "mouseover":this.domElement&&this.cssEffects&&this.recoverActive&&this.domElement.addClass("active");break;case "mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0));break;case "mousedown":this.domElement&& -this.cssEffects&&this.domElement.addClass("active");break;case "mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[a])for(var c=0,e=this.handlers[a].length;c',"xl/_rels/workbook.xml.rels":'', -"[Content_Types].xml":'', -"xl/workbook.xml":'', -"xl/worksheets/sheet1.xml":'',"xl/styles.xml":''}, -A=[{match:/^\-?\d+\.\d%$/,style:60,fmt:function(a){return a/100}},{match:/^\-?\d+\.?\d*%$/,style:56,fmt:function(a){return a/100}},{match:/^\-?\$[\d,]+.?\d*$/,style:57},{match:/^\-?£[\d,]+.?\d*$/,style:58},{match:/^\-?€[\d,]+.?\d*$/,style:59},{match:/^\([\d,]+\)$/,style:61,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\([\d,]+\.\d{2}\)$/,style:62,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^[\d,]+$/,style:63},{match:/^[\d,]+\.\d{2}$/,style:64}];h.Buttons.swfPath="//cdn.datatables.net/buttons/"+ -h.Buttons.version+"/swf/flashExport.swf";h.Api.register("buttons.resize()",function(){g.each(i.clients,function(a,b){b.domElement!==q&&b.domElement.parentNode&&b.positionElement()})});h.ext.buttons.copyFlash=g.extend({},t,{className:"buttons-copy buttons-flash",text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,b,d,c){if(c._fromFlash){this.processing(!0);var a=c._flash,e=z(b,c),d=b.buttons.exportInfo(c),f=y(c),e=e.str;d.title&&(e=d.title+f+f+e);d.messageTop&&(e=d.messageTop+ -f+f+e);d.messageBottom&&(e=e+f+f+d.messageBottom);c.customize&&(e=c.customize(e,c));a.setAction("copy");s(a,e);this.processing(!1);b.buttons.info(b.i18n("buttons.copyTitle","Copy to clipboard"),b.i18n("buttons.copySuccess",{_:"Copied %d rows to clipboard",1:"Copied 1 row to clipboard"},data.rows),3E3)}},fieldSeparator:"\t",fieldBoundary:""});h.ext.buttons.csvFlash=g.extend({},t,{className:"buttons-csv buttons-flash",text:function(a){return a.i18n("buttons.csv","CSV")},action:function(a,b,d,c){a=c._flash; -b=z(b,c);b=c.customize?c.customize(b.str,c):b.str;a.setAction("csv");a.setFileName(_filename(c));s(a,b)},escapeChar:'"'});h.ext.buttons.excelFlash=g.extend({},t,{className:"buttons-excel buttons-flash",text:function(a){return a.i18n("buttons.excel","Excel")},action:function(a,b,d,c){this.processing(!0);var a=c._flash,e=0,f=g.parseXML(p["xl/worksheets/sheet1.xml"]),i=f.getElementsByTagName("sheetData")[0],d={_rels:{".rels":g.parseXML(p["_rels/.rels"])},xl:{_rels:{"workbook.xml.rels":g.parseXML(p["xl/_rels/workbook.xml.rels"])}, -"workbook.xml":g.parseXML(p["xl/workbook.xml"]),"styles.xml":g.parseXML(p["xl/styles.xml"]),worksheets:{"sheet1.xml":f}},"[Content_Types].xml":g.parseXML(p["[Content_Types].xml"])},j=b.buttons.exportData(c.exportOptions),k,l,h=function(a){k=e+1;l=n(f,"row",{attr:{r:k}});for(var b=0,d=a.length;b 0 ) { - s += separator; - } - - s += boundary ? - boundary + ('' + a[i]).replace( reBoundary, escapeChar+boundary ) + boundary : - a[i]; - } - - return s; - }; - - var header = config.header ? join( data.header )+newLine : ''; - var footer = config.footer && data.footer ? newLine+join( data.footer ) : ''; - var body = []; - - for ( var i=0, ien=data.body.length ; i 1 && version[1]*1 < 603.1 ) { - return true; - } - - return false; -}; - -/** - * Convert from numeric position to letter for column names in Excel - * @param {int} n Column number - * @return {string} Column letter(s) name - */ -function createCellPos( n ){ - var ordA = 'A'.charCodeAt(0); - var ordZ = 'Z'.charCodeAt(0); - var len = ordZ - ordA + 1; - var s = ""; - - while( n >= 0 ) { - s = String.fromCharCode(n % len + ordA) + s; - n = Math.floor(n / len) - 1; - } - - return s; -} - -try { - var _serialiser = new XMLSerializer(); - var _ieExcel; -} -catch (t) {} - -/** - * Recursively add XML files from an object's structure to a ZIP file. This - * allows the XSLX file to be easily defined with an object's structure matching - * the files structure. - * - * @param {JSZip} zip ZIP package - * @param {object} obj Object to add (recursive) - */ -function _addToZip( zip, obj ) { - if ( _ieExcel === undefined ) { - // Detect if we are dealing with IE's _awful_ serialiser by seeing if it - // drop attributes - _ieExcel = _serialiser - .serializeToString( - $.parseXML( excelStrings['xl/worksheets/sheet1.xml'] ) - ) - .indexOf( 'xmlns:r' ) === -1; - } - - $.each( obj, function ( name, val ) { - if ( $.isPlainObject( val ) ) { - var newDir = zip.folder( name ); - _addToZip( newDir, val ); - } - else { - if ( _ieExcel ) { - // IE's XML serialiser will drop some name space attributes from - // from the root node, so we need to save them. Do this by - // replacing the namespace nodes with a regular attribute that - // we convert back when serialised. Edge does not have this - // issue - var worksheet = val.childNodes[0]; - var i, ien; - var attrs = []; - - for ( i=worksheet.attributes.length-1 ; i>=0 ; i-- ) { - var attrName = worksheet.attributes[i].nodeName; - var attrValue = worksheet.attributes[i].nodeValue; - - if ( attrName.indexOf( ':' ) !== -1 ) { - attrs.push( { name: attrName, value: attrValue } ); - - worksheet.removeAttribute( attrName ); - } - } - - for ( i=0, ien=attrs.length ; i]*?) xmlns=""([^<>]*?)>/g, '<$1 $2>' ); - - zip.file( name, str ); - } - } ); -} - -/** - * Create an XML node and add any children, attributes, etc without needing to - * be verbose in the DOM. - * - * @param {object} doc XML document - * @param {string} nodeName Node name - * @param {object} opts Options - can be `attr` (attributes), `children` - * (child nodes) and `text` (text content) - * @return {node} Created node - */ -function _createNode( doc, nodeName, opts ) { - var tempNode = doc.createElement( nodeName ); - - if ( opts ) { - if ( opts.attr ) { - $(tempNode).attr( opts.attr ); - } - - if ( opts.children ) { - $.each( opts.children, function ( key, value ) { - tempNode.appendChild( value ); - } ); - } - - if ( opts.text !== null && opts.text !== undefined ) { - tempNode.appendChild( doc.createTextNode( opts.text ) ); - } - } - - return tempNode; -} - -/** - * Get the width for an Excel column based on the contents of that column - * @param {object} data Data for export - * @param {int} col Column index - * @return {int} Column width - */ -function _excelColWidth( data, col ) { - var max = data.header[col].length; - var len, lineSplit, str; - - if ( data.footer && data.footer[col].length > max ) { - max = data.footer[col].length; - } - - for ( var i=0, ien=data.body.length ; i max ) { - max = len; - } - - // Max width rather than having potentially massive column widths - if ( max > 40 ) { - return 52; // 40 * 1.3 - } - } - - max *= 1.3; - - // And a min width - return max > 6 ? max : 6; -} - -// Excel - Pre-defined strings to build a basic XLSX file -var excelStrings = { - "_rels/.rels": - ''+ - ''+ - ''+ - '', - - "xl/_rels/workbook.xml.rels": - ''+ - ''+ - ''+ - ''+ - '', - - "[Content_Types].xml": - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - '', - - "xl/workbook.xml": - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - '', - - "xl/worksheets/sheet1.xml": - ''+ - ''+ - ''+ - ''+ - '', - - "xl/styles.xml": - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ // Excel appears to use this as a dotted background regardless of values but - ''+ // to be valid to the schema, use a patternFill - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - '' -}; -// Note we could use 3 `for` loops for the styles, but when gzipped there is -// virtually no difference in size, since the above can be easily compressed - -// Pattern matching for special number formats. Perhaps this should be exposed -// via an API in future? -// Ref: section 3.8.30 - built in formatters in open spreadsheet -// https://www.ecma-international.org/news/TC45_current_work/Office%20Open%20XML%20Part%204%20-%20Markup%20Language%20Reference.pdf -var _excelSpecials = [ - { match: /^\-?\d+\.\d%$/, style: 60, fmt: function (d) { return d/100; } }, // Precent with d.p. - { match: /^\-?\d+\.?\d*%$/, style: 56, fmt: function (d) { return d/100; } }, // Percent - { match: /^\-?\$[\d,]+.?\d*$/, style: 57 }, // Dollars - { match: /^\-?£[\d,]+.?\d*$/, style: 58 }, // Pounds - { match: /^\-?€[\d,]+.?\d*$/, style: 59 }, // Euros - { match: /^\-?\d+$/, style: 65 }, // Numbers without thousand separators - { match: /^\-?\d+\.\d{2}$/, style: 66 }, // Numbers 2 d.p. without thousands separators - { match: /^\([\d,]+\)$/, style: 61, fmt: function (d) { return -1 * d.replace(/[\(\)]/g, ''); } }, // Negative numbers indicated by brackets - { match: /^\([\d,]+\.\d{2}\)$/, style: 62, fmt: function (d) { return -1 * d.replace(/[\(\)]/g, ''); } }, // Negative numbers indicated by brackets - 2d.p. - { match: /^\-?[\d,]+$/, style: 63 }, // Numbers with thousand separators - { match: /^\-?[\d,]+\.\d{2}$/, style: 64 } // Numbers with 2 d.p. and thousands separators -]; - - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Buttons - */ - -// -// Copy to clipboard -// -DataTable.ext.buttons.copyHtml5 = { - className: 'buttons-copy buttons-html5', - - text: function ( dt ) { - return dt.i18n( 'buttons.copy', 'Copy' ); - }, - - action: function ( e, dt, button, config ) { - this.processing( true ); - - var that = this; - var exportData = _exportData( dt, config ); - var info = dt.buttons.exportInfo( config ); - var newline = _newLine(config); - var output = exportData.str; - var hiddenDiv = $('
') - .css( { - height: 1, - width: 1, - overflow: 'hidden', - position: 'fixed', - top: 0, - left: 0 - } ); - - if ( info.title ) { - output = info.title + newline + newline + output; - } - - if ( info.messageTop ) { - output = info.messageTop + newline + newline + output; - } - - if ( info.messageBottom ) { - output = output + newline + newline + info.messageBottom; - } - - if ( config.customize ) { - output = config.customize( output, config ); - } - - var textarea = $('