├── .bowerrc ├── .editorconfig ├── .gitattributes ├── .gitignore ├── .jshintrc ├── Gruntfile.js ├── README.md ├── _config.yml ├── app ├── .buildignore ├── .htaccess ├── 404.html ├── components │ ├── angular-cookies │ │ ├── README.md │ │ ├── angular-cookies.js │ │ ├── angular-cookies.min.js │ │ └── component.json │ ├── angular-mobile │ │ ├── angular-mobile.js │ │ └── angular-mobile.min.js │ ├── angular-mocks │ │ ├── README.md │ │ ├── angular-mocks.js │ │ ├── angular-mocks.min.js │ │ └── component.json │ ├── angular-momentum-scroll │ │ ├── README.md │ │ ├── component.json │ │ ├── scrollable.js │ │ └── scrollable.min.js │ ├── angular-resource │ │ ├── README.md │ │ ├── angular-resource.js │ │ ├── angular-resource.min.js │ │ └── component.json │ ├── angular-sanitize │ │ ├── README.md │ │ ├── angular-sanitize.js │ │ ├── angular-sanitize.min.js │ │ └── component.json │ ├── angular-scenario │ │ ├── README.md │ │ ├── angular-scenario.js │ │ ├── component.json │ │ ├── jstd-scenario-adapter-config.js │ │ └── jstd-scenario-adapter.js │ ├── es5-shim │ │ ├── .gitignore │ │ ├── CHANGES │ │ ├── CONTRIBUTORS.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── component.json │ │ ├── es5-sham.js │ │ ├── es5-sham.map │ │ ├── es5-sham.min.js │ │ ├── es5-shim.js │ │ ├── es5-shim.map │ │ ├── es5-shim.min.js │ │ ├── package.json │ │ └── tests │ │ │ ├── helpers │ │ │ ├── h-kill.js │ │ │ ├── h-matchers.js │ │ │ └── h.js │ │ │ ├── index.html │ │ │ ├── index.min.html │ │ │ ├── lib │ │ │ ├── jasmine-html.js │ │ │ ├── jasmine.css │ │ │ ├── jasmine.js │ │ │ ├── jasmine_favicon.png │ │ │ └── json2.js │ │ │ └── spec │ │ │ ├── s-array.js │ │ │ ├── s-date.js │ │ │ ├── s-function.js │ │ │ ├── s-number.js │ │ │ ├── s-object.js │ │ │ └── s-string.js │ ├── iscroll │ │ ├── .gitignore │ │ ├── README.md │ │ ├── bin │ │ │ └── make-dist │ │ ├── component.json │ │ ├── examples │ │ │ ├── carousel │ │ │ │ └── index.html │ │ │ ├── check-dom-changes │ │ │ │ └── index.html │ │ │ ├── custom-scrollbar │ │ │ │ ├── index.html │ │ │ │ └── scrollbar.css │ │ │ ├── ender │ │ │ │ ├── ender.js │ │ │ │ ├── ender.min.js │ │ │ │ └── index.html │ │ │ ├── form-fields │ │ │ │ └── index.html │ │ │ ├── horizontal-scroll │ │ │ │ └── index.html │ │ │ ├── hover │ │ │ │ └── index.html │ │ │ ├── ios-perfect-scrollbar │ │ │ │ ├── index.html │ │ │ │ ├── scrollbar.css │ │ │ │ └── scrollbar.png │ │ │ ├── ipad │ │ │ │ └── index.html │ │ │ ├── lite │ │ │ │ └── index.html │ │ │ ├── pull-to-refresh │ │ │ │ ├── index.html │ │ │ │ └── pull-icon@2x.png │ │ │ ├── simple │ │ │ │ └── index.html │ │ │ ├── snap-to-element │ │ │ │ └── index.html │ │ │ ├── use-transition │ │ │ │ └── index.html │ │ │ └── zoom │ │ │ │ ├── index.html │ │ │ │ └── iscroll.jpg │ │ ├── license.txt │ │ ├── package.json │ │ └── src │ │ │ ├── ender.js │ │ │ ├── iscroll-lite.js │ │ │ └── iscroll.js │ ├── jquery-masonry │ │ ├── .gitignore │ │ ├── .tm_properties │ │ ├── CONTRIBUTING.mdown │ │ ├── README.mdown │ │ ├── _config.yml │ │ ├── _layouts │ │ │ └── default.html │ │ ├── _posts │ │ │ ├── demos │ │ │ │ ├── 2011-05-01-basic-single-column.html │ │ │ │ ├── 2011-05-02-basic-multi-column.html │ │ │ │ ├── 2011-05-03-images.html │ │ │ │ ├── 2011-05-04-tumblelog.html │ │ │ │ ├── 2011-05-05-animating-jquery.html │ │ │ │ ├── 2011-05-06-animating-css-transitions.html │ │ │ │ ├── 2011-05-07-animating-modernizr.html │ │ │ │ ├── 2011-05-08-adding-items.html │ │ │ │ ├── 2011-05-09-infinite-scroll.html │ │ │ │ ├── 2011-05-10-gutters.html │ │ │ │ ├── 2011-05-11-right-to-left.html │ │ │ │ ├── 2011-05-17-centered.html │ │ │ │ ├── 2011-07-26-fluid.html │ │ │ │ └── 2011-10-07-corner-stamp.html │ │ │ ├── docs │ │ │ │ ├── 2011-05-01-intro.mdown │ │ │ │ ├── 2011-05-02-options.mdown │ │ │ │ ├── 2011-05-03-methods.mdown │ │ │ │ ├── 2011-05-04-animating.mdown │ │ │ │ └── 2011-05-30-help.mdown │ │ │ ├── pages │ │ │ │ ├── 2011-05-02-2.html │ │ │ │ ├── 2011-05-03-3.html │ │ │ │ ├── 2011-05-04-4.html │ │ │ │ └── 2011-05-05-5.html │ │ │ └── tests │ │ │ │ ├── 2011-01-01-index.html │ │ │ │ ├── 2011-05-14-lots-of-bricks.html │ │ │ │ ├── 2011-05-17-dual.html │ │ │ │ ├── 2011-05-18-first-child-no-width.html │ │ │ │ ├── 2011-05-19-empty.html │ │ │ │ ├── 2011-08-08-destroy.html │ │ │ │ └── 2011-09-27-centered-few.html │ │ ├── component.json │ │ ├── css │ │ │ └── style.css │ │ ├── index.html │ │ ├── jquery.masonry.js │ │ ├── jquery.masonry.min.js │ │ ├── js │ │ │ ├── box-maker.js │ │ │ ├── jquery-1.7.1.min.js │ │ │ ├── jquery.infinitescroll.min.js │ │ │ └── modernizr-transitions.js │ │ └── minify.sh │ ├── jquery │ │ ├── .gitignore │ │ ├── README.md │ │ ├── bower.json │ │ ├── component.json │ │ ├── composer.json │ │ ├── jquery-migrate.js │ │ ├── jquery-migrate.min.js │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ └── package.json │ └── json3 │ │ ├── .gitmodules │ │ ├── .npmignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── build.js │ │ ├── component.json │ │ ├── index.html │ │ ├── jsl.conf │ │ ├── lib │ │ ├── json3.js │ │ └── json3.min.js │ │ ├── package.json │ │ ├── page │ │ ├── background.png │ │ ├── logo.png │ │ ├── page.html │ │ └── style.css │ │ ├── test │ │ ├── test_browser.html │ │ └── test_json3.js │ │ └── vendor │ │ ├── closure-compiler.jar │ │ ├── curl.js │ │ ├── prototype.js │ │ └── require.js ├── favicon.ico ├── img │ ├── gplus.png │ ├── rss.png │ └── twitter.png ├── index.html ├── robots.txt ├── scripts │ ├── angular.js │ ├── angular.min.js │ ├── angular │ │ ├── angular-bootstrap-prettify.js │ │ ├── angular-bootstrap-prettify.min.js │ │ ├── angular-bootstrap.js │ │ ├── angular-bootstrap.min.js │ │ ├── angular-cookies.js │ │ ├── angular-cookies.min.js │ │ ├── angular-loader.js │ │ ├── angular-loader.min.js │ │ ├── angular-mobile.js │ │ ├── angular-mobile.min.js │ │ ├── angular-mocks.js │ │ ├── angular-resource.js │ │ ├── angular-resource.min.js │ │ ├── angular-sanitize.js │ │ ├── angular-sanitize.min.js │ │ ├── angular-scenario.js │ │ ├── angular.js │ │ ├── angular.min.js │ │ ├── i18n │ │ │ ├── angular-locale_af-na.js │ │ │ ├── angular-locale_af-za.js │ │ │ ├── angular-locale_af.js │ │ │ ├── angular-locale_am-et.js │ │ │ ├── angular-locale_am.js │ │ │ ├── angular-locale_ar-001.js │ │ │ ├── angular-locale_ar-ae.js │ │ │ ├── angular-locale_ar-bh.js │ │ │ ├── angular-locale_ar-dz.js │ │ │ ├── angular-locale_ar-eg.js │ │ │ ├── angular-locale_ar-iq.js │ │ │ ├── angular-locale_ar-jo.js │ │ │ ├── angular-locale_ar-kw.js │ │ │ ├── angular-locale_ar-lb.js │ │ │ ├── angular-locale_ar-ly.js │ │ │ ├── angular-locale_ar-ma.js │ │ │ ├── angular-locale_ar-om.js │ │ │ ├── angular-locale_ar-qa.js │ │ │ ├── angular-locale_ar-sa.js │ │ │ ├── angular-locale_ar-sd.js │ │ │ ├── angular-locale_ar-sy.js │ │ │ ├── angular-locale_ar-tn.js │ │ │ ├── angular-locale_ar-ye.js │ │ │ ├── angular-locale_ar.js │ │ │ ├── angular-locale_bg-bg.js │ │ │ ├── angular-locale_bg.js │ │ │ ├── angular-locale_bn-bd.js │ │ │ ├── angular-locale_bn-in.js │ │ │ ├── angular-locale_bn.js │ │ │ ├── angular-locale_ca-ad.js │ │ │ ├── angular-locale_ca-es.js │ │ │ ├── angular-locale_ca.js │ │ │ ├── angular-locale_chr.js │ │ │ ├── angular-locale_cs-cz.js │ │ │ ├── angular-locale_cs.js │ │ │ ├── angular-locale_cy.js │ │ │ ├── angular-locale_da-dk.js │ │ │ ├── angular-locale_da.js │ │ │ ├── angular-locale_de-at.js │ │ │ ├── angular-locale_de-be.js │ │ │ ├── angular-locale_de-ch.js │ │ │ ├── angular-locale_de-de.js │ │ │ ├── angular-locale_de-li.js │ │ │ ├── angular-locale_de-lu.js │ │ │ ├── angular-locale_de.js │ │ │ ├── angular-locale_el-cy.js │ │ │ ├── angular-locale_el-gr.js │ │ │ ├── angular-locale_el-polyton.js │ │ │ ├── angular-locale_el.js │ │ │ ├── angular-locale_en-as.js │ │ │ ├── angular-locale_en-au.js │ │ │ ├── angular-locale_en-bb.js │ │ │ ├── angular-locale_en-be.js │ │ │ ├── angular-locale_en-bm.js │ │ │ ├── angular-locale_en-bw.js │ │ │ ├── angular-locale_en-bz.js │ │ │ ├── angular-locale_en-ca.js │ │ │ ├── angular-locale_en-dsrt-us.js │ │ │ ├── angular-locale_en-dsrt.js │ │ │ ├── angular-locale_en-fm.js │ │ │ ├── angular-locale_en-gb.js │ │ │ ├── angular-locale_en-gu.js │ │ │ ├── angular-locale_en-gy.js │ │ │ ├── angular-locale_en-hk.js │ │ │ ├── angular-locale_en-ie.js │ │ │ ├── angular-locale_en-in.js │ │ │ ├── angular-locale_en-iso.js │ │ │ ├── angular-locale_en-jm.js │ │ │ ├── angular-locale_en-mh.js │ │ │ ├── angular-locale_en-mp.js │ │ │ ├── angular-locale_en-mt.js │ │ │ ├── angular-locale_en-mu.js │ │ │ ├── angular-locale_en-na.js │ │ │ ├── angular-locale_en-nz.js │ │ │ ├── angular-locale_en-ph.js │ │ │ ├── angular-locale_en-pk.js │ │ │ ├── angular-locale_en-pr.js │ │ │ ├── angular-locale_en-pw.js │ │ │ ├── angular-locale_en-sg.js │ │ │ ├── angular-locale_en-tc.js │ │ │ ├── angular-locale_en-tt.js │ │ │ ├── angular-locale_en-um.js │ │ │ ├── angular-locale_en-us.js │ │ │ ├── angular-locale_en-vg.js │ │ │ ├── angular-locale_en-vi.js │ │ │ ├── angular-locale_en-za.js │ │ │ ├── angular-locale_en-zw.js │ │ │ ├── angular-locale_en-zz.js │ │ │ ├── angular-locale_en.js │ │ │ ├── angular-locale_es-419.js │ │ │ ├── angular-locale_es-ar.js │ │ │ ├── angular-locale_es-bo.js │ │ │ ├── angular-locale_es-cl.js │ │ │ ├── angular-locale_es-co.js │ │ │ ├── angular-locale_es-cr.js │ │ │ ├── angular-locale_es-do.js │ │ │ ├── angular-locale_es-ea.js │ │ │ ├── angular-locale_es-ec.js │ │ │ ├── angular-locale_es-es.js │ │ │ ├── angular-locale_es-gq.js │ │ │ ├── angular-locale_es-gt.js │ │ │ ├── angular-locale_es-hn.js │ │ │ ├── angular-locale_es-ic.js │ │ │ ├── angular-locale_es-mx.js │ │ │ ├── angular-locale_es-ni.js │ │ │ ├── angular-locale_es-pa.js │ │ │ ├── angular-locale_es-pe.js │ │ │ ├── angular-locale_es-pr.js │ │ │ ├── angular-locale_es-py.js │ │ │ ├── angular-locale_es-sv.js │ │ │ ├── angular-locale_es-us.js │ │ │ ├── angular-locale_es-uy.js │ │ │ ├── angular-locale_es-ve.js │ │ │ ├── angular-locale_es.js │ │ │ ├── angular-locale_et-ee.js │ │ │ ├── angular-locale_et.js │ │ │ ├── angular-locale_eu-es.js │ │ │ ├── angular-locale_eu.js │ │ │ ├── angular-locale_fa-af.js │ │ │ ├── angular-locale_fa-ir.js │ │ │ ├── angular-locale_fa.js │ │ │ ├── angular-locale_fi-fi.js │ │ │ ├── angular-locale_fi.js │ │ │ ├── angular-locale_fil-ph.js │ │ │ ├── angular-locale_fil.js │ │ │ ├── angular-locale_fr-be.js │ │ │ ├── angular-locale_fr-bf.js │ │ │ ├── angular-locale_fr-bi.js │ │ │ ├── angular-locale_fr-bj.js │ │ │ ├── angular-locale_fr-bl.js │ │ │ ├── angular-locale_fr-ca.js │ │ │ ├── angular-locale_fr-cd.js │ │ │ ├── angular-locale_fr-cf.js │ │ │ ├── angular-locale_fr-cg.js │ │ │ ├── angular-locale_fr-ch.js │ │ │ ├── angular-locale_fr-ci.js │ │ │ ├── angular-locale_fr-cm.js │ │ │ ├── angular-locale_fr-dj.js │ │ │ ├── angular-locale_fr-fr.js │ │ │ ├── angular-locale_fr-ga.js │ │ │ ├── angular-locale_fr-gf.js │ │ │ ├── angular-locale_fr-gn.js │ │ │ ├── angular-locale_fr-gp.js │ │ │ ├── angular-locale_fr-gq.js │ │ │ ├── angular-locale_fr-km.js │ │ │ ├── angular-locale_fr-lu.js │ │ │ ├── angular-locale_fr-mc.js │ │ │ ├── angular-locale_fr-mf.js │ │ │ ├── angular-locale_fr-mg.js │ │ │ ├── angular-locale_fr-ml.js │ │ │ ├── angular-locale_fr-mq.js │ │ │ ├── angular-locale_fr-ne.js │ │ │ ├── angular-locale_fr-re.js │ │ │ ├── angular-locale_fr-rw.js │ │ │ ├── angular-locale_fr-sn.js │ │ │ ├── angular-locale_fr-td.js │ │ │ ├── angular-locale_fr-tg.js │ │ │ ├── angular-locale_fr-yt.js │ │ │ ├── angular-locale_fr.js │ │ │ ├── angular-locale_gl-es.js │ │ │ ├── angular-locale_gl.js │ │ │ ├── angular-locale_gsw-ch.js │ │ │ ├── angular-locale_gsw.js │ │ │ ├── angular-locale_gu-in.js │ │ │ ├── angular-locale_gu.js │ │ │ ├── angular-locale_haw.js │ │ │ ├── angular-locale_he-il.js │ │ │ ├── angular-locale_he.js │ │ │ ├── angular-locale_hi-in.js │ │ │ ├── angular-locale_hi.js │ │ │ ├── angular-locale_hr-hr.js │ │ │ ├── angular-locale_hr.js │ │ │ ├── angular-locale_hu-hu.js │ │ │ ├── angular-locale_hu.js │ │ │ ├── angular-locale_id-id.js │ │ │ ├── angular-locale_id.js │ │ │ ├── angular-locale_in.js │ │ │ ├── angular-locale_is-is.js │ │ │ ├── angular-locale_is.js │ │ │ ├── angular-locale_it-ch.js │ │ │ ├── angular-locale_it-it.js │ │ │ ├── angular-locale_it-sm.js │ │ │ ├── angular-locale_it.js │ │ │ ├── angular-locale_iw.js │ │ │ ├── angular-locale_ja-jp.js │ │ │ ├── angular-locale_ja.js │ │ │ ├── angular-locale_kn-in.js │ │ │ ├── angular-locale_kn.js │ │ │ ├── angular-locale_ko-kr.js │ │ │ ├── angular-locale_ko.js │ │ │ ├── angular-locale_ln-cd.js │ │ │ ├── angular-locale_ln-cg.js │ │ │ ├── angular-locale_ln.js │ │ │ ├── angular-locale_lt-lt.js │ │ │ ├── angular-locale_lt.js │ │ │ ├── angular-locale_lv-lv.js │ │ │ ├── angular-locale_lv.js │ │ │ ├── angular-locale_ml-in.js │ │ │ ├── angular-locale_ml.js │ │ │ ├── angular-locale_mo.js │ │ │ ├── angular-locale_mr-in.js │ │ │ ├── angular-locale_mr.js │ │ │ ├── angular-locale_ms-bn.js │ │ │ ├── angular-locale_ms-my.js │ │ │ ├── angular-locale_ms.js │ │ │ ├── angular-locale_mt-mt.js │ │ │ ├── angular-locale_mt.js │ │ │ ├── angular-locale_nl-aw.js │ │ │ ├── angular-locale_nl-be.js │ │ │ ├── angular-locale_nl-cw.js │ │ │ ├── angular-locale_nl-nl.js │ │ │ ├── angular-locale_nl-sx.js │ │ │ ├── angular-locale_nl.js │ │ │ ├── angular-locale_no.js │ │ │ ├── angular-locale_or-in.js │ │ │ ├── angular-locale_or.js │ │ │ ├── angular-locale_pl-pl.js │ │ │ ├── angular-locale_pl.js │ │ │ ├── angular-locale_pt-ao.js │ │ │ ├── angular-locale_pt-br.js │ │ │ ├── angular-locale_pt-gw.js │ │ │ ├── angular-locale_pt-mz.js │ │ │ ├── angular-locale_pt-pt.js │ │ │ ├── angular-locale_pt-st.js │ │ │ ├── angular-locale_pt.js │ │ │ ├── angular-locale_ro-md.js │ │ │ ├── angular-locale_ro-ro.js │ │ │ ├── angular-locale_ro.js │ │ │ ├── angular-locale_ru-md.js │ │ │ ├── angular-locale_ru-ru.js │ │ │ ├── angular-locale_ru-ua.js │ │ │ ├── angular-locale_ru.js │ │ │ ├── angular-locale_sk-sk.js │ │ │ ├── angular-locale_sk.js │ │ │ ├── angular-locale_sl-si.js │ │ │ ├── angular-locale_sl.js │ │ │ ├── angular-locale_sq-al.js │ │ │ ├── angular-locale_sq.js │ │ │ ├── angular-locale_sr-cyrl-ba.js │ │ │ ├── angular-locale_sr-cyrl-me.js │ │ │ ├── angular-locale_sr-cyrl-rs.js │ │ │ ├── angular-locale_sr-cyrl.js │ │ │ ├── angular-locale_sr-latn-ba.js │ │ │ ├── angular-locale_sr-latn-me.js │ │ │ ├── angular-locale_sr-latn-rs.js │ │ │ ├── angular-locale_sr-latn.js │ │ │ ├── angular-locale_sr-rs.js │ │ │ ├── angular-locale_sr.js │ │ │ ├── angular-locale_sv-fi.js │ │ │ ├── angular-locale_sv-se.js │ │ │ ├── angular-locale_sv.js │ │ │ ├── angular-locale_sw-ke.js │ │ │ ├── angular-locale_sw-tz.js │ │ │ ├── angular-locale_sw.js │ │ │ ├── angular-locale_ta-in.js │ │ │ ├── angular-locale_ta-lk.js │ │ │ ├── angular-locale_ta.js │ │ │ ├── angular-locale_te-in.js │ │ │ ├── angular-locale_te.js │ │ │ ├── angular-locale_th-th.js │ │ │ ├── angular-locale_th.js │ │ │ ├── angular-locale_tl-ph.js │ │ │ ├── angular-locale_tl.js │ │ │ ├── angular-locale_tr-tr.js │ │ │ ├── angular-locale_tr.js │ │ │ ├── angular-locale_uk-ua.js │ │ │ ├── angular-locale_uk.js │ │ │ ├── angular-locale_ur-in.js │ │ │ ├── angular-locale_ur-pk.js │ │ │ ├── angular-locale_ur.js │ │ │ ├── angular-locale_vi-vn.js │ │ │ ├── angular-locale_vi.js │ │ │ ├── angular-locale_zh-cn.js │ │ │ ├── angular-locale_zh-hans-cn.js │ │ │ ├── angular-locale_zh-hans-hk.js │ │ │ ├── angular-locale_zh-hans-mo.js │ │ │ ├── angular-locale_zh-hans-sg.js │ │ │ ├── angular-locale_zh-hans.js │ │ │ ├── angular-locale_zh-hant-hk.js │ │ │ ├── angular-locale_zh-hant-mo.js │ │ │ ├── angular-locale_zh-hant-tw.js │ │ │ ├── angular-locale_zh-hant.js │ │ │ ├── angular-locale_zh-hk.js │ │ │ ├── angular-locale_zh-tw.js │ │ │ ├── angular-locale_zh.js │ │ │ ├── angular-locale_zu-za.js │ │ │ └── angular-locale_zu.js │ │ ├── version.json │ │ └── version.txt │ ├── app.js │ ├── controllers │ │ ├── ArticleDetail.js │ │ ├── FeedList.js │ │ ├── IOAddFeedForm.js │ │ └── IOArticlePreview.js │ ├── directives │ │ ├── ioAddFeedForm.js │ │ ├── ioArticlePreview.js │ │ └── rnAngularCarousel.js │ ├── filters │ │ ├── preview.js │ │ └── striptags.js │ └── services │ │ ├── Articles.js │ │ ├── FeedManager.js │ │ └── RecommendedFeeds.js ├── styles │ ├── controller │ │ ├── ArticleDetail.less │ │ └── FeedList.less │ ├── css │ │ └── main.css │ ├── directive │ │ ├── ioAddFeedForm.less │ │ ├── ioArticlePreview.less │ │ └── rnAngularCarousel.less │ └── main.less └── views │ ├── ArticleDetail.html │ ├── FeedList.html │ ├── ioAddFeedForm.html │ └── ioArticlePreview.html ├── component.json ├── design ├── flow.graffle │ ├── data.plist │ ├── image1.tiff │ └── image2.tiff ├── flow.pdf └── mashableitem.xml ├── karma-e2e.conf.js ├── karma.conf.js ├── package.json └── test ├── mock ├── angularjsfeed.js ├── articlesMock.js ├── atomArticle.js ├── dailyjsfeed.js └── previewFilterText.js ├── runner.html └── spec ├── controllers ├── ArticleDetail.js ├── FeedList.js ├── IOAddFeedForm.js └── IOArticlePreview.js ├── directives ├── io-add-feed-form.js └── io-article-preview.js ├── filters ├── preview.js └── striptags.js └── services ├── Articles.js ├── FeedManager.js └── RecommendedFeeds.js /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "app/components" 3 | } 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | 10 | # Change these settings to your own preference 11 | indent_style = space 12 | indent_size = 2 13 | 14 | # We recommend you to keep these unchanged 15 | end_of_line = lf 16 | charset = utf-8 17 | trim_trailing_whitespace = true 18 | insert_final_newline = true 19 | 20 | [*.md] 21 | trim_trailing_whitespace = false 22 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.DS_Store 3 | dist 4 | .tmp 5 | .sass-cache 6 | app/components/angular-carousel 7 | npm-debug.log -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "browser": true, 4 | "es5": false, 5 | "esnext": true, 6 | "bitwise": true, 7 | "camelcase": true, 8 | "curly": false, 9 | "eqeqeq": true, 10 | "immed": true, 11 | "indent": 2, 12 | "latedef": true, 13 | "newcap": true, 14 | "noarg": true, 15 | "quotmark": "single", 16 | "regexp": true, 17 | "undef": true, 18 | "unused": true, 19 | "strict": true, 20 | "trailing": true, 21 | "smarttabs": true, 22 | "globals": { 23 | "angular": false 24 | }, 25 | "loopfunc": true, 26 | "laxcomma": true 27 | } 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Angular Reader 2 | 3 | [Live Demo](http://jeffbcross.github.io/ngswipe-demo/app/) 4 | 5 | [Video Demo of Animation](https://plus.google.com/115279700532270609876/posts/L9q6HFFdrgj) 6 | 7 | Angular reader is a simple Atom feed reader app that shows off some new features in [AngularJS](http://www.angularjs.org), and generally shows off the simplicity of building apps with Angular. 8 | 9 | The app is a proof-of-concept, and a little rough around the edges. It should work with most Atom feeds, but may break if it has trouble parsing. 10 | 11 | ## Getting Started 12 | 13 | (Requires node, grunt, bower) 14 | 15 | $ npm intall 16 | $ bower install 17 | $ grunt server 18 | 19 | 20 | ## Features 21 | 22 | * Animation (new!) 23 | * Add Feed 24 | * Read a full article 25 | * Swipe to next/prev article 26 | * Edit feeds 27 | * Swipe (new!) 28 | * Swipe to delete 29 | * Swipe to go to next/prev article 30 | * Filter 31 | * Plaintext 32 | * Truncate 33 | * Directive 34 | * Carousel (contributed from [@revolunet](https://github.com/revolunet/angular-carousel)) 35 | * Feed List 36 | * Add Feed Form (with datalist HTML5 component) 37 | * Article Preview 38 | * Service 39 | * Feed Manager w/localStorage 40 | * Articles w/Atom parsing 41 | * Recommended Feeds 42 | 43 | ## Animation Examples 44 | As of Angular 1.1.4, Angular provides a simple directive to declaratively manage JavaScript and CSS3 animations of other directives 45 | 46 | ### Add Feed Form 47 | The left column of the main view of the application provides an area to add a new feed to the reader. In this simple directive, we're using: 48 | 49 | * An HTML5 datalist with an ng-repeat directive to recommend feeds while typing. 50 | * Animating the "add feed" link and the form itself while showing/hiding, using ng-animate and ng-show. 51 | * Declarative form validation, using ng-pattern and ng-required. 52 | 53 | See the code: [template](https://github.com/jeffbcross/ngswipe-demo/blob/master/app/views/io-add-feed-form.html) 54 | 55 | 56 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | source : app -------------------------------------------------------------------------------- /app/.buildignore: -------------------------------------------------------------------------------- 1 | *.coffee -------------------------------------------------------------------------------- /app/components/angular-cookies/README.md: -------------------------------------------------------------------------------- 1 | bower-angular-cookies 2 | ===================== 3 | 4 | angular-cookies bower repo -------------------------------------------------------------------------------- /app/components/angular-cookies/angular-cookies.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.0.6 3 | (c) 2010-2012 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(m,f,l){'use strict';f.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(d,c){var b={},g={},h,i=!1,j=f.copy,k=f.isUndefined;c.addPollFn(function(){var a=c.cookies();h!=a&&(h=a,j(a,g),j(a,b),i&&d.$apply())})();i=!0;d.$watch(function(){var a,e,d;for(a in g)k(b[a])&&c.cookies(a,l);for(a in b)e=b[a],f.isString(e)?e!==g[a]&&(c.cookies(a,e),d=!0):f.isDefined(g[a])?b[a]=g[a]:delete b[a];if(d)for(a in e=c.cookies(),b)b[a]!==e[a]&&(k(e[a])?delete b[a]:b[a]=e[a])});return b}]).factory("$cookieStore", 7 | ["$cookies",function(d){return{get:function(c){return f.fromJson(d[c])},put:function(c,b){d[c]=f.toJson(b)},remove:function(c){delete d[c]}}}])})(window,window.angular); 8 | -------------------------------------------------------------------------------- /app/components/angular-cookies/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-cookies", 3 | "version": "1.0.6", 4 | "main": "./angular-cookies.js", 5 | "dependencies": { 6 | "angular": "1.0.6" 7 | }, 8 | "gitHead": "85512c890d1c3f6ae8499215df66b71439f0c6b8", 9 | "readme": "bower-angular-cookies\n=====================\n\nangular-cookies bower repo", 10 | "readmeFilename": "README.md", 11 | "_id": "angular-cookies@1.0.6", 12 | "description": "bower-angular-cookies =====================", 13 | "repository": { 14 | "type": "git", 15 | "url": "git://github.com/angular/bower-angular-cookies.git" 16 | } 17 | } -------------------------------------------------------------------------------- /app/components/angular-mocks/README.md: -------------------------------------------------------------------------------- 1 | bower-angular-mocks 2 | =================== 3 | 4 | angular-mocks.js bower repo -------------------------------------------------------------------------------- /app/components/angular-mocks/angular-mocks.min.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | 404 Not Found 4 | 5 |

