├── .gitignore ├── README.md ├── css └── pythonbooks.css ├── img ├── BMH.png ├── Python3-powered.png ├── PythonDScover.png ├── PythonGuide.png ├── apple-touch-icon-114-precomposed.png ├── cover_alabamaintro.png ├── cover_apprendrepython2.jpg ├── cover_apprendrepython3.jpg ├── cover_buildingskillnonpro.jpg ├── cover_buildingskillsoop.jpg ├── cover_buildingskillspython.jpg ├── cover_complexity.jpg ├── cover_computervision.jpg ├── cover_datastructandalg.png ├── cover_divepython.jpg ├── cover_divepython3.jpg ├── cover_django.png ├── cover_flask.png ├── cover_gettingstartedwithdjango.jpg ├── cover_googledevelopers.png ├── cover_highperf.png ├── cover_inventgame.jpg ├── cover_inventgame.png ├── cover_jessenoller.png ├── cover_kivy.png ├── cover_learnpython.jpg ├── cover_makinggame.png ├── cover_nltk.jpg ├── cover_porting_python3.png ├── cover_pymotw.png ├── cover_pypd_2ed_th.jpg ├── cover_pyramid.png ├── cover_python101.png ├── cover_pythonstandardlibrairy.png ├── cover_scientific.jpg ├── cover_snakewrangling.png ├── cover_stats.jpg ├── cover_swaroop.png ├── cover_thinkpython.jpg ├── djenofdjango.jpg ├── glyphicons-halflings-white.png ├── glyphicons-halflings.png ├── hackingcyphers.png ├── ico │ ├── apple-touch-icon-114-precomposed.png │ ├── apple-touch-icon-144-precomposed.png │ ├── apple-touch-icon-57-precomposed.png │ ├── apple-touch-icon-72-precomposed.png │ └── favicon.ico ├── level.png ├── logo_jsbooks.png ├── logo_pythonbooks.png ├── logo_pythonbooks_.png ├── modelingcreativity.png ├── pattern.png ├── py3programming.png ├── pym.png ├── revologo.png ├── runestone.png ├── social_gplus.png ├── social_skype.png ├── social_twitter.png ├── testdriven.jpg ├── view.png └── web2py.png ├── index.html ├── issues.json └── js ├── .jshintrc ├── ellipsis.js ├── less-1.3.0.min.js └── mustache.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PythonBooks 2 | 3 | PythonBooks is a showcase of the bests free ebooks about Python. 4 | 5 | Learn Python, discover new fields, and muscle your brain for free ! 6 | 7 | check it out : http://pythonbooks.revolunet.com 8 | 9 | We also have a javascript version : http://jsbooks.revolunet.com 10 | 11 | 12 | ## HOW TO ADD YOUR PUBLICATION 13 | 14 | If you find a nice ebook about Python, feel free to fork PythonBooks and add it in a few steps : 15 | 16 | - Paste the informations into the JSON file. 17 | - Please include a .png file for the cover : less than 100Ko. 18 | - Make a pull request. 19 | 20 | Alternatively, you can send us an email with book infos : pythonbooks@revolunet.com 21 | 22 | Thanks per advance ! 23 | 24 | 25 | ## HISTORY 26 | 27 | Historically, this project was supposed to be an experimental Apple 'NewsStand' application. 28 | 29 | After some weeks of work, we discovered that having a functionnal application wasn't enough. 30 | 31 | You also have to follow various Apple guidelines and use some Apple libraries to be 'NewsStand' compatible. 32 | 33 | So we decided to go full web and this move gave the project a much wider audience. 34 | 35 | Thanks Apple to give us this opportunity :) 36 | 37 | 38 | ## Licence 39 | 40 | The PythonBooks website is licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php 41 | 42 | Each book has his own licence, see book homepage. 43 | 44 | ## About us 45 | 46 | The revolunet team is specialised in rich web applications development, for mobile or desktop. 47 | 48 | Check out our website : http://revolunet.com 49 | -------------------------------------------------------------------------------- /css/pythonbooks.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 | /* 12 | NOTE FROM REVOLUNET : 13 | Only Bootstrap styles needed for PythonBooks are here. 14 | */ 15 | 16 | article, 17 | aside, 18 | details, 19 | figcaption, 20 | figure, 21 | footer, 22 | header, 23 | hgroup, 24 | nav, 25 | section { 26 | display: block; 27 | } 28 | audio, 29 | canvas, 30 | video { 31 | display: inline-block; 32 | *display: inline; 33 | *zoom: 1; 34 | } 35 | audio:not([controls]) { 36 | display: none; 37 | } 38 | html { 39 | font-size: 100%; 40 | -webkit-text-size-adjust: 100%; 41 | -ms-text-size-adjust: 100%; 42 | } 43 | a:focus { 44 | outline: thin dotted #333; 45 | outline: 5px auto -webkit-focus-ring-color; 46 | outline-offset: -2px; 47 | } 48 | a:hover, 49 | a:active { 50 | outline: 0; 51 | } 52 | sub, 53 | sup { 54 | position: relative; 55 | font-size: 75%; 56 | line-height: 0; 57 | vertical-align: baseline; 58 | } 59 | sup { 60 | top: -0.5em; 61 | } 62 | sub { 63 | bottom: -0.25em; 64 | } 65 | img { 66 | max-width: 100%; 67 | vertical-align: middle; 68 | border: 0; 69 | -ms-interpolation-mode: bicubic; 70 | } 71 | #map_canvas img { 72 | max-width: none; 73 | } 74 | button, 75 | input, 76 | select, 77 | textarea { 78 | margin: 0; 79 | font-size: 100%; 80 | vertical-align: middle; 81 | } 82 | button, 83 | input { 84 | *overflow: visible; 85 | line-height: normal; 86 | } 87 | button::-moz-focus-inner, 88 | input::-moz-focus-inner { 89 | padding: 0; 90 | border: 0; 91 | } 92 | button, 93 | input[type="button"], 94 | input[type="reset"], 95 | input[type="submit"] { 96 | cursor: pointer; 97 | -webkit-appearance: button; 98 | } 99 | input[type="search"] { 100 | -webkit-box-sizing: content-box; 101 | -moz-box-sizing: content-box; 102 | box-sizing: content-box; 103 | -webkit-appearance: textfield; 104 | } 105 | input[type="search"]::-webkit-search-decoration, 106 | input[type="search"]::-webkit-search-cancel-button { 107 | -webkit-appearance: none; 108 | } 109 | textarea { 110 | overflow: auto; 111 | vertical-align: top; 112 | } 113 | body { 114 | margin: 0; 115 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 116 | font-size: 13px; 117 | line-height: 18px; 118 | color: #333333; 119 | background-color: #ffffff; 120 | } 121 | a { 122 | color: #0088cc; 123 | text-decoration: none; 124 | } 125 | a:hover { 126 | color: #005580; 127 | text-decoration: underline; 128 | } 129 | .row { 130 | margin-left: -20px; 131 | *zoom: 1; 132 | } 133 | .row:before, 134 | .row:after { 135 | display: table; 136 | content: ""; 137 | } 138 | .row:after { 139 | clear: both; 140 | } 141 | [class*="span"] { 142 | float: left; 143 | margin-left: 20px; 144 | } 145 | .container, 146 | .navbar-fixed-top .container, 147 | .navbar-fixed-bottom .container { 148 | width: 940px; 149 | } 150 | .span12 { 151 | width: 940px; 152 | } 153 | .span11 { 154 | width: 860px; 155 | } 156 | .span10 { 157 | width: 780px; 158 | } 159 | .span9 { 160 | width: 700px; 161 | } 162 | .span8 { 163 | width: 620px; 164 | } 165 | .span7 { 166 | width: 540px; 167 | } 168 | .span6 { 169 | width: 460px; 170 | } 171 | .span5 { 172 | width: 380px; 173 | } 174 | .span4 { 175 | width: 300px; 176 | } 177 | .span3 { 178 | width: 220px; 179 | } 180 | .span2 { 181 | width: 140px; 182 | } 183 | .span1 { 184 | width: 60px; 185 | } 186 | .container { 187 | margin-right: auto; 188 | margin-left: auto; 189 | *zoom: 1; 190 | } 191 | .container:before, 192 | .container:after { 193 | display: table; 194 | content: ""; 195 | } 196 | .container:after { 197 | clear: both; 198 | } 199 | .container-fluid { 200 | padding-right: 20px; 201 | padding-left: 20px; 202 | *zoom: 1; 203 | } 204 | .container-fluid:before, 205 | .container-fluid:after { 206 | display: table; 207 | content: ""; 208 | } 209 | .container-fluid:after { 210 | clear: both; 211 | } 212 | /*! 213 | * Bootstrap Responsive v2.0.4 214 | * 215 | * Copyright 2012 Twitter, Inc 216 | * Licensed under the Apache License v2.0 217 | * http://www.apache.org/licenses/LICENSE-2.0 218 | * 219 | * Designed and built with all the love in the world @twitter by @mdo and @fat. 220 | */ 221 | .clearfix { 222 | *zoom: 1; 223 | } 224 | .clearfix:before, 225 | .clearfix:after { 226 | display: table; 227 | content: ""; 228 | } 229 | .clearfix:after { 230 | clear: both; 231 | } 232 | .hide-text { 233 | font: 0/0 a; 234 | color: transparent; 235 | text-shadow: none; 236 | background-color: transparent; 237 | border: 0; 238 | } 239 | .input-block-level { 240 | display: block; 241 | width: 100%; 242 | min-height: 28px; 243 | -webkit-box-sizing: border-box; 244 | -moz-box-sizing: border-box; 245 | -ms-box-sizing: border-box; 246 | box-sizing: border-box; 247 | } 248 | .hidden { 249 | display: none; 250 | visibility: hidden; 251 | } 252 | .visible-phone { 253 | display: none !important; 254 | } 255 | .visible-tablet { 256 | display: none !important; 257 | } 258 | .hidden-desktop { 259 | display: none !important; 260 | } 261 | @media (max-width: 767px) { 262 | .visible-phone { 263 | display: inherit !important; 264 | } 265 | .hidden-phone { 266 | display: none !important; 267 | } 268 | .hidden-desktop { 269 | display: inherit !important; 270 | } 271 | .visible-desktop { 272 | display: none !important; 273 | } 274 | } 275 | @media (min-width: 768px) and (max-width: 979px) { 276 | .visible-tablet { 277 | display: inherit !important; 278 | } 279 | .hidden-tablet { 280 | display: none !important; 281 | } 282 | .hidden-desktop { 283 | display: inherit !important; 284 | } 285 | .visible-desktop { 286 | display: none !important ; 287 | } 288 | } 289 | @media (max-width: 480px) { 290 | .nav-collapse { 291 | -webkit-transform: translate3d(0, 0, 0); 292 | } 293 | .page-header h1 small { 294 | display: block; 295 | line-height: 18px; 296 | } 297 | input[type="checkbox"], 298 | input[type="radio"] { 299 | border: 1px solid #ccc; 300 | } 301 | .form-horizontal .control-group > label { 302 | float: none; 303 | width: auto; 304 | padding-top: 0; 305 | text-align: left; 306 | } 307 | .form-horizontal .controls { 308 | margin-left: 0; 309 | } 310 | .form-horizontal .control-list { 311 | padding-top: 0; 312 | } 313 | .form-horizontal .form-actions { 314 | padding-left: 10px; 315 | padding-right: 10px; 316 | } 317 | .modal { 318 | position: absolute; 319 | top: 10px; 320 | left: 10px; 321 | right: 10px; 322 | width: auto; 323 | margin: 0; 324 | } 325 | .modal.fade.in { 326 | top: auto; 327 | } 328 | .modal-header .close { 329 | padding: 10px; 330 | margin: -10px; 331 | } 332 | .carousel-caption { 333 | position: static; 334 | } 335 | } 336 | @media (max-width: 767px) { 337 | body { 338 | padding-left: 20px; 339 | padding-right: 20px; 340 | } 341 | .navbar-fixed-top, 342 | .navbar-fixed-bottom { 343 | margin-left: -20px; 344 | margin-right: -20px; 345 | } 346 | .container-fluid { 347 | padding: 0; 348 | } 349 | .dl-horizontal dt { 350 | float: none; 351 | clear: none; 352 | width: auto; 353 | text-align: left; 354 | } 355 | .dl-horizontal dd { 356 | margin-left: 0; 357 | } 358 | .container { 359 | width: auto; 360 | } 361 | .row-fluid { 362 | width: 100%; 363 | } 364 | .row, 365 | .thumbnails { 366 | margin-left: 0; 367 | } 368 | [class*="span"], 369 | .row-fluid [class*="span"] { 370 | float: none; 371 | display: block; 372 | width: auto; 373 | margin-left: 0; 374 | } 375 | .input-large, 376 | .input-xlarge, 377 | .input-xxlarge, 378 | input[class*="span"], 379 | select[class*="span"], 380 | textarea[class*="span"], 381 | .uneditable-input { 382 | display: block; 383 | width: 100%; 384 | min-height: 28px; 385 | -webkit-box-sizing: border-box; 386 | -moz-box-sizing: border-box; 387 | -ms-box-sizing: border-box; 388 | box-sizing: border-box; 389 | } 390 | .input-prepend input, 391 | .input-append input, 392 | .input-prepend input[class*="span"], 393 | .input-append input[class*="span"] { 394 | display: inline-block; 395 | width: auto; 396 | } 397 | } 398 | @media (min-width: 768px) and (max-width: 979px) { 399 | .row { 400 | margin-left: -20px; 401 | *zoom: 1; 402 | } 403 | .row:before, 404 | .row:after { 405 | display: table; 406 | content: ""; 407 | } 408 | .row:after { 409 | clear: both; 410 | } 411 | [class*="span"] { 412 | float: left; 413 | margin-left: 20px; 414 | } 415 | .container, 416 | .navbar-fixed-top .container, 417 | .navbar-fixed-bottom .container { 418 | width: 724px; 419 | } 420 | .span12 { 421 | width: 724px; 422 | } 423 | .span11 { 424 | width: 662px; 425 | } 426 | .span10 { 427 | width: 600px; 428 | } 429 | .span9 { 430 | width: 538px; 431 | } 432 | .span8 { 433 | width: 476px; 434 | } 435 | .span7 { 436 | width: 414px; 437 | } 438 | .span6 { 439 | width: 352px; 440 | } 441 | .span5 { 442 | width: 290px; 443 | } 444 | .span4 { 445 | width: 228px; 446 | } 447 | .span3 { 448 | width: 166px; 449 | } 450 | .span2 { 451 | width: 104px; 452 | } 453 | .span1 { 454 | width: 42px; 455 | } 456 | . 457 | input, 458 | textarea, 459 | .uneditable-input { 460 | margin-left: 0; 461 | } 462 | input.span12, textarea.span12, .uneditable-input.span12 { 463 | width: 714px; 464 | } 465 | input.span11, textarea.span11, .uneditable-input.span11 { 466 | width: 652px; 467 | } 468 | input.span10, textarea.span10, .uneditable-input.span10 { 469 | width: 590px; 470 | } 471 | input.span9, textarea.span9, .uneditable-input.span9 { 472 | width: 528px; 473 | } 474 | input.span8, textarea.span8, .uneditable-input.span8 { 475 | width: 466px; 476 | } 477 | input.span7, textarea.span7, .uneditable-input.span7 { 478 | width: 404px; 479 | } 480 | input.span6, textarea.span6, .uneditable-input.span6 { 481 | width: 342px; 482 | } 483 | input.span5, textarea.span5, .uneditable-input.span5 { 484 | width: 280px; 485 | } 486 | input.span4, textarea.span4, .uneditable-input.span4 { 487 | width: 218px; 488 | } 489 | input.span3, textarea.span3, .uneditable-input.span3 { 490 | width: 156px; 491 | } 492 | input.span2, textarea.span2, .uneditable-input.span2 { 493 | width: 94px; 494 | } 495 | input.span1, textarea.span1, .uneditable-input.span1 { 496 | width: 32px; 497 | } 498 | } 499 | @media (min-width: 1200px) { 500 | .row { 501 | margin-left: -30px; 502 | *zoom: 1; 503 | } 504 | .row:before, 505 | .row:after { 506 | display: table; 507 | content: ""; 508 | } 509 | .row:after { 510 | clear: both; 511 | } 512 | [class*="span"] { 513 | float: left; 514 | margin-left: 30px; 515 | } 516 | .container, 517 | .navbar-fixed-top .container, 518 | .navbar-fixed-bottom .container { 519 | width: 1170px; 520 | } 521 | .span12 { 522 | width: 1170px; 523 | } 524 | .span11 { 525 | width: 1070px; 526 | } 527 | .span10 { 528 | width: 970px; 529 | } 530 | .span9 { 531 | width: 870px; 532 | } 533 | .span8 { 534 | width: 770px; 535 | } 536 | .span7 { 537 | width: 670px; 538 | } 539 | .span6 { 540 | width: 570px; 541 | } 542 | .span5 { 543 | width: 470px; 544 | } 545 | .span4 { 546 | width: 370px; 547 | } 548 | .span3 { 549 | width: 270px; 550 | } 551 | .span2 { 552 | width: 170px; 553 | } 554 | .span1 { 555 | width: 70px; 556 | } 557 | 558 | 559 | input, 560 | textarea, 561 | .uneditable-input { 562 | margin-left: 0; 563 | } 564 | input.span12, textarea.span12, .uneditable-input.span12 { 565 | width: 1160px; 566 | } 567 | input.span11, textarea.span11, .uneditable-input.span11 { 568 | width: 1060px; 569 | } 570 | input.span10, textarea.span10, .uneditable-input.span10 { 571 | width: 960px; 572 | } 573 | input.span9, textarea.span9, .uneditable-input.span9 { 574 | width: 860px; 575 | } 576 | input.span8, textarea.span8, .uneditable-input.span8 { 577 | width: 760px; 578 | } 579 | input.span7, textarea.span7, .uneditable-input.span7 { 580 | width: 660px; 581 | } 582 | input.span6, textarea.span6, .uneditable-input.span6 { 583 | width: 560px; 584 | } 585 | input.span5, textarea.span5, .uneditable-input.span5 { 586 | width: 460px; 587 | } 588 | input.span4, textarea.span4, .uneditable-input.span4 { 589 | width: 360px; 590 | } 591 | input.span3, textarea.span3, .uneditable-input.span3 { 592 | width: 260px; 593 | } 594 | input.span2, textarea.span2, .uneditable-input.span2 { 595 | width: 160px; 596 | } 597 | input.span1, textarea.span1, .uneditable-input.span1 { 598 | width: 60px; 599 | } 600 | .thumbnails { 601 | margin-left: -30px; 602 | } 603 | .thumbnails > li { 604 | margin-left: 30px; 605 | } 606 | .row-fluid .thumbnails { 607 | margin-left: 0; 608 | } 609 | } 610 | @media (max-width: 979px) { 611 | body { 612 | padding-top: 0; 613 | } 614 | .navbar-fixed-top, 615 | .navbar-fixed-bottom { 616 | position: static; 617 | } 618 | .navbar-fixed-top { 619 | margin-bottom: 18px; 620 | } 621 | .navbar-fixed-bottom { 622 | margin-top: 18px; 623 | } 624 | .navbar-fixed-top .navbar-inner, 625 | .navbar-fixed-bottom .navbar-inner { 626 | padding: 5px; 627 | } 628 | .navbar .container { 629 | width: auto; 630 | padding: 0; 631 | } 632 | .navbar .brand { 633 | padding-left: 10px; 634 | padding-right: 10px; 635 | margin: 0 0 0 -5px; 636 | } 637 | .nav-collapse { 638 | clear: both; 639 | } 640 | .nav-collapse .nav { 641 | float: none; 642 | margin: 0 0 9px; 643 | } 644 | .nav-collapse .nav > li { 645 | float: none; 646 | } 647 | .nav-collapse .nav > li > a { 648 | margin-bottom: 2px; 649 | } 650 | .nav-collapse .nav > .divider-vertical { 651 | display: none; 652 | } 653 | .nav-collapse .nav .nav-header { 654 | color: #999999; 655 | text-shadow: none; 656 | } 657 | .nav-collapse .nav > li > a, 658 | .nav-collapse .dropdown-menu a { 659 | padding: 6px 15px; 660 | font-weight: bold; 661 | color: #999999; 662 | -webkit-border-radius: 3px; 663 | -moz-border-radius: 3px; 664 | border-radius: 3px; 665 | } 666 | .nav-collapse .btn { 667 | padding: 4px 10px 4px; 668 | font-weight: normal; 669 | -webkit-border-radius: 4px; 670 | -moz-border-radius: 4px; 671 | border-radius: 4px; 672 | } 673 | .nav-collapse .dropdown-menu li + li a { 674 | margin-bottom: 2px; 675 | } 676 | .nav-collapse .nav > li > a:hover, 677 | .nav-collapse .dropdown-menu a:hover { 678 | background-color: #222222; 679 | } 680 | .nav-collapse.in .btn-group { 681 | margin-top: 5px; 682 | padding: 0; 683 | } 684 | .nav-collapse .dropdown-menu { 685 | position: static; 686 | top: auto; 687 | left: auto; 688 | float: none; 689 | display: block; 690 | max-width: none; 691 | margin: 0 15px; 692 | padding: 0; 693 | background-color: transparent; 694 | border: none; 695 | -webkit-border-radius: 0; 696 | -moz-border-radius: 0; 697 | border-radius: 0; 698 | -webkit-box-shadow: none; 699 | -moz-box-shadow: none; 700 | box-shadow: none; 701 | } 702 | .nav-collapse .dropdown-menu:before, 703 | .nav-collapse .dropdown-menu:after { 704 | display: none; 705 | } 706 | .nav-collapse .dropdown-menu .divider { 707 | display: none; 708 | } 709 | .nav-collapse .navbar-form, 710 | .nav-collapse .navbar-search { 711 | float: none; 712 | padding: 9px 15px; 713 | margin: 9px 0; 714 | border-top: 1px solid #222222; 715 | border-bottom: 1px solid #222222; 716 | -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); 717 | -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); 718 | box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); 719 | } 720 | .navbar .nav-collapse .nav.pull-right { 721 | float: none; 722 | margin-left: 0; 723 | } 724 | .nav-collapse, 725 | .nav-collapse.collapse { 726 | overflow: hidden; 727 | height: 0; 728 | } 729 | .navbar .btn-navbar { 730 | display: block; 731 | } 732 | .navbar-static .navbar-inner { 733 | padding-left: 10px; 734 | padding-right: 10px; 735 | } 736 | } 737 | @media (min-width: 980px) { 738 | .nav-collapse.collapse { 739 | height: auto !important; 740 | overflow: visible !important; 741 | } 742 | } 743 | p { 744 | margin: 0 0 9px; 745 | } 746 | p small { 747 | font-size: 11px; 748 | color: #999999; 749 | } 750 | .lead { 751 | margin-bottom: 18px; 752 | font-size: 20px; 753 | font-weight: 200; 754 | line-height: 27px; 755 | } 756 | h1, 757 | h2, 758 | h3, 759 | h4, 760 | h5, 761 | h6 { 762 | margin: 0; 763 | font-family: inherit; 764 | font-weight: bold; 765 | color: inherit; 766 | text-rendering: optimizelegibility; 767 | } 768 | h1 small, 769 | h2 small, 770 | h3 small, 771 | h4 small, 772 | h5 small, 773 | h6 small { 774 | font-weight: normal; 775 | color: #999999; 776 | } 777 | h1 { 778 | font-size: 30px; 779 | line-height: 36px; 780 | } 781 | h1 small { 782 | font-size: 18px; 783 | } 784 | h2 { 785 | font-size: 24px; 786 | line-height: 36px; 787 | } 788 | h2 small { 789 | font-size: 18px; 790 | } 791 | h3 { 792 | font-size: 18px; 793 | line-height: 27px; 794 | } 795 | h3 small { 796 | font-size: 14px; 797 | } 798 | h4, 799 | h5, 800 | h6 { 801 | line-height: 18px; 802 | } 803 | h4 { 804 | font-size: 14px; 805 | } 806 | h4 small { 807 | font-size: 12px; 808 | } 809 | h5 { 810 | font-size: 12px; 811 | } 812 | h6 { 813 | font-size: 11px; 814 | color: #999999; 815 | text-transform: uppercase; 816 | } 817 | .page-header { 818 | padding-bottom: 17px; 819 | margin: 18px 0; 820 | border-bottom: 1px solid #eeeeee; 821 | } 822 | .page-header h1 { 823 | line-height: 1; 824 | } 825 | ul, 826 | ol { 827 | padding: 0; 828 | margin: 0 0 9px 25px; 829 | } 830 | ul ul, 831 | ul ol, 832 | ol ol, 833 | ol ul { 834 | margin-bottom: 0; 835 | } 836 | ul { 837 | list-style: disc; 838 | } 839 | ol { 840 | list-style: decimal; 841 | } 842 | li { 843 | line-height: 18px; 844 | } 845 | ul.unstyled, 846 | ol.unstyled { 847 | margin-left: 0; 848 | list-style: none; 849 | } 850 | dl { 851 | margin-bottom: 18px; 852 | } 853 | dt, 854 | dd { 855 | line-height: 18px; 856 | } 857 | dt { 858 | font-weight: bold; 859 | line-height: 17px; 860 | } 861 | dd { 862 | margin-left: 9px; 863 | } 864 | .dl-horizontal dt { 865 | float: left; 866 | width: 120px; 867 | clear: left; 868 | text-align: right; 869 | overflow: hidden; 870 | text-overflow: ellipsis; 871 | white-space: nowrap; 872 | } 873 | .dl-horizontal dd { 874 | margin-left: 130px; 875 | } 876 | hr { 877 | margin: 18px 0; 878 | border: 0; 879 | border-top: 1px solid #eeeeee; 880 | border-bottom: 1px solid #ffffff; 881 | } 882 | strong { 883 | font-weight: bold; 884 | } 885 | em { 886 | font-style: italic; 887 | } 888 | .muted { 889 | color: #999999; 890 | } 891 | abbr[title] { 892 | cursor: help; 893 | border-bottom: 1px dotted #999999; 894 | } 895 | abbr.initialism { 896 | font-size: 90%; 897 | text-transform: uppercase; 898 | } 899 | blockquote { 900 | padding: 0 0 0 15px; 901 | margin: 0 0 18px; 902 | border-left: 5px solid #eeeeee; 903 | } 904 | blockquote p { 905 | margin-bottom: 0; 906 | font-size: 16px; 907 | font-weight: 300; 908 | line-height: 22.5px; 909 | } 910 | blockquote small { 911 | display: block; 912 | line-height: 18px; 913 | color: #999999; 914 | } 915 | blockquote small:before { 916 | content: '\2014 \00A0'; 917 | } 918 | blockquote.pull-right { 919 | float: right; 920 | padding-right: 15px; 921 | padding-left: 0; 922 | border-right: 5px solid #eeeeee; 923 | border-left: 0; 924 | } 925 | blockquote.pull-right p, 926 | blockquote.pull-right small { 927 | text-align: right; 928 | } 929 | q:before, 930 | q:after, 931 | blockquote:before, 932 | blockquote:after { 933 | content: ""; 934 | } 935 | address { 936 | display: block; 937 | margin-bottom: 18px; 938 | font-style: normal; 939 | line-height: 18px; 940 | } 941 | small { 942 | font-size: 100%; 943 | } 944 | cite { 945 | font-style: normal; 946 | } 947 | form { 948 | margin: 0 0 18px; 949 | } 950 | input { 951 | font-size: 13px; 952 | font-weight: normal; 953 | line-height: 18px; 954 | } 955 | input { 956 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 957 | } 958 | input[type="email"] { 959 | display: inline-block; 960 | height: 18px; 961 | padding: 4px; 962 | margin-bottom: 9px; 963 | font-size: 13px; 964 | line-height: 18px; 965 | color: #555555; 966 | } 967 | input { 968 | width: 210px; 969 | } 970 | input[type="email"] { 971 | background-color: #ffffff; 972 | border: 1px solid #cccccc; 973 | -webkit-border-radius: 3px; 974 | -moz-border-radius: 3px; 975 | border-radius: 3px; 976 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 977 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 978 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 979 | -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; 980 | -moz-transition: border linear 0.2s, box-shadow linear 0.2s; 981 | -ms-transition: border linear 0.2s, box-shadow linear 0.2s; 982 | -o-transition: border linear 0.2s, box-shadow linear 0.2s; 983 | transition: border linear 0.2s, box-shadow linear 0.2s; 984 | } 985 | input[type="email"]:focus { 986 | border-color: rgba(82, 168, 236, 0.8); 987 | outline: 0; 988 | outline: thin dotted \9; 989 | /* IE6-9 */ 990 | 991 | -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); 992 | -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); 993 | box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); 994 | } 995 | input[type="submit"] { 996 | width: auto; 997 | } 998 | input:focus:required:invalid, 999 | textarea:focus:required:invalid, 1000 | select:focus:required:invalid { 1001 | color: #b94a48; 1002 | border-color: #ee5f5b; 1003 | } 1004 | input:focus:required:invalid:focus, 1005 | textarea:focus:required:invalid:focus, 1006 | select:focus:required:invalid:focus { 1007 | border-color: #e9322d; 1008 | -webkit-box-shadow: 0 0 6px #f8b9b7; 1009 | -moz-box-shadow: 0 0 6px #f8b9b7; 1010 | box-shadow: 0 0 6px #f8b9b7; 1011 | } 1012 | :-moz-placeholder { 1013 | color: #999999; 1014 | } 1015 | :-ms-input-placeholder { 1016 | color: #999999; 1017 | } 1018 | ::-webkit-input-placeholder { 1019 | color: #999999; 1020 | } 1021 | [class^="icon-"], 1022 | [class*=" icon-"] { 1023 | display: inline-block; 1024 | width: 14px; 1025 | height: 14px; 1026 | *margin-right: .3em; 1027 | line-height: 14px; 1028 | vertical-align: text-top; 1029 | background-image: url("../img/glyphicons-halflings.png"); 1030 | background-position: 14px 14px; 1031 | background-repeat: no-repeat; 1032 | } 1033 | [class^="icon-"]:last-child, 1034 | [class*=" icon-"]:last-child { 1035 | *margin-left: 0; 1036 | } 1037 | .icon-white { 1038 | background-image: url("../img/glyphicons-halflings-white.png"); 1039 | } 1040 | .icon-star { 1041 | background-position: -120px 0; 1042 | } 1043 | .btn { 1044 | display: inline-block; 1045 | *display: inline; 1046 | /* IE7 inline-block hack */ 1047 | 1048 | *zoom: 1; 1049 | padding: 4px 10px 4px; 1050 | margin-bottom: 0; 1051 | font-size: 13px; 1052 | line-height: 18px; 1053 | *line-height: 20px; 1054 | color: #333333; 1055 | text-align: center; 1056 | text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); 1057 | vertical-align: middle; 1058 | cursor: pointer; 1059 | background-color: #f5f5f5; 1060 | background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); 1061 | background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); 1062 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); 1063 | background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); 1064 | background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); 1065 | background-image: linear-gradient(top, #ffffff, #e6e6e6); 1066 | background-repeat: repeat-x; 1067 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); 1068 | border-color: #e6e6e6 #e6e6e6 #bfbfbf; 1069 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 1070 | *background-color: #e6e6e6; 1071 | /* Darken IE7 buttons by default so they stand out more given they won't have borders */ 1072 | 1073 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 1074 | border: 1px solid #cccccc; 1075 | *border: 0; 1076 | border-bottom-color: #b3b3b3; 1077 | -webkit-border-radius: 4px; 1078 | -moz-border-radius: 4px; 1079 | border-radius: 4px; 1080 | *margin-left: .3em; 1081 | -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); 1082 | -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); 1083 | box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); 1084 | } 1085 | .btn:hover, 1086 | .btn:active, 1087 | .btn.active, 1088 | .btn.disabled, 1089 | .btn[disabled] { 1090 | background-color: #e6e6e6; 1091 | *background-color: #d9d9d9; 1092 | } 1093 | .btn:active, 1094 | .btn.active { 1095 | background-color: #cccccc \9; 1096 | } 1097 | .btn:first-child { 1098 | *margin-left: 0; 1099 | } 1100 | .btn:hover { 1101 | color: #333333; 1102 | text-decoration: none; 1103 | background-color: #e6e6e6; 1104 | *background-color: #d9d9d9; 1105 | /* Buttons in IE7 don't get borders, so darken on hover */ 1106 | 1107 | background-position: 0 -15px; 1108 | -webkit-transition: background-position 0.1s linear; 1109 | -moz-transition: background-position 0.1s linear; 1110 | -ms-transition: background-position 0.1s linear; 1111 | -o-transition: background-position 0.1s linear; 1112 | transition: background-position 0.1s linear; 1113 | } 1114 | .btn:focus { 1115 | outline: thin dotted #333; 1116 | outline: 5px auto -webkit-focus-ring-color; 1117 | outline-offset: -2px; 1118 | } 1119 | .btn.active, 1120 | .btn:active { 1121 | background-color: #e6e6e6; 1122 | background-color: #d9d9d9 \9; 1123 | background-image: none; 1124 | outline: 0; 1125 | -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); 1126 | -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); 1127 | box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); 1128 | } 1129 | .btn.disabled, 1130 | .btn[disabled] { 1131 | cursor: default; 1132 | background-color: #e6e6e6; 1133 | background-image: none; 1134 | opacity: 0.65; 1135 | filter: alpha(opacity=65); 1136 | -webkit-box-shadow: none; 1137 | -moz-box-shadow: none; 1138 | box-shadow: none; 1139 | } 1140 | 1141 | .navbar { 1142 | *position: relative; 1143 | *z-index: 2; 1144 | overflow: visible; 1145 | margin-bottom: 18px; 1146 | } 1147 | 1148 | .navbar-fixed-top, 1149 | .navbar-fixed-bottom { 1150 | position: fixed; 1151 | right: 0; 1152 | left: 0; 1153 | z-index: 1030; 1154 | margin-bottom: 0; 1155 | } 1156 | .navbar-fixed-top .navbar-inner, 1157 | .navbar-fixed-bottom .navbar-inner { 1158 | padding-left: 0; 1159 | padding-right: 0; 1160 | -webkit-border-radius: 0; 1161 | -moz-border-radius: 0; 1162 | border-radius: 0; 1163 | } 1164 | .navbar-fixed-top .container, 1165 | .navbar-fixed-bottom .container { 1166 | width: 1170px; 1167 | } 1168 | .navbar-fixed-top { 1169 | top: 0; 1170 | } 1171 | 1172 | 1173 | /* 1174 | Python Books Styles 1175 | */ 1176 | 1177 | 1178 | body { 1179 | padding-top: 115px; 1180 | background-color: #f6f6f6; 1181 | background-attachment: fixed; 1182 | font-family: 'Gentium Book Basic', serif; 1183 | color: #1a1a1a; 1184 | } 1185 | .pbhead { 1186 | height: 95px; 1187 | padding: 10px 0; 1188 | background-color: #dddbdb; 1189 | background: rgba(221, 219, 219,.9); 1190 | border-bottom: 1px solid white; 1191 | text-align: center; 1192 | } 1193 | .pbhead h1, .footer p { 1194 | margin-top: 7px; 1195 | color: #646464; 1196 | text-shadow: 0 1px 0 white; 1197 | } 1198 | #headerlink, .footer p, #footerlink { 1199 | font: normal 10px 'Ubuntu', Helvetica, Arial, sans-serif; 1200 | color: #aaa; 1201 | text-shadow: 1px 0 1px rgba(255, 255, 255, 0.8); 1202 | margin-top: 5px; 1203 | } 1204 | .github img { 1205 | max-height: 128px; 1206 | position: fixed; 1207 | top: 0; 1208 | left: 0; 1209 | border: 0; 1210 | z-index: 10000; 1211 | } 1212 | a.jsbookslinks { 1213 | color: #bcbcbc; 1214 | font-family: Helvetica, Arial, sans-serif; 1215 | display: inline-block; 1216 | margin: 0 0 20px 0; 1217 | } 1218 | .recrutement { 1219 | color: #3e3a37; 1220 | font-weight: bold; 1221 | padding: 10px 0; 1222 | margin: 20px auto; 1223 | text-align: center; 1224 | -webkit-transition-duration: .4s; 1225 | -moz-transition-duration: .4s; 1226 | -ms-transition-duration: .4s; 1227 | -o-transition-duration: .4s; 1228 | transition-duration: .4s; 1229 | } 1230 | .recrutement:hover { 1231 | color: #3775a9; 1232 | text-decoration: none; 1233 | } 1234 | .pythonbooks { 1235 | background-color: transparent; 1236 | margin: 0 0 30px; 1237 | } 1238 | .pythonbooks > * { 1239 | display: inline; 1240 | margin-right: 10px; 1241 | } 1242 | .booksection { 1243 | margin-bottom: 30px; 1244 | } 1245 | .booksection #cover { 1246 | float: left; 1247 | position: relative; 1248 | width: 140px; 1249 | height: 184px; 1250 | margin-right: 20px; 1251 | outline: 3px solid #dfdddd; 1252 | } 1253 | .booksection p.level { 1254 | font-size: 11px; 1255 | font-family: Helvetica, Arial, sans-serif; 1256 | } 1257 | .booksection p.description { 1258 | height: 128px; 1259 | line-height: 16px; 1260 | overflow: hidden; 1261 | color: #505050; 1262 | } 1263 | .booksection p.level { 1264 | color: grey; 1265 | } 1266 | .booksection .view { 1267 | display: block; 1268 | position: absolute; 1269 | -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 1270 | filter: alpha(opacity=0); 1271 | opacity:0; 1272 | width: 140px; 1273 | height: 184px; 1274 | background: rgba(54, 109, 156,.9) url('../img/view.png') no-repeat center; 1275 | z-index: 10; 1276 | -webkit-transition:opacity .2s linear; 1277 | -moz-transition:opacity .2s linear; 1278 | -o-transition:opacity .2s linear; 1279 | transition:opacity .2s linear; 1280 | 1281 | } 1282 | .booksection .view:hover { 1283 | -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=1000)"; 1284 | filter: alpha(opacity=1000); 1285 | opacity:10; 1286 | } 1287 | h1 { 1288 | font: normal 12px 'Ubuntu', Helvetica, Arial, sans-serif; 1289 | margin-top: 10px; 1290 | margin-bottom: 5px; 1291 | color: #2f2e2d; 1292 | text-shadow: 1px 0 1px rgba(255, 255, 255, 0.6); 1293 | } 1294 | h2, 1295 | h4 { 1296 | font: bold 12px 'Ubuntu', Helvetica, Arial, sans-serif; 1297 | text-transform: uppercase; 1298 | line-height: 14px; 1299 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); 1300 | color: #366d9c; 1301 | white-space: nowrap; 1302 | overflow: hidden; 1303 | text-overflow: ellipsis; 1304 | -moz-binding: url('ellipsis.xml#ellipsis'); 1305 | } 1306 | h3 { 1307 | line-height: 13px; 1308 | } 1309 | h3 a { 1310 | text-decoration: underline; 1311 | font: normal 12px "Helvetica Neue", Helvetica, Arial, sans-serif; 1312 | color: #fcc41b; 1313 | text-shadow: 2px 0 0 rgba(255,255,255,.8); 1314 | white-space: nowrap; 1315 | overflow: hidden; 1316 | text-overflow: ellipsis; 1317 | } 1318 | h3 a:hover, 1319 | h3 a:active { 1320 | color: #cfb798; 1321 | } 1322 | hr { 1323 | margin: 8px 0; 1324 | border-top-color: white; 1325 | border-top: 1px solid #dfdddd; 1326 | border-bottom: 1px solid white; 1327 | } 1328 | ul { 1329 | list-style-type: none; 1330 | position: absolute; 1331 | top: 50%; 1332 | margin-top: -10px; 1333 | right: 40px; 1334 | height: 20px; 1335 | } 1336 | ul li { 1337 | display: inline; 1338 | height: 20px; 1339 | } 1340 | ul li a { 1341 | vertical-align: top; 1342 | color: grey; 1343 | text-shadow: 1px 0 0 rgba(255, 255, 255, 0.4); 1344 | font: bold 12px Arial, Helvetica, sans-serif; 1345 | -webkit-transition: all .2s linear; 1346 | -moz-transition: all .2s linear; 1347 | -o-transition: all .2s linear; 1348 | -ms-transition: all .2s linear; 1349 | transition: all .2s linear; 1350 | } 1351 | ul li a:hover { 1352 | text-decoration: none; 1353 | color: black; 1354 | text-shadow:none; 1355 | } 1356 | .twitter-share-button { 1357 | height: 30px; 1358 | } 1359 | #mod_infos { 1360 | padding: 10px 20px; 1361 | background: rgba(255, 255, 255, .8); 1362 | border-radius: 4px; 1363 | margin-bottom: 50px; 1364 | border: 1px solid #dfdddd; 1365 | } 1366 | #mod_infos h4 { 1367 | padding-bottom: 4px; 1368 | margin-bottom: 10px; 1369 | text-transform: uppercase; 1370 | color: #366d9c; 1371 | text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); 1372 | border-bottom: 1px solid #366d9c; 1373 | } 1374 | .footer { 1375 | padding: 10px 0; 1376 | text-align: center; 1377 | } 1378 | .footer hr { 1379 | width: 75%; 1380 | margin: 0 auto; 1381 | margin-bottom: 9px; 1382 | } 1383 | .footer p; .footer a { 1384 | font-family: Helvetica, Arial, sans-serif; 1385 | font-size: 10px; 1386 | } 1387 | /* RESPONSIVE LAYOUT */ 1388 | 1389 | @media (min-width: 1200px) { 1390 | .row { 1391 | margin-left: -30px; 1392 | *zoom: 1; 1393 | } 1394 | .row:before, 1395 | .row:after { 1396 | display: table; 1397 | content: ""; 1398 | } 1399 | .row:after { 1400 | clear: both; 1401 | } 1402 | [class*="span"] { 1403 | float: left; 1404 | margin-left: 30px; 1405 | } 1406 | .container, 1407 | .navbar-fixed-top .container, 1408 | .navbar-fixed-bottom .container { 1409 | width: 1170px; 1410 | } 1411 | .span12 { 1412 | width: 1170px; 1413 | } 1414 | .span11 { 1415 | width: 1070px; 1416 | } 1417 | .span10 { 1418 | width: 970px; 1419 | } 1420 | .span9 { 1421 | width: 870px; 1422 | } 1423 | .span8 { 1424 | width: 770px; 1425 | } 1426 | .span7 { 1427 | width: 670px; 1428 | } 1429 | .span6 { 1430 | width: 570px; 1431 | } 1432 | .span5 { 1433 | width: 470px; 1434 | } 1435 | .span4 { 1436 | width: 370px; 1437 | } 1438 | .span3 { 1439 | width: 270px; 1440 | } 1441 | .span2 { 1442 | width: 170px; 1443 | } 1444 | .span1 { 1445 | width: 70px; 1446 | } 1447 | .offset12 { 1448 | margin-left: 1230px; 1449 | } 1450 | .offset11 { 1451 | margin-left: 1130px; 1452 | } 1453 | .offset10 { 1454 | margin-left: 1030px; 1455 | } 1456 | .offset9 { 1457 | margin-left: 930px; 1458 | } 1459 | .offset8 { 1460 | margin-left: 830px; 1461 | } 1462 | .offset7 { 1463 | margin-left: 730px; 1464 | } 1465 | .offset6 { 1466 | margin-left: 630px; 1467 | } 1468 | .offset5 { 1469 | margin-left: 530px; 1470 | } 1471 | .offset4 { 1472 | margin-left: 430px; 1473 | } 1474 | .offset3 { 1475 | margin-left: 330px; 1476 | } 1477 | .offset2 { 1478 | margin-left: 230px; 1479 | } 1480 | .offset1 { 1481 | margin-left: 130px; 1482 | } 1483 | .row-fluid { 1484 | width: 100%; 1485 | *zoom: 1; 1486 | } 1487 | .row-fluid:before, 1488 | .row-fluid:after { 1489 | display: table; 1490 | content: ""; 1491 | } 1492 | .row-fluid:after { 1493 | clear: both; 1494 | } 1495 | .row-fluid [class*="span"] { 1496 | display: block; 1497 | width: 100%; 1498 | min-height: 28px; 1499 | -webkit-box-sizing: border-box; 1500 | -moz-box-sizing: border-box; 1501 | -ms-box-sizing: border-box; 1502 | box-sizing: border-box; 1503 | float: left; 1504 | margin-left: 2.564102564%; 1505 | *margin-left: 2.510911074638298%; 1506 | } 1507 | .row-fluid [class*="span"]:first-child { 1508 | margin-left: 0; 1509 | } 1510 | .row-fluid .span12 { 1511 | width: 100%; 1512 | *width: 99.94680851063829%; 1513 | } 1514 | .row-fluid .span11 { 1515 | width: 91.45299145300001%; 1516 | *width: 91.3997999636383%; 1517 | } 1518 | .row-fluid .span10 { 1519 | width: 82.905982906%; 1520 | *width: 82.8527914166383%; 1521 | } 1522 | .row-fluid .span9 { 1523 | width: 74.358974359%; 1524 | *width: 74.30578286963829%; 1525 | } 1526 | .row-fluid .span8 { 1527 | width: 65.81196581200001%; 1528 | *width: 65.7587743226383%; 1529 | } 1530 | .row-fluid .span7 { 1531 | width: 57.264957265%; 1532 | *width: 57.2117657756383%; 1533 | } 1534 | .row-fluid .span6 { 1535 | width: 48.717948718%; 1536 | *width: 48.6647572286383%; 1537 | } 1538 | .row-fluid .span5 { 1539 | width: 40.170940171000005%; 1540 | *width: 40.117748681638304%; 1541 | } 1542 | .row-fluid .span4 { 1543 | width: 31.623931624%; 1544 | *width: 31.5707401346383%; 1545 | } 1546 | .row-fluid .span3 { 1547 | width: 23.076923077%; 1548 | *width: 23.0237315876383%; 1549 | } 1550 | .row-fluid .span2 { 1551 | width: 14.529914530000001%; 1552 | *width: 14.4767230406383%; 1553 | } 1554 | .row-fluid .span1 { 1555 | width: 5.982905983%; 1556 | *width: 5.929714493638298%; 1557 | } 1558 | input, 1559 | textarea, 1560 | .uneditable-input { 1561 | margin-left: 0; 1562 | } 1563 | input.span12, textarea.span12, .uneditable-input.span12 { 1564 | width: 1160px; 1565 | } 1566 | input.span11, textarea.span11, .uneditable-input.span11 { 1567 | width: 1060px; 1568 | } 1569 | input.span10, textarea.span10, .uneditable-input.span10 { 1570 | width: 960px; 1571 | } 1572 | input.span9, textarea.span9, .uneditable-input.span9 { 1573 | width: 860px; 1574 | } 1575 | input.span8, textarea.span8, .uneditable-input.span8 { 1576 | width: 760px; 1577 | } 1578 | input.span7, textarea.span7, .uneditable-input.span7 { 1579 | width: 660px; 1580 | } 1581 | input.span6, textarea.span6, .uneditable-input.span6 { 1582 | width: 560px; 1583 | } 1584 | input.span5, textarea.span5, .uneditable-input.span5 { 1585 | width: 460px; 1586 | } 1587 | input.span4, textarea.span4, .uneditable-input.span4 { 1588 | width: 360px; 1589 | } 1590 | input.span3, textarea.span3, .uneditable-input.span3 { 1591 | width: 260px; 1592 | } 1593 | input.span2, textarea.span2, .uneditable-input.span2 { 1594 | width: 160px; 1595 | } 1596 | input.span1, textarea.span1, .uneditable-input.span1 { 1597 | width: 60px; 1598 | } 1599 | .thumbnails { 1600 | margin-left: -30px; 1601 | } 1602 | .thumbnails > li { 1603 | margin-left: 30px; 1604 | } 1605 | .row-fluid .thumbnails { 1606 | margin-left: 0; 1607 | } 1608 | } 1609 | 1610 | @media (min-width: 980px) and (max-width: 1200px) { 1611 | h2 { 1612 | font-size: 14px; 1613 | } 1614 | } 1615 | 1616 | @media (max-width: 767px) { 1617 | body { 1618 | padding-top: 95px; 1619 | } 1620 | div.pbhead { 1621 | height:73px; 1622 | } 1623 | div.pbhead h1 { 1624 | margin-top: 5px; 1625 | font-size: 12px; 1626 | } 1627 | div.pbhead img { 1628 | max-width: 220px; 1629 | max-height:35px; 1630 | } 1631 | ul { 1632 | margin-top: -20px; 1633 | } 1634 | ul li { 1635 | display: block; 1636 | height: 25px; 1637 | } 1638 | a.github img { 1639 | height:100px; 1640 | } 1641 | h1 { 1642 | font: normal 14px 'Ubuntu', Helvetica, Arial, sans-serif; 1643 | } 1644 | .booksection { 1645 | height: 200px; 1646 | } 1647 | .booksection #cover { 1648 | width: 140px; 1649 | height: 184px; 1650 | } 1651 | 1652 | } 1653 | 1654 | @media (min-width: 768px) and (max-width: 979px) { 1655 | .booksection #cover { 1656 | float: none; 1657 | width: 228px; 1658 | height: 298px; 1659 | margin-bottom: 10px; 1660 | } 1661 | .booksection .view { 1662 | width: 228px; 1663 | height: 298px; 1664 | font: normal 17px Helvetica, Arial, sans-serif; 1665 | line-height: 298px; 1666 | } 1667 | .btn { 1668 | width: 190px; 1669 | } 1670 | .booksection p.description { 1671 | height: 96px; 1672 | } 1673 | } 1674 | @media (max-width: 480px) { 1675 | .btn { 1676 | width: 120px; 1677 | } 1678 | .booksection p.description { 1679 | height: 96px; 1680 | overflow: hidden; 1681 | } 1682 | .twitter-share-button { 1683 | display: none; 1684 | } 1685 | ul { 1686 | margin-top: -10px; 1687 | } 1688 | ul li:first-child { 1689 | display: none; 1690 | } 1691 | } 1692 | -------------------------------------------------------------------------------- /img/BMH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/BMH.png -------------------------------------------------------------------------------- /img/Python3-powered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/Python3-powered.png -------------------------------------------------------------------------------- /img/PythonDScover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/PythonDScover.png -------------------------------------------------------------------------------- /img/PythonGuide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/PythonGuide.png -------------------------------------------------------------------------------- /img/apple-touch-icon-114-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/apple-touch-icon-114-precomposed.png -------------------------------------------------------------------------------- /img/cover_alabamaintro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_alabamaintro.png -------------------------------------------------------------------------------- /img/cover_apprendrepython2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_apprendrepython2.jpg -------------------------------------------------------------------------------- /img/cover_apprendrepython3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_apprendrepython3.jpg -------------------------------------------------------------------------------- /img/cover_buildingskillnonpro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_buildingskillnonpro.jpg -------------------------------------------------------------------------------- /img/cover_buildingskillsoop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_buildingskillsoop.jpg -------------------------------------------------------------------------------- /img/cover_buildingskillspython.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_buildingskillspython.jpg -------------------------------------------------------------------------------- /img/cover_complexity.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_complexity.jpg -------------------------------------------------------------------------------- /img/cover_computervision.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_computervision.jpg -------------------------------------------------------------------------------- /img/cover_datastructandalg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_datastructandalg.png -------------------------------------------------------------------------------- /img/cover_divepython.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_divepython.jpg -------------------------------------------------------------------------------- /img/cover_divepython3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_divepython3.jpg -------------------------------------------------------------------------------- /img/cover_django.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_django.png -------------------------------------------------------------------------------- /img/cover_flask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_flask.png -------------------------------------------------------------------------------- /img/cover_gettingstartedwithdjango.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_gettingstartedwithdjango.jpg -------------------------------------------------------------------------------- /img/cover_googledevelopers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_googledevelopers.png -------------------------------------------------------------------------------- /img/cover_highperf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_highperf.png -------------------------------------------------------------------------------- /img/cover_inventgame.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_inventgame.jpg -------------------------------------------------------------------------------- /img/cover_inventgame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_inventgame.png -------------------------------------------------------------------------------- /img/cover_jessenoller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_jessenoller.png -------------------------------------------------------------------------------- /img/cover_kivy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_kivy.png -------------------------------------------------------------------------------- /img/cover_learnpython.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_learnpython.jpg -------------------------------------------------------------------------------- /img/cover_makinggame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_makinggame.png -------------------------------------------------------------------------------- /img/cover_nltk.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_nltk.jpg -------------------------------------------------------------------------------- /img/cover_porting_python3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_porting_python3.png -------------------------------------------------------------------------------- /img/cover_pymotw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_pymotw.png -------------------------------------------------------------------------------- /img/cover_pypd_2ed_th.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_pypd_2ed_th.jpg -------------------------------------------------------------------------------- /img/cover_pyramid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_pyramid.png -------------------------------------------------------------------------------- /img/cover_python101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_python101.png -------------------------------------------------------------------------------- /img/cover_pythonstandardlibrairy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_pythonstandardlibrairy.png -------------------------------------------------------------------------------- /img/cover_scientific.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_scientific.jpg -------------------------------------------------------------------------------- /img/cover_snakewrangling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_snakewrangling.png -------------------------------------------------------------------------------- /img/cover_stats.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_stats.jpg -------------------------------------------------------------------------------- /img/cover_swaroop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_swaroop.png -------------------------------------------------------------------------------- /img/cover_thinkpython.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/cover_thinkpython.jpg -------------------------------------------------------------------------------- /img/djenofdjango.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/djenofdjango.jpg -------------------------------------------------------------------------------- /img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /img/hackingcyphers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/hackingcyphers.png -------------------------------------------------------------------------------- /img/ico/apple-touch-icon-114-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/ico/apple-touch-icon-114-precomposed.png -------------------------------------------------------------------------------- /img/ico/apple-touch-icon-144-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/ico/apple-touch-icon-144-precomposed.png -------------------------------------------------------------------------------- /img/ico/apple-touch-icon-57-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/ico/apple-touch-icon-57-precomposed.png -------------------------------------------------------------------------------- /img/ico/apple-touch-icon-72-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/ico/apple-touch-icon-72-precomposed.png -------------------------------------------------------------------------------- /img/ico/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/ico/favicon.ico -------------------------------------------------------------------------------- /img/level.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/level.png -------------------------------------------------------------------------------- /img/logo_jsbooks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/logo_jsbooks.png -------------------------------------------------------------------------------- /img/logo_pythonbooks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/logo_pythonbooks.png -------------------------------------------------------------------------------- /img/logo_pythonbooks_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/logo_pythonbooks_.png -------------------------------------------------------------------------------- /img/modelingcreativity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/modelingcreativity.png -------------------------------------------------------------------------------- /img/pattern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/pattern.png -------------------------------------------------------------------------------- /img/py3programming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/py3programming.png -------------------------------------------------------------------------------- /img/pym.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/pym.png -------------------------------------------------------------------------------- /img/revologo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/revologo.png -------------------------------------------------------------------------------- /img/runestone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/runestone.png -------------------------------------------------------------------------------- /img/social_gplus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/social_gplus.png -------------------------------------------------------------------------------- /img/social_skype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/social_skype.png -------------------------------------------------------------------------------- /img/social_twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/social_twitter.png -------------------------------------------------------------------------------- /img/testdriven.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/testdriven.jpg -------------------------------------------------------------------------------- /img/view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/view.png -------------------------------------------------------------------------------- /img/web2py.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bnmnetp/PythonBooks/5ee4dcfaed3525e2cb43276d276112d6eab6dd30/img/web2py.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PythonBooks - Learn Python the easy way ! 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | Fork me on GitHub 26 | 27 | 30 | 41 | 42 |
43 | 46 |
47 | {{ • We're hiring talented web developers in Paris, France • }} 48 |
49 |

See also :

50 | 51 | Javascript Books 52 | 53 |
54 |
55 | 56 | 57 |
58 |
59 | 60 | 63 | 75 | 76 | 77 | 78 | 79 | 98 | 99 | 114 | 115 | 119 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /issues.json: -------------------------------------------------------------------------------- 1 | { "books" : [ 2 | { 3 | "title": "Python para Desenvolvedores (2nd Edition)", 4 | "author": "Luiz Eduardo Borges", 5 | "authorUrl": "http://ark4n.wordpress.com/python/", 6 | "level": "Intermediate", 7 | "info": "[PORTUGUESE] Este livro aborda assuntos que incluem: criação de interfaces com usuário, computação gráfica, aplicações para internet, sistemas distribuídos, entre outros.", 8 | "url": "http://ark4n.files.wordpress.com/2010/01/python_para_desenvolvedores_2ed.pdf", 9 | "cover": "img/cover_pypd_2ed_th.jpg" 10 | }, 11 | { 12 | "title": "How to Think Like a Computer Scientist: Second Interactive Edition", 13 | "author": "B. Miller & D. Ranum", 14 | "authorUrl": "http://reputablejournal.com", 15 | "level": "Beginner", 16 | "info": "This interactive book teaches you Python the interactive way, right in the browser.", 17 | "url": "http://interactivepython.org/runestone/static/thinkcspy/index.html", 18 | "cover": "img/runestone.png" 19 | }, 20 | { 21 | "title": "Problem Solving with Algorithms and Data Structures Using Python", 22 | "author": "B. Miller & D. Ranum", 23 | "authorUrl": "http://reputablejournal.com/", 24 | "level": "Intermediate", 25 | "info": "This book is a CS2 data structures textbook, with a review of Python concepts in chapter 1", 26 | "url": "http://interactivepython.org/runestone/static/pythonds/index.html", 27 | "cover": "img/PythonDScover.png" 28 | }, 29 | { 30 | "title": "Learn Python The Hard Way", 31 | "author": "Zed A. Shaw", 32 | "authorUrl": "http://learnpythonthehardway.org/", 33 | "level": "Beginner", 34 | "info": "Have you always wanted to learn how to code but never thought you could? Do you want to challenge your brain in a new way? ", 35 | "url": "http://learnpythonthehardway.org/book", 36 | "cover": "img/cover_learnpython.jpg" 37 | }, 38 | { 39 | "title": "Dive into Python (2004)", 40 | "author": "Mark Pilgrim", 41 | "authorUrl": "http://getpython3.com/diveintopython3/", 42 | "level": "Intermediate", 43 | "info": "Dive Into Python is a free Python book (from 2004) for experienced programmers. It covers many basics of the language", 44 | "url": "http://www.diveintopython.net/toc/index.html", 45 | "cover": "img/cover_divepython.jpg" 46 | }, 47 | { 48 | "title": "Dive into Python 3", 49 | "author": "Mark Pilgrim", 50 | "authorUrl": "http://getpython3.com/diveintopython3/", 51 | "level": "Intermediate", 52 | "info": "Dive Into Python 3 covers what's new in Python 3 and how its differs from Python 2.", 53 | "url": "http://getpython3.com/diveintopython3/whats-new.html", 54 | "cover": "img/cover_divepython3.jpg" 55 | }, 56 | { 57 | "title": "Think Python", 58 | "author": "Allen B. Downey", 59 | "authorUrl": "http://www.greenteapress.com/", 60 | "level": "Beginner", 61 | "info": "A very exhaustive book covering most of the language features, from datatypes to OOP and debugging.", 62 | "url": "http://www.greenteapress.com/thinkpython/thinkCSpy/thinkCSpy.pdf", 63 | "cover": "img/cover_thinkpython.jpg" 64 | }, 65 | { 66 | "title": "Kivy programming Guide", 67 | "author": "Kivy", 68 | "authorUrl": "http://kivy.org/", 69 | "level": "Intermediate", 70 | "info": "Discover Kivy the multitouch Python framework for desktop and mobile, and learn how to create a simple game.", 71 | "url": "http://kivy.org/docs/pdf/Kivy-latest.pdf", 72 | "cover": "img/cover_kivy.png" 73 | }, 74 | { 75 | "title": "Django Tutorial", 76 | "author": "Community", 77 | "authorUrl": "https://docs.djangoproject.com/en/dev/intro/", 78 | "level": "Intermediate", 79 | "info": "With this hands-on tutorial, discover Django the popular high-level Python Web framework that encourages rapid development and clean, pragmatic design.", 80 | "url": "https://docs.djangoproject.com/en/dev/intro/", 81 | "cover": "img/cover_django.png" 82 | }, 83 | { 84 | "title": "Pyramid for Humans", 85 | "author": "Community", 86 | "authorUrl": "http://pyramid.readthedocs.org/en/latest/index.html", 87 | "level": "Intermediate", 88 | "info": "With this tutorial, discover Pyramid a Python web application development framework. Its primary goal is to make it easier for a Python developer to create web applications.", 89 | "url": "http://docs.pylonsproject.org/projects/pyramid_tutorials/en/latest/humans/index.html", 90 | "cover": "img/cover_pyramid.png" 91 | }, 92 | { 93 | "title": "Flask microframework", 94 | "author": "Armin Ronacher", 95 | "authorUrl": "http://lucumr.pocoo.org/", 96 | "level": "Intermediate", 97 | "info": "Learn the Flask web microframework by example. Flask aims to keep the core simple but extensible and gives you freedom to choose the libraries of your choice.", 98 | "url": "http://flask.pocoo.org/docs/tutorial/", 99 | "cover": "img/cover_flask.png" 100 | }, 101 | { 102 | "title": "Making games with Python and Pygame", 103 | "author": "Al Sweigart", 104 | "authorUrl": "http://inventwithpython.com", 105 | "level": "Intermediate", 106 | "info": "Making Games with Python & Pygame” covers the Pygame library with the source code for 11 games.", 107 | "url": "http://inventwithpython.com/pygame/chapters/", 108 | "cover": "img/cover_makinggame.png" 109 | }, 110 | { 111 | "title": "High Performance Python tutorial", 112 | "author": "Ian Ozsvald", 113 | "authorUrl": "http://ianozsvald.com/2011/07/25/high-performance-python-tutorial-v0-2-from-europython-2011", 114 | "level": "Advanced", 115 | "info": "In this 55 pages tutorial, Ian Ozsvald shows you a number of techniques to get a 10-500 performance increase in your Python apps, from profiling, to PyPy, numPy, Multiprocessing...", 116 | "url": "http://ianozsvald.com/HighPerformancePythonfromTrainingatEuroPython2011_v0.2.pdf", 117 | "cover": "img/cover_highperf.png" 118 | }, 119 | { 120 | "title": "A byte of Python", 121 | "author": "Swaroop C H", 122 | "authorUrl": "http://www.swaroopch.org/", 123 | "level": "Beginner", 124 | "info": "This book aims to help you learn the wonderful Python language and show how to get things done quickly and painlessly - in effect 'The Perfect Anti-venom to your programming problems'.", 125 | "url": "http://files.swaroopch.com/python/byteofpython_120.pdf", 126 | "cover": "img/cover_swaroop.png" 127 | }, 128 | { 129 | "title": "Python 101 - Introduction to Python", 130 | "author": "Dave Kuhlman", 131 | "authorUrl": "http://www.rexx.com/~dkuhlman", 132 | "level": "Beginner", 133 | "info": "This document is a syllabus for a first course in Python programming. This course contains an introduction to the Python language, instruction in the important and commonly used features of the language, and practical excercises in the use of those features.", 134 | "url": "http://cutter.rexx.com/~dkuhlman/python_101/python_101.html", 135 | "cover": "img/cover_python101.png" 136 | }, 137 | { 138 | "title": "The Standard Python Library", 139 | "author": "Fredrik Lundh", 140 | "authorUrl": "http://effbot.org/zone/", 141 | "level": "Intermediate", 142 | "info": "This book provides a brief description of each module of the +200 Python standard library and usage examples", 143 | "url": "http://effbot.org/zone/librarybook-index.htm", 144 | "cover": "img/cover_pythonstandardlibrairy.png" 145 | }, 146 | { 147 | "title": "Snake Wrangling for Kids", 148 | "author": "Jason R. Briggs", 149 | "authorUrl": "http://www.briggs.net.nz/snake-wrangling-for-kids.html", 150 | "level": "Beginner", 151 | "info": "[DOWNLOAD REQUIRED] For children 8 years and older, who would like to learn computer programming. It covers the very basics of programming, and uses the Python programming language to teach the concepts.", 152 | "url": "http://www.briggs.net.nz/snake-wrangling-for-kids.html", 153 | "cover": "img/cover_snakewrangling.png" 154 | }, 155 | { 156 | "title": "Programming Computer Vision with Python", 157 | "author": "Jan Erik Solem", 158 | "authorUrl": "http://programmingcomputervision.com/", 159 | "level": "Advanced", 160 | "info": "[PDF DRAFT] This book gives an entry point to hands-on computer vision (images, videos...) with enough understanding of the underlying theory and algorithms.", 161 | "url": "http://programmingcomputervision.com/downloads/ProgrammingComputerVision_CCdraft.pdf", 162 | "cover": "img/cover_computervision.jpg" 163 | }, 164 | { 165 | "title": "Natural Language Processing with Python", 166 | "author": "S. Bird, E. Klein & E. Loper", 167 | "authorUrl": "https://sites.google.com/site/naturallanguagetoolkit/book", 168 | "level": "Advanced", 169 | "info": "Practical introduction to programming for language processing, written by the creators of NLTK.", 170 | "url": "https://sites.google.com/site/naturallanguagetoolkit/book", 171 | "cover": "img/cover_nltk.jpg" 172 | }, 173 | { 174 | "title": "Think Complexity", 175 | "author": "Allen B. Downey", 176 | "authorUrl": "http://www.greenteapress.com/", 177 | "level": "Advanced", 178 | "info": "This book is about complexity science, data structures and algorithms, intermediate programming in Python, and the philosophy of science.", 179 | "url": "http://greenteapress.com/complexity/html/index.html", 180 | "cover": "img/cover_complexity.jpg" 181 | }, 182 | { 183 | "title": "Think Stats", 184 | "author": "Allen B. Downey", 185 | "authorUrl": "http://www.greenteapress.com/", 186 | "level": "Advanced", 187 | "info": "Think Stats is an introduction to Probability and Statistics for Python programmers.", 188 | "url": "http://greenteapress.com/thinkstats/html/index.html", 189 | "cover": "img/cover_stats.jpg" 190 | }, 191 | { 192 | "title": "Python Module of the week", 193 | "author": "Doug Hellman", 194 | "authorUrl": "http://www.doughellmann.com/", 195 | "level": "Intermediate", 196 | "info": "The Python Module of the Week series, or PyMOTW, is a tour of the Python standard library through short and concrete examples. It covers more than 50 modules.", 197 | "url": "http://www.doughellmann.com/PyMOTW/contents.html", 198 | "cover": "img/cover_pymotw.png" 199 | }, 200 | { 201 | "title": "An introduction to Python", 202 | "author": "John C. Lusth", 203 | "authorUrl": "http://beastie.cs.ua.edu/cs150/book/index.html", 204 | "level": "Beginner", 205 | "info": "A complete scholar overview of all Python 3 functionnalities from the Alabama University.", 206 | "url": "http://beastie.cs.ua.edu/cs150/book/index.html", 207 | "cover": "img/cover_alabamaintro.png" 208 | }, 209 | { 210 | "title": "Building skills in Programming", 211 | "author": "Steven F. Lot ", 212 | "authorUrl": "http://homepage.mac.com/s_lott/", 213 | "level": "Beginner", 214 | "info": "How do you learn to program? Through a series of simple exercises that teach programming fundamentals with an easy-to-use, easy-to-learn programming language.", 215 | "url": "http://www.itmaybeahack.com/homepage/books/nonprog/html/index.html", 216 | "cover": "img/cover_buildingskillnonpro.jpg" 217 | }, 218 | { 219 | "title": "Building skills in Python", 220 | "author": "Steven F. Lot ", 221 | "authorUrl": "http://homepage.mac.com/s_lott/", 222 | "level": "Beginner", 223 | "info": "This 450+ page book has 42 chapters that will help you build Python programming skills through a series of exercises. This book includes six projects from straight-forward to sophisticated that will help solidify your Python skills.", 224 | "url": "http://www.itmaybeahack.com/book/python-2.6/html/index.html", 225 | "cover": "img/cover_buildingskillspython.jpg" 226 | }, 227 | { 228 | "title": "Building skills in OOP", 229 | "author": "Steven F. Lot ", 230 | "authorUrl": "http://homepage.mac.com/s_lott/", 231 | "level": "Intermediate", 232 | "info": "How do you move from OO programming to OO design? This 301-page book has 49 chapters that will help you build OO design skills through the creation of a moderately complex family of application programs.", 233 | "url": "http://www.itmaybeahack.com/book/oodesign-python-2.1/html/index.html", 234 | "cover": "img/cover_buildingskillsoop.jpg" 235 | }, 236 | { 237 | "title": "Python Scientific lecture notes", 238 | "author": "by the community", 239 | "authorUrl": "http://scipy-lectures.github.com/AUTHORS.html", 240 | "level": "Intermediate", 241 | "info": "Teaching material on the scientific Python ecosystem, a quick introduction to central tools and techniques. The different chapters each correspond to a 1 to 2 hours course with increasing level of expertise, from beginner to expert.", 242 | "url": "http://scipy-lectures.github.com/", 243 | "cover": "img/cover_scientific.jpg" 244 | }, 245 | { 246 | "title": "Programmez avec Python 2", 247 | "author": "Gérard Swinnen", 248 | "authorUrl": "http://inforef.be/swi/python.htm", 249 | "level": "Beginner", 250 | "info": "[FRENCH] Apprenez à programmer avec Python 2. Découvrez la programmation et le language Python grâce à cet ouvrage de référence.", 251 | "url": "http://inforef.be/swi/download/apprendre_python.pdf", 252 | "cover": "img/cover_apprendrepython2.jpg" 253 | }, 254 | { 255 | "title": "Programmez avec Python 3", 256 | "author": "Gérard Swinnen", 257 | "authorUrl": "http://inforef.be/swi/python.htm", 258 | "level": "Beginner", 259 | "info": "[FRENCH] Apprenez à programmer avec Python 3. Mise à jour du précédent ouvrage avec les spécificité de Python 3.", 260 | "url": "http://inforef.be/swi/download/apprendre_python3_5.pdf", 261 | "cover": "img/cover_apprendrepython3.jpg" 262 | }, 263 | { 264 | "title": "Python for you and me", 265 | "author": "Kushal Das", 266 | "authorUrl": "http://kushaldas.in", 267 | "level": "Beginner", 268 | "info": "A book for the total new comers into Python world. Was started as book for students before they read Python tutorial.", 269 | "url": "http://kushal.fedorapeople.org/book/", 270 | "cover": "img/pym.png" 271 | }, 272 | { 273 | "title": "Python course", 274 | "author": "Patrick Fuchs / Pierre Poulain,", 275 | "authorUrl": "http://www.dsimb.inserm.fr/~fuchs/python/python.html", 276 | "level": "Beginner", 277 | "info": "[FRENCH] Beginner and progressive course about Python theory and concepts", 278 | "url": "http://www.dsimb.inserm.fr/~fuchs/python/python-node1.html", 279 | "cover": "img/cover_python101.png" 280 | }, 281 | { 282 | "title": "Data Structures and Algorithms with Object-Oriented Design Patterns in Python", 283 | "author": "Bruno R. Preiss", 284 | "authorUrl": "http://www.brpreiss.com", 285 | "level": "Intermediate", 286 | "info": "This book is about the fundamentals of data structures and algorithms. It uses object oriented design patterns and teaches topics like stacks, queues, lists, hashing and graphs. There are also versions for other programming languages.", 287 | "url": "http://www.brpreiss.com/books/opus7/", 288 | "cover": "img/cover_datastructandalg.png" 289 | }, 290 | { 291 | "title": "A bit of Python & other things.", 292 | "author": "Jesse Noller", 293 | "authorUrl": "http://jessenoller.com/", 294 | "level": "Beginner", 295 | "info": "A usefull page with good links to read about Python", 296 | "url": "http://jessenoller.com/good-to-great-python-reads/", 297 | "cover": "img/cover_jessenoller.png" 298 | }, 299 | { 300 | "title": "Python Course", 301 | "author": "Google", 302 | "authorUrl": "http://developers.google.com", 303 | "level": "Beginner", 304 | "info": "This is a free class for people with a little bit of programming experience who want to learn Python.", 305 | "url": "https://developers.google.com/edu/python/", 306 | "cover": "img/cover_googledevelopers.png" 307 | }, 308 | { 309 | "title": "Porting to Python 3: An in-depth guide", 310 | "author": "Lennart Regebro", 311 | "authorUrl": "http://regebro.wordpress.com/", 312 | "level": "Intermediate", 313 | "info": "This book guides you through the process of porting your Python 2 code to Python 3, from choosing a porting strategy to solving your distribution issues. Using plenty of code examples is takes you cross the hurdles and shows you the new Python features.", 314 | "url": "http://python3porting.com/", 315 | "cover": "img/cover_porting_python3.png" 316 | }, 317 | { 318 | "title":"Non-Programmer's Tutorial for Python 3", 319 | "author":"Josh Cogliati/Wikibooks/Others", 320 | "authorUrl":"http://en.wikibooks.org/wiki/Non-Programmer%27s_Tutorial_for_Python_3", 321 | "level":"Beginner", 322 | "info":"The Non-Programmers' Tutorial For Python 3 is a tutorial designed to be an introduction to the Python programming language. This guide is for someone with no programming experience.", 323 | "url":"http://en.wikibooks.org/wiki/Non-Programmer%27s_Tutorial_for_Python_3", 324 | "cover":"img/Python3-powered.png" 325 | }, 326 | { 327 | "title":"The Hitchhiker’s Guide to Python!", 328 | "author":"Kenneth Reitz", 329 | "authorUrl":"http://kennethreitz.com/", 330 | "level":"Beginner", 331 | "info":"This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.", 332 | "url":"http://python-guide.org/", 333 | "cover":"img/PythonGuide.png" 334 | }, 335 | { 336 | "title":"Probabilistic Programming and Bayesian Methods for Hackers: Using Python and PyMC", 337 | "author":"Cam Davidson-Pilon and community", 338 | "authorUrl":"http://www.camdp.com", 339 | "level":"Intermediate", 340 | "info":"aka 'Bayesian Methods for Hackers': An introduction to Bayesian methods + probabilistic programming in data analysis with a computation/understanding-first, mathematics-second point of view. All in pure Python ;)", 341 | "url":"https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers", 342 | "cover":"img/BMH.png" 343 | }, 344 | { 345 | "title":"web2py Complete Manual", 346 | "author":"Massimo Di Pierro", 347 | "authorUrl":"http://web2py.com", 348 | "level":"Intermediate", 349 | "info":"As you will learn in the following pages, web2py tries to lower the barrier of entry to web development by focusing on three main goals: ease of use, rapid development and security", 350 | "url":"https://dl.dropboxusercontent.com/u/18065445/web2py/web2py_manual_5th.pdf", 351 | "cover":"img/web2py.png" 352 | }, 353 | { 354 | "title":"Hacking Secret Ciphers with Python", 355 | "author":"Al Sweigart", 356 | "authorUrl":"http://coffeeghost.net", 357 | "level":"Beginner", 358 | "info":"The book teaches complete beginners how to program in the Python programming language. The reader not only learns about several classical ciphers, but also how to write programs that encrypt and hack these ciphers.", 359 | "url":"http://inventwithpython.com/hacking/index.html", 360 | "cover":"img/hackingcyphers.png" 361 | }, 362 | { 363 | "title":"Modeling Creativity", 364 | "author":"Tom De Smedt", 365 | "authorUrl":"http://www.organisms.be/", 366 | "level":"Intermediate", 367 | "info":"Case studies in Python - using the libraries nodebox and pattern the author creates wonderful fractals and infographics; python code snippets included", 368 | "url":"http://bit.ly/modeling-creativity", 369 | "cover":"img/modelingcreativity.png" 370 | }, 371 | { 372 | "title":"Test-Driven Development with Python", 373 | "author":"Harry Percival", 374 | "authorUrl":"http://www.oreillynet.com/pub/au/5721", 375 | "level":"Intermediate", 376 | "info":"This book uses a concrete example—the development of a website, from scratch—to teach the TDD metholology, and how it applies to web programming, from the basics of database integration and javascript, going via browser-automation tools like Selenium, to advanced (and trendy) topics like NoSQL, websockets and Async programming.", 377 | "url":"http://chimera.labs.oreilly.com/books/1234000000754", 378 | "cover": "img/testdriven.jpg" 379 | }, 380 | { 381 | "title":"Getting Started with Django", 382 | "author":"Kenneth Love", 383 | "authorUrl":"http://brack3t.com/", 384 | "level":"Beginner", 385 | "info":"Getting Started with Django (or GSWD) is a series of video-based lessons meant to take you from novice to competent [1], or maybe even beyond.", 386 | "url":"http://gettingstartedwithdjango.com/", 387 | "cover": "img/cover_gettingstartedwithdjango.jpg" 388 | }, 389 | { 390 | "title":"Python 3x Programming (sample)", 391 | "author":"Jody S. Ginther", 392 | "authorUrl":"http://www.toonzcat.com/book.html", 393 | "level":"Beginner", 394 | "info":"(4 free chapters) Python 3x Programming, Made Fun and Easier by Jody S. Ginther is for the beginning programmer who wants to learn visually and have some fun while learning programming. The full course will take the beginner from ground zero to making their own arcade style game complete with; music, sound, graphics, and how to make a distribution package to share it with your friends in 21 lessons.", 395 | "url":" http://www.toonzcat.com/media/pythonfree.pdf", 396 | "cover": "img/py3programming.png" 397 | }, 398 | { 399 | "title":"Djen of Django", 400 | "author":"Agiliq", 401 | "authorUrl":"http://agiliq.com/", 402 | "level":"Intermediate", 403 | "info":"Djen of Django is a book consisting of a series of small Django projects based on small real-world examples. For instance, building a Pastebin, a Blog or a Project Management Application. Djen of Django focuses on teaching the reader Django best practices through the use of real-world examples.", 404 | "url":"http://agiliq.com/books/djenofdjango/", 405 | "cover": "img/djenofdjango.jpg" 406 | } 407 | 408 | ]} 409 | -------------------------------------------------------------------------------- /js/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "validthis": true, 3 | "laxcomma" : true, 4 | "laxbreak" : true, 5 | "browser" : true, 6 | "debug" : true, 7 | "boss" : true, 8 | "expr" : true, 9 | "asi" : true 10 | } -------------------------------------------------------------------------------- /js/ellipsis.js: -------------------------------------------------------------------------------- 1 | /*! 2 | 3 | Copyright (c) 2011 Peter van der Spek 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | 23 | */(function(a){function m(){if(!d){d=!0;for(var c in b)a(c).each(function(){var d,e;d=a(this),e=d.data("jqae"),(e.containerWidth!=d.width()||e.containerHeight!=d.height())&&f(d,b[c])});d=!1}}function l(a){b[a]&&(delete b[a],b.length||c&&(window.clearInterval(c),c=undefined))}function k(a,d){b[a]=d,c||(c=window.setInterval(function(){m()},200))}function j(){return this.nodeType===3}function i(b){if(b.contents().length){var c=b.contents(),d=c.eq(c.length-1);if(d.filter(j).length){var e=d.get(0).nodeValue;e=a.trim(e);if(e==""){d.remove();return!0}return!1}while(i(d));if(d.contents().length)return!1;d.remove();return!0}return!1}function h(a){if(a.contents().length){var b=a.contents(),c=b.eq(b.length-1);return c.filter(j).length?c:h(c)}a.append("");var b=a.contents();return b.eq(b.length-1)}function g(b){var c=h(b);if(c.length){var d=c.get(0).nodeValue,e=d.lastIndexOf(" ");e>-1?(d=a.trim(d.substring(0,e)),c.get(0).nodeValue=d):c.get(0).nodeValue="";return!0}return!1}function f(b,c){var d=b.data("jqae");d||(d={});var e=d.wrapperElement;e||(e=b.wrapInner("
").find(">div"));var f=e.data("jqae");f||(f={});var j=f.originalContent;j?e=f.originalContent.clone(!0).data("jqae",{originalContent:j}).replaceAll(e):e.data("jqae",{originalContent:e.clone(!0)}),b.data("jqae",{wrapperElement:e,containerWidth:b.width(),containerHeight:b.height()});var k=!1,l=e;c.selector&&(l=a(e.find(c.selector).get().reverse())),l.each(function(){var d=a(this),f=d.text(),j=!1;if(e.innerHeight()-d.innerHeight()>b.height()+1)d.remove();else{i(d);if(d.contents().length){k&&(h(d).get(0).nodeValue+=c.ellipsis,k=!1);while(e.innerHeight()>b.height()+1){j=g(d);if(!j){k=!0,d.remove();break}i(d);if(d.contents().length)h(d).get(0).nodeValue+=c.ellipsis;else{k=!0,d.remove();break}}c.setTitle=="onEllipsis"&&j||c.setTitle=="always"?d.attr("title",f):c.setTitle!="never"&&d.removeAttr("title")}}})}var b={},c,d=!1,e={ellipsis:"...",setTitle:"never",live:!1};a.fn.ellipsis=function(b,c){var d,g;d=a(this),typeof b!="string"&&(c=b,b=undefined),g=a.extend({},e,c),g.selector=b,d.each(function(){var b=a(this);f(b,g)}),g.live?k(d.selector,g):l(d.selector);return this}})(jQuery) -------------------------------------------------------------------------------- /js/less-1.3.0.min.js: -------------------------------------------------------------------------------- 1 | // 2 | // LESS - Leaner CSS v1.3.0 3 | // http://lesscss.org 4 | // 5 | // Copyright (c) 2009-2011, Alexis Sellier 6 | // Licensed under the Apache 2.0 License. 7 | // 8 | (function(a,b){function c(b){return a.less[b.split("/")[1]]}function l(){var a=document.getElementsByTagName("style");for(var b=0;b0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&g&&(t("saving "+e+" to cache."),g.setItem(e,a),g.setItem(e+":timestamp",c))}function q(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var g=r(),h=f?!1:d.async;typeof g.overrideMimeType=="function"&&g.overrideMimeType("text/css"),g.open("GET",a,h),g.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),g.send(null),f?g.status===0||g.status>=200&&g.status<300?c(g.responseText):e(g.status,a):h?g.onreadystatechange=function(){g.readyState==4&&i(g,c,e)}:i(g,c,e)}function r(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return t("browser doesn't support AJAX."),null}}function s(a){return a&&a.parentNode.removeChild(a)}function t(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function u(a,b){var c="less-error-message:"+o(b),e='
  • {content}
  • ',f=document.createElement("div"),g,h,i=[],j=a.filename||b;f.id=c,f.className="less-error-message",h="

    "+(a.message||"There is an error in your .less file")+"

    "+'

    in '+j+" ";var k=function(a,b,c){a.extract[b]&&i.push(e.replace(/\{line\}/,parseInt(a.line)+(b-1)).replace(/\{class\}/,c).replace(/\{content\}/,a.extract[b]))};a.stack?h+="
    "+a.stack.split("\n").slice(1).join("
    "):a.extract&&(k(a,0,""),k(a,1,"line"),k(a,2,""),h+="on line "+a.line+", column "+(a.column+1)+":

    "+""),f.innerHTML=h,p([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}typeof define=="function"&&define.amd&&define("less",[],function(){return d}),Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d>>0,c=new Array(b),d=arguments[1];for(var e=0;e>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c=b)return-1;c<0&&(c+=b);for(;cl&&(k[g]=k[g].slice(f-l),l=f)}function t(a){var c,d,e,h,i,j,n,o;if(a instanceof Function)return a.call(m.parsers);if(typeof a=="string")c=b.charAt(f)===a?a:null,e=1,s();else{s();if(c=a.exec(k[g]))e=c[0].length;else return null}if(c){o=f+=e,j=f+k[g].length-e;while(f=0&&b.charAt(c)!=="\n";c--)d++;return{line:typeof a=="number"?(b.slice(0,a).match(/\n/g)||"").length:null,column:d}}function A(a,b){var c=y(a,b),d=z(a.index,c),e=d.line,f=d.column,g=c.split("\n");this.type=a.type||"Syntax",this.message=a.message,this.filename=a.filename||b.filename,this.index=a.index,this.line=typeof e=="number"?e+1:null,this.callLine=a.call&&z(a.call,c).line+1,this.callExtract=g[z(a.call,c).line],this.stack=a.stack,this.column=f,this.extract=[g[e-1],g[e],g[e+1]]}var b,f,g,h,i,j,k,l,m,n=this,o=function(){},p=this.imports={paths:a&&a.paths||[],queue:[],files:{},contents:{},mime:a&&a.mime,error:null,push:function(b,c){var e=this;this.queue.push(b),d.Parser.importer(b,this.paths,function(a,d,f){e.queue.splice(e.queue.indexOf(b),1),e.files[b]=d,e.contents[b]=f,a&&!e.error&&(e.error=a),c(a,d),e.queue.length===0&&o()},a)}};return this.env=a=a||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,m={imports:p,parse:function(h,i){var n,p,q,r,s,u,v=[],w,x=null;f=g=l=j=0,b=h.replace(/\r\n/g,"\n"),k=function(c){var d=0,e=/[^"'`\{\}\/\(\)\\]+/g,f=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,g=/"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`\\\r\n]|\\.)*)`/g,h=0,i,j=c[0],k;for(var l=0,m,n;l0&&(x=new A({index:l,type:"Parse",message:"missing closing `}`",filename:a.filename},a)),c.map(function(a){return a.join("")})}([[]]);if(x)return i(x);try{n=new e.Ruleset([],t(this.parsers.primary)),n.root=!0}catch(y){return i(new A(y,a))}n.toCSS=function(b){var f,g,h;return function(f,g){var h=[],i;f=f||{},typeof g=="object"&&!Array.isArray(g)&&(g=Object.keys(g).map(function(a){var b=g[a];return b instanceof e.Value||(b instanceof e.Expression||(b=new e.Expression([b])),b=new e.Value([b])),new e.Rule("@"+a,b,!1,0)}),h=[new e.Ruleset(null,g)]);try{var j=b.call(this,{frames:h}).toCSS([],{compress:f.compress||!1})}catch(k){throw new A(k,a)}if(i=m.imports.error)throw i instanceof A?i:new A(i,a);return f.yuicompress&&d.mode==="node"?c("./cssmin").compressor.cssmin(j):f.compress?j.replace(/(\s)+/g,"$1"):j}}(n.eval);if(f=0&&b.charAt(z)!=="\n";z--)B++;x={type:"Parse",message:"Syntax Error on line "+s,index:f,filename:a.filename,line:s,column:B,extract:[u[s-2],u[s-1],u[s]]}}this.imports.queue.length>0?o=function(){i(x,n)}:i(x,n)},parsers:{primary:function(){var a,b=[];while((a=t(this.mixin.definition)||t(this.rule)||t(this.ruleset)||t(this.mixin.call)||t(this.comment)||t(this.directive))||t(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(b.charAt(f)!=="/")return;if(b.charAt(f+1)==="/")return new e.Comment(t(/^\/\/.*/),!0);if(a=t(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new e.Comment(a)},entities:{quoted:function(){var a,c=f,d;b.charAt(c)==="~"&&(c++,d=!0);if(b.charAt(c)!=='"'&&b.charAt(c)!=="'")return;d&&t("~");if(a=t(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new e.Quoted(a[0],a[1]||a[2],d)},keyword:function(){var a;if(a=t(/^[_A-Za-z-][_A-Za-z0-9-]*/))return e.colors.hasOwnProperty(a)?new e.Color(e.colors[a].slice(1)):new e.Keyword(a)},call:function(){var b,c,d=f;if(!(b=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(k[g])))return;b=b[1].toLowerCase();if(b==="url")return null;f+=b.length;if(b==="alpha")return t(this.alpha);t("("),c=t(this.entities.arguments);if(!t(")"))return;if(b)return new e.Call(b,c,d,a.filename)},arguments:function(){var a=[],b;while(b=t(this.entities.assignment)||t(this.expression)){a.push(b);if(!t(","))break}return a},literal:function(){return t(this.entities.dimension)||t(this.entities.color)||t(this.entities.quoted)},assignment:function(){var a,b;if((a=t(/^\w+(?=\s?=)/i))&&t("=")&&(b=t(this.entity)))return new e.Assignment(a,b)},url:function(){var a;if(b.charAt(f)!=="u"||!t(/^url\(/))return;return a=t(this.entities.quoted)||t(this.entities.variable)||t(this.entities.dataURI)||t(/^[-\w%@$\/.&=:;#+?~]+/)||"",u(")"),new e.URL(a.value||a.data||a instanceof e.Variable?a:new e.Anonymous(a),p.paths)},dataURI:function(){var a;if(t(/^data:/)){a={},a.mime=t(/^[^\/]+\/[^,;)]+/)||"",a.charset=t(/^;\s*charset=[^,;)]+/)||"",a.base64=t(/^;\s*base64/)||"",a.data=t(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var c,d=f;if(b.charAt(f)==="@"&&(c=t(/^@@?[\w-]+/)))return new e.Variable(c,d,a.filename)},color:function(){var a;if(b.charAt(f)==="#"&&(a=t(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new e.Color(a[1])},dimension:function(){var a,c=b.charCodeAt(f);if(c>57||c<45||c===47)return;if(a=t(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new e.Dimension(a[1],a[2])},javascript:function(){var a,c=f,d;b.charAt(c)==="~"&&(c++,d=!0);if(b.charAt(c)!=="`")return;d&&t("~");if(a=t(/^`([^`]*)`/))return new e.JavaScript(a[1],f,d)}},variable:function(){var a;if(b.charAt(f)==="@"&&(a=t(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!w(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=t(this.entity))&&t("/")&&(b=t(this.entity)))return new e.Shorthand(a,b)},mixin:{call:function(){var c=[],d,g,h,i=f,j=b.charAt(f),k=!1;if(j!=="."&&j!=="#")return;while(d=t(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))c.push(new e.Element(g,d,f)),g=t(">");t("(")&&(h=t(this.entities.arguments))&&t(")"),t(this.important)&&(k=!0);if(c.length>0&&(t(";")||w("}")))return new e.mixin.Call(c,h||[],i,a.filename,k)},definition:function(){var a,c=[],d,g,h,i,j,k=!1;if(b.charAt(f)!=="."&&b.charAt(f)!=="#"||w(/^[^{]*(;|})/))return;q();if(d=t(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=d[1];do{if(b.charAt(f)==="."&&t(/^\.{3}/)){k=!0;break}if(!(h=t(this.entities.variable)||t(this.entities.literal)||t(this.entities.keyword)))break;if(h instanceof e.Variable)if(t(":"))i=u(this.expression,"expected expression"),c.push({name:h.name,value:i});else{if(t(/^\.{3}/)){c.push({name:h.name,variadic:!0}),k=!0;break}c.push({name:h.name})}else c.push({value:h})}while(t(","));u(")"),t(/^when/)&&(j=u(this.conditions,"expected condition")),g=t(this.block);if(g)return new e.mixin.Definition(a,c,g,j,k);r()}}},entity:function(){return t(this.entities.literal)||t(this.entities.variable)||t(this.entities.url)||t(this.entities.call)||t(this.entities.keyword)||t(this.entities.javascript)||t(this.comment)},end:function(){return t(";")||w("}")},alpha:function(){var a;if(!t(/^\(opacity=/i))return;if(a=t(/^\d+/)||t(this.entities.variable))return u(")"),new e.Alpha(a)},element:function(){var a,b,c,d;c=t(this.combinator),a=t(/^(?:\d+\.\d+|\d+)%/)||t(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||t("*")||t(this.attribute)||t(/^\([^)@]+\)/),a||t("(")&&(d=t(this.entities.variable))&&t(")")&&(a=new e.Paren(d));if(a)return new e.Element(c,a,f);if(c.value&&c.value.charAt(0)==="&")return new e.Element(c,null,f)},combinator:function(){var a,c=b.charAt(f);if(c===">"||c==="+"||c==="~"){f++;while(b.charAt(f)===" ")f++;return new e.Combinator(c)}if(c==="&"){a="&",f++,b.charAt(f)===" "&&(a="& ");while(b.charAt(f)===" ")f++;return new e.Combinator(a)}return b.charAt(f-1)===" "?new e.Combinator(" "):new e.Combinator(null)},selector:function(){var a,c,d=[],g,h;if(t("("))return a=t(this.entity),u(")"),new e.Selector([new e.Element("",a,f)]);while(c=t(this.element)){g=b.charAt(f),d.push(c);if(g==="{"||g==="}"||g===";"||g===",")break}if(d.length>0)return new e.Selector(d)},tag:function(){return t(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||t("*")},attribute:function(){var a="",b,c,d;if(!t("["))return;if(b=t(/^[a-zA-Z-]+/)||t(this.entities.quoted))(d=t(/^[|~*$^]?=/))&&(c=t(this.entities.quoted)||t(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!t("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(t("{")&&(a=t(this.primary))&&t("}"))return a},ruleset:function(){var b=[],c,d,g;q();while(c=t(this.selector)){b.push(c),t(this.comment);if(!t(","))break;t(this.comment)}if(b.length>0&&(d=t(this.block)))return new e.Ruleset(b,d,a.strictImports);j=f,r()},rule:function(){var a,c,d=b.charAt(f),h,l;q();if(d==="."||d==="#"||d==="&")return;if(a=t(this.variable)||t(this.property)){a.charAt(0)!="@"&&(l=/^([^@+\/'"*`(;{}-]*);/.exec(k[g]))?(f+=l[0].length-1,c=new e.Anonymous(l[1])):a==="font"?c=t(this.font):c=t(this.value),h=t(this.important);if(c&&t(this.end))return new e.Rule(a,c,h,i);j=f,r()}},"import":function(){var a,b,c=f;if(t(/^@import\s+/)&&(a=t(this.entities.quoted)||t(this.entities.url))){b=t(this.mediaFeatures);if(t(";"))return new e.Import(a,p,b,c)}},mediaFeature:function(){var a,b,c=[];do if(a=t(this.entities.keyword))c.push(a);else if(t("(")){b=t(this.property),a=t(this.entity);if(!t(")"))return null;if(b&&a)c.push(new e.Paren(new e.Rule(b,a,null,f,!0)));else if(a)c.push(new e.Paren(a));else return null}while(a);if(c.length>0)return new e.Expression(c)},mediaFeatures:function(){var a,b=[];do if(a=t(this.mediaFeature)){b.push(a);if(!t(","))break}else if(a=t(this.entities.variable)){b.push(a);if(!t(","))break}while(a);return b.length>0?b:null},media:function(){var a,b;if(t(/^@media/)){a=t(this.mediaFeatures);if(b=t(this.block))return new e.Media(b,a)}},directive:function(){var a,c,d,g,h,i;if(b.charAt(f)!=="@")return;if(c=t(this["import"])||t(this.media))return c;if(a=t(/^@page|@keyframes/)||t(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)){g=(t(/^[^{]+/)||"").trim();if(d=t(this.block))return new e.Directive(a+" "+g,d)}else if(a=t(/^@[-a-z]+/))if(a==="@font-face"){if(d=t(this.block))return new e.Directive(a,d)}else if((c=t(this.entity))&&t(";"))return new e.Directive(a,c)},font:function(){var a=[],b=[],c,d,f,g;while(g=t(this.shorthand)||t(this.entity))b.push(g);a.push(new e.Expression(b));if(t(","))while(g=t(this.expression)){a.push(g);if(!t(","))break}return new e.Value(a)},value:function(){var a,b=[],c;while(a=t(this.expression)){b.push(a);if(!t(","))break}if(b.length>0)return new e.Value(b)},important:function(){if(b.charAt(f)==="!")return t(/^! *important/)},sub:function(){var a;if(t("(")&&(a=t(this.expression))&&t(")"))return a},multiplication:function(){var a,b,c,d;if(a=t(this.operand)){while(!w(/^\/\*/)&&(c=t("/")||t("*"))&&(b=t(this.operand)))d=new e.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,c,d,g;if(a=t(this.multiplication)){while((d=t(/^[-+]\s+/)||b.charAt(f-1)!=" "&&(t("+")||t("-")))&&(c=t(this.multiplication)))g=new e.Operation(d,[g||a,c]);return g||a}},conditions:function(){var a,b,c=f,d;if(a=t(this.condition)){while(t(",")&&(b=t(this.condition)))d=new e.Condition("or",d||a,b,c);return d||a}},condition:function(){var a,b,c,d,g=f,h=!1;t(/^not/)&&(h=!0),u("(");if(a=t(this.addition)||t(this.entities.keyword)||t(this.entities.quoted))return(d=t(/^(?:>=|=<|[<=>])/))?(b=t(this.addition)||t(this.entities.keyword)||t(this.entities.quoted))?c=new e.Condition(d,a,b,g,h):v("expected expression"):c=new e.Condition("=",a,new e.Keyword("true"),g,h),u(")"),t(/^and/)?new e.Condition("and",c,t(this.condition)):c},operand:function(){var a,c=b.charAt(f+1);b.charAt(f)==="-"&&(c==="@"||c==="(")&&(a=t("-"));var d=t(this.sub)||t(this.entities.dimension)||t(this.entities.color)||t(this.entities.variable)||t(this.entities.call);return a?new e.Operation("*",[new e.Dimension(-1),d]):d},expression:function(){var a,b,c=[],d;while(a=t(this.addition)||t(this.entity))c.push(a);if(c.length>0)return new e.Expression(c)},property:function(){var a;if(a=t(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){!/^([a-z]+:)?\//.test(a)&&b.length>0&&(a=b[0]+a),n({href:a,title:a,type:d.mime},function(e){e&&typeof d.errback=="function"?d.errback.call(null,a,b,c,d):c.apply(null,arguments)},!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Condition=function(a,b,c,d,e){this.op=a.trim(),this.lvalue=b,this.rvalue=c,this.index=d,this.negate=e},a.Condition.prototype.eval=function(a){var b=this.lvalue.eval(a),c=this.rvalue.eval(a),d=this.index,e,e=function(a){switch(a){case"and":return b&&c;case"or":return b||c;default:if(b.compare)e=b.compare(c);else if(c.compare)e=c.compare(b);else throw{type:"Type",message:"Unable to perform comparison",index:d};switch(e){case-1:return a==="<"||a==="=<";case 0:return a==="="||a===">="||a==="=<";case 1:return a===">"||a===">="}}}(this.op);return this.negate?!e:e}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)},compare:function(b){return b instanceof a.Dimension?b.value>this.value?-1:b.value":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS?b.toCSS(a):""}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c,d,e){var f=this;this.index=e,this._path=b,this.features=d&&new a.Value(d),b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(b,c){b&&(b.index=e),f.root=c||new a.Ruleset([],[])})},a.Import.prototype={toCSS:function(a){var b=this.features?" "+this.features.toCSS(a):"";return this.css?"@import "+this._path.toCSS()+b+";\n":""},eval:function(b){var c,d=this.features&&this.features.eval(b);if(this.css)return this;c=new a.Ruleset([],this.root.rules.slice(0));for(var e=0;e1){var d=new a.Element("&",null,0),e=[new a.Selector([d])];c=new a.Ruleset(e,b.mediaBlocks),c.multiMedia=!0}return delete b.mediaBlocks,delete b.mediaPath,c},evalNested:function(b){var c,d,e=b.mediaPath.concat([this]);for(c=0;c0;c--)b.splice(c,0,new a.Anonymous("and"));return new a.Expression(b)})),new a.Ruleset([],[])},permute:function(a){if(a.length===0)return[];if(a.length===1)return a[0];var b=[],c=this.permute(a.slice(1));for(var d=0;d0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;gthis.params.length)return!1;if(this.required>0&&c>this.params.length)return!1}if(this.condition&&!this.condition.eval({frames:[this.evalParams(b,a)].concat(b.frames)}))return!1;d=Math.min(c,this.arity);for(var f=0;fe.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":",\n"),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l0&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b,c){this.name=a,this.index=b,this.file=c},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{type:"Name",message:"variable "+e+" is undefined",filename:this.file,index:this.index}}}}(c("../tree")),function(a){a.find=function(a,b){for(var c=0,d;c1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)}}(c("./tree"));var f=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||f?"development":"production"),d.async=!1,d.poll=d.poll||(f?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&m(function(a,b,c,d,e){b&&p(b.toCSS(),d,e.lastModified)})},d.poll)):d.optimization=3;var g;try{g=typeof a.localStorage=="undefined"?null:a.localStorage}catch(h){g=null}var i=document.getElementsByTagName("link"),j=/^text\/(x-)?less$/;d.sheets=[];for(var k=0;k 15 | } 16 | }(function () { 17 | var exports = {}; 18 | 19 | exports.name = "mustache.js"; 20 | exports.version = "0.5.1-dev"; 21 | exports.tags = ["{{", "}}"]; 22 | 23 | exports.parse = parse; 24 | exports.clearCache = clearCache; 25 | exports.compile = compile; 26 | exports.compilePartial = compilePartial; 27 | exports.render = render; 28 | 29 | exports.Scanner = Scanner; 30 | exports.Context = Context; 31 | exports.Renderer = Renderer; 32 | 33 | // This is here for backwards compatibility with 0.4.x. 34 | exports.to_html = function (template, view, partials, send) { 35 | var result = render(template, view, partials); 36 | 37 | if (typeof send === "function") { 38 | send(result); 39 | } else { 40 | return result; 41 | } 42 | }; 43 | 44 | var whiteRe = /\s*/; 45 | var spaceRe = /\s+/; 46 | var nonSpaceRe = /\S/; 47 | var eqRe = /\s*=/; 48 | var curlyRe = /\s*\}/; 49 | var tagRe = /#|\^|\/|>|\{|&|=|!/; 50 | 51 | // Workaround for https://issues.apache.org/jira/browse/COUCHDB-577 52 | // See https://github.com/janl/mustache.js/issues/189 53 | function testRe(re, string) { 54 | return RegExp.prototype.test.call(re, string); 55 | } 56 | 57 | function isWhitespace(string) { 58 | return !testRe(nonSpaceRe, string); 59 | } 60 | 61 | var isArray = Array.isArray || function (obj) { 62 | return Object.prototype.toString.call(obj) === "[object Array]"; 63 | }; 64 | 65 | // OSWASP Guidelines: escape all non alphanumeric characters in ASCII space. 66 | var jsCharsRe = /[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\xFF\u2028\u2029]/gm; 67 | 68 | function quote(text) { 69 | var escaped = text.replace(jsCharsRe, function (c) { 70 | return "\\u" + ('0000' + c.charCodeAt(0).toString(16)).slice(-4); 71 | }); 72 | 73 | return '"' + escaped + '"'; 74 | } 75 | 76 | function escapeRe(string) { 77 | return string.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); 78 | } 79 | 80 | var entityMap = { 81 | "&": "&", 82 | "<": "<", 83 | ">": ">", 84 | '"': '"', 85 | "'": ''', 86 | "/": '/' 87 | }; 88 | 89 | function escapeHtml(string) { 90 | return String(string).replace(/[&<>"'\/]/g, function (s) { 91 | return entityMap[s]; 92 | }); 93 | } 94 | 95 | // Export these utility functions. 96 | exports.isWhitespace = isWhitespace; 97 | exports.isArray = isArray; 98 | exports.quote = quote; 99 | exports.escapeRe = escapeRe; 100 | exports.escapeHtml = escapeHtml; 101 | 102 | function Scanner(string) { 103 | this.string = string; 104 | this.tail = string; 105 | this.pos = 0; 106 | } 107 | 108 | /** 109 | * Returns `true` if the tail is empty (end of string). 110 | */ 111 | Scanner.prototype.eos = function () { 112 | return this.tail === ""; 113 | }; 114 | 115 | /** 116 | * Tries to match the given regular expression at the current position. 117 | * Returns the matched text if it can match, `null` otherwise. 118 | */ 119 | Scanner.prototype.scan = function (re) { 120 | var match = this.tail.match(re); 121 | 122 | if (match && match.index === 0) { 123 | this.tail = this.tail.substring(match[0].length); 124 | this.pos += match[0].length; 125 | return match[0]; 126 | } 127 | 128 | return null; 129 | }; 130 | 131 | /** 132 | * Skips all text until the given regular expression can be matched. Returns 133 | * the skipped string, which is the entire tail of this scanner if no match 134 | * can be made. 135 | */ 136 | Scanner.prototype.scanUntil = function (re) { 137 | var match, pos = this.tail.search(re); 138 | 139 | switch (pos) { 140 | case -1: 141 | match = this.tail; 142 | this.pos += this.tail.length; 143 | this.tail = ""; 144 | break; 145 | case 0: 146 | match = null; 147 | break; 148 | default: 149 | match = this.tail.substring(0, pos); 150 | this.tail = this.tail.substring(pos); 151 | this.pos += pos; 152 | } 153 | 154 | return match; 155 | }; 156 | 157 | function Context(view, parent) { 158 | this.view = view; 159 | this.parent = parent; 160 | this.clearCache(); 161 | } 162 | 163 | Context.make = function (view) { 164 | return (view instanceof Context) ? view : new Context(view); 165 | }; 166 | 167 | Context.prototype.clearCache = function () { 168 | this._cache = {}; 169 | }; 170 | 171 | Context.prototype.push = function (view) { 172 | return new Context(view, this); 173 | }; 174 | 175 | Context.prototype.lookup = function (name) { 176 | var value = this._cache[name]; 177 | 178 | if (!value) { 179 | if (name === ".") { 180 | value = this.view; 181 | } else { 182 | var context = this; 183 | 184 | while (context) { 185 | if (name.indexOf(".") > 0) { 186 | var names = name.split("."), i = 0; 187 | 188 | value = context.view; 189 | 190 | while (value && i < names.length) { 191 | value = value[names[i++]]; 192 | } 193 | } else { 194 | value = context.view[name]; 195 | } 196 | 197 | if (value != null) { 198 | break; 199 | } 200 | 201 | context = context.parent; 202 | } 203 | } 204 | 205 | this._cache[name] = value; 206 | } 207 | 208 | if (typeof value === "function") { 209 | value = value.call(this.view); 210 | } 211 | 212 | return value; 213 | }; 214 | 215 | function Renderer() { 216 | this.clearCache(); 217 | } 218 | 219 | Renderer.prototype.clearCache = function () { 220 | this._cache = {}; 221 | this._partialCache = {}; 222 | }; 223 | 224 | Renderer.prototype.compile = function (tokens, tags) { 225 | if (typeof tokens === "string") { 226 | tokens = parse(tokens, tags); 227 | } 228 | 229 | var fn = compileTokens(tokens), 230 | self = this; 231 | 232 | return function (view) { 233 | return fn(Context.make(view), self); 234 | }; 235 | }; 236 | 237 | Renderer.prototype.compilePartial = function (name, tokens, tags) { 238 | this._partialCache[name] = this.compile(tokens, tags); 239 | return this._partialCache[name]; 240 | }; 241 | 242 | Renderer.prototype.render = function (template, view) { 243 | var fn = this._cache[template]; 244 | 245 | if (!fn) { 246 | fn = this.compile(template); 247 | this._cache[template] = fn; 248 | } 249 | 250 | return fn(view); 251 | }; 252 | 253 | Renderer.prototype._section = function (name, context, callback) { 254 | var value = context.lookup(name); 255 | 256 | switch (typeof value) { 257 | case "object": 258 | if (isArray(value)) { 259 | var buffer = ""; 260 | 261 | for (var i = 0, len = value.length; i < len; ++i) { 262 | buffer += callback(context.push(value[i]), this); 263 | } 264 | 265 | return buffer; 266 | } 267 | 268 | return value ? callback(context.push(value), this) : ""; 269 | case "function": 270 | // TODO: The text should be passed to the callback plain, not rendered. 271 | var sectionText = callback(context, this), 272 | self = this; 273 | 274 | var scopedRender = function (template) { 275 | return self.render(template, context); 276 | }; 277 | 278 | return value.call(context.view, sectionText, scopedRender) || ""; 279 | default: 280 | if (value) { 281 | return callback(context, this); 282 | } 283 | } 284 | 285 | return ""; 286 | }; 287 | 288 | Renderer.prototype._inverted = function (name, context, callback) { 289 | var value = context.lookup(name); 290 | 291 | // From the spec: inverted sections may render text once based on the 292 | // inverse value of the key. That is, they will be rendered if the key 293 | // doesn't exist, is false, or is an empty list. 294 | if (value == null || value === false || (isArray(value) && value.length === 0)) { 295 | return callback(context, this); 296 | } 297 | 298 | return ""; 299 | }; 300 | 301 | Renderer.prototype._partial = function (name, context) { 302 | var fn = this._partialCache[name]; 303 | 304 | if (fn) { 305 | return fn(context, this); 306 | } 307 | 308 | return ""; 309 | }; 310 | 311 | Renderer.prototype._name = function (name, context, escape) { 312 | var value = context.lookup(name); 313 | 314 | if (typeof value === "function") { 315 | value = value.call(context.view); 316 | } 317 | 318 | var string = (value == null) ? "" : String(value); 319 | 320 | if (escape) { 321 | return escapeHtml(string); 322 | } 323 | 324 | return string; 325 | }; 326 | 327 | /** 328 | * Low-level function that compiles the given `tokens` into a 329 | * function that accepts two arguments: a Context and a 330 | * Renderer. Returns the body of the function as a string if 331 | * `returnBody` is true. 332 | */ 333 | function compileTokens(tokens, returnBody) { 334 | var body = ['""']; 335 | var token, method, escape; 336 | 337 | for (var i = 0, len = tokens.length; i < len; ++i) { 338 | token = tokens[i]; 339 | 340 | switch (token.type) { 341 | case "#": 342 | case "^": 343 | method = (token.type === "#") ? "_section" : "_inverted"; 344 | body.push("r." + method + "(" + quote(token.value) + ", c, function (c, r) {\n" + 345 | " " + compileTokens(token.tokens, true) + "\n" + 346 | "})"); 347 | break; 348 | case "{": 349 | case "&": 350 | case "name": 351 | escape = token.type === "name" ? "true" : "false"; 352 | body.push("r._name(" + quote(token.value) + ", c, " + escape + ")"); 353 | break; 354 | case ">": 355 | body.push("r._partial(" + quote(token.value) + ", c)"); 356 | break; 357 | case "text": 358 | body.push(quote(token.value)); 359 | break; 360 | } 361 | } 362 | 363 | // Convert to a string body. 364 | body = "return " + body.join(" + ") + ";"; 365 | 366 | // Good for debugging. 367 | // console.log(body); 368 | 369 | if (returnBody) { 370 | return body; 371 | } 372 | 373 | // For great evil! 374 | return new Function("c, r", body); 375 | } 376 | 377 | function escapeTags(tags) { 378 | if (tags.length === 2) { 379 | return [ 380 | new RegExp(escapeRe(tags[0]) + "\\s*"), 381 | new RegExp("\\s*" + escapeRe(tags[1])) 382 | ]; 383 | } 384 | 385 | throw new Error("Invalid tags: " + tags.join(" ")); 386 | } 387 | 388 | /** 389 | * Forms the given linear array of `tokens` into a nested tree structure 390 | * where tokens that represent a section have a "tokens" array property 391 | * that contains all tokens that are in that section. 392 | */ 393 | function nestTokens(tokens) { 394 | var tree = []; 395 | var collector = tree; 396 | var sections = []; 397 | var token, section; 398 | 399 | for (var i = 0; i < tokens.length; ++i) { 400 | token = tokens[i]; 401 | 402 | switch (token.type) { 403 | case "#": 404 | case "^": 405 | token.tokens = []; 406 | sections.push(token); 407 | collector.push(token); 408 | collector = token.tokens; 409 | break; 410 | case "/": 411 | if (sections.length === 0) { 412 | throw new Error("Unopened section: " + token.value); 413 | } 414 | 415 | section = sections.pop(); 416 | 417 | if (section.value !== token.value) { 418 | throw new Error("Unclosed section: " + section.value); 419 | } 420 | 421 | if (sections.length > 0) { 422 | collector = sections[sections.length - 1].tokens; 423 | } else { 424 | collector = tree; 425 | } 426 | break; 427 | default: 428 | collector.push(token); 429 | } 430 | } 431 | 432 | // Make sure there were no open sections when we're done. 433 | section = sections.pop(); 434 | 435 | if (section) { 436 | throw new Error("Unclosed section: " + section.value); 437 | } 438 | 439 | return tree; 440 | } 441 | 442 | /** 443 | * Combines the values of consecutive text tokens in the given `tokens` array 444 | * to a single token. 445 | */ 446 | function squashTokens(tokens) { 447 | var lastToken; 448 | 449 | for (var i = 0; i < tokens.length; ++i) { 450 | var token = tokens[i]; 451 | 452 | if (lastToken && lastToken.type === "text" && token.type === "text") { 453 | lastToken.value += token.value; 454 | tokens.splice(i--, 1); // Remove this token from the array. 455 | } else { 456 | lastToken = token; 457 | } 458 | } 459 | } 460 | 461 | /** 462 | * Breaks up the given `template` string into a tree of token objects. If 463 | * `tags` is given here it must be an array with two string values: the 464 | * opening and closing tags used in the template (e.g. ["<%", "%>"]). Of 465 | * course, the default is to use mustaches (i.e. Mustache.tags). 466 | */ 467 | function parse(template, tags) { 468 | tags = tags || exports.tags; 469 | 470 | var tagRes = escapeTags(tags); 471 | var scanner = new Scanner(template); 472 | 473 | var tokens = [], // Buffer to hold the tokens 474 | spaces = [], // Indices of whitespace tokens on the current line 475 | hasTag = false, // Is there a {{tag}} on the current line? 476 | nonSpace = false; // Is there a non-space char on the current line? 477 | 478 | // Strips all whitespace tokens array for the current line 479 | // if there was a {{#tag}} on it and otherwise only space. 480 | var stripSpace = function () { 481 | if (hasTag && !nonSpace) { 482 | while (spaces.length) { 483 | tokens.splice(spaces.pop(), 1); 484 | } 485 | } else { 486 | spaces = []; 487 | } 488 | 489 | hasTag = false; 490 | nonSpace = false; 491 | }; 492 | 493 | var type, value, chr; 494 | 495 | while (!scanner.eos()) { 496 | value = scanner.scanUntil(tagRes[0]); 497 | 498 | if (value) { 499 | for (var i = 0, len = value.length; i < len; ++i) { 500 | chr = value.charAt(i); 501 | 502 | if (isWhitespace(chr)) { 503 | spaces.push(tokens.length); 504 | } else { 505 | nonSpace = true; 506 | } 507 | 508 | tokens.push({type: "text", value: chr}); 509 | 510 | if (chr === "\n") { 511 | stripSpace(); // Check for whitespace on the current line. 512 | } 513 | } 514 | } 515 | 516 | // Match the opening tag. 517 | if (!scanner.scan(tagRes[0])) { 518 | break; 519 | } 520 | 521 | hasTag = true; 522 | type = scanner.scan(tagRe) || "name"; 523 | 524 | // Skip any whitespace between tag and value. 525 | scanner.scan(whiteRe); 526 | 527 | // Extract the tag value. 528 | if (type === "=") { 529 | value = scanner.scanUntil(eqRe); 530 | scanner.scan(eqRe); 531 | scanner.scanUntil(tagRes[1]); 532 | } else if (type === "{") { 533 | var closeRe = new RegExp("\\s*" + escapeRe("}" + tags[1])); 534 | value = scanner.scanUntil(closeRe); 535 | scanner.scan(curlyRe); 536 | scanner.scanUntil(tagRes[1]); 537 | } else { 538 | value = scanner.scanUntil(tagRes[1]); 539 | } 540 | 541 | // Match the closing tag. 542 | if (!scanner.scan(tagRes[1])) { 543 | throw new Error("Unclosed tag at " + scanner.pos); 544 | } 545 | 546 | tokens.push({type: type, value: value}); 547 | 548 | if (type === "name" || type === "{" || type === "&") { 549 | nonSpace = true; 550 | } 551 | 552 | // Set the tags for the next time around. 553 | if (type === "=") { 554 | tags = value.split(spaceRe); 555 | tagRes = escapeTags(tags); 556 | } 557 | } 558 | 559 | squashTokens(tokens); 560 | 561 | return nestTokens(tokens); 562 | } 563 | 564 | // The high-level clearCache, compile, compilePartial, and render functions 565 | // use this default renderer. 566 | var _renderer = new Renderer(); 567 | 568 | /** 569 | * Clears all cached templates and partials. 570 | */ 571 | function clearCache() { 572 | _renderer.clearCache(); 573 | } 574 | 575 | /** 576 | * High-level API for compiling the given `tokens` down to a reusable 577 | * function. If `tokens` is a string it will be parsed using the given `tags` 578 | * before it is compiled. 579 | */ 580 | function compile(tokens, tags) { 581 | return _renderer.compile(tokens, tags); 582 | } 583 | 584 | /** 585 | * High-level API for compiling the `tokens` for the partial with the given 586 | * `name` down to a reusable function. If `tokens` is a string it will be 587 | * parsed using the given `tags` before it is compiled. 588 | */ 589 | function compilePartial(name, tokens, tags) { 590 | return _renderer.compilePartial(name, tokens, tags); 591 | } 592 | 593 | /** 594 | * High-level API for rendering the `template` using the given `view`. The 595 | * optional `partials` object may be given here for convenience, but note that 596 | * it will cause all partials to be re-compiled, thus hurting performance. Of 597 | * course, this only matters if you're going to render the same template more 598 | * than once. If so, it is best to call `compilePartial` before calling this 599 | * function and to leave the `partials` argument blank. 600 | */ 601 | function render(template, view, partials) { 602 | if (partials) { 603 | for (var name in partials) { 604 | compilePartial(name, partials[name]); 605 | } 606 | } 607 | 608 | return _renderer.render(template, view); 609 | } 610 | 611 | return exports; 612 | 613 | }())); --------------------------------------------------------------------------------