├── Procfile ├── README.md ├── app ├── __init__.py ├── constants.py ├── facebook │ ├── __init__.py │ ├── constants.py │ ├── forms.py │ ├── models.py │ └── views.py ├── feed │ ├── __init__.py │ ├── constants.py │ ├── forms.py │ ├── models.py │ └── views.py ├── rss_reader │ ├── __init__.py │ └── parser.py ├── static │ ├── css │ │ ├── Bootstrap │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── CHANGELOG.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── component.json │ │ │ ├── composer.json │ │ │ ├── docs │ │ │ │ ├── assets │ │ │ │ │ ├── css │ │ │ │ │ │ ├── bootstrap-responsive.css │ │ │ │ │ │ ├── bootstrap.css │ │ │ │ │ │ └── docs.css │ │ │ │ │ ├── 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 │ │ │ │ │ │ └── favicon.png │ │ │ │ │ ├── img │ │ │ │ │ │ ├── bootstrap-docs-readme.png │ │ │ │ │ │ ├── bootstrap-mdo-sfmoma-01.jpg │ │ │ │ │ │ ├── bootstrap-mdo-sfmoma-02.jpg │ │ │ │ │ │ ├── bootstrap-mdo-sfmoma-03.jpg │ │ │ │ │ │ ├── bs-docs-bootstrap-features.png │ │ │ │ │ │ ├── bs-docs-masthead-pattern.png │ │ │ │ │ │ ├── bs-docs-responsive-illustrations.png │ │ │ │ │ │ ├── bs-docs-twitter-github.png │ │ │ │ │ │ ├── example-sites │ │ │ │ │ │ │ ├── 8020select.png │ │ │ │ │ │ │ ├── adoptahydrant.png │ │ │ │ │ │ │ ├── breakingnews.png │ │ │ │ │ │ │ ├── fleetio.png │ │ │ │ │ │ │ ├── gathercontent.png │ │ │ │ │ │ │ ├── jshint.png │ │ │ │ │ │ │ ├── kippt.png │ │ │ │ │ │ │ └── soundready.png │ │ │ │ │ │ ├── examples │ │ │ │ │ │ │ ├── bootstrap-example-carousel.png │ │ │ │ │ │ │ ├── bootstrap-example-fluid.png │ │ │ │ │ │ │ ├── bootstrap-example-justified-nav.png │ │ │ │ │ │ │ ├── bootstrap-example-marketing-narrow.png │ │ │ │ │ │ │ ├── bootstrap-example-marketing.png │ │ │ │ │ │ │ ├── bootstrap-example-signin.png │ │ │ │ │ │ │ ├── bootstrap-example-starter.png │ │ │ │ │ │ │ ├── bootstrap-example-sticky-footer.png │ │ │ │ │ │ │ ├── browser-icon-chrome.png │ │ │ │ │ │ │ ├── browser-icon-firefox.png │ │ │ │ │ │ │ ├── browser-icon-safari.png │ │ │ │ │ │ │ ├── slide-01.jpg │ │ │ │ │ │ │ ├── slide-02.jpg │ │ │ │ │ │ │ └── slide-03.jpg │ │ │ │ │ │ ├── glyphicons-halflings-white.png │ │ │ │ │ │ ├── glyphicons-halflings.png │ │ │ │ │ │ ├── grid-baseline-20px.png │ │ │ │ │ │ ├── less-logo-large.png │ │ │ │ │ │ └── responsive-illustrations.png │ │ │ │ │ └── js │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── application.js │ │ │ │ │ │ ├── bootstrap-affix.js │ │ │ │ │ │ ├── bootstrap-alert.js │ │ │ │ │ │ ├── bootstrap-button.js │ │ │ │ │ │ ├── bootstrap-carousel.js │ │ │ │ │ │ ├── bootstrap-collapse.js │ │ │ │ │ │ ├── bootstrap-dropdown.js │ │ │ │ │ │ ├── bootstrap-modal.js │ │ │ │ │ │ ├── bootstrap-popover.js │ │ │ │ │ │ ├── bootstrap-scrollspy.js │ │ │ │ │ │ ├── bootstrap-tab.js │ │ │ │ │ │ ├── bootstrap-tooltip.js │ │ │ │ │ │ ├── bootstrap-transition.js │ │ │ │ │ │ ├── bootstrap-typeahead.js │ │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ │ ├── bootstrap.min.js │ │ │ │ │ │ ├── google-code-prettify │ │ │ │ │ │ ├── prettify.css │ │ │ │ │ │ └── prettify.js │ │ │ │ │ │ ├── holder │ │ │ │ │ │ └── holder.js │ │ │ │ │ │ ├── html5shiv.js │ │ │ │ │ │ └── jquery.js │ │ │ │ ├── base-css.html │ │ │ │ ├── build │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── components.html │ │ │ │ ├── customize.html │ │ │ │ ├── examples │ │ │ │ │ ├── carousel.html │ │ │ │ │ ├── fluid.html │ │ │ │ │ ├── hero.html │ │ │ │ │ ├── justified-nav.html │ │ │ │ │ ├── marketing-narrow.html │ │ │ │ │ ├── signin.html │ │ │ │ │ ├── starter-template.html │ │ │ │ │ ├── sticky-footer-navbar.html │ │ │ │ │ └── sticky-footer.html │ │ │ │ ├── extend.html │ │ │ │ ├── getting-started.html │ │ │ │ ├── index.html │ │ │ │ ├── javascript.html │ │ │ │ ├── scaffolding.html │ │ │ │ └── templates │ │ │ │ │ ├── layout.mustache │ │ │ │ │ └── pages │ │ │ │ │ ├── base-css.mustache │ │ │ │ │ ├── components.mustache │ │ │ │ │ ├── customize.mustache │ │ │ │ │ ├── extend.mustache │ │ │ │ │ ├── getting-started.mustache │ │ │ │ │ ├── index.mustache │ │ │ │ │ ├── javascript.mustache │ │ │ │ │ └── scaffolding.mustache │ │ │ ├── img │ │ │ │ ├── glyphicons-halflings-white.png │ │ │ │ └── glyphicons-halflings.png │ │ │ ├── js │ │ │ │ ├── .jshintrc │ │ │ │ ├── bootstrap-affix.js │ │ │ │ ├── bootstrap-alert.js │ │ │ │ ├── bootstrap-button.js │ │ │ │ ├── bootstrap-carousel.js │ │ │ │ ├── bootstrap-collapse.js │ │ │ │ ├── bootstrap-dropdown.js │ │ │ │ ├── bootstrap-modal.js │ │ │ │ ├── bootstrap-popover.js │ │ │ │ ├── bootstrap-scrollspy.js │ │ │ │ ├── bootstrap-tab.js │ │ │ │ ├── bootstrap-tooltip.js │ │ │ │ ├── bootstrap-transition.js │ │ │ │ ├── bootstrap-typeahead.js │ │ │ │ └── tests │ │ │ │ │ ├── index.html │ │ │ │ │ ├── phantom.js │ │ │ │ │ ├── server.js │ │ │ │ │ ├── unit │ │ │ │ │ ├── bootstrap-affix.js │ │ │ │ │ ├── bootstrap-alert.js │ │ │ │ │ ├── bootstrap-button.js │ │ │ │ │ ├── bootstrap-carousel.js │ │ │ │ │ ├── bootstrap-collapse.js │ │ │ │ │ ├── bootstrap-dropdown.js │ │ │ │ │ ├── bootstrap-modal.js │ │ │ │ │ ├── bootstrap-phantom.js │ │ │ │ │ ├── bootstrap-popover.js │ │ │ │ │ ├── bootstrap-scrollspy.js │ │ │ │ │ ├── bootstrap-tab.js │ │ │ │ │ ├── bootstrap-tooltip.js │ │ │ │ │ ├── bootstrap-transition.js │ │ │ │ │ └── bootstrap-typeahead.js │ │ │ │ │ └── vendor │ │ │ │ │ ├── jquery.js │ │ │ │ │ ├── qunit.css │ │ │ │ │ └── qunit.js │ │ │ ├── less │ │ │ │ ├── accordion.less │ │ │ │ ├── alerts.less │ │ │ │ ├── bootstrap.less │ │ │ │ ├── breadcrumbs.less │ │ │ │ ├── button-groups.less │ │ │ │ ├── buttons.less │ │ │ │ ├── carousel.less │ │ │ │ ├── close.less │ │ │ │ ├── code.less │ │ │ │ ├── component-animations.less │ │ │ │ ├── dropdowns.less │ │ │ │ ├── forms.less │ │ │ │ ├── grid.less │ │ │ │ ├── hero-unit.less │ │ │ │ ├── labels-badges.less │ │ │ │ ├── layouts.less │ │ │ │ ├── media.less │ │ │ │ ├── mixins.less │ │ │ │ ├── modals.less │ │ │ │ ├── navbar.less │ │ │ │ ├── navs.less │ │ │ │ ├── pager.less │ │ │ │ ├── pagination.less │ │ │ │ ├── popovers.less │ │ │ │ ├── progress-bars.less │ │ │ │ ├── reset.less │ │ │ │ ├── responsive-1200px-min.less │ │ │ │ ├── responsive-767px-max.less │ │ │ │ ├── responsive-768px-979px.less │ │ │ │ ├── responsive-navbar.less │ │ │ │ ├── responsive-utilities.less │ │ │ │ ├── responsive.less │ │ │ │ ├── scaffolding.less │ │ │ │ ├── sprites.less │ │ │ │ ├── tables.less │ │ │ │ ├── tests │ │ │ │ │ ├── buttons.html │ │ │ │ │ ├── css-tests.css │ │ │ │ │ ├── css-tests.html │ │ │ │ │ ├── forms-responsive.html │ │ │ │ │ ├── forms.html │ │ │ │ │ ├── navbar-fixed-top.html │ │ │ │ │ ├── navbar-static-top.html │ │ │ │ │ └── navbar.html │ │ │ │ ├── thumbnails.less │ │ │ │ ├── tooltip.less │ │ │ │ ├── type.less │ │ │ │ ├── utilities.less │ │ │ │ ├── variables.less │ │ │ │ └── wells.less │ │ │ └── package.json │ │ ├── mystyle.css │ │ └── style.css │ └── js │ │ └── readmore.js ├── tags │ ├── __init__.py │ └── tag.py ├── templates │ ├── 404.html │ ├── base.html │ ├── facebook │ │ └── register.html │ ├── feed │ │ ├── detail.html │ │ ├── explore.html │ │ ├── home.html │ │ └── starred.html │ ├── forms │ │ └── macros.html │ ├── tmp │ │ ├── 0J99K|T:blu-ray|D:137056106 │ │ ├── 1NPSM|T:blu-ray|D:136996920 │ │ ├── 1RDIU|T:blu-ray|D:137030764 │ │ ├── 69XB8|T:blu-ray|D:137056108 │ │ ├── AII4E|T:blu-ray|D:137107559 │ │ ├── AQD8G|T:blu-ray|D:137010051 │ │ ├── DD22U|T:blu-ray|D:137056105 │ │ ├── E29RC|T:blu-ray|D:137177403 │ │ ├── GLD9S|T:blu-ray|D:137189474 │ │ ├── IMY3O|T:blu-ray|D:137253211 │ │ ├── JQEFS|T:blu-ray|D:137038856 │ │ ├── KHG06|T:blu-ray|D:136996921 │ │ ├── N92W2|T:blu-ray|D:137253212 │ │ ├── O5960|T:blu-ray|D:136996922 │ │ ├── O89K6|T:blu-ray|D:137056103 │ │ ├── OKVUY|T:blu-ray|D:137010055 │ │ ├── QX48C|T:blu-ray|D:136996921 │ │ ├── S04VQ|T:blu-ray|D:137056157 │ │ ├── S0W8O|T:blu-ray|D:136996937 │ │ ├── Z3AMW|T:blu-ray|D:136996929 │ │ ├── _news.ycombinator.com_5957850 │ │ ├── _news.ycombinator.com_5961205 │ │ ├── _news.ycombinator.com_5961785 │ │ ├── _news.ycombinator.com_5962903 │ │ ├── _news.ycombinator.com_5962933 │ │ ├── _news.ycombinator.com_5962954 │ │ ├── _news.ycombinator.com_5964071 │ │ ├── _news.ycombinator.com_5964173 │ │ ├── _news.ycombinator.com_5964327 │ │ ├── _news.ycombinator.com_5964377 │ │ ├── _news.ycombinator.com_5964491 │ │ ├── _news.ycombinator.com_5964508 │ │ ├── _news.ycombinator.com_5964515 │ │ ├── _news.ycombinator.com_5964573 │ │ ├── _news.ycombinator.com_5964665 │ │ ├── _news.ycombinator.com_5964773 │ │ ├── _news.ycombinator.com_5964816 │ │ ├── _news.ycombinator.com_5964853 │ │ ├── _news.ycombinator.com_5964877 │ │ ├── _news.ycombinator.com_5964962 │ │ ├── _news.ycombinator.com_5965081 │ │ ├── _news.ycombinator.com_5965220 │ │ ├── _news.ycombinator.com_5965242 │ │ ├── _news.ycombinator.com_5965304 │ │ ├── _news.ycombinator.com_5965351 │ │ ├── _news.ycombinator.com_5965367 │ │ ├── _news.ycombinator.com_5965517 │ │ ├── _news.ycombinator.com_5965594 │ │ ├── _news.ycombinator.com_5965598 │ │ ├── _news.ycombinator.com_5965618 │ │ ├── blog.asmartbear.com_?p=1152 │ │ ├── blog.asmartbear.com_?p=1154 │ │ ├── blog.asmartbear.com_?p=1164 │ │ ├── blog.asmartbear.com_?p=1168 │ │ ├── blog.asmartbear.com_?p=1186 │ │ ├── blog.asmartbear.com_?p=1190 │ │ ├── blog.asmartbear.com_?p=1201 │ │ ├── blog.asmartbear.com_?p=1225 │ │ ├── blog.asmartbear.com_?p=1228 │ │ ├── blog.asmartbear.com_?p=1232 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10422964 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10422965 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10423296 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10423678 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424006 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424279 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424662 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424663 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424940 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10425215 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10425505 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10425806 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426275 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426276 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426545 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426841 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10427187 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10427533 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428001 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428002 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428357 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428730 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10429232 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10429807 │ │ ├── blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10429808 │ │ ├── dir.yahoo.com_rss_dir_98128545 │ │ ├── sum_0J99K|T:blu-ray|D:137056106 │ │ ├── sum_1NPSM|T:blu-ray|D:136996920 │ │ ├── sum_1RDIU|T:blu-ray|D:137030764 │ │ ├── sum_69XB8|T:blu-ray|D:137056108 │ │ ├── sum_AII4E|T:blu-ray|D:137107559 │ │ ├── sum_AQD8G|T:blu-ray|D:137010051 │ │ ├── sum_DD22U|T:blu-ray|D:137056105 │ │ ├── sum_E29RC|T:blu-ray|D:137177403 │ │ ├── sum_GLD9S|T:blu-ray|D:137189474 │ │ ├── sum_IMY3O|T:blu-ray|D:137253211 │ │ ├── sum_JQEFS|T:blu-ray|D:137038856 │ │ ├── sum_KHG06|T:blu-ray|D:136996921 │ │ ├── sum_N92W2|T:blu-ray|D:137253212 │ │ ├── sum_O5960|T:blu-ray|D:136996922 │ │ ├── sum_O89K6|T:blu-ray|D:137056103 │ │ ├── sum_OKVUY|T:blu-ray|D:137010055 │ │ ├── sum_QX48C|T:blu-ray|D:136996921 │ │ ├── sum_S04VQ|T:blu-ray|D:137056157 │ │ ├── sum_S0W8O|T:blu-ray|D:136996937 │ │ ├── sum_Z3AMW|T:blu-ray|D:136996929 │ │ ├── sum__news.ycombinator.com_5957850 │ │ ├── sum__news.ycombinator.com_5961205 │ │ ├── sum__news.ycombinator.com_5961785 │ │ ├── sum__news.ycombinator.com_5962903 │ │ ├── sum__news.ycombinator.com_5962933 │ │ ├── sum__news.ycombinator.com_5962954 │ │ ├── sum__news.ycombinator.com_5963448 │ │ ├── sum__news.ycombinator.com_5964027 │ │ ├── sum__news.ycombinator.com_5964071 │ │ ├── sum__news.ycombinator.com_5964173 │ │ ├── sum__news.ycombinator.com_5964327 │ │ ├── sum__news.ycombinator.com_5964377 │ │ ├── sum__news.ycombinator.com_5964456 │ │ ├── sum__news.ycombinator.com_5964491 │ │ ├── sum__news.ycombinator.com_5964508 │ │ ├── sum__news.ycombinator.com_5964515 │ │ ├── sum__news.ycombinator.com_5964573 │ │ ├── sum__news.ycombinator.com_5964665 │ │ ├── sum__news.ycombinator.com_5964769 │ │ ├── sum__news.ycombinator.com_5964773 │ │ ├── sum__news.ycombinator.com_5964816 │ │ ├── sum__news.ycombinator.com_5964853 │ │ ├── sum__news.ycombinator.com_5964877 │ │ ├── sum__news.ycombinator.com_5964962 │ │ ├── sum__news.ycombinator.com_5965081 │ │ ├── sum__news.ycombinator.com_5965109 │ │ ├── sum__news.ycombinator.com_5965220 │ │ ├── sum__news.ycombinator.com_5965242 │ │ ├── sum__news.ycombinator.com_5965292 │ │ ├── sum__news.ycombinator.com_5965298 │ │ ├── sum__news.ycombinator.com_5965304 │ │ ├── sum__news.ycombinator.com_5965351 │ │ ├── sum__news.ycombinator.com_5965367 │ │ ├── sum__news.ycombinator.com_5965370 │ │ ├── sum__news.ycombinator.com_5965466 │ │ ├── sum__news.ycombinator.com_5965471 │ │ ├── sum__news.ycombinator.com_5965502 │ │ ├── sum__news.ycombinator.com_5965517 │ │ ├── sum__news.ycombinator.com_5965594 │ │ ├── sum__news.ycombinator.com_5965598 │ │ ├── sum__news.ycombinator.com_5965618 │ │ ├── sum__news.ycombinator.com_5965635 │ │ ├── sum__news.ycombinator.com_5965657 │ │ ├── sum__news.ycombinator.com_5965671 │ │ ├── sum__news.ycombinator.com_5965673 │ │ ├── sum__news.ycombinator.com_5965682 │ │ ├── sum__news.ycombinator.com_5965691 │ │ ├── sum__news.ycombinator.com_5965700 │ │ ├── sum__news.ycombinator.com_5965709 │ │ ├── sum__news.ycombinator.com_5965743 │ │ ├── sum_blog.asmartbear.com_?p=1152 │ │ ├── sum_blog.asmartbear.com_?p=1154 │ │ ├── sum_blog.asmartbear.com_?p=1164 │ │ ├── sum_blog.asmartbear.com_?p=1168 │ │ ├── sum_blog.asmartbear.com_?p=1186 │ │ ├── sum_blog.asmartbear.com_?p=1190 │ │ ├── sum_blog.asmartbear.com_?p=1201 │ │ ├── sum_blog.asmartbear.com_?p=1225 │ │ ├── sum_blog.asmartbear.com_?p=1228 │ │ ├── sum_blog.asmartbear.com_?p=1232 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10422964 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10422965 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10423296 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10423678 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424006 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424279 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424662 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424663 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424940 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10425215 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10425505 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10425806 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426275 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426276 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426545 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426841 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10427187 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10427533 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428001 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428002 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428357 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428730 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10429232 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10429807 │ │ ├── sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10429808 │ │ └── sum_dir.yahoo.com_rss_dir_98128545 │ ├── twitter │ │ └── register.html │ └── users │ │ ├── login.html │ │ ├── profile.html │ │ └── register.html ├── twitter │ ├── __init__.py │ ├── constants.py │ ├── forms.py │ ├── models.py │ └── views.py └── users │ ├── __init__.py │ ├── constants.py │ ├── decorators.py │ ├── forms.py │ ├── models.py │ └── views.py ├── config.py ├── requirements.txt ├── run.py └── shell.py /Procfile: -------------------------------------------------------------------------------- 1 | web: python run.py 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Overview 2 | 3 | This is a RSS Reader wrote by Python Flask, build on top of SQLAlchemy, Twitter Bootstrap and feedparser 4 | 5 | Check the ```requirements.txt``` in top level directory. 6 | 7 | ```bash 8 | Flask==0.10 9 | Flask-OAuth==0.12 10 | Flask-SQLAlchemy==0.16 11 | Flask-WTF==0.8.2 12 | Jinja2==2.6 13 | SQLAlchemy==0.8.0 14 | WTForms==1.0.3 15 | Werkzeug==0.8.3 16 | distribute==0.6.31 17 | facepy==0.8.4 18 | feedparser==5.1.3 19 | httplib2==0.7.7 20 | oauth2==1.5.211 21 | pysqlite==2.6.3 22 | requests==1.1.0 23 | tweepy==2.0 24 | wsgiref==0.1.2 25 | ``` 26 | 27 | ```Profile``` was used to deploy in heroku 28 | ```bash 29 | web: python run.py 30 | ``` 31 | 32 | ## Quick start 33 | ### Clone and install requirement 34 | 35 | Assume that you have Python 2.7+ as well as pip. 36 | First install virtualenv for Python. 37 | ```bash 38 | sudo pip install virtualenv 39 | ``` 40 | 41 | Clone this repo and install requirements as below 42 | ```bash 43 | git clone git@github.com:DTVD/PyRSSReader.git 44 | cd PyRSSReader 45 | virtualenv venv 46 | source venv/bin/active 47 | pip install -r requirements.txt 48 | ``` 49 | 50 | ### Create the database 51 | Once the environment is ready, you can go ahead to create database with ```python shell.py``` 52 | ```python 53 | >>> db.create_all() 54 | ``` 55 | 56 | You should see a sqlite database ```app.db``` is created under top level directory. 57 | Check it's table with ```sqlite3 app.db``` and you should see 58 | ```sql 59 | SQLite version 3.7.13 2012-07-17 17:46:21 60 | Enter ".help" for instructions 61 | Enter SQL statements terminated with a ";" 62 | sqlite> .tables 63 | facebook feed feeduser star twitter user 64 | sqlite> 65 | 66 | ``` 67 | 68 | ### Run the application 69 | Run the application in localhost is quite easy, just ```python run.py``` 70 | ```bash 71 | (venv)DTVD@DTVD-Air :: ~/PyRSSReader (master)-->> python run.py 72 | * Running on http://0.0.0.0:5000/ 73 | * Restarting with reloader 74 | ``` 75 | Congratz! Open your browser at ```127.0.0.1:5000``` and test everything out! 76 | 77 | 78 | 79 | 80 | 81 | 82 | [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/DTVD/pyrssreader/trend.png)](https://bitdeli.com/free "Bitdeli Badge") 83 | 84 | -------------------------------------------------------------------------------- /app/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, flash, redirect, url_for, render_template, g, session 2 | from flask.ext.sqlalchemy import SQLAlchemy 3 | 4 | app = Flask(__name__) 5 | app.config.from_object('config') 6 | 7 | db = SQLAlchemy(app) 8 | 9 | @app.errorhandler(404) 10 | def not_found(error): 11 | return render_template('404.html'), 404 12 | 13 | from app.users.models import User 14 | @app.before_request 15 | def load_user(): 16 | g.user = None 17 | if 'user_id' in session: 18 | g.user = User.query.get(session['user_id']); 19 | 20 | 21 | @app.route('/') 22 | def portal(): 23 | flash('Welcome to RSSR') 24 | return redirect(url_for('users.login')) 25 | 26 | from app.twitter.views import mod as twitterModule 27 | app.register_blueprint(twitterModule) 28 | 29 | from app.facebook.views import mod as facebookModule 30 | app.register_blueprint(facebookModule) 31 | 32 | from app.users.views import mod as usersModule 33 | app.register_blueprint(usersModule) 34 | 35 | from app.feed.views import mod as feedModule 36 | app.register_blueprint(feedModule) 37 | 38 | # Later on you'll import the other blueprints the same way: 39 | #from app.comments.views import mod as commentsModule 40 | #from app.posts.views import mod as postsModule 41 | #app.register_blueprint(commentsModule) 42 | #app.register_blueprint(postsModule) 43 | -------------------------------------------------------------------------------- /app/constants.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/constants.py -------------------------------------------------------------------------------- /app/facebook/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/facebook/__init__.py -------------------------------------------------------------------------------- /app/facebook/constants.py: -------------------------------------------------------------------------------- 1 | #For vunhatminh.com 2 | FACEBOOK_APP_KEY = '534217399942769' 3 | FACEBOOK_APP_SECRET = '8a79252d8b3f8a59f418ed218e8f8d5c' 4 | 5 | #For test localhost 6 | #Need to point abcxyz.com to 127.0.0.1 in /etc/hosts file 7 | #FACEBOOK_APP_KEY = '592028344159367' 8 | #FACEBOOK_APP_SECRET = 'f89108e5e066a105adf1f0cb4fc13ac0' 9 | -------------------------------------------------------------------------------- /app/facebook/forms.py: -------------------------------------------------------------------------------- 1 | from flask.ext.wtf import Form, SelectField, TextField, PasswordField, BooleanField, RecaptchaField 2 | from flask.ext.wtf import Required, Email, EqualTo 3 | 4 | class RegisterForm(Form): 5 | facebook_id = TextField('Facebook ID', [Required()]) 6 | -------------------------------------------------------------------------------- /app/facebook/models.py: -------------------------------------------------------------------------------- 1 | from app import db 2 | 3 | class Facebook(db.Model): 4 | 5 | __tablename__ = 'facebook' 6 | id = db.Column(db.Integer, primary_key=True) 7 | facebook_id= db.Column(db.String(50), unique=True) 8 | uid = db.Column(db.Integer, db.ForeignKey('user.id')) 9 | access_token= db.Column(db.String(200)) 10 | 11 | def __init__(self, facebook_id=None, uid=None): 12 | self.facebook_id = facebook_id 13 | self.uid = uid 14 | 15 | def getFacebookID(self): 16 | return self.facebook_id 17 | 18 | def getUserID(self): 19 | return self.uid 20 | 21 | def __repr__(self): 22 | return '' % (self.facebook_id) 23 | -------------------------------------------------------------------------------- /app/feed/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/feed/__init__.py -------------------------------------------------------------------------------- /app/feed/constants.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/feed/forms.py: -------------------------------------------------------------------------------- 1 | from flask.ext.wtf import Form, TextField, HiddenField 2 | from flask.ext.wtf import Required, EqualTo 3 | 4 | class RegisterForm(Form): 5 | link = TextField('RSS link', [Required()]) 6 | 7 | 8 | class DeleteForm(Form): 9 | feedName = HiddenField('FeedName', [Required()]) 10 | -------------------------------------------------------------------------------- /app/feed/models.py: -------------------------------------------------------------------------------- 1 | from app import db 2 | 3 | class Feed(db.Model): 4 | 5 | __tablename__ = 'feed' 6 | id = db.Column(db.Integer, primary_key=True) 7 | name = db.Column(db.String(50)) 8 | link = db.Column(db.String(200)) 9 | 10 | def __init__(self, name=None, link=None): 11 | self.name = name 12 | self.link = link 13 | 14 | def getId(self): 15 | return self.id 16 | 17 | def getLink(self): 18 | return self.link 19 | 20 | def getName(self): 21 | return self.name 22 | 23 | def __repr__(self): 24 | return '' % (self.name) 25 | 26 | 27 | class FeedUser(db.Model): 28 | 29 | __tablename__ = 'feeduser' 30 | id = db.Column(db.Integer, primary_key=True) 31 | fid = db.Column(db.Integer, db.ForeignKey('feed.id')) 32 | uid = db.Column(db.Integer, db.ForeignKey('user.id')) 33 | 34 | def __init__(self, fid=None, uid=None): 35 | self.fid = fid 36 | self.uid = uid 37 | 38 | def getFeed(self): 39 | return self.fid 40 | 41 | def getUser(self): 42 | return self.uid 43 | 44 | def __repr__(self): 45 | return '' % (self.id) 46 | 47 | 48 | class Star(db.Model): 49 | 50 | __tablename__ = 'star' 51 | id = db.Column(db.Integer, primary_key=True) 52 | uid = db.Column(db.Integer, db.ForeignKey('user.id')) 53 | fid = db.Column(db.Integer, db.ForeignKey('feed.id')) 54 | entryid = db.Column(db.String(200)) 55 | 56 | def __init__(self, uid=None, fid=None, entryid=None): 57 | self.uid = uid 58 | self.fid = fid 59 | self.entryid = entryid 60 | 61 | def getUser(self): 62 | return self.uid 63 | 64 | def getFeed(self): 65 | return self.fid 66 | 67 | def getEntryId(self): 68 | return self.entryid 69 | 70 | def __repr__(self): 71 | return '' % (self.id) 72 | 73 | 74 | -------------------------------------------------------------------------------- /app/rss_reader/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/rss_reader/__init__.py -------------------------------------------------------------------------------- /app/rss_reader/parser.py: -------------------------------------------------------------------------------- 1 | import feedparser 2 | 3 | class RSSParser(object): 4 | 5 | name = '' 6 | number = 0 7 | head = '' 8 | description = '' 9 | href = '' 10 | entryLink = '' 11 | # feedparser object 12 | dto = None 13 | 14 | def __init__(self, link=None): 15 | d = feedparser.parse(link) 16 | self.name = d.feed.title 17 | self.number = len(d.entries) 18 | self.head = d.entries[0].title 19 | self.description = d.entries[0].description 20 | self.entryLink= d.entries[0].link 21 | self.href = d.feed.link 22 | self.dto = d 23 | 24 | def getName(self): 25 | return self.name 26 | 27 | def getNumber(self): 28 | return self.number 29 | 30 | def getHead(self): 31 | return self.head 32 | 33 | def getDescription(self): 34 | return self.description 35 | 36 | def getHref(self): 37 | return self.href 38 | 39 | def getEntryLink(self): 40 | return self.entryLink 41 | 42 | def getDTO(self): 43 | return self.dto 44 | 45 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/.gitignore: -------------------------------------------------------------------------------- 1 | # Numerous always-ignore extensions 2 | *.diff 3 | *.err 4 | *.orig 5 | *.log 6 | *.rej 7 | *.swo 8 | *.swp 9 | *.zip 10 | *.vi 11 | *~ 12 | *.sass-cache 13 | 14 | # OS or Editor folders 15 | .DS_Store 16 | ._* 17 | Thumbs.db 18 | .cache 19 | .project 20 | .settings 21 | .tmproj 22 | *.esproj 23 | nbproject 24 | *.sublime-project 25 | *.sublime-workspace 26 | 27 | # Komodo 28 | *.komodoproject 29 | .komodotools 30 | 31 | # Folders to ignore 32 | .hg 33 | .svn 34 | .CVS 35 | .idea 36 | node_modules 37 | dist 38 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 0.6 -------------------------------------------------------------------------------- /app/static/css/Bootstrap/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap", 3 | "version": "2.3.0", 4 | "main": ["./docs/assets/js/bootstrap.js", "./docs/assets/css/bootstrap.css"], 5 | "dependencies": { 6 | "jquery": "~1.8.0" 7 | } 8 | } -------------------------------------------------------------------------------- /app/static/css/Bootstrap/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twitter/bootstrap" 3 | , "description": "Sleek, intuitive, and powerful front-end framework for faster and easier web development." 4 | , "keywords": ["bootstrap", "css"] 5 | , "homepage": "http://twitter.github.com/bootstrap/" 6 | , "author": "Twitter Inc." 7 | , "license": "Apache-2.0" 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/ico/apple-touch-icon-114-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/ico/apple-touch-icon-114-precomposed.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/ico/apple-touch-icon-144-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/ico/apple-touch-icon-144-precomposed.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/ico/apple-touch-icon-57-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/ico/apple-touch-icon-57-precomposed.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/ico/apple-touch-icon-72-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/ico/apple-touch-icon-72-precomposed.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/ico/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/ico/favicon.ico -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/ico/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/ico/favicon.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/bootstrap-docs-readme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/bootstrap-docs-readme.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/bootstrap-mdo-sfmoma-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/bootstrap-mdo-sfmoma-01.jpg -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/bootstrap-mdo-sfmoma-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/bootstrap-mdo-sfmoma-02.jpg -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/bootstrap-mdo-sfmoma-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/bootstrap-mdo-sfmoma-03.jpg -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/bs-docs-bootstrap-features.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/bs-docs-bootstrap-features.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/bs-docs-masthead-pattern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/bs-docs-masthead-pattern.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/bs-docs-responsive-illustrations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/bs-docs-responsive-illustrations.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/bs-docs-twitter-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/bs-docs-twitter-github.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/example-sites/8020select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/example-sites/8020select.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/example-sites/adoptahydrant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/example-sites/adoptahydrant.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/example-sites/breakingnews.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/example-sites/breakingnews.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/example-sites/fleetio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/example-sites/fleetio.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/example-sites/gathercontent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/example-sites/gathercontent.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/example-sites/jshint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/example-sites/jshint.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/example-sites/kippt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/example-sites/kippt.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/example-sites/soundready.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/example-sites/soundready.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-carousel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-carousel.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-fluid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-fluid.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-justified-nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-justified-nav.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-marketing-narrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-marketing-narrow.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-marketing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-marketing.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-signin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-signin.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-starter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-starter.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-sticky-footer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/bootstrap-example-sticky-footer.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/browser-icon-chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/browser-icon-chrome.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/browser-icon-firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/browser-icon-firefox.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/browser-icon-safari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/browser-icon-safari.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/slide-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/slide-01.jpg -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/slide-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/slide-02.jpg -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/examples/slide-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/examples/slide-03.jpg -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/grid-baseline-20px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/grid-baseline-20px.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/less-logo-large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/less-logo-large.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/img/responsive-illustrations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/static/css/Bootstrap/docs/assets/img/responsive-illustrations.png -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/js/bootstrap-transition.js: -------------------------------------------------------------------------------- 1 | /* =================================================== 2 | * bootstrap-transition.js v2.3.0 3 | * http://twitter.github.com/bootstrap/javascript.html#transitions 4 | * =================================================== 5 | * Copyright 2012 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ========================================================== */ 19 | 20 | 21 | !function ($) { 22 | 23 | "use strict"; // jshint ;_; 24 | 25 | 26 | /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) 27 | * ======================================================= */ 28 | 29 | $(function () { 30 | 31 | $.support.transition = (function () { 32 | 33 | var transitionEnd = (function () { 34 | 35 | var el = document.createElement('bootstrap') 36 | , transEndEventNames = { 37 | 'WebkitTransition' : 'webkitTransitionEnd' 38 | , 'MozTransition' : 'transitionend' 39 | , 'OTransition' : 'oTransitionEnd otransitionend' 40 | , 'transition' : 'transitionend' 41 | } 42 | , name 43 | 44 | for (name in transEndEventNames){ 45 | if (el.style[name] !== undefined) { 46 | return transEndEventNames[name] 47 | } 48 | } 49 | 50 | }()) 51 | 52 | return transitionEnd && { 53 | end: transitionEnd 54 | } 55 | 56 | })() 57 | 58 | }) 59 | 60 | }(window.jQuery); -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/js/google-code-prettify/prettify.css: -------------------------------------------------------------------------------- 1 | .com { color: #93a1a1; } 2 | .lit { color: #195f91; } 3 | .pun, .opn, .clo { color: #93a1a1; } 4 | .fun { color: #dc322f; } 5 | .str, .atv { color: #D14; } 6 | .kwd, .prettyprint .tag { color: #1e347b; } 7 | .typ, .atn, .dec, .var { color: teal; } 8 | .pln { color: #48484c; } 9 | 10 | .prettyprint { 11 | padding: 8px; 12 | background-color: #f7f7f9; 13 | border: 1px solid #e1e1e8; 14 | } 15 | .prettyprint.linenums { 16 | -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 17 | -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 18 | box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 19 | } 20 | 21 | /* Specify class=linenums on a pre to get line numbering */ 22 | ol.linenums { 23 | margin: 0 0 0 33px; /* IE indents via margin-left */ 24 | } 25 | ol.linenums li { 26 | padding-left: 12px; 27 | color: #bebec5; 28 | line-height: 20px; 29 | text-shadow: 0 1px 0 #fff; 30 | } -------------------------------------------------------------------------------- /app/static/css/Bootstrap/docs/assets/js/html5shiv.js: -------------------------------------------------------------------------------- 1 | /* 2 | HTML5 Shiv v3.6.2pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); 5 | a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; 6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| 7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",version:"3.6.2pre",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); 8 | for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d 2 | 3 | 4 | Bootstrap Plugin Test Suite 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
49 |