Not Found

6 |

The requested URL /1.0.5/angular-mocks.min.js was not found on this server.

7 | 8 | -------------------------------------------------------------------------------- /app/components/angular-mocks/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-mocks", 3 | "version": "1.0.6", 4 | "main": "./angular-mocks.js", 5 | "dependencies": { 6 | "angular": "1.0.6" 7 | }, 8 | "gitHead": "16a3023f706e672f537fa9f98d4b7f2ea8516a7c", 9 | "readme": "bower-angular-mocks\n===================\n\nangular-mocks.js bower repo", 10 | "readmeFilename": "README.md", 11 | "_id": "angular-mocks@1.0.6", 12 | "description": "bower-angular-mocks ===================", 13 | "repository": { 14 | "type": "git", 15 | "url": "git://github.com/angular/bower-angular-mocks.git" 16 | } 17 | } -------------------------------------------------------------------------------- /app/components/angular-momentum-scroll/README.md: -------------------------------------------------------------------------------- 1 | # angular-momentum-scroll 2 | 3 | AngularJS directive that adds momentum scroll via iScroll (http://cubiq.org/iscroll-4). 4 | 5 | ## Usage 6 | 7 | * Include `scrollable.js` or `scrollable.min.js` into your page 8 | * Declare `'angular-momentum-scroll'` as a dependency for your angular app: `angular.module('myApp', ['angular-momentum-scroll']);` 9 | * Add the `scrollable` attribute to a container of your choice: 10 | * the container MUST have set width and height !! 11 | * in order to scroll horizontally the .scroller class inside of your container MUST have set width and height !! 12 | * The container takes an additional attribute `parameters` according to iScroll docs. e.g.
13 | -------------------------------------------------------------------------------- /app/components/angular-momentum-scroll/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": { 3 | "name": "Patrick Bartsch" 4 | }, 5 | "name": "angular-momentum-scroll", 6 | "description": "Momentum scroll for AngularJS based on iScroll.", 7 | "version": "0.1.1", 8 | "main": "scrollable.min.js", 9 | "scripts": [ 10 | "scrollable.min.js" 11 | ], 12 | "homepage": "http://github.com/wzr1337/angular-momentum-scroll", 13 | "repository": { 14 | "type": "git", 15 | "url": "git://github.com/wzr1337/bower-angular-momentum-scroll.git" 16 | }, 17 | "dependencies": { 18 | "angular": "1.0.6", 19 | "iscroll": "" 20 | }, 21 | "gitHead": "e9e65ceca67f732d664c270b71345127f57fb327", 22 | "readme": "# angular-momentum-scroll\n\nAngularJS directive that adds momentum scroll via iScroll (http://cubiq.org/iscroll-4).\n\n## Usage\n\n* Include `scrollable.js` or `scrollable.min.js` into your page\n* Declare `'angular-momentum-scroll'` as a dependency for your angular app: `angular.module('myApp', ['angular-momentum-scroll']);`\n* Add the `scrollable` attribute to a container of your choice:\n * the container MUST have set width and height !!\n * in order to scroll horizontally the .scroller class inside of your container MUST have set width and height !!\n* The container takes an additional attribute `parameters` according to iScroll docs. e.g.
\n", 23 | "readmeFilename": "README.md", 24 | "_id": "angular-momentum-scroll@0.1.1" 25 | } -------------------------------------------------------------------------------- /app/components/angular-resource/README.md: -------------------------------------------------------------------------------- 1 | bower-angular-resource 2 | ====================== 3 | 4 | angular-resource bower repo -------------------------------------------------------------------------------- /app/components/angular-resource/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-resource", 3 | "version": "1.0.6", 4 | "main": "./angular-resource.js", 5 | "dependencies": { 6 | "angular": "1.0.6" 7 | }, 8 | "gitHead": "ac0f457bfda419325bd5a585bcb16195696dfe3a", 9 | "readme": "bower-angular-resource\n======================\n\nangular-resource bower repo", 10 | "readmeFilename": "README.md", 11 | "_id": "angular-resource@1.0.6", 12 | "description": "bower-angular-resource ======================", 13 | "repository": { 14 | "type": "git", 15 | "url": "git://github.com/angular/bower-angular-resource.git" 16 | } 17 | } -------------------------------------------------------------------------------- /app/components/angular-sanitize/README.md: -------------------------------------------------------------------------------- 1 | bower-angular-sanitize 2 | ====================== 3 | 4 | angular-sanitize bower repo -------------------------------------------------------------------------------- /app/components/angular-sanitize/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-sanitize", 3 | "version": "1.0.6", 4 | "main": "./angular-sanitize.js", 5 | "dependencies": { 6 | "angular": "1.0.6" 7 | }, 8 | "gitHead": "44fa1f93ff18a826caf00c9a726aa20b330e9577", 9 | "readme": "bower-angular-sanitize\n======================\n\nangular-sanitize bower repo", 10 | "readmeFilename": "README.md", 11 | "_id": "angular-sanitize@1.0.6", 12 | "description": "bower-angular-sanitize ======================", 13 | "repository": { 14 | "type": "git", 15 | "url": "git://github.com/angular/bower-angular-sanitize.git" 16 | } 17 | } -------------------------------------------------------------------------------- /app/components/angular-scenario/README.md: -------------------------------------------------------------------------------- 1 | bower-angular-scenario 2 | ====================== 3 | 4 | bower repo for angular-scenario.js -------------------------------------------------------------------------------- /app/components/angular-scenario/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-scenario", 3 | "version": "1.0.6", 4 | "main": "./angular-scenario.js", 5 | "dependencies": { 6 | "angular": "1.0.6" 7 | }, 8 | "gitHead": "f5d1a66527ae3da81be11c802688f312ac1546fe", 9 | "readme": "bower-angular-scenario\n======================\n\nbower repo for angular-scenario.js", 10 | "readmeFilename": "README.md", 11 | "_id": "angular-scenario@1.0.6", 12 | "description": "bower-angular-scenario ======================", 13 | "repository": { 14 | "type": "git", 15 | "url": "git://github.com/angular/bower-angular-scenario.git" 16 | } 17 | } -------------------------------------------------------------------------------- /app/components/angular-scenario/jstd-scenario-adapter-config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Configuration for jstd scenario adapter 3 | */ 4 | var jstdScenarioAdapter = { 5 | relativeUrlPrefix: '/build/docs/' 6 | }; 7 | -------------------------------------------------------------------------------- /app/components/es5-shim/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /app/components/es5-shim/CONTRIBUTORS.md: -------------------------------------------------------------------------------- 1 | 2 | - kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License 3 | - tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal 4 | Project) 5 | - dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA 6 | - fschaefer Florian Schäfer Copyright (C) 2010 MIT License 7 | - Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License 8 | - kitcambridge Kit Cambridge Copyright (C) 2011 MIT License 9 | - kossnocorp Sasha Koss XXX TODO License or CLA 10 | - bryanforbes Bryan Forbes XXX TODO License or CLA 11 | - killdream Quildreen Motta Copyright (C) 2011 MIT Licence 12 | - michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD 13 | License 14 | - sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License 15 | - bbqsrc Brendan Molloy (C) 2011 Creative Commons Zero (public domain) 16 | - iwyg XXX TODO License or CLA 17 | - DomenicDenicola Domenic Denicola Copyright (C) 2011 MIT License 18 | - xavierm02 Montillet Xavier Copyright (C) 2011 MIT License 19 | - Raynos Jake Verbaten Copyright (C) 2011 MIT Licence 20 | - samsonjs Sami Samhuri Copyright (C) 2010 MIT License 21 | - rwldrn Rick Waldron Copyright (C) 2011 MIT License 22 | - lexer Alexey Zakharov XXX TODO License or CLA 23 | - 280 North Inc. (Now Motorola LLC, a subsidiary of Google Inc.) 24 | Copyright (C) 2009 MIT License 25 | 26 | -------------------------------------------------------------------------------- /app/components/es5-shim/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Copyright 2009, 2010 Kristopher Michael Kowal. All rights reserved. 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to 5 | deal in the Software without restriction, including without limitation the 6 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 7 | sell copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19 | IN THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /app/components/es5-shim/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "es5-shim", 3 | "version": "2.0.9", 4 | "repository": { 5 | "type": "git", 6 | "url": "git://github.com/kriskowal/es5-shim" 7 | } 8 | } -------------------------------------------------------------------------------- /app/components/es5-shim/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "es5-shim", 3 | "version": "2.0.9", 4 | "description": "ES5 as implementable on previous engines", 5 | "homepage": "http://github.com/kriskowal/es5-shim/", 6 | "contributors": [ 7 | "Kris Kowal (http://github.com/kriskowal/)", 8 | "Sami Samhuri (http://samhuri.net/)", 9 | "Florian Schäfer (http://github.com/fschaefer)", 10 | "Irakli Gozalishvili (http://jeditoolkit.com)", 11 | "Kit Cambridge (http://kitcambridge.github.com)" 12 | ], 13 | "bugs": { 14 | "mail": "kris@cixar.com", 15 | "url": "http://github.com/kriskowal/es5-shim/issues" 16 | }, 17 | "licenses": [ 18 | { 19 | "type": "MIT", 20 | "url": "http://github.com/kriskowal/es5-shim/raw/master/LICENSE" 21 | } 22 | ], 23 | "main": "es5-shim.js", 24 | "repository": { 25 | "type": "git", 26 | "url": "http://github.com/kriskowal/es5-shim.git" 27 | }, 28 | "scripts": { 29 | "minify": "uglifyjs es5-shim.js --source-map=es5-shim.map -b ascii_only=true,beautify=false > es5-shim.min.js; uglifyjs es5-sham.js --source-map=es5-sham.map -b ascii_only=true,beautify=false > es5-sham.min.js" 30 | }, 31 | "engines": { 32 | "node": ">=0.2.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/components/es5-shim/tests/helpers/h-kill.js: -------------------------------------------------------------------------------- 1 | // This methods allows the killing of built-in functions, 2 | // so the shim can take over with that implementation 3 | var HLP = (function() { 4 | "use strict"; 5 | var kill; 6 | 7 | kill = function(_class, methods) { 8 | /*if(!Array.isArray(methods)) 9 | return;*/ 10 | if(!_class.originals) 11 | _class.originals = {}; 12 | 13 | for (var i = 0, len = methods.length; i < len; i++) { 14 | var obj = methods[i]; 15 | _class.originals[obj] = _class[obj]; 16 | delete _class[obj]; 17 | if (obj in _class) { 18 | // try something more aggressive since V8 at least 19 | // appears to ignore the delete. 20 | _class[obj] = null; 21 | if (_class[obj]) { 22 | console.log("Couln't overwrite", obj, "of", _class); 23 | } 24 | } 25 | } 26 | }; 27 | return { kill: kill }; 28 | }()); 29 | 30 | HLP.kill(Function.prototype, [ 31 | 'bind' 32 | ]); 33 | 34 | HLP.kill(Array, [ 35 | 'isArray' 36 | ]); 37 | 38 | HLP.kill(String.prototype, [ 39 | "trim" 40 | ]); 41 | 42 | HLP.kill(Object, [ 43 | 'keys' 44 | ]); 45 | 46 | HLP.kill(Number.prototype, [ 47 | 'toFixed' 48 | ]); 49 | 50 | HLP.kill(Date, [ 51 | 'now', 'parse' 52 | ]); 53 | 54 | HLP.kill(Date.prototype, [ 55 | "toJSON", "toISOString" 56 | ]); 57 | 58 | HLP.kill(Array.prototype, [ 59 | 'forEach', 'some', 'every', 60 | 'indexOf', 'lastIndexOf', 61 | 'map', 'filter', 62 | 'reduce', 'reduceRight' 63 | ]); 64 | -------------------------------------------------------------------------------- /app/components/es5-shim/tests/helpers/h-matchers.js: -------------------------------------------------------------------------------- 1 | beforeEach(function() { 2 | this.addMatchers({ 3 | toExactlyMatch: function(expected) { 4 | var a1, a2, 5 | l, i, 6 | key, 7 | actual = this.actual; 8 | 9 | var getKeys = function(o) { 10 | var a = []; 11 | for(key in o) { 12 | if(o.hasOwnProperty(key)) { 13 | a.push(key); 14 | } 15 | } 16 | return a; 17 | } 18 | a1 = getKeys(actual); 19 | a2 = getKeys(expected); 20 | 21 | l = a1.length; 22 | if(l !== a2.length) { 23 | return false; 24 | } 25 | for(i = 0; i < l; i++) { 26 | key = a1[i]; 27 | expect(key).toEqual(a2[i]); 28 | expect(actual[key]).toEqual(expected[key]); 29 | } 30 | 31 | return true; 32 | } 33 | }) 34 | }); 35 | -------------------------------------------------------------------------------- /app/components/es5-shim/tests/helpers/h.js: -------------------------------------------------------------------------------- 1 | function implement() { 2 | throw 'Not implemented'; 3 | } -------------------------------------------------------------------------------- /app/components/es5-shim/tests/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Jasmine Spec Runner 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 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /app/components/es5-shim/tests/index.min.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Jasmine Spec Runner 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 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /app/components/es5-shim/tests/lib/jasmine_favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/app/components/es5-shim/tests/lib/jasmine_favicon.png -------------------------------------------------------------------------------- /app/components/es5-shim/tests/spec/s-number.js: -------------------------------------------------------------------------------- 1 | describe('Number', function () { 2 | 'use strict'; 3 | 4 | describe('toFixed', function () { 5 | it('should convert numbers correctly', function () { 6 | expect((0.00008).toFixed(3)).toBe('0.000'); 7 | expect((0.9).toFixed(0)).toBe('1'); 8 | expect((1.255).toFixed(2)).toBe('1.25'); 9 | expect((1843654265.0774949).toFixed(5)).toBe('1843654265.07749'); 10 | expect((1000000000000000128).toFixed(0)).toBe('1000000000000000128'); 11 | }); 12 | }); 13 | 14 | }); 15 | -------------------------------------------------------------------------------- /app/components/es5-shim/tests/spec/s-string.js: -------------------------------------------------------------------------------- 1 | describe('String', function() { 2 | "use strict"; 3 | describe("trim", function() { 4 | var test = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFFHello, World!\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF"; 5 | 6 | it('trims all ES5 whitespace', function() { 7 | expect(test.trim()).toEqual("Hello, World!"); 8 | expect(test.trim().length).toEqual(13); 9 | }); 10 | }); 11 | 12 | describe("split", function() { 13 | var test = "ab"; 14 | 15 | it('If "separator" is undefined must return Array with one String - "this" string', function() { 16 | expect(test.split()).toEqual([test]); 17 | expect(test.split(void 0)).toEqual([test]); 18 | }); 19 | 20 | it('If "separator" is undefined and "limit" set to 0 must return Array[]', function() { 21 | expect(test.split(void 0, 0)).toEqual([]); 22 | }); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app/components/iscroll/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | dist/*.js 3 | node_modules -------------------------------------------------------------------------------- /app/components/iscroll/README.md: -------------------------------------------------------------------------------- 1 | iScroll v4.2.5 - 2012-10-26 2 | =========================== 3 | 4 | The overflow:scroll for mobile webkit. Project started because webkit for iPhone does not provide a native way to scroll content inside a fixed size (width/height) div. So basically it was impossible to have a fixed header/footer and a scrolling central area. Until now. Read more at [cubiq.org](http://cubiq.org). 5 | 6 | ## Ender support 7 | Using [Ender](http://ender.no.de), add it to your existing build 8 | 9 | $ ender add iscroll 10 | 11 | Use it like this: 12 | 13 | ``` js 14 | var myScroll = $('#doc').iScroll(options) 15 | ``` 16 | 17 | ## Credits and Special thanks 18 | iScroll is evolving thank to the help of all those who sent suggestions, bug reports and ideas on [github](https://github.com/cubiq/iscroll), my [blog](http://cubiq.org) and [googlecode](http://code.google.com/p/iscroll-js/). This is by no means the work of a sole man. 19 | 20 | In completely random order: 21 | 22 | - All Github [contributors](https://github.com/cubiq/iscroll/contributors) 23 | - [beedesk](http://beedesk.com) for bug squashing in the pull to refresh feature 24 | - [Daniel J. Pinter](http://twitter.com/#!/HeadDZombie) for continued support, bug reports and for killing zombies 25 | - [Aseem Kishore](http://about.me/aseemk) for help with the zoom functionality 26 | - [Alex Gibson](http://miniapps.co.uk/) for continued support and bug reports 27 | - [Christoph Pojer](http://cpojer.net) for ideas, suggestions and bug reports 28 | - [Shimon Dookdin](https://github.com/shimondoodkin) for help with wheel support 29 | - [Will Bailey](http://blog.thirtymontgomery.com/) for commonJS compatibility 30 | - [Aaron Reisman](https://github.com/lifeiscontent) for bug reports and continued support 31 | - [David Haslem](https://github.com/therabidbanana) for suggestions and bug reports 32 | - [gingertom](https://github.com/gingertom) for suggestions and bug reports 33 | - [David Alan Hjelle](https://github.com/dahjelle) for bug squashing 34 | - [iangilman](https://github.com/iangilman) for help with the zoom functionality 35 | - All those who supported, linked, loved the iScroll 36 | - I'm sure I'm missing someone, sorry about that. If you helped in the script development and you don't see your name here, please drop me a line 37 | -------------------------------------------------------------------------------- /app/components/iscroll/bin/make-dist: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | java -jar /usr/local/bin/yuicompressor-2.4.6.jar -v --charset utf-8 ../src/iscroll.js -o ../dist/iscroll-min.js 4 | java -jar /usr/local/bin/yuicompressor-2.4.6.jar -v --charset utf-8 ../src/iscroll-lite.js -o ../dist/iscroll-lite-min.js 5 | -------------------------------------------------------------------------------- /app/components/iscroll/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "iscroll", 3 | "version": "0.0.0", 4 | "commit": "d1e642c1d6751877ca0b2b13faf6c2bd512bf473", 5 | "repository": { 6 | "type": "git", 7 | "url": "git://github.com/cubiq/iscroll.git" 8 | } 9 | } -------------------------------------------------------------------------------- /app/components/iscroll/examples/custom-scrollbar/scrollbar.css: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * 4 | * Horizontal Scrollbar 5 | * 6 | */ 7 | .myScrollbarH { 8 | position:absolute; 9 | z-index:100; 10 | height:8px; 11 | bottom:1px; 12 | left:2px; 13 | right:7px 14 | } 15 | 16 | .myScrollbarH > div { 17 | position:absolute; 18 | z-index:100; 19 | height:100%; 20 | 21 | /* The following is probably what you want to customize */ 22 | background-image:-webkit-gradient(linear, 0 0, 100% 0, from(#a00), to(#f00)); 23 | background-image:-moz-linear-gradient(top, #f00, #900); 24 | background-image:-o-linear-gradient(top, #f00, #900); 25 | 26 | border:1px solid #900; 27 | -webkit-background-clip:padding-box; 28 | -moz-background-clip:padding-box; 29 | -o-background-clip:padding-box; 30 | background-clip:padding-box; 31 | 32 | -webkit-box-sizing:border-box; 33 | -moz-box-sizing:border-box; 34 | -o-box-sizing:border-box; 35 | box-sizing:border-box; 36 | 37 | -webkit-border-radius:4px; 38 | -moz-border-radius:4px; 39 | -o-border-radius:4px; 40 | border-radius:4px; 41 | 42 | -webkit-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5); 43 | -moz-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5); 44 | -o-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5); 45 | box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5); 46 | } 47 | 48 | 49 | /** 50 | * 51 | * Vertical Scrollbar 52 | * 53 | */ 54 | .myScrollbarV { 55 | position:absolute; 56 | z-index:100; 57 | width:8px;bottom:7px;top:2px;right:1px 58 | } 59 | 60 | .myScrollbarV > div { 61 | position:absolute; 62 | z-index:100; 63 | width:100%; 64 | 65 | /* The following is probably what you want to customize */ 66 | background:-webkit-gradient(linear, 0 0, 100% 0, from(#f00), to(#900)); 67 | background-image:-moz-linear-gradient(top, #f00, #900); 68 | background-image:-o-linear-gradient(top, #f00, #900); 69 | 70 | border:1px solid #900; 71 | 72 | -webkit-background-clip:padding-box; 73 | -moz-background-clip:padding-box; 74 | -o-background-clip:padding-box; 75 | background-clip:padding-box; 76 | 77 | -webkit-box-sizing:border-box; 78 | -moz-box-sizing:border-box; 79 | -o-box-sizing:border-box; 80 | box-sizing:border-box; 81 | 82 | -webkit-border-radius:4px; 83 | -moz-border-radius:4px; 84 | -o-border-radius:4px; 85 | border-radius:4px; 86 | 87 | -webkit-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5); 88 | -moz-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5); 89 | -o-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5); 90 | box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5); 91 | } 92 | -------------------------------------------------------------------------------- /app/components/iscroll/examples/ios-perfect-scrollbar/scrollbar.css: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Horizontal Scrollbar 4 | * 5 | */ 6 | .myScrollbarH { 7 | position:absolute; 8 | z-index:100; 9 | height:7px; 10 | bottom:1px; 11 | left:2px; 12 | right:7px 13 | } 14 | 15 | .myScrollbarH > div { 16 | height:100%; 17 | } 18 | 19 | 20 | /** 21 | * 22 | * Vertical Scrollbar 23 | * 24 | */ 25 | .myScrollbarV { 26 | position:absolute; 27 | z-index:100; 28 | width:7px;bottom:7px;top:2px;right:1px 29 | } 30 | 31 | .myScrollbarV > div { 32 | width:100%; 33 | } 34 | 35 | 36 | /** 37 | * 38 | * Both Scrollbars 39 | * 40 | */ 41 | .myScrollbarH > div, 42 | .myScrollbarV > div { 43 | position:absolute; 44 | z-index:100; 45 | 46 | /* The following is probably what you want to customize */ 47 | -webkit-box-sizing:border-box; 48 | -moz-box-sizing:border-box; 49 | -o-box-sizing:border-box; 50 | box-sizing:border-box; 51 | 52 | border-width:3px; 53 | -webkit-border-image:url(scrollbar.png) 6 6 6 6; 54 | -moz-border-image:url(scrollbar.png) 6 6 6 6; 55 | -o-border-image:url(scrollbar.png) 6 6 6 6; 56 | border-image:url(scrollbar.png) 6 6 6 6; 57 | } 58 | -------------------------------------------------------------------------------- /app/components/iscroll/examples/ios-perfect-scrollbar/scrollbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/app/components/iscroll/examples/ios-perfect-scrollbar/scrollbar.png -------------------------------------------------------------------------------- /app/components/iscroll/examples/pull-to-refresh/pull-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/app/components/iscroll/examples/pull-to-refresh/pull-icon@2x.png -------------------------------------------------------------------------------- /app/components/iscroll/examples/zoom/iscroll.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/app/components/iscroll/examples/zoom/iscroll.jpg -------------------------------------------------------------------------------- /app/components/iscroll/license.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Matteo Spinelli, http://cubiq.org/ 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /app/components/iscroll/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "iscroll" 3 | , "description": "smooth scrolling for mobile webkit" 4 | , "version": "4.2.5" 5 | , "homepage": "http://cubiq.org/iscroll-4" 6 | , "author": "Matteo Spinelli (http://cubiq.org)" 7 | , "keywords": ["ender", "iscroll", "scrolling", "webkit", "iphone", "android"] 8 | , "main": "./src/iscroll.js" 9 | , "ender": "./src/ender.js" 10 | , "repository": { 11 | "type": "git" 12 | , "url": "https://github.com/cubiq/iscroll.git" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/components/iscroll/src/ender.js: -------------------------------------------------------------------------------- 1 | !function ($, iScroll) { 2 | $.ender({ 3 | iScroll: function (options) { 4 | return new iScroll(this[0], options) 5 | } 6 | }, true) 7 | }(ender, require('iscroll').iScroll) -------------------------------------------------------------------------------- /app/components/jquery-masonry/.gitignore: -------------------------------------------------------------------------------- 1 | _site/ 2 | notes.mdown -------------------------------------------------------------------------------- /app/components/jquery-masonry/.tm_properties: -------------------------------------------------------------------------------- 1 | softTabs = true 2 | tabSize = 2 3 | excludeInFileChooser = "{$exclude,_site/*}" 4 | -------------------------------------------------------------------------------- /app/components/jquery-masonry/CONTRIBUTING.mdown: -------------------------------------------------------------------------------- 1 | ## Submitting issues 2 | 3 | ### Read the Help page 4 | 5 | [The Help page in the docs](http://masonry.desandro.com/docs/help.html) covers most issues. Please look it over first before submitting an issue. 6 | 7 | ### Provide an isolated example with a live URL 8 | 9 | **A live URL is required** for any bug report or personal issue request. Try re-creating the issue in jsFiddle or CodePen using these templates: 10 | 11 | + [jsFiddle jQuery Masonry template](http://jsfiddle.net/desandro/7ZVb7/) 12 | + [CodePen jQuery Masonry template](http://codepen.io/desandro/pen/BLzoK) 13 | 14 | ### Look over the Issues Agreement 15 | 16 | I wrote an [Issues Agreement](https://github.com/desandro/issues-agreement/#readme) that covers how to submit a good issue. 17 | -------------------------------------------------------------------------------- /app/components/jquery-masonry/README.mdown: -------------------------------------------------------------------------------- 1 | jQuery Masonry 2 | ============== 3 | 4 | Masonry is a dynamic grid layout plugin for jQuery. Think of it as the flip-side of CSS floats. Whereas floating arranges elements horizontally then vertically, Masonry arranges elements vertically, positioning each element in the next open spot in the grid. The result minimizes vertical gaps between elements of varying height, just like a mason fitting stones in a wall. 5 | 6 | This package has all the documentation and demos to get you started. 7 | 8 | View this project live at [http://masonry.desandro.com](http://masonry.desandro.com). 9 | 10 | ## Viewing this project locally 11 | 12 | 13 | ### Via download 14 | 15 | You can download a zip of all the flat HTML files from [http://meta.metafizzy.co/files/masonry-site.zip](http://meta.metafizzy.co/files/masonry-site.zip). 16 | 17 | ### Via Jekyll 18 | 19 | The documentation and demo pages are generated using [Jekyll](http://github.com/mojombo/jekyll/wiki). With Jekyll installed, you can clone this repo and run Jekyll from Terminal: 20 | 21 | git clone https://github.com/desandro/masonry.git 22 | cd masonry/ 23 | jekyll --server --auto 24 | 25 | Then view the live site at [http://localhost:4000](http://localhost:4000). 26 | 27 | * * * 28 | 29 | Copyright (c) 2012 David DeSandro -------------------------------------------------------------------------------- /app/components/jquery-masonry/_config.yml: -------------------------------------------------------------------------------- 1 | name: jQuery Masonry 2 | permalink: /:categories/:title.html 3 | pygments: true 4 | masonry_js: jquery.masonry.min.js 5 | jquery_js: js/jquery-1.7.1.min.js 6 | exclude: [ minify.sh, notes.mdown ] -------------------------------------------------------------------------------- /app/components/jquery-masonry/_posts/tests/2011-01-01-index.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tests 3 | category: tests 4 | layout: default 5 | is_index: true 6 | --- 7 | 8 |
    9 | {% for test in site.categories.tests reversed %} 10 | {% unless test.is_index %} 11 |
  • {{ test.title }} 12 | {% endunless %} 13 | {% endfor %} 14 |
