├── .gitignore ├── .travis.yml ├── AUTHORS ├── CHANGELOG.rst ├── LICENSE ├── MANIFEST.in ├── README.rst ├── docs ├── Makefile ├── _static │ └── .gitingnore ├── _templates │ ├── .gitingnore │ ├── sidebarintro.html │ └── sidebarlogo.html ├── _themes │ ├── .gitignore │ ├── flask_theme_support.py │ └── mysolr │ │ ├── flask_theme_support.py │ │ ├── layout.html │ │ ├── static │ │ └── bootstrap.css │ │ └── theme.conf ├── api │ └── classes.rst ├── conf.py ├── images │ └── index_bm.png ├── index.rst ├── make.bat └── user │ ├── benchmark.rst │ ├── installation.rst │ ├── recipes.rst │ └── userguide.rst ├── mysolr ├── __init__.py ├── compat.py ├── mysolr.py ├── response.py └── utils.py ├── setup.py └── tests ├── __init__.py ├── mocks ├── highlightingquery ├── query ├── spellquery └── statsquery ├── test_highlighting_query_result.py ├── test_query.py ├── test_query_result.py ├── test_spell_query_result.py ├── test_stats_query_result.py └── test_utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.egg-info 3 | .tox 4 | build/ 5 | docs/_build/ 6 | dist/ 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - "2.6" 4 | - "2.7" 5 | - "3.3" 6 | - "3.4" 7 | # command to install dependencies 8 | install: 9 | - pip install . --use-mirrors 10 | env: 11 | - SOLR_VERSION=3.6.2 SOLR_URL=http://localhost:8983/solr SOLR_DOCS=apache-solr-3.6.2/example/exampledocs/books.json 12 | - SOLR_VERSION=4.8.0 SOLR_URL=http://localhost:8983/solr/collection1 SOLR_DOCS=solr-4.8.0/example/exampledocs/books.json 13 | # command to run tests 14 | before_script: curl https://raw.githubusercontent.com/moliware/travis-solr/master/travis-solr.sh | bash 15 | script: coverage run --source=mysolr setup.py test 16 | after_script: killall java 17 | after_success: coveralls -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Authors: 2 | Rubén Abad 3 | Miguel Olivares 4 | 5 | Contributors: 6 | 7 | F. Javier Alba 8 | Fernando Tapia 9 | Carlos Navarro 10 | Marc Abramowitz 11 | @pnpnpn 12 | Rémi Cardona 13 | @smartkiwi 14 | Dan Crosta 15 | Julian Berman 16 | Ruslan Pilin -------------------------------------------------------------------------------- /CHANGELOG.rst: -------------------------------------------------------------------------------- 1 | Chages 2 | ====== 3 | 4 | v 0.8.3 5 | ------- 6 | - New utils module 7 | - New timeout parameter 8 | 9 | v 0.8.2 10 | ------- 11 | - Updates travis config 12 | - Persistent connections by using requests.Session object 13 | 14 | v 0.8.1 15 | ------- 16 | - coveralls integration 17 | - Use anyjson for searialization 18 | 19 | v 0.8 20 | ----- 21 | - Solr 4 support 22 | - Python 3 fixes 23 | - Test improvements 24 | 25 | v 0.7.3 26 | ------- 27 | - Python 3.3 support 28 | - Documentation updates 29 | 30 | 31 | v 0.7.2 32 | ------- 33 | - Using requests last version 34 | 35 | 36 | v 0.7.1 37 | ------- 38 | - methods for retrieving solrconfig.xml and schema.xml 39 | - HTTP Basic Auth and Digest Auth support 40 | - Bug fixes 41 | 42 | v 0.7 43 | ------ 44 | - mlt support 45 | - Python 2.6 support 46 | - New SolrResponse object that handles exceptions better 47 | - New theme for the documentation 48 | 49 | v 0.6.1 50 | ------- 51 | - Ping command 52 | - Tox integration 53 | - Documentation updates 54 | 55 | v 0.6 56 | ----- 57 | - Bug fixes 58 | - Cursors 59 | - Use OrderedDict for facets 60 | 61 | v 0.5.1 62 | ------- 63 | - Bug fixes 64 | - Travis-ci integration 65 | 66 | v 0.5 67 | ----- 68 | - Python 3.2 compatible 69 | - Documentation: Benchmarks 70 | 71 | v 0.4 72 | ----- 73 | - Concurrent search 74 | - Documentation: Recipes 75 | 76 | v 0.3 77 | ----- 78 | - Spellchecker support 79 | - Highlighting support 80 | 81 | v 0.2 82 | ----- 83 | - Stats module support 84 | - Documentation 85 | - Tests 86 | - 87 | 88 | v 0.1 89 | ----- 90 | - Fully functional Solr interface 91 | - Facets support -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2011 Rubén Abad. All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are 4 | permitted provided that the following conditions are met: 5 | 6 | 1. Redistributions of source code must retain the above copyright notice, this list of 7 | conditions and the following disclaimer. 8 | 9 | 2. Redistributions in binary form must reproduce the above copyright notice, this list 10 | of conditions and the following disclaimer in the documentation and/or other materials 11 | provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY RUBÉN ABAD ``AS IS'' AND ANY EXPRESS OR IMPLIED 14 | WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 15 | FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RUBÉN ABAD OR 16 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 17 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 18 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 19 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 20 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 21 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22 | 23 | The views and conclusions contained in the software and documentation are those of the 24 | authors and should not be interpreted as representing official policies, either expressed 25 | or implied, of Rubén Abad. -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include README.rst LICENSE AUTHORS -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | .. image:: https://secure.travis-ci.org/RedTuna/mysolr.png?branch=master 2 | :target: https://secure.travis-ci.org/RedTuna/mysolr 3 | 4 | .. image:: https://coveralls.io/repos/RedTuna/mysolr/badge.png?branch=dev 5 | :target: https://coveralls.io/r/RedTuna/mysolr?branch=dev 6 | 7 | .. image:: https://pypip.in/d/mysolr/badge.png 8 | :target: https://pypi.python.org/pypi/mysolr/ 9 | 10 | .. image:: https://pypip.in/license/mysolr/badge.png 11 | :target: https://pypi.python.org/pypi/mysolr/ 12 | 13 | 14 | mysolr 15 | ====== 16 | 17 | Fast python solr binding. Check full documentation here_ 18 | 19 | 20 | Features 21 | -------- 22 | 23 | * Full query syntax support 24 | * Facets support 25 | * Highlighting support 26 | * Spellchecker support 27 | * More like this support 28 | * Stats support 29 | * Concurrent searchs 30 | * Python 3 compatible 31 | 32 | 33 | Installation 34 | ------------ 35 | 36 | From source code: :: 37 | 38 | python setup.py install 39 | 40 | From pypi: :: 41 | 42 | pip install mysolr 43 | 44 | 45 | Usage 46 | ----- 47 | :: 48 | 49 | from mysolr import Solr 50 | 51 | # Default connection to localhost:8080 52 | solr = Solr() 53 | 54 | # All solr params are supported! 55 | query = {'q' : '*:*', 'facet' : 'true', 'facet.field' : 'foo'} 56 | response = solr.search(**query) 57 | 58 | # do stuff with documents 59 | for document in response.documents: 60 | # modify field 'foo' 61 | document['foo'] = 'bar' 62 | 63 | # update index with modified documents 64 | solr.update(response.documents, commit=True) 65 | 66 | 67 | .. _here: http://mysolr.redtuna.org 68 | -------------------------------------------------------------------------------- /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) . 14 | 15 | .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest 16 | 17 | help: 18 | @echo "Please use \`make ' where is one of" 19 | @echo " html to make standalone HTML files" 20 | @echo " dirhtml to make HTML files named index.html in directories" 21 | @echo " singlehtml to make a single large HTML file" 22 | @echo " pickle to make pickle files" 23 | @echo " json to make JSON files" 24 | @echo " htmlhelp to make HTML files and a HTML help project" 25 | @echo " qthelp to make HTML files and a qthelp project" 26 | @echo " devhelp to make HTML files and a Devhelp 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 " changes to make an overview of all changed/added/deprecated items" 33 | @echo " linkcheck to check all external links for integrity" 34 | @echo " doctest to run all doctests embedded in the documentation (if enabled)" 35 | 36 | clean: 37 | -rm -rf $(BUILDDIR)/* 38 | 39 | html: 40 | $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html 41 | @echo 42 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." 43 | 44 | dirhtml: 45 | $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml 46 | @echo 47 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." 48 | 49 | singlehtml: 50 | $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml 51 | @echo 52 | @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." 53 | 54 | pickle: 55 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle 56 | @echo 57 | @echo "Build finished; now you can process the pickle files." 58 | 59 | json: 60 | $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json 61 | @echo 62 | @echo "Build finished; now you can process the JSON files." 63 | 64 | htmlhelp: 65 | $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp 66 | @echo 67 | @echo "Build finished; now you can run HTML Help Workshop with the" \ 68 | ".hhp project file in $(BUILDDIR)/htmlhelp." 69 | 70 | qthelp: 71 | $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp 72 | @echo 73 | @echo "Build finished; now you can run "qcollectiongenerator" with the" \ 74 | ".qhcp project file in $(BUILDDIR)/qthelp, like this:" 75 | @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/mysolr.qhcp" 76 | @echo "To view the help file:" 77 | @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/mysolr.qhc" 78 | 79 | devhelp: 80 | $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp 81 | @echo 82 | @echo "Build finished." 83 | @echo "To view the help file:" 84 | @echo "# mkdir -p $$HOME/.local/share/devhelp/mysolr" 85 | @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/mysolr" 86 | @echo "# devhelp" 87 | 88 | epub: 89 | $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub 90 | @echo 91 | @echo "Build finished. The epub file is in $(BUILDDIR)/epub." 92 | 93 | latex: 94 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 95 | @echo 96 | @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." 97 | @echo "Run \`make' in that directory to run these through (pdf)latex" \ 98 | "(use \`make latexpdf' here to do that automatically)." 99 | 100 | latexpdf: 101 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 102 | @echo "Running LaTeX files through pdflatex..." 103 | make -C $(BUILDDIR)/latex all-pdf 104 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." 105 | 106 | text: 107 | $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text 108 | @echo 109 | @echo "Build finished. The text files are in $(BUILDDIR)/text." 110 | 111 | man: 112 | $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man 113 | @echo 114 | @echo "Build finished. The manual pages are in $(BUILDDIR)/man." 115 | 116 | changes: 117 | $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes 118 | @echo 119 | @echo "The overview file is in $(BUILDDIR)/changes." 120 | 121 | linkcheck: 122 | $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck 123 | @echo 124 | @echo "Link check complete; look for any errors in the above output " \ 125 | "or in $(BUILDDIR)/linkcheck/output.txt." 126 | 127 | doctest: 128 | $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest 129 | @echo "Testing of doctests in the sources finished, look at the " \ 130 | "results in $(BUILDDIR)/doctest/output.txt." 131 | -------------------------------------------------------------------------------- /docs/_static/.gitingnore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RedTuna/mysolr/3ed5f4d26b14d4aa20271befea286a80e3679d23/docs/_static/.gitingnore -------------------------------------------------------------------------------- /docs/_templates/.gitingnore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RedTuna/mysolr/3ed5f4d26b14d4aa20271befea286a80e3679d23/docs/_templates/.gitingnore -------------------------------------------------------------------------------- /docs/_templates/sidebarintro.html: -------------------------------------------------------------------------------- 1 | 6 | 7 |

8 | mysolr is a simple Apache Solr library for Python. 9 | You are currently looking at the documentation of the 10 | development release. 11 |

12 | 13 |

14 | 16 |

17 | 18 |

Feedback

19 |

20 | Feedback is greatly appreciated. If you have any questions, comments, 21 | random praise, or anonymous threats, 22 | shoot me an email. 23 |

24 | 25 | 26 |

Useful Links

27 | 33 | -------------------------------------------------------------------------------- /docs/_templates/sidebarlogo.html: -------------------------------------------------------------------------------- 1 | 6 | 7 |

8 | mysolr is a simple Apache Solr library for Python. 9 | You are currently looking at the documentation of the 10 | development release. 11 |

