├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── buildAPI.sh ├── composer.json ├── composer.lock ├── docs ├── Makefile ├── make.bat ├── sami_configuration.php └── source │ ├── API │ ├── .placeholder │ └── API │ │ ├── PROJECT_VERSION │ │ ├── SAMI_VERSION │ │ ├── XPDF.html │ │ ├── XPDF │ │ ├── Exception.html │ │ ├── Exception │ │ │ ├── BinaryNotFoundException.html │ │ │ ├── ExceptionInterface.html │ │ │ ├── InvalidArgumentException.html │ │ │ ├── LogicException.html │ │ │ ├── RuntimeException.html │ │ │ └── namespace-frame.html │ │ ├── PdfToText.html │ │ ├── XPDFServiceProvider.html │ │ └── namespace-frame.html │ │ ├── cache │ │ ├── PROJECT_VERSION │ │ ├── SAMI_VERSION │ │ └── twig │ │ │ ├── 74 │ │ │ └── 6b │ │ │ │ └── f165dd76b1f467f72a63c6718d70.php │ │ │ ├── 89 │ │ │ └── 71 │ │ │ │ └── c3d8a650860123bab994f18ba7c7.php │ │ │ ├── 7e │ │ │ └── 10 │ │ │ │ └── 26ec88537e441225ec9e08e5c6f8.php │ │ │ └── bd │ │ │ └── 99 │ │ │ └── 667a276dc05a0cfd6e6b53f752db.php │ │ ├── classes-frame.html │ │ ├── classes.html │ │ ├── css │ │ ├── main.css │ │ ├── panel.css │ │ └── reset.css │ │ ├── doc-index.html │ │ ├── i │ │ ├── arrows.png │ │ ├── loader.gif │ │ ├── results_bg.png │ │ └── tree_bg.png │ │ ├── index.html │ │ ├── interfaces.html │ │ ├── js │ │ ├── jquery-1.3.2.min.js │ │ └── searchdoc.js │ │ ├── namespaces-frame.html │ │ ├── namespaces.html │ │ ├── opensearch.xml │ │ ├── panel.html │ │ ├── renderer.index │ │ ├── search_index.js │ │ ├── stylesheet.css │ │ └── tree.js │ ├── _static │ └── .placeholder │ ├── _themes │ └── Alchemy │ │ ├── analytics.html │ │ ├── layout.html │ │ ├── localtoc.html │ │ ├── ribbon.html │ │ ├── searchbox.html │ │ ├── static │ │ ├── Alchemy.css_t │ │ ├── bootstrapCustom.css │ │ ├── img │ │ │ └── project.png │ │ ├── js │ │ │ ├── bootstrap.min.js │ │ │ ├── less-1.3.0.min.js │ │ │ ├── modernizr-2.5.3.min.js │ │ │ ├── plugins.js │ │ │ └── script.js │ │ ├── less │ │ │ ├── accordion.less │ │ │ ├── alerts.less │ │ │ ├── badges.less │ │ │ ├── bootstrap.less │ │ │ ├── breadcrumbs.less │ │ │ ├── button-groups.less │ │ │ ├── buttons.less │ │ │ ├── carousel.less │ │ │ ├── close.less │ │ │ ├── code.less │ │ │ ├── component-animations.less │ │ │ ├── dropdowns.less │ │ │ ├── forms.less │ │ │ ├── grid.less │ │ │ ├── hero-unit.less │ │ │ ├── labels.less │ │ │ ├── layouts.less │ │ │ ├── mixins.less │ │ │ ├── modals.less │ │ │ ├── navbar.less │ │ │ ├── navs.less │ │ │ ├── pager.less │ │ │ ├── pagination.less │ │ │ ├── popovers.less │ │ │ ├── progress-bars.less │ │ │ ├── reset.less │ │ │ ├── responsive.less │ │ │ ├── scaffolding.less │ │ │ ├── sprites.less │ │ │ ├── tables.less │ │ │ ├── thumbnails.less │ │ │ ├── tooltip.less │ │ │ ├── type.less │ │ │ ├── utilities.less │ │ │ ├── variables.less │ │ │ └── wells.less │ │ ├── main.css │ │ ├── pygments.css │ │ └── style.css │ │ └── theme.conf │ ├── conf.py │ ├── index.rst │ └── local_conf.py ├── phpunit.xml.dist ├── src └── XPDF │ ├── Exception │ ├── BinaryNotFoundException.php │ ├── ExceptionInterface.php │ ├── InvalidArgumentException.php │ └── RuntimeException.php │ ├── PdfInfo.php │ ├── PdfToText.php │ └── XPDFServiceProvider.php └── tests ├── XPDF └── Tests │ ├── PdfToTextTest.php │ └── XPDFServiceProviderTest.php ├── bootstrap.php └── files └── HelloWorld.pdf /.gitignore: -------------------------------------------------------------------------------- 1 | docs/build 2 | /nbproject 3 | /vendor 4 | composer.phar 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | before_script: 4 | - sudo apt-get install -y xpdf 5 | - sudo easy_install sphinx 6 | - composer self-update 7 | - composer install --dev --prefer-source 8 | 9 | php: 10 | - 5.3.3 11 | - 5.3 12 | - 5.4 13 | - 5.5 14 | - 5.6 15 | - 7.0 16 | 17 | script: 18 | - vendor/bin/phpunit 19 | - ./buildAPI.sh 20 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | CHANGELOG 2 | --------- 3 | 4 | * 0.2.1 (07-03-2013) 5 | 6 | * Revert `PdfTotext::setPageQuantity` 7 | 8 | * 0.2.0 (07-03-2013) 9 | 10 | * BC Break : `PdfToText::open` and `PdftoText::close` methods are removed. PdfTotext is now a service. 11 | * Use alchemy/binary-adapter as driver base. 12 | 13 | * 0.1.1 (01-31-2013) 14 | 15 | * Remove unstable dependencies 16 | * Allow wider version intervals for dependencies 17 | 18 | * 0.1.0 (05-31-2012) 19 | 20 | * First stable version. 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | PHP-XPDF is released with MIT License : 2 | 3 | Copyright (c) 2012 Alchemy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), 7 | to deal in the Software without restriction, including without limitation 8 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 | and/or sell copies of the Software, and to permit persons to whom the 10 | Software is furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 | IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PHP-XPDF 2 | 3 | [![Build Status](https://secure.travis-ci.org/alchemy-fr/PHP-XPDF.png?branch=master)](http://travis-ci.org/alchemy-fr/PHP-XPDF) 4 | 5 | PHP-XPDF is an object oriented wrapper for XPDF. For the moment, only PdfTotext 6 | wrapper is available. 7 | 8 | ## Installation 9 | 10 | It is recommended to install PHP-XPDF through [Composer](http://getcomposer.org) : 11 | 12 | ```json 13 | { 14 | "require": { 15 | "php-xpdf/php-xpdf": "~0.2.0" 16 | } 17 | } 18 | ``` 19 | 20 | ## Dependencies : 21 | 22 | In order to use PHP-XPDF, you need to install XPDF. Depending of your 23 | configuration, please follow the instructions at on the 24 | [XPDF website](http://www.foolabs.com/xpdf/download.html). 25 | 26 | 27 | ## Documentation 28 | 29 | ### Driver Initialization 30 | 31 | The easiest way to instantiate the driver is to call the `create method. 32 | 33 | ```php 34 | $pdfToText = XPDF\PdfToText::create(); 35 | ``` 36 | 37 | You can optionaly pass a configuration and a logger (any 38 | `Psr\Logger\LoggerInterface`). 39 | 40 | ```php 41 | $pdfToText = XPDF\PdfToText::create(array( 42 | 'pdftotext.binaries' => '/opt/local/xpdf/bin/pdftotext', 43 | 'pdftotext.timeout' => 30, // timeout for the underlying process 44 | ), $logger); 45 | ``` 46 | 47 | ### Extract text 48 | 49 | To extract text from PDF, use the `getText` method. 50 | 51 | ```php 52 | $text = $pdtTotext->getText('document.pdf'); 53 | ``` 54 | 55 | You can optionally extract from a page to another page. 56 | 57 | ```php 58 | $text = $pdtTotext->getText('document.pdf', $from = 1, $to = 4); 59 | ``` 60 | 61 | You can also predefined how much pages would be extracted on any call. 62 | 63 | ```php 64 | $pdtTotext->setpageQuantity(2); 65 | $pdtTotext->getText('document.pdf'); // extracts page 1 and 2 66 | ``` 67 | 68 | ### Use with Silex 69 | 70 | A [Silex](http://silex.sensiolabs.org) service provider is available 71 | 72 | ```php 73 | $app = new Silex\Application(); 74 | $app->register(new XPDF\XPDFServiceProvider()); 75 | 76 | $app['xpdf.pdftotext']->getText('document.pdf'); 77 | ``` 78 | 79 | Options can be passed to customize the provider. 80 | 81 | ```php 82 | $app->register(new XPDF\XPDFServiceProvider(), array( 83 | 'xpdf.configuration' => array( 84 | 'pdftotext.timeout' => 30, 85 | 'pdftotext.binaries' => '/opt/local/xpdf/bin/pdftotext', 86 | ), 87 | 'xpdf.logger' => $logger, 88 | )); 89 | ``` 90 | 91 | ## License 92 | 93 | This project is licensed under the [MIT license](http://opensource.org/licenses/MIT). 94 | -------------------------------------------------------------------------------- /buildAPI.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | rm -Rf docs/source/API/API 4 | /usr/bin/env php vendor/bin/sami.php update docs/sami_configuration.php -v 5 | sh -c "cd docs && make clean && make html" 6 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "php-xpdf/php-xpdf", 3 | "type": "library", 4 | "description": "XPDF PHP, an Object Oriented library to manipulate XPDF", 5 | "keywords": ["xpdf", "pdf"], 6 | "license": "MIT", 7 | "authors": [ 8 | { 9 | "name": "Romain Neutron", 10 | "email": "imprec@gmail.com", 11 | "homepage": "http://www.lickmychip.com/" 12 | }, 13 | { 14 | "name": "Phraseanet Team", 15 | "email": "info@alchemy.fr", 16 | "homepage": "http://www.phraseanet.com/" 17 | } 18 | ], 19 | "require": { 20 | "php" : ">=5.3.3", 21 | "alchemy/binary-driver" : "~1.5" 22 | }, 23 | "require-dev": { 24 | "sami/sami" : "~1.0", 25 | "silex/silex" : "~1.0", 26 | "phpunit/phpunit" : "~3.7" 27 | }, 28 | "autoload": { 29 | "psr-0": { 30 | "XPDF": "src" 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | PAPER = 8 | BUILDDIR = build 9 | 10 | # Internal variables. 11 | PAPEROPT_a4 = -D latex_paper_size=a4 12 | PAPEROPT_letter = -D latex_paper_size=letter 13 | ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source 14 | # the i18n builder cannot share the environment and doctrees with the others 15 | I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source 16 | 17 | .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext 18 | 19 | help: 20 | @echo "Please use \`make ' where is one of" 21 | @echo " html to make standalone HTML files" 22 | @echo " dirhtml to make HTML files named index.html in directories" 23 | @echo " singlehtml to make a single large HTML file" 24 | @echo " pickle to make pickle files" 25 | @echo " json to make JSON files" 26 | @echo " htmlhelp to make HTML files and a HTML help project" 27 | @echo " epub to make an epub" 28 | @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" 29 | @echo " latexpdf to make LaTeX files and run them through pdflatex" 30 | @echo " text to make text files" 31 | @echo " man to make manual pages" 32 | @echo " texinfo to make Texinfo files" 33 | @echo " info to make Texinfo files and run them through makeinfo" 34 | @echo " gettext to make PO message catalogs" 35 | @echo " changes to make an overview of all changed/added/deprecated items" 36 | @echo " linkcheck to check all external links for integrity" 37 | @echo " doctest to run all doctests embedded in the documentation (if enabled)" 38 | 39 | clean: 40 | -rm -rf $(BUILDDIR)/* 41 | 42 | html: 43 | $(SPHINXBUILD) -W -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html 44 | @echo 45 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." 46 | 47 | dirhtml: 48 | $(SPHINXBUILD) -W -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml 49 | @echo 50 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." 51 | 52 | singlehtml: 53 | $(SPHINXBUILD) -W -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml 54 | @echo 55 | @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." 56 | 57 | pickle: 58 | $(SPHINXBUILD) -W -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle 59 | @echo 60 | @echo "Build finished; now you can process the pickle files." 61 | 62 | json: 63 | $(SPHINXBUILD) -W -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json 64 | @echo 65 | @echo "Build finished; now you can process the JSON files." 66 | 67 | htmlhelp: 68 | $(SPHINXBUILD) -W -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp 69 | @echo 70 | @echo "Build finished; now you can run HTML Help Workshop with the" \ 71 | ".hhp project file in $(BUILDDIR)/htmlhelp." 72 | 73 | epub: 74 | $(SPHINXBUILD) -W -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub 75 | @echo 76 | @echo "Build finished. The epub file is in $(BUILDDIR)/epub." 77 | 78 | latex: 79 | $(SPHINXBUILD) -W -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 80 | @echo 81 | @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." 82 | @echo "Run \`make' in that directory to run these through (pdf)latex" \ 83 | "(use \`make latexpdf' here to do that automatically)." 84 | 85 | latexpdf: 86 | $(SPHINXBUILD) -W -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 87 | @echo "Running LaTeX files through pdflatex..." 88 | $(MAKE) -C $(BUILDDIR)/latex all-pdf 89 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." 90 | 91 | text: 92 | $(SPHINXBUILD) -W -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text 93 | @echo 94 | @echo "Build finished. The text files are in $(BUILDDIR)/text." 95 | 96 | man: 97 | $(SPHINXBUILD) -W -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man 98 | @echo 99 | @echo "Build finished. The manual pages are in $(BUILDDIR)/man." 100 | 101 | texinfo: 102 | $(SPHINXBUILD) -W -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo 103 | @echo 104 | @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." 105 | @echo "Run \`make' in that directory to run these through makeinfo" \ 106 | "(use \`make info' here to do that automatically)." 107 | 108 | info: 109 | $(SPHINXBUILD) -W -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo 110 | @echo "Running Texinfo files through makeinfo..." 111 | make -C $(BUILDDIR)/texinfo info 112 | @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." 113 | 114 | gettext: 115 | $(SPHINXBUILD) -W -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale 116 | @echo 117 | @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." 118 | 119 | changes: 120 | $(SPHINXBUILD) -W -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes 121 | @echo 122 | @echo "The overview file is in $(BUILDDIR)/changes." 123 | 124 | linkcheck: 125 | $(SPHINXBUILD) -W -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck 126 | @echo 127 | @echo "Link check complete; look for any errors in the above output " \ 128 | "or in $(BUILDDIR)/linkcheck/output.txt." 129 | 130 | doctest: 131 | $(SPHINXBUILD) -W -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest 132 | @echo "Testing of doctests in the sources finished, look at the " \ 133 | "results in $(BUILDDIR)/doctest/output.txt." 134 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | REM Command file for Sphinx documentation 4 | 5 | if "%SPHINXBUILD%" == "" ( 6 | set SPHINXBUILD=sphinx-build 7 | ) 8 | set BUILDDIR=build 9 | set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source 10 | set I18NSPHINXOPTS=%SPHINXOPTS% source 11 | if NOT "%PAPER%" == "" ( 12 | set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% 13 | set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% 14 | ) 15 | 16 | if "%1" == "" goto help 17 | 18 | if "%1" == "help" ( 19 | :help 20 | echo.Please use `make ^` where ^ is one of 21 | echo. html to make standalone HTML files 22 | echo. dirhtml to make HTML files named index.html in directories 23 | echo. singlehtml to make a single large HTML file 24 | echo. pickle to make pickle files 25 | echo. json to make JSON files 26 | echo. htmlhelp to make HTML files and a HTML help project 27 | echo. epub to make an epub 28 | echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter 29 | echo. text to make text files 30 | echo. man to make manual pages 31 | echo. texinfo to make Texinfo files 32 | echo. gettext to make PO message catalogs 33 | echo. changes to make an overview over all changed/added/deprecated items 34 | echo. linkcheck to check all external links for integrity 35 | echo. doctest to run all doctests embedded in the documentation if enabled 36 | goto end 37 | ) 38 | 39 | if "%1" == "clean" ( 40 | for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i 41 | del /q /s %BUILDDIR%\* 42 | goto end 43 | ) 44 | 45 | if "%1" == "html" ( 46 | %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html 47 | if errorlevel 1 exit /b 1 48 | echo. 49 | echo.Build finished. The HTML pages are in %BUILDDIR%/html. 50 | goto end 51 | ) 52 | 53 | if "%1" == "dirhtml" ( 54 | %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml 55 | if errorlevel 1 exit /b 1 56 | echo. 57 | echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. 58 | goto end 59 | ) 60 | 61 | if "%1" == "singlehtml" ( 62 | %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml 63 | if errorlevel 1 exit /b 1 64 | echo. 65 | echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. 66 | goto end 67 | ) 68 | 69 | if "%1" == "pickle" ( 70 | %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle 71 | if errorlevel 1 exit /b 1 72 | echo. 73 | echo.Build finished; now you can process the pickle files. 74 | goto end 75 | ) 76 | 77 | if "%1" == "json" ( 78 | %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json 79 | if errorlevel 1 exit /b 1 80 | echo. 81 | echo.Build finished; now you can process the JSON files. 82 | goto end 83 | ) 84 | 85 | if "%1" == "htmlhelp" ( 86 | %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp 87 | if errorlevel 1 exit /b 1 88 | echo. 89 | echo.Build finished; now you can run HTML Help Workshop with the ^ 90 | .hhp project file in %BUILDDIR%/htmlhelp. 91 | goto end 92 | ) 93 | 94 | if "%1" == "devhelp" ( 95 | %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp 96 | if errorlevel 1 exit /b 1 97 | echo. 98 | echo.Build finished. 99 | goto end 100 | ) 101 | 102 | if "%1" == "epub" ( 103 | %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub 104 | if errorlevel 1 exit /b 1 105 | echo. 106 | echo.Build finished. The epub file is in %BUILDDIR%/epub. 107 | goto end 108 | ) 109 | 110 | if "%1" == "latex" ( 111 | %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex 112 | if errorlevel 1 exit /b 1 113 | echo. 114 | echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. 115 | goto end 116 | ) 117 | 118 | if "%1" == "text" ( 119 | %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text 120 | if errorlevel 1 exit /b 1 121 | echo. 122 | echo.Build finished. The text files are in %BUILDDIR%/text. 123 | goto end 124 | ) 125 | 126 | if "%1" == "man" ( 127 | %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man 128 | if errorlevel 1 exit /b 1 129 | echo. 130 | echo.Build finished. The manual pages are in %BUILDDIR%/man. 131 | goto end 132 | ) 133 | 134 | if "%1" == "texinfo" ( 135 | %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo 136 | if errorlevel 1 exit /b 1 137 | echo. 138 | echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. 139 | goto end 140 | ) 141 | 142 | if "%1" == "gettext" ( 143 | %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale 144 | if errorlevel 1 exit /b 1 145 | echo. 146 | echo.Build finished. The message catalogs are in %BUILDDIR%/locale. 147 | goto end 148 | ) 149 | 150 | if "%1" == "changes" ( 151 | %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes 152 | if errorlevel 1 exit /b 1 153 | echo. 154 | echo.The overview file is in %BUILDDIR%/changes. 155 | goto end 156 | ) 157 | 158 | if "%1" == "linkcheck" ( 159 | %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck 160 | if errorlevel 1 exit /b 1 161 | echo. 162 | echo.Link check complete; look for any errors in the above output ^ 163 | or in %BUILDDIR%/linkcheck/output.txt. 164 | goto end 165 | ) 166 | 167 | if "%1" == "doctest" ( 168 | %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest 169 | if errorlevel 1 exit /b 1 170 | echo. 171 | echo.Testing of doctests in the sources finished, look at the ^ 172 | results in %BUILDDIR%/doctest/output.txt. 173 | goto end 174 | ) 175 | 176 | :end 177 | -------------------------------------------------------------------------------- /docs/sami_configuration.php: -------------------------------------------------------------------------------- 1 | files() 11 | ->name('*.php') 12 | ->in($dir = 'src') 13 | ; 14 | 15 | return new Sami($iterator, array( 16 | 'title' => 'PHP-XPDF API', 17 | 'theme' => 'enhanced', 18 | 'build_dir' => __DIR__.'/source/API/API', 19 | 'cache_dir' => __DIR__.'/source/API/API/cache', 20 | 'default_opened_level' => 2, 21 | )); 22 | -------------------------------------------------------------------------------- /docs/source/API/.placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchemy-fr/PHP-XPDF/17a9e9a1cf2626f864dafe21d404e4e61db2a4aa/docs/source/API/.placeholder -------------------------------------------------------------------------------- /docs/source/API/API/PROJECT_VERSION: -------------------------------------------------------------------------------- 1 | master -------------------------------------------------------------------------------- /docs/source/API/API/SAMI_VERSION: -------------------------------------------------------------------------------- 1 | 0.8.1-DEV -------------------------------------------------------------------------------- /docs/source/API/API/XPDF.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XPDF | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |
Namespace
22 |

XPDF

23 |
24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
PdfToTextThe PdfToText object.
XPDFServiceProvider
35 | 36 | 37 |
38 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /docs/source/API/API/XPDF/Exception.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XPDF\Exception | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |
Namespace
22 |

XPDF\Exception

23 |
24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
InvalidArgumentExceptionXPDF Invalid File Argument Exception
LogicExceptionXPDF Logic Exception
RuntimeExceptionXPDF Runtime Exception
39 | 40 |

Interfaces

41 | 42 | 43 | 44 | 45 | 46 |
ExceptionInterfaceXPDF Exception Interface
47 | 48 |

Exceptions

49 | 50 | 51 | 52 | 53 | 54 |
BinaryNotFoundExceptionXPDF Binary Not Found Exception
55 |
56 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/source/API/API/XPDF/Exception/BinaryNotFoundException.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XPDF\Exception\BinaryNotFoundException | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |
Class
22 |

XPDF\Exception\BinaryNotFoundException

23 |
24 |
25 |

class BinaryNotFoundException extends Exception implements 26 | ExceptionInterface

27 | 28 |
29 |

XPDF Binary Not Found Exception

30 |

31 |
32 | 33 | 34 | 35 |
36 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /docs/source/API/API/XPDF/Exception/ExceptionInterface.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XPDF\Exception\ExceptionInterface | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |
Interface
22 |

XPDF\Exception\ExceptionInterface

23 |
24 |
25 |

interface ExceptionInterface

26 | 27 |
28 |

XPDF Exception Interface

29 |

30 |
31 | 32 | 33 | 34 |
35 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /docs/source/API/API/XPDF/Exception/InvalidArgumentException.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XPDF\Exception\InvalidArgumentException | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |
Class
22 |

XPDF\Exception\InvalidArgumentException

23 |
24 |
25 |

class InvalidArgumentException extends InvalidArgumentException implements 26 | ExceptionInterface

27 | 28 |
29 |

XPDF Invalid File Argument Exception

30 |

31 |
32 | 33 | 34 | 35 |
36 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /docs/source/API/API/XPDF/Exception/LogicException.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XPDF\Exception\LogicException | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |
Class
22 |

XPDF\Exception\LogicException

23 |
24 |
25 |

class LogicException extends LogicException implements 26 | ExceptionInterface

27 | 28 |
29 |

XPDF Logic Exception

30 |

31 |
32 | 33 | 34 | 35 |
36 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /docs/source/API/API/XPDF/Exception/RuntimeException.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XPDF\Exception\RuntimeException | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |
Class
22 |

XPDF\Exception\RuntimeException

23 |
24 |
25 |

class RuntimeException extends RuntimeException implements 26 | ExceptionInterface

27 | 28 |
29 |

XPDF Runtime Exception

30 |

31 |
32 | 33 | 34 | 35 |
36 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /docs/source/API/API/XPDF/Exception/namespace-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XPDF\Exception | PHP-XPDF API 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/source/API/API/XPDF/XPDFServiceProvider.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XPDF\XPDFServiceProvider | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |
Class
22 |

XPDF\XPDFServiceProvider

23 |
24 |
25 |

class XPDFServiceProvider implements 26 | ServiceProviderInterface

27 | 28 | 29 | 30 | 31 |

Methods

32 | 33 | 34 | 35 | 38 | 42 | 43 | 44 | 45 | 48 | 52 | 53 | 54 |
36 | 37 | 39 | register(Application $app) 40 |

41 |
46 | 47 | 49 | boot(Application $app) 50 |

51 |
55 | 56 | 57 |

Details

58 | 59 |

60 |
at line 13
61 | public 62 | register(Application $app) 63 |

64 |
65 |

66 |

67 |
68 |

Parameters

69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 |
Application$app
77 | 78 | 79 | 80 | 81 |
82 |
83 | 84 |

85 |
at line 35
86 | public 87 | boot(Application $app) 88 |

89 |
90 |

91 |

92 |
93 |

Parameters

94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 |
Application$app
102 | 103 | 104 | 105 | 106 |
107 |
108 | 109 | 110 |
111 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /docs/source/API/API/XPDF/namespace-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XPDF | PHP-XPDF API 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/source/API/API/cache/PROJECT_VERSION: -------------------------------------------------------------------------------- 1 | master -------------------------------------------------------------------------------- /docs/source/API/API/cache/SAMI_VERSION: -------------------------------------------------------------------------------- 1 | 0.8.1-DEV -------------------------------------------------------------------------------- /docs/source/API/API/cache/twig/74/6b/f165dd76b1f467f72a63c6718d70.php: -------------------------------------------------------------------------------- 1 | parent = false; 11 | 12 | $this->blocks = array( 13 | ); 14 | } 15 | 16 | protected function doDisplay(array $context, array $blocks = array()) 17 | { 18 | // line 1 19 | echo "var tree = "; 20 | echo $this->getAttribute($this, "element", array(0 => $this->getContext($context, "tree")), "method"); 21 | echo " 22 | 23 | "; 24 | } 25 | 26 | // line 3 27 | public function getelement($tree = null) 28 | { 29 | $context = $this->env->mergeGlobals(array( 30 | "tree" => $tree, 31 | )); 32 | 33 | $blocks = array(); 34 | 35 | ob_start(); 36 | try { 37 | // line 5 38 | echo "["; 39 | // line 6 40 | $context['_parent'] = (array) $context; 41 | $context['_seq'] = twig_ensure_traversable($this->getContext($context, "tree")); 42 | $context['loop'] = array( 43 | 'parent' => $context['_parent'], 44 | 'index0' => 0, 45 | 'index' => 1, 46 | 'first' => true, 47 | ); 48 | if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof Countable)) { 49 | $length = count($context['_seq']); 50 | $context['loop']['revindex0'] = $length - 1; 51 | $context['loop']['revindex'] = $length; 52 | $context['loop']['length'] = $length; 53 | $context['loop']['last'] = 1 === $length; 54 | } 55 | foreach ($context['_seq'] as $context["_key"] => $context["element"]) { 56 | // line 7 57 | echo "["; 58 | // line 8 59 | echo twig_jsonencode_filter($this->getAttribute($this->getContext($context, "element"), 0, array(), "array")); 60 | echo ","; 61 | // line 9 62 | echo (($this->getAttribute($this->getContext($context, "element"), 1, array(), "array")) ? (twig_jsonencode_filter((((!$this->getAttribute($this->getContext($context, "element"), 2, array(), "array"))) ? ($this->env->getExtension('sami')->pathForClass($context, $this->getAttribute($this->getContext($context, "element"), 1, array(), "array"))) : ($this->env->getExtension('sami')->pathForNamespace($context, $this->getAttribute($this->getContext($context, "element"), 1, array(), "array")))))) : ("")); 63 | echo ","; 64 | // line 10 65 | echo twig_jsonencode_filter(((((!$this->getAttribute($this->getContext($context, "element"), 2, array(), "array")) && $this->getAttribute($this->getAttribute($this->getContext($context, "element"), 1, array(), "array"), "parent"))) ? ((" < " . $this->getAttribute($this->getAttribute($this->getAttribute($this->getContext($context, "element"), 1, array(), "array"), "parent"), "shortname"))) : (""))); 66 | echo ", 67 | "; 68 | // line 11 69 | echo $this->getAttribute($this, "element", array(0 => $this->getAttribute($this->getContext($context, "element"), 2, array(), "array")), "method"); 70 | // line 12 71 | echo "]"; 72 | // line 13 73 | echo (($this->getAttribute($this->getContext($context, "loop"), "last")) ? ("") : (",")); 74 | ++$context['loop']['index0']; 75 | ++$context['loop']['index']; 76 | $context['loop']['first'] = false; 77 | if (isset($context['loop']['length'])) { 78 | --$context['loop']['revindex0']; 79 | --$context['loop']['revindex']; 80 | $context['loop']['last'] = 0 === $context['loop']['revindex0']; 81 | } 82 | } 83 | $_parent = $context['_parent']; 84 | unset($context['_seq'], $context['_iterated'], $context['_key'], $context['element'], $context['_parent'], $context['loop']); 85 | $context = array_merge($_parent, array_intersect_key($context, $_parent)); 86 | // line 15 87 | echo " ]"; 88 | } catch(Exception $e) { 89 | ob_end_clean(); 90 | 91 | throw $e; 92 | } 93 | 94 | return ob_get_clean(); 95 | } 96 | 97 | public function getTemplateName() 98 | { 99 | return "tree.twig"; 100 | } 101 | 102 | public function isTraitable() 103 | { 104 | return false; 105 | } 106 | 107 | public function getDebugInfo() 108 | { 109 | return array ( 71 => 13, 25 => 3, 118 => 35, 104 => 33, 96 => 29, 90 => 27, 87 => 26, 84 => 25, 75 => 21, 57 => 8, 46 => 10, 125 => 64, 120 => 61, 107 => 59, 22 => 4, 91 => 27, 72 => 20, 67 => 11, 61 => 5, 55 => 7, 95 => 27, 59 => 26, 43 => 7, 142 => 39, 134 => 36, 127 => 35, 123 => 33, 116 => 32, 112 => 30, 103 => 58, 99 => 30, 93 => 28, 86 => 50, 70 => 18, 64 => 18, 53 => 14, 24 => 3, 41 => 8, 39 => 9, 19 => 4, 377 => 58, 361 => 56, 356 => 55, 353 => 54, 348 => 53, 331 => 52, 329 => 51, 327 => 50, 316 => 49, 301 => 46, 289 => 45, 263 => 40, 259 => 39, 256 => 37, 253 => 35, 251 => 34, 234 => 33, 232 => 32, 220 => 31, 209 => 28, 203 => 27, 197 => 26, 183 => 25, 172 => 22, 166 => 21, 160 => 20, 146 => 19, 133 => 16, 131 => 15, 124 => 13, 117 => 11, 115 => 10, 102 => 32, 51 => 12, 40 => 6, 35 => 8, 32 => 4, 23 => 6, 17 => 1, 108 => 32, 101 => 28, 97 => 55, 88 => 27, 85 => 15, 81 => 23, 77 => 21, 62 => 16, 60 => 9, 56 => 15, 50 => 13, 47 => 11, 44 => 9, 38 => 6, 78 => 22, 74 => 20, 69 => 12, 58 => 13, 54 => 13, 48 => 11, 29 => 5, 92 => 26, 89 => 25, 82 => 8, 79 => 22, 73 => 20, 68 => 19, 66 => 18, 63 => 10, 45 => 10, 42 => 9, 36 => 5, 31 => 5, 20 => 8, 49 => 12, 37 => 6, 33 => 4, 30 => 6, 27 => 8, 26 => 5,); 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /docs/source/API/API/cache/twig/7e/10/26ec88537e441225ec9e08e5c6f8.php: -------------------------------------------------------------------------------- 1 | parent = $this->env->loadTemplate("layout/base.twig"); 11 | 12 | $this->blocks = array( 13 | 'title' => array($this, 'block_title'), 14 | 'body_class' => array($this, 'block_body_class'), 15 | 'header' => array($this, 'block_header'), 16 | 'content' => array($this, 'block_content'), 17 | ); 18 | } 19 | 20 | protected function doGetParent(array $context) 21 | { 22 | return "layout/base.twig"; 23 | } 24 | 25 | protected function doDisplay(array $context, array $blocks = array()) 26 | { 27 | // line 3 28 | $context["__internal_a46b438074c8aeb9b2fb3551daa50610ff3a024d"] = $this->env->loadTemplate("macros.twig"); 29 | $this->parent->display($context, array_merge($this->blocks, $blocks)); 30 | } 31 | 32 | // line 5 33 | public function block_title($context, array $blocks = array()) 34 | { 35 | echo twig_escape_filter($this->env, $this->getContext($context, "namespace"), "html", null, true); 36 | echo " | "; 37 | $this->displayParentBlock("title", $context, $blocks); 38 | } 39 | 40 | // line 7 41 | public function block_body_class($context, array $blocks = array()) 42 | { 43 | echo "frame"; 44 | } 45 | 46 | // line 9 47 | public function block_header($context, array $blocks = array()) 48 | { 49 | // line 10 50 | echo "
51 |

"; 52 | // line 11 53 | echo twig_escape_filter($this->env, $this->getAttribute($this->getContext($context, "project"), "config", array(0 => "title"), "method"), "html", null, true); 54 | echo "

55 | 56 | 66 |
67 | "; 68 | } 69 | 70 | // line 20 71 | public function block_content($context, array $blocks = array()) 72 | { 73 | // line 21 74 | echo "

"; 75 | echo $context["__internal_a46b438074c8aeb9b2fb3551daa50610ff3a024d"]->getnamespace_link($this->getContext($context, "namespace"), array("target" => "main")); 76 | echo "

77 | 78 | "; 79 | // line 23 80 | if ($this->getContext($context, "classes")) { 81 | // line 24 82 | echo "
    83 | "; 84 | // line 25 85 | $context['_parent'] = (array) $context; 86 | $context['_seq'] = twig_ensure_traversable($this->getContext($context, "classes")); 87 | foreach ($context['_seq'] as $context["_key"] => $context["class"]) { 88 | // line 26 89 | echo "
  • "; 90 | echo $context["__internal_a46b438074c8aeb9b2fb3551daa50610ff3a024d"]->getclass_link($this->getContext($context, "class"), array("target" => "main")); 91 | echo "
  • 92 | "; 93 | } 94 | $_parent = $context['_parent']; 95 | unset($context['_seq'], $context['_iterated'], $context['_key'], $context['class'], $context['_parent'], $context['loop']); 96 | $context = array_merge($_parent, array_intersect_key($context, $_parent)); 97 | // line 28 98 | echo "
99 | "; 100 | } 101 | // line 30 102 | echo " 103 | "; 104 | // line 31 105 | if ($this->getContext($context, "interfaces")) { 106 | // line 32 107 | echo "

Interfaces

108 |
    109 | "; 110 | // line 34 111 | $context['_parent'] = (array) $context; 112 | $context['_seq'] = twig_ensure_traversable($this->getContext($context, "interfaces")); 113 | foreach ($context['_seq'] as $context["_key"] => $context["class"]) { 114 | // line 35 115 | echo "
  • "; 116 | echo $context["__internal_a46b438074c8aeb9b2fb3551daa50610ff3a024d"]->getclass_link($this->getContext($context, "class"), array("target" => "main")); 117 | echo "
  • 118 | "; 119 | } 120 | $_parent = $context['_parent']; 121 | unset($context['_seq'], $context['_iterated'], $context['_key'], $context['class'], $context['_parent'], $context['loop']); 122 | $context = array_merge($_parent, array_intersect_key($context, $_parent)); 123 | // line 37 124 | echo "
125 | "; 126 | } 127 | // line 39 128 | echo " 129 | "; 130 | // line 40 131 | if ($this->getContext($context, "exceptions")) { 132 | // line 41 133 | echo "

Exceptions

134 |
    135 | "; 136 | // line 43 137 | $context['_parent'] = (array) $context; 138 | $context['_seq'] = twig_ensure_traversable($this->getContext($context, "exceptions")); 139 | foreach ($context['_seq'] as $context["_key"] => $context["class"]) { 140 | // line 44 141 | echo "
  • "; 142 | echo $context["__internal_a46b438074c8aeb9b2fb3551daa50610ff3a024d"]->getclass_link($this->getContext($context, "class"), array("target" => "main")); 143 | echo "
  • 144 | "; 145 | } 146 | $_parent = $context['_parent']; 147 | unset($context['_seq'], $context['_iterated'], $context['_key'], $context['class'], $context['_parent'], $context['loop']); 148 | $context = array_merge($_parent, array_intersect_key($context, $_parent)); 149 | // line 46 150 | echo "
151 | "; 152 | } 153 | } 154 | 155 | public function getTemplateName() 156 | { 157 | return "namespace.twig"; 158 | } 159 | 160 | public function isTraitable() 161 | { 162 | return false; 163 | } 164 | 165 | public function getDebugInfo() 166 | { 167 | return array ( 148 => 46, 139 => 44, 135 => 43, 129 => 40, 126 => 39, 122 => 37, 113 => 35, 109 => 34, 105 => 32, 100 => 30, 83 => 25, 80 => 24, 71 => 13, 25 => 3, 118 => 35, 104 => 33, 96 => 28, 90 => 27, 87 => 26, 84 => 25, 75 => 21, 57 => 14, 46 => 10, 125 => 64, 120 => 61, 107 => 59, 22 => 4, 91 => 27, 72 => 21, 67 => 11, 61 => 15, 55 => 7, 95 => 27, 59 => 26, 43 => 7, 142 => 39, 134 => 36, 127 => 35, 123 => 33, 116 => 32, 112 => 30, 103 => 31, 99 => 30, 93 => 28, 86 => 50, 70 => 18, 64 => 18, 53 => 14, 24 => 3, 41 => 8, 39 => 7, 19 => 4, 377 => 58, 361 => 56, 356 => 55, 353 => 54, 348 => 53, 331 => 52, 329 => 51, 327 => 50, 316 => 49, 301 => 46, 289 => 45, 263 => 40, 259 => 39, 256 => 37, 253 => 35, 251 => 34, 234 => 33, 232 => 32, 220 => 31, 209 => 28, 203 => 27, 197 => 26, 183 => 25, 172 => 22, 166 => 21, 160 => 20, 146 => 19, 133 => 16, 131 => 41, 124 => 13, 117 => 11, 115 => 10, 102 => 32, 51 => 11, 40 => 6, 35 => 8, 32 => 4, 23 => 6, 17 => 1, 108 => 32, 101 => 28, 97 => 55, 88 => 27, 85 => 15, 81 => 23, 77 => 21, 62 => 16, 60 => 9, 56 => 15, 50 => 13, 47 => 11, 44 => 9, 38 => 6, 78 => 23, 74 => 20, 69 => 20, 58 => 13, 54 => 13, 48 => 10, 29 => 5, 92 => 26, 89 => 25, 82 => 8, 79 => 22, 73 => 20, 68 => 19, 66 => 18, 63 => 10, 45 => 9, 42 => 9, 36 => 5, 31 => 5, 20 => 8, 49 => 12, 37 => 6, 33 => 4, 30 => 6, 27 => 8, 26 => 3,); 168 | } 169 | } 170 | -------------------------------------------------------------------------------- /docs/source/API/API/cache/twig/89/71/c3d8a650860123bab994f18ba7c7.php: -------------------------------------------------------------------------------- 1 | blocks = array( 11 | 'title' => array($this, 'block_title'), 12 | 'body_class' => array($this, 'block_body_class'), 13 | 'content_header' => array($this, 'block_content_header'), 14 | 'content' => array($this, 'block_content'), 15 | ); 16 | } 17 | 18 | protected function doGetParent(array $context) 19 | { 20 | return $this->env->resolveTemplate($this->getContext($context, "page_layout")); 21 | } 22 | 23 | protected function doDisplay(array $context, array $blocks = array()) 24 | { 25 | // line 3 26 | $context["__internal_68d18e37d310d669cde16ede54bbe2d101ed3516"] = $this->env->loadTemplate("macros.twig"); 27 | $this->getParent($context)->display($context, array_merge($this->blocks, $blocks)); 28 | } 29 | 30 | // line 5 31 | public function block_title($context, array $blocks = array()) 32 | { 33 | echo twig_escape_filter($this->env, $this->getContext($context, "namespace"), "html", null, true); 34 | echo " | "; 35 | $this->displayParentBlock("title", $context, $blocks); 36 | } 37 | 38 | // line 7 39 | public function block_body_class($context, array $blocks = array()) 40 | { 41 | echo "overview"; 42 | } 43 | 44 | // line 9 45 | public function block_content_header($context, array $blocks = array()) 46 | { 47 | // line 10 48 | echo "
Namespace
49 |

"; 50 | // line 11 51 | echo twig_escape_filter($this->env, $this->getContext($context, "namespace"), "html", null, true); 52 | echo "

53 | "; 54 | } 55 | 56 | // line 14 57 | public function block_content($context, array $blocks = array()) 58 | { 59 | // line 15 60 | echo " "; 61 | if ($this->getContext($context, "classes")) { 62 | // line 16 63 | echo " 64 | "; 65 | // line 17 66 | $context['_parent'] = (array) $context; 67 | $context['_seq'] = twig_ensure_traversable($this->getContext($context, "classes")); 68 | foreach ($context['_seq'] as $context["_key"] => $context["class"]) { 69 | // line 18 70 | echo " 71 | 75 | 79 | 80 | "; 81 | } 82 | $_parent = $context['_parent']; 83 | unset($context['_seq'], $context['_iterated'], $context['_key'], $context['class'], $context['_parent'], $context['loop']); 84 | $context = array_merge($_parent, array_intersect_key($context, $_parent)); 85 | // line 23 86 | echo "
"; 72 | // line 19 73 | echo $context["__internal_68d18e37d310d669cde16ede54bbe2d101ed3516"]->getclass_link($this->getContext($context, "class")); 74 | echo ""; 76 | // line 20 77 | echo nl2br(twig_escape_filter($this->env, $this->env->getExtension('sami')->parseDesc($context, $this->getAttribute($this->getContext($context, "class"), "shortdesc"), $this->getContext($context, "class")), "html", null, true)); 78 | echo "
87 | "; 88 | } 89 | // line 25 90 | echo " 91 | "; 92 | // line 26 93 | if ($this->getContext($context, "interfaces")) { 94 | // line 27 95 | echo "

Interfaces

96 | 97 | "; 98 | // line 29 99 | $context['_parent'] = (array) $context; 100 | $context['_seq'] = twig_ensure_traversable($this->getContext($context, "interfaces")); 101 | foreach ($context['_seq'] as $context["_key"] => $context["interface"]) { 102 | // line 30 103 | echo " 104 | 108 | 112 | 113 | "; 114 | } 115 | $_parent = $context['_parent']; 116 | unset($context['_seq'], $context['_iterated'], $context['_key'], $context['interface'], $context['_parent'], $context['loop']); 117 | $context = array_merge($_parent, array_intersect_key($context, $_parent)); 118 | // line 35 119 | echo "
"; 105 | // line 31 106 | echo $context["__internal_68d18e37d310d669cde16ede54bbe2d101ed3516"]->getclass_link($this->getContext($context, "interface")); 107 | echo ""; 109 | // line 32 110 | echo nl2br(twig_escape_filter($this->env, $this->env->getExtension('sami')->parseDesc($context, $this->getAttribute($this->getContext($context, "interface"), "shortdesc"), $this->getContext($context, "interface")), "html", null, true)); 111 | echo "
120 | "; 121 | } 122 | // line 37 123 | echo " 124 | "; 125 | // line 38 126 | if ($this->getContext($context, "exceptions")) { 127 | // line 39 128 | echo "

Exceptions

129 | 130 | "; 131 | // line 41 132 | $context['_parent'] = (array) $context; 133 | $context['_seq'] = twig_ensure_traversable($this->getContext($context, "exceptions")); 134 | foreach ($context['_seq'] as $context["_key"] => $context["exception"]) { 135 | // line 42 136 | echo " 137 | 141 | 145 | 146 | "; 147 | } 148 | $_parent = $context['_parent']; 149 | unset($context['_seq'], $context['_iterated'], $context['_key'], $context['exception'], $context['_parent'], $context['loop']); 150 | $context = array_merge($_parent, array_intersect_key($context, $_parent)); 151 | // line 47 152 | echo "
"; 138 | // line 43 139 | echo $context["__internal_68d18e37d310d669cde16ede54bbe2d101ed3516"]->getclass_link($this->getContext($context, "exception")); 140 | echo ""; 142 | // line 44 143 | echo nl2br(twig_escape_filter($this->env, $this->env->getExtension('sami')->parseDesc($context, $this->getAttribute($this->getContext($context, "exception"), "shortdesc"), $this->getContext($context, "exception")), "html", null, true)); 144 | echo "
153 | "; 154 | } 155 | } 156 | 157 | public function getTemplateName() 158 | { 159 | return "pages/namespace.twig"; 160 | } 161 | 162 | public function isTraitable() 163 | { 164 | return false; 165 | } 166 | 167 | public function getDebugInfo() 168 | { 169 | return array ( 150 => 47, 141 => 44, 137 => 43, 130 => 41, 121 => 37, 148 => 46, 139 => 44, 135 => 43, 129 => 40, 126 => 39, 122 => 37, 113 => 35, 109 => 34, 105 => 32, 100 => 30, 83 => 25, 80 => 24, 71 => 19, 25 => 3, 118 => 35, 104 => 31, 96 => 28, 90 => 27, 87 => 26, 84 => 23, 75 => 20, 57 => 14, 46 => 10, 125 => 64, 120 => 61, 107 => 59, 22 => 4, 91 => 26, 72 => 21, 67 => 11, 61 => 16, 55 => 14, 95 => 27, 59 => 26, 43 => 9, 142 => 39, 134 => 42, 127 => 35, 123 => 33, 116 => 32, 112 => 30, 103 => 31, 99 => 30, 93 => 27, 86 => 50, 70 => 18, 64 => 17, 53 => 14, 24 => 3, 41 => 8, 39 => 7, 19 => 4, 377 => 58, 361 => 56, 356 => 55, 353 => 54, 348 => 53, 331 => 52, 329 => 51, 327 => 50, 316 => 49, 301 => 46, 289 => 45, 263 => 40, 259 => 39, 256 => 37, 253 => 35, 251 => 34, 234 => 33, 232 => 32, 220 => 31, 209 => 28, 203 => 27, 197 => 26, 183 => 25, 172 => 22, 166 => 21, 160 => 20, 146 => 19, 133 => 16, 131 => 41, 124 => 38, 117 => 35, 115 => 10, 102 => 32, 51 => 11, 40 => 6, 35 => 8, 32 => 4, 23 => 6, 17 => 1, 108 => 32, 101 => 30, 97 => 29, 88 => 25, 85 => 15, 81 => 23, 77 => 21, 62 => 16, 60 => 9, 56 => 15, 50 => 13, 47 => 11, 44 => 9, 38 => 6, 78 => 23, 74 => 20, 69 => 20, 58 => 15, 54 => 13, 48 => 10, 29 => 5, 92 => 26, 89 => 25, 82 => 8, 79 => 22, 73 => 20, 68 => 18, 66 => 18, 63 => 10, 45 => 9, 42 => 9, 36 => 5, 31 => 5, 20 => 8, 49 => 11, 37 => 7, 33 => 4, 30 => 6, 27 => 8, 26 => 3,); 170 | } 171 | } 172 | -------------------------------------------------------------------------------- /docs/source/API/API/classes-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | All Classes | PHP-XPDF API 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/source/API/API/classes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Classes | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |

Classes

22 |
23 |
24 | 25 | 26 | 29 | 32 | 33 | 34 | 37 | 40 | 41 | 42 | 45 | 48 | 49 | 50 | 53 | 56 | 57 | 58 | 61 | 64 | 65 | 66 | 69 | 72 | 73 | 74 | 77 | 80 | 81 |
27 | XPDF\Exception\BinaryNotFoundException 28 | 30 | XPDF Binary Not Found Exception 31 |
35 | XPDF\Exception\ExceptionInterface 36 | 38 | XPDF Exception Interface 39 |
43 | XPDF\Exception\InvalidArgumentException 44 | 46 | XPDF Invalid File Argument Exception 47 |
51 | XPDF\Exception\LogicException 52 | 54 | XPDF Logic Exception 55 |
59 | XPDF\Exception\RuntimeException 60 | 62 | XPDF Runtime Exception 63 |
67 | XPDF\PdfToText 68 | 70 | The PdfToText object. 71 |
75 | XPDF\XPDFServiceProvider 76 | 78 | 79 |
82 |
83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /docs/source/API/API/css/main.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2009 Vladimir Kolesnikov 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining 5 | a copy of this software and associated documentation files (the 6 | "Software"), to deal in the Software without restriction, including 7 | without limitation the rights to use, copy, modify, merge, publish, 8 | distribute, sublicense, and/or sell copies of the Software, and to 9 | permit persons to whom the Software is furnished to do so, subject to 10 | the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | */ 23 | 24 | a { 25 | color: #00F; 26 | text-decoration: none; 27 | } 28 | 29 | a:hover { 30 | color: #77F; 31 | text-decoration: underline; 32 | } 33 | 34 | body, td, p { 35 | font-family: "Bitstream Vera Sans", Verdana, Arial, Helvetica, sans-serif; 36 | background: #FFF; 37 | color: #000; 38 | margin: 0px; 39 | font-size: small; 40 | } 41 | 42 | p { 43 | margin-top: 0.5em; 44 | margin-bottom: 0.5em; 45 | } 46 | 47 | #content { 48 | margin: 2em; 49 | margin-left: 3.5em; 50 | margin-right: 3.5em; 51 | } 52 | 53 | #description p { 54 | margin-bottom: 0.5em; 55 | } 56 | 57 | .sectiontitle { 58 | margin-top: 1em; 59 | margin-bottom: 1em; 60 | padding: 0.5em; 61 | padding-left: 2em; 62 | background: #005; 63 | color: #FFF; 64 | font-weight: bold; 65 | } 66 | 67 | .attr-rw { 68 | padding-left: 1em; 69 | padding-right: 1em; 70 | text-align: center; 71 | color: #055; 72 | } 73 | 74 | .attr-name { 75 | font-weight: bold; 76 | } 77 | 78 | .attr-desc { 79 | } 80 | 81 | .attr-desc p { 82 | margin-top: 0; 83 | } 84 | 85 | .attr-value { 86 | font-family: monospace; 87 | } 88 | 89 | .file-title-prefix { 90 | font-size: large; 91 | } 92 | 93 | .file-title { 94 | font-size: large; 95 | font-weight: bold; 96 | background: #005; 97 | color: #FFF; 98 | } 99 | 100 | .banner { 101 | background: #005; 102 | color: #FFF; 103 | border: 1px solid black; 104 | padding: 1em; 105 | } 106 | 107 | .banner td { 108 | background: transparent; 109 | color: #FFF; 110 | } 111 | 112 | h1 a, h2 a, .sectiontitle a, .banner a { 113 | color: #FF0; 114 | } 115 | 116 | h1 a:hover, h2 a:hover, .sectiontitle a:hover, .banner a:hover { 117 | color: #FF7; 118 | } 119 | 120 | .dyn-source { 121 | display: none; 122 | background: #fffde8; 123 | color: #000; 124 | border: #ffe0bb dotted 1px; 125 | margin: 0.5em 2em 0.5em 2em; 126 | padding: 0.5em; 127 | } 128 | 129 | .dyn-source .cmt { 130 | color: #00F; 131 | font-style: italic; 132 | } 133 | 134 | .dyn-source .kw { 135 | color: #070; 136 | font-weight: bold; 137 | } 138 | 139 | .method { 140 | margin-left: 1em; 141 | margin-right: 1em; 142 | margin-bottom: 1em; 143 | } 144 | 145 | .description pre { 146 | padding: 0.5em; 147 | border: #ffe0bb dotted 1px; 148 | background: #fffde8; 149 | } 150 | 151 | .method .title { 152 | font-family: monospace; 153 | font-size: large; 154 | border-bottom: 1px dashed black; 155 | margin-bottom: 0.3em; 156 | padding-bottom: 0.1em; 157 | } 158 | 159 | .method .description, .method .sourcecode { 160 | margin-left: 1em; 161 | } 162 | 163 | .description p, .sourcecode p { 164 | margin-bottom: 0.5em; 165 | } 166 | 167 | .method .sourcecode p.source-link { 168 | text-indent: 0em; 169 | margin-top: 0.5em; 170 | } 171 | 172 | .method .aka { 173 | margin-top: 0.3em; 174 | margin-left: 1em; 175 | font-style: italic; 176 | text-indent: 2em; 177 | } 178 | 179 | h1 { 180 | padding: 1em; 181 | margin-left: -1.5em; 182 | font-size: x-large; 183 | font-weight: bold; 184 | color: #FFF; 185 | background: #007; 186 | } 187 | 188 | h2 { 189 | padding: 0.5em 1em 0.5em 1em; 190 | margin-left: -1.5em; 191 | font-size: large; 192 | font-weight: bold; 193 | color: #FFF; 194 | background: #009; 195 | } 196 | 197 | h3, h4, h5, h6 { 198 | color: #220088; 199 | border-bottom: #5522bb solid 1px; 200 | } 201 | 202 | .sourcecode > pre { 203 | padding: 0.5em; 204 | border: 1px dotted black; 205 | background: #FFE; 206 | } 207 | 208 | dt { 209 | font-weight: bold 210 | } 211 | 212 | dd { 213 | margin-bottom: 0.7em; 214 | } -------------------------------------------------------------------------------- /docs/source/API/API/css/reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ */ 2 | /* v1.0 | 20080212 */ 3 | 4 | html, body, div, span, applet, object, iframe, 5 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 6 | a, abbr, acronym, address, big, cite, code, 7 | del, dfn, em, font, img, ins, kbd, q, s, samp, 8 | small, strike, strong, sub, sup, tt, var, 9 | b, u, i, center, 10 | dl, dt, dd, ol, ul, li, 11 | fieldset, form, label, legend, 12 | table, caption, tbody, tfoot, thead, tr, th, td { 13 | margin: 0; 14 | padding: 0; 15 | border: 0; 16 | outline: 0; 17 | font-size: 100%; 18 | vertical-align: baseline; 19 | background: transparent; 20 | } 21 | body { 22 | line-height: 1; 23 | } 24 | ol, ul { 25 | list-style: none; 26 | } 27 | blockquote, q { 28 | quotes: none; 29 | } 30 | blockquote:before, blockquote:after, 31 | q:before, q:after { 32 | content: ''; 33 | content: none; 34 | } 35 | 36 | /* remember to define focus styles! */ 37 | :focus { 38 | outline: 0; 39 | } 40 | 41 | /* remember to highlight inserts somehow! */ 42 | ins { 43 | text-decoration: none; 44 | } 45 | del { 46 | text-decoration: line-through; 47 | } 48 | 49 | /* tables still need 'cellspacing="0"' in the markup */ 50 | table { 51 | border-collapse: collapse; 52 | border-spacing: 0; 53 | } -------------------------------------------------------------------------------- /docs/source/API/API/doc-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Index | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |
Index
22 | 23 | A 24 | B 25 | C 26 | D 27 | E 28 | F 29 | G 30 | H 31 | I 32 | J 33 | K 34 | L 35 | M 36 | N 37 | O 38 | P 39 | Q 40 | R 41 | S 42 | T 43 | U 44 | V 45 | W 46 | X 47 | Y 48 | Z 49 |
50 |
51 |

B

52 |
BinaryNotFoundExceptionClass in namespace XPDF\Exception
53 |
XPDF Binary Not Found Exception
XPDFServiceProvider::boot() — Method in class XPDFServiceProvider
54 |

C

55 |
PdfToText::close() — Method in class PdfToText
56 |
Close the current open file

E

57 |
ExceptionInterfaceClass in namespace XPDF\Exception
58 |
XPDF Exception Interface

G

59 |
PdfToText::getOuputEncoding() — Method in class PdfToText
60 |
Get the ouput encoding, default is UTF-8
PdfToText::getText() — Method in class PdfToText
61 |
Extract the text of the current open PDF file, if not page start/end provided, etxract all pages

I

62 |
InvalidArgumentExceptionClass in namespace XPDF\Exception
63 |
XPDF Invalid File Argument Exception

L

64 |
LogicExceptionClass in namespace XPDF\Exception
65 |
XPDF Logic Exception
PdfToText::load() — Method in class PdfToText
66 |
Look for pdftotext binary and return a new XPDF object

O

67 |
PdfToText::open() — Method in class PdfToText
68 |
Opens a PDF file in order to extract text

P

69 |
PdfToTextClass in namespace XPDF
70 |
The PdfToText object.

R

71 |
RuntimeExceptionClass in namespace XPDF\Exception
72 |
XPDF Runtime Exception
XPDFServiceProvider::register() — Method in class XPDFServiceProvider
73 |

S

74 |
PdfToText::setPageQuantity() — Method in class PdfToText
75 |
Set the default number of page to extract When extracting text, if no page end is provided and this value has been set, then the quantity will be limited.
PdfToText::setOuputEncoding() — Method in class PdfToText
76 |
Set the output encoding.

X

77 |
XPDFServiceProviderClass in namespace XPDF
78 |

_

79 |
PdfToText::__construct() — Method in class PdfToText
80 |
Constructor
PdfToText::__destruct() — Method in class PdfToText
81 |
Destructor
82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /docs/source/API/API/i/arrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchemy-fr/PHP-XPDF/17a9e9a1cf2626f864dafe21d404e4e61db2a4aa/docs/source/API/API/i/arrows.png -------------------------------------------------------------------------------- /docs/source/API/API/i/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchemy-fr/PHP-XPDF/17a9e9a1cf2626f864dafe21d404e4e61db2a4aa/docs/source/API/API/i/loader.gif -------------------------------------------------------------------------------- /docs/source/API/API/i/results_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchemy-fr/PHP-XPDF/17a9e9a1cf2626f864dafe21d404e4e61db2a4aa/docs/source/API/API/i/results_bg.png -------------------------------------------------------------------------------- /docs/source/API/API/i/tree_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchemy-fr/PHP-XPDF/17a9e9a1cf2626f864dafe21d404e4e61db2a4aa/docs/source/API/API/i/tree_bg.png -------------------------------------------------------------------------------- /docs/source/API/API/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | PHP-XPDF API 7 | 8 | 9 | 10 | 11 | 12 | 13 | <body> 14 | Your browser does not support frames. Go to the <a href="namespaces.html">non-frame version</a>. 15 | </body> 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /docs/source/API/API/interfaces.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Interfaces | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |

Interfaces

22 |
23 |
24 | 25 | 26 | 27 | 30 | 31 |
XPDF\Exception\ExceptionInterface 28 | XPDF Exception Interface 29 |
32 |
33 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/source/API/API/namespaces-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Namespaces | PHP-XPDF API 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/source/API/API/namespaces.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Namespaces | PHP-XPDF API 7 | 8 | 9 | 10 |
11 | 18 | 19 |
PHP-XPDF API
20 | 21 |

Namespaces

22 |
23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
XPDF
XPDF\Exception
32 |
33 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/source/API/API/opensearch.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchemy-fr/PHP-XPDF/17a9e9a1cf2626f864dafe21d404e4e61db2a4aa/docs/source/API/API/opensearch.xml -------------------------------------------------------------------------------- /docs/source/API/API/panel.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | PHP-XPDF API 5 | 6 | 7 | 8 | 9 | 10 | 46 | 47 | 48 |
49 |
50 | loading... 51 |
52 |
53 | 60 |
61 |
62 |
    63 |
64 |
65 |
66 |
    67 |
68 |
69 |
70 | 71 | 72 | -------------------------------------------------------------------------------- /docs/source/API/API/renderer.index: -------------------------------------------------------------------------------- 1 | C:19:"Sami\Renderer\Index":694:{a:3:{i:0;a:7:{s:38:"XPDF\Exception\BinaryNotFoundException";s:40:"9aa8a88f5208398a032cecc1c800fda34bc341b6";s:33:"XPDF\Exception\ExceptionInterface";s:40:"4d55277cce668958cea56742061a130f15a7a6aa";s:39:"XPDF\Exception\InvalidArgumentException";s:40:"6ef56e24f91f2a22497f29e9b523714e7377c2c0";s:29:"XPDF\Exception\LogicException";s:40:"a57f1e67451bc0ff4a7251b496a49a1373c96623";s:31:"XPDF\Exception\RuntimeException";s:40:"255e757fbf53837abc69b467a60fcf738beb6541";s:14:"XPDF\PdfToText";s:40:"9e30d169ba62d96b86ae1ec3a0868eecd11acf95";s:24:"XPDF\XPDFServiceProvider";s:40:"42e545bbccc2e0bbd9c931a1a8bd44712c7df264";}i:1;a:1:{i:0;s:6:"master";}i:2;a:2:{i:0;s:4:"XPDF";i:1;s:14:"XPDF\Exception";}}} -------------------------------------------------------------------------------- /docs/source/API/API/search_index.js: -------------------------------------------------------------------------------- 1 | var search_data = { 2 | 'index': { 3 | 'searchIndex': ["xpdf","xpdf\\exception","xpdf\\exception\\binarynotfoundexception","xpdf\\exception\\exceptioninterface","xpdf\\exception\\invalidargumentexception","xpdf\\exception\\logicexception","xpdf\\exception\\runtimeexception","xpdf\\pdftotext","xpdf\\xpdfserviceprovider","xpdf\\pdftotext::__construct","xpdf\\pdftotext::__destruct","xpdf\\pdftotext::setpagequantity","xpdf\\pdftotext::open","xpdf\\pdftotext::close","xpdf\\pdftotext::setouputencoding","xpdf\\pdftotext::getouputencoding","xpdf\\pdftotext::gettext","xpdf\\pdftotext::load","xpdf\\xpdfserviceprovider::register","xpdf\\xpdfserviceprovider::boot"], 4 | 'info': [["XPDF","","XPDF.html","","",3],["XPDF\\Exception","","XPDF\/Exception.html","","",3],["BinaryNotFoundException","XPDF\\Exception","XPDF\/Exception\/BinaryNotFoundException.html"," < Exception","XPDF Binary Not Found Exception",1],["ExceptionInterface","XPDF\\Exception","XPDF\/Exception\/ExceptionInterface.html","","XPDF Exception Interface",1],["InvalidArgumentException","XPDF\\Exception","XPDF\/Exception\/InvalidArgumentException.html"," < InvalidArgumentException","XPDF Invalid File Argument Exception",1],["LogicException","XPDF\\Exception","XPDF\/Exception\/LogicException.html"," < LogicException","XPDF Logic Exception",1],["RuntimeException","XPDF\\Exception","XPDF\/Exception\/RuntimeException.html"," < RuntimeException","XPDF Runtime Exception",1],["PdfToText","XPDF","XPDF\/PdfToText.html","","The PdfToText object.",1],["XPDFServiceProvider","XPDF","XPDF\/XPDFServiceProvider.html","","",1],["PdfToText::__construct","XPDF\\PdfToText","XPDF\/PdfToText.html#method___construct","(string $binary, Logger<\/abbr> $logger)","Constructor",2],["PdfToText::__destruct","XPDF\\PdfToText","XPDF\/PdfToText.html#method___destruct","()","Destructor",2],["PdfToText::setPageQuantity","XPDF\\PdfToText","XPDF\/PdfToText.html#method_setPageQuantity","(integer $pages)","Set the default number of page to extract When extracting",2],["PdfToText::open","XPDF\\PdfToText","XPDF\/PdfToText.html#method_open","(string $pathfile)","Opens a PDF file in order to extract text",2],["PdfToText::close","XPDF\\PdfToText","XPDF\/PdfToText.html#method_close","()","Close the current open file",2],["PdfToText::setOuputEncoding","XPDF\\PdfToText","XPDF\/PdfToText.html#method_setOuputEncoding","(string $charset)","Set the output encoding.",2],["PdfToText::getOuputEncoding","XPDF\\PdfToText","XPDF\/PdfToText.html#method_getOuputEncoding","()","Get the ouput encoding, default is UTF-8",2],["PdfToText::getText","XPDF\\PdfToText","XPDF\/PdfToText.html#method_getText","(integer $page_start = null, integer $page_end = null)","Extract the text of the current open PDF file, if not",2],["PdfToText::load","XPDF\\PdfToText","XPDF\/PdfToText.html#method_load","(Logger<\/abbr> $logger)","Look for pdftotext binary and return a new XPDF object",2],["XPDFServiceProvider::register","XPDF\\XPDFServiceProvider","XPDF\/XPDFServiceProvider.html#method_register","(Application<\/abbr> $app)","",2],["XPDFServiceProvider::boot","XPDF\\XPDFServiceProvider","XPDF\/XPDFServiceProvider.html#method_boot","(Application<\/abbr> $app)","",2]] 5 | } 6 | } 7 | search_data['index']['longSearchIndex'] = search_data['index']['searchIndex'] -------------------------------------------------------------------------------- /docs/source/API/API/stylesheet.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2010, Yahoo! Inc. All rights reserved. 3 | Code licensed under the BSD License: 4 | http://developer.yahoo.com/yui/license.html 5 | version: 2.8.1 6 | */ 7 | html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var,optgroup{font-style:inherit;font-weight:inherit;}del,ins{text-decoration:none;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:baseline;}sub{vertical-align:baseline;}legend{color:#000;}input,button,textarea,select,optgroup,option{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;}input,button,textarea,select{*font-size:100%;}body{font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}select,input,button,textarea,button{font:99% arial,helvetica,clean,sans-serif;}table{font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}body{text-align:center;}#doc,#doc2,#doc3,#doc4,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.25em;}#doc2{width:73.076em;*width:71.25em;}#doc3{margin:auto 10px;width:auto;}#doc4{width:74.923em;*width:73.05em;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main,.yui-g .yui-u .yui-g{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.30769em;*width:12.00em;}.yui-t1 #yui-main .yui-b{margin-left:13.30769em;*margin-left:13.05em;}.yui-t2 .yui-b{float:left;width:13.8461em;*width:13.50em;}.yui-t2 #yui-main .yui-b{margin-left:14.8461em;*margin-left:14.55em;}.yui-t3 .yui-b{float:left;width:23.0769em;*width:22.50em;}.yui-t3 #yui-main .yui-b{margin-left:24.0769em;*margin-left:23.62em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.50em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.55em;}.yui-t5 .yui-b{float:right;width:18.4615em;*width:18.00em;}.yui-t5 #yui-main .yui-b{margin-right:19.4615em;*margin-right:19.125em;}.yui-t6 .yui-b{float:right;width:23.0769em;*width:22.50em;}.yui-t6 #yui-main .yui-b{margin-right:24.0769em;*margin-right:23.62em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf,.yui-gc .yui-u,.yui-gd .yui-g,.yui-g .yui-gc .yui-u,.yui-ge .yui-u,.yui-ge .yui-g,.yui-gf .yui-g,.yui-gf .yui-u{float:right;}.yui-g div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first,.yui-g .yui-gc div.first,.yui-g .yui-ge div.first,.yui-gc div.first div.first{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf{width:49.1%;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{width:32%;margin-left:1.99%;}.yui-gb .yui-u{*margin-left:1.9%;*width:31.9%;}.yui-gc div.first,.yui-gd .yui-u{width:66%;}.yui-gd div.first{width:32%;}.yui-ge div.first,.yui-gf .yui-u{width:74.2%;}.yui-ge .yui-u,.yui-gf div.first{width:24%;}.yui-g .yui-gb div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-g .yui-g .yui-u,.yui-gb .yui-g .yui-u,.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u,.yui-ge .yui-g .yui-u,.yui-gf .yui-g .yui-u{width:49%;*width:48.1%;*margin-left:0;}.yui-g .yui-g .yui-u{width:48.1%;}.yui-g .yui-gb div.first,.yui-gb .yui-gb div.first{*margin-right:0;*width:32%;_width:31.7%;}.yui-g .yui-gc div.first,.yui-gd .yui-g{width:66%;}.yui-gb .yui-g div.first{*margin-right:4%;_margin-right:1.3%;}.yui-gb .yui-gc div.first,.yui-gb .yui-gd div.first{*margin-right:0;}.yui-gb .yui-gb .yui-u,.yui-gb .yui-gc .yui-u{*margin-left:1.8%;_margin-left:4%;}.yui-g .yui-gb .yui-u{_margin-left:1.0%;}.yui-gb .yui-gd .yui-u{*width:66%;_width:61.2%;}.yui-gb .yui-gd div.first{*width:31%;_width:29.5%;}.yui-g .yui-gc .yui-u,.yui-gb .yui-gc .yui-u{width:32%;_float:right;margin-right:0;_margin-left:0;}.yui-gb .yui-gc div.first{width:66%;*float:left;*margin-left:0;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf .yui-u{margin:0;}.yui-gb .yui-gb .yui-u{_margin-left:.7%;}.yui-gb .yui-g div.first,.yui-gb .yui-gb div.first{*margin-left:0;}.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u{*width:48.1%;*margin-left:0;}.yui-gb .yui-gd div.first{width:32%;}.yui-g .yui-gd div.first{_width:29.9%;}.yui-ge .yui-g{width:24%;}.yui-gf .yui-g{width:74.2%;}.yui-gb .yui-ge div.yui-u,.yui-gb .yui-gf div.yui-u{float:right;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf div.first{float:left;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf div.first{*width:24%;_width:20%;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf .yui-u{*width:73.5%;_width:65.5%;}.yui-ge div.first .yui-gd .yui-u{width:65%;}.yui-ge div.first .yui-gd div.first{width:32%;}#hd:after,#bd:after,#ft:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#hd,#bd,#ft,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;} 8 | 9 | strong { 10 | font-weight: bold; 11 | } 12 | 13 | em { 14 | font-style: italic; 15 | } 16 | 17 | a { 18 | text-decoration: none; 19 | } 20 | 21 | a:hover { 22 | text-decoration:underline; 23 | } 24 | 25 | body { 26 | text-align: left; 27 | margin: 0; 28 | padding: 0; 29 | background-color: #fff; 30 | color: #000; 31 | } 32 | 33 | td.last { 34 | width: 100%; 35 | } 36 | 37 | table, th, td { 38 | border-bottom: 1px solid #ccc; 39 | vertical-align: top; 40 | } 41 | 42 | table { 43 | margin-bottom: 20px; 44 | } 45 | 46 | td { 47 | padding: 7px 4px; 48 | } 49 | 50 | td p { 51 | padding: 0; 52 | margin: 0; 53 | } 54 | 55 | p, dl, ul, ol, h1, h2, h3, h4, h5, h6 { 56 | margin: 5px 0; 57 | } 58 | 59 | dd { 60 | margin-left: 20px; 61 | margin-bottom: 7px; 62 | } 63 | 64 | ul, ol { 65 | margin-left: 30px; 66 | } 67 | 68 | #title { 69 | font-size: 140%; 70 | } 71 | 72 | h1 { 73 | font-size: 130%; 74 | } 75 | 76 | h2 { 77 | font-size: 120%; 78 | font-weight: bold; 79 | margin: 15px 0; 80 | background-color: #EDF3FE; 81 | padding: 5px; 82 | } 83 | 84 | h3 { 85 | font-size: 110%; 86 | } 87 | 88 | h4 { 89 | font-weight: bold; 90 | } 91 | 92 | /* page header */ 93 | 94 | div.header { 95 | background-color: #EDF3FE; 96 | border-bottom: 1px solid #ccc; 97 | padding: 20px 30px 10px 30px; 98 | } 99 | 100 | #frame div.header { 101 | background-color: #fff; 102 | border: 0; 103 | padding: 10px 15px 5px 15px; 104 | } 105 | 106 | /* menu */ 107 | 108 | div.header ul { 109 | list-style: none; 110 | margin: 0; 111 | float: right; 112 | font-size: 80%; 113 | } 114 | 115 | div.header ul li { 116 | display: inline; 117 | font-size: 100%; 118 | font-weight: bold; 119 | padding: 0 4px; 120 | } 121 | 122 | div.header ul li a { 123 | color: #000; 124 | text-transform: uppercase; 125 | } 126 | 127 | #frame div.header ul { 128 | float: none; 129 | } 130 | 131 | #frame div.header ul li { 132 | padding: 0; 133 | padding-right: 7px; 134 | } 135 | 136 | /* footer */ 137 | 138 | #footer { 139 | margin: 30px; 140 | text-align: right; 141 | font-size: 80%; 142 | } 143 | 144 | /* frames */ 145 | 146 | #frame .content { 147 | margin: 10px; 148 | } 149 | 150 | #frame h1 { 151 | font-size: 120%; 152 | } 153 | 154 | #frame h2 { 155 | font-size: 100%; 156 | } 157 | 158 | #frame ul { 159 | list-style: none; 160 | margin-left: 0; 161 | } 162 | 163 | /* class */ 164 | 165 | div.type { 166 | color: #aaa; 167 | margin: 10px 0 0; 168 | } 169 | 170 | div.location { 171 | font-size: 80%; 172 | float: right; 173 | font-style: italic; 174 | } 175 | 176 | #class h1 { 177 | margin: 0 0 10px; 178 | } 179 | 180 | #class h3 { 181 | font-size: 100%; 182 | margin: 15px 0; 183 | } 184 | 185 | #class h3 strong { 186 | font-size: 120%; 187 | } 188 | 189 | div.details { 190 | padding: 0 0 10px 20px; 191 | border-bottom: 1px solid #ccc; 192 | } 193 | 194 | div.tags { 195 | clear: both; 196 | padding-top: 15px; 197 | font-size: 90%; 198 | } 199 | 200 | td.type { 201 | text-align: right; 202 | } 203 | 204 | #class .content, #overview .content { 205 | padding: 10px 30px; 206 | } 207 | 208 | .description { 209 | margin: 10px 0; 210 | padding: 10px; 211 | background-color: #efefef; 212 | } 213 | -------------------------------------------------------------------------------- /docs/source/API/API/tree.js: -------------------------------------------------------------------------------- 1 | var tree = [["XPDF","XPDF.html","", 2 | [["Exception","XPDF\/Exception.html","", 3 | [["BinaryNotFoundException","XPDF\/Exception\/BinaryNotFoundException.html"," < Exception", 4 | [ ]],["ExceptionInterface","XPDF\/Exception\/ExceptionInterface.html","", 5 | [ ]],["InvalidArgumentException","XPDF\/Exception\/InvalidArgumentException.html"," < InvalidArgumentException", 6 | [ ]],["LogicException","XPDF\/Exception\/LogicException.html"," < LogicException", 7 | [ ]],["RuntimeException","XPDF\/Exception\/RuntimeException.html"," < RuntimeException", 8 | [ ]] ]],["PdfToText","XPDF\/PdfToText.html","", 9 | [ ]],["XPDFServiceProvider","XPDF\/XPDFServiceProvider.html","", 10 | [ ]] ]] ] 11 | 12 | -------------------------------------------------------------------------------- /docs/source/_static/.placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchemy-fr/PHP-XPDF/17a9e9a1cf2626f864dafe21d404e4e61db2a4aa/docs/source/_static/.placeholder -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/analytics.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/localtoc.html: -------------------------------------------------------------------------------- 1 | {# 2 | basic/localtoc.html 3 | ~~~~~~~~~~~~~~~~~~~ 4 | 5 | Sphinx sidebar template: local table of contents. 6 | 7 | :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. 8 | :license: BSD, see LICENSE for details. 9 | #} 10 | {%- if display_toc %} 11 | {{ toc }} 12 | {%- endif %} 13 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/ribbon.html: -------------------------------------------------------------------------------- 1 | 2 | Fork me on GitHub 3 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/searchbox.html: -------------------------------------------------------------------------------- 1 | {# 2 | basic/searchbox.html 3 | ~~~~~~~~~~~~~~~~~~~~ 4 | 5 | Sphinx sidebar template: quick search box. 6 | 7 | :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. 8 | :license: BSD, see LICENSE for details. 9 | #} 10 | {%- if pagename != "search" %} 11 | 20 | {%- endif %} 21 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/Alchemy.css_t: -------------------------------------------------------------------------------- 1 | body, html { 2 | background-color:#FFFFFF; 3 | } 4 | 5 | .hero-unit { 6 | background-color: transparent; 7 | } 8 | 9 | tt.literal{ 10 | font-weight:bold; 11 | } 12 | 13 | a.headerlink { 14 | display:none; 15 | } 16 | 17 | div.highlight pre { 18 | background-color: #000000; 19 | color:#DDDDDD; 20 | } 21 | 22 | .sphinxsidebarwrapper ul { 23 | list-style-type: square; 24 | } 25 | 26 | .sphinxsidebarwrapper ul li a{ 27 | color: #333333; 28 | font-size:1.05em; 29 | } 30 | 31 | h1 { 32 | margin-top: 15px; 33 | } 34 | 35 | h2 { 36 | margin-top: 10px; 37 | } 38 | 39 | /* -- navigation styles ----- */ 40 | .navbar { 41 | line-height:1em; 42 | } 43 | #navigation { 44 | min-height: 29px; 45 | line-height: 30px; 46 | display:inline-block; 47 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 48 | font-weight: normal; 49 | } 50 | #navigation ul { 51 | display: block; 52 | float: left; 53 | left: 0; 54 | margin: 0 10px 0 0; 55 | position: relative; 56 | } 57 | #navigation li { 58 | float: left; 59 | display:block; 60 | line-height:38px; 61 | } 62 | #navigation ul > li > a { 63 | color: #999999; 64 | float: none; 65 | line-height: 19px; 66 | padding: 10px 10px 11px; 67 | text-decoration: none; 68 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 69 | } 70 | #navigation li a { 71 | padding:3px 8px; 72 | color: #999; 73 | } 74 | #navigation li.current a { 75 | color: #FFFFFF; 76 | } 77 | #navigation li a:hover { 78 | color: #FFFFFF; 79 | } 80 | #navigation li a:hover, #navigation li a { 81 | text-decoration:none; 82 | } 83 | #navigation li, #ddLinks, #menu { 84 | font-size: 14px; 85 | } 86 | /* -------------------------- */ 87 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/bootstrapCustom.css: -------------------------------------------------------------------------------- 1 | h1, h2, h3, h4, h5, h6{ 2 | padding: 40px 0 5px; 3 | } 4 | 5 | h3{ 6 | padding: 40px 0 10px; 7 | } 8 | 9 | a, a:hover, a:visited{ 10 | color:#0088CC; 11 | text-decoration:underline; 12 | } 13 | 14 | .navbar a, 15 | .sphinxsidebarwrapper a{ 16 | text-decoration:none; 17 | } 18 | 19 | .admonition.note .first.admonition-title { 20 | font-family: century gothic; 21 | font-weight: bold; 22 | text-align : center; 23 | line-height: 30px; 24 | overflow:hidden; 25 | -webkit-border-radius:50px; 26 | -moz-border-radius:50px; 27 | border-radius:50px; 28 | background-color: blue; 29 | box-shadow: 0.5px 0.5px 2px #343434;; 30 | color:white; 31 | width:50px; 32 | margin-right:1em; 33 | float:left; 34 | } 35 | 36 | .admonition.note .last { 37 | line-height: 25px; 38 | } 39 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/img/project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchemy-fr/PHP-XPDF/17a9e9a1cf2626f864dafe21d404e4e61db2a4aa/docs/source/_themes/Alchemy/static/img/project.png -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/js/plugins.js: -------------------------------------------------------------------------------- 1 | // usage: log('inside coolFunc', this, arguments); 2 | // paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/ 3 | window.log = function f(){ log.history = log.history || []; log.history.push(arguments); if(this.console) { var args = arguments, newarr; try { args.callee = f.caller } catch(e) {}; newarr = [].slice.call(args); if (typeof console.log === 'object') log.apply.call(console.log, console, newarr); else console.log.apply(console, newarr);}}; 4 | 5 | // make it safe to use console.log always 6 | (function(a){function b(){}for(var c="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn".split(","),d;!!(d=c.pop());){a[d]=a[d]||b;}}) 7 | (function(){try{console.log();return window.console;}catch(a){return (window.console={});}}()); 8 | 9 | 10 | // place any jQuery/helper plugins in here, instead of separate, slower script files. 11 | 12 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/js/script.js: -------------------------------------------------------------------------------- 1 | /* Author: 2 | 3 | */ 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/accordion.less: -------------------------------------------------------------------------------- 1 | // ACCORDION 2 | // --------- 3 | 4 | 5 | // Parent container 6 | .accordion { 7 | margin-bottom: @baseLineHeight; 8 | } 9 | 10 | // Group == heading + body 11 | .accordion-group { 12 | margin-bottom: 2px; 13 | border: 1px solid #e5e5e5; 14 | .border-radius(4px); 15 | } 16 | .accordion-heading { 17 | border-bottom: 0; 18 | } 19 | .accordion-heading .accordion-toggle { 20 | display: block; 21 | padding: 8px 15px; 22 | } 23 | 24 | // Inner needs the styles because you can't animate properly with any styles on the element 25 | .accordion-inner { 26 | padding: 9px 15px; 27 | border-top: 1px solid #e5e5e5; 28 | } 29 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/alerts.less: -------------------------------------------------------------------------------- 1 | // ALERT STYLES 2 | // ------------ 3 | 4 | // Base alert styles 5 | .alert { 6 | padding: 8px 35px 8px 14px; 7 | margin-bottom: @baseLineHeight; 8 | text-shadow: 0 1px 0 rgba(255,255,255,.5); 9 | background-color: @warningBackground; 10 | border: 1px solid @warningBorder; 11 | .border-radius(4px); 12 | color: @warningText; 13 | } 14 | .alert-heading { 15 | color: inherit; 16 | } 17 | 18 | // Adjust close link position 19 | .alert .close { 20 | position: relative; 21 | top: -2px; 22 | right: -21px; 23 | line-height: 18px; 24 | } 25 | 26 | // Alternate styles 27 | // ---------------- 28 | 29 | .alert-success { 30 | background-color: @successBackground; 31 | border-color: @successBorder; 32 | color: @successText; 33 | } 34 | .alert-danger, 35 | .alert-error { 36 | background-color: @errorBackground; 37 | border-color: @errorBorder; 38 | color: @errorText; 39 | } 40 | .alert-info { 41 | background-color: @infoBackground; 42 | border-color: @infoBorder; 43 | color: @infoText; 44 | } 45 | 46 | // Block alerts 47 | // ------------------------ 48 | .alert-block { 49 | padding-top: 14px; 50 | padding-bottom: 14px; 51 | } 52 | .alert-block > p, 53 | .alert-block > ul { 54 | margin-bottom: 0; 55 | } 56 | .alert-block p + p { 57 | margin-top: 5px; 58 | } 59 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/badges.less: -------------------------------------------------------------------------------- 1 | // BADGES 2 | // ------ 3 | 4 | // Base 5 | .badge { 6 | padding: 1px 9px 2px; 7 | font-size: @baseFontSize * .925; 8 | font-weight: bold; 9 | white-space: nowrap; 10 | color: @white; 11 | background-color: @grayLight; 12 | .border-radius(9px); 13 | } 14 | 15 | // Hover state 16 | .badge:hover { 17 | color: @white; 18 | text-decoration: none; 19 | cursor: pointer; 20 | } 21 | 22 | // Colors 23 | .badge-error { background-color: @errorText; } 24 | .badge-error:hover { background-color: darken(@errorText, 10%); } 25 | 26 | .badge-warning { background-color: @orange; } 27 | .badge-warning:hover { background-color: darken(@orange, 10%); } 28 | 29 | .badge-success { background-color: @successText; } 30 | .badge-success:hover { background-color: darken(@successText, 10%); } 31 | 32 | .badge-info { background-color: @infoText; } 33 | .badge-info:hover { background-color: darken(@infoText, 10%); } 34 | 35 | .badge-inverse { background-color: @grayDark; } 36 | .badge-inverse:hover { background-color: darken(@grayDark, 10%); } -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/bootstrap.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v2.0.2 3 | * 4 | * Copyright 2012 Twitter, Inc 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Designed and built with all the love in the world @twitter by @mdo and @fat. 9 | */ 10 | 11 | // CSS Reset 12 | @import "reset.less"; 13 | 14 | // Core variables and mixins 15 | @import "variables.less"; // Modify this for custom colors, font-sizes, etc 16 | @import "mixins.less"; 17 | 18 | // Grid system and page structure 19 | @import "scaffolding.less"; 20 | @import "grid.less"; 21 | @import "layouts.less"; 22 | 23 | // Base CSS 24 | @import "type.less"; 25 | @import "code.less"; 26 | @import "forms.less"; 27 | @import "tables.less"; 28 | 29 | // Components: common 30 | @import "sprites.less"; 31 | @import "dropdowns.less"; 32 | @import "wells.less"; 33 | @import "component-animations.less"; 34 | @import "close.less"; 35 | 36 | // Components: Buttons & Alerts 37 | @import "buttons.less"; 38 | @import "button-groups.less"; 39 | @import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less 40 | 41 | // Components: Nav 42 | @import "navs.less"; 43 | @import "navbar.less"; 44 | @import "breadcrumbs.less"; 45 | @import "pagination.less"; 46 | @import "pager.less"; 47 | 48 | // Components: Popovers 49 | @import "modals.less"; 50 | @import "tooltip.less"; 51 | @import "popovers.less"; 52 | 53 | // Components: Misc 54 | @import "thumbnails.less"; 55 | @import "labels.less"; 56 | @import "badges.less"; 57 | @import "progress-bars.less"; 58 | @import "accordion.less"; 59 | @import "carousel.less"; 60 | @import "hero-unit.less"; 61 | 62 | // Utility classes 63 | @import "utilities.less"; // Has to be last to override when necessary 64 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/breadcrumbs.less: -------------------------------------------------------------------------------- 1 | // BREADCRUMBS 2 | // ----------- 3 | 4 | .breadcrumb { 5 | padding: 7px 14px; 6 | margin: 0 0 @baseLineHeight; 7 | list-style: none; 8 | #gradient > .vertical(@white, #f5f5f5); 9 | border: 1px solid #ddd; 10 | .border-radius(3px); 11 | .box-shadow(inset 0 1px 0 @white); 12 | li { 13 | display: inline-block; 14 | .ie7-inline-block(); 15 | text-shadow: 0 1px 0 @white; 16 | } 17 | .divider { 18 | padding: 0 5px; 19 | color: @grayLight; 20 | } 21 | .active a { 22 | color: @grayDark; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/button-groups.less: -------------------------------------------------------------------------------- 1 | // BUTTON GROUPS 2 | // ------------- 3 | 4 | 5 | // Make the div behave like a button 6 | .btn-group { 7 | position: relative; 8 | .clearfix(); // clears the floated buttons 9 | .ie7-restore-left-whitespace(); 10 | } 11 | 12 | // Space out series of button groups 13 | .btn-group + .btn-group { 14 | margin-left: 5px; 15 | } 16 | 17 | // Optional: Group multiple button groups together for a toolbar 18 | .btn-toolbar { 19 | margin-top: @baseLineHeight / 2; 20 | margin-bottom: @baseLineHeight / 2; 21 | .btn-group { 22 | display: inline-block; 23 | .ie7-inline-block(); 24 | } 25 | } 26 | 27 | // Float them, remove border radius, then re-add to first and last elements 28 | .btn-group .btn { 29 | position: relative; 30 | float: left; 31 | margin-left: -1px; 32 | .border-radius(0); 33 | } 34 | // Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match 35 | .btn-group .btn:first-child { 36 | margin-left: 0; 37 | -webkit-border-top-left-radius: 4px; 38 | -moz-border-radius-topleft: 4px; 39 | border-top-left-radius: 4px; 40 | -webkit-border-bottom-left-radius: 4px; 41 | -moz-border-radius-bottomleft: 4px; 42 | border-bottom-left-radius: 4px; 43 | } 44 | .btn-group .btn:last-child, 45 | .btn-group .dropdown-toggle { 46 | -webkit-border-top-right-radius: 4px; 47 | -moz-border-radius-topright: 4px; 48 | border-top-right-radius: 4px; 49 | -webkit-border-bottom-right-radius: 4px; 50 | -moz-border-radius-bottomright: 4px; 51 | border-bottom-right-radius: 4px; 52 | } 53 | // Reset corners for large buttons 54 | .btn-group .btn.large:first-child { 55 | margin-left: 0; 56 | -webkit-border-top-left-radius: 6px; 57 | -moz-border-radius-topleft: 6px; 58 | border-top-left-radius: 6px; 59 | -webkit-border-bottom-left-radius: 6px; 60 | -moz-border-radius-bottomleft: 6px; 61 | border-bottom-left-radius: 6px; 62 | } 63 | .btn-group .btn.large:last-child, 64 | .btn-group .large.dropdown-toggle { 65 | -webkit-border-top-right-radius: 6px; 66 | -moz-border-radius-topright: 6px; 67 | border-top-right-radius: 6px; 68 | -webkit-border-bottom-right-radius: 6px; 69 | -moz-border-radius-bottomright: 6px; 70 | border-bottom-right-radius: 6px; 71 | } 72 | 73 | // On hover/focus/active, bring the proper btn to front 74 | .btn-group .btn:hover, 75 | .btn-group .btn:focus, 76 | .btn-group .btn:active, 77 | .btn-group .btn.active { 78 | z-index: 2; 79 | } 80 | 81 | // On active and open, don't show outline 82 | .btn-group .dropdown-toggle:active, 83 | .btn-group.open .dropdown-toggle { 84 | outline: 0; 85 | } 86 | 87 | 88 | 89 | // Split button dropdowns 90 | // ---------------------- 91 | 92 | // Give the line between buttons some depth 93 | .btn-group .dropdown-toggle { 94 | padding-left: 8px; 95 | padding-right: 8px; 96 | @shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); 97 | .box-shadow(@shadow); 98 | *padding-top: 3px; 99 | *padding-bottom: 3px; 100 | } 101 | .btn-group .btn-mini.dropdown-toggle { 102 | padding-left: 5px; 103 | padding-right: 5px; 104 | *padding-top: 1px; 105 | *padding-bottom: 1px; 106 | } 107 | .btn-group .btn-small.dropdown-toggle { 108 | *padding-top: 4px; 109 | *padding-bottom: 4px; 110 | } 111 | .btn-group .btn-large.dropdown-toggle { 112 | padding-left: 12px; 113 | padding-right: 12px; 114 | } 115 | 116 | .btn-group.open { 117 | // IE7's z-index only goes to the nearest positioned ancestor, which would 118 | // make the menu appear below buttons that appeared later on the page 119 | *z-index: @zindexDropdown; 120 | 121 | // Reposition menu on open and round all corners 122 | .dropdown-menu { 123 | display: block; 124 | margin-top: 1px; 125 | .border-radius(5px); 126 | } 127 | 128 | .dropdown-toggle { 129 | background-image: none; 130 | @shadow: inset 0 1px 6px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); 131 | .box-shadow(@shadow); 132 | } 133 | } 134 | 135 | // Reposition the caret 136 | .btn .caret { 137 | margin-top: 7px; 138 | margin-left: 0; 139 | } 140 | .btn:hover .caret, 141 | .open.btn-group .caret { 142 | .opacity(100); 143 | } 144 | // Carets in other button sizes 145 | .btn-mini .caret { 146 | margin-top: 5px; 147 | } 148 | .btn-small .caret { 149 | margin-top: 6px; 150 | } 151 | .btn-large .caret { 152 | margin-top: 6px; 153 | border-left: 5px solid transparent; 154 | border-right: 5px solid transparent; 155 | border-top: 5px solid @black; 156 | } 157 | 158 | 159 | // Account for other colors 160 | .btn-primary, 161 | .btn-warning, 162 | .btn-danger, 163 | .btn-info, 164 | .btn-success, 165 | .btn-inverse { 166 | .caret { 167 | border-top-color: @white; 168 | border-bottom-color: @white; 169 | .opacity(75); 170 | } 171 | } 172 | 173 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/buttons.less: -------------------------------------------------------------------------------- 1 | // BUTTON STYLES 2 | // ------------- 3 | 4 | 5 | // Base styles 6 | // -------------------------------------------------- 7 | 8 | // Core 9 | .btn { 10 | display: inline-block; 11 | .ie7-inline-block(); 12 | padding: 4px 10px 4px; 13 | margin-bottom: 0; // For input.btn 14 | font-size: @baseFontSize; 15 | line-height: @baseLineHeight; 16 | color: @grayDark; 17 | text-align: center; 18 | text-shadow: 0 1px 1px rgba(255,255,255,.75); 19 | vertical-align: middle; 20 | .buttonBackground(@btnBackground, @btnBackgroundHighlight); 21 | border: 1px solid @btnBorder; 22 | border-bottom-color: darken(@btnBorder, 10%); 23 | .border-radius(4px); 24 | @shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); 25 | .box-shadow(@shadow); 26 | cursor: pointer; 27 | 28 | // Give IE7 some love 29 | .ie7-restore-left-whitespace(); 30 | } 31 | 32 | // Hover state 33 | .btn:hover { 34 | color: @grayDark; 35 | text-decoration: none; 36 | background-color: darken(@white, 10%); 37 | background-position: 0 -15px; 38 | 39 | // transition is only when going to hover, otherwise the background 40 | // behind the gradient (there for IE<=9 fallback) gets mismatched 41 | .transition(background-position .1s linear); 42 | } 43 | 44 | // Focus state for keyboard and accessibility 45 | .btn:focus { 46 | .tab-focus(); 47 | } 48 | 49 | // Active state 50 | .btn.active, 51 | .btn:active { 52 | background-image: none; 53 | @shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); 54 | .box-shadow(@shadow); 55 | background-color: darken(@white, 10%); 56 | background-color: darken(@white, 15%) e("\9"); 57 | outline: 0; 58 | } 59 | 60 | // Disabled state 61 | .btn.disabled, 62 | .btn[disabled] { 63 | cursor: default; 64 | background-image: none; 65 | background-color: darken(@white, 10%); 66 | .opacity(65); 67 | .box-shadow(none); 68 | } 69 | 70 | 71 | // Button Sizes 72 | // -------------------------------------------------- 73 | 74 | // Large 75 | .btn-large { 76 | padding: 9px 14px; 77 | font-size: @baseFontSize + 2px; 78 | line-height: normal; 79 | .border-radius(5px); 80 | } 81 | .btn-large [class^="icon-"] { 82 | margin-top: 1px; 83 | } 84 | 85 | // Small 86 | .btn-small { 87 | padding: 5px 9px; 88 | font-size: @baseFontSize - 2px; 89 | line-height: @baseLineHeight - 2px; 90 | } 91 | .btn-small [class^="icon-"] { 92 | margin-top: -1px; 93 | } 94 | 95 | // Mini 96 | .btn-mini { 97 | padding: 2px 6px; 98 | font-size: @baseFontSize - 2px; 99 | line-height: @baseLineHeight - 4px; 100 | } 101 | 102 | 103 | // Alternate buttons 104 | // -------------------------------------------------- 105 | 106 | // Set text color 107 | // ------------------------- 108 | .btn-primary, 109 | .btn-primary:hover, 110 | .btn-warning, 111 | .btn-warning:hover, 112 | .btn-danger, 113 | .btn-danger:hover, 114 | .btn-success, 115 | .btn-success:hover, 116 | .btn-info, 117 | .btn-info:hover, 118 | .btn-inverse, 119 | .btn-inverse:hover { 120 | text-shadow: 0 -1px 0 rgba(0,0,0,.25); 121 | color: @white; 122 | } 123 | // Provide *some* extra contrast for those who can get it 124 | .btn-primary.active, 125 | .btn-warning.active, 126 | .btn-danger.active, 127 | .btn-success.active, 128 | .btn-info.active, 129 | .btn-inverse.active { 130 | color: rgba(255,255,255,.75); 131 | } 132 | 133 | // Set the backgrounds 134 | // ------------------------- 135 | .btn-primary { 136 | .buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight); 137 | } 138 | // Warning appears are orange 139 | .btn-warning { 140 | .buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight); 141 | } 142 | // Danger and error appear as red 143 | .btn-danger { 144 | .buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight); 145 | } 146 | // Success appears as green 147 | .btn-success { 148 | .buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight); 149 | } 150 | // Info appears as a neutral blue 151 | .btn-info { 152 | .buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight); 153 | } 154 | // Inverse appears as dark gray 155 | .btn-inverse { 156 | .buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight); 157 | } 158 | 159 | 160 | // Cross-browser Jank 161 | // -------------------------------------------------- 162 | 163 | button.btn, 164 | input[type="submit"].btn { 165 | 166 | // Firefox 3.6 only I believe 167 | &::-moz-focus-inner { 168 | padding: 0; 169 | border: 0; 170 | } 171 | 172 | // IE7 has some default padding on button controls 173 | *padding-top: 2px; 174 | *padding-bottom: 2px; 175 | &.btn-large { 176 | *padding-top: 7px; 177 | *padding-bottom: 7px; 178 | } 179 | &.btn-small { 180 | *padding-top: 3px; 181 | *padding-bottom: 3px; 182 | } 183 | &.btn-mini { 184 | *padding-top: 1px; 185 | *padding-bottom: 1px; 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/carousel.less: -------------------------------------------------------------------------------- 1 | // CAROUSEL 2 | // -------- 3 | 4 | .carousel { 5 | position: relative; 6 | margin-bottom: @baseLineHeight; 7 | line-height: 1; 8 | } 9 | 10 | .carousel-inner { 11 | overflow: hidden; 12 | width: 100%; 13 | position: relative; 14 | } 15 | 16 | .carousel { 17 | 18 | .item { 19 | display: none; 20 | position: relative; 21 | .transition(.6s ease-in-out left); 22 | } 23 | 24 | // Account for jankitude on images 25 | .item > img { 26 | display: block; 27 | line-height: 1; 28 | } 29 | 30 | .active, 31 | .next, 32 | .prev { display: block; } 33 | 34 | .active { 35 | left: 0; 36 | } 37 | 38 | .next, 39 | .prev { 40 | position: absolute; 41 | top: 0; 42 | width: 100%; 43 | } 44 | 45 | .next { 46 | left: 100%; 47 | } 48 | .prev { 49 | left: -100%; 50 | } 51 | .next.left, 52 | .prev.right { 53 | left: 0; 54 | } 55 | 56 | .active.left { 57 | left: -100%; 58 | } 59 | .active.right { 60 | left: 100%; 61 | } 62 | 63 | } 64 | 65 | // Left/right controls for nav 66 | // --------------------------- 67 | 68 | .carousel-control { 69 | position: absolute; 70 | top: 40%; 71 | left: 15px; 72 | width: 40px; 73 | height: 40px; 74 | margin-top: -20px; 75 | font-size: 60px; 76 | font-weight: 100; 77 | line-height: 30px; 78 | color: @white; 79 | text-align: center; 80 | background: @grayDarker; 81 | border: 3px solid @white; 82 | .border-radius(23px); 83 | .opacity(50); 84 | 85 | // we can't have this transition here 86 | // because webkit cancels the carousel 87 | // animation if you trip this while 88 | // in the middle of another animation 89 | // ;_; 90 | // .transition(opacity .2s linear); 91 | 92 | // Reposition the right one 93 | &.right { 94 | left: auto; 95 | right: 15px; 96 | } 97 | 98 | // Hover state 99 | &:hover { 100 | color: @white; 101 | text-decoration: none; 102 | .opacity(90); 103 | } 104 | } 105 | 106 | // Caption for text below images 107 | // ----------------------------- 108 | 109 | .carousel-caption { 110 | position: absolute; 111 | left: 0; 112 | right: 0; 113 | bottom: 0; 114 | padding: 10px 15px 5px; 115 | background: @grayDark; 116 | background: rgba(0,0,0,.75); 117 | } 118 | .carousel-caption h4, 119 | .carousel-caption p { 120 | color: @white; 121 | } 122 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/close.less: -------------------------------------------------------------------------------- 1 | // CLOSE ICONS 2 | // ----------- 3 | 4 | .close { 5 | float: right; 6 | font-size: 20px; 7 | font-weight: bold; 8 | line-height: @baseLineHeight; 9 | color: @black; 10 | text-shadow: 0 1px 0 rgba(255,255,255,1); 11 | .opacity(20); 12 | &:hover { 13 | color: @black; 14 | text-decoration: none; 15 | .opacity(40); 16 | cursor: pointer; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/code.less: -------------------------------------------------------------------------------- 1 | // Code.less 2 | // Code typography styles for the and
 elements
 3 | // --------------------------------------------------------
 4 | 
 5 | // Inline and block code styles
 6 | code,
 7 | pre {
 8 |   padding: 0 3px 2px;
 9 |   #font > #family > .monospace;
10 |   font-size: @baseFontSize - 1;
11 |   color: @grayDark;
12 |   .border-radius(3px);
13 | }
14 | 
15 | // Inline code
16 | code {
17 |   padding: 2px 4px;
18 |   color: #d14;
19 |   background-color: #f7f7f9;
20 |   border: 1px solid #e1e1e8;
21 | }
22 | 
23 | // Blocks of code
24 | pre {
25 |   display: block;
26 |   padding: (@baseLineHeight - 1) / 2;
27 |   margin: 0 0 @baseLineHeight / 2;
28 |   font-size: @baseFontSize * .925; // 13px to 12px
29 |   line-height: @baseLineHeight;
30 |   background-color: #f5f5f5;
31 |   border: 1px solid #ccc; // fallback for IE7-8
32 |   border: 1px solid rgba(0,0,0,.15);
33 |   .border-radius(4px);
34 |   white-space: pre;
35 |   white-space: pre-wrap;
36 |   word-break: break-all;
37 |   word-wrap: break-word;
38 | 
39 |   // Make prettyprint styles more spaced out for readability
40 |   &.prettyprint {
41 |     margin-bottom: @baseLineHeight;
42 |   }
43 | 
44 |   // Account for some code outputs that place code tags in pre tags
45 |   code {
46 |     padding: 0;
47 |     color: inherit;
48 |     background-color: transparent;
49 |     border: 0;
50 |   }
51 | }
52 | 
53 | // Enable scrollable blocks of code
54 | .pre-scrollable {
55 |   max-height: 340px;
56 |   overflow-y: scroll;
57 | }


--------------------------------------------------------------------------------
/docs/source/_themes/Alchemy/static/less/component-animations.less:
--------------------------------------------------------------------------------
 1 | // COMPONENT ANIMATIONS
 2 | // --------------------
 3 | 
 4 | .fade {
 5 |   .transition(opacity .15s linear);
 6 |   opacity: 0;
 7 |   &.in {
 8 |     opacity: 1;
 9 |   }
10 | }
11 | 
12 | .collapse {
13 |   .transition(height .35s ease);
14 |   position:relative;
15 |   overflow:hidden;
16 |   height: 0;
17 |   &.in {
18 |     height: auto;
19 |   }
20 | }


--------------------------------------------------------------------------------
/docs/source/_themes/Alchemy/static/less/dropdowns.less:
--------------------------------------------------------------------------------
  1 | // DROPDOWN MENUS
  2 | // --------------
  3 | 
  4 | // Use the .menu class on any 
  • element within the topbar or ul.tabs and you'll get some superfancy dropdowns 5 | .dropdown { 6 | position: relative; 7 | } 8 | .dropdown-toggle { 9 | // The caret makes the toggle a bit too tall in IE7 10 | *margin-bottom: -3px; 11 | } 12 | .dropdown-toggle:active, 13 | .open .dropdown-toggle { 14 | outline: 0; 15 | } 16 | 17 | // Dropdown arrow/caret 18 | // -------------------- 19 | .caret { 20 | display: inline-block; 21 | width: 0; 22 | height: 0; 23 | vertical-align: top; 24 | border-left: 4px solid transparent; 25 | border-right: 4px solid transparent; 26 | border-top: 4px solid @black; 27 | .opacity(30); 28 | content: ""; 29 | } 30 | 31 | // Place the caret 32 | .dropdown .caret { 33 | margin-top: 8px; 34 | margin-left: 2px; 35 | } 36 | .dropdown:hover .caret, 37 | .open.dropdown .caret { 38 | .opacity(100); 39 | } 40 | 41 | // The dropdown menu (ul) 42 | // ---------------------- 43 | .dropdown-menu { 44 | position: absolute; 45 | top: 100%; 46 | left: 0; 47 | z-index: @zindexDropdown; 48 | float: left; 49 | display: none; // none by default, but block on "open" of the menu 50 | min-width: 160px; 51 | padding: 4px 0; 52 | margin: 0; // override default ul 53 | list-style: none; 54 | background-color: @dropdownBackground; 55 | border-color: #ccc; 56 | border-color: rgba(0,0,0,.2); 57 | border-style: solid; 58 | border-width: 1px; 59 | .border-radius(0 0 5px 5px); 60 | .box-shadow(0 5px 10px rgba(0,0,0,.2)); 61 | -webkit-background-clip: padding-box; 62 | -moz-background-clip: padding; 63 | background-clip: padding-box; 64 | *border-right-width: 2px; 65 | *border-bottom-width: 2px; 66 | 67 | // Aligns the dropdown menu to right 68 | &.pull-right { 69 | right: 0; 70 | left: auto; 71 | } 72 | 73 | // Dividers (basically an hr) within the dropdown 74 | .divider { 75 | .nav-divider(); 76 | } 77 | 78 | // Links within the dropdown menu 79 | a { 80 | display: block; 81 | padding: 3px 15px; 82 | clear: both; 83 | font-weight: normal; 84 | line-height: @baseLineHeight; 85 | color: @dropdownLinkColor; 86 | white-space: nowrap; 87 | } 88 | } 89 | 90 | // Hover state 91 | // ----------- 92 | .dropdown-menu li > a:hover, 93 | .dropdown-menu .active > a, 94 | .dropdown-menu .active > a:hover { 95 | color: @dropdownLinkColorHover; 96 | text-decoration: none; 97 | background-color: @dropdownLinkBackgroundHover; 98 | } 99 | 100 | // Open state for the dropdown 101 | // --------------------------- 102 | .dropdown.open { 103 | // IE7's z-index only goes to the nearest positioned ancestor, which would 104 | // make the menu appear below buttons that appeared later on the page 105 | *z-index: @zindexDropdown; 106 | 107 | .dropdown-toggle { 108 | color: @white; 109 | background: #ccc; 110 | background: rgba(0,0,0,.3); 111 | } 112 | .dropdown-menu { 113 | display: block; 114 | } 115 | } 116 | 117 | // Right aligned dropdowns 118 | .pull-right .dropdown-menu { 119 | left: auto; 120 | right: 0; 121 | } 122 | 123 | // Allow for dropdowns to go bottom up (aka, dropup-menu) 124 | // ------------------------------------------------------ 125 | // Just add .dropup after the standard .dropdown class and you're set, bro. 126 | // TODO: abstract this so that the navbar fixed styles are not placed here? 127 | .dropup, 128 | .navbar-fixed-bottom .dropdown { 129 | // Reverse the caret 130 | .caret { 131 | border-top: 0; 132 | border-bottom: 4px solid @black; 133 | content: "\2191"; 134 | } 135 | // Different positioning for bottom up menu 136 | .dropdown-menu { 137 | top: auto; 138 | bottom: 100%; 139 | margin-bottom: 1px; 140 | } 141 | } 142 | 143 | // Typeahead 144 | // --------- 145 | .typeahead { 146 | margin-top: 2px; // give it some space to breathe 147 | .border-radius(4px); 148 | } 149 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/grid.less: -------------------------------------------------------------------------------- 1 | // Fixed (940px) 2 | #grid > .core(@gridColumnWidth, @gridGutterWidth); 3 | 4 | // Fluid (940px) 5 | #grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth); -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/hero-unit.less: -------------------------------------------------------------------------------- 1 | // HERO UNIT 2 | // --------- 3 | 4 | .hero-unit { 5 | padding: 60px; 6 | margin-bottom: 30px; 7 | background-color: @heroUnitBackground; 8 | .border-radius(6px); 9 | h1 { 10 | margin-bottom: 0; 11 | font-size: 60px; 12 | line-height: 1; 13 | color: @heroUnitHeadingColor; 14 | letter-spacing: -1px; 15 | } 16 | p { 17 | font-size: 18px; 18 | font-weight: 200; 19 | line-height: @baseLineHeight * 1.5; 20 | color: @heroUnitLeadColor; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/labels.less: -------------------------------------------------------------------------------- 1 | // LABELS 2 | // ------ 3 | 4 | // Base 5 | .label { 6 | padding: 1px 4px 2px; 7 | font-size: @baseFontSize * .846; 8 | font-weight: bold; 9 | line-height: 13px; // ensure proper line-height if floated 10 | color: @white; 11 | vertical-align: middle; 12 | white-space: nowrap; 13 | text-shadow: 0 -1px 0 rgba(0,0,0,.25); 14 | background-color: @grayLight; 15 | .border-radius(3px); 16 | } 17 | 18 | // Hover state 19 | .label:hover { 20 | color: @white; 21 | text-decoration: none; 22 | } 23 | 24 | // Colors 25 | .label-important { background-color: @errorText; } 26 | .label-important:hover { background-color: darken(@errorText, 10%); } 27 | 28 | .label-warning { background-color: @orange; } 29 | .label-warning:hover { background-color: darken(@orange, 10%); } 30 | 31 | .label-success { background-color: @successText; } 32 | .label-success:hover { background-color: darken(@successText, 10%); } 33 | 34 | .label-info { background-color: @infoText; } 35 | .label-info:hover { background-color: darken(@infoText, 10%); } 36 | 37 | .label-inverse { background-color: @grayDark; } 38 | .label-inverse:hover { background-color: darken(@grayDark, 10%); } -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/layouts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Layouts 3 | // Fixed-width and fluid (with sidebar) layouts 4 | // -------------------------------------------- 5 | 6 | 7 | // Container (centered, fixed-width layouts) 8 | .container { 9 | .container-fixed(); 10 | } 11 | 12 | // Fluid layouts (left aligned, with sidebar, min- & max-width content) 13 | .container-fluid { 14 | padding-left: @gridGutterWidth; 15 | padding-right: @gridGutterWidth; 16 | .clearfix(); 17 | } -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/modals.less: -------------------------------------------------------------------------------- 1 | // MODALS 2 | // ------ 3 | 4 | // Recalculate z-index where appropriate 5 | .modal-open { 6 | .dropdown-menu { z-index: @zindexDropdown + @zindexModal; } 7 | .dropdown.open { *z-index: @zindexDropdown + @zindexModal; } 8 | .popover { z-index: @zindexPopover + @zindexModal; } 9 | .tooltip { z-index: @zindexTooltip + @zindexModal; } 10 | } 11 | 12 | // Background 13 | .modal-backdrop { 14 | position: fixed; 15 | top: 0; 16 | right: 0; 17 | bottom: 0; 18 | left: 0; 19 | z-index: @zindexModalBackdrop; 20 | background-color: @black; 21 | // Fade for backdrop 22 | &.fade { opacity: 0; } 23 | } 24 | 25 | .modal-backdrop, 26 | .modal-backdrop.fade.in { 27 | .opacity(80); 28 | } 29 | 30 | // Base modal 31 | .modal { 32 | position: fixed; 33 | top: 50%; 34 | left: 50%; 35 | z-index: @zindexModal; 36 | overflow: auto; 37 | width: 560px; 38 | margin: -250px 0 0 -280px; 39 | background-color: @white; 40 | border: 1px solid #999; 41 | border: 1px solid rgba(0,0,0,.3); 42 | *border: 1px solid #999; /* IE6-7 */ 43 | .border-radius(6px); 44 | .box-shadow(0 3px 7px rgba(0,0,0,0.3)); 45 | .background-clip(padding-box); 46 | &.fade { 47 | .transition(e('opacity .3s linear, top .3s ease-out')); 48 | top: -25%; 49 | } 50 | &.fade.in { top: 50%; } 51 | } 52 | .modal-header { 53 | padding: 9px 15px; 54 | border-bottom: 1px solid #eee; 55 | // Close icon 56 | .close { margin-top: 2px; } 57 | } 58 | 59 | // Body (where all modal content resises) 60 | .modal-body { 61 | overflow-y: auto; 62 | max-height: 400px; 63 | padding: 15px; 64 | } 65 | // Remove bottom margin if need be 66 | .modal-form { 67 | margin-bottom: 0; 68 | } 69 | 70 | // Footer (for actions) 71 | .modal-footer { 72 | padding: 14px 15px 15px; 73 | margin-bottom: 0; 74 | text-align: right; // right align buttons 75 | background-color: #f5f5f5; 76 | border-top: 1px solid #ddd; 77 | .border-radius(0 0 6px 6px); 78 | .box-shadow(inset 0 1px 0 @white); 79 | .clearfix(); // clear it in case folks use .pull-* classes on buttons 80 | 81 | // Properly space out buttons 82 | .btn + .btn { 83 | margin-left: 5px; 84 | margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs 85 | } 86 | // but override that for button groups 87 | .btn-group .btn + .btn { 88 | margin-left: -1px; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/navs.less: -------------------------------------------------------------------------------- 1 | // NAVIGATIONS 2 | // ----------- 3 | 4 | 5 | 6 | // BASE CLASS 7 | // ---------- 8 | 9 | .nav { 10 | margin-left: 0; 11 | margin-bottom: @baseLineHeight; 12 | list-style: none; 13 | } 14 | 15 | // Make links block level 16 | .nav > li > a { 17 | display: block; 18 | } 19 | .nav > li > a:hover { 20 | text-decoration: none; 21 | background-color: @grayLighter; 22 | } 23 | 24 | // Nav headers (for dropdowns and lists) 25 | .nav .nav-header { 26 | display: block; 27 | padding: 3px 15px; 28 | font-size: 11px; 29 | font-weight: bold; 30 | line-height: @baseLineHeight; 31 | color: @grayLight; 32 | text-shadow: 0 1px 0 rgba(255,255,255,.5); 33 | text-transform: uppercase; 34 | } 35 | // Space them out when they follow another list item (link) 36 | .nav li + .nav-header { 37 | margin-top: 9px; 38 | } 39 | 40 | 41 | // NAV LIST 42 | // -------- 43 | 44 | .nav-list { 45 | padding-left: 15px; 46 | padding-right: 15px; 47 | margin-bottom: 0; 48 | } 49 | .nav-list > li > a, 50 | .nav-list .nav-header { 51 | margin-left: -15px; 52 | margin-right: -15px; 53 | text-shadow: 0 1px 0 rgba(255,255,255,.5); 54 | } 55 | .nav-list > li > a { 56 | padding: 3px 15px; 57 | } 58 | .nav-list > .active > a, 59 | .nav-list > .active > a:hover { 60 | color: @white; 61 | text-shadow: 0 -1px 0 rgba(0,0,0,.2); 62 | background-color: @linkColor; 63 | } 64 | .nav-list [class^="icon-"] { 65 | margin-right: 2px; 66 | } 67 | // Dividers (basically an hr) within the dropdown 68 | .nav-list .divider { 69 | .nav-divider(); 70 | } 71 | 72 | 73 | 74 | // TABS AND PILLS 75 | // ------------- 76 | 77 | // Common styles 78 | .nav-tabs, 79 | .nav-pills { 80 | .clearfix(); 81 | } 82 | .nav-tabs > li, 83 | .nav-pills > li { 84 | float: left; 85 | } 86 | .nav-tabs > li > a, 87 | .nav-pills > li > a { 88 | padding-right: 12px; 89 | padding-left: 12px; 90 | margin-right: 2px; 91 | line-height: 14px; // keeps the overall height an even number 92 | } 93 | 94 | // TABS 95 | // ---- 96 | 97 | // Give the tabs something to sit on 98 | .nav-tabs { 99 | border-bottom: 1px solid #ddd; 100 | } 101 | 102 | // Make the list-items overlay the bottom border 103 | .nav-tabs > li { 104 | margin-bottom: -1px; 105 | } 106 | 107 | // Actual tabs (as links) 108 | .nav-tabs > li > a { 109 | padding-top: 8px; 110 | padding-bottom: 8px; 111 | line-height: @baseLineHeight; 112 | border: 1px solid transparent; 113 | .border-radius(4px 4px 0 0); 114 | &:hover { 115 | border-color: @grayLighter @grayLighter #ddd; 116 | } 117 | } 118 | // Active state, and it's :hover to override normal :hover 119 | .nav-tabs > .active > a, 120 | .nav-tabs > .active > a:hover { 121 | color: @gray; 122 | background-color: @white; 123 | border: 1px solid #ddd; 124 | border-bottom-color: transparent; 125 | cursor: default; 126 | } 127 | 128 | // PILLS 129 | // ----- 130 | 131 | // Links rendered as pills 132 | .nav-pills > li > a { 133 | padding-top: 8px; 134 | padding-bottom: 8px; 135 | margin-top: 2px; 136 | margin-bottom: 2px; 137 | .border-radius(5px); 138 | } 139 | 140 | // Active state 141 | .nav-pills > .active > a, 142 | .nav-pills > .active > a:hover { 143 | color: @white; 144 | background-color: @linkColor; 145 | } 146 | 147 | 148 | 149 | // STACKED NAV 150 | // ----------- 151 | 152 | // Stacked tabs and pills 153 | .nav-stacked > li { 154 | float: none; 155 | } 156 | .nav-stacked > li > a { 157 | margin-right: 0; // no need for the gap between nav items 158 | } 159 | 160 | // Tabs 161 | .nav-tabs.nav-stacked { 162 | border-bottom: 0; 163 | } 164 | .nav-tabs.nav-stacked > li > a { 165 | border: 1px solid #ddd; 166 | .border-radius(0); 167 | } 168 | .nav-tabs.nav-stacked > li:first-child > a { 169 | .border-radius(4px 4px 0 0); 170 | } 171 | .nav-tabs.nav-stacked > li:last-child > a { 172 | .border-radius(0 0 4px 4px); 173 | } 174 | .nav-tabs.nav-stacked > li > a:hover { 175 | border-color: #ddd; 176 | z-index: 2; 177 | } 178 | 179 | // Pills 180 | .nav-pills.nav-stacked > li > a { 181 | margin-bottom: 3px; 182 | } 183 | .nav-pills.nav-stacked > li:last-child > a { 184 | margin-bottom: 1px; // decrease margin to match sizing of stacked tabs 185 | } 186 | 187 | 188 | 189 | // DROPDOWNS 190 | // --------- 191 | 192 | // Position the menu 193 | .nav-tabs .dropdown-menu, 194 | .nav-pills .dropdown-menu { 195 | margin-top: 1px; 196 | border-width: 1px; 197 | } 198 | .nav-pills .dropdown-menu { 199 | .border-radius(4px); 200 | } 201 | 202 | // Default dropdown links 203 | // ------------------------- 204 | // Make carets use linkColor to start 205 | .nav-tabs .dropdown-toggle .caret, 206 | .nav-pills .dropdown-toggle .caret { 207 | border-top-color: @linkColor; 208 | border-bottom-color: @linkColor; 209 | margin-top: 6px; 210 | } 211 | .nav-tabs .dropdown-toggle:hover .caret, 212 | .nav-pills .dropdown-toggle:hover .caret { 213 | border-top-color: @linkColorHover; 214 | border-bottom-color: @linkColorHover; 215 | } 216 | 217 | // Active dropdown links 218 | // ------------------------- 219 | .nav-tabs .active .dropdown-toggle .caret, 220 | .nav-pills .active .dropdown-toggle .caret { 221 | border-top-color: @grayDark; 222 | border-bottom-color: @grayDark; 223 | } 224 | 225 | // Active:hover dropdown links 226 | // ------------------------- 227 | .nav > .dropdown.active > a:hover { 228 | color: @black; 229 | cursor: pointer; 230 | } 231 | 232 | // Open dropdowns 233 | // ------------------------- 234 | .nav-tabs .open .dropdown-toggle, 235 | .nav-pills .open .dropdown-toggle, 236 | .nav > .open.active > a:hover { 237 | color: @white; 238 | background-color: @grayLight; 239 | border-color: @grayLight; 240 | } 241 | .nav .open .caret, 242 | .nav .open.active .caret, 243 | .nav .open a:hover .caret { 244 | border-top-color: @white; 245 | border-bottom-color: @white; 246 | .opacity(100); 247 | } 248 | 249 | // Dropdowns in stacked tabs 250 | .tabs-stacked .open > a:hover { 251 | border-color: @grayLight; 252 | } 253 | 254 | 255 | 256 | // TABBABLE 257 | // -------- 258 | 259 | 260 | // COMMON STYLES 261 | // ------------- 262 | 263 | // Clear any floats 264 | .tabbable { 265 | .clearfix(); 266 | } 267 | .tab-content { 268 | display: table; // prevent content from running below tabs 269 | width: 100%; 270 | } 271 | 272 | // Remove border on bottom, left, right 273 | .tabs-below .nav-tabs, 274 | .tabs-right .nav-tabs, 275 | .tabs-left .nav-tabs { 276 | border-bottom: 0; 277 | } 278 | 279 | // Show/hide tabbable areas 280 | .tab-content > .tab-pane, 281 | .pill-content > .pill-pane { 282 | display: none; 283 | } 284 | .tab-content > .active, 285 | .pill-content > .active { 286 | display: block; 287 | } 288 | 289 | 290 | // BOTTOM 291 | // ------ 292 | 293 | .tabs-below .nav-tabs { 294 | border-top: 1px solid #ddd; 295 | } 296 | .tabs-below .nav-tabs > li { 297 | margin-top: -1px; 298 | margin-bottom: 0; 299 | } 300 | .tabs-below .nav-tabs > li > a { 301 | .border-radius(0 0 4px 4px); 302 | &:hover { 303 | border-bottom-color: transparent; 304 | border-top-color: #ddd; 305 | } 306 | } 307 | .tabs-below .nav-tabs .active > a, 308 | .tabs-below .nav-tabs .active > a:hover { 309 | border-color: transparent #ddd #ddd #ddd; 310 | } 311 | 312 | // LEFT & RIGHT 313 | // ------------ 314 | 315 | // Common styles 316 | .tabs-left .nav-tabs > li, 317 | .tabs-right .nav-tabs > li { 318 | float: none; 319 | } 320 | .tabs-left .nav-tabs > li > a, 321 | .tabs-right .nav-tabs > li > a { 322 | min-width: 74px; 323 | margin-right: 0; 324 | margin-bottom: 3px; 325 | } 326 | 327 | // Tabs on the left 328 | .tabs-left .nav-tabs { 329 | float: left; 330 | margin-right: 19px; 331 | border-right: 1px solid #ddd; 332 | } 333 | .tabs-left .nav-tabs > li > a { 334 | margin-right: -1px; 335 | .border-radius(4px 0 0 4px); 336 | } 337 | .tabs-left .nav-tabs > li > a:hover { 338 | border-color: @grayLighter #ddd @grayLighter @grayLighter; 339 | } 340 | .tabs-left .nav-tabs .active > a, 341 | .tabs-left .nav-tabs .active > a:hover { 342 | border-color: #ddd transparent #ddd #ddd; 343 | *border-right-color: @white; 344 | } 345 | 346 | // Tabs on the right 347 | .tabs-right .nav-tabs { 348 | float: right; 349 | margin-left: 19px; 350 | border-left: 1px solid #ddd; 351 | } 352 | .tabs-right .nav-tabs > li > a { 353 | margin-left: -1px; 354 | .border-radius(0 4px 4px 0); 355 | } 356 | .tabs-right .nav-tabs > li > a:hover { 357 | border-color: @grayLighter @grayLighter @grayLighter #ddd; 358 | } 359 | .tabs-right .nav-tabs .active > a, 360 | .tabs-right .nav-tabs .active > a:hover { 361 | border-color: #ddd #ddd #ddd transparent; 362 | *border-left-color: @white; 363 | } 364 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/pager.less: -------------------------------------------------------------------------------- 1 | // PAGER 2 | // ----- 3 | 4 | .pager { 5 | margin-left: 0; 6 | margin-bottom: @baseLineHeight; 7 | list-style: none; 8 | text-align: center; 9 | .clearfix(); 10 | } 11 | .pager li { 12 | display: inline; 13 | } 14 | .pager a { 15 | display: inline-block; 16 | padding: 5px 14px; 17 | background-color: #fff; 18 | border: 1px solid #ddd; 19 | .border-radius(15px); 20 | } 21 | .pager a:hover { 22 | text-decoration: none; 23 | background-color: #f5f5f5; 24 | } 25 | .pager .next a { 26 | float: right; 27 | } 28 | .pager .previous a { 29 | float: left; 30 | } 31 | .pager .disabled a, 32 | .pager .disabled a:hover { 33 | color: @grayLight; 34 | background-color: #fff; 35 | cursor: default; 36 | } -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/pagination.less: -------------------------------------------------------------------------------- 1 | // PAGINATION 2 | // ---------- 3 | 4 | .pagination { 5 | height: @baseLineHeight * 2; 6 | margin: @baseLineHeight 0; 7 | } 8 | .pagination ul { 9 | display: inline-block; 10 | .ie7-inline-block(); 11 | margin-left: 0; 12 | margin-bottom: 0; 13 | .border-radius(3px); 14 | .box-shadow(0 1px 2px rgba(0,0,0,.05)); 15 | } 16 | .pagination li { 17 | display: inline; 18 | } 19 | .pagination a { 20 | float: left; 21 | padding: 0 14px; 22 | line-height: (@baseLineHeight * 2) - 2; 23 | text-decoration: none; 24 | border: 1px solid #ddd; 25 | border-left-width: 0; 26 | } 27 | .pagination a:hover, 28 | .pagination .active a { 29 | background-color: #f5f5f5; 30 | } 31 | .pagination .active a { 32 | color: @grayLight; 33 | cursor: default; 34 | } 35 | .pagination .disabled span, 36 | .pagination .disabled a, 37 | .pagination .disabled a:hover { 38 | color: @grayLight; 39 | background-color: transparent; 40 | cursor: default; 41 | } 42 | .pagination li:first-child a { 43 | border-left-width: 1px; 44 | .border-radius(3px 0 0 3px); 45 | } 46 | .pagination li:last-child a { 47 | .border-radius(0 3px 3px 0); 48 | } 49 | 50 | // Centered 51 | .pagination-centered { 52 | text-align: center; 53 | } 54 | .pagination-right { 55 | text-align: right; 56 | } 57 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/popovers.less: -------------------------------------------------------------------------------- 1 | // POPOVERS 2 | // -------- 3 | 4 | .popover { 5 | position: absolute; 6 | top: 0; 7 | left: 0; 8 | z-index: @zindexPopover; 9 | display: none; 10 | padding: 5px; 11 | &.top { margin-top: -5px; } 12 | &.right { margin-left: 5px; } 13 | &.bottom { margin-top: 5px; } 14 | &.left { margin-left: -5px; } 15 | &.top .arrow { #popoverArrow > .top(); } 16 | &.right .arrow { #popoverArrow > .right(); } 17 | &.bottom .arrow { #popoverArrow > .bottom(); } 18 | &.left .arrow { #popoverArrow > .left(); } 19 | .arrow { 20 | position: absolute; 21 | width: 0; 22 | height: 0; 23 | } 24 | } 25 | .popover-inner { 26 | padding: 3px; 27 | width: 280px; 28 | overflow: hidden; 29 | background: @black; // has to be full background declaration for IE fallback 30 | background: rgba(0,0,0,.8); 31 | .border-radius(6px); 32 | .box-shadow(0 3px 7px rgba(0,0,0,0.3)); 33 | } 34 | .popover-title { 35 | padding: 9px 15px; 36 | line-height: 1; 37 | background-color: #f5f5f5; 38 | border-bottom:1px solid #eee; 39 | .border-radius(3px 3px 0 0); 40 | } 41 | .popover-content { 42 | padding: 14px; 43 | background-color: @white; 44 | .border-radius(0 0 3px 3px); 45 | .background-clip(padding-box); 46 | p, ul, ol { 47 | margin-bottom: 0; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/progress-bars.less: -------------------------------------------------------------------------------- 1 | // PROGRESS BARS 2 | // ------------- 3 | 4 | 5 | // ANIMATIONS 6 | // ---------- 7 | 8 | // Webkit 9 | @-webkit-keyframes progress-bar-stripes { 10 | from { background-position: 0 0; } 11 | to { background-position: 40px 0; } 12 | } 13 | 14 | // Firefox 15 | @-moz-keyframes progress-bar-stripes { 16 | from { background-position: 0 0; } 17 | to { background-position: 40px 0; } 18 | } 19 | 20 | // IE9 21 | @-ms-keyframes progress-bar-stripes { 22 | from { background-position: 0 0; } 23 | to { background-position: 40px 0; } 24 | } 25 | 26 | // Spec 27 | @keyframes progress-bar-stripes { 28 | from { background-position: 0 0; } 29 | to { background-position: 40px 0; } 30 | } 31 | 32 | 33 | 34 | // THE BARS 35 | // -------- 36 | 37 | // Outer container 38 | .progress { 39 | overflow: hidden; 40 | height: 18px; 41 | margin-bottom: 18px; 42 | #gradient > .vertical(#f5f5f5, #f9f9f9); 43 | .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); 44 | .border-radius(4px); 45 | } 46 | 47 | // Bar of progress 48 | .progress .bar { 49 | width: 0%; 50 | height: 18px; 51 | color: @white; 52 | font-size: 12px; 53 | text-align: center; 54 | text-shadow: 0 -1px 0 rgba(0,0,0,.25); 55 | #gradient > .vertical(#149bdf, #0480be); 56 | .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); 57 | .box-sizing(border-box); 58 | .transition(width .6s ease); 59 | } 60 | 61 | // Striped bars 62 | .progress-striped .bar { 63 | #gradient > .striped(#149bdf); 64 | .background-size(40px 40px); 65 | } 66 | 67 | // Call animation for the active one 68 | .progress.active .bar { 69 | -webkit-animation: progress-bar-stripes 2s linear infinite; 70 | -moz-animation: progress-bar-stripes 2s linear infinite; 71 | animation: progress-bar-stripes 2s linear infinite; 72 | } 73 | 74 | 75 | 76 | // COLORS 77 | // ------ 78 | 79 | // Danger (red) 80 | .progress-danger .bar { 81 | #gradient > .vertical(#ee5f5b, #c43c35); 82 | } 83 | .progress-danger.progress-striped .bar { 84 | #gradient > .striped(#ee5f5b); 85 | } 86 | 87 | // Success (green) 88 | .progress-success .bar { 89 | #gradient > .vertical(#62c462, #57a957); 90 | } 91 | .progress-success.progress-striped .bar { 92 | #gradient > .striped(#62c462); 93 | } 94 | 95 | // Info (teal) 96 | .progress-info .bar { 97 | #gradient > .vertical(#5bc0de, #339bb9); 98 | } 99 | .progress-info.progress-striped .bar { 100 | #gradient > .striped(#5bc0de); 101 | } 102 | 103 | // Warning (orange) 104 | .progress-warning .bar { 105 | #gradient > .vertical(lighten(@orange, 15%), @orange); 106 | } 107 | .progress-warning.progress-striped .bar { 108 | #gradient > .striped(lighten(@orange, 15%)); 109 | } 110 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/reset.less: -------------------------------------------------------------------------------- 1 | // Reset.less 2 | // Adapted from Normalize.css http://github.com/necolas/normalize.css 3 | // ------------------------------------------------------------------------ 4 | 5 | // Display in IE6-9 and FF3 6 | // ------------------------- 7 | 8 | article, 9 | aside, 10 | details, 11 | figcaption, 12 | figure, 13 | footer, 14 | header, 15 | hgroup, 16 | nav, 17 | section { 18 | display: block; 19 | } 20 | 21 | // Display block in IE6-9 and FF3 22 | // ------------------------- 23 | 24 | audio, 25 | canvas, 26 | video { 27 | display: inline-block; 28 | *display: inline; 29 | *zoom: 1; 30 | } 31 | 32 | // Prevents modern browsers from displaying 'audio' without controls 33 | // ------------------------- 34 | 35 | audio:not([controls]) { 36 | display: none; 37 | } 38 | 39 | // Base settings 40 | // ------------------------- 41 | 42 | html { 43 | font-size: 100%; 44 | -webkit-text-size-adjust: 100%; 45 | -ms-text-size-adjust: 100%; 46 | } 47 | // Focus states 48 | a:focus { 49 | .tab-focus(); 50 | } 51 | // Hover & Active 52 | a:hover, 53 | a:active { 54 | outline: 0; 55 | } 56 | 57 | // Prevents sub and sup affecting line-height in all browsers 58 | // ------------------------- 59 | 60 | sub, 61 | sup { 62 | position: relative; 63 | font-size: 75%; 64 | line-height: 0; 65 | vertical-align: baseline; 66 | } 67 | sup { 68 | top: -0.5em; 69 | } 70 | sub { 71 | bottom: -0.25em; 72 | } 73 | 74 | // Img border in a's and image quality 75 | // ------------------------- 76 | 77 | img { 78 | height: auto; 79 | border: 0; 80 | -ms-interpolation-mode: bicubic; 81 | vertical-align: middle; 82 | } 83 | 84 | // Forms 85 | // ------------------------- 86 | 87 | // Font size in all browsers, margin changes, misc consistency 88 | button, 89 | input, 90 | select, 91 | textarea { 92 | margin: 0; 93 | font-size: 100%; 94 | vertical-align: middle; 95 | } 96 | button, 97 | input { 98 | *overflow: visible; // Inner spacing ie IE6/7 99 | line-height: normal; // FF3/4 have !important on line-height in UA stylesheet 100 | } 101 | button::-moz-focus-inner, 102 | input::-moz-focus-inner { // Inner padding and border oddities in FF3/4 103 | padding: 0; 104 | border: 0; 105 | } 106 | button, 107 | input[type="button"], 108 | input[type="reset"], 109 | input[type="submit"] { 110 | cursor: pointer; // Cursors on all buttons applied consistently 111 | -webkit-appearance: button; // Style clickable inputs in iOS 112 | } 113 | input[type="search"] { // Appearance in Safari/Chrome 114 | -webkit-appearance: textfield; 115 | -webkit-box-sizing: content-box; 116 | -moz-box-sizing: content-box; 117 | box-sizing: content-box; 118 | } 119 | input[type="search"]::-webkit-search-decoration, 120 | input[type="search"]::-webkit-search-cancel-button { 121 | -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5 122 | } 123 | textarea { 124 | overflow: auto; // Remove vertical scrollbar in IE6-9 125 | vertical-align: top; // Readability and alignment cross-browser 126 | } 127 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/scaffolding.less: -------------------------------------------------------------------------------- 1 | // Scaffolding 2 | // Basic and global styles for generating a grid system, structural layout, and page templates 3 | // ------------------------------------------------------------------------------------------- 4 | 5 | 6 | // Body reset 7 | // ---------- 8 | 9 | body { 10 | margin: 0; 11 | font-family: @baseFontFamily; 12 | font-size: @baseFontSize; 13 | line-height: @baseLineHeight; 14 | color: @textColor; 15 | background-color: @bodyBackground; 16 | } 17 | 18 | 19 | // Links 20 | // ----- 21 | 22 | a { 23 | color: @linkColor; 24 | text-decoration: none; 25 | } 26 | a:hover { 27 | color: @linkColorHover; 28 | text-decoration: underline; 29 | } 30 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/sprites.less: -------------------------------------------------------------------------------- 1 | // SPRITES 2 | // Glyphs and icons for buttons, nav, and more 3 | // ------------------------------------------- 4 | 5 | 6 | // ICONS 7 | // ----- 8 | 9 | // All icons receive the styles of the tag with a base class 10 | // of .i and are then given a unique class to add width, height, 11 | // and background-position. Your resulting HTML will look like 12 | // . 13 | 14 | // For the white version of the icons, just add the .icon-white class: 15 | // 16 | 17 | [class^="icon-"], 18 | [class*=" icon-"] { 19 | display: inline-block; 20 | width: 14px; 21 | height: 14px; 22 | line-height: 14px; 23 | vertical-align: text-top; 24 | background-image: url("@{iconSpritePath}"); 25 | background-position: 14px 14px; 26 | background-repeat: no-repeat; 27 | 28 | .ie7-restore-right-whitespace(); 29 | } 30 | .icon-white { 31 | background-image: url("@{iconWhiteSpritePath}"); 32 | } 33 | 34 | .icon-glass { background-position: 0 0; } 35 | .icon-music { background-position: -24px 0; } 36 | .icon-search { background-position: -48px 0; } 37 | .icon-envelope { background-position: -72px 0; } 38 | .icon-heart { background-position: -96px 0; } 39 | .icon-star { background-position: -120px 0; } 40 | .icon-star-empty { background-position: -144px 0; } 41 | .icon-user { background-position: -168px 0; } 42 | .icon-film { background-position: -192px 0; } 43 | .icon-th-large { background-position: -216px 0; } 44 | .icon-th { background-position: -240px 0; } 45 | .icon-th-list { background-position: -264px 0; } 46 | .icon-ok { background-position: -288px 0; } 47 | .icon-remove { background-position: -312px 0; } 48 | .icon-zoom-in { background-position: -336px 0; } 49 | .icon-zoom-out { background-position: -360px 0; } 50 | .icon-off { background-position: -384px 0; } 51 | .icon-signal { background-position: -408px 0; } 52 | .icon-cog { background-position: -432px 0; } 53 | .icon-trash { background-position: -456px 0; } 54 | 55 | .icon-home { background-position: 0 -24px; } 56 | .icon-file { background-position: -24px -24px; } 57 | .icon-time { background-position: -48px -24px; } 58 | .icon-road { background-position: -72px -24px; } 59 | .icon-download-alt { background-position: -96px -24px; } 60 | .icon-download { background-position: -120px -24px; } 61 | .icon-upload { background-position: -144px -24px; } 62 | .icon-inbox { background-position: -168px -24px; } 63 | .icon-play-circle { background-position: -192px -24px; } 64 | .icon-repeat { background-position: -216px -24px; } 65 | .icon-refresh { background-position: -240px -24px; } 66 | .icon-list-alt { background-position: -264px -24px; } 67 | .icon-lock { background-position: -287px -24px; } // 1px off 68 | .icon-flag { background-position: -312px -24px; } 69 | .icon-headphones { background-position: -336px -24px; } 70 | .icon-volume-off { background-position: -360px -24px; } 71 | .icon-volume-down { background-position: -384px -24px; } 72 | .icon-volume-up { background-position: -408px -24px; } 73 | .icon-qrcode { background-position: -432px -24px; } 74 | .icon-barcode { background-position: -456px -24px; } 75 | 76 | .icon-tag { background-position: 0 -48px; } 77 | .icon-tags { background-position: -25px -48px; } // 1px off 78 | .icon-book { background-position: -48px -48px; } 79 | .icon-bookmark { background-position: -72px -48px; } 80 | .icon-print { background-position: -96px -48px; } 81 | .icon-camera { background-position: -120px -48px; } 82 | .icon-font { background-position: -144px -48px; } 83 | .icon-bold { background-position: -167px -48px; } // 1px off 84 | .icon-italic { background-position: -192px -48px; } 85 | .icon-text-height { background-position: -216px -48px; } 86 | .icon-text-width { background-position: -240px -48px; } 87 | .icon-align-left { background-position: -264px -48px; } 88 | .icon-align-center { background-position: -288px -48px; } 89 | .icon-align-right { background-position: -312px -48px; } 90 | .icon-align-justify { background-position: -336px -48px; } 91 | .icon-list { background-position: -360px -48px; } 92 | .icon-indent-left { background-position: -384px -48px; } 93 | .icon-indent-right { background-position: -408px -48px; } 94 | .icon-facetime-video { background-position: -432px -48px; } 95 | .icon-picture { background-position: -456px -48px; } 96 | 97 | .icon-pencil { background-position: 0 -72px; } 98 | .icon-map-marker { background-position: -24px -72px; } 99 | .icon-adjust { background-position: -48px -72px; } 100 | .icon-tint { background-position: -72px -72px; } 101 | .icon-edit { background-position: -96px -72px; } 102 | .icon-share { background-position: -120px -72px; } 103 | .icon-check { background-position: -144px -72px; } 104 | .icon-move { background-position: -168px -72px; } 105 | .icon-step-backward { background-position: -192px -72px; } 106 | .icon-fast-backward { background-position: -216px -72px; } 107 | .icon-backward { background-position: -240px -72px; } 108 | .icon-play { background-position: -264px -72px; } 109 | .icon-pause { background-position: -288px -72px; } 110 | .icon-stop { background-position: -312px -72px; } 111 | .icon-forward { background-position: -336px -72px; } 112 | .icon-fast-forward { background-position: -360px -72px; } 113 | .icon-step-forward { background-position: -384px -72px; } 114 | .icon-eject { background-position: -408px -72px; } 115 | .icon-chevron-left { background-position: -432px -72px; } 116 | .icon-chevron-right { background-position: -456px -72px; } 117 | 118 | .icon-plus-sign { background-position: 0 -96px; } 119 | .icon-minus-sign { background-position: -24px -96px; } 120 | .icon-remove-sign { background-position: -48px -96px; } 121 | .icon-ok-sign { background-position: -72px -96px; } 122 | .icon-question-sign { background-position: -96px -96px; } 123 | .icon-info-sign { background-position: -120px -96px; } 124 | .icon-screenshot { background-position: -144px -96px; } 125 | .icon-remove-circle { background-position: -168px -96px; } 126 | .icon-ok-circle { background-position: -192px -96px; } 127 | .icon-ban-circle { background-position: -216px -96px; } 128 | .icon-arrow-left { background-position: -240px -96px; } 129 | .icon-arrow-right { background-position: -264px -96px; } 130 | .icon-arrow-up { background-position: -289px -96px; } // 1px off 131 | .icon-arrow-down { background-position: -312px -96px; } 132 | .icon-share-alt { background-position: -336px -96px; } 133 | .icon-resize-full { background-position: -360px -96px; } 134 | .icon-resize-small { background-position: -384px -96px; } 135 | .icon-plus { background-position: -408px -96px; } 136 | .icon-minus { background-position: -433px -96px; } 137 | .icon-asterisk { background-position: -456px -96px; } 138 | 139 | .icon-exclamation-sign { background-position: 0 -120px; } 140 | .icon-gift { background-position: -24px -120px; } 141 | .icon-leaf { background-position: -48px -120px; } 142 | .icon-fire { background-position: -72px -120px; } 143 | .icon-eye-open { background-position: -96px -120px; } 144 | .icon-eye-close { background-position: -120px -120px; } 145 | .icon-warning-sign { background-position: -144px -120px; } 146 | .icon-plane { background-position: -168px -120px; } 147 | .icon-calendar { background-position: -192px -120px; } 148 | .icon-random { background-position: -216px -120px; } 149 | .icon-comment { background-position: -240px -120px; } 150 | .icon-magnet { background-position: -264px -120px; } 151 | .icon-chevron-up { background-position: -288px -120px; } 152 | .icon-chevron-down { background-position: -313px -119px; } // 1px off 153 | .icon-retweet { background-position: -336px -120px; } 154 | .icon-shopping-cart { background-position: -360px -120px; } 155 | .icon-folder-close { background-position: -384px -120px; } 156 | .icon-folder-open { background-position: -408px -120px; } 157 | .icon-resize-vertical { background-position: -432px -119px; } 158 | .icon-resize-horizontal { background-position: -456px -118px; } 159 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/tables.less: -------------------------------------------------------------------------------- 1 | // 2 | // Tables.less 3 | // Tables for, you guessed it, tabular data 4 | // ---------------------------------------- 5 | 6 | 7 | // BASE TABLES 8 | // ----------------- 9 | 10 | table { 11 | max-width: 100%; 12 | border-collapse: collapse; 13 | border-spacing: 0; 14 | background-color: @tableBackground; 15 | } 16 | 17 | // BASELINE STYLES 18 | // --------------- 19 | 20 | .table { 21 | width: 100%; 22 | margin-bottom: @baseLineHeight; 23 | // Cells 24 | th, 25 | td { 26 | padding: 8px; 27 | line-height: @baseLineHeight; 28 | text-align: left; 29 | vertical-align: top; 30 | border-top: 1px solid @tableBorder; 31 | } 32 | th { 33 | font-weight: bold; 34 | } 35 | // Bottom align for column headings 36 | thead th { 37 | vertical-align: bottom; 38 | } 39 | // Remove top border from thead by default 40 | colgroup + thead tr:first-child th, 41 | colgroup + thead tr:first-child td, 42 | thead:first-child tr:first-child th, 43 | thead:first-child tr:first-child td { 44 | border-top: 0; 45 | } 46 | // Account for multiple tbody instances 47 | tbody + tbody { 48 | border-top: 2px solid @tableBorder; 49 | } 50 | } 51 | 52 | 53 | 54 | // CONDENSED TABLE W/ HALF PADDING 55 | // ------------------------------- 56 | 57 | .table-condensed { 58 | th, 59 | td { 60 | padding: 4px 5px; 61 | } 62 | } 63 | 64 | 65 | // BORDERED VERSION 66 | // ---------------- 67 | 68 | .table-bordered { 69 | border: 1px solid @tableBorder; 70 | border-left: 0; 71 | border-collapse: separate; // Done so we can round those corners! 72 | *border-collapse: collapsed; // IE7 can't round corners anyway 73 | .border-radius(4px); 74 | th, 75 | td { 76 | border-left: 1px solid @tableBorder; 77 | } 78 | // Prevent a double border 79 | thead:first-child tr:first-child th, 80 | tbody:first-child tr:first-child th, 81 | tbody:first-child tr:first-child td { 82 | border-top: 0; 83 | } 84 | // For first th or td in the first row in the first thead or tbody 85 | thead:first-child tr:first-child th:first-child, 86 | tbody:first-child tr:first-child td:first-child { 87 | .border-radius(4px 0 0 0); 88 | } 89 | thead:first-child tr:first-child th:last-child, 90 | tbody:first-child tr:first-child td:last-child { 91 | .border-radius(0 4px 0 0); 92 | } 93 | // For first th or td in the first row in the first thead or tbody 94 | thead:last-child tr:last-child th:first-child, 95 | tbody:last-child tr:last-child td:first-child { 96 | .border-radius(0 0 0 4px); 97 | } 98 | thead:last-child tr:last-child th:last-child, 99 | tbody:last-child tr:last-child td:last-child { 100 | .border-radius(0 0 4px 0); 101 | } 102 | } 103 | 104 | 105 | // ZEBRA-STRIPING 106 | // -------------- 107 | 108 | // Default zebra-stripe styles (alternating gray and transparent backgrounds) 109 | .table-striped { 110 | tbody { 111 | tr:nth-child(odd) td, 112 | tr:nth-child(odd) th { 113 | background-color: @tableBackgroundAccent; 114 | } 115 | } 116 | } 117 | 118 | 119 | // HOVER EFFECT 120 | // ------------ 121 | // Placed here since it has to come after the potential zebra striping 122 | .table { 123 | tbody tr:hover td, 124 | tbody tr:hover th { 125 | background-color: @tableBackgroundHover; 126 | } 127 | } 128 | 129 | 130 | // TABLE CELL SIZING 131 | // ----------------- 132 | 133 | // Change the columns 134 | table { 135 | .span1 { .tableColumns(1); } 136 | .span2 { .tableColumns(2); } 137 | .span3 { .tableColumns(3); } 138 | .span4 { .tableColumns(4); } 139 | .span5 { .tableColumns(5); } 140 | .span6 { .tableColumns(6); } 141 | .span7 { .tableColumns(7); } 142 | .span8 { .tableColumns(8); } 143 | .span9 { .tableColumns(9); } 144 | .span10 { .tableColumns(10); } 145 | .span11 { .tableColumns(11); } 146 | .span12 { .tableColumns(12); } 147 | .span13 { .tableColumns(13); } 148 | .span14 { .tableColumns(14); } 149 | .span15 { .tableColumns(15); } 150 | .span16 { .tableColumns(16); } 151 | .span17 { .tableColumns(17); } 152 | .span18 { .tableColumns(18); } 153 | .span19 { .tableColumns(19); } 154 | .span20 { .tableColumns(20); } 155 | .span21 { .tableColumns(21); } 156 | .span22 { .tableColumns(22); } 157 | .span23 { .tableColumns(23); } 158 | .span24 { .tableColumns(24); } 159 | } 160 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/thumbnails.less: -------------------------------------------------------------------------------- 1 | // THUMBNAILS 2 | // ---------- 3 | 4 | .thumbnails { 5 | margin-left: -@gridGutterWidth; 6 | list-style: none; 7 | .clearfix(); 8 | } 9 | .thumbnails > li { 10 | float: left; 11 | margin: 0 0 @baseLineHeight @gridGutterWidth; 12 | } 13 | .thumbnail { 14 | display: block; 15 | padding: 4px; 16 | line-height: 1; 17 | border: 1px solid #ddd; 18 | .border-radius(4px); 19 | .box-shadow(0 1px 1px rgba(0,0,0,.075)); 20 | } 21 | // Add a hover state for linked versions only 22 | a.thumbnail:hover { 23 | border-color: @linkColor; 24 | .box-shadow(0 1px 4px rgba(0,105,214,.25)); 25 | } 26 | // Images and captions 27 | .thumbnail > img { 28 | display: block; 29 | max-width: 100%; 30 | margin-left: auto; 31 | margin-right: auto; 32 | } 33 | .thumbnail .caption { 34 | padding: 9px; 35 | } 36 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/tooltip.less: -------------------------------------------------------------------------------- 1 | // TOOLTIP 2 | // ------= 3 | 4 | .tooltip { 5 | position: absolute; 6 | z-index: @zindexTooltip; 7 | display: block; 8 | visibility: visible; 9 | padding: 5px; 10 | font-size: 11px; 11 | .opacity(0); 12 | &.in { .opacity(80); } 13 | &.top { margin-top: -2px; } 14 | &.right { margin-left: 2px; } 15 | &.bottom { margin-top: 2px; } 16 | &.left { margin-left: -2px; } 17 | &.top .tooltip-arrow { #popoverArrow > .top(); } 18 | &.left .tooltip-arrow { #popoverArrow > .left(); } 19 | &.bottom .tooltip-arrow { #popoverArrow > .bottom(); } 20 | &.right .tooltip-arrow { #popoverArrow > .right(); } 21 | } 22 | .tooltip-inner { 23 | max-width: 200px; 24 | padding: 3px 8px; 25 | color: @white; 26 | text-align: center; 27 | text-decoration: none; 28 | background-color: @black; 29 | .border-radius(4px); 30 | } 31 | .tooltip-arrow { 32 | position: absolute; 33 | width: 0; 34 | height: 0; 35 | } 36 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/type.less: -------------------------------------------------------------------------------- 1 | // Typography.less 2 | // Headings, body text, lists, code, and more for a versatile and durable typography system 3 | // ---------------------------------------------------------------------------------------- 4 | 5 | 6 | // BODY TEXT 7 | // --------- 8 | 9 | p { 10 | margin: 0 0 @baseLineHeight / 2; 11 | font-family: @baseFontFamily; 12 | font-size: @baseFontSize; 13 | line-height: @baseLineHeight; 14 | small { 15 | font-size: @baseFontSize - 2; 16 | color: @grayLight; 17 | } 18 | } 19 | .lead { 20 | margin-bottom: @baseLineHeight; 21 | font-size: 20px; 22 | font-weight: 200; 23 | line-height: @baseLineHeight * 1.5; 24 | } 25 | 26 | // HEADINGS 27 | // -------- 28 | 29 | h1, h2, h3, h4, h5, h6 { 30 | margin: 0; 31 | font-family: @headingsFontFamily; 32 | font-weight: @headingsFontWeight; 33 | color: @headingsColor; 34 | text-rendering: optimizelegibility; // Fix the character spacing for headings 35 | small { 36 | font-weight: normal; 37 | color: @grayLight; 38 | } 39 | } 40 | h1 { 41 | font-size: 30px; 42 | line-height: @baseLineHeight * 2; 43 | small { 44 | font-size: 18px; 45 | } 46 | } 47 | h2 { 48 | font-size: 24px; 49 | line-height: @baseLineHeight * 2; 50 | small { 51 | font-size: 18px; 52 | } 53 | } 54 | h3 { 55 | line-height: @baseLineHeight * 1.5; 56 | font-size: 18px; 57 | small { 58 | font-size: 14px; 59 | } 60 | } 61 | h4, h5, h6 { 62 | line-height: @baseLineHeight; 63 | } 64 | h4 { 65 | font-size: 14px; 66 | small { 67 | font-size: 12px; 68 | } 69 | } 70 | h5 { 71 | font-size: 12px; 72 | } 73 | h6 { 74 | font-size: 11px; 75 | color: @grayLight; 76 | text-transform: uppercase; 77 | } 78 | 79 | // Page header 80 | .page-header { 81 | padding-bottom: @baseLineHeight - 1; 82 | margin: @baseLineHeight 0; 83 | border-bottom: 1px solid @grayLighter; 84 | } 85 | .page-header h1 { 86 | line-height: 1; 87 | } 88 | 89 | 90 | 91 | // LISTS 92 | // ----- 93 | 94 | // Unordered and Ordered lists 95 | ul, ol { 96 | padding: 0; 97 | margin: 0 0 @baseLineHeight / 2 25px; 98 | } 99 | ul ul, 100 | ul ol, 101 | ol ol, 102 | ol ul { 103 | margin-bottom: 0; 104 | } 105 | ul { 106 | list-style: disc; 107 | } 108 | ol { 109 | list-style: decimal; 110 | } 111 | li { 112 | line-height: @baseLineHeight; 113 | } 114 | ul.unstyled, 115 | ol.unstyled { 116 | margin-left: 0; 117 | list-style: none; 118 | } 119 | 120 | // Description Lists 121 | dl { 122 | margin-bottom: @baseLineHeight; 123 | } 124 | dt, 125 | dd { 126 | line-height: @baseLineHeight; 127 | } 128 | dt { 129 | font-weight: bold; 130 | line-height: @baseLineHeight - 1; // fix jank Helvetica Neue font bug 131 | } 132 | dd { 133 | margin-left: @baseLineHeight / 2; 134 | } 135 | // Horizontal layout (like forms) 136 | .dl-horizontal { 137 | dt { 138 | float: left; 139 | clear: left; 140 | width: 120px; 141 | text-align: right; 142 | } 143 | dd { 144 | margin-left: 130px; 145 | } 146 | } 147 | 148 | // MISC 149 | // ---- 150 | 151 | // Horizontal rules 152 | hr { 153 | margin: @baseLineHeight 0; 154 | border: 0; 155 | border-top: 1px solid @hrBorder; 156 | border-bottom: 1px solid @white; 157 | } 158 | 159 | // Emphasis 160 | strong { 161 | font-weight: bold; 162 | } 163 | em { 164 | font-style: italic; 165 | } 166 | .muted { 167 | color: @grayLight; 168 | } 169 | 170 | // Abbreviations and acronyms 171 | abbr[title] { 172 | border-bottom: 1px dotted #ddd; 173 | cursor: help; 174 | } 175 | abbr.initialism { 176 | font-size: 90%; 177 | text-transform: uppercase; 178 | } 179 | 180 | // Blockquotes 181 | blockquote { 182 | padding: 0 0 0 15px; 183 | margin: 0 0 @baseLineHeight; 184 | border-left: 5px solid @grayLighter; 185 | p { 186 | margin-bottom: 0; 187 | #font > .shorthand(16px,300,@baseLineHeight * 1.25); 188 | } 189 | small { 190 | display: block; 191 | line-height: @baseLineHeight; 192 | color: @grayLight; 193 | &:before { 194 | content: '\2014 \00A0'; 195 | } 196 | } 197 | 198 | // Float right with text-align: right 199 | &.pull-right { 200 | float: right; 201 | padding-left: 0; 202 | padding-right: 15px; 203 | border-left: 0; 204 | border-right: 5px solid @grayLighter; 205 | p, 206 | small { 207 | text-align: right; 208 | } 209 | } 210 | } 211 | 212 | // Quotes 213 | q:before, 214 | q:after, 215 | blockquote:before, 216 | blockquote:after { 217 | content: ""; 218 | } 219 | 220 | // Addresses 221 | address { 222 | display: block; 223 | margin-bottom: @baseLineHeight; 224 | line-height: @baseLineHeight; 225 | font-style: normal; 226 | } 227 | 228 | // Misc 229 | small { 230 | font-size: 100%; 231 | } 232 | cite { 233 | font-style: normal; 234 | } 235 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/utilities.less: -------------------------------------------------------------------------------- 1 | // UTILITY CLASSES 2 | // --------------- 3 | 4 | // Quick floats 5 | .pull-right { 6 | float: right; 7 | } 8 | .pull-left { 9 | float: left; 10 | } 11 | 12 | // Toggling content 13 | .hide { 14 | display: none; 15 | } 16 | .show { 17 | display: block; 18 | } 19 | 20 | // Visibility 21 | .invisible { 22 | visibility: hidden; 23 | } 24 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/variables.less: -------------------------------------------------------------------------------- 1 | // Variables.less 2 | // Variables to customize the look and feel of Bootstrap 3 | // ----------------------------------------------------- 4 | 5 | 6 | 7 | // GLOBAL VALUES 8 | // -------------------------------------------------- 9 | 10 | 11 | // Grays 12 | // ------------------------- 13 | @black: #000; 14 | @grayDarker: #222; 15 | @grayDark: #333; 16 | @gray: #555; 17 | @grayLight: #999; 18 | @grayLighter: #eee; 19 | @white: #fff; 20 | 21 | 22 | // Accent colors 23 | // ------------------------- 24 | @blue: #049cdb; 25 | @blueDark: #0064cd; 26 | @green: #46a546; 27 | @red: #9d261d; 28 | @yellow: #ffc40d; 29 | @orange: #f89406; 30 | @pink: #c3325f; 31 | @purple: #7a43b6; 32 | 33 | 34 | // Scaffolding 35 | // ------------------------- 36 | @bodyBackground: @white; 37 | @textColor: @grayDark; 38 | 39 | 40 | // Links 41 | // ------------------------- 42 | @linkColor: #08c; 43 | @linkColorHover: darken(@linkColor, 15%); 44 | 45 | 46 | // Typography 47 | // ------------------------- 48 | @baseFontSize: 13px; 49 | @baseFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif; 50 | @baseLineHeight: 18px; 51 | @altFontFamily: Georgia, "Times New Roman", Times, serif; 52 | 53 | @headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily 54 | @headingsFontWeight: bold; // instead of browser default, bold 55 | @headingsColor: inherit; // empty to use BS default, @textColor 56 | 57 | 58 | // Tables 59 | // ------------------------- 60 | @tableBackground: transparent; // overall background-color 61 | @tableBackgroundAccent: #f9f9f9; // for striping 62 | @tableBackgroundHover: #f5f5f5; // for hover 63 | @tableBorder: #ddd; // table and cell border 64 | 65 | 66 | // Buttons 67 | // ------------------------- 68 | @btnBackground: @white; 69 | @btnBackgroundHighlight: darken(@white, 10%); 70 | @btnBorder: darken(@white, 20%); 71 | 72 | @btnPrimaryBackground: @linkColor; 73 | @btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 15%); 74 | 75 | @btnInfoBackground: #5bc0de; 76 | @btnInfoBackgroundHighlight: #2f96b4; 77 | 78 | @btnSuccessBackground: #62c462; 79 | @btnSuccessBackgroundHighlight: #51a351; 80 | 81 | @btnWarningBackground: lighten(@orange, 15%); 82 | @btnWarningBackgroundHighlight: @orange; 83 | 84 | @btnDangerBackground: #ee5f5b; 85 | @btnDangerBackgroundHighlight: #bd362f; 86 | 87 | @btnInverseBackground: @gray; 88 | @btnInverseBackgroundHighlight: @grayDarker; 89 | 90 | 91 | // Forms 92 | // ------------------------- 93 | @inputBackground: @white; 94 | @inputBorder: #ccc; 95 | @inputDisabledBackground: @grayLighter; 96 | 97 | 98 | // Dropdowns 99 | // ------------------------- 100 | @dropdownBackground: @white; 101 | @dropdownBorder: rgba(0,0,0,.2); 102 | @dropdownLinkColor: @grayDark; 103 | @dropdownLinkColorHover: @white; 104 | @dropdownLinkBackgroundHover: @linkColor; 105 | 106 | 107 | 108 | 109 | // COMPONENT VARIABLES 110 | // -------------------------------------------------- 111 | 112 | // Z-index master list 113 | // ------------------------- 114 | // Used for a bird's eye view of components dependent on the z-axis 115 | // Try to avoid customizing these :) 116 | @zindexDropdown: 1000; 117 | @zindexPopover: 1010; 118 | @zindexTooltip: 1020; 119 | @zindexFixedNavbar: 1030; 120 | @zindexModalBackdrop: 1040; 121 | @zindexModal: 1050; 122 | 123 | 124 | // Sprite icons path 125 | // ------------------------- 126 | @iconSpritePath: "../img/glyphicons-halflings.png"; 127 | @iconWhiteSpritePath: "../img/glyphicons-halflings-white.png"; 128 | 129 | 130 | // Input placeholder text color 131 | // ------------------------- 132 | @placeholderText: @grayLight; 133 | 134 | 135 | // Hr border color 136 | // ------------------------- 137 | @hrBorder: @grayLighter; 138 | 139 | 140 | // Navbar 141 | // ------------------------- 142 | @navbarHeight: 40px; 143 | @navbarBackground: @grayDarker; 144 | @navbarBackgroundHighlight: @grayDark; 145 | 146 | @navbarText: @grayLight; 147 | @navbarLinkColor: @grayLight; 148 | @navbarLinkColorHover: @white; 149 | @navbarLinkColorActive: @navbarLinkColorHover; 150 | @navbarLinkBackgroundHover: transparent; 151 | @navbarLinkBackgroundActive: @navbarBackground; 152 | 153 | @navbarSearchBackground: lighten(@navbarBackground, 25%); 154 | @navbarSearchBackgroundFocus: @white; 155 | @navbarSearchBorder: darken(@navbarSearchBackground, 30%); 156 | @navbarSearchPlaceholderColor: #ccc; 157 | 158 | 159 | // Hero unit 160 | // ------------------------- 161 | @heroUnitBackground: @grayLighter; 162 | @heroUnitHeadingColor: inherit; 163 | @heroUnitLeadColor: inherit; 164 | 165 | 166 | // Form states and alerts 167 | // ------------------------- 168 | @warningText: #c09853; 169 | @warningBackground: #fcf8e3; 170 | @warningBorder: darken(spin(@warningBackground, -10), 3%); 171 | 172 | @errorText: #b94a48; 173 | @errorBackground: #f2dede; 174 | @errorBorder: darken(spin(@errorBackground, -10), 3%); 175 | 176 | @successText: #468847; 177 | @successBackground: #dff0d8; 178 | @successBorder: darken(spin(@successBackground, -10), 5%); 179 | 180 | @infoText: #3a87ad; 181 | @infoBackground: #d9edf7; 182 | @infoBorder: darken(spin(@infoBackground, -10), 7%); 183 | 184 | 185 | 186 | 187 | // GRID 188 | // -------------------------------------------------- 189 | 190 | // Default 940px grid 191 | // ------------------------- 192 | @gridColumns: 12; 193 | @gridColumnWidth: 60px; 194 | @gridGutterWidth: 20px; 195 | @gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1)); 196 | 197 | 198 | // Fluid grid 199 | // ------------------------- 200 | @fluidGridColumnWidth: 6.382978723%; 201 | @fluidGridGutterWidth: 2.127659574%; 202 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/less/wells.less: -------------------------------------------------------------------------------- 1 | // WELLS 2 | // ----- 3 | 4 | .well { 5 | min-height: 20px; 6 | padding: 19px; 7 | margin-bottom: 20px; 8 | background-color: #f5f5f5; 9 | border: 1px solid #eee; 10 | border: 1px solid rgba(0,0,0,.05); 11 | .border-radius(4px); 12 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 13 | blockquote { 14 | border-color: #ddd; 15 | border-color: rgba(0,0,0,.15); 16 | } 17 | } 18 | 19 | // Sizes 20 | .well-large { 21 | padding: 24px; 22 | .border-radius(6px); 23 | } 24 | .well-small { 25 | padding: 9px; 26 | .border-radius(3px); 27 | } 28 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/main.css: -------------------------------------------------------------------------------- 1 | body, html { 2 | background-color:#E6B66E; 3 | } 4 | 5 | .hero-unit { 6 | background-color: transparent; 7 | } 8 | 9 | tt.literal{ 10 | font-weight:bold; 11 | } 12 | 13 | h1, h2, h3, h4, h5, h6, a, a:hover, a:visited, .hero-unit{ 14 | color:#59343E; 15 | } 16 | 17 | a{ 18 | text-decoration:underline; 19 | } 20 | .sphinxsidebarwrapper a{ 21 | text-decoration: none; 22 | } 23 | 24 | h2{ 25 | margin: 15px 0 5px; 26 | } 27 | 28 | h3{ 29 | margin: 15px 0 10px; 30 | } -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/static/pygments.css: -------------------------------------------------------------------------------- 1 | .highlight .hll { background-color: #000000 } 2 | .highlight { background: #eeffcc; } 3 | .highlight .c { color: #408090; font-style: italic } /* Comment */ 4 | .highlight .err { border: 1px solid #FF0000 } /* Error */ 5 | .highlight .k { color: #007020; font-weight: bold } /* Keyword */ 6 | .highlight .o { color: #666666 } /* Operator */ 7 | .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ 8 | .highlight .cp { color: #007020 } /* Comment.Preproc */ 9 | .highlight .c1 { color: #BBBBBB; font-style: italic } /* Comment.Single */ 10 | .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ 11 | .highlight .gd { color: #A00000 } /* Generic.Deleted */ 12 | .highlight .ge { font-style: italic } /* Generic.Emph */ 13 | .highlight .gr { color: #FF0000 } /* Generic.Error */ 14 | .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 15 | .highlight .gi { color: #00A000 } /* Generic.Inserted */ 16 | .highlight .go { color: #303030 } /* Generic.Output */ 17 | .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ 18 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 19 | .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 20 | .highlight .gt { color: #0040D0 } /* Generic.Traceback */ 21 | .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ 22 | .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ 23 | .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ 24 | .highlight .kp { color: #007020 } /* Keyword.Pseudo */ 25 | .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ 26 | .highlight .kt { color: #902000 } /* Keyword.Type */ 27 | .highlight .m { color: #208050 } /* Literal.Number */ 28 | .highlight .s { color: #80A0D0 } /* Literal.String */ 29 | .highlight .na { color: #80A0D0 } /* Name.Attribute */ 30 | .highlight .nb { color: #007020 } /* Name.Builtin */ 31 | .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ 32 | .highlight .no { color: #60add5 } /* Name.Constant */ 33 | .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ 34 | .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ 35 | .highlight .ne { color: #007020 } /* Name.Exception */ 36 | .highlight .nf { color: #06287e } /* Name.Function */ 37 | .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ 38 | .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ 39 | .highlight .nt { color: yellow; font-weight: bold } /* Name.Tag */ 40 | .highlight .nv { color: #bb60d5 } /* Name.Variable */ 41 | .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ 42 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */ 43 | .highlight .mf { color: #208050 } /* Literal.Number.Float */ 44 | .highlight .mh { color: #208050 } /* Literal.Number.Hex */ 45 | .highlight .mi { color: #208050 } /* Literal.Number.Integer */ 46 | .highlight .mo { color: #208050 } /* Literal.Number.Oct */ 47 | .highlight .sb { color: #80A0D0 } /* Literal.String.Backtick */ 48 | .highlight .sc { color: #80A0D0 } /* Literal.String.Char */ 49 | .highlight .sd { color: #BBBBBB; font-style: italic } /* Literal.String.Doc */ 50 | .highlight .s2 { color: #80A0D0 } /* Literal.String.Double */ 51 | .highlight .se { color: #80A0D0; font-weight: bold } /* Literal.String.Escape */ 52 | .highlight .sh { color: #80A0D0 } /* Literal.String.Heredoc */ 53 | .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ 54 | .highlight .sx { color: #c65d09 } /* Literal.String.Other */ 55 | .highlight .sr { color: #235388 } /* Literal.String.Regex */ 56 | .highlight .s1 { color: #80A0D0 } /* Literal.String.Single */ 57 | .highlight .ss { color: #517918 } /* Literal.String.Symbol */ 58 | .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ 59 | .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ 60 | .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ 61 | .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ 62 | .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ 63 | -------------------------------------------------------------------------------- /docs/source/_themes/Alchemy/theme.conf: -------------------------------------------------------------------------------- 1 | [theme] 2 | inherit = basic 3 | stylesheet = Alchemy.css 4 | pygments_style = sphinx 5 | 6 | [options] 7 | rightsidebar = false 8 | stickysidebar = false 9 | collapsiblesidebar = false 10 | externalrefs = false 11 | -------------------------------------------------------------------------------- /docs/source/conf.py: -------------------------------------------------------------------------------- 1 | import sys, os 2 | import os.path 3 | 4 | # If extensions (or modules to document with autodoc) are in another directory, 5 | # add these directories to sys.path here. If the directory is relative to the 6 | # documentation root, use os.path.abspath to make it absolute, like shown here. 7 | #sys.path.insert(0, os.path.abspath('.')) 8 | 9 | # -- General configuration ----------------------------------------------------- 10 | 11 | # If your documentation needs a minimal Sphinx version, state it here. 12 | #needs_sphinx = '1.0' 13 | 14 | # Add any Sphinx extension module names here, as strings. They can be extensions 15 | # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. 16 | extensions = [] 17 | 18 | # Add any paths that contain templates here, relative to this directory. 19 | templates_path = ['_templates'] 20 | 21 | # The suffix of source filenames. 22 | source_suffix = '.rst' 23 | 24 | # The encoding of source files. 25 | #source_encoding = 'utf-8-sig' 26 | 27 | # The master toctree document. 28 | master_doc = 'index' 29 | 30 | # General information about the project. 31 | project = u'Project' 32 | copyright = u'2012' 33 | 34 | # The version info for the project you're documenting, acts as replacement for 35 | # |version| and |release|, also used in various other places throughout the 36 | # built documents. 37 | # 38 | # The short X.Y version. 39 | version = '0.1' 40 | # The full version, including alpha/beta/rc tags. 41 | release = '0.1' 42 | 43 | # The language for content autogenerated by Sphinx. Refer to documentation 44 | # for a list of supported languages. 45 | #language = None 46 | 47 | # There are two options for replacing |today|: either, you set today to some 48 | # non-false value, then it is used: 49 | #today = '' 50 | # Else, today_fmt is used as the format for a strftime call. 51 | #today_fmt = '%B %d, %Y' 52 | 53 | # List of patterns, relative to source directory, that match files and 54 | # directories to ignore when looking for source files. 55 | exclude_patterns = [] 56 | 57 | # The reST default role (used for this markup: `text`) to use for all documents. 58 | #default_role = None 59 | 60 | # If true, '()' will be appended to :func: etc. cross-reference text. 61 | #add_function_parentheses = True 62 | 63 | # If true, the current module name will be prepended to all description 64 | # unit titles (such as .. function::). 65 | #add_module_names = True 66 | 67 | # If true, sectionauthor and moduleauthor directives will be shown in the 68 | # output. They are ignored by default. 69 | #show_authors = False 70 | 71 | # The name of the Pygments (syntax highlighting) style to use. 72 | pygments_style = 'sphinx' 73 | 74 | # A list of ignored prefixes for module index sorting. 75 | #modindex_common_prefix = [] 76 | 77 | 78 | # -- Options for HTML output --------------------------------------------------- 79 | 80 | # The theme to use for HTML and HTML Help pages. See the documentation for 81 | # a list of builtin themes. 82 | html_theme = 'Alchemy' 83 | 84 | # Theme options are theme-specific and customize the look and feel of a theme 85 | # further. For a list of options available for each theme, see the 86 | # documentation. 87 | #html_theme_options = {} 88 | 89 | # Add any paths that contain custom themes here, relative to this directory. 90 | html_theme_path = ['_themes'] 91 | 92 | # The name for this set of Sphinx documents. If None, it defaults to 93 | # " v documentation". 94 | #html_title = None 95 | 96 | # A shorter title for the navigation bar. Default is the same as html_title. 97 | #html_short_title = None 98 | 99 | # The name of an image file (relative to this directory) to place at the top 100 | # of the sidebar. 101 | #html_logo = None 102 | 103 | # The name of an image file (within the static path) to use as favicon of the 104 | # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 105 | # pixels large. 106 | #html_favicon = None 107 | 108 | # Add any paths that contain custom static files (such as style sheets) here, 109 | # relative to this directory. They are copied after the builtin static files, 110 | # so a file named "default.css" will overwrite the builtin "default.css". 111 | html_static_path = ['_static', 'API'] 112 | 113 | # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, 114 | # using the given strftime format. 115 | #html_last_updated_fmt = '%b %d, %Y' 116 | 117 | # If true, SmartyPants will be used to convert quotes and dashes to 118 | # typographically correct entities. 119 | #html_use_smartypants = True 120 | 121 | # Custom sidebar templates, maps document names to template names. 122 | #html_sidebars = {} 123 | 124 | # Additional templates that should be rendered to pages, maps page names to 125 | # template names. 126 | #html_additional_pages = {} 127 | 128 | # If false, no module index is generated. 129 | #html_domain_indices = True 130 | 131 | # If false, no index is generated. 132 | #html_use_index = True 133 | 134 | # If true, the index is split into individual pages for each letter. 135 | #html_split_index = False 136 | 137 | # If true, links to the reST sources are added to the pages. 138 | #html_show_sourcelink = True 139 | 140 | # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. 141 | #html_show_sphinx = True 142 | 143 | # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. 144 | #html_show_copyright = True 145 | 146 | # If true, an OpenSearch description file will be output, and all pages will 147 | # contain a tag referring to it. The value of this option must be the 148 | # base URL from which the finished HTML is served. 149 | #html_use_opensearch = '' 150 | 151 | # This is the file name suffix for HTML files (e.g. ".xhtml"). 152 | #html_file_suffix = None 153 | 154 | # Output file base name for HTML help builder. 155 | htmlhelp_basename = 'Project' 156 | 157 | 158 | # -- Options for LaTeX output -------------------------------------------------- 159 | 160 | latex_elements = { 161 | # The paper size ('letterpaper' or 'a4paper'). 162 | #'papersize': 'letterpaper', 163 | 164 | # The font size ('10pt', '11pt' or '12pt'). 165 | #'pointsize': '10pt', 166 | 167 | # Additional stuff for the LaTeX preamble. 168 | #'preamble': '', 169 | } 170 | 171 | # Grouping the document tree into LaTeX files. List of tuples 172 | # (source start file, target name, title, author, documentclass [howto/manual]). 173 | latex_documents = [ 174 | ('index', 'Project.tex', u'Project Documentation', 175 | u'Project', 'manual'), 176 | ] 177 | 178 | # The name of an image file (relative to this directory) to place at the top of 179 | # the title page. 180 | #latex_logo = None 181 | 182 | # For "manual" documents, if this is true, then toplevel headings are parts, 183 | # not chapters. 184 | #latex_use_parts = False 185 | 186 | # If true, show page references after internal links. 187 | #latex_show_pagerefs = False 188 | 189 | # If true, show URL addresses after external links. 190 | #latex_show_urls = False 191 | 192 | # Documents to append as an appendix to all manuals. 193 | #latex_appendices = [] 194 | 195 | # If false, no module index is generated. 196 | #latex_domain_indices = True 197 | 198 | 199 | # -- Options for manual page output -------------------------------------------- 200 | 201 | # One entry per manual page. List of tuples 202 | # (source start file, name, description, authors, manual section). 203 | man_pages = [ 204 | ('index', 'project', u'Project Documentation', 205 | [u'Copyright'], 1) 206 | ] 207 | 208 | # If true, show URL addresses after external links. 209 | #man_show_urls = False 210 | 211 | 212 | # -- Options for Texinfo output ------------------------------------------------ 213 | 214 | # Grouping the document tree into Texinfo files. List of tuples 215 | # (source start file, target name, title, author, 216 | # dir menu entry, description, category) 217 | texinfo_documents = [ 218 | ('index', 'Project', u'Project Documentation', 219 | u'Copyright', 'Project', 'One line description of project.', 220 | 'Miscellaneous'), 221 | ] 222 | 223 | # Documents to append as an appendix to all manuals. 224 | #texinfo_appendices = [] 225 | 226 | # If false, no module index is generated. 227 | #texinfo_domain_indices = True 228 | 229 | # How to display URL addresses: 'footnote', 'no', or 'inline'. 230 | #texinfo_show_urls = 'footnote' 231 | 232 | current_dir = os.path.dirname(os.path.abspath(__file__)) 233 | sys.path.append(current_dir) 234 | from local_conf import * 235 | -------------------------------------------------------------------------------- /docs/source/index.rst: -------------------------------------------------------------------------------- 1 | PHP XPDF documentation 2 | ====================== 3 | 4 | Introduction 5 | ------------ 6 | 7 | PHP-XPDF is an object oriented library to handle 8 | `XPDF `_, an open source project self-described 9 | as "a viewer for Portable Document Format files. The Xpdf project also includes 10 | a PDF text extractor, PDF-to-PostScript converter, and various other utilities." 11 | 12 | For the moment, there's only one handler for PDF2Text. 13 | 14 | This library depends on 15 | `Symfony Process Component `_ and 16 | `Monolog `_. 17 | 18 | Installation 19 | ------------ 20 | 21 | PHP-XPDF relies on `composer `_. If you do not yet 22 | use composer for your project, you can start with this ``composer.json`` at the 23 | root of your project: 24 | 25 | .. code-block:: json 26 | 27 | { 28 | "require": { 29 | "php-xpdf/php-xpdf": "master" 30 | } 31 | } 32 | 33 | Install composer : 34 | 35 | .. code-block:: bash 36 | 37 | # Install composer 38 | curl -s http://getcomposer.org/installer | php 39 | # Upgrade your install 40 | php composer.phar install 41 | 42 | You now just have to autoload the library to use it : 43 | 44 | .. code-block:: php 45 | 46 | `_. 52 | 53 | PDF2Text 54 | -------- 55 | 56 | Basic Usage 57 | ^^^^^^^^^^^ 58 | 59 | .. code-block:: php 60 | 61 | pushHandler(new NullHandler()); 69 | 70 | // You have to pass a Monolog logger 71 | // This logger provides some usefull infos about what's happening 72 | $pdfToText = PdfToText::load($logger); 73 | 74 | // open PDF 75 | $pdfToText->open('PDF-book.pdf'); 76 | 77 | // PDF text is now in the $text variable 78 | $text = $pdfToText->getText(); 79 | $pdfToText->close(); 80 | 81 | Using Custom Binary 82 | ^^^^^^^^^^^^^^^^^^^ 83 | 84 | The PDF2Text is automatically detected if its path install is in the PATH. 85 | if you want to use your own PdfTotext binary, use as follow : 86 | 87 | .. code-block:: php 88 | 89 | setOutputEncoding('ISO-8859-5'); 109 | 110 | .. note:: The charset value should be an iconv compatible value. 111 | 112 | Extract page range 113 | ^^^^^^^^^^^^^^^^^^ 114 | 115 | You can restrict the text extraction on page range. For example to extract pages 116 | 3 to 6 ; 117 | 118 | .. code-block:: php 119 | 120 | getText(3, 6); 122 | 123 | Silex Service Provider 124 | ^^^^^^^^^^^^^^^^^^^^^^ 125 | 126 | XPDF is bundled with a `Silex `_ Service Provider. 127 | Use it is very simple : 128 | 129 | .. code-block:: php 130 | 131 | register(new XPDFServiceProvider()); 137 | 138 | // You have access to PDF2Text 139 | $app['xpdf.pdf2text']->open(...); 140 | 141 | 142 | You can, of course, customize it : 143 | 144 | .. code-block:: php 145 | 146 | register(new XPDFServiceProvider(), array( 152 | 'xpdf.pdf2text.binary' => '/your/custom/binary', 153 | 'xpdf.logger' => $my_logger, 154 | )); 155 | 156 | // You have access to PDF2Text 157 | $app['xpdf.pdf2text']->open(...); 158 | 159 | 160 | Handling Exceptions 161 | ------------------- 162 | 163 | XPDF throws 4 different types of exception : 164 | 165 | - ``\XPDF\Exception\BinaryNotFoundException`` is thrown when no acceptable 166 | pdf2text binary is found. 167 | - ``\XPDF\Exception\InvalidFileArgumentException`` is thrown when an invalid 168 | file is supplied for text extraction 169 | - ``\XPDF\Exception\LogicException`` which extends SPL LogicException 170 | - ``\XPDF\Exception\RuntimeException`` which extends SPL RuntimeException 171 | 172 | All these Exception implements ``\XPDF\Exception\Exception`` so you can catch 173 | any of these exceptions by catching this exception interface. 174 | 175 | Report a bug 176 | ------------ 177 | 178 | If you experience an issue, please report it in our 179 | `issue tracker `_. Before 180 | reporting an issue, please be sure that it is not already reported by browsing 181 | open issues. 182 | 183 | When reporting, please give us information to reproduce it by giving your 184 | platform (Linux / MacOS / Windows) and its version, the version of PHP you use 185 | (the output of ``php --version``), and the version of xpdf you use (the output 186 | of ``xpdf -v``). 187 | 188 | Ask for a feature 189 | ----------------- 190 | 191 | We would be glad you ask for a feature ! Feel free to add a feature request in 192 | the `issues manager `_ on 193 | GitHub ! 194 | 195 | Contribute 196 | ---------- 197 | 198 | You find a bug and resolved it ? You added a feature and want to share ? You 199 | found a typo in this doc and fixed it ? Feel free to send a 200 | `Pull Request `_ on GitHub, we will 201 | be glad to merge your code. 202 | 203 | Run tests 204 | --------- 205 | 206 | PHP-XPDF relies on `PHPUnit `_ for 207 | unit tests. To run tests on your system, ensure you have PHPUnit installed, 208 | and, at the root of PHP-XPDF, execute it : 209 | 210 | .. code-block:: bash 211 | 212 | phpunit 213 | 214 | About 215 | ----- 216 | 217 | PHP-XPDF has been written by Romain Neutron @ `Alchemy `_ 218 | for `Phraseanet `_, our DAM software. 219 | Try it, it's awesome ! 220 | 221 | License 222 | ------- 223 | 224 | PHP-XPDF is licensed under the 225 | `MIT License `_ 226 | -------------------------------------------------------------------------------- /docs/source/local_conf.py: -------------------------------------------------------------------------------- 1 | 2 | # project name 3 | project = u'PHP XPDF' 4 | 5 | # Tex info conf 6 | texinfo_documents = [ 7 | ('index', 'PHPXPDF', u'PHP XPDF Documentation', 8 | u'Romain Neutron - Alchemy', 'PHPXPDF', 'One line description of project.', 9 | 'Miscellaneous'), 10 | ] 11 | 12 | # Man page conf 13 | man_pages = [ 14 | ('index', 'phpxpdf', u'PHP XPDF Documentation', 15 | [u'Romain Neutron - Alchemy'], 1) 16 | ] 17 | 18 | # Latex doc conf 19 | latex_documents = [ 20 | ('index', 'PHPXPDF.tex', u'PHP XPDF Documentation', 21 | u'Romain Neutron - Alchemy', 'manual'), 22 | ] 23 | 24 | # html help basename 25 | htmlhelp_basename = 'PHPXPDFdoc' 26 | 27 | # version 28 | version = '0.1' 29 | 30 | # release 31 | release = '0.1' 32 | 33 | # Copyright Value ex : copyright = u'2012, Alchemy' 34 | copyright = u'2012, Romain Neutron - Alchemy' -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | tests 21 | 22 | 23 | 24 | 25 | vendor 26 | tests 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/XPDF/Exception/BinaryNotFoundException.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace XPDF\Exception; 13 | 14 | /** 15 | * XPDF Binary Not Found Exception 16 | * 17 | * @license MIT 18 | * @author Romain Neutron 19 | */ 20 | class BinaryNotFoundException extends \Exception implements ExceptionInterface 21 | { 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/XPDF/Exception/ExceptionInterface.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace XPDF\Exception; 13 | 14 | /** 15 | * XPDF Exception Interface 16 | * 17 | * @license MIT 18 | * @author Romain Neutron 19 | */ 20 | interface ExceptionInterface 21 | { 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/XPDF/Exception/InvalidArgumentException.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace XPDF\Exception; 13 | 14 | /** 15 | * XPDF Invalid File Argument Exception 16 | * 17 | * @license MIT 18 | * @author Romain Neutron 19 | */ 20 | class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface 21 | { 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/XPDF/Exception/RuntimeException.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace XPDF\Exception; 13 | 14 | /** 15 | * XPDF Runtime Exception 16 | * 17 | * @license MIT 18 | * @author Romain Neutron 19 | */ 20 | class RuntimeException extends \RuntimeException implements ExceptionInterface 21 | { 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/XPDF/PdfInfo.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace XPDF; 13 | 14 | use Alchemy\BinaryDriver\AbstractBinary; 15 | use Alchemy\BinaryDriver\Exception\ExecutionFailureException; 16 | use Alchemy\BinaryDriver\Exception\ExecutableNotFoundException; 17 | use Alchemy\BinaryDriver\Configuration; 18 | use Alchemy\BinaryDriver\ConfigurationInterface; 19 | use Psr\Log\LoggerInterface; 20 | use XPDF\Exception\InvalidArgumentException; 21 | use XPDF\Exception\RuntimeException; 22 | use XPDF\Exception\BinaryNotFoundException; 23 | 24 | /** 25 | * The PdfInfo object. 26 | * 27 | * This binary adapter is used to extract information about pdf with the PdfInfo 28 | * binary provided by XPDF. 29 | * 30 | * @see https://wikipedia.org/wiki/PdfInfo 31 | * @license MIT 32 | */ 33 | class PdfInfo extends AbstractBinary 34 | { 35 | private $data = array(); 36 | /** 37 | * {@inheritdoc} 38 | */ 39 | public function getName() 40 | { 41 | return 'pdfinfo'; 42 | } 43 | 44 | public function getData() 45 | { 46 | return $this->data; 47 | } 48 | 49 | /** 50 | * Extracts the information of the current open PDF file, 51 | * 52 | * @param string $pathfile The path to the PDF file 53 | * 54 | * @return array The extracted information as an associative array 55 | * 56 | * @throws InvalidArgumentException 57 | * @throws RuntimeException 58 | */ 59 | public function extractInfo($pathfile) 60 | { 61 | if (! file_exists($pathfile)) { 62 | throw new InvalidArgumentException(sprintf('%s is not a valid file', $pathfile)); 63 | } 64 | 65 | $commands = array(); 66 | 67 | $tmpFile = tempnam(sys_get_temp_dir(), 'pdfinfo'); 68 | 69 | $commands[] = $pathfile; 70 | 71 | try { 72 | $output = $this->command($commands); 73 | $this->data = $this->_parseOutputIntoData($output); 74 | return $this->data; 75 | } catch (ExecutionFailureException $e) { 76 | throw new RuntimeException('Unale to extract text', $e->getCode(), $e); 77 | } 78 | } 79 | 80 | /** 81 | * Factory for PdfInfo 82 | * 83 | * @param array|Configuration $configuration 84 | * @param LoggerInterface $logger 85 | * 86 | * @return PdfInfo 87 | */ 88 | public static function create($configuration = array(), LoggerInterface $logger = null) 89 | { 90 | if (!$configuration instanceof ConfigurationInterface) { 91 | $configuration = new Configuration($configuration); 92 | } 93 | 94 | $binaries = $configuration->get('pdfinfo.binaries', 'pdfinfo'); 95 | 96 | if (!$configuration->has('timeout')) { 97 | $configuration->set('timeout', 60); 98 | } 99 | 100 | try { 101 | return static::load($binaries, $logger, $configuration); 102 | } catch (ExecutableNotFoundException $e) { 103 | throw new BinaryNotFoundException('Unable to find pdfinfo', $e->getCode(), $e); 104 | } 105 | } 106 | 107 | 108 | /** 109 | * Parse output string from pdfinfo command into associative array 110 | * 111 | * @param String $output 112 | * 113 | * @return array 114 | */ 115 | private function parseOutputIntoData($output) 116 | { 117 | $data = array(); 118 | $exploded = preg_split("/\\r\\n|\\r|\\n/", $output, -1, PREG_SPLIT_NO_EMPTY); 119 | foreach ($exploded as $token) { 120 | $keyValue = preg_split("/:/", $token, 2); 121 | $data[$keyValue[0]] = trim($keyValue[1]); 122 | } 123 | return $data; 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /src/XPDF/PdfToText.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace XPDF; 13 | 14 | use Alchemy\BinaryDriver\AbstractBinary; 15 | use Alchemy\BinaryDriver\Exception\ExecutionFailureException; 16 | use Alchemy\BinaryDriver\Exception\ExecutableNotFoundException; 17 | use Alchemy\BinaryDriver\Configuration; 18 | use Alchemy\BinaryDriver\ConfigurationInterface; 19 | use Psr\Log\LoggerInterface; 20 | use XPDF\Exception\InvalidArgumentException; 21 | use XPDF\Exception\RuntimeException; 22 | use XPDF\Exception\BinaryNotFoundException; 23 | 24 | /** 25 | * The PdfToText object. 26 | * 27 | * This binary adapter is used to extract text from PDF with the PdfToText 28 | * binary provided by XPDF. 29 | * 30 | * @see https://wikipedia.org/wiki/Pdftotext 31 | * @license MIT 32 | */ 33 | class PdfToText extends AbstractBinary 34 | { 35 | private $charset = 'UTF-8'; 36 | private $pages; 37 | private $output_mode = '-raw'; 38 | 39 | /** 40 | * {@inheritdoc} 41 | */ 42 | public function getName() 43 | { 44 | return 'pdftotext'; 45 | } 46 | 47 | /** 48 | * Sets the output encoding. If the charset is invalid, the getText method 49 | * will fail. 50 | * 51 | * @param string $charset The output charset 52 | * @return PdfToText 53 | */ 54 | public function setOuputEncoding($charset) 55 | { 56 | $this->charset = $charset; 57 | 58 | return $this; 59 | } 60 | 61 | /** 62 | * Gets the ouput encoding, default is UTF-8 63 | * 64 | * @return string 65 | */ 66 | public function getOuputEncoding() 67 | { 68 | return $this->charset; 69 | } 70 | 71 | /** 72 | * Sets a quantity of page to extract by default 73 | * 74 | * @param integer $pages 75 | * 76 | * @return PdfToText 77 | */ 78 | public function setPageQuantity($pages) 79 | { 80 | if (0 >= $pages) { 81 | throw new InvalidArgumentException('Page quantity must be a positive value'); 82 | } 83 | 84 | $this->pages = $pages; 85 | 86 | return $this; 87 | } 88 | 89 | /** 90 | * Set the output formatting mode 91 | * 92 | * @param string $mode 93 | * 94 | * @return PdfToText 95 | * 96 | * Valid modes are "raw" and "layout" 97 | */ 98 | public function setOutputMode($mode) 99 | { 100 | switch (strtolower($mode)) { 101 | case 'raw': 102 | case '-raw': 103 | $this->output_mode = '-raw'; 104 | break; 105 | case 'layout': 106 | case '-layout': 107 | $this->output_mode = '-layout'; 108 | break; 109 | default: 110 | throw new InvalidArgumentException('Mode must be "raw" or "layout"'); 111 | break; 112 | } 113 | 114 | return $this; 115 | } 116 | 117 | /** 118 | * Extracts the text of the current open PDF file, if not page start/end 119 | * provided, etxract all pages. 120 | * 121 | * @param string $pathfile The path to the PDF file 122 | * @param integer $page_start The starting page number (first is 1) 123 | * @param integer $page_end The ending page number 124 | * 125 | * @return string The extracted text 126 | * 127 | * @throws InvalidArgumentException 128 | * @throws RuntimeException 129 | */ 130 | public function getText($pathfile, $page_start = null, $page_end = null) 131 | { 132 | if ( ! file_exists($pathfile)) { 133 | throw new InvalidArgumentException(sprintf('%s is not a valid file', $pathfile)); 134 | } 135 | 136 | $commands = array(); 137 | 138 | if (null !== $page_start) { 139 | $commands[] = '-f'; 140 | $commands[] = (int) $page_start; 141 | } 142 | if (null !== $page_end) { 143 | $commands[] = '-l'; 144 | $commands[] = (int) $page_end; 145 | } elseif (null !== $this->pages) { 146 | $commands[] = '-l'; 147 | $commands[] = (int) $page_start + $this->pages; 148 | } 149 | 150 | $tmpFile = tempnam(sys_get_temp_dir(), 'xpdf'); 151 | 152 | $commands[] = $this->output_mode; 153 | $commands[] = '-nopgbrk'; 154 | $commands[] = '-enc'; 155 | $commands[] = $this->charset; 156 | $commands[] = '-eol'; 157 | $commands[] = '-unix'; 158 | $commands[] = $pathfile; 159 | $commands[] = $tmpFile; 160 | 161 | try { 162 | $this->command($commands); 163 | $ret = file_get_contents($tmpFile); 164 | 165 | if (is_writable($tmpFile)) { 166 | unlink($tmpFile); 167 | } 168 | } catch (ExecutionFailureException $e) { 169 | throw new RuntimeException('Unale to extract text', $e->getCode(), $e); 170 | } 171 | 172 | return $ret; 173 | } 174 | 175 | /** 176 | * Factory for PdfToText 177 | * 178 | * @param array|Configuration $configuration 179 | * @param LoggerInterface $logger 180 | * 181 | * @return PdfToText 182 | */ 183 | public static function create($configuration = array(), LoggerInterface $logger = null) 184 | { 185 | if (!$configuration instanceof ConfigurationInterface) { 186 | $configuration = new Configuration($configuration); 187 | } 188 | 189 | $binaries = $configuration->get('pdftotext.binaries', 'pdftotext'); 190 | 191 | if (!$configuration->has('timeout')) { 192 | $configuration->set('timeout', 60); 193 | } 194 | 195 | try { 196 | return static::load($binaries, $logger, $configuration); 197 | } catch (ExecutableNotFoundException $e) { 198 | throw new BinaryNotFoundException('Unable to find pdftotext', $e->getCode(), $e); 199 | } 200 | } 201 | } 202 | -------------------------------------------------------------------------------- /src/XPDF/XPDFServiceProvider.php: -------------------------------------------------------------------------------- 1 | 60, 16 | 'pdftotext.binaries' => 'pdftotext', 17 | ); 18 | $app['xpdf.logger'] = null; 19 | 20 | $app['xpdf.configuration.build'] = $app->share(function (Application $app) { 21 | return array_replace($app['xpdf.default.configuration'], $app['xpdf.configuration']); 22 | }); 23 | 24 | $app['xpdf.pdftotext'] = $app->share(function(Application $app) { 25 | $configuration = $app['xpdf.configuration.build']; 26 | 27 | if (isset($configuration['pdftotext.timeout'])) { 28 | $configuration['timeout'] = $configuration['pdftotext.timeout']; 29 | } 30 | 31 | return PdfToText::create($configuration, $app['xpdf.logger']); 32 | }); 33 | } 34 | 35 | public function boot(Application $app) 36 | { 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /tests/XPDF/Tests/PdfToTextTest.php: -------------------------------------------------------------------------------- 1 | assertEquals('UTF-8', $pdfToText->getOuputEncoding()); 15 | $pdfToText->setOuputEncoding('ascii'); 16 | $this->assertEquals('ascii', $pdfToText->getOuputEncoding()); 17 | } 18 | 19 | /** 20 | * @expectedException XPDF\Exception\BinaryNotFoundException 21 | */ 22 | public function testBinaryNotFound() 23 | { 24 | PdfToText::create(array('pdftotext.binaries' => '/path/to/nowhere')); 25 | } 26 | 27 | /** 28 | * @expectedException XPDF\Exception\InvalidArgumentException 29 | */ 30 | public function testGetTextInvalidFile() 31 | { 32 | $pdfToText = PdfToText::create(); 33 | $pdfToText->getText('/path/to/nowhere'); 34 | } 35 | 36 | public function testGetText() 37 | { 38 | $text = 'This is an UTF-8 encoded string : « Un éléphant ça trompe énormément ! » 39 | It tells about elephant\'s noze ! 40 | '; 41 | $pdfToText = PdfToText::create(); 42 | $this->assertEquals($text, $pdfToText->getText(__DIR__ . '/../../files/HelloWorld.pdf')); 43 | $this->assertEquals($text, $pdfToText->getText(__DIR__ . '/../../files/HelloWorld.pdf', 1, 1)); 44 | $this->assertEquals('', $pdfToText->getText(__DIR__ . '/../../files/HelloWorld.pdf', 2, 2)); 45 | } 46 | 47 | public function testGetTextWithPageQuantity() 48 | { 49 | $text = 'This is an UTF-8 encoded string : « Un éléphant ça trompe énormément ! » 50 | It tells about elephant\'s noze ! 51 | '; 52 | $pdfToText = PdfToText::create(); 53 | $pdfToText->setPageQuantity(1); 54 | $this->assertEquals($text, $pdfToText->getText(__DIR__ . '/../../files/HelloWorld.pdf')); 55 | } 56 | 57 | /** 58 | * @expectedException XPDF\Exception\InvalidArgumentException 59 | */ 60 | public function testInvalidPageQuantity() 61 | { 62 | $pdfToText = PdfToText::create(); 63 | $pdfToText->setPageQuantity(0); 64 | } 65 | 66 | public function testCreate() 67 | { 68 | $finder = new ExecutableFinder(); 69 | $php = $finder->find('php'); 70 | 71 | if (null === $php) { 72 | $this->markTestSkipped('Unable to find PHP binary, required for this test'); 73 | } 74 | 75 | $logger = $this->getMock('Psr\Log\LoggerInterface'); 76 | 77 | $pdfToText = PdfToText::create(array('pdftotext.binaries' => $php, 'timeout' => 42), $logger); 78 | $this->assertInstanceOf('XPDF\PdfToText', $pdfToText); 79 | $this->assertEquals(42, $pdfToText->getProcessBuilderFactory()->getTimeout()); 80 | $this->assertEquals($logger, $pdfToText->getProcessRunner()->getLogger()); 81 | $this->assertEquals($php, $pdfToText->getProcessBuilderFactory()->getBinary()); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /tests/XPDF/Tests/XPDFServiceProviderTest.php: -------------------------------------------------------------------------------- 1 | find('php'); 15 | 16 | if (null === $php) { 17 | $this->markTestSkipped('Unable to find PHP binary, required for this test'); 18 | } 19 | 20 | $logger = $this->getMock('Psr\Log\LoggerInterface'); 21 | 22 | $app = new Application(); 23 | $app->register(new XPDFServiceProvider(), array( 24 | 'xpdf.configuration' => array( 25 | 'pdftotext.timeout' => 42, 26 | 'pdftotext.binaries' => $php, 27 | ), 28 | 'xpdf.logger' => $logger, 29 | )); 30 | $app->boot(); 31 | 32 | $this->assertInstanceOf('XPDF\PdfToText', $app['xpdf.pdftotext']); 33 | $this->assertEquals(42, $app['xpdf.pdftotext']->getProcessBuilderFactory()->getTimeout()); 34 | $this->assertEquals($logger, $app['xpdf.pdftotext']->getProcessRunner()->getLogger()); 35 | $this->assertEquals($php, $app['xpdf.pdftotext']->getProcessBuilderFactory()->getBinary()); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | add('XPDF\Tests', __DIR__); 5 | -------------------------------------------------------------------------------- /tests/files/HelloWorld.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alchemy-fr/PHP-XPDF/17a9e9a1cf2626f864dafe21d404e4e61db2a4aa/tests/files/HelloWorld.pdf --------------------------------------------------------------------------------