-------------------------------------------------------------------------------- /app/components/jquery-masonry/_posts/tests/2011-09-27-centered-few.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: Centered few 3 | category: tests 4 | layout: default 5 | has_modernizr: true 6 | --- 7 | 8 |
9 |

When there's only a couple items, the container should shrink to fit the layout, and not leave any empty columns.

10 |
11 | 12 |
13 | 14 |
15 |

Phasellus pede arcu, dapibus eu, fermentum et, dapibus sed, urna.

16 |

Phasellus pede arcu, dapibus eu, fermentum et, dapibus sed, urna.

17 |

Phasellus pede arcu, dapibus eu, fermentum et, dapibus sed, urna.

18 |
19 | 20 |
21 |

Ut condimentum mi vel tellus. Suspendisse laoreet. Fusce ut est sed dolor gravida convallis. Morbi vitae ante. Vivamus ultrices luctus nunc. Suspendisse et dolor. Etiam dignissim. Proin malesuada adipiscing lacus. Donec metus. Curabitur gravida.

22 |

Phasellus pede arcu, dapibus eu, fermentum et, dapibus sed, urna.

23 |
24 | 25 |
26 |

Ut condimentum mi vel tellus. Suspendisse laoreet. Fusce ut est sed dolor gravida convallis. Morbi vitae ante. Vivamus ultrices luctus nunc. Suspendisse et dolor. Etiam dignissim. Proin malesuada adipiscing lacus. Donec metus. Curabitur gravida.