12 | -------------------------------------------------------------------------------- /docs/_themes/.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.pyo 3 | .DS_Store 4 | -------------------------------------------------------------------------------- /docs/_themes/flask_theme_support.py: -------------------------------------------------------------------------------- 1 | # flasky extensions. flasky pygments style based on tango style 2 | from pygments.style import Style 3 | from pygments.token import Keyword, Name, Comment, String, Error, \ 4 | Number, Operator, Generic, Whitespace, Punctuation, Other, Literal 5 | 6 | 7 | class FlaskyStyle(Style): 8 | background_color = "#f8f8f8" 9 | default_style = "" 10 | 11 | styles = { 12 | # No corresponding class for the following: 13 | #Text: "", # class: '' 14 | Whitespace: "underline #f8f8f8", # class: 'w' 15 | Error: "#a40000 border:#ef2929", # class: 'err' 16 | Other: "#000000", # class 'x' 17 | 18 | Comment: "italic #8f5902", # class: 'c' 19 | Comment.Preproc: "noitalic", # class: 'cp' 20 | 21 | Keyword: "bold #004461", # class: 'k' 22 | Keyword.Constant: "bold #004461", # class: 'kc' 23 | Keyword.Declaration: "bold #004461", # class: 'kd' 24 | Keyword.Namespace: "bold #004461", # class: 'kn' 25 | Keyword.Pseudo: "bold #004461", # class: 'kp' 26 | Keyword.Reserved: "bold #004461", # class: 'kr' 27 | Keyword.Type: "bold #004461", # class: 'kt' 28 | 29 | Operator: "#582800", # class: 'o' 30 | Operator.Word: "bold #004461", # class: 'ow' - like keywords 31 | 32 | Punctuation: "bold #000000", # class: 'p' 33 | 34 | # because special names such as Name.Class, Name.Function, etc. 35 | # are not recognized as such later in the parsing, we choose them 36 | # to look the same as ordinary variables. 37 | Name: "#000000", # class: 'n' 38 | Name.Attribute: "#c4a000", # class: 'na' - to be revised 39 | Name.Builtin: "#004461", # class: 'nb' 40 | Name.Builtin.Pseudo: "#3465a4", # class: 'bp' 41 | Name.Class: "#000000", # class: 'nc' - to be revised 42 | Name.Constant: "#000000", # class: 'no' - to be revised 43 | Name.Decorator: "#888", # class: 'nd' - to be revised 44 | Name.Entity: "#ce5c00", # class: 'ni' 45 | Name.Exception: "bold #cc0000", # class: 'ne' 46 | Name.Function: "#000000", # class: 'nf' 47 | Name.Property: "#000000", # class: 'py' 48 | Name.Label: "#f57900", # class: 'nl' 49 | Name.Namespace: "#000000", # class: 'nn' - to be revised 50 | Name.Other: "#000000", # class: 'nx' 51 | Name.Tag: "bold #004461", # class: 'nt' - like a keyword 52 | Name.Variable: "#000000", # class: 'nv' - to be revised 53 | Name.Variable.Class: "#000000", # class: 'vc' - to be revised 54 | Name.Variable.Global: "#000000", # class: 'vg' - to be revised 55 | Name.Variable.Instance: "#000000", # class: 'vi' - to be revised 56 | 57 | Number: "#990000", # class: 'm' 58 | 59 | Literal: "#000000", # class: 'l' 60 | Literal.Date: "#000000", # class: 'ld' 61 | 62 | String: "#4e9a06", # class: 's' 63 | String.Backtick: "#4e9a06", # class: 'sb' 64 | String.Char: "#4e9a06", # class: 'sc' 65 | String.Doc: "italic #8f5902", # class: 'sd' - like a comment 66 | String.Double: "#4e9a06", # class: 's2' 67 | String.Escape: "#4e9a06", # class: 'se' 68 | String.Heredoc: "#4e9a06", # class: 'sh' 69 | String.Interpol: "#4e9a06", # class: 'si' 70 | String.Other: "#4e9a06", # class: 'sx' 71 | String.Regex: "#4e9a06", # class: 'sr' 72 | String.Single: "#4e9a06", # class: 's1' 73 | String.Symbol: "#4e9a06", # class: 'ss' 74 | 75 | Generic: "#000000", # class: 'g' 76 | Generic.Deleted: "#a40000", # class: 'gd' 77 | Generic.Emph: "italic #000000", # class: 'ge' 78 | Generic.Error: "#ef2929", # class: 'gr' 79 | Generic.Heading: "bold #000080", # class: 'gh' 80 | Generic.Inserted: "#00A000", # class: 'gi' 81 | Generic.Output: "#888", # class: 'go' 82 | Generic.Prompt: "#745334", # class: 'gp' 83 | Generic.Strong: "bold #000000", # class: 'gs' 84 | Generic.Subheading: "bold #800080", # class: 'gu' 85 | Generic.Traceback: "bold #a40000", # class: 'gt' 86 | } 87 | -------------------------------------------------------------------------------- /docs/_themes/mysolr/flask_theme_support.py: -------------------------------------------------------------------------------- 1 | # flasky extensions. flasky pygments style based on tango style 2 | from pygments.style import Style 3 | from pygments.token import Keyword, Name, Comment, String, Error, \ 4 | Number, Operator, Generic, Whitespace, Punctuation, Other, Literal 5 | 6 | 7 | class FlaskyStyle(Style): 8 | background_color = "#f8f8f8" 9 | default_style = "" 10 | 11 | styles = { 12 | # No corresponding class for the following: 13 | #Text: "", # class: '' 14 | Whitespace: "underline #f8f8f8", # class: 'w' 15 | Error: "#a40000 border:#ef2929", # class: 'err' 16 | Other: "#000000", # class 'x' 17 | 18 | Comment: "italic #8f5902", # class: 'c' 19 | Comment.Preproc: "noitalic", # class: 'cp' 20 | 21 | Keyword: "bold #004461", # class: 'k' 22 | Keyword.Constant: "bold #004461", # class: 'kc' 23 | Keyword.Declaration: "bold #004461", # class: 'kd' 24 | Keyword.Namespace: "bold #004461", # class: 'kn' 25 | Keyword.Pseudo: "bold #004461", # class: 'kp' 26 | Keyword.Reserved: "bold #004461", # class: 'kr' 27 | Keyword.Type: "bold #004461", # class: 'kt' 28 | 29 | Operator: "#582800", # class: 'o' 30 | Operator.Word: "bold #004461", # class: 'ow' - like keywords 31 | 32 | Punctuation: "bold #000000", # class: 'p' 33 | 34 | # because special names such as Name.Class, Name.Function, etc. 35 | # are not recognized as such later in the parsing, we choose them 36 | # to look the same as ordinary variables. 37 | Name: "#000000", # class: 'n' 38 | Name.Attribute: "#c4a000", # class: 'na' - to be revised 39 | Name.Builtin: "#004461", # class: 'nb' 40 | Name.Builtin.Pseudo: "#3465a4", # class: 'bp' 41 | Name.Class: "#000000", # class: 'nc' - to be revised 42 | Name.Constant: "#000000", # class: 'no' - to be revised 43 | Name.Decorator: "#888", # class: 'nd' - to be revised 44 | Name.Entity: "#ce5c00", # class: 'ni' 45 | Name.Exception: "bold #cc0000", # class: 'ne' 46 | Name.Function: "#000000", # class: 'nf' 47 | Name.Property: "#000000", # class: 'py' 48 | Name.Label: "#f57900", # class: 'nl' 49 | Name.Namespace: "#000000", # class: 'nn' - to be revised 50 | Name.Other: "#000000", # class: 'nx' 51 | Name.Tag: "bold #004461", # class: 'nt' - like a keyword 52 | Name.Variable: "#000000", # class: 'nv' - to be revised 53 | Name.Variable.Class: "#000000", # class: 'vc' - to be revised 54 | Name.Variable.Global: "#000000", # class: 'vg' - to be revised 55 | Name.Variable.Instance: "#000000", # class: 'vi' - to be revised 56 | 57 | Number: "#990000", # class: 'm' 58 | 59 | Literal: "#000000", # class: 'l' 60 | Literal.Date: "#000000", # class: 'ld' 61 | 62 | String: "#4e9a06", # class: 's' 63 | String.Backtick: "#4e9a06", # class: 'sb' 64 | String.Char: "#4e9a06", # class: 'sc' 65 | String.Doc: "italic #8f5902", # class: 'sd' - like a comment 66 | String.Double: "#4e9a06", # class: 's2' 67 | String.Escape: "#4e9a06", # class: 'se' 68 | String.Heredoc: "#4e9a06", # class: 'sh' 69 | String.Interpol: "#4e9a06", # class: 'si' 70 | String.Other: "#4e9a06", # class: 'sx' 71 | String.Regex: "#4e9a06", # class: 'sr' 72 | String.Single: "#4e9a06", # class: 's1' 73 | String.Symbol: "#4e9a06", # class: 'ss' 74 | 75 | Generic: "#000000", # class: 'g' 76 | Generic.Deleted: "#a40000", # class: 'gd' 77 | Generic.Emph: "italic #000000", # class: 'ge' 78 | Generic.Error: "#ef2929", # class: 'gr' 79 | Generic.Heading: "bold #000080", # class: 'gh' 80 | Generic.Inserted: "#00A000", # class: 'gi' 81 | Generic.Output: "#888", # class: 'go' 82 | Generic.Prompt: "#745334", # class: 'gp' 83 | Generic.Strong: "bold #000000", # class: 'gs' 84 | Generic.Subheading: "bold #800080", # class: 'gu' 85 | Generic.Traceback: "bold #a40000", # class: 'gt' 86 | } 87 | -------------------------------------------------------------------------------- /docs/_themes/mysolr/layout.html: -------------------------------------------------------------------------------- 1 | {%- extends "basic/layout.html" %} 2 | 3 | {%- macro nav() %} 4 | 27 | {%- endmacro %} 28 | 29 | {%- macro mysidebar() %} 30 |
31 | 38 |
39 | {%- endmacro %} 40 | 41 | {%- block extrahead %} 42 | 63 | 71 | {% endblock %} 72 | 73 | {%- block relbar1 %}{{ nav() }}{% endblock %} 74 | {%- block relbar2 %}{% endblock %} 75 | 76 | {%- block content %} 77 | 78 |
79 | {%- block document %} 80 |
81 | {%- block sidebar2 %}{{ mysidebar() }}{% endblock %} 82 |
83 | {% block body %} {% endblock %} 84 |
85 |
86 | {%- endblock %} 87 |
88 | 105 |
106 | {%- endblock %} 107 | {%- block footer %} 108 | {%- if theme_github %} 109 | 110 | Fork me on GitHub 111 | 112 | {% endif %} 113 | {%- endblock %} -------------------------------------------------------------------------------- /docs/_themes/mysolr/static/bootstrap.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v2.0.4 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 | article, 12 | aside, 13 | details, 14 | figcaption, 15 | figure, 16 | footer, 17 | header, 18 | hgroup, 19 | nav, 20 | section { 21 | display: block; 22 | } 23 | 24 | audio, 25 | canvas, 26 | video { 27 | display: inline-block; 28 | *display: inline; 29 | *zoom: 1; 30 | } 31 | 32 | audio:not([controls]) { 33 | display: none; 34 | } 35 | 36 | html { 37 | font-size: 100%; 38 | -webkit-text-size-adjust: 100%; 39 | -ms-text-size-adjust: 100%; 40 | } 41 | 42 | a:focus { 43 | outline: thin dotted #333; 44 | outline: 5px auto -webkit-focus-ring-color; 45 | outline-offset: -2px; 46 | } 47 | 48 | a:hover, 49 | a:active { 50 | outline: 0; 51 | } 52 | 53 | sub, 54 | sup { 55 | position: relative; 56 | font-size: 75%; 57 | line-height: 0; 58 | vertical-align: baseline; 59 | } 60 | 61 | sup { 62 | top: -0.5em; 63 | } 64 | 65 | sub { 66 | bottom: -0.25em; 67 | } 68 | 69 | img { 70 | max-width: 100%; 71 | vertical-align: middle; 72 | border: 0; 73 | -ms-interpolation-mode: bicubic; 74 | } 75 | 76 | #map_canvas img { 77 | max-width: none; 78 | } 79 | 80 | button, 81 | input, 82 | select, 83 | textarea { 84 | margin: 0; 85 | font-size: 100%; 86 | vertical-align: middle; 87 | } 88 | 89 | button, 90 | input { 91 | *overflow: visible; 92 | line-height: normal; 93 | } 94 | 95 | button::-moz-focus-inner, 96 | input::-moz-focus-inner { 97 | padding: 0; 98 | border: 0; 99 | } 100 | 101 | button, 102 | input[type="button"], 103 | input[type="reset"], 104 | input[type="submit"] { 105 | cursor: pointer; 106 | -webkit-appearance: button; 107 | } 108 | 109 | input[type="search"] { 110 | -webkit-box-sizing: content-box; 111 | -moz-box-sizing: content-box; 112 | box-sizing: content-box; 113 | -webkit-appearance: textfield; 114 | } 115 | 116 | input[type="search"]::-webkit-search-decoration, 117 | input[type="search"]::-webkit-search-cancel-button { 118 | -webkit-appearance: none; 119 | } 120 | 121 | textarea { 122 | overflow: auto; 123 | vertical-align: top; 124 | } 125 | 126 | .clearfix { 127 | *zoom: 1; 128 | } 129 | 130 | .clearfix:before, 131 | .clearfix:after { 132 | display: table; 133 | content: ""; 134 | } 135 | 136 | .clearfix:after { 137 | clear: both; 138 | } 139 | 140 | .hide-text { 141 | font: 0/0 a; 142 | color: transparent; 143 | text-shadow: none; 144 | background-color: transparent; 145 | border: 0; 146 | } 147 | 148 | .input-block-level { 149 | display: block; 150 | width: 100%; 151 | min-height: 28px; 152 | -webkit-box-sizing: border-box; 153 | -moz-box-sizing: border-box; 154 | -ms-box-sizing: border-box; 155 | box-sizing: border-box; 156 | } 157 | 158 | body { 159 | margin: 0; 160 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 161 | font-size: 13px; 162 | line-height: 18px; 163 | color: #333333; 164 | background-color: #ffffff; 165 | } 166 | 167 | a { 168 | color: #0088cc; 169 | text-decoration: none; 170 | } 171 | 172 | a:hover { 173 | color: #005580; 174 | text-decoration: underline; 175 | } 176 | 177 | .row { 178 | margin-left: -20px; 179 | *zoom: 1; 180 | } 181 | 182 | .row:before, 183 | .row:after { 184 | display: table; 185 | content: ""; 186 | } 187 | 188 | .row:after { 189 | clear: both; 190 | } 191 | 192 | [class*="span"] { 193 | float: left; 194 | margin-left: 20px; 195 | } 196 | 197 | .container, 198 | .navbar-fixed-top .container, 199 | .navbar-fixed-bottom .container { 200 | width: 940px; 201 | } 202 | 203 | .span12 { 204 | width: 940px; 205 | } 206 | 207 | .span11 { 208 | width: 860px; 209 | } 210 | 211 | .span10 { 212 | width: 780px; 213 | } 214 | 215 | .span9 { 216 | width: 700px; 217 | } 218 | 219 | .span8 { 220 | width: 620px; 221 | } 222 | 223 | .span7 { 224 | width: 540px; 225 | } 226 | 227 | .span6 { 228 | width: 460px; 229 | } 230 | 231 | .span5 { 232 | width: 380px; 233 | } 234 | 235 | .span4 { 236 | width: 300px; 237 | } 238 | 239 | .span3 { 240 | width: 220px; 241 | } 242 | 243 | .span2 { 244 | width: 140px; 245 | } 246 | 247 | .span1 { 248 | width: 60px; 249 | } 250 | 251 | .offset12 { 252 | margin-left: 980px; 253 | } 254 | 255 | .offset11 { 256 | margin-left: 900px; 257 | } 258 | 259 | .offset10 { 260 | margin-left: 820px; 261 | } 262 | 263 | .offset9 { 264 | margin-left: 740px; 265 | } 266 | 267 | .offset8 { 268 | margin-left: 660px; 269 | } 270 | 271 | .offset7 { 272 | margin-left: 580px; 273 | } 274 | 275 | .offset6 { 276 | margin-left: 500px; 277 | } 278 | 279 | .offset5 { 280 | margin-left: 420px; 281 | } 282 | 283 | .offset4 { 284 | margin-left: 340px; 285 | } 286 | 287 | .offset3 { 288 | margin-left: 260px; 289 | } 290 | 291 | .offset2 { 292 | margin-left: 180px; 293 | } 294 | 295 | .offset1 { 296 | margin-left: 100px; 297 | } 298 | 299 | .row-fluid { 300 | width: 100%; 301 | *zoom: 1; 302 | } 303 | 304 | .row-fluid:before, 305 | .row-fluid:after { 306 | display: table; 307 | content: ""; 308 | } 309 | 310 | .row-fluid:after { 311 | clear: both; 312 | } 313 | 314 | .row-fluid [class*="span"] { 315 | display: block; 316 | float: left; 317 | width: 100%; 318 | min-height: 28px; 319 | margin-left: 2.127659574%; 320 | *margin-left: 2.0744680846382977%; 321 | -webkit-box-sizing: border-box; 322 | -moz-box-sizing: border-box; 323 | -ms-box-sizing: border-box; 324 | box-sizing: border-box; 325 | } 326 | 327 | .row-fluid [class*="span"]:first-child { 328 | margin-left: 0; 329 | } 330 | 331 | .row-fluid .span12 { 332 | width: 99.99999998999999%; 333 | *width: 99.94680850063828%; 334 | } 335 | 336 | .row-fluid .span11 { 337 | width: 91.489361693%; 338 | *width: 91.4361702036383%; 339 | } 340 | 341 | .row-fluid .span10 { 342 | width: 82.97872339599999%; 343 | *width: 82.92553190663828%; 344 | } 345 | 346 | .row-fluid .span9 { 347 | width: 74.468085099%; 348 | *width: 74.4148936096383%; 349 | } 350 | 351 | .row-fluid .span8 { 352 | width: 65.95744680199999%; 353 | *width: 65.90425531263828%; 354 | } 355 | 356 | .row-fluid .span7 { 357 | width: 57.446808505%; 358 | *width: 57.3936170156383%; 359 | } 360 | 361 | .row-fluid .span6 { 362 | width: 48.93617020799999%; 363 | *width: 48.88297871863829%; 364 | } 365 | 366 | .row-fluid .span5 { 367 | width: 40.425531911%; 368 | *width: 40.3723404216383%; 369 | } 370 | 371 | .row-fluid .span4 { 372 | width: 31.914893614%; 373 | *width: 31.8617021246383%; 374 | } 375 | 376 | .row-fluid .span3 { 377 | width: 23.404255317%; 378 | *width: 23.3510638276383%; 379 | } 380 | 381 | .row-fluid .span2 { 382 | width: 14.89361702%; 383 | *width: 14.8404255306383%; 384 | } 385 | 386 | .row-fluid .span1 { 387 | width: 6.382978723%; 388 | *width: 6.329787233638298%; 389 | } 390 | 391 | .container { 392 | margin-right: auto; 393 | margin-left: auto; 394 | *zoom: 1; 395 | } 396 | 397 | .container:before, 398 | .container:after { 399 | display: table; 400 | content: ""; 401 | } 402 | 403 | .container:after { 404 | clear: both; 405 | } 406 | 407 | .container-fluid { 408 | padding-right: 20px; 409 | padding-left: 20px; 410 | *zoom: 1; 411 | } 412 | 413 | .container-fluid:before, 414 | .container-fluid:after { 415 | display: table; 416 | content: ""; 417 | } 418 | 419 | .container-fluid:after { 420 | clear: both; 421 | } 422 | 423 | p { 424 | margin: 0 0 9px; 425 | } 426 | 427 | p small { 428 | font-size: 11px; 429 | color: #999999; 430 | } 431 | 432 | .lead { 433 | margin-bottom: 18px; 434 | font-size: 20px; 435 | font-weight: 200; 436 | line-height: 27px; 437 | } 438 | 439 | h1, 440 | h2, 441 | h3, 442 | h4, 443 | h5, 444 | h6 { 445 | margin: 0; 446 | font-family: inherit; 447 | font-weight: bold; 448 | color: inherit; 449 | text-rendering: optimizelegibility; 450 | } 451 | 452 | h1 small, 453 | h2 small, 454 | h3 small, 455 | h4 small, 456 | h5 small, 457 | h6 small { 458 | font-weight: normal; 459 | color: #999999; 460 | } 461 | 462 | h1 { 463 | font-size: 30px; 464 | line-height: 36px; 465 | } 466 | 467 | h1 small { 468 | font-size: 18px; 469 | } 470 | 471 | h2 { 472 | font-size: 24px; 473 | line-height: 36px; 474 | } 475 | 476 | h2 small { 477 | font-size: 18px; 478 | } 479 | 480 | h3 { 481 | font-size: 18px; 482 | line-height: 27px; 483 | } 484 | 485 | h3 small { 486 | font-size: 14px; 487 | } 488 | 489 | h4, 490 | h5, 491 | h6 { 492 | line-height: 18px; 493 | } 494 | 495 | h4 { 496 | font-size: 14px; 497 | } 498 | 499 | h4 small { 500 | font-size: 12px; 501 | } 502 | 503 | h5 { 504 | font-size: 12px; 505 | } 506 | 507 | h6 { 508 | font-size: 11px; 509 | color: #999999; 510 | text-transform: uppercase; 511 | } 512 | 513 | .page-header { 514 | padding-bottom: 17px; 515 | margin: 18px 0; 516 | border-bottom: 1px solid #eeeeee; 517 | } 518 | 519 | .page-header h1 { 520 | line-height: 1; 521 | } 522 | 523 | ul, 524 | ol { 525 | padding: 0; 526 | margin: 0 0 9px 25px; 527 | } 528 | 529 | ul ul, 530 | ul ol, 531 | ol ol, 532 | ol ul { 533 | margin-bottom: 0; 534 | } 535 | 536 | ul { 537 | list-style: disc; 538 | } 539 | 540 | ol { 541 | list-style: decimal; 542 | } 543 | 544 | li { 545 | line-height: 18px; 546 | } 547 | 548 | ul.unstyled, 549 | ol.unstyled { 550 | margin-left: 0; 551 | list-style: none; 552 | } 553 | 554 | dl { 555 | margin-bottom: 18px; 556 | } 557 | 558 | dt, 559 | dd { 560 | line-height: 18px; 561 | } 562 | 563 | dt { 564 | font-weight: bold; 565 | line-height: 17px; 566 | } 567 | 568 | dd { 569 | margin-left: 9px; 570 | } 571 | 572 | .dl-horizontal dt { 573 | float: left; 574 | width: 120px; 575 | overflow: hidden; 576 | clear: left; 577 | text-align: right; 578 | text-overflow: ellipsis; 579 | white-space: nowrap; 580 | } 581 | 582 | .dl-horizontal dd { 583 | margin-left: 130px; 584 | } 585 | 586 | hr { 587 | margin: 18px 0; 588 | border: 0; 589 | border-top: 1px solid #eeeeee; 590 | border-bottom: 1px solid #ffffff; 591 | } 592 | 593 | strong { 594 | font-weight: bold; 595 | } 596 | 597 | em { 598 | font-style: italic; 599 | } 600 | 601 | .muted { 602 | color: #999999; 603 | } 604 | 605 | abbr[title] { 606 | cursor: help; 607 | border-bottom: 1px dotted #999999; 608 | } 609 | 610 | abbr.initialism { 611 | font-size: 90%; 612 | text-transform: uppercase; 613 | } 614 | 615 | blockquote { 616 | padding: 0 0 0 15px; 617 | margin: 0 0 18px; 618 | border-left: 5px solid #eeeeee; 619 | } 620 | 621 | blockquote p { 622 | margin-bottom: 0; 623 | font-size: 16px; 624 | font-weight: 300; 625 | line-height: 22.5px; 626 | } 627 | 628 | blockquote small { 629 | display: block; 630 | line-height: 18px; 631 | color: #999999; 632 | } 633 | 634 | blockquote small:before { 635 | content: '\2014 \00A0'; 636 | } 637 | 638 | blockquote.pull-right { 639 | float: right; 640 | padding-right: 15px; 641 | padding-left: 0; 642 | border-right: 5px solid #eeeeee; 643 | border-left: 0; 644 | } 645 | 646 | blockquote.pull-right p, 647 | blockquote.pull-right small { 648 | text-align: right; 649 | } 650 | 651 | q:before, 652 | q:after, 653 | blockquote:before, 654 | blockquote:after { 655 | content: ""; 656 | } 657 | 658 | address { 659 | display: block; 660 | margin-bottom: 18px; 661 | font-style: normal; 662 | line-height: 18px; 663 | } 664 | 665 | small { 666 | font-size: 100%; 667 | } 668 | 669 | cite { 670 | font-style: normal; 671 | } 672 | 673 | code, 674 | pre { 675 | padding: 0 3px 2px; 676 | font-family: Menlo, Monaco, Consolas, "Courier New", monospace; 677 | font-size: 12px; 678 | color: #333333; 679 | -webkit-border-radius: 3px; 680 | -moz-border-radius: 3px; 681 | border-radius: 3px; 682 | } 683 | 684 | code { 685 | padding: 2px 4px; 686 | color: #d14; 687 | background-color: #f7f7f9; 688 | border: 1px solid #e1e1e8; 689 | } 690 | 691 | pre { 692 | display: block; 693 | padding: 8.5px; 694 | margin: 0 0 9px; 695 | font-size: 12.025px; 696 | line-height: 18px; 697 | word-break: break-all; 698 | word-wrap: break-word; 699 | white-space: pre; 700 | white-space: pre-wrap; 701 | background-color: #f5f5f5; 702 | border: 1px solid #ccc; 703 | border: 1px solid rgba(0, 0, 0, 0.15); 704 | -webkit-border-radius: 4px; 705 | -moz-border-radius: 4px; 706 | border-radius: 4px; 707 | } 708 | 709 | pre.prettyprint { 710 | margin-bottom: 18px; 711 | } 712 | 713 | pre code { 714 | padding: 0; 715 | color: inherit; 716 | background-color: transparent; 717 | border: 0; 718 | } 719 | 720 | .pre-scrollable { 721 | max-height: 340px; 722 | overflow-y: scroll; 723 | } 724 | 725 | form { 726 | margin: 0 0 18px; 727 | } 728 | 729 | fieldset { 730 | padding: 0; 731 | margin: 0; 732 | border: 0; 733 | } 734 | 735 | legend { 736 | display: block; 737 | width: 100%; 738 | padding: 0; 739 | margin-bottom: 27px; 740 | font-size: 19.5px; 741 | line-height: 36px; 742 | color: #333333; 743 | border: 0; 744 | border-bottom: 1px solid #e5e5e5; 745 | } 746 | 747 | legend small { 748 | font-size: 13.5px; 749 | color: #999999; 750 | } 751 | 752 | label, 753 | input, 754 | button, 755 | select, 756 | textarea { 757 | font-size: 13px; 758 | font-weight: normal; 759 | line-height: 18px; 760 | } 761 | 762 | input, 763 | button, 764 | select, 765 | textarea { 766 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 767 | } 768 | 769 | label { 770 | display: block; 771 | margin-bottom: 5px; 772 | } 773 | 774 | select, 775 | textarea, 776 | input[type="text"], 777 | input[type="password"], 778 | input[type="datetime"], 779 | input[type="datetime-local"], 780 | input[type="date"], 781 | input[type="month"], 782 | input[type="time"], 783 | input[type="week"], 784 | input[type="number"], 785 | input[type="email"], 786 | input[type="url"], 787 | input[type="search"], 788 | input[type="tel"], 789 | input[type="color"], 790 | .uneditable-input { 791 | display: inline-block; 792 | height: 18px; 793 | padding: 4px; 794 | margin-bottom: 9px; 795 | font-size: 13px; 796 | line-height: 18px; 797 | color: #555555; 798 | } 799 | 800 | input, 801 | textarea { 802 | width: 210px; 803 | } 804 | 805 | textarea { 806 | height: auto; 807 | } 808 | 809 | textarea, 810 | input[type="text"], 811 | input[type="password"], 812 | input[type="datetime"], 813 | input[type="datetime-local"], 814 | input[type="date"], 815 | input[type="month"], 816 | input[type="time"], 817 | input[type="week"], 818 | input[type="number"], 819 | input[type="email"], 820 | input[type="url"], 821 | input[type="search"], 822 | input[type="tel"], 823 | input[type="color"], 824 | .uneditable-input { 825 | background-color: #ffffff; 826 | border: 1px solid #cccccc; 827 | -webkit-border-radius: 3px; 828 | -moz-border-radius: 3px; 829 | border-radius: 3px; 830 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 831 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 832 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 833 | -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; 834 | -moz-transition: border linear 0.2s, box-shadow linear 0.2s; 835 | -ms-transition: border linear 0.2s, box-shadow linear 0.2s; 836 | -o-transition: border linear 0.2s, box-shadow linear 0.2s; 837 | transition: border linear 0.2s, box-shadow linear 0.2s; 838 | } 839 | 840 | textarea:focus, 841 | input[type="text"]:focus, 842 | input[type="password"]:focus, 843 | input[type="datetime"]:focus, 844 | input[type="datetime-local"]:focus, 845 | input[type="date"]:focus, 846 | input[type="month"]:focus, 847 | input[type="time"]:focus, 848 | input[type="week"]:focus, 849 | input[type="number"]:focus, 850 | input[type="email"]:focus, 851 | input[type="url"]:focus, 852 | input[type="search"]:focus, 853 | input[type="tel"]:focus, 854 | input[type="color"]:focus, 855 | .uneditable-input:focus { 856 | border-color: rgba(82, 168, 236, 0.8); 857 | outline: 0; 858 | outline: thin dotted \9; 859 | /* IE6-9 */ 860 | 861 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); 862 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); 863 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); 864 | } 865 | 866 | input[type="radio"], 867 | input[type="checkbox"] { 868 | margin: 3px 0; 869 | *margin-top: 0; 870 | /* IE7 */ 871 | 872 | line-height: normal; 873 | cursor: pointer; 874 | } 875 | 876 | input[type="submit"], 877 | input[type="reset"], 878 | input[type="button"], 879 | input[type="radio"], 880 | input[type="checkbox"] { 881 | width: auto; 882 | } 883 | 884 | .uneditable-textarea { 885 | width: auto; 886 | height: auto; 887 | } 888 | 889 | select, 890 | input[type="file"] { 891 | height: 28px; 892 | /* In IE7, the height of the select element cannot be changed by height, only font-size */ 893 | 894 | *margin-top: 4px; 895 | /* For IE7, add top margin to align select with labels */ 896 | 897 | line-height: 28px; 898 | } 899 | 900 | select { 901 | width: 220px; 902 | border: 1px solid #bbb; 903 | } 904 | 905 | select[multiple], 906 | select[size] { 907 | height: auto; 908 | } 909 | 910 | select:focus, 911 | input[type="file"]:focus, 912 | input[type="radio"]:focus, 913 | input[type="checkbox"]:focus { 914 | outline: thin dotted #333; 915 | outline: 5px auto -webkit-focus-ring-color; 916 | outline-offset: -2px; 917 | } 918 | 919 | .radio, 920 | .checkbox { 921 | min-height: 18px; 922 | padding-left: 18px; 923 | } 924 | 925 | .radio input[type="radio"], 926 | .checkbox input[type="checkbox"] { 927 | float: left; 928 | margin-left: -18px; 929 | } 930 | 931 | .controls > .radio:first-child, 932 | .controls > .checkbox:first-child { 933 | padding-top: 5px; 934 | } 935 | 936 | .radio.inline, 937 | .checkbox.inline { 938 | display: inline-block; 939 | padding-top: 5px; 940 | margin-bottom: 0; 941 | vertical-align: middle; 942 | } 943 | 944 | .radio.inline + .radio.inline, 945 | .checkbox.inline + .checkbox.inline { 946 | margin-left: 10px; 947 | } 948 | 949 | .input-mini { 950 | width: 60px; 951 | } 952 | 953 | .input-small { 954 | width: 90px; 955 | } 956 | 957 | .input-medium { 958 | width: 150px; 959 | } 960 | 961 | .input-large { 962 | width: 210px; 963 | } 964 | 965 | .input-xlarge { 966 | width: 270px; 967 | } 968 | 969 | .input-xxlarge { 970 | width: 530px; 971 | } 972 | 973 | input[class*="span"], 974 | select[class*="span"], 975 | textarea[class*="span"], 976 | .uneditable-input[class*="span"], 977 | .row-fluid input[class*="span"], 978 | .row-fluid select[class*="span"], 979 | .row-fluid textarea[class*="span"], 980 | .row-fluid .uneditable-input[class*="span"] { 981 | float: none; 982 | margin-left: 0; 983 | } 984 | 985 | .input-append input[class*="span"], 986 | .input-append .uneditable-input[class*="span"], 987 | .input-prepend input[class*="span"], 988 | .input-prepend .uneditable-input[class*="span"], 989 | .row-fluid .input-prepend [class*="span"], 990 | .row-fluid .input-append [class*="span"] { 991 | display: inline-block; 992 | } 993 | 994 | input, 995 | textarea, 996 | .uneditable-input { 997 | margin-left: 0; 998 | } 999 | 1000 | input.span12, 1001 | textarea.span12, 1002 | .uneditable-input.span12 { 1003 | width: 930px; 1004 | } 1005 | 1006 | input.span11, 1007 | textarea.span11, 1008 | .uneditable-input.span11 { 1009 | width: 850px; 1010 | } 1011 | 1012 | input.span10, 1013 | textarea.span10, 1014 | .uneditable-input.span10 { 1015 | width: 770px; 1016 | } 1017 | 1018 | input.span9, 1019 | textarea.span9, 1020 | .uneditable-input.span9 { 1021 | width: 690px; 1022 | } 1023 | 1024 | input.span8, 1025 | textarea.span8, 1026 | .uneditable-input.span8 { 1027 | width: 610px; 1028 | } 1029 | 1030 | input.span7, 1031 | textarea.span7, 1032 | .uneditable-input.span7 { 1033 | width: 530px; 1034 | } 1035 | 1036 | input.span6, 1037 | textarea.span6, 1038 | .uneditable-input.span6 { 1039 | width: 450px; 1040 | } 1041 | 1042 | input.span5, 1043 | textarea.span5, 1044 | .uneditable-input.span5 { 1045 | width: 370px; 1046 | } 1047 | 1048 | input.span4, 1049 | textarea.span4, 1050 | .uneditable-input.span4 { 1051 | width: 290px; 1052 | } 1053 | 1054 | input.span3, 1055 | textarea.span3, 1056 | .uneditable-input.span3 { 1057 | width: 210px; 1058 | } 1059 | 1060 | input.span2, 1061 | textarea.span2, 1062 | .uneditable-input.span2 { 1063 | width: 130px; 1064 | } 1065 | 1066 | input.span1, 1067 | textarea.span1, 1068 | .uneditable-input.span1 { 1069 | width: 50px; 1070 | } 1071 | 1072 | input[disabled], 1073 | select[disabled], 1074 | textarea[disabled], 1075 | input[readonly], 1076 | select[readonly], 1077 | textarea[readonly] { 1078 | cursor: not-allowed; 1079 | background-color: #eeeeee; 1080 | border-color: #ddd; 1081 | } 1082 | 1083 | input[type="radio"][disabled], 1084 | input[type="checkbox"][disabled], 1085 | input[type="radio"][readonly], 1086 | input[type="checkbox"][readonly] { 1087 | background-color: transparent; 1088 | } 1089 | 1090 | .control-group.warning > label, 1091 | .control-group.warning .help-block, 1092 | .control-group.warning .help-inline { 1093 | color: #c09853; 1094 | } 1095 | 1096 | .control-group.warning .checkbox, 1097 | .control-group.warning .radio, 1098 | .control-group.warning input, 1099 | .control-group.warning select, 1100 | .control-group.warning textarea { 1101 | color: #c09853; 1102 | border-color: #c09853; 1103 | } 1104 | 1105 | .control-group.warning .checkbox:focus, 1106 | .control-group.warning .radio:focus, 1107 | .control-group.warning input:focus, 1108 | .control-group.warning select:focus, 1109 | .control-group.warning textarea:focus { 1110 | border-color: #a47e3c; 1111 | -webkit-box-shadow: 0 0 6px #dbc59e; 1112 | -moz-box-shadow: 0 0 6px #dbc59e; 1113 | box-shadow: 0 0 6px #dbc59e; 1114 | } 1115 | 1116 | .control-group.warning .input-prepend .add-on, 1117 | .control-group.warning .input-append .add-on { 1118 | color: #c09853; 1119 | background-color: #fcf8e3; 1120 | border-color: #c09853; 1121 | } 1122 | 1123 | .control-group.error > label, 1124 | .control-group.error .help-block, 1125 | .control-group.error .help-inline { 1126 | color: #b94a48; 1127 | } 1128 | 1129 | .control-group.error .checkbox, 1130 | .control-group.error .radio, 1131 | .control-group.error input, 1132 | .control-group.error select, 1133 | .control-group.error textarea { 1134 | color: #b94a48; 1135 | border-color: #b94a48; 1136 | } 1137 | 1138 | .control-group.error .checkbox:focus, 1139 | .control-group.error .radio:focus, 1140 | .control-group.error input:focus, 1141 | .control-group.error select:focus, 1142 | .control-group.error textarea:focus { 1143 | border-color: #953b39; 1144 | -webkit-box-shadow: 0 0 6px #d59392; 1145 | -moz-box-shadow: 0 0 6px #d59392; 1146 | box-shadow: 0 0 6px #d59392; 1147 | } 1148 | 1149 | .control-group.error .input-prepend .add-on, 1150 | .control-group.error .input-append .add-on { 1151 | color: #b94a48; 1152 | background-color: #f2dede; 1153 | border-color: #b94a48; 1154 | } 1155 | 1156 | .control-group.success > label, 1157 | .control-group.success .help-block, 1158 | .control-group.success .help-inline { 1159 | color: #468847; 1160 | } 1161 | 1162 | .control-group.success .checkbox, 1163 | .control-group.success .radio, 1164 | .control-group.success input, 1165 | .control-group.success select, 1166 | .control-group.success textarea { 1167 | color: #468847; 1168 | border-color: #468847; 1169 | } 1170 | 1171 | .control-group.success .checkbox:focus, 1172 | .control-group.success .radio:focus, 1173 | .control-group.success input:focus, 1174 | .control-group.success select:focus, 1175 | .control-group.success textarea:focus { 1176 | border-color: #356635; 1177 | -webkit-box-shadow: 0 0 6px #7aba7b; 1178 | -moz-box-shadow: 0 0 6px #7aba7b; 1179 | box-shadow: 0 0 6px #7aba7b; 1180 | } 1181 | 1182 | .control-group.success .input-prepend .add-on, 1183 | .control-group.success .input-append .add-on { 1184 | color: #468847; 1185 | background-color: #dff0d8; 1186 | border-color: #468847; 1187 | } 1188 | 1189 | input:focus:required:invalid, 1190 | textarea:focus:required:invalid, 1191 | select:focus:required:invalid { 1192 | color: #b94a48; 1193 | border-color: #ee5f5b; 1194 | } 1195 | 1196 | input:focus:required:invalid:focus, 1197 | textarea:focus:required:invalid:focus, 1198 | select:focus:required:invalid:focus { 1199 | border-color: #e9322d; 1200 | -webkit-box-shadow: 0 0 6px #f8b9b7; 1201 | -moz-box-shadow: 0 0 6px #f8b9b7; 1202 | box-shadow: 0 0 6px #f8b9b7; 1203 | } 1204 | 1205 | .form-actions { 1206 | padding: 17px 20px 18px; 1207 | margin-top: 18px; 1208 | margin-bottom: 18px; 1209 | background-color: #f5f5f5; 1210 | border-top: 1px solid #e5e5e5; 1211 | *zoom: 1; 1212 | } 1213 | 1214 | .form-actions:before, 1215 | .form-actions:after { 1216 | display: table; 1217 | content: ""; 1218 | } 1219 | 1220 | .form-actions:after { 1221 | clear: both; 1222 | } 1223 | 1224 | .uneditable-input { 1225 | overflow: hidden; 1226 | white-space: nowrap; 1227 | cursor: not-allowed; 1228 | background-color: #ffffff; 1229 | border-color: #eee; 1230 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); 1231 | -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); 1232 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); 1233 | } 1234 | 1235 | :-moz-placeholder { 1236 | color: #999999; 1237 | } 1238 | 1239 | :-ms-input-placeholder { 1240 | color: #999999; 1241 | } 1242 | 1243 | ::-webkit-input-placeholder { 1244 | color: #999999; 1245 | } 1246 | 1247 | .help-block, 1248 | .help-inline { 1249 | color: #555555; 1250 | } 1251 | 1252 | .help-block { 1253 | display: block; 1254 | margin-bottom: 9px; 1255 | } 1256 | 1257 | .help-inline { 1258 | display: inline-block; 1259 | *display: inline; 1260 | padding-left: 5px; 1261 | vertical-align: middle; 1262 | *zoom: 1; 1263 | } 1264 | 1265 | .input-prepend, 1266 | .input-append { 1267 | margin-bottom: 5px; 1268 | } 1269 | 1270 | .input-prepend input, 1271 | .input-append input, 1272 | .input-prepend select, 1273 | .input-append select, 1274 | .input-prepend .uneditable-input, 1275 | .input-append .uneditable-input { 1276 | position: relative; 1277 | margin-bottom: 0; 1278 | *margin-left: 0; 1279 | vertical-align: middle; 1280 | -webkit-border-radius: 0 3px 3px 0; 1281 | -moz-border-radius: 0 3px 3px 0; 1282 | border-radius: 0 3px 3px 0; 1283 | } 1284 | 1285 | .input-prepend input:focus, 1286 | .input-append input:focus, 1287 | .input-prepend select:focus, 1288 | .input-append select:focus, 1289 | .input-prepend .uneditable-input:focus, 1290 | .input-append .uneditable-input:focus { 1291 | z-index: 2; 1292 | } 1293 | 1294 | .input-prepend .uneditable-input, 1295 | .input-append .uneditable-input { 1296 | border-left-color: #ccc; 1297 | } 1298 | 1299 | .input-prepend .add-on, 1300 | .input-append .add-on { 1301 | display: inline-block; 1302 | width: auto; 1303 | height: 18px; 1304 | min-width: 16px; 1305 | padding: 4px 5px; 1306 | font-weight: normal; 1307 | line-height: 18px; 1308 | text-align: center; 1309 | text-shadow: 0 1px 0 #ffffff; 1310 | vertical-align: middle; 1311 | background-color: #eeeeee; 1312 | border: 1px solid #ccc; 1313 | } 1314 | 1315 | .input-prepend .add-on, 1316 | .input-append .add-on, 1317 | .input-prepend .btn, 1318 | .input-append .btn { 1319 | margin-left: -1px; 1320 | -webkit-border-radius: 0; 1321 | -moz-border-radius: 0; 1322 | border-radius: 0; 1323 | } 1324 | 1325 | .input-prepend .active, 1326 | .input-append .active { 1327 | background-color: #a9dba9; 1328 | border-color: #46a546; 1329 | } 1330 | 1331 | .input-prepend .add-on, 1332 | .input-prepend .btn { 1333 | margin-right: -1px; 1334 | } 1335 | 1336 | .input-prepend .add-on:first-child, 1337 | .input-prepend .btn:first-child { 1338 | -webkit-border-radius: 3px 0 0 3px; 1339 | -moz-border-radius: 3px 0 0 3px; 1340 | border-radius: 3px 0 0 3px; 1341 | } 1342 | 1343 | .input-append input, 1344 | .input-append select, 1345 | .input-append .uneditable-input { 1346 | -webkit-border-radius: 3px 0 0 3px; 1347 | -moz-border-radius: 3px 0 0 3px; 1348 | border-radius: 3px 0 0 3px; 1349 | } 1350 | 1351 | .input-append .uneditable-input { 1352 | border-right-color: #ccc; 1353 | border-left-color: #eee; 1354 | } 1355 | 1356 | .input-append .add-on:last-child, 1357 | .input-append .btn:last-child { 1358 | -webkit-border-radius: 0 3px 3px 0; 1359 | -moz-border-radius: 0 3px 3px 0; 1360 | border-radius: 0 3px 3px 0; 1361 | } 1362 | 1363 | .input-prepend.input-append input, 1364 | .input-prepend.input-append select, 1365 | .input-prepend.input-append .uneditable-input { 1366 | -webkit-border-radius: 0; 1367 | -moz-border-radius: 0; 1368 | border-radius: 0; 1369 | } 1370 | 1371 | .input-prepend.input-append .add-on:first-child, 1372 | .input-prepend.input-append .btn:first-child { 1373 | margin-right: -1px; 1374 | -webkit-border-radius: 3px 0 0 3px; 1375 | -moz-border-radius: 3px 0 0 3px; 1376 | border-radius: 3px 0 0 3px; 1377 | } 1378 | 1379 | .input-prepend.input-append .add-on:last-child, 1380 | .input-prepend.input-append .btn:last-child { 1381 | margin-left: -1px; 1382 | -webkit-border-radius: 0 3px 3px 0; 1383 | -moz-border-radius: 0 3px 3px 0; 1384 | border-radius: 0 3px 3px 0; 1385 | } 1386 | 1387 | .search-query { 1388 | padding-right: 14px; 1389 | padding-right: 4px \9; 1390 | padding-left: 14px; 1391 | padding-left: 4px \9; 1392 | /* IE7-8 doesn't have border-radius, so don't indent the padding */ 1393 | 1394 | margin-bottom: 0; 1395 | -webkit-border-radius: 14px; 1396 | -moz-border-radius: 14px; 1397 | border-radius: 14px; 1398 | } 1399 | 1400 | .form-search input, 1401 | .form-inline input, 1402 | .form-horizontal input, 1403 | .form-search textarea, 1404 | .form-inline textarea, 1405 | .form-horizontal textarea, 1406 | .form-search select, 1407 | .form-inline select, 1408 | .form-horizontal select, 1409 | .form-search .help-inline, 1410 | .form-inline .help-inline, 1411 | .form-horizontal .help-inline, 1412 | .form-search .uneditable-input, 1413 | .form-inline .uneditable-input, 1414 | .form-horizontal .uneditable-input, 1415 | .form-search .input-prepend, 1416 | .form-inline .input-prepend, 1417 | .form-horizontal .input-prepend, 1418 | .form-search .input-append, 1419 | .form-inline .input-append, 1420 | .form-horizontal .input-append { 1421 | display: inline-block; 1422 | *display: inline; 1423 | margin-bottom: 0; 1424 | *zoom: 1; 1425 | } 1426 | 1427 | .form-search .hide, 1428 | .form-inline .hide, 1429 | .form-horizontal .hide { 1430 | display: none; 1431 | } 1432 | 1433 | .form-search label, 1434 | .form-inline label { 1435 | display: inline-block; 1436 | } 1437 | 1438 | .form-search .input-append, 1439 | .form-inline .input-append, 1440 | .form-search .input-prepend, 1441 | .form-inline .input-prepend { 1442 | margin-bottom: 0; 1443 | } 1444 | 1445 | .form-search .radio, 1446 | .form-search .checkbox, 1447 | .form-inline .radio, 1448 | .form-inline .checkbox { 1449 | padding-left: 0; 1450 | margin-bottom: 0; 1451 | vertical-align: middle; 1452 | } 1453 | 1454 | .form-search .radio input[type="radio"], 1455 | .form-search .checkbox input[type="checkbox"], 1456 | .form-inline .radio input[type="radio"], 1457 | .form-inline .checkbox input[type="checkbox"] { 1458 | float: left; 1459 | margin-right: 3px; 1460 | margin-left: 0; 1461 | } 1462 | 1463 | .control-group { 1464 | margin-bottom: 9px; 1465 | } 1466 | 1467 | legend + .control-group { 1468 | margin-top: 18px; 1469 | -webkit-margin-top-collapse: separate; 1470 | } 1471 | 1472 | .form-horizontal .control-group { 1473 | margin-bottom: 18px; 1474 | *zoom: 1; 1475 | } 1476 | 1477 | .form-horizontal .control-group:before, 1478 | .form-horizontal .control-group:after { 1479 | display: table; 1480 | content: ""; 1481 | } 1482 | 1483 | .form-horizontal .control-group:after { 1484 | clear: both; 1485 | } 1486 | 1487 | .form-horizontal .control-label { 1488 | float: left; 1489 | width: 140px; 1490 | padding-top: 5px; 1491 | text-align: right; 1492 | } 1493 | 1494 | .form-horizontal .controls { 1495 | *display: inline-block; 1496 | *padding-left: 20px; 1497 | margin-left: 160px; 1498 | *margin-left: 0; 1499 | } 1500 | 1501 | .form-horizontal .controls:first-child { 1502 | *padding-left: 160px; 1503 | } 1504 | 1505 | .form-horizontal .help-block { 1506 | margin-top: 9px; 1507 | margin-bottom: 0; 1508 | } 1509 | 1510 | .form-horizontal .form-actions { 1511 | padding-left: 160px; 1512 | } 1513 | 1514 | table { 1515 | max-width: 100%; 1516 | background-color: transparent; 1517 | border-collapse: collapse; 1518 | border-spacing: 0; 1519 | } 1520 | 1521 | .table { 1522 | width: 100%; 1523 | margin-bottom: 18px; 1524 | } 1525 | 1526 | .table th, 1527 | .table td { 1528 | padding: 8px; 1529 | line-height: 18px; 1530 | text-align: left; 1531 | vertical-align: top; 1532 | border-top: 1px solid #dddddd; 1533 | } 1534 | 1535 | .table th { 1536 | font-weight: bold; 1537 | } 1538 | 1539 | .table thead th { 1540 | vertical-align: bottom; 1541 | } 1542 | 1543 | .table caption + thead tr:first-child th, 1544 | .table caption + thead tr:first-child td, 1545 | .table colgroup + thead tr:first-child th, 1546 | .table colgroup + thead tr:first-child td, 1547 | .table thead:first-child tr:first-child th, 1548 | .table thead:first-child tr:first-child td { 1549 | border-top: 0; 1550 | } 1551 | 1552 | .table tbody + tbody { 1553 | border-top: 2px solid #dddddd; 1554 | } 1555 | 1556 | .table-condensed th, 1557 | .table-condensed td { 1558 | padding: 4px 5px; 1559 | } 1560 | 1561 | .table-bordered { 1562 | border: 1px solid #dddddd; 1563 | border-collapse: separate; 1564 | *border-collapse: collapsed; 1565 | border-left: 0; 1566 | -webkit-border-radius: 4px; 1567 | -moz-border-radius: 4px; 1568 | border-radius: 4px; 1569 | } 1570 | 1571 | .table-bordered th, 1572 | .table-bordered td { 1573 | border-left: 1px solid #dddddd; 1574 | } 1575 | 1576 | .table-bordered caption + thead tr:first-child th, 1577 | .table-bordered caption + tbody tr:first-child th, 1578 | .table-bordered caption + tbody tr:first-child td, 1579 | .table-bordered colgroup + thead tr:first-child th, 1580 | .table-bordered colgroup + tbody tr:first-child th, 1581 | .table-bordered colgroup + tbody tr:first-child td, 1582 | .table-bordered thead:first-child tr:first-child th, 1583 | .table-bordered tbody:first-child tr:first-child th, 1584 | .table-bordered tbody:first-child tr:first-child td { 1585 | border-top: 0; 1586 | } 1587 | 1588 | .table-bordered thead:first-child tr:first-child th:first-child, 1589 | .table-bordered tbody:first-child tr:first-child td:first-child { 1590 | -webkit-border-top-left-radius: 4px; 1591 | border-top-left-radius: 4px; 1592 | -moz-border-radius-topleft: 4px; 1593 | } 1594 | 1595 | .table-bordered thead:first-child tr:first-child th:last-child, 1596 | .table-bordered tbody:first-child tr:first-child td:last-child { 1597 | -webkit-border-top-right-radius: 4px; 1598 | border-top-right-radius: 4px; 1599 | -moz-border-radius-topright: 4px; 1600 | } 1601 | 1602 | .table-bordered thead:last-child tr:last-child th:first-child, 1603 | .table-bordered tbody:last-child tr:last-child td:first-child { 1604 | -webkit-border-radius: 0 0 0 4px; 1605 | -moz-border-radius: 0 0 0 4px; 1606 | border-radius: 0 0 0 4px; 1607 | -webkit-border-bottom-left-radius: 4px; 1608 | border-bottom-left-radius: 4px; 1609 | -moz-border-radius-bottomleft: 4px; 1610 | } 1611 | 1612 | .table-bordered thead:last-child tr:last-child th:last-child, 1613 | .table-bordered tbody:last-child tr:last-child td:last-child { 1614 | -webkit-border-bottom-right-radius: 4px; 1615 | border-bottom-right-radius: 4px; 1616 | -moz-border-radius-bottomright: 4px; 1617 | } 1618 | 1619 | .table-striped tbody tr:nth-child(odd) td, 1620 | .table-striped tbody tr:nth-child(odd) th { 1621 | background-color: #f9f9f9; 1622 | } 1623 | 1624 | .table tbody tr:hover td, 1625 | .table tbody tr:hover th { 1626 | background-color: #f5f5f5; 1627 | } 1628 | 1629 | table .span1 { 1630 | float: none; 1631 | width: 44px; 1632 | margin-left: 0; 1633 | } 1634 | 1635 | table .span2 { 1636 | float: none; 1637 | width: 124px; 1638 | margin-left: 0; 1639 | } 1640 | 1641 | table .span3 { 1642 | float: none; 1643 | width: 204px; 1644 | margin-left: 0; 1645 | } 1646 | 1647 | table .span4 { 1648 | float: none; 1649 | width: 284px; 1650 | margin-left: 0; 1651 | } 1652 | 1653 | table .span5 { 1654 | float: none; 1655 | width: 364px; 1656 | margin-left: 0; 1657 | } 1658 | 1659 | table .span6 { 1660 | float: none; 1661 | width: 444px; 1662 | margin-left: 0; 1663 | } 1664 | 1665 | table .span7 { 1666 | float: none; 1667 | width: 524px; 1668 | margin-left: 0; 1669 | } 1670 | 1671 | table .span8 { 1672 | float: none; 1673 | width: 604px; 1674 | margin-left: 0; 1675 | } 1676 | 1677 | table .span9 { 1678 | float: none; 1679 | width: 684px; 1680 | margin-left: 0; 1681 | } 1682 | 1683 | table .span10 { 1684 | float: none; 1685 | width: 764px; 1686 | margin-left: 0; 1687 | } 1688 | 1689 | table .span11 { 1690 | float: none; 1691 | width: 844px; 1692 | margin-left: 0; 1693 | } 1694 | 1695 | table .span12 { 1696 | float: none; 1697 | width: 924px; 1698 | margin-left: 0; 1699 | } 1700 | 1701 | table .span13 { 1702 | float: none; 1703 | width: 1004px; 1704 | margin-left: 0; 1705 | } 1706 | 1707 | table .span14 { 1708 | float: none; 1709 | width: 1084px; 1710 | margin-left: 0; 1711 | } 1712 | 1713 | table .span15 { 1714 | float: none; 1715 | width: 1164px; 1716 | margin-left: 0; 1717 | } 1718 | 1719 | table .span16 { 1720 | float: none; 1721 | width: 1244px; 1722 | margin-left: 0; 1723 | } 1724 | 1725 | table .span17 { 1726 | float: none; 1727 | width: 1324px; 1728 | margin-left: 0; 1729 | } 1730 | 1731 | table .span18 { 1732 | float: none; 1733 | width: 1404px; 1734 | margin-left: 0; 1735 | } 1736 | 1737 | table .span19 { 1738 | float: none; 1739 | width: 1484px; 1740 | margin-left: 0; 1741 | } 1742 | 1743 | table .span20 { 1744 | float: none; 1745 | width: 1564px; 1746 | margin-left: 0; 1747 | } 1748 | 1749 | table .span21 { 1750 | float: none; 1751 | width: 1644px; 1752 | margin-left: 0; 1753 | } 1754 | 1755 | table .span22 { 1756 | float: none; 1757 | width: 1724px; 1758 | margin-left: 0; 1759 | } 1760 | 1761 | table .span23 { 1762 | float: none; 1763 | width: 1804px; 1764 | margin-left: 0; 1765 | } 1766 | 1767 | table .span24 { 1768 | float: none; 1769 | width: 1884px; 1770 | margin-left: 0; 1771 | } 1772 | 1773 | [class^="icon-"], 1774 | [class*=" icon-"] { 1775 | display: inline-block; 1776 | width: 14px; 1777 | height: 14px; 1778 | *margin-right: .3em; 1779 | line-height: 14px; 1780 | vertical-align: text-top; 1781 | background-image: url("../img/glyphicons-halflings.png"); 1782 | background-position: 14px 14px; 1783 | background-repeat: no-repeat; 1784 | } 1785 | 1786 | [class^="icon-"]:last-child, 1787 | [class*=" icon-"]:last-child { 1788 | *margin-left: 0; 1789 | } 1790 | 1791 | .icon-white { 1792 | background-image: url("../img/glyphicons-halflings-white.png"); 1793 | } 1794 | 1795 | .icon-glass { 1796 | background-position: 0 0; 1797 | } 1798 | 1799 | .icon-music { 1800 | background-position: -24px 0; 1801 | } 1802 | 1803 | .icon-search { 1804 | background-position: -48px 0; 1805 | } 1806 | 1807 | .icon-envelope { 1808 | background-position: -72px 0; 1809 | } 1810 | 1811 | .icon-heart { 1812 | background-position: -96px 0; 1813 | } 1814 | 1815 | .icon-star { 1816 | background-position: -120px 0; 1817 | } 1818 | 1819 | .icon-star-empty { 1820 | background-position: -144px 0; 1821 | } 1822 | 1823 | .icon-user { 1824 | background-position: -168px 0; 1825 | } 1826 | 1827 | .icon-film { 1828 | background-position: -192px 0; 1829 | } 1830 | 1831 | .icon-th-large { 1832 | background-position: -216px 0; 1833 | } 1834 | 1835 | .icon-th { 1836 | background-position: -240px 0; 1837 | } 1838 | 1839 | .icon-th-list { 1840 | background-position: -264px 0; 1841 | } 1842 | 1843 | .icon-ok { 1844 | background-position: -288px 0; 1845 | } 1846 | 1847 | .icon-remove { 1848 | background-position: -312px 0; 1849 | } 1850 | 1851 | .icon-zoom-in { 1852 | background-position: -336px 0; 1853 | } 1854 | 1855 | .icon-zoom-out { 1856 | background-position: -360px 0; 1857 | } 1858 | 1859 | .icon-off { 1860 | background-position: -384px 0; 1861 | } 1862 | 1863 | .icon-signal { 1864 | background-position: -408px 0; 1865 | } 1866 | 1867 | .icon-cog { 1868 | background-position: -432px 0; 1869 | } 1870 | 1871 | .icon-trash { 1872 | background-position: -456px 0; 1873 | } 1874 | 1875 | .icon-home { 1876 | background-position: 0 -24px; 1877 | } 1878 | 1879 | .icon-file { 1880 | background-position: -24px -24px; 1881 | } 1882 | 1883 | .icon-time { 1884 | background-position: -48px -24px; 1885 | } 1886 | 1887 | .icon-road { 1888 | background-position: -72px -24px; 1889 | } 1890 | 1891 | .icon-download-alt { 1892 | background-position: -96px -24px; 1893 | } 1894 | 1895 | .icon-download { 1896 | background-position: -120px -24px; 1897 | } 1898 | 1899 | .icon-upload { 1900 | background-position: -144px -24px; 1901 | } 1902 | 1903 | .icon-inbox { 1904 | background-position: -168px -24px; 1905 | } 1906 | 1907 | .icon-play-circle { 1908 | background-position: -192px -24px; 1909 | } 1910 | 1911 | .icon-repeat { 1912 | background-position: -216px -24px; 1913 | } 1914 | 1915 | .icon-refresh { 1916 | background-position: -240px -24px; 1917 | } 1918 | 1919 | .icon-list-alt { 1920 | background-position: -264px -24px; 1921 | } 1922 | 1923 | .icon-lock { 1924 | background-position: -287px -24px; 1925 | } 1926 | 1927 | .icon-flag { 1928 | background-position: -312px -24px; 1929 | } 1930 | 1931 | .icon-headphones { 1932 | background-position: -336px -24px; 1933 | } 1934 | 1935 | .icon-volume-off { 1936 | background-position: -360px -24px; 1937 | } 1938 | 1939 | .icon-volume-down { 1940 | background-position: -384px -24px; 1941 | } 1942 | 1943 | .icon-volume-up { 1944 | background-position: -408px -24px; 1945 | } 1946 | 1947 | .icon-qrcode { 1948 | background-position: -432px -24px; 1949 | } 1950 | 1951 | .icon-barcode { 1952 | background-position: -456px -24px; 1953 | } 1954 | 1955 | .icon-tag { 1956 | background-position: 0 -48px; 1957 | } 1958 | 1959 | .icon-tags { 1960 | background-position: -25px -48px; 1961 | } 1962 | 1963 | .icon-book { 1964 | background-position: -48px -48px; 1965 | } 1966 | 1967 | .icon-bookmark { 1968 | background-position: -72px -48px; 1969 | } 1970 | 1971 | .icon-print { 1972 | background-position: -96px -48px; 1973 | } 1974 | 1975 | .icon-camera { 1976 | background-position: -120px -48px; 1977 | } 1978 | 1979 | .icon-font { 1980 | background-position: -144px -48px; 1981 | } 1982 | 1983 | .icon-bold { 1984 | background-position: -167px -48px; 1985 | } 1986 | 1987 | .icon-italic { 1988 | background-position: -192px -48px; 1989 | } 1990 | 1991 | .icon-text-height { 1992 | background-position: -216px -48px; 1993 | } 1994 | 1995 | .icon-text-width { 1996 | background-position: -240px -48px; 1997 | } 1998 | 1999 | .icon-align-left { 2000 | background-position: -264px -48px; 2001 | } 2002 | 2003 | .icon-align-center { 2004 | background-position: -288px -48px; 2005 | } 2006 | 2007 | .icon-align-right { 2008 | background-position: -312px -48px; 2009 | } 2010 | 2011 | .icon-align-justify { 2012 | background-position: -336px -48px; 2013 | } 2014 | 2015 | .icon-list { 2016 | background-position: -360px -48px; 2017 | } 2018 | 2019 | .icon-indent-left { 2020 | background-position: -384px -48px; 2021 | } 2022 | 2023 | .icon-indent-right { 2024 | background-position: -408px -48px; 2025 | } 2026 | 2027 | .icon-facetime-video { 2028 | background-position: -432px -48px; 2029 | } 2030 | 2031 | .icon-picture { 2032 | background-position: -456px -48px; 2033 | } 2034 | 2035 | .icon-pencil { 2036 | background-position: 0 -72px; 2037 | } 2038 | 2039 | .icon-map-marker { 2040 | background-position: -24px -72px; 2041 | } 2042 | 2043 | .icon-adjust { 2044 | background-position: -48px -72px; 2045 | } 2046 | 2047 | .icon-tint { 2048 | background-position: -72px -72px; 2049 | } 2050 | 2051 | .icon-edit { 2052 | background-position: -96px -72px; 2053 | } 2054 | 2055 | .icon-share { 2056 | background-position: -120px -72px; 2057 | } 2058 | 2059 | .icon-check { 2060 | background-position: -144px -72px; 2061 | } 2062 | 2063 | .icon-move { 2064 | background-position: -168px -72px; 2065 | } 2066 | 2067 | .icon-step-backward { 2068 | background-position: -192px -72px; 2069 | } 2070 | 2071 | .icon-fast-backward { 2072 | background-position: -216px -72px; 2073 | } 2074 | 2075 | .icon-backward { 2076 | background-position: -240px -72px; 2077 | } 2078 | 2079 | .icon-play { 2080 | background-position: -264px -72px; 2081 | } 2082 | 2083 | .icon-pause { 2084 | background-position: -288px -72px; 2085 | } 2086 | 2087 | .icon-stop { 2088 | background-position: -312px -72px; 2089 | } 2090 | 2091 | .icon-forward { 2092 | background-position: -336px -72px; 2093 | } 2094 | 2095 | .icon-fast-forward { 2096 | background-position: -360px -72px; 2097 | } 2098 | 2099 | .icon-step-forward { 2100 | background-position: -384px -72px; 2101 | } 2102 | 2103 | .icon-eject { 2104 | background-position: -408px -72px; 2105 | } 2106 | 2107 | .icon-chevron-left { 2108 | background-position: -432px -72px; 2109 | } 2110 | 2111 | .icon-chevron-right { 2112 | background-position: -456px -72px; 2113 | } 2114 | 2115 | .icon-plus-sign { 2116 | background-position: 0 -96px; 2117 | } 2118 | 2119 | .icon-minus-sign { 2120 | background-position: -24px -96px; 2121 | } 2122 | 2123 | .icon-remove-sign { 2124 | background-position: -48px -96px; 2125 | } 2126 | 2127 | .icon-ok-sign { 2128 | background-position: -72px -96px; 2129 | } 2130 | 2131 | .icon-question-sign { 2132 | background-position: -96px -96px; 2133 | } 2134 | 2135 | .icon-info-sign { 2136 | background-position: -120px -96px; 2137 | } 2138 | 2139 | .icon-screenshot { 2140 | background-position: -144px -96px; 2141 | } 2142 | 2143 | .icon-remove-circle { 2144 | background-position: -168px -96px; 2145 | } 2146 | 2147 | .icon-ok-circle { 2148 | background-position: -192px -96px; 2149 | } 2150 | 2151 | .icon-ban-circle { 2152 | background-position: -216px -96px; 2153 | } 2154 | 2155 | .icon-arrow-left { 2156 | background-position: -240px -96px; 2157 | } 2158 | 2159 | .icon-arrow-right { 2160 | background-position: -264px -96px; 2161 | } 2162 | 2163 | .icon-arrow-up { 2164 | background-position: -289px -96px; 2165 | } 2166 | 2167 | .icon-arrow-down { 2168 | background-position: -312px -96px; 2169 | } 2170 | 2171 | .icon-share-alt { 2172 | background-position: -336px -96px; 2173 | } 2174 | 2175 | .icon-resize-full { 2176 | background-position: -360px -96px; 2177 | } 2178 | 2179 | .icon-resize-small { 2180 | background-position: -384px -96px; 2181 | } 2182 | 2183 | .icon-plus { 2184 | background-position: -408px -96px; 2185 | } 2186 | 2187 | .icon-minus { 2188 | background-position: -433px -96px; 2189 | } 2190 | 2191 | .icon-asterisk { 2192 | background-position: -456px -96px; 2193 | } 2194 | 2195 | .icon-exclamation-sign { 2196 | background-position: 0 -120px; 2197 | } 2198 | 2199 | .icon-gift { 2200 | background-position: -24px -120px; 2201 | } 2202 | 2203 | .icon-leaf { 2204 | background-position: -48px -120px; 2205 | } 2206 | 2207 | .icon-fire { 2208 | background-position: -72px -120px; 2209 | } 2210 | 2211 | .icon-eye-open { 2212 | background-position: -96px -120px; 2213 | } 2214 | 2215 | .icon-eye-close { 2216 | background-position: -120px -120px; 2217 | } 2218 | 2219 | .icon-warning-sign { 2220 | background-position: -144px -120px; 2221 | } 2222 | 2223 | .icon-plane { 2224 | background-position: -168px -120px; 2225 | } 2226 | 2227 | .icon-calendar { 2228 | background-position: -192px -120px; 2229 | } 2230 | 2231 | .icon-random { 2232 | background-position: -216px -120px; 2233 | } 2234 | 2235 | .icon-comment { 2236 | background-position: -240px -120px; 2237 | } 2238 | 2239 | .icon-magnet { 2240 | background-position: -264px -120px; 2241 | } 2242 | 2243 | .icon-chevron-up { 2244 | background-position: -288px -120px; 2245 | } 2246 | 2247 | .icon-chevron-down { 2248 | background-position: -313px -119px; 2249 | } 2250 | 2251 | .icon-retweet { 2252 | background-position: -336px -120px; 2253 | } 2254 | 2255 | .icon-shopping-cart { 2256 | background-position: -360px -120px; 2257 | } 2258 | 2259 | .icon-folder-close { 2260 | background-position: -384px -120px; 2261 | } 2262 | 2263 | .icon-folder-open { 2264 | background-position: -408px -120px; 2265 | } 2266 | 2267 | .icon-resize-vertical { 2268 | background-position: -432px -119px; 2269 | } 2270 | 2271 | .icon-resize-horizontal { 2272 | background-position: -456px -118px; 2273 | } 2274 | 2275 | .icon-hdd { 2276 | background-position: 0 -144px; 2277 | } 2278 | 2279 | .icon-bullhorn { 2280 | background-position: -24px -144px; 2281 | } 2282 | 2283 | .icon-bell { 2284 | background-position: -48px -144px; 2285 | } 2286 | 2287 | .icon-certificate { 2288 | background-position: -72px -144px; 2289 | } 2290 | 2291 | .icon-thumbs-up { 2292 | background-position: -96px -144px; 2293 | } 2294 | 2295 | .icon-thumbs-down { 2296 | background-position: -120px -144px; 2297 | } 2298 | 2299 | .icon-hand-right { 2300 | background-position: -144px -144px; 2301 | } 2302 | 2303 | .icon-hand-left { 2304 | background-position: -168px -144px; 2305 | } 2306 | 2307 | .icon-hand-up { 2308 | background-position: -192px -144px; 2309 | } 2310 | 2311 | .icon-hand-down { 2312 | background-position: -216px -144px; 2313 | } 2314 | 2315 | .icon-circle-arrow-right { 2316 | background-position: -240px -144px; 2317 | } 2318 | 2319 | .icon-circle-arrow-left { 2320 | background-position: -264px -144px; 2321 | } 2322 | 2323 | .icon-circle-arrow-up { 2324 | background-position: -288px -144px; 2325 | } 2326 | 2327 | .icon-circle-arrow-down { 2328 | background-position: -312px -144px; 2329 | } 2330 | 2331 | .icon-globe { 2332 | background-position: -336px -144px; 2333 | } 2334 | 2335 | .icon-wrench { 2336 | background-position: -360px -144px; 2337 | } 2338 | 2339 | .icon-tasks { 2340 | background-position: -384px -144px; 2341 | } 2342 | 2343 | .icon-filter { 2344 | background-position: -408px -144px; 2345 | } 2346 | 2347 | .icon-briefcase { 2348 | background-position: -432px -144px; 2349 | } 2350 | 2351 | .icon-fullscreen { 2352 | background-position: -456px -144px; 2353 | } 2354 | 2355 | .dropup, 2356 | .dropdown { 2357 | position: relative; 2358 | } 2359 | 2360 | .dropdown-toggle { 2361 | *margin-bottom: -3px; 2362 | } 2363 | 2364 | .dropdown-toggle:active, 2365 | .open .dropdown-toggle { 2366 | outline: 0; 2367 | } 2368 | 2369 | .caret { 2370 | display: inline-block; 2371 | width: 0; 2372 | height: 0; 2373 | vertical-align: top; 2374 | border-top: 4px solid #000000; 2375 | border-right: 4px solid transparent; 2376 | border-left: 4px solid transparent; 2377 | content: ""; 2378 | opacity: 0.3; 2379 | filter: alpha(opacity=30); 2380 | } 2381 | 2382 | .dropdown .caret { 2383 | margin-top: 8px; 2384 | margin-left: 2px; 2385 | } 2386 | 2387 | .dropdown:hover .caret, 2388 | .open .caret { 2389 | opacity: 1; 2390 | filter: alpha(opacity=100); 2391 | } 2392 | 2393 | .dropdown-menu { 2394 | position: absolute; 2395 | top: 100%; 2396 | left: 0; 2397 | z-index: 1000; 2398 | display: none; 2399 | float: left; 2400 | min-width: 160px; 2401 | padding: 4px 0; 2402 | margin: 1px 0 0; 2403 | list-style: none; 2404 | background-color: #ffffff; 2405 | border: 1px solid #ccc; 2406 | border: 1px solid rgba(0, 0, 0, 0.2); 2407 | *border-right-width: 2px; 2408 | *border-bottom-width: 2px; 2409 | -webkit-border-radius: 5px; 2410 | -moz-border-radius: 5px; 2411 | border-radius: 5px; 2412 | -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 2413 | -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 2414 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 2415 | -webkit-background-clip: padding-box; 2416 | -moz-background-clip: padding; 2417 | background-clip: padding-box; 2418 | } 2419 | 2420 | .dropdown-menu.pull-right { 2421 | right: 0; 2422 | left: auto; 2423 | } 2424 | 2425 | .dropdown-menu .divider { 2426 | *width: 100%; 2427 | height: 1px; 2428 | margin: 8px 1px; 2429 | *margin: -5px 0 5px; 2430 | overflow: hidden; 2431 | background-color: #e5e5e5; 2432 | border-bottom: 1px solid #ffffff; 2433 | } 2434 | 2435 | .dropdown-menu a { 2436 | display: block; 2437 | padding: 3px 15px; 2438 | clear: both; 2439 | font-weight: normal; 2440 | line-height: 18px; 2441 | color: #333333; 2442 | white-space: nowrap; 2443 | } 2444 | 2445 | .dropdown-menu li > a:hover, 2446 | .dropdown-menu .active > a, 2447 | .dropdown-menu .active > a:hover { 2448 | color: #ffffff; 2449 | text-decoration: none; 2450 | background-color: #0088cc; 2451 | } 2452 | 2453 | .open { 2454 | *z-index: 1000; 2455 | } 2456 | 2457 | .open > .dropdown-menu { 2458 | display: block; 2459 | } 2460 | 2461 | .pull-right > .dropdown-menu { 2462 | right: 0; 2463 | left: auto; 2464 | } 2465 | 2466 | .dropup .caret, 2467 | .navbar-fixed-bottom .dropdown .caret { 2468 | border-top: 0; 2469 | border-bottom: 4px solid #000000; 2470 | content: "\2191"; 2471 | } 2472 | 2473 | .dropup .dropdown-menu, 2474 | .navbar-fixed-bottom .dropdown .dropdown-menu { 2475 | top: auto; 2476 | bottom: 100%; 2477 | margin-bottom: 1px; 2478 | } 2479 | 2480 | .typeahead { 2481 | margin-top: 2px; 2482 | -webkit-border-radius: 4px; 2483 | -moz-border-radius: 4px; 2484 | border-radius: 4px; 2485 | } 2486 | 2487 | .well { 2488 | min-height: 20px; 2489 | padding: 19px; 2490 | margin-bottom: 20px; 2491 | background-color: #f5f5f5; 2492 | border: 1px solid #eee; 2493 | border: 1px solid rgba(0, 0, 0, 0.05); 2494 | -webkit-border-radius: 4px; 2495 | -moz-border-radius: 4px; 2496 | border-radius: 4px; 2497 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); 2498 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); 2499 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); 2500 | } 2501 | 2502 | .well blockquote { 2503 | border-color: #ddd; 2504 | border-color: rgba(0, 0, 0, 0.15); 2505 | } 2506 | 2507 | .well-large { 2508 | padding: 24px; 2509 | -webkit-border-radius: 6px; 2510 | -moz-border-radius: 6px; 2511 | border-radius: 6px; 2512 | } 2513 | 2514 | .well-small { 2515 | padding: 9px; 2516 | -webkit-border-radius: 3px; 2517 | -moz-border-radius: 3px; 2518 | border-radius: 3px; 2519 | } 2520 | 2521 | .fade { 2522 | opacity: 0; 2523 | -webkit-transition: opacity 0.15s linear; 2524 | -moz-transition: opacity 0.15s linear; 2525 | -ms-transition: opacity 0.15s linear; 2526 | -o-transition: opacity 0.15s linear; 2527 | transition: opacity 0.15s linear; 2528 | } 2529 | 2530 | .fade.in { 2531 | opacity: 1; 2532 | } 2533 | 2534 | .collapse { 2535 | position: relative; 2536 | height: 0; 2537 | overflow: hidden; 2538 | -webkit-transition: height 0.35s ease; 2539 | -moz-transition: height 0.35s ease; 2540 | -ms-transition: height 0.35s ease; 2541 | -o-transition: height 0.35s ease; 2542 | transition: height 0.35s ease; 2543 | } 2544 | 2545 | .collapse.in { 2546 | height: auto; 2547 | } 2548 | 2549 | .close { 2550 | float: right; 2551 | font-size: 20px; 2552 | font-weight: bold; 2553 | line-height: 18px; 2554 | color: #000000; 2555 | text-shadow: 0 1px 0 #ffffff; 2556 | opacity: 0.2; 2557 | filter: alpha(opacity=20); 2558 | } 2559 | 2560 | .close:hover { 2561 | color: #000000; 2562 | text-decoration: none; 2563 | cursor: pointer; 2564 | opacity: 0.4; 2565 | filter: alpha(opacity=40); 2566 | } 2567 | 2568 | button.close { 2569 | padding: 0; 2570 | cursor: pointer; 2571 | background: transparent; 2572 | border: 0; 2573 | -webkit-appearance: none; 2574 | } 2575 | 2576 | .btn { 2577 | display: inline-block; 2578 | *display: inline; 2579 | padding: 4px 10px 4px; 2580 | margin-bottom: 0; 2581 | *margin-left: .3em; 2582 | font-size: 13px; 2583 | line-height: 18px; 2584 | *line-height: 20px; 2585 | color: #333333; 2586 | text-align: center; 2587 | text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); 2588 | vertical-align: middle; 2589 | cursor: pointer; 2590 | background-color: #f5f5f5; 2591 | *background-color: #e6e6e6; 2592 | background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); 2593 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); 2594 | background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); 2595 | background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); 2596 | background-image: linear-gradient(top, #ffffff, #e6e6e6); 2597 | background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); 2598 | background-repeat: repeat-x; 2599 | border: 1px solid #cccccc; 2600 | *border: 0; 2601 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 2602 | border-color: #e6e6e6 #e6e6e6 #bfbfbf; 2603 | border-bottom-color: #b3b3b3; 2604 | -webkit-border-radius: 4px; 2605 | -moz-border-radius: 4px; 2606 | border-radius: 4px; 2607 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); 2608 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 2609 | *zoom: 1; 2610 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 2611 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 2612 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 2613 | } 2614 | 2615 | .btn:hover, 2616 | .btn:active, 2617 | .btn.active, 2618 | .btn.disabled, 2619 | .btn[disabled] { 2620 | background-color: #e6e6e6; 2621 | *background-color: #d9d9d9; 2622 | } 2623 | 2624 | .btn:active, 2625 | .btn.active { 2626 | background-color: #cccccc \9; 2627 | } 2628 | 2629 | .btn:first-child { 2630 | *margin-left: 0; 2631 | } 2632 | 2633 | .btn:hover { 2634 | color: #333333; 2635 | text-decoration: none; 2636 | background-color: #e6e6e6; 2637 | *background-color: #d9d9d9; 2638 | /* Buttons in IE7 don't get borders, so darken on hover */ 2639 | 2640 | background-position: 0 -15px; 2641 | -webkit-transition: background-position 0.1s linear; 2642 | -moz-transition: background-position 0.1s linear; 2643 | -ms-transition: background-position 0.1s linear; 2644 | -o-transition: background-position 0.1s linear; 2645 | transition: background-position 0.1s linear; 2646 | } 2647 | 2648 | .btn:focus { 2649 | outline: thin dotted #333; 2650 | outline: 5px auto -webkit-focus-ring-color; 2651 | outline-offset: -2px; 2652 | } 2653 | 2654 | .btn.active, 2655 | .btn:active { 2656 | background-color: #e6e6e6; 2657 | background-color: #d9d9d9 \9; 2658 | background-image: none; 2659 | outline: 0; 2660 | -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 2661 | -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 2662 | box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 2663 | } 2664 | 2665 | .btn.disabled, 2666 | .btn[disabled] { 2667 | cursor: default; 2668 | background-color: #e6e6e6; 2669 | background-image: none; 2670 | opacity: 0.65; 2671 | filter: alpha(opacity=65); 2672 | -webkit-box-shadow: none; 2673 | -moz-box-shadow: none; 2674 | box-shadow: none; 2675 | } 2676 | 2677 | .btn-large { 2678 | padding: 9px 14px; 2679 | font-size: 15px; 2680 | line-height: normal; 2681 | -webkit-border-radius: 5px; 2682 | -moz-border-radius: 5px; 2683 | border-radius: 5px; 2684 | } 2685 | 2686 | .btn-large [class^="icon-"] { 2687 | margin-top: 1px; 2688 | } 2689 | 2690 | .btn-small { 2691 | padding: 5px 9px; 2692 | font-size: 11px; 2693 | line-height: 16px; 2694 | } 2695 | 2696 | .btn-small [class^="icon-"] { 2697 | margin-top: -1px; 2698 | } 2699 | 2700 | .btn-mini { 2701 | padding: 2px 6px; 2702 | font-size: 11px; 2703 | line-height: 14px; 2704 | } 2705 | 2706 | .btn-primary, 2707 | .btn-primary:hover, 2708 | .btn-warning, 2709 | .btn-warning:hover, 2710 | .btn-danger, 2711 | .btn-danger:hover, 2712 | .btn-success, 2713 | .btn-success:hover, 2714 | .btn-info, 2715 | .btn-info:hover, 2716 | .btn-inverse, 2717 | .btn-inverse:hover { 2718 | color: #ffffff; 2719 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 2720 | } 2721 | 2722 | .btn-primary.active, 2723 | .btn-warning.active, 2724 | .btn-danger.active, 2725 | .btn-success.active, 2726 | .btn-info.active, 2727 | .btn-inverse.active { 2728 | color: rgba(255, 255, 255, 0.75); 2729 | } 2730 | 2731 | .btn { 2732 | border-color: #ccc; 2733 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 2734 | } 2735 | 2736 | .btn-primary { 2737 | background-color: #0074cc; 2738 | *background-color: #0055cc; 2739 | background-image: -ms-linear-gradient(top, #0088cc, #0055cc); 2740 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); 2741 | background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); 2742 | background-image: -o-linear-gradient(top, #0088cc, #0055cc); 2743 | background-image: -moz-linear-gradient(top, #0088cc, #0055cc); 2744 | background-image: linear-gradient(top, #0088cc, #0055cc); 2745 | background-repeat: repeat-x; 2746 | border-color: #0055cc #0055cc #003580; 2747 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 2748 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); 2749 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 2750 | } 2751 | 2752 | .btn-primary:hover, 2753 | .btn-primary:active, 2754 | .btn-primary.active, 2755 | .btn-primary.disabled, 2756 | .btn-primary[disabled] { 2757 | background-color: #0055cc; 2758 | *background-color: #004ab3; 2759 | } 2760 | 2761 | .btn-primary:active, 2762 | .btn-primary.active { 2763 | background-color: #004099 \9; 2764 | } 2765 | 2766 | .btn-warning { 2767 | background-color: #faa732; 2768 | *background-color: #f89406; 2769 | background-image: -ms-linear-gradient(top, #fbb450, #f89406); 2770 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); 2771 | background-image: -webkit-linear-gradient(top, #fbb450, #f89406); 2772 | background-image: -o-linear-gradient(top, #fbb450, #f89406); 2773 | background-image: -moz-linear-gradient(top, #fbb450, #f89406); 2774 | background-image: linear-gradient(top, #fbb450, #f89406); 2775 | background-repeat: repeat-x; 2776 | border-color: #f89406 #f89406 #ad6704; 2777 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 2778 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); 2779 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 2780 | } 2781 | 2782 | .btn-warning:hover, 2783 | .btn-warning:active, 2784 | .btn-warning.active, 2785 | .btn-warning.disabled, 2786 | .btn-warning[disabled] { 2787 | background-color: #f89406; 2788 | *background-color: #df8505; 2789 | } 2790 | 2791 | .btn-warning:active, 2792 | .btn-warning.active { 2793 | background-color: #c67605 \9; 2794 | } 2795 | 2796 | .btn-danger { 2797 | background-color: #da4f49; 2798 | *background-color: #bd362f; 2799 | background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); 2800 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); 2801 | background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); 2802 | background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); 2803 | background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); 2804 | background-image: linear-gradient(top, #ee5f5b, #bd362f); 2805 | background-repeat: repeat-x; 2806 | border-color: #bd362f #bd362f #802420; 2807 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 2808 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); 2809 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 2810 | } 2811 | 2812 | .btn-danger:hover, 2813 | .btn-danger:active, 2814 | .btn-danger.active, 2815 | .btn-danger.disabled, 2816 | .btn-danger[disabled] { 2817 | background-color: #bd362f; 2818 | *background-color: #a9302a; 2819 | } 2820 | 2821 | .btn-danger:active, 2822 | .btn-danger.active { 2823 | background-color: #942a25 \9; 2824 | } 2825 | 2826 | .btn-success { 2827 | background-color: #5bb75b; 2828 | *background-color: #51a351; 2829 | background-image: -ms-linear-gradient(top, #62c462, #51a351); 2830 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); 2831 | background-image: -webkit-linear-gradient(top, #62c462, #51a351); 2832 | background-image: -o-linear-gradient(top, #62c462, #51a351); 2833 | background-image: -moz-linear-gradient(top, #62c462, #51a351); 2834 | background-image: linear-gradient(top, #62c462, #51a351); 2835 | background-repeat: repeat-x; 2836 | border-color: #51a351 #51a351 #387038; 2837 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 2838 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); 2839 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 2840 | } 2841 | 2842 | .btn-success:hover, 2843 | .btn-success:active, 2844 | .btn-success.active, 2845 | .btn-success.disabled, 2846 | .btn-success[disabled] { 2847 | background-color: #51a351; 2848 | *background-color: #499249; 2849 | } 2850 | 2851 | .btn-success:active, 2852 | .btn-success.active { 2853 | background-color: #408140 \9; 2854 | } 2855 | 2856 | .btn-info { 2857 | background-color: #49afcd; 2858 | *background-color: #2f96b4; 2859 | background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); 2860 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); 2861 | background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); 2862 | background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); 2863 | background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); 2864 | background-image: linear-gradient(top, #5bc0de, #2f96b4); 2865 | background-repeat: repeat-x; 2866 | border-color: #2f96b4 #2f96b4 #1f6377; 2867 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 2868 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); 2869 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 2870 | } 2871 | 2872 | .btn-info:hover, 2873 | .btn-info:active, 2874 | .btn-info.active, 2875 | .btn-info.disabled, 2876 | .btn-info[disabled] { 2877 | background-color: #2f96b4; 2878 | *background-color: #2a85a0; 2879 | } 2880 | 2881 | .btn-info:active, 2882 | .btn-info.active { 2883 | background-color: #24748c \9; 2884 | } 2885 | 2886 | .btn-inverse { 2887 | background-color: #414141; 2888 | *background-color: #222222; 2889 | background-image: -ms-linear-gradient(top, #555555, #222222); 2890 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); 2891 | background-image: -webkit-linear-gradient(top, #555555, #222222); 2892 | background-image: -o-linear-gradient(top, #555555, #222222); 2893 | background-image: -moz-linear-gradient(top, #555555, #222222); 2894 | background-image: linear-gradient(top, #555555, #222222); 2895 | background-repeat: repeat-x; 2896 | border-color: #222222 #222222 #000000; 2897 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 2898 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); 2899 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 2900 | } 2901 | 2902 | .btn-inverse:hover, 2903 | .btn-inverse:active, 2904 | .btn-inverse.active, 2905 | .btn-inverse.disabled, 2906 | .btn-inverse[disabled] { 2907 | background-color: #222222; 2908 | *background-color: #151515; 2909 | } 2910 | 2911 | .btn-inverse:active, 2912 | .btn-inverse.active { 2913 | background-color: #080808 \9; 2914 | } 2915 | 2916 | button.btn, 2917 | input[type="submit"].btn { 2918 | *padding-top: 2px; 2919 | *padding-bottom: 2px; 2920 | } 2921 | 2922 | button.btn::-moz-focus-inner, 2923 | input[type="submit"].btn::-moz-focus-inner { 2924 | padding: 0; 2925 | border: 0; 2926 | } 2927 | 2928 | button.btn.btn-large, 2929 | input[type="submit"].btn.btn-large { 2930 | *padding-top: 7px; 2931 | *padding-bottom: 7px; 2932 | } 2933 | 2934 | button.btn.btn-small, 2935 | input[type="submit"].btn.btn-small { 2936 | *padding-top: 3px; 2937 | *padding-bottom: 3px; 2938 | } 2939 | 2940 | button.btn.btn-mini, 2941 | input[type="submit"].btn.btn-mini { 2942 | *padding-top: 1px; 2943 | *padding-bottom: 1px; 2944 | } 2945 | 2946 | .btn-group { 2947 | position: relative; 2948 | *margin-left: .3em; 2949 | *zoom: 1; 2950 | } 2951 | 2952 | .btn-group:before, 2953 | .btn-group:after { 2954 | display: table; 2955 | content: ""; 2956 | } 2957 | 2958 | .btn-group:after { 2959 | clear: both; 2960 | } 2961 | 2962 | .btn-group:first-child { 2963 | *margin-left: 0; 2964 | } 2965 | 2966 | .btn-group + .btn-group { 2967 | margin-left: 5px; 2968 | } 2969 | 2970 | .btn-toolbar { 2971 | margin-top: 9px; 2972 | margin-bottom: 9px; 2973 | } 2974 | 2975 | .btn-toolbar .btn-group { 2976 | display: inline-block; 2977 | *display: inline; 2978 | /* IE7 inline-block hack */ 2979 | 2980 | *zoom: 1; 2981 | } 2982 | 2983 | .btn-group > .btn { 2984 | position: relative; 2985 | float: left; 2986 | margin-left: -1px; 2987 | -webkit-border-radius: 0; 2988 | -moz-border-radius: 0; 2989 | border-radius: 0; 2990 | } 2991 | 2992 | .btn-group > .btn:first-child { 2993 | margin-left: 0; 2994 | -webkit-border-bottom-left-radius: 4px; 2995 | border-bottom-left-radius: 4px; 2996 | -webkit-border-top-left-radius: 4px; 2997 | border-top-left-radius: 4px; 2998 | -moz-border-radius-bottomleft: 4px; 2999 | -moz-border-radius-topleft: 4px; 3000 | } 3001 | 3002 | .btn-group > .btn:last-child, 3003 | .btn-group > .dropdown-toggle { 3004 | -webkit-border-top-right-radius: 4px; 3005 | border-top-right-radius: 4px; 3006 | -webkit-border-bottom-right-radius: 4px; 3007 | border-bottom-right-radius: 4px; 3008 | -moz-border-radius-topright: 4px; 3009 | -moz-border-radius-bottomright: 4px; 3010 | } 3011 | 3012 | .btn-group > .btn.large:first-child { 3013 | margin-left: 0; 3014 | -webkit-border-bottom-left-radius: 6px; 3015 | border-bottom-left-radius: 6px; 3016 | -webkit-border-top-left-radius: 6px; 3017 | border-top-left-radius: 6px; 3018 | -moz-border-radius-bottomleft: 6px; 3019 | -moz-border-radius-topleft: 6px; 3020 | } 3021 | 3022 | .btn-group > .btn.large:last-child, 3023 | .btn-group > .large.dropdown-toggle { 3024 | -webkit-border-top-right-radius: 6px; 3025 | border-top-right-radius: 6px; 3026 | -webkit-border-bottom-right-radius: 6px; 3027 | border-bottom-right-radius: 6px; 3028 | -moz-border-radius-topright: 6px; 3029 | -moz-border-radius-bottomright: 6px; 3030 | } 3031 | 3032 | .btn-group > .btn:hover, 3033 | .btn-group > .btn:focus, 3034 | .btn-group > .btn:active, 3035 | .btn-group > .btn.active { 3036 | z-index: 2; 3037 | } 3038 | 3039 | .btn-group .dropdown-toggle:active, 3040 | .btn-group.open .dropdown-toggle { 3041 | outline: 0; 3042 | } 3043 | 3044 | .btn-group > .dropdown-toggle { 3045 | *padding-top: 4px; 3046 | padding-right: 8px; 3047 | *padding-bottom: 4px; 3048 | padding-left: 8px; 3049 | -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 3050 | -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 3051 | box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 3052 | } 3053 | 3054 | .btn-group > .btn-mini.dropdown-toggle { 3055 | padding-right: 5px; 3056 | padding-left: 5px; 3057 | } 3058 | 3059 | .btn-group > .btn-small.dropdown-toggle { 3060 | *padding-top: 4px; 3061 | *padding-bottom: 4px; 3062 | } 3063 | 3064 | .btn-group > .btn-large.dropdown-toggle { 3065 | padding-right: 12px; 3066 | padding-left: 12px; 3067 | } 3068 | 3069 | .btn-group.open .dropdown-toggle { 3070 | background-image: none; 3071 | -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 3072 | -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 3073 | box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 3074 | } 3075 | 3076 | .btn-group.open .btn.dropdown-toggle { 3077 | background-color: #e6e6e6; 3078 | } 3079 | 3080 | .btn-group.open .btn-primary.dropdown-toggle { 3081 | background-color: #0055cc; 3082 | } 3083 | 3084 | .btn-group.open .btn-warning.dropdown-toggle { 3085 | background-color: #f89406; 3086 | } 3087 | 3088 | .btn-group.open .btn-danger.dropdown-toggle { 3089 | background-color: #bd362f; 3090 | } 3091 | 3092 | .btn-group.open .btn-success.dropdown-toggle { 3093 | background-color: #51a351; 3094 | } 3095 | 3096 | .btn-group.open .btn-info.dropdown-toggle { 3097 | background-color: #2f96b4; 3098 | } 3099 | 3100 | .btn-group.open .btn-inverse.dropdown-toggle { 3101 | background-color: #222222; 3102 | } 3103 | 3104 | .btn .caret { 3105 | margin-top: 7px; 3106 | margin-left: 0; 3107 | } 3108 | 3109 | .btn:hover .caret, 3110 | .open.btn-group .caret { 3111 | opacity: 1; 3112 | filter: alpha(opacity=100); 3113 | } 3114 | 3115 | .btn-mini .caret { 3116 | margin-top: 5px; 3117 | } 3118 | 3119 | .btn-small .caret { 3120 | margin-top: 6px; 3121 | } 3122 | 3123 | .btn-large .caret { 3124 | margin-top: 6px; 3125 | border-top-width: 5px; 3126 | border-right-width: 5px; 3127 | border-left-width: 5px; 3128 | } 3129 | 3130 | .dropup .btn-large .caret { 3131 | border-top: 0; 3132 | border-bottom: 5px solid #000000; 3133 | } 3134 | 3135 | .btn-primary .caret, 3136 | .btn-warning .caret, 3137 | .btn-danger .caret, 3138 | .btn-info .caret, 3139 | .btn-success .caret, 3140 | .btn-inverse .caret { 3141 | border-top-color: #ffffff; 3142 | border-bottom-color: #ffffff; 3143 | opacity: 0.75; 3144 | filter: alpha(opacity=75); 3145 | } 3146 | 3147 | .alert { 3148 | padding: 8px 35px 8px 14px; 3149 | margin-bottom: 18px; 3150 | color: #c09853; 3151 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 3152 | background-color: #fcf8e3; 3153 | border: 1px solid #fbeed5; 3154 | -webkit-border-radius: 4px; 3155 | -moz-border-radius: 4px; 3156 | border-radius: 4px; 3157 | } 3158 | 3159 | .alert-heading { 3160 | color: inherit; 3161 | } 3162 | 3163 | .alert .close { 3164 | position: relative; 3165 | top: -2px; 3166 | right: -21px; 3167 | line-height: 18px; 3168 | } 3169 | 3170 | .alert-success { 3171 | color: #468847; 3172 | background-color: #dff0d8; 3173 | border-color: #d6e9c6; 3174 | } 3175 | 3176 | .alert-danger, 3177 | .alert-error { 3178 | color: #b94a48; 3179 | background-color: #f2dede; 3180 | border-color: #eed3d7; 3181 | } 3182 | 3183 | .alert-info { 3184 | color: #3a87ad; 3185 | background-color: #d9edf7; 3186 | border-color: #bce8f1; 3187 | } 3188 | 3189 | .alert-block { 3190 | padding-top: 14px; 3191 | padding-bottom: 14px; 3192 | } 3193 | 3194 | .alert-block > p, 3195 | .alert-block > ul { 3196 | margin-bottom: 0; 3197 | } 3198 | 3199 | .alert-block p + p { 3200 | margin-top: 5px; 3201 | } 3202 | 3203 | .nav { 3204 | margin-bottom: 18px; 3205 | margin-left: 0; 3206 | list-style: none; 3207 | } 3208 | 3209 | .nav > li > a { 3210 | display: block; 3211 | } 3212 | 3213 | .nav > li > a:hover { 3214 | text-decoration: none; 3215 | background-color: #eeeeee; 3216 | } 3217 | 3218 | .nav > .pull-right { 3219 | float: right; 3220 | } 3221 | 3222 | .nav .nav-header { 3223 | display: block; 3224 | padding: 3px 15px; 3225 | font-size: 11px; 3226 | font-weight: bold; 3227 | line-height: 18px; 3228 | color: #999999; 3229 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 3230 | text-transform: uppercase; 3231 | } 3232 | 3233 | .nav li + .nav-header { 3234 | margin-top: 9px; 3235 | } 3236 | 3237 | .nav-list { 3238 | padding-right: 15px; 3239 | padding-left: 15px; 3240 | margin-bottom: 0; 3241 | } 3242 | 3243 | .nav-list > li > a, 3244 | .nav-list .nav-header { 3245 | margin-right: -15px; 3246 | margin-left: -15px; 3247 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 3248 | } 3249 | 3250 | .nav-list > li > a { 3251 | padding: 3px 15px; 3252 | } 3253 | 3254 | .nav-list > .active > a, 3255 | .nav-list > .active > a:hover { 3256 | color: #ffffff; 3257 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); 3258 | background-color: #0088cc; 3259 | } 3260 | 3261 | .nav-list [class^="icon-"] { 3262 | margin-right: 2px; 3263 | } 3264 | 3265 | .nav-list .divider { 3266 | *width: 100%; 3267 | height: 1px; 3268 | margin: 8px 1px; 3269 | *margin: -5px 0 5px; 3270 | overflow: hidden; 3271 | background-color: #e5e5e5; 3272 | border-bottom: 1px solid #ffffff; 3273 | } 3274 | 3275 | .nav-tabs, 3276 | .nav-pills { 3277 | *zoom: 1; 3278 | } 3279 | 3280 | .nav-tabs:before, 3281 | .nav-pills:before, 3282 | .nav-tabs:after, 3283 | .nav-pills:after { 3284 | display: table; 3285 | content: ""; 3286 | } 3287 | 3288 | .nav-tabs:after, 3289 | .nav-pills:after { 3290 | clear: both; 3291 | } 3292 | 3293 | .nav-tabs > li, 3294 | .nav-pills > li { 3295 | float: left; 3296 | } 3297 | 3298 | .nav-tabs > li > a, 3299 | .nav-pills > li > a { 3300 | padding-right: 12px; 3301 | padding-left: 12px; 3302 | margin-right: 2px; 3303 | line-height: 14px; 3304 | } 3305 | 3306 | .nav-tabs { 3307 | border-bottom: 1px solid #ddd; 3308 | } 3309 | 3310 | .nav-tabs > li { 3311 | margin-bottom: -1px; 3312 | } 3313 | 3314 | .nav-tabs > li > a { 3315 | padding-top: 8px; 3316 | padding-bottom: 8px; 3317 | line-height: 18px; 3318 | border: 1px solid transparent; 3319 | -webkit-border-radius: 4px 4px 0 0; 3320 | -moz-border-radius: 4px 4px 0 0; 3321 | border-radius: 4px 4px 0 0; 3322 | } 3323 | 3324 | .nav-tabs > li > a:hover { 3325 | border-color: #eeeeee #eeeeee #dddddd; 3326 | } 3327 | 3328 | .nav-tabs > .active > a, 3329 | .nav-tabs > .active > a:hover { 3330 | color: #555555; 3331 | cursor: default; 3332 | background-color: #ffffff; 3333 | border: 1px solid #ddd; 3334 | border-bottom-color: transparent; 3335 | } 3336 | 3337 | .nav-pills > li > a { 3338 | padding-top: 8px; 3339 | padding-bottom: 8px; 3340 | margin-top: 2px; 3341 | margin-bottom: 2px; 3342 | -webkit-border-radius: 5px; 3343 | -moz-border-radius: 5px; 3344 | border-radius: 5px; 3345 | } 3346 | 3347 | .nav-pills > .active > a, 3348 | .nav-pills > .active > a:hover { 3349 | color: #ffffff; 3350 | background-color: #0088cc; 3351 | } 3352 | 3353 | .nav-stacked > li { 3354 | float: none; 3355 | } 3356 | 3357 | .nav-stacked > li > a { 3358 | margin-right: 0; 3359 | } 3360 | 3361 | .nav-tabs.nav-stacked { 3362 | border-bottom: 0; 3363 | } 3364 | 3365 | .nav-tabs.nav-stacked > li > a { 3366 | border: 1px solid #ddd; 3367 | -webkit-border-radius: 0; 3368 | -moz-border-radius: 0; 3369 | border-radius: 0; 3370 | } 3371 | 3372 | .nav-tabs.nav-stacked > li:first-child > a { 3373 | -webkit-border-radius: 4px 4px 0 0; 3374 | -moz-border-radius: 4px 4px 0 0; 3375 | border-radius: 4px 4px 0 0; 3376 | } 3377 | 3378 | .nav-tabs.nav-stacked > li:last-child > a { 3379 | -webkit-border-radius: 0 0 4px 4px; 3380 | -moz-border-radius: 0 0 4px 4px; 3381 | border-radius: 0 0 4px 4px; 3382 | } 3383 | 3384 | .nav-tabs.nav-stacked > li > a:hover { 3385 | z-index: 2; 3386 | border-color: #ddd; 3387 | } 3388 | 3389 | .nav-pills.nav-stacked > li > a { 3390 | margin-bottom: 3px; 3391 | } 3392 | 3393 | .nav-pills.nav-stacked > li:last-child > a { 3394 | margin-bottom: 1px; 3395 | } 3396 | 3397 | .nav-tabs .dropdown-menu { 3398 | -webkit-border-radius: 0 0 5px 5px; 3399 | -moz-border-radius: 0 0 5px 5px; 3400 | border-radius: 0 0 5px 5px; 3401 | } 3402 | 3403 | .nav-pills .dropdown-menu { 3404 | -webkit-border-radius: 4px; 3405 | -moz-border-radius: 4px; 3406 | border-radius: 4px; 3407 | } 3408 | 3409 | .nav-tabs .dropdown-toggle .caret, 3410 | .nav-pills .dropdown-toggle .caret { 3411 | margin-top: 6px; 3412 | border-top-color: #0088cc; 3413 | border-bottom-color: #0088cc; 3414 | } 3415 | 3416 | .nav-tabs .dropdown-toggle:hover .caret, 3417 | .nav-pills .dropdown-toggle:hover .caret { 3418 | border-top-color: #005580; 3419 | border-bottom-color: #005580; 3420 | } 3421 | 3422 | .nav-tabs .active .dropdown-toggle .caret, 3423 | .nav-pills .active .dropdown-toggle .caret { 3424 | border-top-color: #333333; 3425 | border-bottom-color: #333333; 3426 | } 3427 | 3428 | .nav > .dropdown.active > a:hover { 3429 | color: #000000; 3430 | cursor: pointer; 3431 | } 3432 | 3433 | .nav-tabs .open .dropdown-toggle, 3434 | .nav-pills .open .dropdown-toggle, 3435 | .nav > li.dropdown.open.active > a:hover { 3436 | color: #ffffff; 3437 | background-color: #999999; 3438 | border-color: #999999; 3439 | } 3440 | 3441 | .nav li.dropdown.open .caret, 3442 | .nav li.dropdown.open.active .caret, 3443 | .nav li.dropdown.open a:hover .caret { 3444 | border-top-color: #ffffff; 3445 | border-bottom-color: #ffffff; 3446 | opacity: 1; 3447 | filter: alpha(opacity=100); 3448 | } 3449 | 3450 | .tabs-stacked .open > a:hover { 3451 | border-color: #999999; 3452 | } 3453 | 3454 | .tabbable { 3455 | *zoom: 1; 3456 | } 3457 | 3458 | .tabbable:before, 3459 | .tabbable:after { 3460 | display: table; 3461 | content: ""; 3462 | } 3463 | 3464 | .tabbable:after { 3465 | clear: both; 3466 | } 3467 | 3468 | .tab-content { 3469 | overflow: auto; 3470 | } 3471 | 3472 | .tabs-below > .nav-tabs, 3473 | .tabs-right > .nav-tabs, 3474 | .tabs-left > .nav-tabs { 3475 | border-bottom: 0; 3476 | } 3477 | 3478 | .tab-content > .tab-pane, 3479 | .pill-content > .pill-pane { 3480 | display: none; 3481 | } 3482 | 3483 | .tab-content > .active, 3484 | .pill-content > .active { 3485 | display: block; 3486 | } 3487 | 3488 | .tabs-below > .nav-tabs { 3489 | border-top: 1px solid #ddd; 3490 | } 3491 | 3492 | .tabs-below > .nav-tabs > li { 3493 | margin-top: -1px; 3494 | margin-bottom: 0; 3495 | } 3496 | 3497 | .tabs-below > .nav-tabs > li > a { 3498 | -webkit-border-radius: 0 0 4px 4px; 3499 | -moz-border-radius: 0 0 4px 4px; 3500 | border-radius: 0 0 4px 4px; 3501 | } 3502 | 3503 | .tabs-below > .nav-tabs > li > a:hover { 3504 | border-top-color: #ddd; 3505 | border-bottom-color: transparent; 3506 | } 3507 | 3508 | .tabs-below > .nav-tabs > .active > a, 3509 | .tabs-below > .nav-tabs > .active > a:hover { 3510 | border-color: transparent #ddd #ddd #ddd; 3511 | } 3512 | 3513 | .tabs-left > .nav-tabs > li, 3514 | .tabs-right > .nav-tabs > li { 3515 | float: none; 3516 | } 3517 | 3518 | .tabs-left > .nav-tabs > li > a, 3519 | .tabs-right > .nav-tabs > li > a { 3520 | min-width: 74px; 3521 | margin-right: 0; 3522 | margin-bottom: 3px; 3523 | } 3524 | 3525 | .tabs-left > .nav-tabs { 3526 | float: left; 3527 | margin-right: 19px; 3528 | border-right: 1px solid #ddd; 3529 | } 3530 | 3531 | .tabs-left > .nav-tabs > li > a { 3532 | margin-right: -1px; 3533 | -webkit-border-radius: 4px 0 0 4px; 3534 | -moz-border-radius: 4px 0 0 4px; 3535 | border-radius: 4px 0 0 4px; 3536 | } 3537 | 3538 | .tabs-left > .nav-tabs > li > a:hover { 3539 | border-color: #eeeeee #dddddd #eeeeee #eeeeee; 3540 | } 3541 | 3542 | .tabs-left > .nav-tabs .active > a, 3543 | .tabs-left > .nav-tabs .active > a:hover { 3544 | border-color: #ddd transparent #ddd #ddd; 3545 | *border-right-color: #ffffff; 3546 | } 3547 | 3548 | .tabs-right > .nav-tabs { 3549 | float: right; 3550 | margin-left: 19px; 3551 | border-left: 1px solid #ddd; 3552 | } 3553 | 3554 | .tabs-right > .nav-tabs > li > a { 3555 | margin-left: -1px; 3556 | -webkit-border-radius: 0 4px 4px 0; 3557 | -moz-border-radius: 0 4px 4px 0; 3558 | border-radius: 0 4px 4px 0; 3559 | } 3560 | 3561 | .tabs-right > .nav-tabs > li > a:hover { 3562 | border-color: #eeeeee #eeeeee #eeeeee #dddddd; 3563 | } 3564 | 3565 | .tabs-right > .nav-tabs .active > a, 3566 | .tabs-right > .nav-tabs .active > a:hover { 3567 | border-color: #ddd #ddd #ddd transparent; 3568 | *border-left-color: #ffffff; 3569 | } 3570 | 3571 | .navbar { 3572 | *position: relative; 3573 | *z-index: 2; 3574 | margin-bottom: 18px; 3575 | overflow: visible; 3576 | } 3577 | 3578 | .navbar-inner { 3579 | min-height: 40px; 3580 | padding-right: 20px; 3581 | padding-left: 20px; 3582 | background-color: #2c2c2c; 3583 | background-image: -moz-linear-gradient(top, #333333, #222222); 3584 | background-image: -ms-linear-gradient(top, #333333, #222222); 3585 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); 3586 | background-image: -webkit-linear-gradient(top, #333333, #222222); 3587 | background-image: -o-linear-gradient(top, #333333, #222222); 3588 | background-image: linear-gradient(top, #333333, #222222); 3589 | background-repeat: repeat-x; 3590 | -webkit-border-radius: 4px; 3591 | -moz-border-radius: 4px; 3592 | border-radius: 4px; 3593 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); 3594 | -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); 3595 | -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); 3596 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); 3597 | } 3598 | 3599 | .navbar .container { 3600 | width: auto; 3601 | } 3602 | 3603 | .nav-collapse.collapse { 3604 | height: auto; 3605 | } 3606 | 3607 | .navbar { 3608 | color: #999999; 3609 | } 3610 | 3611 | .navbar .brand:hover { 3612 | text-decoration: none; 3613 | } 3614 | 3615 | .navbar .brand { 3616 | display: block; 3617 | float: left; 3618 | padding: 8px 20px 12px; 3619 | margin-left: -20px; 3620 | font-size: 20px; 3621 | font-weight: 200; 3622 | line-height: 1; 3623 | color: #999999; 3624 | } 3625 | 3626 | .navbar .navbar-text { 3627 | margin-bottom: 0; 3628 | line-height: 40px; 3629 | } 3630 | 3631 | .navbar .navbar-link { 3632 | color: #999999; 3633 | } 3634 | 3635 | .navbar .navbar-link:hover { 3636 | color: #ffffff; 3637 | } 3638 | 3639 | .navbar .btn, 3640 | .navbar .btn-group { 3641 | margin-top: 5px; 3642 | } 3643 | 3644 | .navbar .btn-group .btn { 3645 | margin: 0; 3646 | } 3647 | 3648 | .navbar-form { 3649 | margin-bottom: 0; 3650 | *zoom: 1; 3651 | } 3652 | 3653 | .navbar-form:before, 3654 | .navbar-form:after { 3655 | display: table; 3656 | content: ""; 3657 | } 3658 | 3659 | .navbar-form:after { 3660 | clear: both; 3661 | } 3662 | 3663 | .navbar-form input, 3664 | .navbar-form select, 3665 | .navbar-form .radio, 3666 | .navbar-form .checkbox { 3667 | margin-top: 5px; 3668 | } 3669 | 3670 | .navbar-form input, 3671 | .navbar-form select { 3672 | display: inline-block; 3673 | margin-bottom: 0; 3674 | } 3675 | 3676 | .navbar-form input[type="image"], 3677 | .navbar-form input[type="checkbox"], 3678 | .navbar-form input[type="radio"] { 3679 | margin-top: 3px; 3680 | } 3681 | 3682 | .navbar-form .input-append, 3683 | .navbar-form .input-prepend { 3684 | margin-top: 6px; 3685 | white-space: nowrap; 3686 | } 3687 | 3688 | .navbar-form .input-append input, 3689 | .navbar-form .input-prepend input { 3690 | margin-top: 0; 3691 | } 3692 | 3693 | .navbar-search { 3694 | position: relative; 3695 | float: left; 3696 | margin-top: 6px; 3697 | margin-bottom: 0; 3698 | } 3699 | 3700 | .navbar-search .search-query { 3701 | padding: 4px 9px; 3702 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 3703 | font-size: 13px; 3704 | font-weight: normal; 3705 | line-height: 1; 3706 | color: #ffffff; 3707 | background-color: #626262; 3708 | border: 1px solid #151515; 3709 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); 3710 | -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); 3711 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); 3712 | -webkit-transition: none; 3713 | -moz-transition: none; 3714 | -ms-transition: none; 3715 | -o-transition: none; 3716 | transition: none; 3717 | } 3718 | 3719 | .navbar-search .search-query:-moz-placeholder { 3720 | color: #cccccc; 3721 | } 3722 | 3723 | .navbar-search .search-query:-ms-input-placeholder { 3724 | color: #cccccc; 3725 | } 3726 | 3727 | .navbar-search .search-query::-webkit-input-placeholder { 3728 | color: #cccccc; 3729 | } 3730 | 3731 | .navbar-search .search-query:focus, 3732 | .navbar-search .search-query.focused { 3733 | padding: 5px 10px; 3734 | color: #333333; 3735 | text-shadow: 0 1px 0 #ffffff; 3736 | background-color: #ffffff; 3737 | border: 0; 3738 | outline: 0; 3739 | -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); 3740 | -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); 3741 | box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); 3742 | } 3743 | 3744 | .navbar-fixed-top, 3745 | .navbar-fixed-bottom { 3746 | position: fixed; 3747 | right: 0; 3748 | left: 0; 3749 | z-index: 1030; 3750 | margin-bottom: 0; 3751 | } 3752 | 3753 | .navbar-fixed-top .navbar-inner, 3754 | .navbar-fixed-bottom .navbar-inner { 3755 | padding-right: 0; 3756 | padding-left: 0; 3757 | -webkit-border-radius: 0; 3758 | -moz-border-radius: 0; 3759 | border-radius: 0; 3760 | } 3761 | 3762 | .navbar-fixed-top .container, 3763 | .navbar-fixed-bottom .container { 3764 | width: 940px; 3765 | } 3766 | 3767 | .navbar-fixed-top { 3768 | top: 0; 3769 | } 3770 | 3771 | .navbar-fixed-bottom { 3772 | bottom: 0; 3773 | } 3774 | 3775 | .navbar .nav { 3776 | position: relative; 3777 | left: 0; 3778 | display: block; 3779 | float: left; 3780 | margin: 0 10px 0 0; 3781 | } 3782 | 3783 | .navbar .nav.pull-right { 3784 | float: right; 3785 | } 3786 | 3787 | .navbar .nav > li { 3788 | display: block; 3789 | float: left; 3790 | } 3791 | 3792 | .navbar .nav > li > a { 3793 | float: none; 3794 | padding: 9px 10px 11px; 3795 | line-height: 19px; 3796 | color: #999999; 3797 | text-decoration: none; 3798 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 3799 | } 3800 | 3801 | .navbar .btn { 3802 | display: inline-block; 3803 | padding: 4px 10px 4px; 3804 | margin: 5px 5px 6px; 3805 | line-height: 18px; 3806 | } 3807 | 3808 | .navbar .btn-group { 3809 | padding: 5px 5px 6px; 3810 | margin: 0; 3811 | } 3812 | 3813 | .navbar .nav > li > a:hover { 3814 | color: #ffffff; 3815 | text-decoration: none; 3816 | background-color: transparent; 3817 | } 3818 | 3819 | .navbar .nav .active > a, 3820 | .navbar .nav .active > a:hover { 3821 | color: #ffffff; 3822 | text-decoration: none; 3823 | background-color: #222222; 3824 | } 3825 | 3826 | .navbar .divider-vertical { 3827 | width: 1px; 3828 | height: 40px; 3829 | margin: 0 9px; 3830 | overflow: hidden; 3831 | background-color: #222222; 3832 | border-right: 1px solid #333333; 3833 | } 3834 | 3835 | .navbar .nav.pull-right { 3836 | margin-right: 0; 3837 | margin-left: 10px; 3838 | } 3839 | 3840 | .navbar .btn-navbar { 3841 | display: none; 3842 | float: right; 3843 | padding: 7px 10px; 3844 | margin-right: 5px; 3845 | margin-left: 5px; 3846 | background-color: #2c2c2c; 3847 | *background-color: #222222; 3848 | background-image: -ms-linear-gradient(top, #333333, #222222); 3849 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); 3850 | background-image: -webkit-linear-gradient(top, #333333, #222222); 3851 | background-image: -o-linear-gradient(top, #333333, #222222); 3852 | background-image: linear-gradient(top, #333333, #222222); 3853 | background-image: -moz-linear-gradient(top, #333333, #222222); 3854 | background-repeat: repeat-x; 3855 | border-color: #222222 #222222 #000000; 3856 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 3857 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); 3858 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 3859 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); 3860 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); 3861 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); 3862 | } 3863 | 3864 | .navbar .btn-navbar:hover, 3865 | .navbar .btn-navbar:active, 3866 | .navbar .btn-navbar.active, 3867 | .navbar .btn-navbar.disabled, 3868 | .navbar .btn-navbar[disabled] { 3869 | background-color: #222222; 3870 | *background-color: #151515; 3871 | } 3872 | 3873 | .navbar .btn-navbar:active, 3874 | .navbar .btn-navbar.active { 3875 | background-color: #080808 \9; 3876 | } 3877 | 3878 | .navbar .btn-navbar .icon-bar { 3879 | display: block; 3880 | width: 18px; 3881 | height: 2px; 3882 | background-color: #f5f5f5; 3883 | -webkit-border-radius: 1px; 3884 | -moz-border-radius: 1px; 3885 | border-radius: 1px; 3886 | -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); 3887 | -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); 3888 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); 3889 | } 3890 | 3891 | .btn-navbar .icon-bar + .icon-bar { 3892 | margin-top: 3px; 3893 | } 3894 | 3895 | .navbar .dropdown-menu:before { 3896 | position: absolute; 3897 | top: -7px; 3898 | left: 9px; 3899 | display: inline-block; 3900 | border-right: 7px solid transparent; 3901 | border-bottom: 7px solid #ccc; 3902 | border-left: 7px solid transparent; 3903 | border-bottom-color: rgba(0, 0, 0, 0.2); 3904 | content: ''; 3905 | } 3906 | 3907 | .navbar .dropdown-menu:after { 3908 | position: absolute; 3909 | top: -6px; 3910 | left: 10px; 3911 | display: inline-block; 3912 | border-right: 6px solid transparent; 3913 | border-bottom: 6px solid #ffffff; 3914 | border-left: 6px solid transparent; 3915 | content: ''; 3916 | } 3917 | 3918 | .navbar-fixed-bottom .dropdown-menu:before { 3919 | top: auto; 3920 | bottom: -7px; 3921 | border-top: 7px solid #ccc; 3922 | border-bottom: 0; 3923 | border-top-color: rgba(0, 0, 0, 0.2); 3924 | } 3925 | 3926 | .navbar-fixed-bottom .dropdown-menu:after { 3927 | top: auto; 3928 | bottom: -6px; 3929 | border-top: 6px solid #ffffff; 3930 | border-bottom: 0; 3931 | } 3932 | 3933 | .navbar .nav li.dropdown .dropdown-toggle .caret, 3934 | .navbar .nav li.dropdown.open .caret { 3935 | border-top-color: #ffffff; 3936 | border-bottom-color: #ffffff; 3937 | } 3938 | 3939 | .navbar .nav li.dropdown.active .caret { 3940 | opacity: 1; 3941 | filter: alpha(opacity=100); 3942 | } 3943 | 3944 | .navbar .nav li.dropdown.open > .dropdown-toggle, 3945 | .navbar .nav li.dropdown.active > .dropdown-toggle, 3946 | .navbar .nav li.dropdown.open.active > .dropdown-toggle { 3947 | background-color: transparent; 3948 | } 3949 | 3950 | .navbar .nav li.dropdown.active > .dropdown-toggle:hover { 3951 | color: #ffffff; 3952 | } 3953 | 3954 | .navbar .pull-right .dropdown-menu, 3955 | .navbar .dropdown-menu.pull-right { 3956 | right: 0; 3957 | left: auto; 3958 | } 3959 | 3960 | .navbar .pull-right .dropdown-menu:before, 3961 | .navbar .dropdown-menu.pull-right:before { 3962 | right: 12px; 3963 | left: auto; 3964 | } 3965 | 3966 | .navbar .pull-right .dropdown-menu:after, 3967 | .navbar .dropdown-menu.pull-right:after { 3968 | right: 13px; 3969 | left: auto; 3970 | } 3971 | 3972 | .breadcrumb { 3973 | padding: 7px 14px; 3974 | margin: 0 0 18px; 3975 | list-style: none; 3976 | background-color: #fbfbfb; 3977 | background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); 3978 | background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); 3979 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); 3980 | background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); 3981 | background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); 3982 | background-image: linear-gradient(top, #ffffff, #f5f5f5); 3983 | background-repeat: repeat-x; 3984 | border: 1px solid #ddd; 3985 | -webkit-border-radius: 3px; 3986 | -moz-border-radius: 3px; 3987 | border-radius: 3px; 3988 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); 3989 | -webkit-box-shadow: inset 0 1px 0 #ffffff; 3990 | -moz-box-shadow: inset 0 1px 0 #ffffff; 3991 | box-shadow: inset 0 1px 0 #ffffff; 3992 | } 3993 | 3994 | .breadcrumb li { 3995 | display: inline-block; 3996 | *display: inline; 3997 | text-shadow: 0 1px 0 #ffffff; 3998 | *zoom: 1; 3999 | } 4000 | 4001 | .breadcrumb .divider { 4002 | padding: 0 5px; 4003 | color: #999999; 4004 | } 4005 | 4006 | .breadcrumb .active a { 4007 | color: #333333; 4008 | } 4009 | 4010 | .pagination { 4011 | height: 36px; 4012 | margin: 18px 0; 4013 | } 4014 | 4015 | .pagination ul { 4016 | display: inline-block; 4017 | *display: inline; 4018 | margin-bottom: 0; 4019 | margin-left: 0; 4020 | -webkit-border-radius: 3px; 4021 | -moz-border-radius: 3px; 4022 | border-radius: 3px; 4023 | *zoom: 1; 4024 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); 4025 | -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); 4026 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); 4027 | } 4028 | 4029 | .pagination li { 4030 | display: inline; 4031 | } 4032 | 4033 | .pagination a { 4034 | float: left; 4035 | padding: 0 14px; 4036 | line-height: 34px; 4037 | text-decoration: none; 4038 | border: 1px solid #ddd; 4039 | border-left-width: 0; 4040 | } 4041 | 4042 | .pagination a:hover, 4043 | .pagination .active a { 4044 | background-color: #f5f5f5; 4045 | } 4046 | 4047 | .pagination .active a { 4048 | color: #999999; 4049 | cursor: default; 4050 | } 4051 | 4052 | .pagination .disabled span, 4053 | .pagination .disabled a, 4054 | .pagination .disabled a:hover { 4055 | color: #999999; 4056 | cursor: default; 4057 | background-color: transparent; 4058 | } 4059 | 4060 | .pagination li:first-child a { 4061 | border-left-width: 1px; 4062 | -webkit-border-radius: 3px 0 0 3px; 4063 | -moz-border-radius: 3px 0 0 3px; 4064 | border-radius: 3px 0 0 3px; 4065 | } 4066 | 4067 | .pagination li:last-child a { 4068 | -webkit-border-radius: 0 3px 3px 0; 4069 | -moz-border-radius: 0 3px 3px 0; 4070 | border-radius: 0 3px 3px 0; 4071 | } 4072 | 4073 | .pagination-centered { 4074 | text-align: center; 4075 | } 4076 | 4077 | .pagination-right { 4078 | text-align: right; 4079 | } 4080 | 4081 | .pager { 4082 | margin-bottom: 18px; 4083 | margin-left: 0; 4084 | text-align: center; 4085 | list-style: none; 4086 | *zoom: 1; 4087 | } 4088 | 4089 | .pager:before, 4090 | .pager:after { 4091 | display: table; 4092 | content: ""; 4093 | } 4094 | 4095 | .pager:after { 4096 | clear: both; 4097 | } 4098 | 4099 | .pager li { 4100 | display: inline; 4101 | } 4102 | 4103 | .pager a { 4104 | display: inline-block; 4105 | padding: 5px 14px; 4106 | background-color: #fff; 4107 | border: 1px solid #ddd; 4108 | -webkit-border-radius: 15px; 4109 | -moz-border-radius: 15px; 4110 | border-radius: 15px; 4111 | } 4112 | 4113 | .pager a:hover { 4114 | text-decoration: none; 4115 | background-color: #f5f5f5; 4116 | } 4117 | 4118 | .pager .next a { 4119 | float: right; 4120 | } 4121 | 4122 | .pager .previous a { 4123 | float: left; 4124 | } 4125 | 4126 | .pager .disabled a, 4127 | .pager .disabled a:hover { 4128 | color: #999999; 4129 | cursor: default; 4130 | background-color: #fff; 4131 | } 4132 | 4133 | .modal-open .dropdown-menu { 4134 | z-index: 2050; 4135 | } 4136 | 4137 | .modal-open .dropdown.open { 4138 | *z-index: 2050; 4139 | } 4140 | 4141 | .modal-open .popover { 4142 | z-index: 2060; 4143 | } 4144 | 4145 | .modal-open .tooltip { 4146 | z-index: 2070; 4147 | } 4148 | 4149 | .modal-backdrop { 4150 | position: fixed; 4151 | top: 0; 4152 | right: 0; 4153 | bottom: 0; 4154 | left: 0; 4155 | z-index: 1040; 4156 | background-color: #000000; 4157 | } 4158 | 4159 | .modal-backdrop.fade { 4160 | opacity: 0; 4161 | } 4162 | 4163 | .modal-backdrop, 4164 | .modal-backdrop.fade.in { 4165 | opacity: 0.8; 4166 | filter: alpha(opacity=80); 4167 | } 4168 | 4169 | .modal { 4170 | position: fixed; 4171 | top: 50%; 4172 | left: 50%; 4173 | z-index: 1050; 4174 | width: 560px; 4175 | margin: -250px 0 0 -280px; 4176 | overflow: auto; 4177 | background-color: #ffffff; 4178 | border: 1px solid #999; 4179 | border: 1px solid rgba(0, 0, 0, 0.3); 4180 | *border: 1px solid #999; 4181 | -webkit-border-radius: 6px; 4182 | -moz-border-radius: 6px; 4183 | border-radius: 6px; 4184 | -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 4185 | -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 4186 | box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 4187 | -webkit-background-clip: padding-box; 4188 | -moz-background-clip: padding-box; 4189 | background-clip: padding-box; 4190 | } 4191 | 4192 | .modal.fade { 4193 | top: -25%; 4194 | -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; 4195 | -moz-transition: opacity 0.3s linear, top 0.3s ease-out; 4196 | -ms-transition: opacity 0.3s linear, top 0.3s ease-out; 4197 | -o-transition: opacity 0.3s linear, top 0.3s ease-out; 4198 | transition: opacity 0.3s linear, top 0.3s ease-out; 4199 | } 4200 | 4201 | .modal.fade.in { 4202 | top: 50%; 4203 | } 4204 | 4205 | .modal-header { 4206 | padding: 9px 15px; 4207 | border-bottom: 1px solid #eee; 4208 | } 4209 | 4210 | .modal-header .close { 4211 | margin-top: 2px; 4212 | } 4213 | 4214 | .modal-body { 4215 | max-height: 400px; 4216 | padding: 15px; 4217 | overflow-y: auto; 4218 | } 4219 | 4220 | .modal-form { 4221 | margin-bottom: 0; 4222 | } 4223 | 4224 | .modal-footer { 4225 | padding: 14px 15px 15px; 4226 | margin-bottom: 0; 4227 | text-align: right; 4228 | background-color: #f5f5f5; 4229 | border-top: 1px solid #ddd; 4230 | -webkit-border-radius: 0 0 6px 6px; 4231 | -moz-border-radius: 0 0 6px 6px; 4232 | border-radius: 0 0 6px 6px; 4233 | *zoom: 1; 4234 | -webkit-box-shadow: inset 0 1px 0 #ffffff; 4235 | -moz-box-shadow: inset 0 1px 0 #ffffff; 4236 | box-shadow: inset 0 1px 0 #ffffff; 4237 | } 4238 | 4239 | .modal-footer:before, 4240 | .modal-footer:after { 4241 | display: table; 4242 | content: ""; 4243 | } 4244 | 4245 | .modal-footer:after { 4246 | clear: both; 4247 | } 4248 | 4249 | .modal-footer .btn + .btn { 4250 | margin-bottom: 0; 4251 | margin-left: 5px; 4252 | } 4253 | 4254 | .modal-footer .btn-group .btn + .btn { 4255 | margin-left: -1px; 4256 | } 4257 | 4258 | .tooltip { 4259 | position: absolute; 4260 | z-index: 1020; 4261 | display: block; 4262 | padding: 5px; 4263 | font-size: 11px; 4264 | opacity: 0; 4265 | filter: alpha(opacity=0); 4266 | visibility: visible; 4267 | } 4268 | 4269 | .tooltip.in { 4270 | opacity: 0.8; 4271 | filter: alpha(opacity=80); 4272 | } 4273 | 4274 | .tooltip.top { 4275 | margin-top: -2px; 4276 | } 4277 | 4278 | .tooltip.right { 4279 | margin-left: 2px; 4280 | } 4281 | 4282 | .tooltip.bottom { 4283 | margin-top: 2px; 4284 | } 4285 | 4286 | .tooltip.left { 4287 | margin-left: -2px; 4288 | } 4289 | 4290 | .tooltip.top .tooltip-arrow { 4291 | bottom: 0; 4292 | left: 50%; 4293 | margin-left: -5px; 4294 | border-top: 5px solid #000000; 4295 | border-right: 5px solid transparent; 4296 | border-left: 5px solid transparent; 4297 | } 4298 | 4299 | .tooltip.left .tooltip-arrow { 4300 | top: 50%; 4301 | right: 0; 4302 | margin-top: -5px; 4303 | border-top: 5px solid transparent; 4304 | border-bottom: 5px solid transparent; 4305 | border-left: 5px solid #000000; 4306 | } 4307 | 4308 | .tooltip.bottom .tooltip-arrow { 4309 | top: 0; 4310 | left: 50%; 4311 | margin-left: -5px; 4312 | border-right: 5px solid transparent; 4313 | border-bottom: 5px solid #000000; 4314 | border-left: 5px solid transparent; 4315 | } 4316 | 4317 | .tooltip.right .tooltip-arrow { 4318 | top: 50%; 4319 | left: 0; 4320 | margin-top: -5px; 4321 | border-top: 5px solid transparent; 4322 | border-right: 5px solid #000000; 4323 | border-bottom: 5px solid transparent; 4324 | } 4325 | 4326 | .tooltip-inner { 4327 | max-width: 200px; 4328 | padding: 3px 8px; 4329 | color: #ffffff; 4330 | text-align: center; 4331 | text-decoration: none; 4332 | background-color: #000000; 4333 | -webkit-border-radius: 4px; 4334 | -moz-border-radius: 4px; 4335 | border-radius: 4px; 4336 | } 4337 | 4338 | .tooltip-arrow { 4339 | position: absolute; 4340 | width: 0; 4341 | height: 0; 4342 | } 4343 | 4344 | .popover { 4345 | position: absolute; 4346 | top: 0; 4347 | left: 0; 4348 | z-index: 1010; 4349 | display: none; 4350 | padding: 5px; 4351 | } 4352 | 4353 | .popover.top { 4354 | margin-top: -5px; 4355 | } 4356 | 4357 | .popover.right { 4358 | margin-left: 5px; 4359 | } 4360 | 4361 | .popover.bottom { 4362 | margin-top: 5px; 4363 | } 4364 | 4365 | .popover.left { 4366 | margin-left: -5px; 4367 | } 4368 | 4369 | .popover.top .arrow { 4370 | bottom: 0; 4371 | left: 50%; 4372 | margin-left: -5px; 4373 | border-top: 5px solid #000000; 4374 | border-right: 5px solid transparent; 4375 | border-left: 5px solid transparent; 4376 | } 4377 | 4378 | .popover.right .arrow { 4379 | top: 50%; 4380 | left: 0; 4381 | margin-top: -5px; 4382 | border-top: 5px solid transparent; 4383 | border-right: 5px solid #000000; 4384 | border-bottom: 5px solid transparent; 4385 | } 4386 | 4387 | .popover.bottom .arrow { 4388 | top: 0; 4389 | left: 50%; 4390 | margin-left: -5px; 4391 | border-right: 5px solid transparent; 4392 | border-bottom: 5px solid #000000; 4393 | border-left: 5px solid transparent; 4394 | } 4395 | 4396 | .popover.left .arrow { 4397 | top: 50%; 4398 | right: 0; 4399 | margin-top: -5px; 4400 | border-top: 5px solid transparent; 4401 | border-bottom: 5px solid transparent; 4402 | border-left: 5px solid #000000; 4403 | } 4404 | 4405 | .popover .arrow { 4406 | position: absolute; 4407 | width: 0; 4408 | height: 0; 4409 | } 4410 | 4411 | .popover-inner { 4412 | width: 280px; 4413 | padding: 3px; 4414 | overflow: hidden; 4415 | background: #000000; 4416 | background: rgba(0, 0, 0, 0.8); 4417 | -webkit-border-radius: 6px; 4418 | -moz-border-radius: 6px; 4419 | border-radius: 6px; 4420 | -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 4421 | -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 4422 | box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 4423 | } 4424 | 4425 | .popover-title { 4426 | padding: 9px 15px; 4427 | line-height: 1; 4428 | background-color: #f5f5f5; 4429 | border-bottom: 1px solid #eee; 4430 | -webkit-border-radius: 3px 3px 0 0; 4431 | -moz-border-radius: 3px 3px 0 0; 4432 | border-radius: 3px 3px 0 0; 4433 | } 4434 | 4435 | .popover-content { 4436 | padding: 14px; 4437 | background-color: #ffffff; 4438 | -webkit-border-radius: 0 0 3px 3px; 4439 | -moz-border-radius: 0 0 3px 3px; 4440 | border-radius: 0 0 3px 3px; 4441 | -webkit-background-clip: padding-box; 4442 | -moz-background-clip: padding-box; 4443 | background-clip: padding-box; 4444 | } 4445 | 4446 | .popover-content p, 4447 | .popover-content ul, 4448 | .popover-content ol { 4449 | margin-bottom: 0; 4450 | } 4451 | 4452 | .thumbnails { 4453 | margin-left: -20px; 4454 | list-style: none; 4455 | *zoom: 1; 4456 | } 4457 | 4458 | .thumbnails:before, 4459 | .thumbnails:after { 4460 | display: table; 4461 | content: ""; 4462 | } 4463 | 4464 | .thumbnails:after { 4465 | clear: both; 4466 | } 4467 | 4468 | .row-fluid .thumbnails { 4469 | margin-left: 0; 4470 | } 4471 | 4472 | .thumbnails > li { 4473 | float: left; 4474 | margin-bottom: 18px; 4475 | margin-left: 20px; 4476 | } 4477 | 4478 | .thumbnail { 4479 | display: block; 4480 | padding: 4px; 4481 | line-height: 1; 4482 | border: 1px solid #ddd; 4483 | -webkit-border-radius: 4px; 4484 | -moz-border-radius: 4px; 4485 | border-radius: 4px; 4486 | -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); 4487 | -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); 4488 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); 4489 | } 4490 | 4491 | a.thumbnail:hover { 4492 | border-color: #0088cc; 4493 | -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); 4494 | -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); 4495 | box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); 4496 | } 4497 | 4498 | .thumbnail > img { 4499 | display: block; 4500 | max-width: 100%; 4501 | margin-right: auto; 4502 | margin-left: auto; 4503 | } 4504 | 4505 | .thumbnail .caption { 4506 | padding: 9px; 4507 | } 4508 | 4509 | .label, 4510 | .badge { 4511 | font-size: 10.998px; 4512 | font-weight: bold; 4513 | line-height: 14px; 4514 | color: #ffffff; 4515 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 4516 | white-space: nowrap; 4517 | vertical-align: baseline; 4518 | background-color: #999999; 4519 | } 4520 | 4521 | .label { 4522 | padding: 1px 4px 2px; 4523 | -webkit-border-radius: 3px; 4524 | -moz-border-radius: 3px; 4525 | border-radius: 3px; 4526 | } 4527 | 4528 | .badge { 4529 | padding: 1px 9px 2px; 4530 | -webkit-border-radius: 9px; 4531 | -moz-border-radius: 9px; 4532 | border-radius: 9px; 4533 | } 4534 | 4535 | a.label:hover, 4536 | a.badge:hover { 4537 | color: #ffffff; 4538 | text-decoration: none; 4539 | cursor: pointer; 4540 | } 4541 | 4542 | .label-important, 4543 | .badge-important { 4544 | background-color: #b94a48; 4545 | } 4546 | 4547 | .label-important[href], 4548 | .badge-important[href] { 4549 | background-color: #953b39; 4550 | } 4551 | 4552 | .label-warning, 4553 | .badge-warning { 4554 | background-color: #f89406; 4555 | } 4556 | 4557 | .label-warning[href], 4558 | .badge-warning[href] { 4559 | background-color: #c67605; 4560 | } 4561 | 4562 | .label-success, 4563 | .badge-success { 4564 | background-color: #468847; 4565 | } 4566 | 4567 | .label-success[href], 4568 | .badge-success[href] { 4569 | background-color: #356635; 4570 | } 4571 | 4572 | .label-info, 4573 | .badge-info { 4574 | background-color: #3a87ad; 4575 | } 4576 | 4577 | .label-info[href], 4578 | .badge-info[href] { 4579 | background-color: #2d6987; 4580 | } 4581 | 4582 | .label-inverse, 4583 | .badge-inverse { 4584 | background-color: #333333; 4585 | } 4586 | 4587 | .label-inverse[href], 4588 | .badge-inverse[href] { 4589 | background-color: #1a1a1a; 4590 | } 4591 | 4592 | @-webkit-keyframes progress-bar-stripes { 4593 | from { 4594 | background-position: 40px 0; 4595 | } 4596 | to { 4597 | background-position: 0 0; 4598 | } 4599 | } 4600 | 4601 | @-moz-keyframes progress-bar-stripes { 4602 | from { 4603 | background-position: 40px 0; 4604 | } 4605 | to { 4606 | background-position: 0 0; 4607 | } 4608 | } 4609 | 4610 | @-ms-keyframes progress-bar-stripes { 4611 | from { 4612 | background-position: 40px 0; 4613 | } 4614 | to { 4615 | background-position: 0 0; 4616 | } 4617 | } 4618 | 4619 | @-o-keyframes progress-bar-stripes { 4620 | from { 4621 | background-position: 0 0; 4622 | } 4623 | to { 4624 | background-position: 40px 0; 4625 | } 4626 | } 4627 | 4628 | @keyframes progress-bar-stripes { 4629 | from { 4630 | background-position: 40px 0; 4631 | } 4632 | to { 4633 | background-position: 0 0; 4634 | } 4635 | } 4636 | 4637 | .progress { 4638 | height: 18px; 4639 | margin-bottom: 18px; 4640 | overflow: hidden; 4641 | background-color: #f7f7f7; 4642 | background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); 4643 | background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); 4644 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); 4645 | background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); 4646 | background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); 4647 | background-image: linear-gradient(top, #f5f5f5, #f9f9f9); 4648 | background-repeat: repeat-x; 4649 | -webkit-border-radius: 4px; 4650 | -moz-border-radius: 4px; 4651 | border-radius: 4px; 4652 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); 4653 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); 4654 | -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); 4655 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); 4656 | } 4657 | 4658 | .progress .bar { 4659 | width: 0; 4660 | height: 18px; 4661 | font-size: 12px; 4662 | color: #ffffff; 4663 | text-align: center; 4664 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 4665 | background-color: #0e90d2; 4666 | background-image: -moz-linear-gradient(top, #149bdf, #0480be); 4667 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); 4668 | background-image: -webkit-linear-gradient(top, #149bdf, #0480be); 4669 | background-image: -o-linear-gradient(top, #149bdf, #0480be); 4670 | background-image: linear-gradient(top, #149bdf, #0480be); 4671 | background-image: -ms-linear-gradient(top, #149bdf, #0480be); 4672 | background-repeat: repeat-x; 4673 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); 4674 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); 4675 | -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); 4676 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); 4677 | -webkit-box-sizing: border-box; 4678 | -moz-box-sizing: border-box; 4679 | -ms-box-sizing: border-box; 4680 | box-sizing: border-box; 4681 | -webkit-transition: width 0.6s ease; 4682 | -moz-transition: width 0.6s ease; 4683 | -ms-transition: width 0.6s ease; 4684 | -o-transition: width 0.6s ease; 4685 | transition: width 0.6s ease; 4686 | } 4687 | 4688 | .progress-striped .bar { 4689 | background-color: #149bdf; 4690 | background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4691 | background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4692 | background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4693 | background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4694 | background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); 4695 | background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4696 | -webkit-background-size: 40px 40px; 4697 | -moz-background-size: 40px 40px; 4698 | -o-background-size: 40px 40px; 4699 | background-size: 40px 40px; 4700 | } 4701 | 4702 | .progress.active .bar { 4703 | -webkit-animation: progress-bar-stripes 2s linear infinite; 4704 | -moz-animation: progress-bar-stripes 2s linear infinite; 4705 | -ms-animation: progress-bar-stripes 2s linear infinite; 4706 | -o-animation: progress-bar-stripes 2s linear infinite; 4707 | animation: progress-bar-stripes 2s linear infinite; 4708 | } 4709 | 4710 | .progress-danger .bar { 4711 | background-color: #dd514c; 4712 | background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); 4713 | background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); 4714 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); 4715 | background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); 4716 | background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); 4717 | background-image: linear-gradient(top, #ee5f5b, #c43c35); 4718 | background-repeat: repeat-x; 4719 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); 4720 | } 4721 | 4722 | .progress-danger.progress-striped .bar { 4723 | background-color: #ee5f5b; 4724 | background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); 4725 | background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4726 | background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4727 | background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4728 | background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4729 | background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4730 | } 4731 | 4732 | .progress-success .bar { 4733 | background-color: #5eb95e; 4734 | background-image: -moz-linear-gradient(top, #62c462, #57a957); 4735 | background-image: -ms-linear-gradient(top, #62c462, #57a957); 4736 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); 4737 | background-image: -webkit-linear-gradient(top, #62c462, #57a957); 4738 | background-image: -o-linear-gradient(top, #62c462, #57a957); 4739 | background-image: linear-gradient(top, #62c462, #57a957); 4740 | background-repeat: repeat-x; 4741 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); 4742 | } 4743 | 4744 | .progress-success.progress-striped .bar { 4745 | background-color: #62c462; 4746 | background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); 4747 | background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4748 | background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4749 | background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4750 | background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4751 | background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4752 | } 4753 | 4754 | .progress-info .bar { 4755 | background-color: #4bb1cf; 4756 | background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); 4757 | background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); 4758 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); 4759 | background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); 4760 | background-image: -o-linear-gradient(top, #5bc0de, #339bb9); 4761 | background-image: linear-gradient(top, #5bc0de, #339bb9); 4762 | background-repeat: repeat-x; 4763 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); 4764 | } 4765 | 4766 | .progress-info.progress-striped .bar { 4767 | background-color: #5bc0de; 4768 | background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); 4769 | background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4770 | background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4771 | background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4772 | background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4773 | background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4774 | } 4775 | 4776 | .progress-warning .bar { 4777 | background-color: #faa732; 4778 | background-image: -moz-linear-gradient(top, #fbb450, #f89406); 4779 | background-image: -ms-linear-gradient(top, #fbb450, #f89406); 4780 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); 4781 | background-image: -webkit-linear-gradient(top, #fbb450, #f89406); 4782 | background-image: -o-linear-gradient(top, #fbb450, #f89406); 4783 | background-image: linear-gradient(top, #fbb450, #f89406); 4784 | background-repeat: repeat-x; 4785 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); 4786 | } 4787 | 4788 | .progress-warning.progress-striped .bar { 4789 | background-color: #fbb450; 4790 | background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); 4791 | background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4792 | background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4793 | background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4794 | background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4795 | background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 4796 | } 4797 | 4798 | .accordion { 4799 | margin-bottom: 18px; 4800 | } 4801 | 4802 | .accordion-group { 4803 | margin-bottom: 2px; 4804 | border: 1px solid #e5e5e5; 4805 | -webkit-border-radius: 4px; 4806 | -moz-border-radius: 4px; 4807 | border-radius: 4px; 4808 | } 4809 | 4810 | .accordion-heading { 4811 | border-bottom: 0; 4812 | } 4813 | 4814 | .accordion-heading .accordion-toggle { 4815 | display: block; 4816 | padding: 8px 15px; 4817 | } 4818 | 4819 | .accordion-toggle { 4820 | cursor: pointer; 4821 | } 4822 | 4823 | .accordion-inner { 4824 | padding: 9px 15px; 4825 | border-top: 1px solid #e5e5e5; 4826 | } 4827 | 4828 | .carousel { 4829 | position: relative; 4830 | margin-bottom: 18px; 4831 | line-height: 1; 4832 | } 4833 | 4834 | .carousel-inner { 4835 | position: relative; 4836 | width: 100%; 4837 | overflow: hidden; 4838 | } 4839 | 4840 | .carousel .item { 4841 | position: relative; 4842 | display: none; 4843 | -webkit-transition: 0.6s ease-in-out left; 4844 | -moz-transition: 0.6s ease-in-out left; 4845 | -ms-transition: 0.6s ease-in-out left; 4846 | -o-transition: 0.6s ease-in-out left; 4847 | transition: 0.6s ease-in-out left; 4848 | } 4849 | 4850 | .carousel .item > img { 4851 | display: block; 4852 | line-height: 1; 4853 | } 4854 | 4855 | .carousel .active, 4856 | .carousel .next, 4857 | .carousel .prev { 4858 | display: block; 4859 | } 4860 | 4861 | .carousel .active { 4862 | left: 0; 4863 | } 4864 | 4865 | .carousel .next, 4866 | .carousel .prev { 4867 | position: absolute; 4868 | top: 0; 4869 | width: 100%; 4870 | } 4871 | 4872 | .carousel .next { 4873 | left: 100%; 4874 | } 4875 | 4876 | .carousel .prev { 4877 | left: -100%; 4878 | } 4879 | 4880 | .carousel .next.left, 4881 | .carousel .prev.right { 4882 | left: 0; 4883 | } 4884 | 4885 | .carousel .active.left { 4886 | left: -100%; 4887 | } 4888 | 4889 | .carousel .active.right { 4890 | left: 100%; 4891 | } 4892 | 4893 | .carousel-control { 4894 | position: absolute; 4895 | top: 40%; 4896 | left: 15px; 4897 | width: 40px; 4898 | height: 40px; 4899 | margin-top: -20px; 4900 | font-size: 60px; 4901 | font-weight: 100; 4902 | line-height: 30px; 4903 | color: #ffffff; 4904 | text-align: center; 4905 | background: #222222; 4906 | border: 3px solid #ffffff; 4907 | -webkit-border-radius: 23px; 4908 | -moz-border-radius: 23px; 4909 | border-radius: 23px; 4910 | opacity: 0.5; 4911 | filter: alpha(opacity=50); 4912 | } 4913 | 4914 | .carousel-control.right { 4915 | right: 15px; 4916 | left: auto; 4917 | } 4918 | 4919 | .carousel-control:hover { 4920 | color: #ffffff; 4921 | text-decoration: none; 4922 | opacity: 0.9; 4923 | filter: alpha(opacity=90); 4924 | } 4925 | 4926 | .carousel-caption { 4927 | position: absolute; 4928 | right: 0; 4929 | bottom: 0; 4930 | left: 0; 4931 | padding: 10px 15px 5px; 4932 | background: #333333; 4933 | background: rgba(0, 0, 0, 0.75); 4934 | } 4935 | 4936 | .carousel-caption h4, 4937 | .carousel-caption p { 4938 | color: #ffffff; 4939 | } 4940 | 4941 | .hero-unit { 4942 | padding: 60px; 4943 | margin-bottom: 30px; 4944 | background-color: #eeeeee; 4945 | -webkit-border-radius: 6px; 4946 | -moz-border-radius: 6px; 4947 | border-radius: 6px; 4948 | } 4949 | 4950 | .hero-unit h1 { 4951 | margin-bottom: 0; 4952 | font-size: 60px; 4953 | line-height: 1; 4954 | letter-spacing: -1px; 4955 | color: inherit; 4956 | } 4957 | 4958 | .hero-unit p { 4959 | font-size: 18px; 4960 | font-weight: 200; 4961 | line-height: 27px; 4962 | color: inherit; 4963 | } 4964 | 4965 | .pull-right { 4966 | float: right; 4967 | } 4968 | 4969 | .pull-left { 4970 | float: left; 4971 | } 4972 | 4973 | .hide { 4974 | display: none; 4975 | } 4976 | 4977 | .show { 4978 | display: block; 4979 | } 4980 | 4981 | .invisible { 4982 | visibility: hidden; 4983 | } 4984 | -------------------------------------------------------------------------------- /docs/_themes/mysolr/theme.conf: -------------------------------------------------------------------------------- 1 | [theme] 2 | inherit = basic 3 | stylesheet = bootstrap.css 4 | pygments_style = flask_theme_support.FlaskyStyle 5 | 6 | [options] 7 | github = RedTuna/mysolr -------------------------------------------------------------------------------- /docs/api/classes.rst: -------------------------------------------------------------------------------- 1 | .. _classes: 2 | 3 | Classes 4 | ======= 5 | 6 | .. module:: mysolr 7 | 8 | Solr class 9 | ---------- 10 | 11 | .. autoclass:: Solr 12 | :inherited-members: 13 | 14 | SolrResponse class 15 | ------------------ 16 | 17 | .. autoclass:: SolrResponse 18 | :inherited-members: 19 | 20 | 21 | Cursor class 22 | ------------ 23 | 24 | .. autoclass:: Cursor 25 | :inherited-members: -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # mysolr documentation build configuration file, created by 4 | # sphinx-quickstart on Wed Aug 31 09:39:29 2011. 5 | # 6 | # This file is execfile()d with the current directory set to its containing dir. 7 | # 8 | # Note that not all possible configuration values are present in this 9 | # autogenerated file. 10 | # 11 | # All configuration values have a default; values that are commented out 12 | # serve to show the default. 13 | 14 | import sys, os 15 | 16 | # If extensions (or modules to document with autodoc) are in another directory, 17 | # add these directories to sys.path here. If the directory is relative to the 18 | # documentation root, use os.path.abspath to make it absolute, like shown here. 19 | sys.path.insert(0, os.path.abspath('..')) 20 | import mysolr 21 | from mysolr import __version__ 22 | 23 | # -- General configuration ----------------------------------------------------- 24 | 25 | # If your documentation needs a minimal Sphinx version, state it here. 26 | #needs_sphinx = '1.0' 27 | 28 | # Add any Sphinx extension module names here, as strings. They can be extensions 29 | # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. 30 | extensions = ['sphinx.ext.autodoc'] 31 | 32 | # Add any paths that contain templates here, relative to this directory. 33 | templates_path = ['_templates'] 34 | 35 | # The suffix of source filenames. 36 | source_suffix = '.rst' 37 | 38 | # The encoding of source files. 39 | #source_encoding = 'utf-8-sig' 40 | 41 | # The master toctree document. 42 | master_doc = 'index' 43 | 44 | # General information about the project. 45 | project = u'mysolr' 46 | copyright = u'2011-2012, Rubén Abad, Miguel Olivares' 47 | 48 | # The version info for the project you're documenting, acts as replacement for 49 | # |version| and |release|, also used in various other places throughout the 50 | # built documents. 51 | # 52 | # The short X.Y version. 53 | version = __version__ 54 | # The full version, including alpha/beta/rc tags. 55 | release = version 56 | 57 | # The language for content autogenerated by Sphinx. Refer to documentation 58 | # for a list of supported languages. 59 | #language = None 60 | 61 | # There are two options for replacing |today|: either, you set today to some 62 | # non-false value, then it is used: 63 | #today = '' 64 | # Else, today_fmt is used as the format for a strftime call. 65 | #today_fmt = '%B %d, %Y' 66 | 67 | # List of patterns, relative to source directory, that match files and 68 | # directories to ignore when looking for source files. 69 | exclude_patterns = ['_build'] 70 | 71 | # The reST default role (used for this markup: `text`) to use for all documents. 72 | #default_role = None 73 | 74 | # If true, '()' will be appended to :func: etc. cross-reference text. 75 | #add_function_parentheses = True 76 | 77 | # If true, the current module name will be prepended to all description 78 | # unit titles (such as .. function::). 79 | #add_module_names = True 80 | 81 | # If true, sectionauthor and moduleauthor directives will be shown in the 82 | # output. They are ignored by default. 83 | #show_authors = False 84 | 85 | # The name of the Pygments (syntax highlighting) style to use. 86 | pygments_style = 'flask_theme_support.FlaskyStyle' 87 | 88 | # A list of ignored prefixes for module index sorting. 89 | #modindex_common_prefix = [] 90 | 91 | 92 | # -- Options for HTML output --------------------------------------------------- 93 | 94 | # The theme to use for HTML and HTML Help pages. See the documentation for 95 | # a list of builtin themes. 96 | html_theme = 'default' 97 | 98 | # Theme options are theme-specific and customize the look and feel of a theme 99 | # further. For a list of options available for each theme, see the 100 | # documentation. 101 | #html_theme_options = {} 102 | 103 | # Add any paths that contain custom themes here, relative to this directory. 104 | #html_theme_path = [] 105 | 106 | # The name for this set of Sphinx documents. If None, it defaults to 107 | # " v documentation". 108 | #html_title = None 109 | 110 | # A shorter title for the navigation bar. Default is the same as html_title. 111 | #html_short_title = None 112 | 113 | # The name of an image file (relative to this directory) to place at the top 114 | # of the sidebar. 115 | #html_logo = None 116 | 117 | # The name of an image file (within the static path) to use as favicon of the 118 | # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 119 | # pixels large. 120 | #html_favicon = None 121 | 122 | # Add any paths that contain custom static files (such as style sheets) here, 123 | # relative to this directory. They are copied after the builtin static files, 124 | # so a file named "default.css" will overwrite the builtin "default.css". 125 | html_static_path = ['_static'] 126 | 127 | # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, 128 | # using the given strftime format. 129 | #html_last_updated_fmt = '%b %d, %Y' 130 | 131 | # If true, SmartyPants will be used to convert quotes and dashes to 132 | # typographically correct entities. 133 | #html_use_smartypants = True 134 | 135 | # Custom sidebar templates, maps document names to template names. 136 | html_sidebars = { 137 | 'index': ['sidebarintro.html', 'sourcelink.html', 'searchbox.html'], 138 | '**': ['sidebarlogo.html', 'localtoc.html', 'relations.html', 139 | 'sourcelink.html', 'searchbox.html'] 140 | } 141 | 142 | # Additional templates that should be rendered to pages, maps page names to 143 | # template names. 144 | #html_additional_pages = {} 145 | 146 | # If false, no module index is generated. 147 | #html_domain_indices = True 148 | 149 | # If false, no index is generated. 150 | #html_use_index = True 151 | 152 | # If true, the index is split into individual pages for each letter. 153 | #html_split_index = False 154 | 155 | # If true, links to the reST sources are added to the pages. 156 | html_show_sourcelink = False 157 | 158 | # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. 159 | html_show_sphinx = False 160 | 161 | # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. 162 | #html_show_copyright = True 163 | 164 | # If true, an OpenSearch description file will be output, and all pages will 165 | # contain a tag referring to it. The value of this option must be the 166 | # base URL from which the finished HTML is served. 167 | #html_use_opensearch = '' 168 | 169 | # This is the file name suffix for HTML files (e.g. ".xhtml"). 170 | #html_file_suffix = None 171 | 172 | # Output file base name for HTML help builder. 173 | htmlhelp_basename = 'mysolrdoc' 174 | 175 | 176 | # -- Options for LaTeX output -------------------------------------------------- 177 | 178 | # The paper size ('letter' or 'a4'). 179 | #latex_paper_size = 'letter' 180 | 181 | # The font size ('10pt', '11pt' or '12pt'). 182 | #latex_font_size = '10pt' 183 | 184 | # Grouping the document tree into LaTeX files. List of tuples 185 | # (source start file, target name, title, author, documentclass [howto/manual]). 186 | latex_documents = [ 187 | ('index', 'mysolr.tex', u'mysolr Documentation', 188 | u'Rubén Abad, Miguel Olivares', 'manual'), 189 | ] 190 | 191 | # The name of an image file (relative to this directory) to place at the top of 192 | # the title page. 193 | #latex_logo = None 194 | 195 | # For "manual" documents, if this is true, then toplevel headings are parts, 196 | # not chapters. 197 | #latex_use_parts = False 198 | 199 | # If true, show page references after internal links. 200 | #latex_show_pagerefs = False 201 | 202 | # If true, show URL addresses after external links. 203 | #latex_show_urls = False 204 | 205 | # Additional stuff for the LaTeX preamble. 206 | #latex_preamble = '' 207 | 208 | # Documents to append as an appendix to all manuals. 209 | #latex_appendices = [] 210 | 211 | # If false, no module index is generated. 212 | #latex_domain_indices = True 213 | 214 | 215 | # -- Options for manual page output -------------------------------------------- 216 | 217 | # One entry per manual page. List of tuples 218 | # (source start file, name, description, authors, manual section). 219 | man_pages = [ 220 | ('index', 'mysolr', u'mysolr Documentation', 221 | [u'Rubén Abad, Miguel Olivares'], 1) 222 | ] 223 | 224 | sys.path.append(os.path.abspath('_themes')) 225 | html_theme_path = ['_themes'] 226 | html_theme = 'mysolr' 227 | -------------------------------------------------------------------------------- /docs/images/index_bm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RedTuna/mysolr/3ed5f4d26b14d4aa20271befea286a80e3679d23/docs/images/index_bm.png -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. mysolr documentation master file, created by 2 | sphinx-quickstart on Wed Aug 31 09:39:29 2011. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to mysolr's documentation! 7 | ================================== 8 | 9 | mysolr was born to be a fast and easy-to-use client for Apache Solr's API and because 10 | existing Python clients didn't fulfill these conditions. 11 | 12 | Since version 0.5 mysolr supports Python 3 except concurrent search feature. 13 | 14 | 15 | Basic Usage 16 | ----------- 17 | :: 18 | 19 | from mysolr import Solr 20 | 21 | # Default connection to localhost:8080 22 | solr = Solr() 23 | 24 | # All solr params are supported! 25 | query = {'q' : '*:*', 'facet' : 'true', 'facet.field' : 'foo'} 26 | response = solr.search(**query) 27 | 28 | # do stuff with documents 29 | for document in response.documents: 30 | # modify field 'foo' 31 | document['foo'] = 'bar' 32 | 33 | # update index with modified documents 34 | solr.update(response.documents, commit=True) 35 | 36 | 37 | Contents 38 | -------- 39 | 40 | .. toctree:: 41 | :maxdepth: 2 42 | 43 | user/installation 44 | user/userguide 45 | user/recipes 46 | api/classes 47 | user/benchmark 48 | 49 | References 50 | ---------- 51 | 52 | We would like to thank the following developers their work and inspiration: 53 | 54 | * The Apache Solr_ 's committers_ 55 | * Kenneth Reitz, Requests_ creator 56 | 57 | Projects that are using mysolr 58 | ------------------------------ 59 | 60 | * solr_cli_ : Command line console for Apache Solr. 61 | 62 | Related projects 63 | ---------------- 64 | 65 | Other Python projects Apache Solr related: 66 | 67 | * solrpy_ 68 | * pysolr_ 69 | * djangosolr_ 70 | 71 | 72 | .. _solrpy: http://code.google.com/p/solrpy/ 73 | .. _pysolr: https://github.com/toastdriven/pysolr/ 74 | .. _djangosolr: https://github.com/sophilabs/django-solr 75 | .. _Requests: http://docs.python-requests.org/ 76 | .. _Solr: http://lucene.apache.org/solr/ 77 | .. _committers: http://lucene.apache.org/java/docs/whoweare.html 78 | .. _solr_cli: http://github.com/moliware/solr_cli 79 | -------------------------------------------------------------------------------- /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% . 10 | if NOT "%PAPER%" == "" ( 11 | set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% 12 | ) 13 | 14 | if "%1" == "" goto help 15 | 16 | if "%1" == "help" ( 17 | :help 18 | echo.Please use `make ^` where ^ is one of 19 | echo. html to make standalone HTML files 20 | echo. dirhtml to make HTML files named index.html in directories 21 | echo. singlehtml to make a single large HTML file 22 | echo. pickle to make pickle files 23 | echo. json to make JSON files 24 | echo. htmlhelp to make HTML files and a HTML help project 25 | echo. qthelp to make HTML files and a qthelp project 26 | echo. devhelp to make HTML files and a Devhelp 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. changes to make an overview over all changed/added/deprecated items 32 | echo. linkcheck to check all external links for integrity 33 | echo. doctest to run all doctests embedded in the documentation if enabled 34 | goto end 35 | ) 36 | 37 | if "%1" == "clean" ( 38 | for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i 39 | del /q /s %BUILDDIR%\* 40 | goto end 41 | ) 42 | 43 | if "%1" == "html" ( 44 | %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html 45 | if errorlevel 1 exit /b 1 46 | echo. 47 | echo.Build finished. The HTML pages are in %BUILDDIR%/html. 48 | goto end 49 | ) 50 | 51 | if "%1" == "dirhtml" ( 52 | %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml 53 | if errorlevel 1 exit /b 1 54 | echo. 55 | echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. 56 | goto end 57 | ) 58 | 59 | if "%1" == "singlehtml" ( 60 | %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml 61 | if errorlevel 1 exit /b 1 62 | echo. 63 | echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. 64 | goto end 65 | ) 66 | 67 | if "%1" == "pickle" ( 68 | %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle 69 | if errorlevel 1 exit /b 1 70 | echo. 71 | echo.Build finished; now you can process the pickle files. 72 | goto end 73 | ) 74 | 75 | if "%1" == "json" ( 76 | %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json 77 | if errorlevel 1 exit /b 1 78 | echo. 79 | echo.Build finished; now you can process the JSON files. 80 | goto end 81 | ) 82 | 83 | if "%1" == "htmlhelp" ( 84 | %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp 85 | if errorlevel 1 exit /b 1 86 | echo. 87 | echo.Build finished; now you can run HTML Help Workshop with the ^ 88 | .hhp project file in %BUILDDIR%/htmlhelp. 89 | goto end 90 | ) 91 | 92 | if "%1" == "qthelp" ( 93 | %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp 94 | if errorlevel 1 exit /b 1 95 | echo. 96 | echo.Build finished; now you can run "qcollectiongenerator" with the ^ 97 | .qhcp project file in %BUILDDIR%/qthelp, like this: 98 | echo.^> qcollectiongenerator %BUILDDIR%\qthelp\mysolr.qhcp 99 | echo.To view the help file: 100 | echo.^> assistant -collectionFile %BUILDDIR%\qthelp\mysolr.ghc 101 | goto end 102 | ) 103 | 104 | if "%1" == "devhelp" ( 105 | %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp 106 | if errorlevel 1 exit /b 1 107 | echo. 108 | echo.Build finished. 109 | goto end 110 | ) 111 | 112 | if "%1" == "epub" ( 113 | %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub 114 | if errorlevel 1 exit /b 1 115 | echo. 116 | echo.Build finished. The epub file is in %BUILDDIR%/epub. 117 | goto end 118 | ) 119 | 120 | if "%1" == "latex" ( 121 | %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex 122 | if errorlevel 1 exit /b 1 123 | echo. 124 | echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. 125 | goto end 126 | ) 127 | 128 | if "%1" == "text" ( 129 | %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text 130 | if errorlevel 1 exit /b 1 131 | echo. 132 | echo.Build finished. The text files are in %BUILDDIR%/text. 133 | goto end 134 | ) 135 | 136 | if "%1" == "man" ( 137 | %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man 138 | if errorlevel 1 exit /b 1 139 | echo. 140 | echo.Build finished. The manual pages are in %BUILDDIR%/man. 141 | goto end 142 | ) 143 | 144 | if "%1" == "changes" ( 145 | %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes 146 | if errorlevel 1 exit /b 1 147 | echo. 148 | echo.The overview file is in %BUILDDIR%/changes. 149 | goto end 150 | ) 151 | 152 | if "%1" == "linkcheck" ( 153 | %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck 154 | if errorlevel 1 exit /b 1 155 | echo. 156 | echo.Link check complete; look for any errors in the above output ^ 157 | or in %BUILDDIR%/linkcheck/output.txt. 158 | goto end 159 | ) 160 | 161 | if "%1" == "doctest" ( 162 | %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest 163 | if errorlevel 1 exit /b 1 164 | echo. 165 | echo.Testing of doctests in the sources finished, look at the ^ 166 | results in %BUILDDIR%/doctest/output.txt. 167 | goto end 168 | ) 169 | 170 | :end 171 | -------------------------------------------------------------------------------- /docs/user/benchmark.rst: -------------------------------------------------------------------------------- 1 | .. _benchmark: 2 | 3 | Benchmark 4 | ========= 5 | 6 | One of the main goals of mysolr is to be the fastest python client of Solr. In 7 | this section you can see the performance of mysolr in different situations. 8 | 9 | 10 | Indexing 11 | -------- 12 | 13 | The picture below is a comparison between mysolr and other clients at 14 | indexing time. 15 | 16 | .. image:: ../images/index_bm.png -------------------------------------------------------------------------------- /docs/user/installation.rst: -------------------------------------------------------------------------------- 1 | .. _installation: 2 | 3 | Installation 4 | ============ 5 | 6 | To install mysolr from Pypi: :: 7 | 8 | pip install mysolr 9 | 10 | 11 | From source code: :: 12 | 13 | python setup.py install 14 | 15 | Dependencies 16 | ------------ 17 | 18 | requests 19 | ++++++++ 20 | 21 | Mysolr uses requests_ module for sending HTTP requests. So, if you install 22 | mysolr from source code you have to install_ it. 23 | 24 | anyjson 25 | +++++++ 26 | 27 | .. versionadded:: 0.8.1 28 | 29 | Since using eval could be dangerous. We decided to use anyjson_ which tries 30 | to use the fastest json library in your enviroment, using simplejson by default. 31 | 32 | 33 | Concurrent search 34 | ----------------- 35 | 36 | Concurrent search feature is only available for python 2.X because it depends 37 | on Gevent and grequests. So if you want to use this feature, you have to install 38 | it as an extra. 39 | 40 | :: 41 | 42 | pip install "mysolr[async]" 43 | 44 | 45 | .. _requests: http://python-requests.org 46 | .. _anyjson: https://bitbucket.org/runeh/anyjson 47 | .. _install: http://docs.python-requests.org/en/latest/user/install/ -------------------------------------------------------------------------------- /docs/user/recipes.rst: -------------------------------------------------------------------------------- 1 | .. _recipes: 2 | 3 | Recipes 4 | ======= 5 | 6 | Solr backup 7 | ----------- 8 | How to copy all documents from one solr server to another. :: 9 | 10 | from mysolr import Solr 11 | 12 | PACKET_SIZE = 5000 13 | 14 | solr_source = Solr('http://server1:8080/solr/') 15 | solr_target = Solr('http://server2:8080/solr/') 16 | 17 | cursor = solr_source.search_cursor(q='*:*') 18 | 19 | for resp in cursor.fetch(PACKET_SIZE): 20 | source_docs = resp.documents 21 | solr_target.update(source_docs) -------------------------------------------------------------------------------- /docs/user/userguide.rst: -------------------------------------------------------------------------------- 1 | .. _userguide: 2 | 3 | 4 | User Guide 5 | ========== 6 | 7 | Connecting to Solr 8 | ------------------ 9 | 10 | Use mysolr.Solr object to connect to a Solr instance. 11 | 12 | :: 13 | 14 | from mysolr import Solr 15 | 16 | # Default connection. Connecting to http://localhost:8080/solr/ 17 | solr = Solr() 18 | 19 | # Custom connection 20 | solr = Solr('http://foo.bar:9090/solr/') 21 | 22 | .. versionadded:: 0.9 23 | 24 | You can reuse HTTP connection by using requests.Session object 25 | 26 | :: 27 | 28 | from mysolr import Solr 29 | import requests 30 | 31 | session = requests.Session() 32 | solr = Solr('http://localhost:8983/solr/collection1', make_request=session) 33 | 34 | .. versionadded:: 0.9 35 | 36 | Using a requests.Session object allows you to connect to servers secured with 37 | HTTP basic authentication as follows: 38 | 39 | :: 40 | 41 | from mysolr import Solr 42 | import requests 43 | 44 | session = requests.Session() 45 | session.auth = ('admin', 'admin') 46 | solr = Solr('http://localhost:8983/solr/collection1', make_request=session) 47 | 48 | 49 | .. versionadded:: 0.8 50 | 51 | Solr 4.0 changed a bit the api so, Solr object will guess the solr server 52 | version by making a request. You can manually set the solr version with 53 | the paremeter *version* 54 | 55 | :: 56 | 57 | from mysolr import Solr 58 | 59 | # Default connection. Connecting to a solr 4.X server 60 | solr = Solr(version=4) 61 | 62 | 63 | Queriying to Solr 64 | ----------------- 65 | 66 | Making a query to Solr is very easy, just call search method with your query. 67 | 68 | :: 69 | 70 | from mysolr import Solr 71 | 72 | solr = Solr() 73 | # Search for all documents 74 | response = solr.search(q='*:*') 75 | # Get documents 76 | documents = response.documents 77 | 78 | Besides, all available Solr query params are supported. So making a query 79 | using pagination would be as simple as :: 80 | 81 | from mysolr import Solr 82 | 83 | solr = Solr() 84 | 85 | # Get 10 documents 86 | response = solr.search(q='*:*', rows=10, start=0) 87 | 88 | Some parameters contain a period. In those cases you have to use a dictionary to 89 | build the query:: 90 | 91 | from mysolr import Solr 92 | 93 | solr = Solr() 94 | 95 | query = {'q' : '*:*', 'facet' : 'true', 'facet.field' : 'foo'} 96 | response = solr.search(**query) 97 | 98 | 99 | Sometimes specifying a HTTP parameter multiple times is needed. For instance 100 | when faceting by several fields. Use a list in that case.:: 101 | 102 | from mysolr import Solr 103 | 104 | solr = Solr() 105 | 106 | query = {'q' : '*:*', 'facet' : 'true', 'facet.field' : ['foo', 'bar']} 107 | response = solr.search(**query) 108 | 109 | 110 | Cursors 111 | ------- 112 | 113 | The typical concept of cursor in relational databases is also implemented in 114 | mysolr. 115 | 116 | :: 117 | 118 | from mysolr import Solr 119 | 120 | solr = Solr() 121 | 122 | cursor = solr.search_cursor(q='*:*') 123 | 124 | # Get all the documents 125 | for response in cursor.fetch(100): 126 | # Do stuff with the current 100 documents 127 | pass 128 | 129 | 130 | Facets 131 | ------ 132 | 133 | This is a query example using facets with mysolr. 134 | 135 | :: 136 | 137 | from mysolr import Solr 138 | 139 | solr = Solr() 140 | # Search for all documents facets by field foo 141 | query = {'q' : '*:*', 'facet' : 'true', 'facet.field' : 'foo'} 142 | response = solr.search(**query) 143 | # Get documents 144 | documents = response.documents 145 | # Get facets 146 | facets = response.facets 147 | 148 | Facets are parsed and can be accessed by retrieving :attr:`~mysolr.SolrResponse.facets` 149 | attribute from the SolrResponse object. Facets look like this:: 150 | 151 | { 152 | 'facet_dates': {}, 153 | 'facet_fields': {'foo': OrderedDict[('value1', 2), ('value2', 2)]}, 154 | 'facet_queries': {}, 155 | 'facet_ranges': {} 156 | } 157 | 158 | Ordered dicts are used to store the facets because order matters. 159 | 160 | In any case, if you don't like how facets are parsed you can use 161 | :attr:`~mysolr.SolrResponse.raw_content` attribute which contains the raw 162 | response from solr. 163 | 164 | 165 | Spellchecker 166 | ------------ 167 | 168 | This is an example of a query that uses the spellcheck component. 169 | 170 | :: 171 | 172 | from mysolr import Solr 173 | 174 | solr = Solr() 175 | 176 | # Spell check query 177 | query = { 178 | 'q' : 'helo wold', 179 | 'spellcheck' : 'true', 180 | 'spellcheck.collate': 'true', 181 | 'spellcheck.build':'true' 182 | } 183 | 184 | response = solr.search(**query) 185 | 186 | 187 | Spellchecker results are parsed and can be accessed by getting the 188 | :attr:`~mysolr.SolrResponse.spellcheck` attribute from the SolrResponse object.:: 189 | 190 | {'collation': 'Hello world', 191 | 'correctlySpelled': False, 192 | 'suggestions': { 193 | 'helo': {'endOffset': 4, 194 | 'numFound': 1, 195 | 'origFreq': 0, 196 | 'startOffset': 0, 197 | 'suggestion': [{'freq': 14, 198 | 'word': 'hello'}]}, 199 | 'wold': {'endOffset': 9, 200 | 'numFound': 1, 201 | 'origFreq': 0, 202 | 'startOffset': 5, 203 | 'suggestion': [{'freq': 14, 'word': 'world'}]}}} 204 | 205 | Stats 206 | ----- 207 | 208 | :attr:`~mysolr.SolrResponse.stats` attribute is just a shortcut to stats result. 209 | It is not parsed and has the format sent by Solr. 210 | 211 | 212 | Highlighting 213 | ------------ 214 | 215 | Like stats, :attr:`~mysolr.SolrResponse.highlighting` is just a shortcut. 216 | 217 | 218 | Concurrent searchs 219 | ------------------ 220 | 221 | As mysolr is using requests, it is posible to make concurrent queries thanks to 222 | grequest :: 223 | 224 | from mysolr import Solr 225 | solr = Solr() 226 | # queries 227 | queries = [ 228 | { 229 | 'q' : '*:*' 230 | }, 231 | { 232 | 'q' : 'foo:bar' 233 | } 234 | ] 235 | 236 | # using 10 threads 237 | responses = solr.async_search(queries, size=10) 238 | 239 | See :ref:`installation ` section for further information about how 240 | to install this feature. 241 | 242 | 243 | Indexing documents 244 | ------------------ 245 | :: 246 | 247 | from mysolr import Solr 248 | 249 | solr = Solr() 250 | 251 | # Create documents 252 | documents = [ 253 | {'id' : 1, 254 | 'field1' : 'foo' 255 | }, 256 | {'id' : 2, 257 | 'field2' : 'bar' 258 | } 259 | ] 260 | # Index using json is faster! 261 | solr.update(documents, 'json', commit=False) 262 | 263 | # Manual commit 264 | solr.commit() 265 | 266 | .. _docs: http://docs.python-requests.org/en/latest/user/quickstart/#basic-authentication -------------------------------------------------------------------------------- /mysolr/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from .response import SolrResponse 4 | from .mysolr import Solr 5 | from .mysolr import Cursor 6 | from .utils import * 7 | 8 | __title__ = 'mysolr' 9 | __version__ = '0.8.3' 10 | __build__ = 0x000083 11 | __author__ = 'Rubén Abad, Miguel Olivares' 12 | -------------------------------------------------------------------------------- /mysolr/compat.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | mysolr.compat 4 | ~~~~~~~~~~~~~~ 5 | 6 | Resolve compatibility between python 2.X and 3.X 7 | 8 | """ 9 | 10 | import sys 11 | import anyjson 12 | 13 | if sys.version_info >= (3, ): 14 | from urllib.parse import urljoin 15 | elif sys.version_info >= (2, ): 16 | from urlparse import urljoin 17 | 18 | def parse_response(content): 19 | return anyjson.loads(content.decode('utf-8')) 20 | 21 | def compat_args(query): 22 | for (key, value) in query.items(): 23 | if isinstance(value, bool): 24 | query[key] = str(value).lower() 25 | 26 | 27 | def get_basestring(): 28 | return str if sys.version_info[0] == 3 else basestring -------------------------------------------------------------------------------- /mysolr/mysolr.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | mysolr.mysolr 4 | ~~~~~~~~~~~~~ 5 | 6 | This module impliments the mysolr Solr class, providing an easy access to 7 | operate with a Solr server. 8 | 9 | >>> from mysolr import Solr 10 | >>> solr = Solr('http://myserver:8080/solr') 11 | >>> query = {'q':'*:*', 'rows': 0, 'start': 0, 'facet': 'true', 12 | 'facet.field': 'province'} 13 | >>> query_response = solr.search(**query) 14 | 15 | """ 16 | from .response import SolrResponse 17 | from .compat import urljoin, compat_args, get_basestring 18 | from xml.sax.saxutils import escape 19 | 20 | import json 21 | import requests 22 | 23 | class Solr(object): 24 | """Acts as an easy-to-use interface to Solr.""" 25 | 26 | def __init__(self, base_url='http://localhost:8080/solr/', 27 | make_request=requests, use_get=False, version=None, 28 | timeout=None): 29 | """ Initializes a Solr object. Solr URL is a needed parameter. 30 | 31 | :param base_url: Url to solr index 32 | :param make_request: 33 | :param use_get: Use get instead of post when searching. Useful if you 34 | cache GET requests 35 | :param version: first number of the solr version. i.e. 4 if solr 36 | version is 4.0.0 If you set to none this parameter 37 | a request to admin/system will be done at init time 38 | in order to guess the version. 39 | :param timeout: request timeout for all requests made to solr 40 | """ 41 | self.base_url = base_url if base_url.endswith('/') else '%s/' % base_url 42 | self.make_request = make_request 43 | self.use_get = use_get 44 | self.version = version 45 | self.timeout = timeout 46 | if not version: 47 | self.version = self.get_version() 48 | assert(self.version in (1, 3, 4)) 49 | 50 | def search(self, resource='select', **kwargs): 51 | """Queries Solr with the given kwargs and returns a SolrResponse 52 | object. 53 | 54 | :param resource: Request dispatcher. 'select' by default. 55 | :param **kwargs: Dictionary containing any of the available Solr query 56 | parameters described in 57 | http://wiki.apache.org/solr/CommonQueryParameters. 58 | 'q' is a mandatory parameter. 59 | 60 | """ 61 | query = build_request(kwargs) 62 | url = urljoin(self.base_url, resource) 63 | if self.use_get: 64 | http_response = self.make_request.get(url, params=query, 65 | timeout=self.timeout) 66 | else: 67 | http_response = self.make_request.post(url, data=query, 68 | timeout=self.timeout) 69 | 70 | solr_response = SolrResponse(http_response) 71 | return solr_response 72 | 73 | def search_cursor(self, resource='select', **kwargs): 74 | """ """ 75 | query = build_request(kwargs) 76 | cursor = Cursor(urljoin(self.base_url, resource), query, 77 | self.make_request, self.use_get, timeout=self.timeout) 78 | 79 | return cursor 80 | 81 | def async_search(self, queries, size=10, resource='select'): 82 | """ Asynchronous search using async module from requests. 83 | 84 | :param queries: List of queries. Each query is a dictionary containing 85 | any of the available Solr query parameters described in 86 | http://wiki.apache.org/solr/CommonQueryParameters. 87 | 'q' is a mandatory parameter. 88 | :param size: Size of threadpool 89 | :param resource: Request dispatcher. 'select' by default. 90 | """ 91 | try: 92 | import grequests 93 | except: 94 | raise RuntimeError('grequests is required for Solr.async_search.') 95 | 96 | url = urljoin(self.base_url, resource) 97 | queries = map(build_request, queries) 98 | rs = (grequests.post(url, data=query) for query in queries) 99 | responses = grequests.map(rs, size=size) 100 | return [SolrResponse(http_response) for http_response in responses] 101 | 102 | 103 | def update(self, documents, input_type='json', commit=True): 104 | """Sends an update/add message to add the array of hashes(documents) to 105 | Solr. 106 | 107 | :param documents: A list of solr-compatible documents to index. You 108 | should use unicode strings for text/string fields. 109 | :param input_type: The format which documents are sent. Remember that 110 | json is not supported until version 3. 111 | :param commit: If True, sends a commit message after the operation is 112 | executed. 113 | 114 | """ 115 | assert input_type in ['xml', 'json'] 116 | 117 | if input_type == 'xml': 118 | http_response = self._post_xml(_get_add_xml(documents)) 119 | else: 120 | http_response = self._post_json(json.dumps(documents)) 121 | if commit: 122 | self.commit() 123 | 124 | return SolrResponse(http_response) 125 | 126 | def delete_by_key(self, identifier, commit=True): 127 | """Sends an ID delete message to Solr. 128 | 129 | :param commit: If True, sends a commit message after the operation is 130 | executed. 131 | 132 | """ 133 | xml = '%s' % (identifier) 134 | http_response = self._post_xml(xml) 135 | if commit: 136 | self.commit() 137 | return SolrResponse(http_response) 138 | 139 | def delete_by_query(self, query, commit=True): 140 | """Sends a query delete message to Solr. 141 | 142 | :param commit: If True, sends a commit message after the operation is 143 | executed. 144 | 145 | """ 146 | xml = '%s' % (query) 147 | http_response = self._post_xml(xml) 148 | if commit: 149 | self.commit() 150 | return SolrResponse(http_response) 151 | 152 | def commit(self, wait_flush=True, 153 | wait_searcher=True, expunge_deletes=False): 154 | """Sends a commit message to Solr. 155 | 156 | :param wait_flush: Block until index changes are flushed to disk 157 | (default is True). 158 | :param wait_searcher: Block until a new searcher is opened and 159 | registered as the main query searcher, making the 160 | changes visible (default is True). 161 | :param expunge_deletes: Merge segments with deletes away (default is 162 | False) 163 | 164 | """ 165 | xml = '' % self.status 106 | 107 | def parse_facets(self, solr_facets): 108 | """ Parse facets.""" 109 | result = {} 110 | for facet_type, facets in solr_facets.items(): 111 | facet_type_dict = {} 112 | for name, facet in facets.items(): 113 | if isinstance(facet, list): 114 | parsed = [tuple(facet[i:i+2]) for i in range(0, len(facet), 2)] 115 | facet_type_dict[name] = OrderedDict(parsed) 116 | elif isinstance(facet, dict): 117 | facet_type_dict[name] = OrderedDict(facet) 118 | elif isinstance(facet, int): 119 | facet_type_dict[name] = facet 120 | result[facet_type] = facet_type_dict 121 | return result 122 | 123 | 124 | def parse_spellcheck(self, solr_suggestions): 125 | """ Parse spellcheck result into a more readable format. """ 126 | result = {} 127 | suggestions = {} 128 | 129 | for i in range(0, len(solr_suggestions), 2): 130 | key = solr_suggestions[i] 131 | value = solr_suggestions[i+1] 132 | if isinstance(value, dict): 133 | # it's a suggestion 134 | suggestions[key] = value 135 | else: 136 | # it's information about spellchecking result 137 | result[key] = value 138 | 139 | result['suggestions'] = suggestions 140 | return result 141 | 142 | def extract_errmessage(self): 143 | """Tries to extract an error message from a SolrResponse body content. 144 | 145 | Useful for error identification (e.g.: indexation errors) 146 | """ 147 | message = None 148 | try: 149 | message = re.findall('([^<]*)', str(self.raw_content))[-1] 150 | except Exception as e: 151 | pass 152 | return message 153 | 154 | -------------------------------------------------------------------------------- /mysolr/utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | mysolr.utils 4 | ~~~~~~~~~~~~ 5 | 6 | Some useful functions 7 | 8 | """ 9 | 10 | def to_ISO8601(date): 11 | return date.strftime("%Y-%m-%dT%H:%M:%SZ") -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import sys 3 | 4 | try: 5 | from setuptools import setup 6 | except ImportError: 7 | from distutils.core import setup 8 | 9 | 10 | REQUIRED = ['anyjson', 'coveralls', 'requests>=2.2.1'] 11 | 12 | if sys.version_info < (2, 7, ): 13 | REQUIRED.append('ordereddict') 14 | 15 | CLASSIFIERS = [ 16 | 'Development Status :: 4 - Beta', 17 | 'Intended Audience :: Developers', 18 | 'License :: OSI Approved :: BSD License', 19 | 'Natural Language :: English', 20 | 'Operating System :: OS Independent', 21 | 'Programming Language :: Python :: 2.6', 22 | 'Programming Language :: Python :: 2.7', 23 | 'Programming Language :: Python :: 3.2', 24 | 'Programming Language :: Python :: 3.3', 25 | 'Programming Language :: Python :: 3.4', 26 | 'Programming Language :: Python', 27 | 'Topic :: Software Development :: Libraries :: Python Modules' 28 | ] 29 | 30 | 31 | setup(name='mysolr', 32 | version='0.8.3', 33 | description='Solr Python binding', 34 | long_description = open('README.rst').read(), 35 | author='Rubén Abad, Miguel Olivares', 36 | author_email='ruabag@gmail.com, miguel@moliware.com', 37 | url='http://mysolr.redtuna.org', 38 | packages=['mysolr'], 39 | install_requires=REQUIRED, 40 | extras_require={ 41 | 'async': ['Gevent', 'grequests'] 42 | }, 43 | test_suite='tests', 44 | classifiers=CLASSIFIERS) 45 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RedTuna/mysolr/3ed5f4d26b14d4aa20271befea286a80e3679d23/tests/__init__.py -------------------------------------------------------------------------------- /tests/mocks/highlightingquery: -------------------------------------------------------------------------------- 1 | { 2 | "responseHeader":{ 3 | "status":0, 4 | "QTime":9, 5 | "params":{ 6 | "hl.snippets":"2", 7 | "indent":"on", 8 | "start":"0", 9 | "q":"de", 10 | "hl.fl":"name", 11 | "wt":"python", 12 | "hl":"true", 13 | "rows":"3", 14 | "version":"2.2"}}, 15 | "response":{"numFound":1,"start":0,"docs":[ 16 | { 17 | "id":"1", 18 | "name": "Mock"}] 19 | }, 20 | "highlighting":{ 21 | "1":{ 22 | "name":["Mock"]}}} -------------------------------------------------------------------------------- /tests/mocks/query: -------------------------------------------------------------------------------- 1 | { 2 | "responseHeader": { 3 | "status": 0, 4 | "QTime": 101, 5 | "params": { 6 | "facet": "true", 7 | "indent": "on", 8 | "start": "0", 9 | "q": "genre_s:fantasy", 10 | "facet.field": "author", 11 | "wt": "python", 12 | "rows": "10", 13 | "version": "2.2" 14 | } 15 | }, 16 | "response": { 17 | "numFound": 2, 18 | "start": 0, 19 | "docs": [ 20 | { 21 | "price": 12.5, 22 | "name": "The Lightning Thief", 23 | "sequence_i": 1, 24 | "author": "Rick Riordan", 25 | "inStock": true, 26 | "series_t": "Percy Jackson and the Olympians", 27 | "pages_i": 384, 28 | "genre_s": "fantasy", 29 | "id": "978-0641723445", 30 | "cat": [ 31 | "book", 32 | "hardcover" 33 | ] 34 | }, 35 | { 36 | "price": 12.5, 37 | "name": "The Lightning Thief", 38 | "sequence_i": 1, 39 | "author": "Rick Riordan", 40 | "inStock": true, 41 | "series_t": "Percy Jackson and the Olympians", 42 | "pages_i": 384, 43 | "genre_s": "fantasy", 44 | "id": "978-0641723446", 45 | "cat": [ 46 | "book", 47 | "hardcover" 48 | ] 49 | } 50 | ] 51 | }, 52 | "facet_counts": { 53 | "facet_queries": {}, 54 | "facet_fields": { 55 | "author": [ 56 | "rick", 57 | 2, 58 | "riordan", 59 | 2 60 | ] 61 | }, 62 | "facet_dates": {}, 63 | "facet_ranges": {} 64 | } 65 | } -------------------------------------------------------------------------------- /tests/mocks/spellquery: -------------------------------------------------------------------------------- 1 | { 2 | "responseHeader": { 3 | "status": 0, 4 | "QTime": 51 5 | }, 6 | "command": "build", 7 | "response": { 8 | "numFound": 0, 9 | "start": 0, 10 | "docs": [] 11 | }, 12 | "spellcheck": { 13 | "suggestions": [ 14 | "lightnin", 15 | { 16 | "numFound": 1, 17 | "startOffset": 0, 18 | "endOffset": 8, 19 | "origFreq": 0, 20 | "suggestion": [ 21 | { 22 | "word": "lightning", 23 | "freq": 14 24 | } 25 | ] 26 | }, 27 | "thie", 28 | { 29 | "numFound": 1, 30 | "startOffset": 9, 31 | "endOffset": 13, 32 | "origFreq": 0, 33 | "suggestion": [ 34 | { 35 | "word": "thief", 36 | "freq": 14 37 | } 38 | ] 39 | }, 40 | "correctlySpelled", 41 | false, 42 | "collation", 43 | "lightning thief" 44 | ] 45 | } 46 | } -------------------------------------------------------------------------------- /tests/mocks/statsquery: -------------------------------------------------------------------------------- 1 | { 2 | "responseHeader":{ 3 | "status":0, 4 | "QTime":1, 5 | "params":{ 6 | "indent":"on", 7 | "start":"0", 8 | "stats.field":"price", 9 | "stats":"true", 10 | "q":"*:*", 11 | "stats.facet":["author", 12 | "genre_s"], 13 | "wt":"python", 14 | "rows":"0", 15 | "version":"2.2"}}, 16 | "response":{"numFound":2,"start":0,"docs":[] 17 | }, 18 | "stats":{ 19 | "stats_fields":{ 20 | "price":{ 21 | "min":12.5, 22 | "max":12.5, 23 | "sum":25.0, 24 | "count":2, 25 | "missing":0, 26 | "sumOfSquares":312.5, 27 | "mean":12.5, 28 | "stddev":0.0, 29 | "facets":{ 30 | "author":{ 31 | "riordan":{ 32 | "min":12.5, 33 | "max":12.5, 34 | "sum":25.0, 35 | "count":2, 36 | "missing":0, 37 | "sumOfSquares":312.5, 38 | "mean":12.5, 39 | "stddev":0.0}}, 40 | "genre_s":{ 41 | "fantasy":{ 42 | "min":12.5, 43 | "max":12.5, 44 | "sum":25.0, 45 | "count":2, 46 | "missing":0, 47 | "sumOfSquares":312.5, 48 | "mean":12.5, 49 | "stddev":0.0}}}}}}} -------------------------------------------------------------------------------- /tests/test_highlighting_query_result.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import unittest 3 | 4 | 5 | from mysolr import SolrResponse 6 | from os.path import join, dirname 7 | import requests 8 | import json 9 | import sys 10 | 11 | class HighlightingQueryResultTestCase(unittest.TestCase): 12 | """ """ 13 | 14 | def setUp(self): 15 | mock_file = join(dirname(__file__), 'mocks/highlightingquery') 16 | with open(mock_file) as f: 17 | raw_content = None 18 | if sys.version_info[0] == 3: 19 | raw_content = f.read().encode('utf-8') 20 | else: 21 | raw_content = f.read() 22 | self.response = SolrResponse() 23 | self.response.raw_content = raw_content 24 | self.response.status = 200 25 | self.response.parse_content() 26 | 27 | def tearDown(self): 28 | pass 29 | 30 | def test_query(self): 31 | self.assertNotEqual(self.response.highlighting, None) 32 | 33 | 34 | if __name__ == '__main__': 35 | unittest.main() -------------------------------------------------------------------------------- /tests/test_query.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import os 3 | import time 4 | import unittest 5 | from mysolr import Solr 6 | 7 | 8 | class QueryResultTestCase(unittest.TestCase): 9 | 10 | def setUp(self): 11 | self.solr = Solr(os.getenv('SOLR_URL')) 12 | 13 | def test_search(self): 14 | response = self.solr.search(q='*:*') 15 | self.assertEqual(response.status, 200) 16 | self.assertEqual(response.total_results, 4) 17 | self.assertEqual(len(response.documents), 4) 18 | 19 | def test_search_cursor(self): 20 | cursor = self.solr.search_cursor(q='*:*') 21 | i = 0 22 | for response in cursor.fetch(1): 23 | self.assertEqual(response.status, 200) 24 | i += 1 25 | self.assertEqual(i, 4) 26 | 27 | cursor = self.solr.search_cursor(q='*:*') 28 | i = 0 29 | for response in cursor.fetch(4): 30 | self.assertEqual(response.status, 200) 31 | i += 1 32 | self.assertEqual(i, 1) 33 | 34 | def test_commit(self): 35 | response = self.solr.commit() 36 | self.assertEqual(response.status, 200) 37 | 38 | def test_optimize(self): 39 | response = self.solr.optimize() 40 | self.assertEqual(response.status, 200) 41 | 42 | def test_ping(self): 43 | response = self.solr.ping() 44 | self.assertEqual(response.status, 200) 45 | 46 | def test_is_up(self): 47 | response = self.solr.is_up() 48 | self.assertEqual(response, True) 49 | 50 | def test_update_delete(self): 51 | # Get total results 52 | response = self.solr.search(q='*:*') 53 | self.assertEqual(response.status, 200) 54 | total_results = response.total_results 55 | # Post one document using json 56 | documents = [{'id' : 1}] 57 | response = self.solr.update(documents, input_type='json') 58 | self.assertEqual(response.status, 200) 59 | # Post anoter document using xml 60 | documents = [{'id' : 2}] 61 | response = self.solr.update(documents, input_type='xml') 62 | self.assertEqual(response.status, 200) 63 | # Compare total results 64 | response = self.solr.search(q='*:*') 65 | self.assertEqual(response.status, 200) 66 | self.assertEqual(response.total_results, total_results + 2) 67 | 68 | # Now delete the two document posted above 69 | query = 'id:1' 70 | key = 2 71 | response = self.solr.delete_by_query(query) 72 | self.assertEqual(response.status, 200) 73 | response = self.solr.delete_by_key(key) 74 | self.assertEqual(response.status, 200) 75 | response = self.solr.search(q='*:*') 76 | self.assertEqual(response.status, 200) 77 | self.assertEqual(response.total_results, total_results) 78 | 79 | def tearDown(self): 80 | pass 81 | 82 | def test_query(self): 83 | pass 84 | 85 | if __name__ == '__main__': 86 | unittest.main() 87 | -------------------------------------------------------------------------------- /tests/test_query_result.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import unittest 5 | from mysolr import SolrResponse 6 | from os.path import join, dirname 7 | import requests 8 | import sys 9 | import json 10 | 11 | class QueryResultTestCase(unittest.TestCase): 12 | 13 | def setUp(self): 14 | mock_file = join(dirname(__file__), 'mocks/query') 15 | with open(mock_file) as f: 16 | raw_content = None 17 | if sys.version_info[0] == 3: 18 | raw_content = f.read().encode('utf-8') 19 | else: 20 | raw_content = f.read() 21 | self.solr_response = SolrResponse() 22 | self.solr_response.raw_content = raw_content 23 | self.solr_response.status = 200 24 | self.solr_response.parse_content() 25 | 26 | def tearDown(self): 27 | pass 28 | 29 | def test_raw_content(self): 30 | self.assertNotEqual(self.solr_response.raw_content, None) 31 | 32 | def test_status(self): 33 | self.assertNotEqual(self.solr_response.solr_status, None) 34 | self.assertEqual(self.solr_response.solr_status, 0) 35 | 36 | def test_qtime(self): 37 | self.assertNotEqual(self.solr_response.qtime, None) 38 | self.assertEqual(self.solr_response.qtime, 101) 39 | 40 | def test_total_results(self): 41 | self.assertNotEqual(self.solr_response.total_results, None) 42 | self.assertEqual(self.solr_response.total_results, 2) 43 | 44 | def test_start(self): 45 | self.assertNotEqual(self.solr_response.start, None) 46 | self.assertEqual(self.solr_response.start, 0) 47 | 48 | def test_documents(self): 49 | self.assertNotEqual(self.solr_response.documents, None) 50 | self.assertEqual(len(self.solr_response.documents), 2) 51 | 52 | def test_facets(self): 53 | self.assertNotEqual(self.solr_response.facets, None) 54 | 55 | if __name__ == '__main__': 56 | unittest.main() 57 | -------------------------------------------------------------------------------- /tests/test_spell_query_result.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import unittest 3 | 4 | 5 | from mysolr import SolrResponse 6 | from os.path import join, dirname 7 | import requests 8 | import sys 9 | import json 10 | 11 | 12 | class SpellQueryResultTestCase(unittest.TestCase): 13 | """ """ 14 | 15 | def setUp(self): 16 | mock_file = join(dirname(__file__), 'mocks/spellquery') 17 | with open(mock_file) as f: 18 | raw_content = None 19 | if sys.version_info[0] == 3: 20 | raw_content = f.read().encode('utf-8') 21 | else: 22 | raw_content = f.read() 23 | self.response = SolrResponse() 24 | self.response.raw_content = raw_content 25 | self.response.status = 200 26 | self.response.parse_content() 27 | 28 | def tearDown(self): 29 | pass 30 | 31 | def test_query(self): 32 | self.assertNotEqual(self.response.spellcheck, None) 33 | 34 | 35 | if __name__ == '__main__': 36 | unittest.main() -------------------------------------------------------------------------------- /tests/test_stats_query_result.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import unittest 3 | 4 | 5 | from mysolr import SolrResponse 6 | from os.path import join, dirname 7 | import requests 8 | import sys 9 | import json 10 | 11 | 12 | class StatsQueryResultTestCase(unittest.TestCase): 13 | """ """ 14 | 15 | def setUp(self): 16 | mock_file = join(dirname(__file__), 'mocks/statsquery') 17 | with open(mock_file) as f: 18 | raw_content = None 19 | if sys.version_info[0] == 3: 20 | raw_content = f.read().encode('utf-8') 21 | else: 22 | raw_content = f.read() 23 | self.response = SolrResponse() 24 | self.response.raw_content = raw_content 25 | self.response.status = 200 26 | self.response.parse_content() 27 | 28 | def tearDown(self): 29 | pass 30 | 31 | def test_query(self): 32 | self.assertNotEqual(self.response.stats, None) 33 | 34 | 35 | if __name__ == '__main__': 36 | unittest.main() -------------------------------------------------------------------------------- /tests/test_utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import unittest 3 | 4 | from datetime import datetime 5 | from mysolr import to_ISO8601 6 | 7 | 8 | class UtilsTestCase(unittest.TestCase): 9 | 10 | def setUp(self): 11 | pass 12 | 13 | def test_to_ISO8601(self): 14 | solr_date = to_ISO8601(datetime(2014, 5, 5)) 15 | self.assertEqual(solr_date, '2014-05-05T00:00:00Z') 16 | 17 | def tearDown(self): 18 | pass 19 | 20 | if __name__ == '__main__': 21 | unittest.main() --------------------------------------------------------------------------------