Bootstrap Plugin Test Suite

50 |

51 |

52 |
    53 |
    54 |
    55 | 56 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/js/tests/phantom.js: -------------------------------------------------------------------------------- 1 | // Simple phantom.js integration script 2 | // Adapted from Modernizr 3 | 4 | function waitFor(testFx, onReady, timeOutMillis) { 5 | var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 5001 //< Default Max Timout is 5s 6 | , start = new Date().getTime() 7 | , condition = false 8 | , interval = setInterval(function () { 9 | if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) { 10 | // If not time-out yet and condition not yet fulfilled 11 | condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()) //< defensive code 12 | } else { 13 | if (!condition) { 14 | // If condition still not fulfilled (timeout but condition is 'false') 15 | console.log("'waitFor()' timeout") 16 | phantom.exit(1) 17 | } else { 18 | // Condition fulfilled (timeout and/or condition is 'true') 19 | typeof(onReady) === "string" ? eval(onReady) : onReady() //< Do what it's supposed to do once the condition is fulfilled 20 | clearInterval(interval) //< Stop this interval 21 | } 22 | } 23 | }, 100) //< repeat check every 100ms 24 | } 25 | 26 | 27 | if (phantom.args.length === 0 || phantom.args.length > 2) { 28 | console.log('Usage: phantom.js URL') 29 | phantom.exit() 30 | } 31 | 32 | var page = new WebPage() 33 | 34 | // Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this") 35 | page.onConsoleMessage = function(msg) { 36 | console.log(msg) 37 | }; 38 | 39 | page.open(phantom.args[0], function(status){ 40 | if (status !== "success") { 41 | console.log("Unable to access network") 42 | phantom.exit() 43 | } else { 44 | waitFor(function(){ 45 | return page.evaluate(function(){ 46 | var el = document.getElementById('qunit-testresult') 47 | if (el && el.innerText.match('completed')) { 48 | return true 49 | } 50 | return false 51 | }) 52 | }, function(){ 53 | var failedNum = page.evaluate(function(){ 54 | var el = document.getElementById('qunit-testresult') 55 | try { 56 | return el.getElementsByClassName('failed')[0].innerHTML 57 | } catch (e) { } 58 | return 10000 59 | }); 60 | phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0) 61 | }) 62 | } 63 | }) -------------------------------------------------------------------------------- /app/static/css/Bootstrap/js/tests/server.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Simple connect server for phantom.js 3 | * Adapted from Modernizr 4 | */ 5 | 6 | var connect = require('connect') 7 | , http = require('http') 8 | , fs = require('fs') 9 | , app = connect() 10 | .use(connect.static(__dirname + '/../../')); 11 | 12 | http.createServer(app).listen(3000); 13 | 14 | fs.writeFileSync(__dirname + '/pid.txt', process.pid, 'utf-8') -------------------------------------------------------------------------------- /app/static/css/Bootstrap/js/tests/unit/bootstrap-affix.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("bootstrap-affix") 4 | 5 | test("should provide no conflict", function () { 6 | var affix = $.fn.affix.noConflict() 7 | ok(!$.fn.affix, 'affix was set back to undefined (org value)') 8 | $.fn.affix = affix 9 | }) 10 | 11 | test("should be defined on jquery object", function () { 12 | ok($(document.body).affix, 'affix method is defined') 13 | }) 14 | 15 | test("should return element", function () { 16 | ok($(document.body).affix()[0] == document.body, 'document.body returned') 17 | }) 18 | 19 | test("should exit early if element is not visible", function () { 20 | var $affix = $('
    ').affix() 21 | $affix.data('affix').checkPosition() 22 | ok(!$affix.hasClass('affix'), 'affix class was not added') 23 | }) 24 | 25 | }) -------------------------------------------------------------------------------- /app/static/css/Bootstrap/js/tests/unit/bootstrap-alert.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("bootstrap-alerts") 4 | 5 | test("should provide no conflict", function () { 6 | var alert = $.fn.alert.noConflict() 7 | ok(!$.fn.alert, 'alert was set back to undefined (org value)') 8 | $.fn.alert = alert 9 | }) 10 | 11 | test("should be defined on jquery object", function () { 12 | ok($(document.body).alert, 'alert method is defined') 13 | }) 14 | 15 | test("should return element", function () { 16 | ok($(document.body).alert()[0] == document.body, 'document.body returned') 17 | }) 18 | 19 | test("should fade element out on clicking .close", function () { 20 | var alertHTML = '
    ' 21 | + '×' 22 | + '

    Holy guacamole! Best check yo self, you\'re not looking too good.

    ' 23 | + '
    ' 24 | , alert = $(alertHTML).alert() 25 | 26 | alert.find('.close').click() 27 | 28 | ok(!alert.hasClass('in'), 'remove .in class on .close click') 29 | }) 30 | 31 | test("should remove element when clicking .close", function () { 32 | $.support.transition = false 33 | 34 | var alertHTML = '
    ' 35 | + '×' 36 | + '

    Holy guacamole! Best check yo self, you\'re not looking too good.

    ' 37 | + '
    ' 38 | , alert = $(alertHTML).appendTo('#qunit-fixture').alert() 39 | 40 | ok($('#qunit-fixture').find('.alert-message').length, 'element added to dom') 41 | 42 | alert.find('.close').click() 43 | 44 | ok(!$('#qunit-fixture').find('.alert-message').length, 'element removed from dom') 45 | }) 46 | 47 | test("should not fire closed when close is prevented", function () { 48 | $.support.transition = false 49 | stop(); 50 | $('
    ') 51 | .bind('close', function (e) { 52 | e.preventDefault(); 53 | ok(true); 54 | start(); 55 | }) 56 | .bind('closed', function () { 57 | ok(false); 58 | }) 59 | .alert('close') 60 | }) 61 | 62 | }) -------------------------------------------------------------------------------- /app/static/css/Bootstrap/js/tests/unit/bootstrap-phantom.js: -------------------------------------------------------------------------------- 1 | // Logging setup for phantom integration 2 | // adapted from Modernizr 3 | 4 | QUnit.begin = function () { 5 | console.log("Starting test suite") 6 | console.log("================================================\n") 7 | } 8 | 9 | QUnit.moduleDone = function (opts) { 10 | if (opts.failed === 0) { 11 | console.log("\u2714 All tests passed in '" + opts.name + "' module") 12 | } else { 13 | console.log("\u2716 " + opts.failed + " tests failed in '" + opts.name + "' module") 14 | } 15 | } 16 | 17 | QUnit.done = function (opts) { 18 | console.log("\n================================================") 19 | console.log("Tests completed in " + opts.runtime + " milliseconds") 20 | console.log(opts.passed + " tests of " + opts.total + " passed, " + opts.failed + " failed.") 21 | } -------------------------------------------------------------------------------- /app/static/css/Bootstrap/js/tests/unit/bootstrap-scrollspy.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("bootstrap-scrollspy") 4 | 5 | test("should provide no conflict", function () { 6 | var scrollspy = $.fn.scrollspy.noConflict() 7 | ok(!$.fn.scrollspy, 'scrollspy was set back to undefined (org value)') 8 | $.fn.scrollspy = scrollspy 9 | }) 10 | 11 | test("should be defined on jquery object", function () { 12 | ok($(document.body).scrollspy, 'scrollspy method is defined') 13 | }) 14 | 15 | test("should return element", function () { 16 | ok($(document.body).scrollspy()[0] == document.body, 'document.body returned') 17 | }) 18 | 19 | test("should switch active class on scroll", function () { 20 | var sectionHTML = '
    ' 21 | , $section = $(sectionHTML).append('#qunit-fixture') 22 | , topbarHTML ='
    ' 23 | + '
    ' 24 | + '
    ' 25 | + '

    Bootstrap

    ' 26 | + '' 29 | + '
    ' 30 | + '
    ' 31 | + '
    ' 32 | , $topbar = $(topbarHTML).scrollspy() 33 | 34 | ok($topbar.find('.active', true)) 35 | }) 36 | 37 | }) -------------------------------------------------------------------------------- /app/static/css/Bootstrap/js/tests/unit/bootstrap-transition.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("bootstrap-transition") 4 | 5 | test("should be defined on jquery support object", function () { 6 | ok($.support.transition !== undefined, 'transition object is defined') 7 | }) 8 | 9 | test("should provide an end object", function () { 10 | ok($.support.transition ? $.support.transition.end : true, 'end string is defined') 11 | }) 12 | 13 | }) -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/accordion.less: -------------------------------------------------------------------------------- 1 | // 2 | // Accordion 3 | // -------------------------------------------------- 4 | 5 | 6 | // Parent container 7 | .accordion { 8 | margin-bottom: @baseLineHeight; 9 | } 10 | 11 | // Group == heading + body 12 | .accordion-group { 13 | margin-bottom: 2px; 14 | border: 1px solid #e5e5e5; 15 | .border-radius(@baseBorderRadius); 16 | } 17 | .accordion-heading { 18 | border-bottom: 0; 19 | } 20 | .accordion-heading .accordion-toggle { 21 | display: block; 22 | padding: 8px 15px; 23 | } 24 | 25 | // General toggle styles 26 | .accordion-toggle { 27 | cursor: pointer; 28 | } 29 | 30 | // Inner needs the styles because you can't animate properly with any styles on the element 31 | .accordion-inner { 32 | padding: 9px 15px; 33 | border-top: 1px solid #e5e5e5; 34 | } 35 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/alerts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: 8px 35px 8px 14px; 11 | margin-bottom: @baseLineHeight; 12 | text-shadow: 0 1px 0 rgba(255,255,255,.5); 13 | background-color: @warningBackground; 14 | border: 1px solid @warningBorder; 15 | .border-radius(@baseBorderRadius); 16 | } 17 | .alert, 18 | .alert h4 { 19 | // Specified for the h4 to prevent conflicts of changing @headingsColor 20 | color: @warningText; 21 | } 22 | .alert h4 { 23 | margin: 0; 24 | } 25 | 26 | // Adjust close link position 27 | .alert .close { 28 | position: relative; 29 | top: -2px; 30 | right: -21px; 31 | line-height: @baseLineHeight; 32 | } 33 | 34 | 35 | // Alternate styles 36 | // ------------------------- 37 | 38 | .alert-success { 39 | background-color: @successBackground; 40 | border-color: @successBorder; 41 | color: @successText; 42 | } 43 | .alert-success h4 { 44 | color: @successText; 45 | } 46 | .alert-danger, 47 | .alert-error { 48 | background-color: @errorBackground; 49 | border-color: @errorBorder; 50 | color: @errorText; 51 | } 52 | .alert-danger h4, 53 | .alert-error h4 { 54 | color: @errorText; 55 | } 56 | .alert-info { 57 | background-color: @infoBackground; 58 | border-color: @infoBorder; 59 | color: @infoText; 60 | } 61 | .alert-info h4 { 62 | color: @infoText; 63 | } 64 | 65 | 66 | // Block alerts 67 | // ------------------------- 68 | 69 | .alert-block { 70 | padding-top: 14px; 71 | padding-bottom: 14px; 72 | } 73 | .alert-block > p, 74 | .alert-block > ul { 75 | margin-bottom: 0; 76 | } 77 | .alert-block p + p { 78 | margin-top: 5px; 79 | } 80 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/bootstrap.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v2.3.0 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 | // Core variables and mixins 12 | @import "variables.less"; // Modify this for custom colors, font-sizes, etc 13 | @import "mixins.less"; 14 | 15 | // CSS Reset 16 | @import "reset.less"; 17 | 18 | // Grid system and page structure 19 | @import "scaffolding.less"; 20 | @import "grid.less"; 21 | @import "layouts.less"; 22 | 23 | // Base CSS 24 | @import "type.less"; 25 | @import "code.less"; 26 | @import "forms.less"; 27 | @import "tables.less"; 28 | 29 | // Components: common 30 | @import "sprites.less"; 31 | @import "dropdowns.less"; 32 | @import "wells.less"; 33 | @import "component-animations.less"; 34 | @import "close.less"; 35 | 36 | // Components: Buttons & Alerts 37 | @import "buttons.less"; 38 | @import "button-groups.less"; 39 | @import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less 40 | 41 | // Components: Nav 42 | @import "navs.less"; 43 | @import "navbar.less"; 44 | @import "breadcrumbs.less"; 45 | @import "pagination.less"; 46 | @import "pager.less"; 47 | 48 | // Components: Popovers 49 | @import "modals.less"; 50 | @import "tooltip.less"; 51 | @import "popovers.less"; 52 | 53 | // Components: Misc 54 | @import "thumbnails.less"; 55 | @import "media.less"; 56 | @import "labels-badges.less"; 57 | @import "progress-bars.less"; 58 | @import "accordion.less"; 59 | @import "carousel.less"; 60 | @import "hero-unit.less"; 61 | 62 | // Utility classes 63 | @import "utilities.less"; // Has to be last to override when necessary 64 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/breadcrumbs.less: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: 8px 15px; 8 | margin: 0 0 @baseLineHeight; 9 | list-style: none; 10 | background-color: #f5f5f5; 11 | .border-radius(@baseBorderRadius); 12 | > li { 13 | display: inline-block; 14 | .ie7-inline-block(); 15 | text-shadow: 0 1px 0 @white; 16 | > .divider { 17 | padding: 0 5px; 18 | color: #ccc; 19 | } 20 | } 21 | > .active { 22 | color: @grayLight; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/close.less: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: 20px; 9 | font-weight: bold; 10 | line-height: @baseLineHeight; 11 | color: @black; 12 | text-shadow: 0 1px 0 rgba(255,255,255,1); 13 | .opacity(20); 14 | &:hover, 15 | &:focus { 16 | color: @black; 17 | text-decoration: none; 18 | cursor: pointer; 19 | .opacity(40); 20 | } 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | button.close { 27 | padding: 0; 28 | cursor: pointer; 29 | background: transparent; 30 | border: 0; 31 | -webkit-appearance: none; 32 | } -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/code.less: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and blocK) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | pre { 9 | padding: 0 3px 2px; 10 | #font > #family > .monospace; 11 | font-size: @baseFontSize - 2; 12 | color: @grayDark; 13 | .border-radius(3px); 14 | } 15 | 16 | // Inline code 17 | code { 18 | padding: 2px 4px; 19 | color: #d14; 20 | background-color: #f7f7f9; 21 | border: 1px solid #e1e1e8; 22 | white-space: nowrap; 23 | } 24 | 25 | // Blocks of code 26 | pre { 27 | display: block; 28 | padding: (@baseLineHeight - 1) / 2; 29 | margin: 0 0 @baseLineHeight / 2; 30 | font-size: @baseFontSize - 1; // 14px to 13px 31 | line-height: @baseLineHeight; 32 | word-break: break-all; 33 | word-wrap: break-word; 34 | white-space: pre; 35 | white-space: pre-wrap; 36 | background-color: #f5f5f5; 37 | border: 1px solid #ccc; // fallback for IE7-8 38 | border: 1px solid rgba(0,0,0,.15); 39 | .border-radius(@baseBorderRadius); 40 | 41 | // Make prettyprint styles more spaced out for readability 42 | &.prettyprint { 43 | margin-bottom: @baseLineHeight; 44 | } 45 | 46 | // Account for some code outputs that place code tags in pre tags 47 | code { 48 | padding: 0; 49 | color: inherit; 50 | white-space: pre; 51 | white-space: pre-wrap; 52 | background-color: transparent; 53 | border: 0; 54 | } 55 | } 56 | 57 | // Enable scrollable blocks of code 58 | .pre-scrollable { 59 | max-height: 340px; 60 | overflow-y: scroll; 61 | } -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/component-animations.less: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | 6 | .fade { 7 | opacity: 0; 8 | .transition(opacity .15s linear); 9 | &.in { 10 | opacity: 1; 11 | } 12 | } 13 | 14 | .collapse { 15 | position: relative; 16 | height: 0; 17 | overflow: hidden; 18 | .transition(height .35s ease); 19 | &.in { 20 | height: auto; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/grid.less: -------------------------------------------------------------------------------- 1 | // 2 | // Grid system 3 | // -------------------------------------------------- 4 | 5 | 6 | // Fixed (940px) 7 | #grid > .core(@gridColumnWidth, @gridGutterWidth); 8 | 9 | // Fluid (940px) 10 | #grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth); 11 | 12 | // Reset utility classes due to specificity 13 | [class*="span"].hide, 14 | .row-fluid [class*="span"].hide { 15 | display: none; 16 | } 17 | 18 | [class*="span"].pull-right, 19 | .row-fluid [class*="span"].pull-right { 20 | float: right; 21 | } 22 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/hero-unit.less: -------------------------------------------------------------------------------- 1 | // 2 | // Hero unit 3 | // -------------------------------------------------- 4 | 5 | 6 | .hero-unit { 7 | padding: 60px; 8 | margin-bottom: 30px; 9 | font-size: 18px; 10 | font-weight: 200; 11 | line-height: @baseLineHeight * 1.5; 12 | color: @heroUnitLeadColor; 13 | background-color: @heroUnitBackground; 14 | .border-radius(6px); 15 | h1 { 16 | margin-bottom: 0; 17 | font-size: 60px; 18 | line-height: 1; 19 | color: @heroUnitHeadingColor; 20 | letter-spacing: -1px; 21 | } 22 | li { 23 | line-height: @baseLineHeight * 1.5; // Reset since we specify in type.less 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/labels-badges.less: -------------------------------------------------------------------------------- 1 | // 2 | // Labels and badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base classes 7 | .label, 8 | .badge { 9 | display: inline-block; 10 | padding: 2px 4px; 11 | font-size: @baseFontSize * .846; 12 | font-weight: bold; 13 | line-height: 14px; // ensure proper line-height if floated 14 | color: @white; 15 | vertical-align: baseline; 16 | white-space: nowrap; 17 | text-shadow: 0 -1px 0 rgba(0,0,0,.25); 18 | background-color: @grayLight; 19 | } 20 | // Set unique padding and border-radii 21 | .label { 22 | .border-radius(3px); 23 | } 24 | .badge { 25 | padding-left: 9px; 26 | padding-right: 9px; 27 | .border-radius(9px); 28 | } 29 | 30 | // Empty labels/badges collapse 31 | .label, 32 | .badge { 33 | &:empty { 34 | display: none; 35 | } 36 | } 37 | 38 | // Hover/focus state, but only for links 39 | a { 40 | &.label:hover, 41 | &.label:focus, 42 | &.badge:hover, 43 | &.badge:focus { 44 | color: @white; 45 | text-decoration: none; 46 | cursor: pointer; 47 | } 48 | } 49 | 50 | // Colors 51 | // Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute) 52 | .label, 53 | .badge { 54 | // Important (red) 55 | &-important { background-color: @errorText; } 56 | &-important[href] { background-color: darken(@errorText, 10%); } 57 | // Warnings (orange) 58 | &-warning { background-color: @orange; } 59 | &-warning[href] { background-color: darken(@orange, 10%); } 60 | // Success (green) 61 | &-success { background-color: @successText; } 62 | &-success[href] { background-color: darken(@successText, 10%); } 63 | // Info (turquoise) 64 | &-info { background-color: @infoText; } 65 | &-info[href] { background-color: darken(@infoText, 10%); } 66 | // Inverse (black) 67 | &-inverse { background-color: @grayDark; } 68 | &-inverse[href] { background-color: darken(@grayDark, 10%); } 69 | } 70 | 71 | // Quick fix for labels/badges in buttons 72 | .btn { 73 | .label, 74 | .badge { 75 | position: relative; 76 | top: -1px; 77 | } 78 | } 79 | .btn-mini { 80 | .label, 81 | .badge { 82 | top: 0; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/layouts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Layouts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Container (centered, fixed-width layouts) 7 | .container { 8 | .container-fixed(); 9 | } 10 | 11 | // Fluid layouts (left aligned, with sidebar, min- & max-width content) 12 | .container-fluid { 13 | padding-right: @gridGutterWidth; 14 | padding-left: @gridGutterWidth; 15 | .clearfix(); 16 | } -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/media.less: -------------------------------------------------------------------------------- 1 | // Media objects 2 | // Source: http://stubbornella.org/content/?p=497 3 | // -------------------------------------------------- 4 | 5 | 6 | // Common styles 7 | // ------------------------- 8 | 9 | // Clear the floats 10 | .media, 11 | .media-body { 12 | overflow: hidden; 13 | *overflow: visible; 14 | zoom: 1; 15 | } 16 | 17 | // Proper spacing between instances of .media 18 | .media, 19 | .media .media { 20 | margin-top: 15px; 21 | } 22 | .media:first-child { 23 | margin-top: 0; 24 | } 25 | 26 | // For images and videos, set to block 27 | .media-object { 28 | display: block; 29 | } 30 | 31 | // Reset margins on headings for tighter default spacing 32 | .media-heading { 33 | margin: 0 0 5px; 34 | } 35 | 36 | 37 | // Media image alignment 38 | // ------------------------- 39 | 40 | .media > .pull-left { 41 | margin-right: 10px; 42 | } 43 | .media > .pull-right { 44 | margin-left: 10px; 45 | } 46 | 47 | 48 | // Media list variation 49 | // ------------------------- 50 | 51 | // Undo default ul/ol styles 52 | .media-list { 53 | margin-left: 0; 54 | list-style: none; 55 | } 56 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/modals.less: -------------------------------------------------------------------------------- 1 | // 2 | // Modals 3 | // -------------------------------------------------- 4 | 5 | // Background 6 | .modal-backdrop { 7 | position: fixed; 8 | top: 0; 9 | right: 0; 10 | bottom: 0; 11 | left: 0; 12 | z-index: @zindexModalBackdrop; 13 | background-color: @black; 14 | // Fade for backdrop 15 | &.fade { opacity: 0; } 16 | } 17 | 18 | .modal-backdrop, 19 | .modal-backdrop.fade.in { 20 | .opacity(80); 21 | } 22 | 23 | // Base modal 24 | .modal { 25 | position: fixed; 26 | top: 10%; 27 | left: 50%; 28 | z-index: @zindexModal; 29 | width: 560px; 30 | margin-left: -280px; 31 | background-color: @white; 32 | border: 1px solid #999; 33 | border: 1px solid rgba(0,0,0,.3); 34 | *border: 1px solid #999; /* IE6-7 */ 35 | .border-radius(6px); 36 | .box-shadow(0 3px 7px rgba(0,0,0,0.3)); 37 | .background-clip(padding-box); 38 | // Remove focus outline from opened modal 39 | outline: none; 40 | 41 | &.fade { 42 | .transition(e('opacity .3s linear, top .3s ease-out')); 43 | top: -25%; 44 | } 45 | &.fade.in { top: 10%; } 46 | } 47 | .modal-header { 48 | padding: 9px 15px; 49 | border-bottom: 1px solid #eee; 50 | // Close icon 51 | .close { margin-top: 2px; } 52 | // Heading 53 | h3 { 54 | margin: 0; 55 | line-height: 30px; 56 | } 57 | } 58 | 59 | // Body (where all modal content resides) 60 | .modal-body { 61 | position: relative; 62 | overflow-y: auto; 63 | max-height: 400px; 64 | padding: 15px; 65 | } 66 | // Remove bottom margin if need be 67 | .modal-form { 68 | margin-bottom: 0; 69 | } 70 | 71 | // Footer (for actions) 72 | .modal-footer { 73 | padding: 14px 15px 15px; 74 | margin-bottom: 0; 75 | text-align: right; // right align buttons 76 | background-color: #f5f5f5; 77 | border-top: 1px solid #ddd; 78 | .border-radius(0 0 6px 6px); 79 | .box-shadow(inset 0 1px 0 @white); 80 | .clearfix(); // clear it in case folks use .pull-* classes on buttons 81 | 82 | // Properly space out buttons 83 | .btn + .btn { 84 | margin-left: 5px; 85 | margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs 86 | } 87 | // but override that for button groups 88 | .btn-group .btn + .btn { 89 | margin-left: -1px; 90 | } 91 | // and override it for block buttons as well 92 | .btn-block + .btn-block { 93 | margin-left: 0; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/pager.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | margin: @baseLineHeight 0; 8 | list-style: none; 9 | text-align: center; 10 | .clearfix(); 11 | } 12 | .pager li { 13 | display: inline; 14 | } 15 | .pager li > a, 16 | .pager li > span { 17 | display: inline-block; 18 | padding: 5px 14px; 19 | background-color: #fff; 20 | border: 1px solid #ddd; 21 | .border-radius(15px); 22 | } 23 | .pager li > a:hover, 24 | .pager li > a:focus { 25 | text-decoration: none; 26 | background-color: #f5f5f5; 27 | } 28 | .pager .next > a, 29 | .pager .next > span { 30 | float: right; 31 | } 32 | .pager .previous > a, 33 | .pager .previous > span { 34 | float: left; 35 | } 36 | .pager .disabled > a, 37 | .pager .disabled > a:hover, 38 | .pager .disabled > a:focus, 39 | .pager .disabled > span { 40 | color: @grayLight; 41 | background-color: #fff; 42 | cursor: default; 43 | } -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/responsive-1200px-min.less: -------------------------------------------------------------------------------- 1 | // 2 | // Responsive: Large desktop and up 3 | // -------------------------------------------------- 4 | 5 | 6 | @media (min-width: 1200px) { 7 | 8 | // Fixed grid 9 | #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200); 10 | 11 | // Fluid grid 12 | #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200); 13 | 14 | // Input grid 15 | #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200); 16 | 17 | // Thumbnails 18 | .thumbnails { 19 | margin-left: -@gridGutterWidth1200; 20 | } 21 | .thumbnails > li { 22 | margin-left: @gridGutterWidth1200; 23 | } 24 | .row-fluid .thumbnails { 25 | margin-left: 0; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/responsive-768px-979px.less: -------------------------------------------------------------------------------- 1 | // 2 | // Responsive: Tablet to desktop 3 | // -------------------------------------------------- 4 | 5 | 6 | @media (min-width: 768px) and (max-width: 979px) { 7 | 8 | // Fixed grid 9 | #grid > .core(@gridColumnWidth768, @gridGutterWidth768); 10 | 11 | // Fluid grid 12 | #grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768); 13 | 14 | // Input grid 15 | #grid > .input(@gridColumnWidth768, @gridGutterWidth768); 16 | 17 | // No need to reset .thumbnails here since it's the same @gridGutterWidth 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/responsive-utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Responsive: Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // IE10 Metro responsive 7 | // Required for Windows 8 Metro split-screen snapping with IE10 8 | // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ 9 | @-ms-viewport{ 10 | width: device-width; 11 | } 12 | 13 | // Hide from screenreaders and browsers 14 | // Credit: HTML5 Boilerplate 15 | .hidden { 16 | display: none; 17 | visibility: hidden; 18 | } 19 | 20 | // Visibility utilities 21 | 22 | // For desktops 23 | .visible-phone { display: none !important; } 24 | .visible-tablet { display: none !important; } 25 | .hidden-phone { } 26 | .hidden-tablet { } 27 | .hidden-desktop { display: none !important; } 28 | .visible-desktop { display: inherit !important; } 29 | 30 | // Tablets & small desktops only 31 | @media (min-width: 768px) and (max-width: 979px) { 32 | // Hide everything else 33 | .hidden-desktop { display: inherit !important; } 34 | .visible-desktop { display: none !important ; } 35 | // Show 36 | .visible-tablet { display: inherit !important; } 37 | // Hide 38 | .hidden-tablet { display: none !important; } 39 | } 40 | 41 | // Phones only 42 | @media (max-width: 767px) { 43 | // Hide everything else 44 | .hidden-desktop { display: inherit !important; } 45 | .visible-desktop { display: none !important; } 46 | // Show 47 | .visible-phone { display: inherit !important; } // Use inherit to restore previous behavior 48 | // Hide 49 | .hidden-phone { display: none !important; } 50 | } 51 | 52 | // Print utilities 53 | .visible-print { display: none !important; } 54 | .hidden-print { } 55 | 56 | @media print { 57 | .visible-print { display: inherit !important; } 58 | .hidden-print { display: none !important; } 59 | } 60 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/responsive.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Responsive v2.3.0 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 | // Responsive.less 13 | // For phone and tablet devices 14 | // ------------------------------------------------------------- 15 | 16 | 17 | // REPEAT VARIABLES & MIXINS 18 | // ------------------------- 19 | // Required since we compile the responsive stuff separately 20 | 21 | @import "variables.less"; // Modify this for custom colors, font-sizes, etc 22 | @import "mixins.less"; 23 | 24 | 25 | // RESPONSIVE CLASSES 26 | // ------------------ 27 | 28 | @import "responsive-utilities.less"; 29 | 30 | 31 | // MEDIA QUERIES 32 | // ------------------ 33 | 34 | // Large desktops 35 | @import "responsive-1200px-min.less"; 36 | 37 | // Tablets to regular desktops 38 | @import "responsive-768px-979px.less"; 39 | 40 | // Phones to portrait tablets and narrow desktops 41 | @import "responsive-767px-max.less"; 42 | 43 | 44 | // RESPONSIVE NAVBAR 45 | // ------------------ 46 | 47 | // From 979px and below, show a button to toggle navbar contents 48 | @import "responsive-navbar.less"; 49 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/scaffolding.less: -------------------------------------------------------------------------------- 1 | // 2 | // Scaffolding 3 | // -------------------------------------------------- 4 | 5 | 6 | // Body reset 7 | // ------------------------- 8 | 9 | body { 10 | margin: 0; 11 | font-family: @baseFontFamily; 12 | font-size: @baseFontSize; 13 | line-height: @baseLineHeight; 14 | color: @textColor; 15 | background-color: @bodyBackground; 16 | } 17 | 18 | 19 | // Links 20 | // ------------------------- 21 | 22 | a { 23 | color: @linkColor; 24 | text-decoration: none; 25 | } 26 | a:hover, 27 | a:focus { 28 | color: @linkColorHover; 29 | text-decoration: underline; 30 | } 31 | 32 | 33 | // Images 34 | // ------------------------- 35 | 36 | // Rounded corners 37 | .img-rounded { 38 | .border-radius(6px); 39 | } 40 | 41 | // Add polaroid-esque trim 42 | .img-polaroid { 43 | padding: 4px; 44 | background-color: #fff; 45 | border: 1px solid #ccc; 46 | border: 1px solid rgba(0,0,0,.2); 47 | .box-shadow(0 1px 3px rgba(0,0,0,.1)); 48 | } 49 | 50 | // Perfect circle 51 | .img-circle { 52 | .border-radius(500px); // crank the border-radius so it works with most reasonably sized images 53 | } 54 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/thumbnails.less: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files 7 | 8 | // Make wrapper ul behave like the grid 9 | .thumbnails { 10 | margin-left: -@gridGutterWidth; 11 | list-style: none; 12 | .clearfix(); 13 | } 14 | // Fluid rows have no left margin 15 | .row-fluid .thumbnails { 16 | margin-left: 0; 17 | } 18 | 19 | // Float li to make thumbnails appear in a row 20 | .thumbnails > li { 21 | float: left; // Explicity set the float since we don't require .span* classes 22 | margin-bottom: @baseLineHeight; 23 | margin-left: @gridGutterWidth; 24 | } 25 | 26 | // The actual thumbnail (can be `a` or `div`) 27 | .thumbnail { 28 | display: block; 29 | padding: 4px; 30 | line-height: @baseLineHeight; 31 | border: 1px solid #ddd; 32 | .border-radius(@baseBorderRadius); 33 | .box-shadow(0 1px 3px rgba(0,0,0,.055)); 34 | .transition(all .2s ease-in-out); 35 | } 36 | // Add a hover/focus state for linked versions only 37 | a.thumbnail:hover, 38 | a.thumbnail:focus { 39 | border-color: @linkColor; 40 | .box-shadow(0 1px 4px rgba(0,105,214,.25)); 41 | } 42 | 43 | // Images and captions 44 | .thumbnail > img { 45 | display: block; 46 | max-width: 100%; 47 | margin-left: auto; 48 | margin-right: auto; 49 | } 50 | .thumbnail .caption { 51 | padding: 9px; 52 | color: @gray; 53 | } 54 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/tooltip.less: -------------------------------------------------------------------------------- 1 | // 2 | // Tooltips 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .tooltip { 8 | position: absolute; 9 | z-index: @zindexTooltip; 10 | display: block; 11 | visibility: visible; 12 | font-size: 11px; 13 | line-height: 1.4; 14 | .opacity(0); 15 | &.in { .opacity(80); } 16 | &.top { margin-top: -3px; padding: 5px 0; } 17 | &.right { margin-left: 3px; padding: 0 5px; } 18 | &.bottom { margin-top: 3px; padding: 5px 0; } 19 | &.left { margin-left: -3px; padding: 0 5px; } 20 | } 21 | 22 | // Wrapper for the tooltip content 23 | .tooltip-inner { 24 | max-width: 200px; 25 | padding: 8px; 26 | color: @tooltipColor; 27 | text-align: center; 28 | text-decoration: none; 29 | background-color: @tooltipBackground; 30 | .border-radius(@baseBorderRadius); 31 | } 32 | 33 | // Arrows 34 | .tooltip-arrow { 35 | position: absolute; 36 | width: 0; 37 | height: 0; 38 | border-color: transparent; 39 | border-style: solid; 40 | } 41 | .tooltip { 42 | &.top .tooltip-arrow { 43 | bottom: 0; 44 | left: 50%; 45 | margin-left: -@tooltipArrowWidth; 46 | border-width: @tooltipArrowWidth @tooltipArrowWidth 0; 47 | border-top-color: @tooltipArrowColor; 48 | } 49 | &.right .tooltip-arrow { 50 | top: 50%; 51 | left: 0; 52 | margin-top: -@tooltipArrowWidth; 53 | border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0; 54 | border-right-color: @tooltipArrowColor; 55 | } 56 | &.left .tooltip-arrow { 57 | top: 50%; 58 | right: 0; 59 | margin-top: -@tooltipArrowWidth; 60 | border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth; 61 | border-left-color: @tooltipArrowColor; 62 | } 63 | &.bottom .tooltip-arrow { 64 | top: 0; 65 | left: 50%; 66 | margin-left: -@tooltipArrowWidth; 67 | border-width: 0 @tooltipArrowWidth @tooltipArrowWidth; 68 | border-bottom-color: @tooltipArrowColor; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // Quick floats 7 | .pull-right { 8 | float: right; 9 | } 10 | .pull-left { 11 | float: left; 12 | } 13 | 14 | // Toggling content 15 | .hide { 16 | display: none; 17 | } 18 | .show { 19 | display: block; 20 | } 21 | 22 | // Visibility 23 | .invisible { 24 | visibility: hidden; 25 | } 26 | 27 | // For Affix plugin 28 | .affix { 29 | position: fixed; 30 | } 31 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/less/wells.less: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: @wellBackground; 12 | border: 1px solid darken(@wellBackground, 7%); 13 | .border-radius(@baseBorderRadius); 14 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0,0,0,.15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-large { 23 | padding: 24px; 24 | .border-radius(@borderRadiusLarge); 25 | } 26 | .well-small { 27 | padding: 9px; 28 | .border-radius(@borderRadiusSmall); 29 | } 30 | -------------------------------------------------------------------------------- /app/static/css/Bootstrap/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap" 3 | , "description": "Sleek, intuitive, and powerful front-end framework for faster and easier web development." 4 | , "version": "2.3.0" 5 | , "keywords": ["bootstrap", "css"] 6 | , "homepage": "http://twitter.github.com/bootstrap/" 7 | , "author": "Twitter Inc." 8 | , "scripts": { "test": "make test" } 9 | , "repository": { 10 | "type": "git" 11 | , "url": "https://github.com/twitter/bootstrap.git" 12 | } 13 | , "licenses": [ 14 | { 15 | "type": "Apache-2.0" 16 | , "url": "http://www.apache.org/licenses/LICENSE-2.0" 17 | } 18 | ] 19 | , "devDependencies": { 20 | "uglify-js": "1.3.4" 21 | , "jshint": "0.9.1" 22 | , "recess": "1.1.6" 23 | , "connect": "2.1.3" 24 | , "hogan.js": "2.0.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/static/css/style.css: -------------------------------------------------------------------------------- 1 | body { font-family: sans-serif; background: #eee; } 2 | a, h1, h2 { color: black; } 3 | h1, h2 { font-family: 'Georgia', serif; margin: 0; } 4 | h1 { border-bottom: 2px solid #eee; } 5 | h2 { font-size: 1.2em; } 6 | 7 | .page { margin: 2em auto; width: 70em; border: 5px solid #ccc; 8 | padding: 0.8em; background: white; } 9 | .entries { list-style: none; margin: 0; padding: 0; } 10 | .entries li { margin: 0.8em 1.2em; } 11 | .entries li h2 { margin-left: -1em; } 12 | .add-entry { font-size: 0.9em; border-bottom: 1px solid #ccc; } 13 | .add-entry dl { font-weight: bold; } 14 | .del-entry { font-size: 0.9em; border-bottom: 1px solid #ccc; } 15 | .del-entry dl { font-weight: bold; } 16 | .metanav { text-align: right; font-size: 0.8em; padding: 0.3em; 17 | margin-bottom: 1em; background: #fafafa; } 18 | .flash { background: #CEE5F5; padding: 0.5em; 19 | border: 1px solid #AACBE2; } 20 | .error { background: #F0D6D6; padding: 0.5em; } 21 | -------------------------------------------------------------------------------- /app/static/js/readmore.js: -------------------------------------------------------------------------------- 1 | $(document).on("click", ".unsubcribe", function () { 2 | var feedName= $(this).data('id'); 3 | $(".modal-body #feedName").val(feedName); 4 | $(".modal-body #unsubcribe_confirm").text('Do you really want to unsubcribe '+feedName+' ?'); 5 | }); 6 | 7 | $(function(){ 8 | $('[rel=star]').tooltip() 9 | }); 10 | 11 | -------------------------------------------------------------------------------- /app/tags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/tags/__init__.py -------------------------------------------------------------------------------- /app/tags/tag.py: -------------------------------------------------------------------------------- 1 | from flask import Blueprint, request, render_template, flash, g, session, redirect, url_for 2 | 3 | from app import db 4 | from app.users.models import User 5 | 6 | def load_user(): 7 | g.user = None 8 | if 'user_id' in session: 9 | g.user = User.query.get(session['user_id']); 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/templates/404.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/templates/404.html -------------------------------------------------------------------------------- /app/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% block title %}PyRSSReader{% endblock %} 4 | {% block css %} 5 | 6 | 7 | 8 | {% endblock %} 9 | {% block script %} 10 | 11 | 12 | 13 | 14 | 15 | {% endblock %} 16 | 17 | 18 |
    19 | 22 |
    {% block metanav%}{% endblock %}
    23 |
    24 |
    25 | {% for category, msg in get_flashed_messages(with_categories=true) %} 26 |
    {{ msg }}
    27 | {% endfor %} 28 |
    29 |
    30 |
    {% block content %}{% endblock%}
    31 | 32 |
    33 | 34 | 35 | -------------------------------------------------------------------------------- /app/templates/facebook/register.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 | {% from "forms/macros.html" import render_field %} 4 |
    5 |
    6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {% if facebook %} 14 | {% for f in facebook %} 15 | {% if graph %} 16 | 17 | 18 | 24 | {% else %} 25 | 26 | 27 | {% endif %} 28 | {% endfor %} 29 | {% endif %} 30 |
    Facebook ID 19 | 20 | {{f.getFacebookID()}} 21 |     22 | "{{graph.get('me/feed')['data'][0]['story']}}" 23 | {{f.getFacebookID()}}
    31 |
    32 |
    33 | 34 |
    35 |
    36 | 37 | 40 |
    41 | 42 |
    43 |
    44 |
    45 | {% endblock %} 46 | 47 | {% block metanav%} 48 | Profile 49 |     50 | Logout 51 | {% endblock %} 52 | -------------------------------------------------------------------------------- /app/templates/forms/macros.html: -------------------------------------------------------------------------------- 1 | {% macro render_field(field) %} 2 |
    3 | {{ field.label(class="control-label")}} 4 |
    5 | {% if field.errors %} 6 | {% set css_class = 'has_error ' + kwargs.pop('class', '') %} 7 | {{ field(class=css_class, **kwargs) }} 8 |
      {% for error in field.errors %}
    • {{ error|e }}
    • {% endfor %}
    9 | {% else %} 10 | {{ field(**kwargs) }} 11 | {% endif %} 12 |
    13 |
    14 | {% endmacro %} 15 | -------------------------------------------------------------------------------- /app/templates/tmp/0J99K|T:blu-ray|D:137056106: -------------------------------------------------------------------------------- 1 |
    Iron Man 3 (Two-Disc Blu-ray / DVD + Digital Copy)
    Iron Man 3 (Two-Disc Blu-ray / DVD + Digital Copy) (Blu-ray)
    By Robert Downey Jr.

    Buy new: $31.49

    First tagged "blu-ray" by Mike S.
    Customer tags: adventure(2), robert downey jr, action, science fiction, marvel movies, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/1NPSM|T:blu-ray|D:136996920: -------------------------------------------------------------------------------- 1 |
    Invasion of the Body Snatchers [Blu-ray]
    Invasion of the Body Snatchers [Blu-ray] (Blu-ray)
    By Kevin McCarthy

    Buy new: $19.99
    26 used and new from $17.92
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: film noir(2), sam peckinpah(2), psychotronic(2), carolyn jones(2), don siegel(2), science fiction(2), kevin mccarthy, mystery, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/1RDIU|T:blu-ray|D:137030764: -------------------------------------------------------------------------------- 1 |
    Spice & Wolf: Complete Series (Blu-ray/DVD Combo)
    Spice & Wolf: Complete Series (Blu-ray/DVD Combo) (Blu-ray)
    By Jun Fukuyama

    Buy new: $29.49
    Customer Rating: 3.7

    First tagged "blu-ray" by Brian C Sachs
    Customer tags: anime(6), funimation(6), spice and wolf(5), holo(2), exalted inspiration(2), anime blu-ray(2), funimation entertainment, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/69XB8|T:blu-ray|D:137056108: -------------------------------------------------------------------------------- 1 |
    Hansel & Gretel: Witch Hunters, Unrated Cut (Blu-ray 3D / Blu-ray / DVD / Digital Copy + UltraViolet)
    Hansel & Gretel: Witch Hunters, Unrated Cut (Blu-ray 3D / Blu-ray / DVD / Digital Copy + UltraViolet) (Blu-ray)
    By Jeremy Renner

    Buy new: $26.99
    15 used and new from $21.93
    Customer Rating: 3.7

    First tagged "blu-ray" by Mike S.
    Customer tags: dvds i own, movie, adventure, horror, action, jeremy renner, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/AII4E|T:blu-ray|D:137107559: -------------------------------------------------------------------------------- 1 |
    G.I. Joe: Retaliation (Blu-ray / DVD / Digital Copy +UltraViolet)
    G.I. Joe: Retaliation (Blu-ray / DVD / Digital Copy +UltraViolet) (Blu-ray)
    By Channing Tatum

    Buy new: $19.99

    First tagged "blu-ray" by Mike S.
    Customer tags: action(2), the rock(2), gi joe(2), channing tatum, bruce willis, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/AQD8G|T:blu-ray|D:137010051: -------------------------------------------------------------------------------- 1 |
    Superman: Unbound [Blu-ray]
    Superman: Unbound [Blu-ray] (Blu-ray)
    By Matt Bomer

    Buy new: $17.32
    19 used and new from $14.02
    Customer Rating: 3.7

    First tagged "blu-ray" by
    Customer tags: superman(3), blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/DD22U|T:blu-ray|D:137056105: -------------------------------------------------------------------------------- 1 |
    The Big Bang Theory: The Complete Sixth Season [Blu-ray]
    The Big Bang Theory: The Complete Sixth Season [Blu-ray] (Blu-ray)
    By Johnny Galecki

    Buy new: $38.49

    First tagged "blu-ray" by Mike S.
    Customer tags: comedy, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/GLD9S|T:blu-ray|D:137189474: -------------------------------------------------------------------------------- 1 |
    At Long Last Love '75 [Blu-ray]
    At Long Last Love '75 [Blu-ray] (Blu-ray)

    Buy new: $19.99
    Customer Rating: 3.7

    First tagged "blu-ray" by Plant In The Dark
    Customer tags: blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/IMY3O|T:blu-ray|D:137253211: -------------------------------------------------------------------------------- 1 |
    Hannibal [Blu-ray]
    Hannibal [Blu-ray] (Blu-ray)
    By Hugh Dancy

    Buy new: $35.97

    First tagged "blu-ray" by Mike S.
    Customer tags: thriller, drama, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/JQEFS|T:blu-ray|D:137038856: -------------------------------------------------------------------------------- 1 |
    Midway [Blu-ray]
    Midway [Blu-ray] (Blu-ray)
    By Charlton Heston

    Buy new: $14.93
    6 used and new from $12.40
    Customer Rating: 3.7

    First tagged "blu-ray" by Rick Lane
    Customer tags: james coburn, henry fonda, charlton heston, world war ii, robert wagner, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/KHG06|T:blu-ray|D:136996921: -------------------------------------------------------------------------------- 1 |
    Night of the Demons 2 [Blu-ray]
    Night of the Demons 2 [Blu-ray] (Blu-ray)
    By Cristi Harris

    Buy new: $22.28
    29 used and new from $19.11
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: movie, horror, cristi harris, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/N92W2|T:blu-ray|D:137253212: -------------------------------------------------------------------------------- 1 |
    Black Rock [Blu-ray]
    Black Rock [Blu-ray] (Blu-ray)
    By Bosworth

    Buy new: $18.83

    First tagged "blu-ray" by Mike S.
    Customer tags: bosworth, thriller, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/O5960|T:blu-ray|D:136996922: -------------------------------------------------------------------------------- 1 |
    Resident Evil: Retribution (+ UltraViolet Digital Copy) [Blu-ray]
    Resident Evil: Retribution (+ UltraViolet Digital Copy) [Blu-ray] (Blu-ray)
    By Milla Jovovich

    Buy new: $14.49
    113 used and new from $4.56
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: movie, adventure, milla jovovich, action, like 2, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/O89K6|T:blu-ray|D:137056103: -------------------------------------------------------------------------------- 1 |
    House: Season Eight (Blu-ray + UltraViolet)
    House: Season Eight (Blu-ray + UltraViolet) (Blu-ray)
    By Hugh Laurie

    Buy new: $28.50
    35 used and new from $19.66
    Customer Rating: 3.7

    First tagged "blu-ray" by Mike S.
    Customer tags: hugh laurie(2), drama, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/QX48C|T:blu-ray|D:136996921: -------------------------------------------------------------------------------- 1 |
    Fear [Blu-ray]
    Fear [Blu-ray] (Blu-ray)
    By Mark Wahlberg

    Buy new: $14.99
    25 used and new from $10.75
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: thriller(3), horror(2), mark wahlberg(2), drama(2), suspense, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/S04VQ|T:blu-ray|D:137056157: -------------------------------------------------------------------------------- 1 |
    Centre Stage
    Centre Stage (Blu-ray)
    By Man Yuk Maggie Cheung

    3 used and new from $23.48
    Customer Rating: 3.7

    First tagged "blu-ray" by Robert Moore "Rob C. Moore"
    Customer tags: movie(2), criterion collection, man yuk maggie cheung, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/S0W8O|T:blu-ray|D:136996937: -------------------------------------------------------------------------------- 1 |
    Planes Trains & Automobiles [Blu-ray]
    Planes Trains & Automobiles [Blu-ray] (Blu-ray)

    Buy new: $44.54
    22 used and new from $8.93
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: movie, comedy, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/Z3AMW|T:blu-ray|D:136996929: -------------------------------------------------------------------------------- 1 |
    Halloween 5: The Revenge of Michael Myers [Blu-ray]
    Halloween 5: The Revenge of Michael Myers [Blu-ray] (Blu-ray)
    By Donald Pleasence

    Buy new: $14.84
    35 used and new from $8.62
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: mystery, donald pleasence, horror, thriller, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5957850: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5961205: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5961785: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5962903: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5962933: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5962954: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964071: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964173: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964327: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964377: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964491: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964508: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964515: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964573: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964665: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964773: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964816: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964853: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964877: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5964962: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5965081: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5965220: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5965242: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5965304: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5965351: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5965367: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5965517: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5965594: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5965598: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/_news.ycombinator.com_5965618: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10422964: -------------------------------------------------------------------------------- 1 |

    2 | Ultimately, 3 | you can't stop somebody from ignoring the words 4 | Confidential at the top of a document and 5 | 6 | whipping out a digital camera 7 | and taking a picture of the screen. 8 | But at least 9 | starting in Windows 7 10 | you can make it a little more difficult. 11 |

    12 |

    13 | Take our 14 | 15 | scratch program 16 | and add this one line: 17 |

    18 |
    19 |     ...
    20 |     SetWindowDisplayAffinity(hwnd, WDA_MONITOR);
    21 |     ShowWindow(hwnd, nShowCmd);
    22 |     ...
    23 | 
    24 |

    25 | Assuming you have the Desktop Window Manager enabled, 26 | you will find that 27 | attempting to capture our scratch program in a screenshot 28 | or via the Snipping Tool 29 | will result in black pixels. 30 |

    31 |

    32 | Remember, this is just an obstacle, not a security measure. 33 | If somebody is determined to get the pixels, 34 | this step is only going to slow them down a little. 35 | (For example, 36 | on Windows 7, they can simply disable the Desktop Window Manager.) 37 | But it's handy for reducing the likelihood of an accidental 38 | breach of confidential information. 39 |

    40 |

    41 | Pre-emptive hate: 42 | "DRM is evil!" 43 | My response to you: If you don't like DRM, 44 | then don't buy DRM-protected content. 45 | If you don't like IRM, 46 | then don't read IRM-protected documents. 47 | If you don't like Blu-Ray, 48 | then don't buy Blu-Ray DVDs. 49 |

    50 |
    -------------------------------------------------------------------------------- /app/templates/tmp/blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10422965: -------------------------------------------------------------------------------- 1 |

    2 | One night, the CD player got stuck due to a scratched disc 3 | and ended up repeating 4 | the same track over and over again. 5 | I dreamed that the song was O(n²) 6 | in length,¹ 7 | with each new verse one bar longer than the previous one, 8 | but unlike a 9 | 10 | cumulative song,² 11 | the location of the inserted bar varied randomly from verse to verse. 12 |

    13 |

    14 | Moral of the story: 15 | Don't use CDs that skip for falling-asleep music. 16 |

    17 |

    18 | ¹ Also known as 19 | O(√n) in 20 | 21 | complexity. 22 |

    23 |

    24 | ² "However, the last two lines of every stanza 25 | starting from the second stanza onwards 26 | except for the last stanza and the last four lines 27 | of the last stanza do not match with the lyrics." 28 | Dear Wikipedia: Could you try making even less sense? 29 |

    30 |
    -------------------------------------------------------------------------------- /app/templates/tmp/blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424663: -------------------------------------------------------------------------------- 1 |

    2 | I dreamed that 3 | Swedish had separate third-person-plural pronouns based on gender. 4 | They were formed from 5 | han 6 | and 7 | hon 8 | by adding a common suffix, 9 | but the pattern broke down for 10 | det, 11 | and I got stuck trying to finish a sentence without knowing the correct word. 12 |

    13 |

    14 | I was able to escape from this embarrassing situation by using 15 | a technique available only in dreams: 16 | I woke up. 17 |

    18 |
    -------------------------------------------------------------------------------- /app/templates/tmp/blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426276: -------------------------------------------------------------------------------- 1 |

    2 | I dreamed that I was playing doubles tennis. 3 | My partner was Boris Becker. 4 | Our opponents were the Queen of England and a policeman on a horse. 5 | The horse served his horseshoe, 6 | which I returned poorly. 7 | As the horseshoe bounced across the ground, 8 | it made huge divots. 9 | The game was called due to poor ground conditions. 10 |

    11 |

    12 | The Queen played a game with the crowd by pretending to sit down 13 | (allowing everybody to sit), 14 | then faking them out and standing (making everybody stand up again). 15 |

    16 |
    -------------------------------------------------------------------------------- /app/templates/tmp/blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426545: -------------------------------------------------------------------------------- 1 |

    2 | If you hang out with designers, you may hear the word 3 | family used as a verb, usually with the adverb well. 4 |

    5 |
    6 | The old icons now look dated and do not 7 | family well with the Web site. 8 |
    9 |
    10 | We renamed the feature from Auto Shape to Instant Shape 11 | so that it families well with other features like 12 | Instant Color. 13 |
    14 |
    15 | The authenticity certificate on the side of the box should 16 | family well with the design on the front of the box. 17 |
    18 |

    19 | From context, it appears that to family well basically 20 | means 21 | to be harmonious or consistent with. 22 |

    23 |
    -------------------------------------------------------------------------------- /app/templates/tmp/blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428001: -------------------------------------------------------------------------------- 1 |

    2 | Today's Little Program draws content at a fixed screen position. 3 | The idea is that the window is really a viewport into some magical 4 | world. 5 | Unfortunately, our magical world just has a sign that says 6 | "Booga booga." 7 | Creating a more interesting magical world is left as an exercise. 8 |

    9 |

    10 | Start with our 11 | 12 | scratch program 13 | and make these changes: 14 |

    15 |
    16 | void OnMove(HWND hwnd, int x, int y)
    17 | {
    18 |  InvalidateRect(hwnd, 0, TRUE);
    19 | }
    20 | 
    21 | void
    22 | PaintContent(HWND hwnd, PAINTSTRUCT *pps)
    23 | {
    24 |  POINT ptOrigin = { 0, 0 };
    25 |  ClientToScreen(hwnd, &ptOrigin);
    26 |  POINT ptOrg;
    27 |  SetWindowOrgEx(pps->hdc, ptOrigin.x, ptOrigin.y, &ptOrg);
    28 |  TextOut(pps->hdc, 200, 200, TEXT("Booga booga"), 11);
    29 |  SetWindowOrgEx(pps->hdc, ptOrg.x, ptOrg.y, nullptr);
    30 | }
    31 | 
    32 |     HANDLE_MSG(hwnd, WM_MOVE, OnMove);
    33 | 
    34 |

    35 | Run this program and drag the window across the screen. 36 | When it reaches the "magic place", 37 | you will see the words "Booga booga". 38 | (You can resize the window to be smaller in order to make 39 | finding the magic place more of a challenge.) 40 |

    41 |
    -------------------------------------------------------------------------------- /app/templates/tmp/blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428002: -------------------------------------------------------------------------------- 1 |

    2 | I dreamed that I finished biking home and decided not to take 3 | the stairs. Instead I took my bicycle into the elevator 4 | to go to my dream-land 31st-floor high-rise condo. 5 | (As if.) 6 |

    7 |

    8 | For "security reasons" there were no buttons in the 9 | elevator. You had to open a secret panel and flip a 10 | circuit-breaker switch corresponding to the floor you want 11 | to go to. If you open the wrong panel, you are instead 12 | faced with a stack of hot-swappable SATA drives with labels 13 | like "Windows 95" and "Windows 95 OSR 2". 14 | And yes, I know that SATA didn't exist in 1995. 15 |

    16 |
    -------------------------------------------------------------------------------- /app/templates/tmp/blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428357: -------------------------------------------------------------------------------- 1 |

    2 | Commenter BAA says that 3 | 4 | the -lett part of Marlett comes from the designer Virginia Howlett. 5 | BAA adds, "I forget the 'Mar' but I believe it was a co-creator." 6 |

    7 |

    8 | If so, then that co-creator was Suzan Marashi, 9 | if 10 | Vincent Connare is to be trusted. 11 | On page 17 of the PDF document 12 | From The Dark Side..., 13 | Connare identifies the authors of the font as 14 | Virginia Howlett, Rom Impas, Suzan Marashi, and Alison Grauman-Barnes. 15 | He also identifies Eliyezer Kohen as the person whose idea it was 16 | to use a special-purpose font. 17 |

    18 |

    19 | According to Virginia Howlett, 20 | the original name for the font Verdana was 21 | 22 | Ventana, 23 | which means window in Spanish. 24 | Lawyers apparently objected to the name, 25 | and the font team explored variations on 26 | verde (which means green in Spanish) 27 | and 28 | verdigris (a green pigment), 29 | thereby invoking the color associated both with Washington 30 | (The Evergreen State) 31 | and Seattle 32 | (The Emerald City). 33 | The second part of the font name comes from Howlett's granddaughter Ana, 34 | following in the tradition of font designers naming fonts after their 35 | daughters. 36 |

    37 |
    -------------------------------------------------------------------------------- /app/templates/tmp/blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428730: -------------------------------------------------------------------------------- 1 |

    2 | A customer put the following code at the start of their program: 3 |

    4 |
     5 | // If this assertion fires, then somebody else changed the error mode
     6 | // and I just overwrote it with my error mode.
     7 | ASSERT(SetErrorMode(SEM_FAILCRITICALERRORS) == 0);
     8 | 
    9 |

    10 | The customer wanted to know whether it was a valid assumption 11 | that the initial error mode for a process is zero. 12 |

    13 |

    14 | No it is not, and this is called out in the documentation for 15 | 16 | Set­Error­Mode: 17 |

    18 |
    19 |

    20 | Remarks 21 |

    22 |

    23 | Each process has an associated error mode that indicates 24 | to the system how the application is going to respond to serious errors. 25 | 26 | A child process inherits the error mode of its parent process. 27 |

    28 |
    29 |

    30 | The assumption that the initial error mode is zero is therefore false. 31 |

    32 |

    33 | There's another error in the above code: 34 | The call to 35 | Set­Error­Mode is placed inside an assertion. 36 | This means that in the retail build, the call disappears. 37 | The debug build has the error mode set to 38 | SEM_FAIL­CRITICAL­ERRORS, 39 | but the retail build has the default error mode. 40 | They are 41 | 42 | changing the semantics in the debug build, 43 | and are headed down the slippery slope that leads to them being forced 44 | to deploy the debug version of the program into production 45 | because that's the only build that works. 46 |

    47 |

    48 | Unfortunately, they may have already reached that point, 49 | because the customer asked, 50 | "Is it possible for the user to set the default error 51 | code to something other than zero, 52 | in which case this assertion would crash the client?" 53 | (Emphasis mine.) 54 |

    55 |

    56 | Bonus chatter: 57 | Note that you can override error mode inheritance 58 | by passing the 59 | CREATE_DEFAULT_ERROR_MODE 60 | flag to the Create­Process function. 61 |

    62 |
    -------------------------------------------------------------------------------- /app/templates/tmp/dir.yahoo.com_rss_dir_98128545: -------------------------------------------------------------------------------- 1 | Offers colonial and early American history including the American Revolution, French and Indian War, Pirates, Slavery, War of 1812, Lewis and Clark. Features news, books, magazines, posters, videos, and historical content.
    More Sites about U.S. History
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_0J99K|T:blu-ray|D:137056106: -------------------------------------------------------------------------------- 1 |
    Iron Man 3 (Two-Disc Blu-ray / DVD + Digital Copy)
    Iron Man 3 (Two-Disc Blu-ray / DVD + Digital Copy) (Blu-ray)
    By Robert Downey Jr.

    Buy new: $31.49

    First tagged "blu-ray" by Mike S.
    Customer tags: adventure(2), robert downey jr, action, science fiction, marvel movies, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_1NPSM|T:blu-ray|D:136996920: -------------------------------------------------------------------------------- 1 |
    Invasion of the Body Snatchers [Blu-ray]
    Invasion of the Body Snatchers [Blu-ray] (Blu-ray)
    By Kevin McCarthy

    Buy new: $19.99
    26 used and new from $17.87
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: film noir(2), sam peckinpah(2), psychotronic(2), carolyn jones(2), don siegel(2), science fiction(2), kevin mccarthy, mystery, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_1RDIU|T:blu-ray|D:137030764: -------------------------------------------------------------------------------- 1 |
    Spice & Wolf: Complete Series (Blu-ray/DVD Combo)
    Spice & Wolf: Complete Series (Blu-ray/DVD Combo) (Blu-ray)
    By Jun Fukuyama

    Buy new: $29.49
    Customer Rating: 3.7

    First tagged "blu-ray" by Brian C Sachs
    Customer tags: anime(6), funimation(6), spice and wolf(5), holo(2), exalted inspiration(2), anime blu-ray(2), funimation entertainment, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_69XB8|T:blu-ray|D:137056108: -------------------------------------------------------------------------------- 1 |
    Hansel & Gretel: Witch Hunters, Unrated Cut (Blu-ray 3D / Blu-ray / DVD / Digital Copy + UltraViolet)
    Hansel & Gretel: Witch Hunters, Unrated Cut (Blu-ray 3D / Blu-ray / DVD / Digital Copy + UltraViolet) (Blu-ray)
    By Jeremy Renner

    Buy new: $26.99
    15 used and new from $21.93
    Customer Rating: 3.7

    First tagged "blu-ray" by Mike S.
    Customer tags: dvds i own, movie, adventure, horror, action, jeremy renner, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_AII4E|T:blu-ray|D:137107559: -------------------------------------------------------------------------------- 1 |
    G.I. Joe: Retaliation (Blu-ray / DVD / Digital Copy +UltraViolet)
    G.I. Joe: Retaliation (Blu-ray / DVD / Digital Copy +UltraViolet) (Blu-ray)
    By Channing Tatum

    Buy new: $19.99

    First tagged "blu-ray" by Mike S.
    Customer tags: action(2), the rock(2), gi joe(2), channing tatum, bruce willis, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_AQD8G|T:blu-ray|D:137010051: -------------------------------------------------------------------------------- 1 |
    Superman: Unbound [Blu-ray]
    Superman: Unbound [Blu-ray] (Blu-ray)
    By Matt Bomer

    Buy new: $17.32
    19 used and new from $14.02
    Customer Rating: 3.7

    First tagged "blu-ray" by
    Customer tags: superman(3), blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_DD22U|T:blu-ray|D:137056105: -------------------------------------------------------------------------------- 1 |
    The Big Bang Theory: The Complete Sixth Season [Blu-ray]
    The Big Bang Theory: The Complete Sixth Season [Blu-ray] (Blu-ray)
    By Johnny Galecki

    Buy new: $38.49

    First tagged "blu-ray" by Mike S.
    Customer tags: comedy, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_GLD9S|T:blu-ray|D:137189474: -------------------------------------------------------------------------------- 1 |
    At Long Last Love '75 [Blu-ray]
    At Long Last Love '75 [Blu-ray] (Blu-ray)

    Buy new: $19.99
    Customer Rating: 3.7

    First tagged "blu-ray" by Plant In The Dark
    Customer tags: blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_IMY3O|T:blu-ray|D:137253211: -------------------------------------------------------------------------------- 1 |
    Hannibal [Blu-ray]
    Hannibal [Blu-ray] (Blu-ray)
    By Hugh Dancy

    Buy new: $35.97

    First tagged "blu-ray" by Mike S.
    Customer tags: thriller, drama, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_JQEFS|T:blu-ray|D:137038856: -------------------------------------------------------------------------------- 1 |
    Midway [Blu-ray]
    Midway [Blu-ray] (Blu-ray)
    By Charlton Heston

    Buy new: $14.93
    6 used and new from $12.40
    Customer Rating: 3.7

    First tagged "blu-ray" by Rick Lane
    Customer tags: james coburn, henry fonda, charlton heston, world war ii, robert wagner, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_KHG06|T:blu-ray|D:136996921: -------------------------------------------------------------------------------- 1 |
    Night of the Demons 2 [Blu-ray]
    Night of the Demons 2 [Blu-ray] (Blu-ray)
    By Cristi Harris

    Buy new: $22.28
    29 used and new from $19.24
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: movie, horror, cristi harris, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_N92W2|T:blu-ray|D:137253212: -------------------------------------------------------------------------------- 1 |
    Black Rock [Blu-ray]
    Black Rock [Blu-ray] (Blu-ray)
    By Bosworth

    Buy new: $18.83

    First tagged "blu-ray" by Mike S.
    Customer tags: bosworth, thriller, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_O5960|T:blu-ray|D:136996922: -------------------------------------------------------------------------------- 1 |
    Resident Evil: Retribution (+ UltraViolet Digital Copy) [Blu-ray]
    Resident Evil: Retribution (+ UltraViolet Digital Copy) [Blu-ray] (Blu-ray)
    By Milla Jovovich

    Buy new: $14.49
    113 used and new from $4.56
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: movie, adventure, milla jovovich, action, like 2, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_O89K6|T:blu-ray|D:137056103: -------------------------------------------------------------------------------- 1 |
    House: Season Eight (Blu-ray + UltraViolet)
    House: Season Eight (Blu-ray + UltraViolet) (Blu-ray)
    By Hugh Laurie

    Buy new: $27.93
    36 used and new from $19.66
    Customer Rating: 3.7

    First tagged "blu-ray" by Mike S.
    Customer tags: hugh laurie(2), drama, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_QX48C|T:blu-ray|D:136996921: -------------------------------------------------------------------------------- 1 |
    Fear [Blu-ray]
    Fear [Blu-ray] (Blu-ray)
    By Mark Wahlberg

    Buy new: $14.99
    25 used and new from $10.75
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: thriller(3), horror(2), mark wahlberg(2), drama(2), suspense, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_S04VQ|T:blu-ray|D:137056157: -------------------------------------------------------------------------------- 1 |
    Centre Stage
    Centre Stage (Blu-ray)
    By Man Yuk Maggie Cheung

    3 used and new from $23.48
    Customer Rating: 3.7

    First tagged "blu-ray" by Robert Moore "Rob C. Moore"
    Customer tags: movie(2), criterion collection, man yuk maggie cheung, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_S0W8O|T:blu-ray|D:136996937: -------------------------------------------------------------------------------- 1 |
    Planes Trains & Automobiles [Blu-ray]
    Planes Trains & Automobiles [Blu-ray] (Blu-ray)

    Buy new: $44.54
    22 used and new from $8.93
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: movie, comedy, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_Z3AMW|T:blu-ray|D:136996929: -------------------------------------------------------------------------------- 1 |
    Halloween 5: The Revenge of Michael Myers [Blu-ray]
    Halloween 5: The Revenge of Michael Myers [Blu-ray] (Blu-ray)
    By Donald Pleasence

    Buy new: $14.84
    35 used and new from $8.62
    Customer Rating: 3.7

    First tagged "blu-ray" by mikeg199100
    Customer tags: mystery, donald pleasence, horror, thriller, blu-ray
    -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5957850: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5961205: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5961785: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5962903: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5962933: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5962954: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5963448: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964027: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964071: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964173: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964327: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964377: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964456: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964491: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964508: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964515: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964573: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964665: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964769: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964773: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964816: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964853: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964877: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5964962: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965081: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965109: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965220: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965242: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965292: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965298: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965304: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965351: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965367: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965370: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965466: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965471: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965502: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965517: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965594: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965598: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965618: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965635: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965657: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965671: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965673: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965682: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965691: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965700: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965709: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum__news.ycombinator.com_5965743: -------------------------------------------------------------------------------- 1 | Comments -------------------------------------------------------------------------------- /app/templates/tmp/sum_blog.asmartbear.com_?p=1152: -------------------------------------------------------------------------------- 1 | All founders define their business as being "better" than the encumbents. But most don't say anything beyond that. Being specific about "better" leads to the good stuff. -------------------------------------------------------------------------------- /app/templates/tmp/sum_blog.asmartbear.com_?p=1154: -------------------------------------------------------------------------------- 1 | This is part of an ongoing startup advice series where I answer (anonymized!) questions from readers, like a written version of Smart Bear Live. To get your question answered, email me at asmartbear -at- shortmail -dot- com.Frustrated Engineer writes: I’ve been writing code for ten years, recently promoted to a position where I have to... -------------------------------------------------------------------------------- /app/templates/tmp/sum_blog.asmartbear.com_?p=1164: -------------------------------------------------------------------------------- 1 | They told me I couldn't sell to The Enterprise with a silly company name like Smart Bear. 2 | They told me I couldn't sell to The Enterprise without a human sales force using Salesforce. 3 | They told me I couldn't sell to The Enterprise over GoToMeeting, with a demo and no slides, from a geek with no webinar. 4 | They told me I couldn't sell to The Enterprise with amateur design and a small-company, human voice. -------------------------------------------------------------------------------- /app/templates/tmp/sum_blog.asmartbear.com_?p=1168: -------------------------------------------------------------------------------- 1 | The first emotion I felt after selling Smart Bear was a profound sadness. Not depression — not hopeless or rudderless — but a pure sadness, when your lungs sink into your belly, the punch-in-the-stomach of discovering your dog was hit by a car or that your dad is terminally ill. 2 | "What the fuck?" I thought, "Why am I feeling this? I'm supposed to be feel... happy? I guess? Something other than this." -------------------------------------------------------------------------------- /app/templates/tmp/sum_blog.asmartbear.com_?p=1186: -------------------------------------------------------------------------------- 1 | Unfortunately, due in part to the popularity of Lean Startup and the concepts it promotes, the pivot has been bastardized to the point where it doesn't mean much to people anymore. We hear the word "pivot" and groan or shrug, knowing there's a good chance that people are using the pivot as an excuse. -------------------------------------------------------------------------------- /app/templates/tmp/sum_blog.asmartbear.com_?p=1190: -------------------------------------------------------------------------------- 1 | Seems like every third startup nowadays is using the "Freemium" business model: The lowest service tier is free, and the business is designed to get those users hooked and then upgrade to a paid plan. 2 | It can work wonderfully of course, but usually it crushes and destroys companies, not only because it costs more than anticipated but because the founders didn't realize the business model itself caused them to make incorrect decisions. -------------------------------------------------------------------------------- /app/templates/tmp/sum_blog.asmartbear.com_?p=1201: -------------------------------------------------------------------------------- 1 | When you're just getting started, and don't yet have sufficient data around conversion rates, cancellation rates, LTV or anything else, how do you determine how much you can afford to spend per click in a cost-per-click campaign? Here's a good rule of thumb. -------------------------------------------------------------------------------- /app/templates/tmp/sum_blog.asmartbear.com_?p=1225: -------------------------------------------------------------------------------- 1 | What do you do once your startup is off the ground and it's time to make a "real" investment in advertising? Should you work on optimizing AdWords since they're working, or optimizing banner ads since they're not working? Should you cut off the affiliate program since it's a waste of time, or redouble your efforts in affiliate management? Should you optimize these existing channels or try to find a new, more productive channel? -------------------------------------------------------------------------------- /app/templates/tmp/sum_blog.asmartbear.com_?p=1228: -------------------------------------------------------------------------------- 1 | Isn't entrepreneurship about having an amazing idea and building a living around it? 2 | ...yes, except every advisor and blogger admonishes "your idea sucks," you prima donna pompous asshole, so your job is to use an "idea" as a foil to find out what is actually an amazing idea and then go follow that path, whatever that might be. The only thing we're sure of is that you're wrong and you need get that fixed. 3 | ...OK, except how is that even "your company" anymore? Those are someone's else's ideas, not your idea. -------------------------------------------------------------------------------- /app/templates/tmp/sum_blog.asmartbear.com_?p=1232: -------------------------------------------------------------------------------- 1 | How you price a product can have a radical impact on the revenue you make from it. My search for the perfect pricing model resulted in an additional $50,000 (a 170% increase) in revenue. Here's how. -------------------------------------------------------------------------------- /app/templates/tmp/sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10422964: -------------------------------------------------------------------------------- 1 |

    2 | Ultimately, 3 | you can't stop somebody from ignoring the words 4 | Confidential at the top of a document and 5 | 6 | whipping out a digital camera 7 | and taking a picture of the screen. 8 | But at least 9 | starting in Windows 7 10 | you can make it a little more difficult. 11 |

    12 |

    13 | Take our 14 | 15 | scratch program 16 | and add this one line: 17 |

    18 |
    19 |     ...
    20 |     SetWindowDisplayAffinity(hwnd, WDA_MONITOR);
    21 |     ShowWindow(hwnd, nShowCmd);
    22 |     ...
    23 | 
    24 |

    25 | Assuming you have the Desktop Window Manager enabled, 26 | you will find that 27 | attempting to capture our scratch program in a screenshot 28 | or via the Snipping Tool 29 | will result in black pixels. 30 |

    31 |

    32 | Remember, this is just an obstacle, not a security measure. 33 | If somebody is determined to get the pixels, 34 | this step is only going to slow them down a little. 35 | (For example, 36 | on Windows 7, they can simply disable the Desktop Window Manager.) 37 | But it's handy for reducing the likelihood of an accidental 38 | breach of confidential information. 39 |

    40 |

    41 | Pre-emptive hate: 42 | "DRM is evil!" 43 | My response to you: If you don't like DRM, 44 | then don't buy DRM-protected content. 45 | If you don't like IRM, 46 | then don't read IRM-protected documents. 47 | If you don't like Blu-Ray, 48 | then don't buy Blu-Ray DVDs. 49 |

    50 |
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10422965: -------------------------------------------------------------------------------- 1 |

    2 | One night, the CD player got stuck due to a scratched disc 3 | and ended up repeating 4 | the same track over and over again. 5 | I dreamed that the song was O(n²) 6 | in length,¹ 7 | with each new verse one bar longer than the previous one, 8 | but unlike a 9 | 10 | cumulative song,² 11 | the location of the inserted bar varied randomly from verse to verse. 12 |

    13 |

    14 | Moral of the story: 15 | Don't use CDs that skip for falling-asleep music. 16 |

    17 |

    18 | ¹ Also known as 19 | O(√n) in 20 | 21 | complexity. 22 |

    23 |

    24 | ² "However, the last two lines of every stanza 25 | starting from the second stanza onwards 26 | except for the last stanza and the last four lines 27 | of the last stanza do not match with the lyrics." 28 | Dear Wikipedia: Could you try making even less sense? 29 |

    30 |
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10424663: -------------------------------------------------------------------------------- 1 |

    2 | I dreamed that 3 | Swedish had separate third-person-plural pronouns based on gender. 4 | They were formed from 5 | han 6 | and 7 | hon 8 | by adding a common suffix, 9 | but the pattern broke down for 10 | det, 11 | and I got stuck trying to finish a sentence without knowing the correct word. 12 |

    13 |

    14 | I was able to escape from this embarrassing situation by using 15 | a technique available only in dreams: 16 | I woke up. 17 |

    18 |
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426276: -------------------------------------------------------------------------------- 1 |

    2 | I dreamed that I was playing doubles tennis. 3 | My partner was Boris Becker. 4 | Our opponents were the Queen of England and a policeman on a horse. 5 | The horse served his horseshoe, 6 | which I returned poorly. 7 | As the horseshoe bounced across the ground, 8 | it made huge divots. 9 | The game was called due to poor ground conditions. 10 |

    11 |

    12 | The Queen played a game with the crowd by pretending to sit down 13 | (allowing everybody to sit), 14 | then faking them out and standing (making everybody stand up again). 15 |

    16 |
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10426545: -------------------------------------------------------------------------------- 1 |

    2 | If you hang out with designers, you may hear the word 3 | family used as a verb, usually with the adverb well. 4 |

    5 |
    6 | The old icons now look dated and do not 7 | family well with the Web site. 8 |
    9 |
    10 | We renamed the feature from Auto Shape to Instant Shape 11 | so that it families well with other features like 12 | Instant Color. 13 |
    14 |
    15 | The authenticity certificate on the side of the box should 16 | family well with the design on the front of the box. 17 |
    18 |

    19 | From context, it appears that to family well basically 20 | means 21 | to be harmonious or consistent with. 22 |

    23 |
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428001: -------------------------------------------------------------------------------- 1 |

    2 | Today's Little Program draws content at a fixed screen position. 3 | The idea is that the window is really a viewport into some magical 4 | world. 5 | Unfortunately, our magical world just has a sign that says 6 | "Booga booga." 7 | Creating a more interesting magical world is left as an exercise. 8 |

    9 |

    10 | Start with our 11 | 12 | scratch program 13 | and make these changes: 14 |

    15 |
    16 | void OnMove(HWND hwnd, int x, int y)
    17 | {
    18 |  InvalidateRect(hwnd, 0, TRUE);
    19 | }
    20 | 
    21 | void
    22 | PaintContent(HWND hwnd, PAINTSTRUCT *pps)
    23 | {
    24 |  POINT ptOrigin = { 0, 0 };
    25 |  ClientToScreen(hwnd, &ptOrigin);
    26 |  POINT ptOrg;
    27 |  SetWindowOrgEx(pps->hdc, ptOrigin.x, ptOrigin.y, &ptOrg);
    28 |  TextOut(pps->hdc, 200, 200, TEXT("Booga booga"), 11);
    29 |  SetWindowOrgEx(pps->hdc, ptOrg.x, ptOrg.y, nullptr);
    30 | }
    31 | 
    32 |     HANDLE_MSG(hwnd, WM_MOVE, OnMove);
    33 | 
    34 |

    35 | Run this program and drag the window across the screen. 36 | When it reaches the "magic place", 37 | you will see the words "Booga booga". 38 | (You can resize the window to be smaller in order to make 39 | finding the magic place more of a challenge.) 40 |

    41 |
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428002: -------------------------------------------------------------------------------- 1 |

    2 | I dreamed that I finished biking home and decided not to take 3 | the stairs. Instead I took my bicycle into the elevator 4 | to go to my dream-land 31st-floor high-rise condo. 5 | (As if.) 6 |

    7 |

    8 | For "security reasons" there were no buttons in the 9 | elevator. You had to open a secret panel and flip a 10 | circuit-breaker switch corresponding to the floor you want 11 | to go to. If you open the wrong panel, you are instead 12 | faced with a stack of hot-swappable SATA drives with labels 13 | like "Windows 95" and "Windows 95 OSR 2". 14 | And yes, I know that SATA didn't exist in 1995. 15 |

    16 |
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428357: -------------------------------------------------------------------------------- 1 |

    2 | Commenter BAA says that 3 | 4 | the -lett part of Marlett comes from the designer Virginia Howlett. 5 | BAA adds, "I forget the 'Mar' but I believe it was a co-creator." 6 |

    7 |

    8 | If so, then that co-creator was Suzan Marashi, 9 | if 10 | Vincent Connare is to be trusted. 11 | On page 17 of the PDF document 12 | From The Dark Side..., 13 | Connare identifies the authors of the font as 14 | Virginia Howlett, Rom Impas, Suzan Marashi, and Alison Grauman-Barnes. 15 | He also identifies Eliyezer Kohen as the person whose idea it was 16 | to use a special-purpose font. 17 |

    18 |

    19 | According to Virginia Howlett, 20 | the original name for the font Verdana was 21 | 22 | Ventana, 23 | which means window in Spanish. 24 | Lawyers apparently objected to the name, 25 | and the font team explored variations on 26 | verde (which means green in Spanish) 27 | and 28 | verdigris (a green pigment), 29 | thereby invoking the color associated both with Washington 30 | (The Evergreen State) 31 | and Seattle 32 | (The Emerald City). 33 | The second part of the font name comes from Howlett's granddaughter Ana, 34 | following in the tradition of font designers naming fonts after their 35 | daughters. 36 |

    37 |
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_blogs.msdn.com_b_oldnewthing_91d46819-8472-40ad-a661-2c78acb4018c:10428730: -------------------------------------------------------------------------------- 1 |

    2 | A customer put the following code at the start of their program: 3 |

    4 |
     5 | // If this assertion fires, then somebody else changed the error mode
     6 | // and I just overwrote it with my error mode.
     7 | ASSERT(SetErrorMode(SEM_FAILCRITICALERRORS) == 0);
     8 | 
    9 |

    10 | The customer wanted to know whether it was a valid assumption 11 | that the initial error mode for a process is zero. 12 |

    13 |

    14 | No it is not, and this is called out in the documentation for 15 | 16 | Set­Error­Mode: 17 |

    18 |
    19 |

    20 | Remarks 21 |

    22 |

    23 | Each process has an associated error mode that indicates 24 | to the system how the application is going to respond to serious errors. 25 | 26 | A child process inherits the error mode of its parent process. 27 |

    28 |
    29 |

    30 | The assumption that the initial error mode is zero is therefore false. 31 |

    32 |

    33 | There's another error in the above code: 34 | The call to 35 | Set­Error­Mode is placed inside an assertion. 36 | This means that in the retail build, the call disappears. 37 | The debug build has the error mode set to 38 | SEM_FAIL­CRITICAL­ERRORS, 39 | but the retail build has the default error mode. 40 | They are 41 | 42 | changing the semantics in the debug build, 43 | and are headed down the slippery slope that leads to them being forced 44 | to deploy the debug version of the program into production 45 | because that's the only build that works. 46 |

    47 |

    48 | Unfortunately, they may have already reached that point, 49 | because the customer asked, 50 | "Is it possible for the user to set the default error 51 | code to something other than zero, 52 | in which case this assertion would crash the client?" 53 | (Emphasis mine.) 54 |

    55 |

    56 | Bonus chatter: 57 | Note that you can override error mode inheritance 58 | by passing the 59 | CREATE_DEFAULT_ERROR_MODE 60 | flag to the Create­Process function. 61 |

    62 |
    -------------------------------------------------------------------------------- /app/templates/tmp/sum_dir.yahoo.com_rss_dir_98128545: -------------------------------------------------------------------------------- 1 | Offers colonial and early American history including the American Revolution, French and Indian War, Pirates, Slavery, War of 1812, Lewis and Clark. Features news, books, magazines, posters, videos, and historical content.
    More Sites about U.S. History
    -------------------------------------------------------------------------------- /app/templates/twitter/register.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 | {% from "forms/macros.html" import render_field %} 4 |
    5 |
    6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {% for t in twitter%} 14 | 15 | 16 | {% if api %} 17 | 23 | {% else %} 24 | 25 | {% endif %} 26 | 27 | {% endfor %} 28 |
    Twitter ID 18 | 19 | {{t.getTwitterID()}} 20 |     21 | "{{api.me().status.text}}" 22 | {{t.getTwitterID()}}
    29 |
    30 |
    31 |
    32 | 33 |
    34 | 35 | 38 |
    39 | 40 |
    41 |
    42 |
    43 | {% endblock %} 44 | 45 | {% block metanav%} 46 | Profile 47 |     48 | Logout 49 | {% endblock %} 50 | -------------------------------------------------------------------------------- /app/templates/users/login.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 | {% from "forms/macros.html" import render_field %} 4 |
    5 |
    6 |
    7 |
    8 | {{ form.csrf_token }} 9 | {{ render_field(form.email, class="input-xlarge") }} 10 | {{ render_field(form.password, class="input-xlarge") }} 11 |
    12 | 13 |
    14 | 15 |
    16 |
    17 |
    18 |
    19 | {% endblock %} 20 | 21 | {% block metanav%} 22 | Register 23 | {% endblock %} 24 | -------------------------------------------------------------------------------- /app/templates/users/profile.html: -------------------------------------------------------------------------------- 1 | 2 | {% extends "base.html" %} 3 | 4 | {% block metanav %} 5 | Feed Home 6 |   7 | Logout 8 | {% endblock %} 9 | 10 | 11 | {% block content %} 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
    Name{{user.name}}
    Email{{user.email}}
    Password******
    Gender{{user.gender}}
    Role{{user.getRole()}}
    Status{{user.getStatus()}}
    38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | {% for f in facebook %} 47 | 48 | 49 | 50 | 51 | {% endfor %} 52 |
    FaceBook ID{{f.getFacebookID()}}
    53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | {% for t in twitter%} 62 | 63 | 64 | 65 | 66 | {% endfor %} 67 |
    Twitter ID{{t.getTwitterID()}}
    68 | 69 |
    70 |
    71 | Add a Facebook account 72 |
    73 | Add a Twitter account 74 | 75 | {% endblock %} 76 | -------------------------------------------------------------------------------- /app/templates/users/register.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 | {% from "forms/macros.html" import render_field %} 4 |
    5 |
    6 | Registration 7 |
    8 |
    9 | {{ form.csrf_token }} 10 | {{ render_field(form.name, class="input-xlarge") }} 11 | {{ render_field(form.email, class="input-xlarge") }} 12 | {{ render_field(form.password, class="input-xlarge") }} 13 | {{ render_field(form.confirm, class="input-xlarge") }} 14 | {{ render_field(form.gender) }} 15 |
    16 | {{ render_field(form.accept_tos, class="input checkbox") }} 17 |
    18 |
    19 | {{ form.recaptcha }} 20 |
    21 |
    22 |
    23 |
    24 | 25 |
    26 | 27 |
    28 |
    29 |
    30 |
    31 | {% endblock %} 32 | 33 | {% block metanav%} 34 | Login 35 | {% endblock %} 36 | -------------------------------------------------------------------------------- /app/twitter/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/twitter/__init__.py -------------------------------------------------------------------------------- /app/twitter/constants.py: -------------------------------------------------------------------------------- 1 | #Twitter 2 | #For vunhatminh.com 3 | CONSUMER_KEY = 'poZnz8OF3H1J8CyLHzSpLA' 4 | CONSUMER_SECRET = '3fr8ghDXEjqeZgCCGQHg760RjvMUYOK5w3zRmTZks' 5 | CALLBACK_URL = 'http://www.vunhatminh.com/twitter/verify' 6 | 7 | 8 | #For test localhost 9 | #Need to point abcxyz.com to 127.0.0.1 in /etc/hosts file 10 | #CONSUMER_KEY = 'CM0z5TRXdx2HwtZzq5mXww' 11 | #CONSUMER_SECRET = 'whf7UraMv3E1KtXtrPLYfJxLrWMOl21ZmE6Ec6D1c' 12 | #CALLBACK_URL = 'http://abcxyz.com:5000/twitter/verify' 13 | -------------------------------------------------------------------------------- /app/twitter/forms.py: -------------------------------------------------------------------------------- 1 | from flask.ext.wtf import Form, SelectField, TextField, PasswordField, BooleanField, RecaptchaField 2 | from flask.ext.wtf import Required, Email, EqualTo 3 | 4 | class RegisterForm(Form): 5 | twitter_id = TextField('Twitter ID', [Required()]) 6 | -------------------------------------------------------------------------------- /app/twitter/models.py: -------------------------------------------------------------------------------- 1 | from app import db 2 | 3 | class Twitter(db.Model): 4 | 5 | __tablename__ = 'twitter' 6 | id = db.Column(db.Integer, primary_key=True) 7 | twitter_id= db.Column(db.String(50), unique=True) 8 | uid = db.Column(db.Integer, db.ForeignKey('user.id')) 9 | access_token_key = db.Column(db.String(200)) 10 | access_token_secret = db.Column(db.String(200)) 11 | 12 | def __init__(self, twitter_id=None, uid=None): 13 | self.twitter_id = twitter_id 14 | self.uid = uid 15 | 16 | def getTwitterID(self): 17 | return self.twitter_id 18 | 19 | def getUserID(self): 20 | return self.uid 21 | 22 | def __repr__(self): 23 | return '' % (self.twitter_id) 24 | -------------------------------------------------------------------------------- /app/users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orakaro/PyRSSReader/a50a667127fabf77b1c023fd5844218ddf3a05fb/app/users/__init__.py -------------------------------------------------------------------------------- /app/users/constants.py: -------------------------------------------------------------------------------- 1 | # User role 2 | ADMIN= 0 3 | STAFF= 1 4 | USER= 2 5 | ROLE = { 6 | ADMIN: 'admin', 7 | STAFF: 'staff', 8 | USER: 'user', 9 | } 10 | 11 | # user status 12 | INACTIVE= 0 13 | NEW= 1 14 | ACTIVE= 2 15 | STATUS = { 16 | INACTIVE: 'inactive', 17 | NEW: 'new', 18 | ACTIVE: 'active', 19 | } 20 | -------------------------------------------------------------------------------- /app/users/decorators.py: -------------------------------------------------------------------------------- 1 | from functools import wraps 2 | 3 | from app.users.models import User 4 | from flask import g, flash, redirect, url_for, request, session 5 | 6 | def requires_login(f): 7 | @wraps(f) 8 | def decorated_function(*args, **kwargs): 9 | if g.user is None: 10 | flash(u'You need to be signed in for this page.') 11 | return redirect(url_for('users.login', next=request.path)) 12 | return f(*args, **kwargs) 13 | return decorated_function 14 | -------------------------------------------------------------------------------- /app/users/forms.py: -------------------------------------------------------------------------------- 1 | from flask.ext.wtf import Form, SelectField, TextField, PasswordField, BooleanField, RecaptchaField 2 | from flask.ext.wtf import Required, Email, EqualTo 3 | 4 | class LoginForm(Form): 5 | email = TextField('Email', [Required(), Email()]) 6 | password = PasswordField('Password', [Required()]) 7 | 8 | class RegisterForm(Form): 9 | name = TextField('Name', [Required()]) 10 | email = TextField('Email', [Required(), Email()]) 11 | password = PasswordField('Password', [Required()]) 12 | confirm = PasswordField('Confirm Password', [ 13 | Required(), 14 | EqualTo('password', message='Passwords must match') 15 | ]) 16 | accept_tos = BooleanField('I accept the TOS', [Required()]) 17 | gender = SelectField('Gender',choices = [('gender','Gender'),('male','Male'),('female','Female'),('other','Other'),('private','Private')] ) 18 | recaptcha = RecaptchaField() 19 | -------------------------------------------------------------------------------- /app/users/models.py: -------------------------------------------------------------------------------- 1 | from app import db 2 | from app.users import constants as CONST 3 | 4 | class User(db.Model): 5 | 6 | __tablename__ = 'user' 7 | id = db.Column(db.Integer, primary_key=True) 8 | name = db.Column(db.String(50), unique=True) 9 | email = db.Column(db.String(120), unique=True) 10 | password = db.Column(db.String(20)) 11 | gender = db.Column(db.String(10)) 12 | role = db.Column(db.SmallInteger, default=CONST.USER) 13 | status = db.Column(db.SmallInteger, default=CONST.NEW) 14 | facebook = db.relationship('Facebook', backref='user', lazy='dynamic') 15 | twitter = db.relationship('Twitter', backref='user', lazy='dynamic') 16 | 17 | def __init__(self, name=None, email=None, password=None, gender=None): 18 | self.name = name 19 | self.email = email 20 | self.password = password 21 | self.gender = gender 22 | 23 | def getStatus(self): 24 | return CONST.STATUS[self.status] 25 | 26 | def getRole(self): 27 | return CONST.ROLE[self.role] 28 | 29 | def __repr__(self): 30 | return '' % (self.name) 31 | -------------------------------------------------------------------------------- /app/users/views.py: -------------------------------------------------------------------------------- 1 | from flask import Blueprint, request, render_template, flash, g, session, redirect, url_for 2 | from werkzeug import check_password_hash, generate_password_hash 3 | 4 | from app import db 5 | from app.users.forms import RegisterForm, LoginForm 6 | from app.users.models import User 7 | from app.facebook.models import Facebook 8 | from app.twitter.models import Twitter 9 | from app.users.decorators import requires_login 10 | 11 | mod = Blueprint('users', __name__, url_prefix='/users') 12 | 13 | 14 | @mod.route('/me/') 15 | @requires_login 16 | def home(): 17 | f = Facebook.query.filter_by(uid=g.user.id) 18 | t = Twitter.query.filter_by(uid=g.user.id) 19 | return render_template("users/profile.html", user=g.user, facebook = f, twitter = t) 20 | 21 | 22 | @mod.route('/login/', methods=['GET', 'POST']) 23 | def login(): 24 | """ 25 | Login form 26 | """ 27 | form = LoginForm(request.form) 28 | if form.validate_on_submit(): 29 | user = User.query.filter_by(email=form.email.data).first() 30 | if user and check_password_hash(user.password, form.password.data): 31 | session['user_id'] = user.id 32 | flash('Welcome %s' % user.name) 33 | return redirect(url_for('feed.home')) 34 | flash('Wrong email or password', 'error-message') 35 | return render_template("users/login.html", form=form) 36 | 37 | 38 | @mod.route('/register/', methods=['GET', 'POST']) 39 | def register(): 40 | """ 41 | Registration Form 42 | """ 43 | form = RegisterForm(request.form) 44 | if form.validate_on_submit(): 45 | user = User(form.name.data, form.email.data, \ 46 | generate_password_hash(form.password.data),form.gender.data) 47 | db.session.add(user) 48 | db.session.commit() 49 | 50 | session['user_id'] = user.id 51 | 52 | flash('Thanks for registering') 53 | return redirect(url_for('feed.home')) 54 | return render_template("users/register.html", form=form) 55 | 56 | 57 | @mod.route('/logout/') 58 | def logout(): 59 | session.pop('user_id', None) 60 | flash('You were logged out') 61 | return redirect(url_for('users.login')) 62 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | import os 2 | _basedir = os.path.abspath(os.path.dirname(__file__)) 3 | 4 | DEBUG = False 5 | 6 | ADMINS = frozenset(['vunhatminh@icloud.com']) 7 | SECRET_KEY = 'TheDarkKnightRockTheGotham' 8 | 9 | SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(_basedir, 'app.db') 10 | DATABASE_CONNECT_OPTIONS = {} 11 | 12 | THREADS_PER_PAGE = 8 13 | 14 | CSRF_ENABLED=True 15 | CSRF_SESSION_KEY="WellItisNotSoUnPredictable" 16 | 17 | RECAPTCHA_USE_SSL = False 18 | RECAPTCHA_PUBLIC_KEY = '6LfpFt0SAAAAAC__c_N8i4q-KWCTNFLSNn51aVif' 19 | 20 | RECAPTCHA_PRIVATE_KEY = '6LfpFt0SAAAAAKk6kfFBprfcGmOBDt5rWke2bGNy' 21 | RECAPTCHA_OPTIONS = {'theme': 'white'} 22 | 23 | 24 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Flask==0.10 2 | Flask-OAuth==0.12 3 | Flask-SQLAlchemy==0.16 4 | Flask-WTF==0.8.2 5 | Jinja2==2.6 6 | SQLAlchemy==0.8.0 7 | WTForms==1.0.3 8 | Werkzeug==0.8.3 9 | distribute==0.6.31 10 | facepy==0.8.4 11 | feedparser==5.1.3 12 | httplib2==0.7.7 13 | oauth2==1.5.211 14 | pysqlite==2.6.3 15 | requests==1.1.0 16 | tweepy==2.0 17 | wsgiref==0.1.2 18 | -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | import os 2 | from app import app 3 | 4 | port = int(os.environ.get('PORT', 5000)) 5 | app.run(host='0.0.0.0', port=port, debug = True) 6 | 7 | -------------------------------------------------------------------------------- /shell.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import readline 4 | from pprint import pprint 5 | 6 | from flask import * 7 | from app import * 8 | from app.users.models import * 9 | from app.facebook.models import * 10 | #from app.twitter import constants as CONSTANTS 11 | from app.facebook import constants as CONSTANTS 12 | from flask_oauth import OAuth 13 | 14 | import tweepy, feedparser 15 | 16 | os.environ['PYTHONINSPECT'] = 'True' 17 | --------------------------------------------------------------------------------