27 |

Phasellus pede arcu, dapibus eu, fermentum et, dapibus sed, urna.

28 |
29 | 30 |
31 |

Sed ac risus. Phasellus lacinia, magna a ullamcorper laoreet, lectus arcu pulvinar risus, vitae facilisis libero dolor a purus. Sed vel lacus. Mauris nibh felis, adipiscing varius, adipiscing in, lacinia vel, tellus. Suspendisse ac urna. Etiam pellentesque mauris ut lectus. Nunc tellus ante, mattis eget, gravida vitae, ultricies ac, leo. Integer leo pede, ornare a, lacinia eu, vulputate vel, nisl.

32 |
33 | 34 |
35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/components/jquery-masonry/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-masonry", 3 | "version": "2.1.08", 4 | "description": "Layout elements in a grid, like a mason fitting stones in a wall", 5 | "main": "jquery.masonry.js", 6 | "dependencies": { 7 | "jquery": ">=1.5" 8 | }, 9 | "gitHead": "7bd495ebd18f1c200c192beaf20d1fc1cd5b2fa9", 10 | "readme": "jQuery Masonry\n==============\n\nMasonry is a dynamic grid layout plugin for jQuery. Think of it as the flip-side of CSS floats. Whereas floating arranges elements horizontally then vertically, Masonry arranges elements vertically, positioning each element in the next open spot in the grid. The result minimizes vertical gaps between elements of varying height, just like a mason fitting stones in a wall.\n\nThis package has all the documentation and demos to get you started.\n\nView this project live at [http://masonry.desandro.com](http://masonry.desandro.com).\n\n## Viewing this project locally\n\n\n### Via download\n\nYou can download a zip of all the flat HTML files from [http://meta.metafizzy.co/files/masonry-site.zip](http://meta.metafizzy.co/files/masonry-site.zip).\n\n### Via Jekyll\n\nThe documentation and demo pages are generated using [Jekyll](http://github.com/mojombo/jekyll/wiki). With Jekyll installed, you can clone this repo and run Jekyll from Terminal:\n\n git clone https://github.com/desandro/masonry.git\n cd masonry/\n jekyll --server --auto\n\nThen view the live site at [http://localhost:4000](http://localhost:4000).\n\n* * *\n\nCopyright (c) 2012 David DeSandro", 11 | "readmeFilename": "README.mdown", 12 | "_id": "jquery-masonry@2.1.08", 13 | "repository": { 14 | "type": "git", 15 | "url": "git://github.com/desandro/masonry" 16 | } 17 | } -------------------------------------------------------------------------------- /app/components/jquery-masonry/js/modernizr-transitions.js: -------------------------------------------------------------------------------- 1 | /* Modernizr custom build of 1.7: csstransitions */ 2 | window.Modernizr=function(a,b,c){function G(){}function F(a,b){var c=a.charAt(0).toUpperCase()+a.substr(1),d=(a+" "+p.join(c+" ")+c).split(" ");return!!E(d,b)}function E(a,b){for(var d in a)if(k[a[d]]!==c&&(!b||b(a[d],j)))return!0}function D(a,b){return(""+a).indexOf(b)!==-1}function C(a,b){return typeof a===b}function B(a,b){return A(o.join(a+";")+(b||""))}function A(a){k.cssText=a}var d="1.7",e={},f=!0,g=b.documentElement,h=b.head||b.getElementsByTagName("head")[0],i="modernizr",j=b.createElement(i),k=j.style,l=b.createElement("input"),m=":)",n=Object.prototype.toString,o=" -webkit- -moz- -o- -ms- -khtml- ".split(" "),p="Webkit Moz O ms Khtml".split(" "),q={svg:"http://www.w3.org/2000/svg"},r={},s={},t={},u=[],v,w=function(a){var c=b.createElement("style"),d=b.createElement("div"),e;c.textContent=a+"{#modernizr{height:3px}}",h.appendChild(c),d.id="modernizr",g.appendChild(d),e=d.offsetHeight===3,c.parentNode.removeChild(c),d.parentNode.removeChild(d);return!!e},x=function(){function d(d,e){e=e||b.createElement(a[d]||"div");var f=(d="on"+d)in e;f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=C(e[d],"function"),C(e[d],c)||(e[d]=c),e.removeAttribute(d))),e=null;return f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),y=({}).hasOwnProperty,z;C(y,c)||C(y.call,c)?z=function(a,b){return b in a&&C(a.constructor.prototype[b],c)}:z=function(a,b){return y.call(a,b)},r.csstransitions=function(){return F("transitionProperty")};for(var H in r)z(r,H)&&(v=H.toLowerCase(),e[v]=r[H](),u.push((e[v]?"":"no-")+v));e.input||G(),e.crosswindowmessaging=e.postmessage,e.historymanagement=e.history,e.addTest=function(a,b){a=a.toLowerCase();if(!e[a]){b=!!b(),g.className+=" "+(b?"":"no-")+a,e[a]=b;return e}},A(""),j=l=null,e._enableHTML5=f,e._version=d,g.className=g.className.replace(/\bno-js\b/,"")+" js "+u.join(" ");return e}(this,this.document) -------------------------------------------------------------------------------- /app/components/jquery-masonry/minify.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # minifies jquery.masonry.js 4 | # requires nodejs & uglifyjs 5 | 6 | IN=jquery.masonry.js 7 | OUT=jquery.masonry.min.js 8 | 9 | # remove any lines that begin with /*jshint or /*global 10 | # then, minify with Uglify JS 11 | # then, add newline characters after `*/`, but not last newline character 12 | awk '!/^\/\*[jshint|global]/' $IN \ 13 | | uglifyjs \ 14 | | awk '{ORS=""; gsub(/\*\//,"*/\n"); if (NR!=1) print "\n"; print;}' > $OUT 15 | echo "Minified" $IN "as" $OUT 16 | 17 | -------------------------------------------------------------------------------- /app/components/jquery/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | -------------------------------------------------------------------------------- /app/components/jquery/README.md: -------------------------------------------------------------------------------- 1 | jQuery Component 2 | ================ 3 | 4 | Shim repository for the [jQuery](http://jquery.com). 5 | 6 | Package Managers 7 | ---------------- 8 | 9 | * [Bower](http://twitter.github.com/bower/): `jquery` 10 | * [Component](https://github.com/component/component): `components/jquery` 11 | * [Composer](http://packagist.org/packages/components/jquery): `components/jquery` 12 | -------------------------------------------------------------------------------- /app/components/jquery/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "version": "2.0.0", 4 | "description": "jQuery component", 5 | "keywords": [ 6 | "jquery", 7 | "component" 8 | ], 9 | "main": "jquery.js", 10 | "scripts": [ 11 | "jquery.js" 12 | ], 13 | "license": "MIT" 14 | } 15 | -------------------------------------------------------------------------------- /app/components/jquery/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "version": "2.0.0", 4 | "description": "jQuery component", 5 | "keywords": [ 6 | "jquery", 7 | "component" 8 | ], 9 | "main": "jquery.js", 10 | "scripts": [ 11 | "jquery.js" 12 | ], 13 | "license": "MIT", 14 | "gitHead": "04d8a870773a9b3dce467db6e7662c888f9ff40b", 15 | "readme": "jQuery Component\n================\n\nShim repository for the [jQuery](http://jquery.com).\n\nPackage Managers\n----------------\n\n* [Bower](http://twitter.github.com/bower/): `jquery`\n* [Component](https://github.com/component/component): `components/jquery`\n* [Composer](http://packagist.org/packages/components/jquery): `components/jquery`\n", 16 | "readmeFilename": "README.md", 17 | "_id": "jquery@2.0.0", 18 | "repository": { 19 | "type": "git", 20 | "url": "git://github.com/components/jquery.git" 21 | } 22 | } -------------------------------------------------------------------------------- /app/components/jquery/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "components/jquery", 3 | "description": "jQuery JavaScript Library", 4 | "type": "component", 5 | "homepage": "http://jquery.com", 6 | "license": "MIT", 7 | "support": { 8 | "irc": "irc://irc.freenode.org/jquery", 9 | "issues": "http://bugs.jquery.com", 10 | "forum": "http://forum.jquery.com", 11 | "wiki": "http://docs.jquery.com/", 12 | "source": "https://github.com/jquery/jquery" 13 | }, 14 | "authors": [ 15 | { 16 | "name": "John Resig", 17 | "email": "jeresig@gmail.com" 18 | } 19 | ], 20 | "require": { 21 | "robloach/component-installer": "*" 22 | }, 23 | "extra": { 24 | "component": { 25 | "scripts": [ 26 | "jquery.js" 27 | ], 28 | "files": [ 29 | "jquery.min.js", 30 | "jquery-migrate.js", 31 | "jquery-migrate.min.js" 32 | ] 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/components/jquery/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "components-jquery", 3 | "version": "2.0.0", 4 | "description": "jQuery component", 5 | "keywords": ["jquery"], 6 | "main": "./jquery.js" 7 | } 8 | -------------------------------------------------------------------------------- /app/components/json3/.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "vendor/spec"] 2 | path = vendor/spec 3 | url = git://github.com/kitcambridge/spec.git 4 | [submodule "vendor/marked"] 5 | path = vendor/marked 6 | url = git://github.com/chjj/marked.git 7 | -------------------------------------------------------------------------------- /app/components/json3/.npmignore: -------------------------------------------------------------------------------- 1 | build.js 2 | index.html 3 | jsl.conf 4 | 5 | page 6 | test 7 | vendor -------------------------------------------------------------------------------- /app/components/json3/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Kit Cambridge. 2 | http://kitcambridge.github.com 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of 5 | this software and associated documentation files (the "Software"), to deal in 6 | the Software without restriction, including without limitation the rights to 7 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 8 | of the Software, and to permit persons to whom the Software is furnished to do 9 | so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. -------------------------------------------------------------------------------- /app/components/json3/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "json3", 3 | "version": "3.2.4", 4 | "repository": { 5 | "type": "git", 6 | "url": "git://github.com/bestiejs/json3.git" 7 | } 8 | } -------------------------------------------------------------------------------- /app/components/json3/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "json3", 3 | "version": "3.2.4", 4 | "description": "A modern JSON implementation compatible with nearly all JavaScript platforms.", 5 | "homepage": "http://bestiejs.github.com/json3", 6 | "main": "./lib/json3", 7 | "keywords": ["json", "spec", "ecma", "es5", "lexer", "parser", "stringify"], 8 | "licenses": [{ 9 | "type": "MIT", 10 | "url": "http://kit.mit-license.org/" 11 | }], 12 | "author": { 13 | "name": "Kit Cambridge", 14 | "web": "http://kitcambridge.github.com" 15 | }, 16 | "maintainers": [{ 17 | "name": "Kit Cambridge", 18 | "web": "http://kitcambridge.github.com" 19 | }], 20 | "bugs": { 21 | "url": "http://github.com/bestiejs/json3/issues" 22 | }, 23 | "scripts": { 24 | "test": "node test/test_*.js" 25 | }, 26 | "repository": { 27 | "type": "git", 28 | "url": "git://github.com/bestiejs/json3.git" 29 | } 30 | } -------------------------------------------------------------------------------- /app/components/json3/page/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/app/components/json3/page/background.png -------------------------------------------------------------------------------- /app/components/json3/page/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/app/components/json3/page/logo.png -------------------------------------------------------------------------------- /app/components/json3/page/page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | JSON 3 6 | 7 | 8 | 9 | 12 |
13 | <%= source %> 14 |
15 | 18 | 19 | -------------------------------------------------------------------------------- /app/components/json3/test/test_browser.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | JSON 3 Unit Tests 6 | 7 | 8 | 9 | 28 | 56 | 57 | 58 |
59 | 60 | -------------------------------------------------------------------------------- /app/components/json3/vendor/closure-compiler.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/app/components/json3/vendor/closure-compiler.jar -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/app/favicon.ico -------------------------------------------------------------------------------- /app/img/gplus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/app/img/gplus.png -------------------------------------------------------------------------------- /app/img/rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/app/img/rss.png -------------------------------------------------------------------------------- /app/img/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/app/img/twitter.png -------------------------------------------------------------------------------- /app/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org 2 | 3 | User-agent: * 4 | -------------------------------------------------------------------------------- /app/scripts/angular/angular-bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.0.7-93891ad 3 | (c) 2010-2012 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(n,j){'use strict';j.module("bootstrap",[]).directive({dropdownToggle:["$document","$location","$window",function(h,e){var d=null,a;return{restrict:"C",link:function(g,b){g.$watch(function(){return e.path()},function(){a&&a()});b.parent().bind("click",function(){a&&a()});b.bind("click",function(i){i.preventDefault();i.stopPropagation();i=!1;d&&(i=d===b,a());i||(b.parent().addClass("open"),d=b,a=function(c){c&&c.preventDefault();c&&c.stopPropagation();h.unbind("click",a);b.parent().removeClass("open"); 7 | d=a=null},h.bind("click",a))})}}}],tabbable:function(){return{restrict:"C",compile:function(h){var e=j.element(''),d=j.element('
');d.append(h.contents());h.append(e).append(d)},controller:["$scope","$element",function(h,e){var d=e.contents().eq(0),a=e.controller("ngModel")||{},g=[],b;a.$render=function(){var a=this.$viewValue;if(b?b.value!=a:a)if(b&&(b.paneElement.removeClass("active"),b.tabElement.removeClass("active"),b=null),a){for(var c= 8 | 0,d=g.length;c"),m=k.find("a"),f={paneElement:e,paneAttrs:c,tabElement:k};g.push(f);c.$observe("value",l)();c.$observe("title",function(){l();m.text(f.title)})();d.append(k);k.bind("click",function(b){b.preventDefault(); 9 | b.stopPropagation();a.$setViewValue?h.$apply(function(){a.$setViewValue(f.value);a.$render()}):(a.$viewValue=f.value,a.$render())});return function(){f.tabElement.remove();for(var a=0,b=g.length;a= 1 && (n % 100) <= 19 && n == Math.floor(n)) { return PLURAL_CATEGORY.FEW; } return PLURAL_CATEGORY.OTHER;},"id":"mo"}); 4 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_ms-bn.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "PG", 7 | "1": "PTG" 8 | }, 9 | "DAY": { 10 | "0": "Ahad", 11 | "1": "Isnin", 12 | "2": "Selasa", 13 | "3": "Rabu", 14 | "4": "Khamis", 15 | "5": "Jumaat", 16 | "6": "Sabtu" 17 | }, 18 | "MONTH": { 19 | "0": "Januari", 20 | "1": "Februari", 21 | "2": "Mac", 22 | "3": "April", 23 | "4": "Mei", 24 | "5": "Jun", 25 | "6": "Julai", 26 | "7": "Ogos", 27 | "8": "September", 28 | "9": "Oktober", 29 | "10": "November", 30 | "11": "Disember" 31 | }, 32 | "SHORTDAY": { 33 | "0": "Ahd", 34 | "1": "Isn", 35 | "2": "Sel", 36 | "3": "Rab", 37 | "4": "Kha", 38 | "5": "Jum", 39 | "6": "Sab" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "Jan", 43 | "1": "Feb", 44 | "2": "Mac", 45 | "3": "Apr", 46 | "4": "Mei", 47 | "5": "Jun", 48 | "6": "Jul", 49 | "7": "Ogos", 50 | "8": "Sep", 51 | "9": "Okt", 52 | "10": "Nov", 53 | "11": "Dis" 54 | }, 55 | "fullDate": "dd MMMM y", 56 | "longDate": "d MMMM y", 57 | "medium": "dd/MM/yyyy h:mm:ss a", 58 | "mediumDate": "dd/MM/yyyy", 59 | "mediumTime": "h:mm:ss a", 60 | "short": "d/MM/yy h:mm a", 61 | "shortDate": "d/MM/yy", 62 | "shortTime": "h:mm a" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "RM", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "(\u00A4", 89 | "negSuf": ")", 90 | "posPre": "\u00A4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "ms-bn", 96 | "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_ms-my.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "PG", 7 | "1": "PTG" 8 | }, 9 | "DAY": { 10 | "0": "Ahad", 11 | "1": "Isnin", 12 | "2": "Selasa", 13 | "3": "Rabu", 14 | "4": "Khamis", 15 | "5": "Jumaat", 16 | "6": "Sabtu" 17 | }, 18 | "MONTH": { 19 | "0": "Januari", 20 | "1": "Februari", 21 | "2": "Mac", 22 | "3": "April", 23 | "4": "Mei", 24 | "5": "Jun", 25 | "6": "Julai", 26 | "7": "Ogos", 27 | "8": "September", 28 | "9": "Oktober", 29 | "10": "November", 30 | "11": "Disember" 31 | }, 32 | "SHORTDAY": { 33 | "0": "Ahd", 34 | "1": "Isn", 35 | "2": "Sel", 36 | "3": "Rab", 37 | "4": "Kha", 38 | "5": "Jum", 39 | "6": "Sab" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "Jan", 43 | "1": "Feb", 44 | "2": "Mac", 45 | "3": "Apr", 46 | "4": "Mei", 47 | "5": "Jun", 48 | "6": "Jul", 49 | "7": "Ogos", 50 | "8": "Sep", 51 | "9": "Okt", 52 | "10": "Nov", 53 | "11": "Dis" 54 | }, 55 | "fullDate": "EEEE, d MMMM y", 56 | "longDate": "d MMMM y", 57 | "medium": "dd/MM/yyyy h:mm:ss a", 58 | "mediumDate": "dd/MM/yyyy", 59 | "mediumTime": "h:mm:ss a", 60 | "short": "d/MM/yy h:mm a", 61 | "shortDate": "d/MM/yy", 62 | "shortTime": "h:mm a" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "RM", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "(\u00a4", 89 | "negSuf": ")", 90 | "posPre": "\u00a4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "ms-my", 96 | "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_ms.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "PG", 7 | "1": "PTG" 8 | }, 9 | "DAY": { 10 | "0": "Ahad", 11 | "1": "Isnin", 12 | "2": "Selasa", 13 | "3": "Rabu", 14 | "4": "Khamis", 15 | "5": "Jumaat", 16 | "6": "Sabtu" 17 | }, 18 | "MONTH": { 19 | "0": "Januari", 20 | "1": "Februari", 21 | "2": "Mac", 22 | "3": "April", 23 | "4": "Mei", 24 | "5": "Jun", 25 | "6": "Julai", 26 | "7": "Ogos", 27 | "8": "September", 28 | "9": "Oktober", 29 | "10": "November", 30 | "11": "Disember" 31 | }, 32 | "SHORTDAY": { 33 | "0": "Ahd", 34 | "1": "Isn", 35 | "2": "Sel", 36 | "3": "Rab", 37 | "4": "Kha", 38 | "5": "Jum", 39 | "6": "Sab" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "Jan", 43 | "1": "Feb", 44 | "2": "Mac", 45 | "3": "Apr", 46 | "4": "Mei", 47 | "5": "Jun", 48 | "6": "Jul", 49 | "7": "Ogos", 50 | "8": "Sep", 51 | "9": "Okt", 52 | "10": "Nov", 53 | "11": "Dis" 54 | }, 55 | "fullDate": "EEEE, d MMMM y", 56 | "longDate": "d MMMM y", 57 | "medium": "dd/MM/yyyy h:mm:ss a", 58 | "mediumDate": "dd/MM/yyyy", 59 | "mediumTime": "h:mm:ss a", 60 | "short": "d/MM/yy h:mm a", 61 | "shortDate": "d/MM/yy", 62 | "shortTime": "h:mm a" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "RM", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "(\u00a4", 89 | "negSuf": ")", 90 | "posPre": "\u00a4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "ms", 96 | "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_sr-rs.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", {"NUMBER_FORMATS":{"DECIMAL_SEP":".","GROUP_SEP":",","PATTERNS":[{"minInt":1,"minFrac":0,"macFrac":0,"posPre":"","posSuf":"","negPre":"-","negSuf":"","gSize":3,"lgSize":3,"maxFrac":3},{"minInt":1,"minFrac":2,"macFrac":0,"posPre":"","posSuf":" \u00A4","negPre":"-","negSuf":" \u00A4","gSize":3,"lgSize":3,"maxFrac":2}],"CURRENCY_SYM":"РСД"},"pluralCat":function (n) { if ((n % 10) == 1 && (n % 100) != 11) { return PLURAL_CATEGORY.ONE; } if ((n % 10) >= 2 && (n % 10) <= 4 && ((n % 100) < 12 || (n % 100) > 14) && n == Math.floor(n)) { return PLURAL_CATEGORY.FEW; } if ((n % 10) == 0 || ((n % 10) >= 5 && (n % 10) <= 9) || ((n % 100) >= 11 && (n % 100) <= 14) && n == Math.floor(n)) { return PLURAL_CATEGORY.MANY; } return PLURAL_CATEGORY.OTHER;},"DATETIME_FORMATS":{"MONTH":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"SHORTMONTH":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"],"DAY":["недеља","понедељак","уторак","среда","четвртак","петак","субота"],"SHORTDAY":["нед","пон","уто","сре","чет","пет","суб"],"AMPMS":["пре подне","поподне"],"medium":"dd.MM.y. HH.mm.ss","short":"d.M.yy. HH.mm","fullDate":"EEEE, dd. MMMM y.","longDate":"dd. MMMM y.","mediumDate":"dd.MM.y.","shortDate":"d.M.yy.","mediumTime":"HH.mm.ss","shortTime":"HH.mm"},"id":"sr-rs"}); 4 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_ta-lk.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "am", 7 | "1": "pm" 8 | }, 9 | "DAY": { 10 | "0": "ஞாயிறு", 11 | "1": "திங்கள்", 12 | "2": "செவ்வாய்", 13 | "3": "புதன்", 14 | "4": "வியாழன்", 15 | "5": "வெள்ளி", 16 | "6": "சனி" 17 | }, 18 | "MONTH": { 19 | "0": "ஜனவரி", 20 | "1": "பிப்ரவரி", 21 | "2": "மார்ச்", 22 | "3": "ஏப்ரல்", 23 | "4": "மே", 24 | "5": "ஜூன்", 25 | "6": "ஜூலை", 26 | "7": "ஆகஸ்ட்", 27 | "8": "செப்டம்பர்", 28 | "9": "அக்டோபர்", 29 | "10": "நவம்பர்", 30 | "11": "டிசம்பர்" 31 | }, 32 | "SHORTDAY": { 33 | "0": "ஞா", 34 | "1": "தி", 35 | "2": "செ", 36 | "3": "பு", 37 | "4": "வி", 38 | "5": "வெ", 39 | "6": "ச" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "ஜன.", 43 | "1": "பிப்.", 44 | "2": "மார்.", 45 | "3": "ஏப்.", 46 | "4": "மே", 47 | "5": "ஜூன்", 48 | "6": "ஜூலை", 49 | "7": "ஆக.", 50 | "8": "செப்.", 51 | "9": "அக்.", 52 | "10": "நவ.", 53 | "11": "டிச." 54 | }, 55 | "fullDate": "EEEE, d MMMM, y", 56 | "longDate": "d MMMM, y", 57 | "medium": "d MMM, y h:mm:ss a", 58 | "mediumDate": "d MMM, y", 59 | "mediumTime": "h:mm:ss a", 60 | "short": "d-M-yy h:mm a", 61 | "shortDate": "d-M-yy", 62 | "shortTime": "h:mm a" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "₹", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 2, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 2, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "\u00A4 -", 89 | "negSuf": "", 90 | "posPre": "\u00A4 ", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "ta-lk", 96 | "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_tl-ph.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", {"NUMBER_FORMATS":{"DECIMAL_SEP":".","GROUP_SEP":",","PATTERNS":[{"minInt":1,"minFrac":0,"macFrac":0,"posPre":"","posSuf":"","negPre":"-","negSuf":"","gSize":3,"lgSize":3,"maxFrac":3},{"minInt":1,"minFrac":2,"macFrac":0,"posPre":"\u00A4 ","posSuf":"","negPre":"\u00A4 -","negSuf":"","gSize":3,"lgSize":3,"maxFrac":2}],"CURRENCY_SYM":"P"},"pluralCat":function (n) { if (n == 0 || n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;},"DATETIME_FORMATS":{"MONTH":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"SHORTMONTH":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"DAY":["Linggo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado"],"SHORTDAY":["Lin","Lun","Mar","Mye","Huw","Bye","Sab"],"AMPMS":["AM","PM"],"medium":"MMM d, y HH:mm:ss","short":"M/d/yy HH:mm","fullDate":"EEEE, MMMM dd y","longDate":"MMMM d, y","mediumDate":"MMM d, y","shortDate":"M/d/yy","mediumTime":"HH:mm:ss","shortTime":"HH:mm"},"id":"tl-ph"}); 4 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_ur-in.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "دن", 7 | "1": "رات" 8 | }, 9 | "DAY": { 10 | "0": "اتوار", 11 | "1": "پير", 12 | "2": "منگل", 13 | "3": "بده", 14 | "4": "جمعرات", 15 | "5": "جمعہ", 16 | "6": "ہفتہ" 17 | }, 18 | "MONTH": { 19 | "0": "جنوری", 20 | "1": "فروری", 21 | "2": "مارچ", 22 | "3": "اپريل", 23 | "4": "مئ", 24 | "5": "جون", 25 | "6": "جولائ", 26 | "7": "اگست", 27 | "8": "ستمبر", 28 | "9": "اکتوبر", 29 | "10": "نومبر", 30 | "11": "دسمبر" 31 | }, 32 | "SHORTDAY": { 33 | "0": "اتوار", 34 | "1": "پير", 35 | "2": "منگل", 36 | "3": "بده", 37 | "4": "جمعرات", 38 | "5": "جمعہ", 39 | "6": "ہفتہ" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "جنوری", 43 | "1": "فروری", 44 | "2": "مارچ", 45 | "3": "اپريل", 46 | "4": "مئ", 47 | "5": "جون", 48 | "6": "جولائ", 49 | "7": "اگست", 50 | "8": "ستمبر", 51 | "9": "اکتوبر", 52 | "10": "نومبر", 53 | "11": "دسمبر" 54 | }, 55 | "fullDate": "EEEE؍ d؍ MMMM y", 56 | "longDate": "d؍ MMMM y", 57 | "medium": "d؍ MMM y h:mm:ss a", 58 | "mediumDate": "d؍ MMM y", 59 | "mediumTime": "h:mm:ss a", 60 | "short": "d/M/yy h:mm a", 61 | "shortDate": "d/M/yy", 62 | "shortTime": "h:mm a" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "Rs", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "\u00A4-", 89 | "negSuf": "", 90 | "posPre": "\u00A4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "ur-in", 96 | "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_zh-hans-hk.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "上午", 7 | "1": "下午" 8 | }, 9 | "DAY": { 10 | "0": "星期日", 11 | "1": "星期一", 12 | "2": "星期二", 13 | "3": "星期三", 14 | "4": "星期四", 15 | "5": "星期五", 16 | "6": "星期六" 17 | }, 18 | "MONTH": { 19 | "0": "一月", 20 | "1": "二月", 21 | "2": "三月", 22 | "3": "四月", 23 | "4": "五月", 24 | "5": "六月", 25 | "6": "七月", 26 | "7": "八月", 27 | "8": "九月", 28 | "9": "十月", 29 | "10": "十一月", 30 | "11": "十二月" 31 | }, 32 | "SHORTDAY": { 33 | "0": "周日", 34 | "1": "周一", 35 | "2": "周二", 36 | "3": "周三", 37 | "4": "周四", 38 | "5": "周五", 39 | "6": "周六" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "1月", 43 | "1": "2月", 44 | "2": "3月", 45 | "3": "4月", 46 | "4": "5月", 47 | "5": "6月", 48 | "6": "7月", 49 | "7": "8月", 50 | "8": "9月", 51 | "9": "10月", 52 | "10": "11月", 53 | "11": "12月" 54 | }, 55 | "fullDate": "y年M月d日EEEE", 56 | "longDate": "y年M月d日", 57 | "medium": "y年M月d日 ah:mm:ss", 58 | "mediumDate": "y年M月d日", 59 | "mediumTime": "ah:mm:ss", 60 | "short": "d/M/yy ah:mm", 61 | "shortDate": "d/M/yy", 62 | "shortTime": "ah:mm" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "¥", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "(\u00A4", 89 | "negSuf": ")", 90 | "posPre": "\u00A4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "zh-hans-hk", 96 | "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_zh-hans-mo.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "上午", 7 | "1": "下午" 8 | }, 9 | "DAY": { 10 | "0": "星期日", 11 | "1": "星期一", 12 | "2": "星期二", 13 | "3": "星期三", 14 | "4": "星期四", 15 | "5": "星期五", 16 | "6": "星期六" 17 | }, 18 | "MONTH": { 19 | "0": "一月", 20 | "1": "二月", 21 | "2": "三月", 22 | "3": "四月", 23 | "4": "五月", 24 | "5": "六月", 25 | "6": "七月", 26 | "7": "八月", 27 | "8": "九月", 28 | "9": "十月", 29 | "10": "十一月", 30 | "11": "十二月" 31 | }, 32 | "SHORTDAY": { 33 | "0": "周日", 34 | "1": "周一", 35 | "2": "周二", 36 | "3": "周三", 37 | "4": "周四", 38 | "5": "周五", 39 | "6": "周六" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "1月", 43 | "1": "2月", 44 | "2": "3月", 45 | "3": "4月", 46 | "4": "5月", 47 | "5": "6月", 48 | "6": "7月", 49 | "7": "8月", 50 | "8": "9月", 51 | "9": "10月", 52 | "10": "11月", 53 | "11": "12月" 54 | }, 55 | "fullDate": "y年M月d日EEEE", 56 | "longDate": "y年M月d日", 57 | "medium": "y年M月d日 ah:mm:ss", 58 | "mediumDate": "y年M月d日", 59 | "mediumTime": "ah:mm:ss", 60 | "short": "d/M/yy ah:mm", 61 | "shortDate": "d/M/yy", 62 | "shortTime": "ah:mm" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "¥", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "(\u00A4", 89 | "negSuf": ")", 90 | "posPre": "\u00A4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "zh-hans-mo", 96 | "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_zh-hans-sg.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "上午", 7 | "1": "下午" 8 | }, 9 | "DAY": { 10 | "0": "星期日", 11 | "1": "星期一", 12 | "2": "星期二", 13 | "3": "星期三", 14 | "4": "星期四", 15 | "5": "星期五", 16 | "6": "星期六" 17 | }, 18 | "MONTH": { 19 | "0": "一月", 20 | "1": "二月", 21 | "2": "三月", 22 | "3": "四月", 23 | "4": "五月", 24 | "5": "六月", 25 | "6": "七月", 26 | "7": "八月", 27 | "8": "九月", 28 | "9": "十月", 29 | "10": "十一月", 30 | "11": "十二月" 31 | }, 32 | "SHORTDAY": { 33 | "0": "周日", 34 | "1": "周一", 35 | "2": "周二", 36 | "3": "周三", 37 | "4": "周四", 38 | "5": "周五", 39 | "6": "周六" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "1月", 43 | "1": "2月", 44 | "2": "3月", 45 | "3": "4月", 46 | "4": "5月", 47 | "5": "6月", 48 | "6": "7月", 49 | "7": "8月", 50 | "8": "9月", 51 | "9": "10月", 52 | "10": "11月", 53 | "11": "12月" 54 | }, 55 | "fullDate": "y年M月d日EEEE", 56 | "longDate": "y年M月d日", 57 | "medium": "y年M月d日 ah:mm:ss", 58 | "mediumDate": "y年M月d日", 59 | "mediumTime": "ah:mm:ss", 60 | "short": "dd/MM/yy ahh:mm", 61 | "shortDate": "dd/MM/yy", 62 | "shortTime": "ahh:mm" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "¥", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "(\u00A4", 89 | "negSuf": ")", 90 | "posPre": "\u00A4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "zh-hans-sg", 96 | "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_zh-hans.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "上午", 7 | "1": "下午" 8 | }, 9 | "DAY": { 10 | "0": "星期日", 11 | "1": "星期一", 12 | "2": "星期二", 13 | "3": "星期三", 14 | "4": "星期四", 15 | "5": "星期五", 16 | "6": "星期六" 17 | }, 18 | "MONTH": { 19 | "0": "1月", 20 | "1": "2月", 21 | "2": "3月", 22 | "3": "4月", 23 | "4": "5月", 24 | "5": "6月", 25 | "6": "7月", 26 | "7": "8月", 27 | "8": "9月", 28 | "9": "10月", 29 | "10": "11月", 30 | "11": "12月" 31 | }, 32 | "SHORTDAY": { 33 | "0": "周日", 34 | "1": "周一", 35 | "2": "周二", 36 | "3": "周三", 37 | "4": "周四", 38 | "5": "周五", 39 | "6": "周六" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "1月", 43 | "1": "2月", 44 | "2": "3月", 45 | "3": "4月", 46 | "4": "5月", 47 | "5": "6月", 48 | "6": "7月", 49 | "7": "8月", 50 | "8": "9月", 51 | "9": "10月", 52 | "10": "11月", 53 | "11": "12月" 54 | }, 55 | "fullDate": "y年M月d日EEEE", 56 | "longDate": "y年M月d日", 57 | "medium": "yyyy-M-d ah:mm:ss", 58 | "mediumDate": "yyyy-M-d", 59 | "mediumTime": "ah:mm:ss", 60 | "short": "yy-M-d ah:mm", 61 | "shortDate": "yy-M-d", 62 | "shortTime": "ah:mm" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "¥", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "(\u00A4", 89 | "negSuf": ")", 90 | "posPre": "\u00A4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "zh-hans", 96 | "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_zh-hant-hk.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "上午", 7 | "1": "下午" 8 | }, 9 | "DAY": { 10 | "0": "星期日", 11 | "1": "星期一", 12 | "2": "星期二", 13 | "3": "星期三", 14 | "4": "星期四", 15 | "5": "星期五", 16 | "6": "星期六" 17 | }, 18 | "MONTH": { 19 | "0": "1月", 20 | "1": "2月", 21 | "2": "3月", 22 | "3": "4月", 23 | "4": "5月", 24 | "5": "6月", 25 | "6": "7月", 26 | "7": "8月", 27 | "8": "9月", 28 | "9": "10月", 29 | "10": "11月", 30 | "11": "12月" 31 | }, 32 | "SHORTDAY": { 33 | "0": "週日", 34 | "1": "週一", 35 | "2": "週二", 36 | "3": "週三", 37 | "4": "週四", 38 | "5": "週五", 39 | "6": "週六" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "1月", 43 | "1": "2月", 44 | "2": "3月", 45 | "3": "4月", 46 | "4": "5月", 47 | "5": "6月", 48 | "6": "7月", 49 | "7": "8月", 50 | "8": "9月", 51 | "9": "10月", 52 | "10": "11月", 53 | "11": "12月" 54 | }, 55 | "fullDate": "y年M月d日EEEE", 56 | "longDate": "y年M月d日", 57 | "medium": "y年M月d日 ahh:mm:ss", 58 | "mediumDate": "y年M月d日", 59 | "mediumTime": "ahh:mm:ss", 60 | "short": "yy年M月d日 ah:mm", 61 | "shortDate": "yy年M月d日", 62 | "shortTime": "ah:mm" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "¥", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "(\u00A4", 89 | "negSuf": ")", 90 | "posPre": "\u00A4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "zh-hant-hk", 96 | "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_zh-hant-mo.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "上午", 7 | "1": "下午" 8 | }, 9 | "DAY": { 10 | "0": "星期日", 11 | "1": "星期一", 12 | "2": "星期二", 13 | "3": "星期三", 14 | "4": "星期四", 15 | "5": "星期五", 16 | "6": "星期六" 17 | }, 18 | "MONTH": { 19 | "0": "1月", 20 | "1": "2月", 21 | "2": "3月", 22 | "3": "4月", 23 | "4": "5月", 24 | "5": "6月", 25 | "6": "7月", 26 | "7": "8月", 27 | "8": "9月", 28 | "9": "10月", 29 | "10": "11月", 30 | "11": "12月" 31 | }, 32 | "SHORTDAY": { 33 | "0": "週日", 34 | "1": "週一", 35 | "2": "週二", 36 | "3": "週三", 37 | "4": "週四", 38 | "5": "週五", 39 | "6": "週六" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "1月", 43 | "1": "2月", 44 | "2": "3月", 45 | "3": "4月", 46 | "4": "5月", 47 | "5": "6月", 48 | "6": "7月", 49 | "7": "8月", 50 | "8": "9月", 51 | "9": "10月", 52 | "10": "11月", 53 | "11": "12月" 54 | }, 55 | "fullDate": "y年MM月dd日EEEE", 56 | "longDate": "y年MM月dd日", 57 | "medium": "y年M月d日 ahh:mm:ss", 58 | "mediumDate": "y年M月d日", 59 | "mediumTime": "ahh:mm:ss", 60 | "short": "yy年M月d日 ah:mm", 61 | "shortDate": "yy年M月d日", 62 | "shortTime": "ah:mm" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "¥", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "(\u00A4", 89 | "negSuf": ")", 90 | "posPre": "\u00A4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "zh-hant-mo", 96 | "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_zh-hant-tw.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "上午", 7 | "1": "下午" 8 | }, 9 | "DAY": { 10 | "0": "星期日", 11 | "1": "星期一", 12 | "2": "星期二", 13 | "3": "星期三", 14 | "4": "星期四", 15 | "5": "星期五", 16 | "6": "星期六" 17 | }, 18 | "MONTH": { 19 | "0": "1月", 20 | "1": "2月", 21 | "2": "3月", 22 | "3": "4月", 23 | "4": "5月", 24 | "5": "6月", 25 | "6": "7月", 26 | "7": "8月", 27 | "8": "9月", 28 | "9": "10月", 29 | "10": "11月", 30 | "11": "12月" 31 | }, 32 | "SHORTDAY": { 33 | "0": "週日", 34 | "1": "週一", 35 | "2": "週二", 36 | "3": "週三", 37 | "4": "週四", 38 | "5": "週五", 39 | "6": "週六" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "1月", 43 | "1": "2月", 44 | "2": "3月", 45 | "3": "4月", 46 | "4": "5月", 47 | "5": "6月", 48 | "6": "7月", 49 | "7": "8月", 50 | "8": "9月", 51 | "9": "10月", 52 | "10": "11月", 53 | "11": "12月" 54 | }, 55 | "fullDate": "y年M月d日EEEE", 56 | "longDate": "y年M月d日", 57 | "medium": "yyyy/M/d ah:mm:ss", 58 | "mediumDate": "yyyy/M/d", 59 | "mediumTime": "ah:mm:ss", 60 | "short": "y/M/d ah:mm", 61 | "shortDate": "y/M/d", 62 | "shortTime": "ah:mm" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "¥", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "(\u00A4", 89 | "negSuf": ")", 90 | "posPre": "\u00A4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "zh-hant-tw", 96 | "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/i18n/angular-locale_zh-hant.js: -------------------------------------------------------------------------------- 1 | angular.module("ngLocale", [], ["$provide", function($provide) { 2 | var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; 3 | $provide.value("$locale", { 4 | "DATETIME_FORMATS": { 5 | "AMPMS": { 6 | "0": "上午", 7 | "1": "下午" 8 | }, 9 | "DAY": { 10 | "0": "星期日", 11 | "1": "星期一", 12 | "2": "星期二", 13 | "3": "星期三", 14 | "4": "星期四", 15 | "5": "星期五", 16 | "6": "星期六" 17 | }, 18 | "MONTH": { 19 | "0": "1月", 20 | "1": "2月", 21 | "2": "3月", 22 | "3": "4月", 23 | "4": "5月", 24 | "5": "6月", 25 | "6": "7月", 26 | "7": "8月", 27 | "8": "9月", 28 | "9": "10月", 29 | "10": "11月", 30 | "11": "12月" 31 | }, 32 | "SHORTDAY": { 33 | "0": "週日", 34 | "1": "週一", 35 | "2": "週二", 36 | "3": "週三", 37 | "4": "週四", 38 | "5": "週五", 39 | "6": "週六" 40 | }, 41 | "SHORTMONTH": { 42 | "0": "1月", 43 | "1": "2月", 44 | "2": "3月", 45 | "3": "4月", 46 | "4": "5月", 47 | "5": "6月", 48 | "6": "7月", 49 | "7": "8月", 50 | "8": "9月", 51 | "9": "10月", 52 | "10": "11月", 53 | "11": "12月" 54 | }, 55 | "fullDate": "y年M月d日EEEE", 56 | "longDate": "y年M月d日", 57 | "medium": "yyyy/M/d ah:mm:ss", 58 | "mediumDate": "yyyy/M/d", 59 | "mediumTime": "ah:mm:ss", 60 | "short": "y/M/d ah:mm", 61 | "shortDate": "y/M/d", 62 | "shortTime": "ah:mm" 63 | }, 64 | "NUMBER_FORMATS": { 65 | "CURRENCY_SYM": "¥", 66 | "DECIMAL_SEP": ".", 67 | "GROUP_SEP": ",", 68 | "PATTERNS": { 69 | "0": { 70 | "gSize": 3, 71 | "lgSize": 3, 72 | "macFrac": 0, 73 | "maxFrac": 3, 74 | "minFrac": 0, 75 | "minInt": 1, 76 | "negPre": "-", 77 | "negSuf": "", 78 | "posPre": "", 79 | "posSuf": "" 80 | }, 81 | "1": { 82 | "gSize": 3, 83 | "lgSize": 3, 84 | "macFrac": 0, 85 | "maxFrac": 2, 86 | "minFrac": 2, 87 | "minInt": 1, 88 | "negPre": "(\u00A4", 89 | "negSuf": ")", 90 | "posPre": "\u00A4", 91 | "posSuf": "" 92 | } 93 | } 94 | }, 95 | "id": "zh-hant", 96 | "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} 97 | }); 98 | }]); -------------------------------------------------------------------------------- /app/scripts/angular/version.json: -------------------------------------------------------------------------------- 1 | {"full":"1.1.6-a2e672e","major":"1","minor":"1","dot":"6","codename":"spooky-giraffe","cdn":"1.1.4"} -------------------------------------------------------------------------------- /app/scripts/angular/version.txt: -------------------------------------------------------------------------------- 1 | 1.1.6-a2e672e -------------------------------------------------------------------------------- /app/scripts/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('ngswipeDemoApp', ['ngMobile', 'ngResource', 'ngSanitize', 'angular-carousel']) 4 | .config(['$routeProvider', function ($routeProvider) { 5 | $routeProvider 6 | .when('/articles/:feedId/:articleId', { 7 | templateUrl: 'views/ArticleDetail.html', 8 | controller: 'ArticleDetailCtrl', 9 | resolve: { 10 | detailFeed: function (Articles, FeedManager, $location, $route) { 11 | var feed = FeedManager.get($route.current.params.feedId); 12 | return Articles.fetch(feed.href);; 13 | } 14 | } 15 | }) 16 | .when('/feeds', { 17 | templateUrl: 'views/FeedList.html', 18 | controller: 'FeedListCtrl', 19 | reloadOnSearch: false 20 | }) 21 | .otherwise({ 22 | redirectTo: '/feeds' 23 | }); 24 | }]); -------------------------------------------------------------------------------- /app/scripts/controllers/ArticleDetail.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('ngswipeDemoApp') 4 | .controller('ArticleDetailCtrl', ['$scope', '$rootScope', '$routeParams', '$window', 'Articles', 'FeedManager', 'detailFeed', function ($scope, $rootScope, $routeParams, $window, Articles, FeedManager, detailFeed) { 5 | 6 | $rootScope.pageAnimation = {enter: 'page-enter-left', leave: 'page-leave-right'}; 7 | 8 | $scope.articleIndex = $routeParams.index || 0; 9 | $scope.detailFeed = detailFeed; 10 | 11 | $scope.goBack = function () { 12 | $window.history.back(); 13 | }; 14 | }]); 15 | -------------------------------------------------------------------------------- /app/scripts/controllers/FeedList.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('ngswipeDemoApp') 4 | .controller('FeedListCtrl', ['$scope', 'FeedManager', '$location', '$rootScope', function ($scope, FeedManager, $location, $rootScope) { 5 | var updateFeeds; 6 | 7 | $rootScope.pageAnimation = {}; 8 | 9 | $scope.showFeed = function (feed) { 10 | $location.search({ feed: feed.name }); 11 | $scope.activeFeed = feed.name; 12 | }; 13 | 14 | $scope.deleteFeed = function (name) { 15 | FeedManager.remove(name); 16 | }; 17 | 18 | $scope.bootstrap = function () { 19 | $scope.feeds = FeedManager.getAll(); 20 | if ($location.search().feed) { 21 | $scope.activeFeed = $location.search().feed; 22 | } 23 | else if ($scope.feeds.length && $scope.feeds[0].name) { 24 | $scope.showFeed($scope.feeds[0]); 25 | } 26 | 27 | $scope.$watch(function () { 28 | return FeedManager.getAll(); 29 | }, updateFeeds, true); 30 | }; 31 | 32 | updateFeeds = function (newVal) { 33 | var firstFeed; 34 | 35 | if (newVal === undefined || Array.isArray(newVal)) { 36 | $scope.feeds = newVal; 37 | } 38 | 39 | if (!FeedManager.get($scope.activeFeed)) { 40 | firstFeed = FeedManager.getAll()[0]; 41 | 42 | $scope.activeFeed = firstFeed ? firstFeed.name : ''; 43 | $scope.showFeed(firstFeed); 44 | } 45 | }; 46 | 47 | $scope.bootstrap(); 48 | }]); 49 | -------------------------------------------------------------------------------- /app/scripts/controllers/IOAddFeedForm.js: -------------------------------------------------------------------------------- 1 | angular.module('ngswipeDemoApp') 2 | .controller('IOAddFeedFormCtrl', 3 | ['$scope', 'FeedManager', 'RecommendedFeeds', '$location', function ($scope, FeedManager, RecommendedFeeds, $location) { 4 | 5 | $scope.saveFeed = function () { 6 | var name = $scope.newFeed.name; 7 | FeedManager.add(name, $scope.newFeed); 8 | 9 | $scope.newFeedForm = null; 10 | 11 | $location.search({feed: name}); 12 | }; 13 | 14 | $scope.sources = RecommendedFeeds; 15 | 16 | $scope.$watch('newFeed.name', function (name) { 17 | if (name && $scope.sources[name]) { 18 | $scope.newFeed.href = $scope.sources[name].href; 19 | $scope.newFeed.icon = $scope.sources[name].icon || 'img/rss.png'; 20 | } 21 | }); 22 | }]); -------------------------------------------------------------------------------- /app/scripts/controllers/IOArticlePreview.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('ngswipeDemoApp') 4 | .controller('IOArticlePreviewCtrl', 5 | ['$scope', '$rootScope', 'Articles', 'FeedManager', '$window', '$location', function ($scope, $rootScope, Articles, FeedManager, $window, $location) { 6 | 7 | $scope.openArticle = function (id, index) { 8 | //Since it is part of a route, it must be encoded. 9 | if ($window.decodeURIComponent(id) === id) { 10 | id = $window.encodeURIComponent(id); 11 | } 12 | 13 | $rootScope.pageAnimation = {enter: 'page-enter-right', leave: 'page-leave-left'}; 14 | 15 | $location.path('/articles/' + $location.search().feed + '/' + id).search({index: index}); 16 | }; 17 | 18 | $scope.loadArticles = function (name) { 19 | var feedToLoad = FeedManager.get(name); 20 | 21 | $scope.feed = {}; 22 | 23 | if (feedToLoad && feedToLoad.href) { 24 | $scope.feed = Articles.fetch($window.encodeURIComponent(feedToLoad.href)); 25 | } 26 | }; 27 | 28 | $scope.$watch('activeFeed', function (feedId) { 29 | $scope.loadArticles(feedId); 30 | }); 31 | }]); 32 | -------------------------------------------------------------------------------- /app/scripts/directives/ioAddFeedForm.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('ngswipeDemoApp') 4 | .directive('ioAddFeedForm', function () { 5 | return { 6 | templateUrl: 'views/ioAddFeedForm.html', 7 | restrict: 'E', 8 | controller: 'IOAddFeedFormCtrl', 9 | scope: { 10 | 'feed' : '=' 11 | }, 12 | link: function () {} 13 | }; 14 | }); 15 | -------------------------------------------------------------------------------- /app/scripts/directives/ioArticlePreview.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('ngswipeDemoApp') 4 | .directive('ioArticlePreview', function () { 5 | return { 6 | templateUrl: 'views/ioArticlePreview.html', 7 | restrict: 'EA', 8 | controller: 'IOArticlePreviewCtrl' 9 | }; 10 | }); 11 | -------------------------------------------------------------------------------- /app/scripts/filters/preview.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('ngswipeDemoApp') 4 | .filter('preview', ['$filter', function ( $filter) { 5 | return function (input) { 6 | var output, splitOutput, pMatch, match, brSplit, charTest, 7 | striptags = $filter('striptags'); 8 | 9 | if (input.indexOf(' -1) { 10 | //Grab the first paragraph of text. Presumes this comes early in the document. 11 | pMatch = /]*>(.*?)<\/p>/; 12 | match = pMatch.exec(input); 13 | 14 | if (match && match.length > 1) { 15 | output = match[1]; 16 | } 17 | else { 18 | return; 19 | } 20 | 21 | 22 | //Limit it to 200 words 23 | splitOutput = output.split(' '); 24 | if (splitOutput.length > 200) { 25 | output = splitOutput.splice(0, 199).join(' '); 26 | output += '...'; 27 | } 28 | } 29 | else if (input.search(//) > -1) { 30 | charTest = /[A-Za-z0-9]/; 31 | //At least we have some line breaks to look for blocks of text. 32 | //Let's break up the article by
until we find content that begins with text 33 | brSplit = input.split(//); 34 | 35 | for (var i = 0; i < brSplit.length; i++) { 36 | if(brSplit[i] && charTest.test(brSplit[i][0])) { 37 | //The first character is Legit 38 | output = brSplit[i]; 39 | 40 | break; 41 | } 42 | } 43 | } 44 | 45 | if (output) { 46 | output = striptags(output); 47 | } 48 | 49 | return output; 50 | }; 51 | }]); 52 | -------------------------------------------------------------------------------- /app/scripts/filters/striptags.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('ngswipeDemoApp') 4 | .filter('striptags', function () { 5 | return function (input) { 6 | var output = input.replace(/<\b[^>]*>/g, ''); 7 | output = output.replace(/<\/.*?>/g, ''); 8 | return output; 9 | }; 10 | }); 11 | -------------------------------------------------------------------------------- /app/scripts/services/RecommendedFeeds.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('ngswipeDemoApp') 4 | .factory('RecommendedFeeds', function () { 5 | return { 6 | 'YouTube Blog' : { 7 | href: 'http://feeds.feedburner.com/youtube/PKJx', 8 | icon: 'http://www.google.com/images/icons/product/youtube-48.png' 9 | }, 10 | 'Google Blog': { 11 | href: 'http://googleblog.blogspot.com/feeds/posts/default' 12 | }, 13 | 'Google Maps Blog' : { 14 | href: 'http://google-latlong.blogspot.com/feeds/posts/default', 15 | icon: 'http://www.google.com/images/icons/product/maps-48.gif' 16 | }, 17 | 'Android Blog': { 18 | href: 'http://feeds.feedburner.com/blogspot/hsDu', 19 | icon: 'http://www.google.com/images/icons/product/android-48.png' 20 | }, 21 | 'Google Analytics Blog': { 22 | href: 'http://feeds.feedburner.com/blogspot/tRaA', 23 | icon: 'http://www.google.com/images/icons/product/analytics-48.png' 24 | }, 25 | 'Google Developers Blog': { 26 | href: 'http://feeds.feedburner.com/GDBcode' 27 | }, 28 | 'Google News Blog': { 29 | href: 'http://feeds.feedburner.com/GoogleNewsBlog', 30 | icon: 'http://www.google.com/images/icons/product/news-48.gif' 31 | }, 32 | 'Google+ Platform Blog' : { 33 | href: 'http://feeds.feedburner.com/GppBxyz' 34 | }, 35 | 'Gmail Blog': { 36 | href: 'http://feeds.feedburner.com/OfficialGmailBlog', 37 | icon: 'http://www.google.com/images/icons/product/googlemail-48.png' 38 | } 39 | }; 40 | }); 41 | -------------------------------------------------------------------------------- /app/styles/directive/ioAddFeedForm.less: -------------------------------------------------------------------------------- 1 | io-add-feed-form { 2 | @formHeight: 160px; 3 | color: @gray; 4 | /* General Styles */ 5 | .add-feed { 6 | 7 | cursor: pointer; 8 | background: @grayLighter; 9 | font-family: @metaFont; 10 | padding: @padding; 11 | height: 50 - @padding * 2; 12 | font-weight: bold; 13 | 14 | .name { 15 | font-size: 110%; 16 | line-height: 125%; 17 | } 18 | } 19 | .add-feed-form { 20 | min-height: @formHeight; 21 | padding: @padding; 22 | background-color: @grayLighter; 23 | font-family: @metaFont; 24 | 25 | input[type=text] { 26 | width: 100%; 27 | height: 28px; 28 | box-sizing: border-box; 29 | } 30 | 31 | h4 { 32 | font-size: 110%; 33 | margin-top: 0; 34 | } 35 | } 36 | 37 | .form-show { 38 | overflow: hidden; 39 | padding: 0 @padding; 40 | height: 0; 41 | min-height: 0; 42 | 43 | -webkit-transition:0.25s linear all; 44 | -moz-transition:0.25s linear all; 45 | -o-transition:0.25s linear all; 46 | transition:0.25s linear all; 47 | } 48 | 49 | .form-show-active { 50 | height: @formHeight; 51 | min-height: 0; 52 | padding: @padding; 53 | } 54 | 55 | .form-hide { 56 | height: @formHeight; 57 | min-height: 0; 58 | padding: @padding; 59 | 60 | -webkit-transition:0.25s linear all; 61 | -moz-transition:0.25s linear all; 62 | -o-transition:0.25s linear all; 63 | transition:0.25s linear all; 64 | } 65 | 66 | .form-hide-active { 67 | overflow: hidden; 68 | padding: 0 @padding; 69 | height: 0;; 70 | } 71 | 72 | 73 | .add-hide, .add-show { 74 | -webkit-transition:0.25s linear all; 75 | -moz-transition:0.25s linear all; 76 | -o-transition:0.25s linear all; 77 | transition:0.25s linear all; 78 | min-height: 0; 79 | } 80 | 81 | .add-hide { 82 | height: 28px; 83 | overflow: hidden; 84 | padding: @padding; 85 | } 86 | .add-hide-active { 87 | height: 0; 88 | line-height: 0; 89 | padding: 0 @padding; 90 | } 91 | 92 | .add-show { 93 | height: 0; 94 | line-height: 0; 95 | padding: 0 @padding; 96 | } 97 | 98 | .add-show-active { 99 | height: 28px; 100 | overflow: hidden; 101 | padding: @padding; 102 | } 103 | } -------------------------------------------------------------------------------- /app/styles/directive/ioArticlePreview.less: -------------------------------------------------------------------------------- 1 | [io-article-preview], io-article-preview { 2 | .loading { 3 | font-size: 150%; 4 | line-height: 150%; 5 | text-align: center; 6 | } 7 | 8 | .article { 9 | margin: 0 @padding; 10 | padding: @padding * 2 @padding; 11 | cursor: pointer; 12 | border-bottom: 1px solid @grayLighter; 13 | 14 | &:hover { 15 | background-color: @grayLighter; 16 | } 17 | &:active { 18 | background-color: @grayLight; 19 | 20 | .date { 21 | color: @gray 22 | } 23 | } 24 | 25 | p { 26 | max-width: 800px; 27 | } 28 | 29 | .date { 30 | color: @grayLight; 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /app/styles/directive/rnAngularCarousel.less: -------------------------------------------------------------------------------- 1 | /* 2 | generic styles applied to any carousel 3 | must be ul/li 4 | */ 5 | .rn-carousel-container { 6 | overflow: hidden; 7 | position: relative; 8 | } 9 | ul.rn-carousel-slides { 10 | white-space: nowrap; 11 | overflow: visible; 12 | -webkit-transform: translate3d(0px, 0, 0); 13 | -moz-transform: translate3d(0px, 0, 0); 14 | transform: translate3d(0px, 0, 0); 15 | padding: 0; 16 | margin: 0; 17 | } 18 | ul.rn-carousel-slides li { 19 | white-space: normal; 20 | vertical-align:top; 21 | display: inline-block; 22 | width: 100%; 23 | height: 100%; 24 | } 25 | .rn-carousel-animate { 26 | -webkit-transition: -webkit-transform .2s ease-out; 27 | -moz-transition: -moz-transform .2s ease-out; 28 | transition: transform .2s ease-out; 29 | } 30 | .rn-carousel-noanimate { 31 | -webkit-transition: none; 32 | -moz-transition: none; 33 | -ms-transition: none; 34 | -o-transition: none; 35 | transition: none; 36 | } 37 | .rn-carousel-indicator { 38 | width: 100%; 39 | text-align:center; 40 | position: absolute; 41 | bottom: 0; 42 | background-color: rgb(0, 0, 0); 43 | background-color: rgba(0, 0, 0, 0.3); 44 | } 45 | .rn-carousel-indicator span { 46 | padding: 0 5px; 47 | color: #333; 48 | transition: color .2s ease-out; 49 | } 50 | .rn-carousel-indicator span.active { 51 | color:white; 52 | } 53 | -------------------------------------------------------------------------------- /app/styles/main.less: -------------------------------------------------------------------------------- 1 | @import "../../node_modules/bootstrap/less/bootstrap"; 2 | 3 | @padding: 15px; 4 | @bannerHeight: @padding * 5; 5 | @contentFont: Georgia, serif; 6 | @metaFont: "Helvetica Neue", Helvetica, Arial, sans-serif; 7 | 8 | html, body { 9 | margin:0; 10 | padding:0; 11 | border:0; 12 | width:100%; 13 | height:100%; 14 | 15 | -webkit-touch-callout: none; 16 | -webkit-user-select: none; 17 | -khtml-user-select: none; 18 | -moz-user-select: none; 19 | -ms-user-select: none; 20 | user-select: none; 21 | 22 | font-family: @contentFont; 23 | } 24 | 25 | [ng-cloak] { 26 | display: none; 27 | } 28 | 29 | 30 | .container { 31 | height: 100%; 32 | width:100%; 33 | &::-webkit-scrollbar { 34 | display: none; 35 | } 36 | } 37 | 38 | /* 39 | Animation classes for top-level ng-view 40 | */ 41 | .page-enter-left, .page-enter-right, .page-leave-left, .page-leave-right { 42 | -webkit-transition:all linear 0.3s; 43 | position: absolute; 44 | } 45 | 46 | .page-enter-left { 47 | left: -100% !important; 48 | right: auto !important; 49 | 50 | &.page-enter-left-active { 51 | left: 0 !important; 52 | right: auto !important; 53 | } 54 | } 55 | .page-leave-right, .page-leave-left { 56 | left: 0 !important; 57 | right: auto !important; 58 | 59 | &.page-leave-right-active { 60 | left: 100% !important; 61 | right: auto !important; 62 | } 63 | 64 | &.page-leave-left-active { 65 | left: -100% !important; 66 | right: auto !important; 67 | } 68 | } 69 | 70 | .page-enter-right { 71 | left: 100% !important; 72 | right: auto !important; 73 | 74 | &.page-enter-right-active { 75 | left: 0 !important; 76 | right: auto !important; 77 | } 78 | } 79 | 80 | @import "controller/FeedList"; 81 | @import "controller/ArticleDetail"; 82 | @import "directive/ioArticlePreview"; 83 | @import "directive/ioAddFeedForm"; 84 | @import "directive/rnAngularCarousel"; -------------------------------------------------------------------------------- /app/views/ArticleDetail.html: -------------------------------------------------------------------------------- 1 |
2 | 7 |
    8 |
  • 9 |
    10 |
    11 |

    12 |

    13 |
    14 |
    15 |
    16 |
  • 17 |
18 |
19 | 20 | Loading 21 |
22 |
-------------------------------------------------------------------------------- /app/views/FeedList.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

5 | Angular Reader 6 | 7 | 8 | 9 | done 10 | 11 | 12 | edit 13 | 14 | 15 |

16 | 17 | 21 | 22 | Delete 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
32 |
33 | 34 |
35 |
36 | -------------------------------------------------------------------------------- /app/views/ioAddFeedForm.html: -------------------------------------------------------------------------------- 1 |
5 | 6 | 7 | 8 | Add Atom Feed 9 | 10 |
11 | 12 |
15 | 16 |

Add Atom Feed

17 |
19 | 20 |
22 | 23 |
24 | 28 | 29 | 30 | 31 | 32 | 33 | 37 |
38 |
39 |
41 | 42 |
43 | 47 | 48 | 52 | 56 |
57 |
58 | 59 | 61 | 62 | 64 | 65 | 66 | Cancel 67 | 68 |
69 |
-------------------------------------------------------------------------------- /app/views/ioArticlePreview.html: -------------------------------------------------------------------------------- 1 |
    2 |
  • 3 |

    4 |

    5 |

    6 |
  • 7 |
8 |
9 | 10 | Loading {{ activeFeed }} 11 |
12 |
13 | -------------------------------------------------------------------------------- /component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ngswipeDemo", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "json3": "~3.2.4", 6 | "es5-shim": "~2.0.8", 7 | "angular-mobile": "~1.0.5", 8 | "angular-momentum-scroll": "~0.1.0", 9 | "jquery-masonry": "~2.1.08", 10 | "ngInfiniteScroll": "1.0.0", 11 | "angular-carousel" : "~0.0.1", 12 | "angular-cookies" : "", 13 | "angular-resource" : "", 14 | "angular-sanitize": "" 15 | 16 | }, 17 | "devDependencies": { 18 | "angular-mocks": "~1.0.5", 19 | "angular-scenario": "~1.0.5" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /design/flow.graffle/image1.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/design/flow.graffle/image1.tiff -------------------------------------------------------------------------------- /design/flow.graffle/image2.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/design/flow.graffle/image2.tiff -------------------------------------------------------------------------------- /design/flow.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffbcross/ngswipe-demo/0a4ff12fb14ffec1cc12d1b244921dc90c44151d/design/flow.pdf -------------------------------------------------------------------------------- /karma-e2e.conf.js: -------------------------------------------------------------------------------- 1 | // Karma E2E configuration 2 | 3 | // base path, that will be used to resolve files and exclude 4 | basePath = ''; 5 | 6 | // list of files / patterns to load in the browser 7 | files = [ 8 | ANGULAR_SCENARIO, 9 | ANGULAR_SCENARIO_ADAPTER, 10 | 'test/e2e/**/*.js' 11 | ]; 12 | 13 | // list of files to exclude 14 | exclude = []; 15 | 16 | // test results reporter to use 17 | // possible values: dots || progress || growl 18 | reporters = ['progress']; 19 | 20 | // web server port 21 | port = 8080; 22 | 23 | // cli runner port 24 | runnerPort = 9100; 25 | 26 | // enable / disable colors in the output (reporters and logs) 27 | colors = true; 28 | 29 | // level of logging 30 | // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG 31 | logLevel = LOG_INFO; 32 | 33 | // enable / disable watching file and executing tests whenever any file changes 34 | autoWatch = false; 35 | 36 | // Start these browsers, currently available: 37 | // - Chrome 38 | // - ChromeCanary 39 | // - Firefox 40 | // - Opera 41 | // - Safari (only Mac) 42 | // - PhantomJS 43 | // - IE (only Windows) 44 | browsers = ['Chrome']; 45 | 46 | // If browser does not capture in given timeout [ms], kill it 47 | captureTimeout = 5000; 48 | 49 | // Continuous Integration mode 50 | // if true, it capture browsers, run tests and exit 51 | singleRun = false; 52 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | basePath = "app/"; 2 | files = [ 3 | 'scripts/angular/angular.js', 4 | 'components/angular-mocks/angular-mocks.js', 5 | 'components/angular-mobile/*.js', 6 | 'components/angular-resource/*.js', 7 | 'components/angular-sanitize/*.js', 8 | 'scripts/*.js', 9 | 'scripts/angular/angular.js', 10 | 'scripts/controllers/*.js', 11 | 'scripts/directives/*.js', 12 | 'scripts/services/*.js', 13 | 'scripts/filters/*.js', 14 | '../test/mock/*.js', 15 | '../test/spec/**/*.js', 16 | 'views/*.html' 17 | ]; 18 | plugins = [ 19 | 'karma-ng-html2js-preprocessor', 20 | 'karma-jasmine', 21 | 'karma-chrome-launcher' 22 | ]; 23 | frameworks = [ 24 | 'jasmine' 25 | ]; 26 | preprocessors = { 27 | 'views/**.html': 'html2js' 28 | }; 29 | reporters = ['progress']; 30 | port = 8080; 31 | runnerPort = 9100; 32 | colors = true; 33 | autoWatch = true; 34 | browsers = ['Chrome']; 35 | captureTimeout = 5000; 36 | singleRun = false; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ngswipe-demo", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "karma-ng-html2js-preprocessor": "git+ssh://git@github.com/karma-runner/karma-ng-html2js-preprocessor", 6 | "karma-script-launcher": "0.0.1", 7 | "karma-chrome-launcher": "0.0.1", 8 | "karma-firefox-launcher": "0.0.2", 9 | "karma-jasmine": "0.0.1", 10 | "karma-requirejs": "0.0.1", 11 | "karma-coffee-preprocessor": "0.0.1", 12 | "karma-phantomjs-launcher": "0.0.2", 13 | "karma": "~0.9.2" 14 | }, 15 | "devDependencies": { 16 | "grunt-contrib-jshint": "~0.5.4", 17 | "grunt": "~0.4.1", 18 | "grunt-contrib-copy": "~0.4.0", 19 | "grunt-contrib-concat": "~0.1.3", 20 | "grunt-contrib-coffee": "~0.6.4", 21 | "grunt-contrib-uglify": "~0.2.0", 22 | "grunt-contrib-compass": "~0.1.3", 23 | "grunt-contrib-cssmin": "~0.5.0", 24 | "grunt-contrib-connect": "~0.2.0", 25 | "grunt-contrib-clean": "~0.4.0", 26 | "grunt-contrib-htmlmin": "~0.1.1", 27 | "grunt-contrib-imagemin": "~0.1.2", 28 | "grunt-contrib-livereload": "~0.1.2", 29 | "grunt-bower-requirejs": "~0.4.1", 30 | "grunt-usemin": "~0.1.10", 31 | "grunt-regarde": "~0.1.1", 32 | "grunt-rev": "~0.1.0", 33 | "grunt-karma": "~0.4.0", 34 | "grunt-open": "~0.2.0", 35 | "matchdep": "~0.1.1", 36 | "grunt-google-cdn": "~0.1.1", 37 | "grunt-ngmin": "~0.0.2", 38 | "grunt-contrib-less": "~0.5.1", 39 | "bootstrap": "git+https://github.com/twitter/bootstrap.git", 40 | "karma": "0.8.5" 41 | }, 42 | "engines": { 43 | "node": ">=0.8.0" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /test/mock/angularjsfeed.js: -------------------------------------------------------------------------------- 1 | var angularJSFeed = { 2 | query: { 3 | results:{ 4 | entry: [ 5 | { 6 | content: { 7 | title: "Angular", 8 | content: "Hello!" 9 | } 10 | } 11 | ], 12 | author: { 13 | name: 'AngularJS' 14 | }, 15 | link: [{},{ 16 | href: 'http://dailyjs.com/feed.xml' 17 | }] 18 | } 19 | } 20 | }; 21 | 22 | var angularFeedUrl = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D'http%3A%2F%2Fwww.blogger.com%2Ffeeds%2F7159470537406093899%2Fposts%2Fdefault'%20and%20itemPath%3D'feed'%20limit%2010&format=json&diagnostics=true&callback=JSON_CALLBACK"; -------------------------------------------------------------------------------- /test/mock/articlesMock.js: -------------------------------------------------------------------------------- 1 | angular.module('ngswipeDemoApp') 2 | .factory('ArticlesMock', function ($q, Articles) { 3 | var selected; 4 | return { 5 | fetch: function () { 6 | return { 7 | entries: angularJSFeed.query.results.entry 8 | } 9 | }, 10 | setSelected: function (name) { 11 | selected = name; 12 | } 13 | } 14 | }); -------------------------------------------------------------------------------- /test/mock/dailyjsfeed.js: -------------------------------------------------------------------------------- 1 | var dailyJSFeed = JSON.stringify({ 2 | query: { 3 | results:{ 4 | feed: { 5 | entry: [ 6 | { 7 | id: 'http://hello', 8 | title: { 9 | content: "Title here!" 10 | }, 11 | content: { 12 | content: "

Hello!

" 13 | } 14 | }, 15 | { 16 | id: 'Article2', 17 | title: { 18 | type: "text" 19 | }, 20 | content: { 21 | content: "

Article 2 content

" 22 | } 23 | } 24 | ], 25 | title: { 26 | content: 'DailyJS' 27 | }, 28 | link: [{},{ 29 | href: 'http://dailyjs.com/feed.xml' 30 | }] 31 | }, 32 | 33 | } 34 | } 35 | }) 36 | 37 | var dailyFeedUrl = 'http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D"http%3A%2F%2Fdailyjs.com%2Fatom.xml"%20and%20itemPath%3D"feed"%20limit%2010&format=json&diagnostics=true&callback=JSON_CALLBACK'; -------------------------------------------------------------------------------- /test/runner.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | End2end Test Runner 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /test/spec/controllers/ArticleDetail.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: ArticleDetailCtrl', function () { 4 | // load the controller's module 5 | beforeEach(module('ngswipeDemoApp')); 6 | 7 | var ArticleDetailCtrl, scope, FeedManager; 8 | 9 | // Initialize the controller and a mock scope 10 | beforeEach(inject(function ($controller, $rootScope, ArticlesMock, FeedManager) { 11 | scope = $rootScope.$new(); 12 | 13 | ArticleDetailCtrl = $controller('ArticleDetailCtrl', { 14 | $scope: scope, 15 | Articles: ArticlesMock, 16 | $routeParams: { articleId: 'http://hello', feedId: 'DailyJS' } 17 | }); 18 | })); 19 | 20 | it('should have a feed', function () { 21 | scope.$digest(); 22 | expect(scope.detailFeed.entries.length).toBeGreaterThan(0); 23 | }); 24 | }); -------------------------------------------------------------------------------- /test/spec/controllers/FeedList.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: FeedListCtrl', function () { 4 | var FeedListCtrl, scope, FeedManager; 5 | 6 | // load the controller's module 7 | beforeEach(module('ngswipeDemoApp')); 8 | 9 | // Initialize the controller and a mock scope 10 | beforeEach(inject(function ($controller, $rootScope, $injector) { 11 | scope = $rootScope.$new(); 12 | FeedListCtrl = $controller('FeedListCtrl', { 13 | $scope: scope 14 | }); 15 | 16 | FeedManager = $injector.get('FeedManager'); 17 | })); 18 | 19 | it('should load a list of available feeds', function () { 20 | scope.$digest(); 21 | expect(scope.feeds.length).toBeGreaterThan(0); 22 | expect(scope.feeds[0].href).toEqual('http://www.blogger.com/feeds/7159470537406093899/posts/default'); 23 | expect(scope.feeds[1].href).toEqual('http://dailyjs.com/atom.xml'); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /test/spec/controllers/IOAddFeedForm.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | describe('Add Feed Form', function () { 4 | beforeEach(module('ngswipeDemoApp')); 5 | var location, scope, IOAddFeedFormCtrl; 6 | 7 | beforeEach(inject(function ($controller, $rootScope, $injector, $location) { 8 | scope = $rootScope.$new(); 9 | 10 | IOAddFeedFormCtrl = $controller('IOAddFeedFormCtrl', { 11 | $scope: scope 12 | }); 13 | 14 | location = $location; 15 | scope.$digest(); 16 | })); 17 | 18 | it('should change the location.search when adding a feed', function () { 19 | scope.newFeed = { name: 'Sample Feed', href: 'http://samplefeed' }; 20 | scope.saveFeed(); 21 | scope.$digest(); 22 | console.log('$location.path', location.path()); 23 | console.log('$location.search', location.search()); 24 | expect(location.path()).toEqual(''); 25 | expect(location.search()).toEqual({feed: 'Sample Feed'}); 26 | }); 27 | }) -------------------------------------------------------------------------------- /test/spec/controllers/IOArticlePreview.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: IOArticlePreviewCtrl', function () { 4 | var IOArticlePreviewCtrl, scope, location, FeedManager; 5 | 6 | beforeEach(module('ngswipeDemoApp')); 7 | 8 | beforeEach(inject(function ($controller, $rootScope, $injector, $location, ArticlesMock) { 9 | scope = $rootScope.$new(); 10 | FeedManager = $injector.get('FeedManager'); 11 | IOArticlePreviewCtrl = $controller('IOArticlePreviewCtrl', { 12 | $scope: scope, 13 | Articles: ArticlesMock 14 | }); 15 | 16 | location = $location; 17 | 18 | scope.activeFeed = 'DailyJS'; 19 | 20 | scope.loadArticles(scope.activeFeed); 21 | 22 | scope.$digest(); 23 | })); 24 | 25 | describe('Article Loading', function () { 26 | it('should load articles from a service to display to the user', function () { 27 | expect(scope.feed.entries.length).toBeGreaterThan(0); 28 | }); 29 | 30 | it('should put the articles in a list on the scope after creating the controller', function () { 31 | scope.articles = []; 32 | scope.$digest(); 33 | 34 | expect(scope.feed.entries.length).toBeGreaterThan(0); 35 | }); 36 | 37 | it('should clear the articles from the scope when loading new articles', function () { 38 | scope.loadArticles('Foobar'); 39 | scope.$digest(); 40 | 41 | expect(scope.feed.entries).toBeUndefined(); 42 | }); 43 | 44 | it('should load new articles when loadArticles method is called', function () { 45 | scope.feed = {entries: [1, 2, 3]}; 46 | scope.loadArticles(); 47 | expect(scope.feed.entries).toBeUndefined(); 48 | }); 49 | 50 | it('should change the route to show an article detail when calling showArticle', function () { 51 | scope.openArticle('http://hello-article'); 52 | expect(location.url()).toContain('hello-article'); 53 | }); 54 | }); 55 | }); 56 | -------------------------------------------------------------------------------- /test/spec/directives/io-add-feed-form.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Directive: ioAddFeedForm', function () { 4 | beforeEach(module('ngswipeDemoApp', 'views/ioAddFeedForm.html')); 5 | 6 | var element; 7 | 8 | it('should make hidden element visible', inject(function ($rootScope, $compile) { 9 | element = angular.element(''); 10 | element = $compile(element)($rootScope); 11 | $rootScope.$digest(); 12 | expect(element.text()).toContain('Add Atom Feed'); 13 | })); 14 | }); 15 | -------------------------------------------------------------------------------- /test/spec/directives/io-article-preview.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Directive: ioArticlePreview', function () { 4 | beforeEach(module('ngswipeDemoApp', 'views/ioArticlePreview.html')); 5 | 6 | var element, $httpBackend, $compile, $rootScope, spinner, $location, $scope; 7 | 8 | beforeEach(inject(function ($injector, _$compile_, _$rootScope_, _$httpBackend_, _$location_) { 9 | $httpBackend = _$httpBackend_; 10 | $httpBackend.whenJSONP(angularFeedUrl).respond(angularJSFeed); 11 | 12 | $compile = _$compile_; 13 | $rootScope = _$rootScope_; 14 | $location = _$location_; 15 | 16 | $scope = $rootScope.$new(); 17 | $scope.feed = { 18 | entries: [{ 19 | title: 'Article Title', 20 | preview: 'Article preview', 21 | updated: 1369158736780 22 | }] 23 | } 24 | element = $compile('')($scope); 25 | })); 26 | 27 | it('should include the proper template', function () { 28 | $scope.$digest(); 29 | 30 | expect(element.html()).toContain(''); 31 | }); 32 | }); -------------------------------------------------------------------------------- /test/spec/filters/preview.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Filter: preview', function () { 4 | 5 | // load the filter's module 6 | beforeEach(module('ngswipeDemoApp')); 7 | 8 | // initialize a new instance of the filter before each test 9 | var preview; 10 | beforeEach(inject(function ($filter) { 11 | preview = $filter('preview'); 12 | })); 13 | 14 | it('should return the plaintext of the first paragraph of text', function () { 15 | expect(preview(twoParagraphs)).toBe(twoParagraphsOutput); 16 | }); 17 | 18 | it('should return a max of two hundred words, with an ellipsis', function () { 19 | expect(preview(oneLongParagraph)).toEqual(oneLongParagraphOutput); 20 | }); 21 | 22 | it('should create a preview from html without paragraphs', function () { 23 | expect(preview(noPText)).toEqual(noPTextOutput); 24 | }); 25 | 26 | }); 27 | -------------------------------------------------------------------------------- /test/spec/filters/striptags.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Filter: striptags', function () { 4 | 5 | // load the filter's module 6 | beforeEach(module('ngswipeDemoApp')); 7 | 8 | // initialize a new instance of the filter before each test 9 | var striptags; 10 | beforeEach(inject(function ($filter) { 11 | striptags = $filter('striptags'); 12 | })); 13 | 14 | it('should strip html tags out of a block of text', function () { 15 | var text = 'Angular js is BAD GOOD!
'; 16 | expect(striptags(text)).toBe('Angular js is BAD GOOD! '); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /test/spec/services/Articles.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Service: Articles', function () { 4 | var httpMock, scope, Articles; 5 | 6 | beforeEach(module('ngswipeDemoApp')); 7 | beforeEach(inject(function ($injector, $rootScope, $httpBackend) { 8 | httpMock = $httpBackend; 9 | Articles = $injector.get('Articles'); 10 | 11 | httpMock.whenJSONP(dailyFeedUrl).respond(dailyJSFeed); 12 | httpMock.whenJSONP(angularFeedUrl).respond(angularJSFeed); 13 | 14 | scope = $rootScope; 15 | })); 16 | 17 | it('should return a promise for loading a feed', function () { 18 | var promise; 19 | 20 | promise = Articles.fetch('http%3A%2F%2Fdailyjs.com%2Fatom.xml'); 21 | 22 | expect(typeof promise['then']).toEqual('function'); 23 | }); 24 | 25 | it('should cache loaded articles, indexed by url-encoded feed url', function () { 26 | Articles.fetch('http%3A%2F%2Fdailyjs.com%2Fatom.xml'); 27 | scope.$digest(); 28 | httpMock.flush(); 29 | 30 | expect(Articles._cache['http%3A%2F%2Fdailyjs.com%2Fatom.xml']).toBeDefined(); 31 | }); 32 | 33 | it('should not sanitize html returned from service', function () { 34 | Articles.fetch('http%3A%2F%2Fdailyjs.com%2Fatom.xml'); 35 | scope.$digest(); 36 | httpMock.flush(); 37 | 38 | expect(Articles._cache['http%3A%2F%2Fdailyjs.com%2Fatom.xml'].entries[0].content.content.indexOf('

')).toEqual(0); 39 | }) 40 | 41 | it('should convert non-encoded feed urls to encoded', function () { 42 | Articles.fetch('http://dailyjs.com/atom.xml'); 43 | scope.$digest(); 44 | httpMock.flush(); 45 | 46 | expect(Articles._cache['http%3A%2F%2Fdailyjs.com%2Fatom.xml']).toBeDefined(); 47 | }); 48 | 49 | it('should provide a feed title and link', function () { 50 | Articles.fetch('http://dailyjs.com/atom.xml'); 51 | scope.$digest(); 52 | httpMock.flush(); 53 | 54 | expect(Articles._cache['http%3A%2F%2Fdailyjs.com%2Fatom.xml'].meta.title).toEqual('DailyJS') 55 | }); 56 | 57 | it('should provide a title string for a feed on the entry object', function () { 58 | Articles.fetch('http://dailyjs.com/atom.xml'); 59 | scope.$digest(); 60 | httpMock.flush(); 61 | 62 | expect(typeof Articles._cache['http%3A%2F%2Fdailyjs.com%2Fatom.xml'].entries[0].title).toEqual('string') 63 | }); 64 | }); -------------------------------------------------------------------------------- /test/spec/services/RecommendedFeeds.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Service: RecommendedFeeds', function () { 4 | 5 | // load the service's module 6 | beforeEach(module('ngswipeDemoApp')); 7 | 8 | // instantiate service 9 | var RecommendedFeeds; 10 | beforeEach(inject(function (_RecommendedFeeds_) { 11 | RecommendedFeeds = _RecommendedFeeds_; 12 | })); 13 | 14 | it('return a dictionary of feeds', function () { 15 | expect(RecommendedFeeds['YouTube Blog']).toBeDefined(); 16 | }); 17 | 18 | }); 19 | --------------------------------------------------------------------------------