From 8559c95597de98e8f6c580e97224ed3ecc9dc5c0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20St=C4=99pniowski?= Date: Thu, 14 Aug 2008 15:09:41 +0200 Subject: [PATCH 1/1] =?utf8?q?Wst=C4=99pny=20import.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 6148 bytes .hgignore.swp | Bin 0 -> 12288 bytes Makefile | 3 + __init__.py | 0 books/.DS_Store | Bin 0 -> 6148 bytes books/Bajki_i_przypowiesci_Czesc_czwarta.xml | 33 + books/Bajki_i_przypowiesci_Czesc_druga.xml | 33 + books/Bajki_i_przypowiesci_Czesc_pierwsza.xml | 33 + books/Bajki_i_przypowiesci_Czesc_trzecia.xml | 33 + books/Bajki_nowe_Czesc_czwarta.xml | 33 + books/Bajki_nowe_Czesc_druga.xml | 33 + books/Bajki_nowe_Czesc_pierwsza.xml | 33 + books/Bajki_nowe_Czesc_trzecia.xml | 33 + books/Cierpienia_mlodego_Wertera.xml | 29 + books/Dusiolek.xml | 32 + books/Dziewczyna.xml | 31 + books/Fraszki_Ksiegi_pierwsze.xml | 33 + books/Fraszki_Ksiegi_trzecie.xml | 33 + books/Fraszki_Ksiegi_wtore.xml | 32 + books/Fraszki_dodane.xml | 32 + books/Moralnosc_pani_Dulskiej.xml | 29 + books/Nie-Boska_komedia.xml | 27 + books/Poeta.xml | 28 + books/Przedwiosnie.xml | 28 + books/Przydatek_do_Bajek_i_przypowiesci.xml | 33 + books/Przydatek_do_Bajek_nowych.xml | 33 + books/Romeo_i_Julia.xml | 31 + books/Satyry_Cz1_Do_krola.xml | 27 + books/Satyry_Cz1_Gracz.xml | 27 + books/Satyry_Cz1_Marnotrawstwo.xml | 27 + books/Satyry_Cz1_Oszczednosc.xml | 27 + books/Satyry_Cz1_Palinodia.xml | 27 + books/Satyry_Cz1_Pan_niewart_slugi.xml | 27 + books/Satyry_Cz1_Pijanstwo.xml | 27 + books/Satyry_Cz1_Przestroga_mlodemu.xml | 27 + books/Satyry_Cz1_Swiat_zepsuty.xml | 27 + books/Satyry_Cz1_Szczesliwosc_filutow.xml | 27 + books/Satyry_Cz1_Zlosc_ukryta_i_jawna.xml | 27 + books/Satyry_Cz1_Zona_modna.xml | 28 + books/Satyry_Cz1_Zycie_dworskie.xml | 27 + books/Satyry_Cz2_Czlowiek_i_zwierz.xml | 27 + books/Satyry_Cz2_Klatki.xml | 27 + books/Satyry_Cz2_Malzenstwo.xml | 27 + books/Satyry_Cz2_Medrek.xml | 27 + books/Satyry_Cz2_Pochwala_glupstwa.xml | 27 + books/Satyry_Cz2_Pochwala_wieku.xml | 27 + books/Satyry_Cz2_Pochwaly_milczenia.xml | 27 + books/Satyry_Cz2_Podroz.xml | 27 + books/Satyry_Cz2_Wzietosc.xml | 27 + .../Sonety_krymskie_00_Motto_i_dedykacja.xml | 28 + .../Sonety_krymskie_01_Stepy_akermanskie.xml | 28 + books/Sonety_krymskie_02_Cisza_morska.xml | 28 + books/Sonety_krymskie_03_Zegluga.xml | 29 + books/Sonety_krymskie_04_Burza.xml | 28 + ...rymskie_05_Widok_gor_ze_stepow_Kozlowa.xml | 28 + books/Sonety_krymskie_06_Bakczysaraj.xml | 28 + .../Sonety_krymskie_07_Bakczysaraj_w_nocy.xml | 28 + books/Sonety_krymskie_08_Grob_Potockiej.xml | 28 + books/Sonety_krymskie_09_Mogily_haremu.xml | 28 + books/Sonety_krymskie_10_Bajdary.xml | 28 + books/Sonety_krymskie_11_Aluszta_w_dzien.xml | 28 + books/Sonety_krymskie_12_Aluszta_w_nocy.xml | 28 + books/Sonety_krymskie_13_Czatyrdah.xml | 28 + books/Sonety_krymskie_14_Pielgrzym.xml | 28 + ..._15_Droga_nad_przepascia_w_Czufut_Kale.xml | 28 + books/Sonety_krymskie_16_Gora_Kikneis.xml | 28 + ...y_krymskie_17_Ruiny_zamku_w_Balaklawie.xml | 28 + books/Sonety_krymskie_18_Ajudah.xml | 28 + books/Swidryga_i_Midryga.xml | 29 + books/Urszula_Kochanowska.xml | 28 + books/W_malinowym_chrusniaku.xml | 30 + books/Wstep_do_Bajek_i_przypowiesci.xml | 33 + books/andersen_brzydkie_kaczatko.xml | 27 + books/andersen_krolowa_sniegu.xml | 27 + books/asnyk_daremne_zale.xml | 27 + books/asnyk_miedzy_nami_nic_nie_bylo.xml | 27 + books/asnyk_zaczarowana_krolewna.xml | 27 + books/bogurodzica.xml | 30 + books/fredro_zemsta.xml | 28 + books/kochanowski_odprawa_poslow_greckich.xml | 29 + books/kochanowski_piesn1_I.xml | 29 + books/kochanowski_piesn1_II.xml | 30 + books/kochanowski_piesn1_III.xml | 29 + books/kochanowski_piesn1_IV.xml | 29 + books/kochanowski_piesn1_IX.xml | 29 + books/kochanowski_piesn1_V.xml | 29 + books/kochanowski_piesn1_VI.xml | 29 + books/kochanowski_piesn1_VII.xml | 29 + books/kochanowski_piesn1_VIII.xml | 29 + books/kochanowski_piesn1_X.xml | 29 + books/kochanowski_piesn1_XI.xml | 29 + books/kochanowski_piesn1_XII.xml | 29 + books/kochanowski_piesn1_XIII.xml | 29 + books/kochanowski_piesn1_XIV.xml | 29 + books/kochanowski_piesn1_XIX.xml | 29 + books/kochanowski_piesn1_XV.xml | 29 + books/kochanowski_piesn1_XVI.xml | 29 + books/kochanowski_piesn1_XVII.xml | 29 + books/kochanowski_piesn1_XVIII.xml | 29 + books/kochanowski_piesn1_XX.xml | 29 + books/kochanowski_piesn1_XXI.xml | 29 + books/kochanowski_piesn1_XXII.xml | 29 + books/kochanowski_piesn1_XXIII.xml | 29 + books/kochanowski_piesn1_XXIV.xml | 29 + books/kochanowski_piesn1_XXV.xml | 29 + books/kochanowski_piesn2_I.xml | 29 + books/kochanowski_piesn2_II.xml | 29 + books/kochanowski_piesn2_III.xml | 29 + books/kochanowski_piesn2_IV.xml | 29 + books/kochanowski_piesn2_IX.xml | 30 + books/kochanowski_piesn2_V.xml | 29 + books/kochanowski_piesn2_VI.xml | 29 + books/kochanowski_piesn2_VII.xml | 29 + books/kochanowski_piesn2_VIII.xml | 29 + books/kochanowski_piesn2_X.xml | 29 + books/kochanowski_piesn2_XI.xml | 29 + books/kochanowski_piesn2_XII.xml | 29 + books/kochanowski_piesn2_XIII.xml | 29 + books/kochanowski_piesn2_XIV.xml | 29 + books/kochanowski_piesn2_XIX.xml | 29 + books/kochanowski_piesn2_XV.xml | 29 + books/kochanowski_piesn2_XVI.xml | 29 + books/kochanowski_piesn2_XVII.xml | 29 + books/kochanowski_piesn2_XVIII.xml | 29 + books/kochanowski_piesn2_XX.xml | 29 + books/kochanowski_piesn2_XXI.xml | 29 + books/kochanowski_piesn2_XXII.xml | 29 + books/kochanowski_piesn2_XXIII.xml | 29 + books/kochanowski_piesn2_XXIV.xml | 29 + books/kochanowski_piesn2_XXV.xml | 30 + books/kochanowski_piesn_swietojanska.xml | 30 + books/kochanowski_piesni_dedykacja.xml | 29 + books/kochanowski_tren_1.xml | 30 + books/kochanowski_tren_10.xml | 30 + books/kochanowski_tren_11.xml | 30 + books/kochanowski_tren_12.xml | 30 + books/kochanowski_tren_13.xml | 30 + books/kochanowski_tren_14.xml | 30 + books/kochanowski_tren_15.xml | 30 + books/kochanowski_tren_16.xml | 30 + books/kochanowski_tren_17.xml | 30 + books/kochanowski_tren_18.xml | 30 + books/kochanowski_tren_19_albo_sen.xml | 30 + books/kochanowski_tren_2.xml | 30 + books/kochanowski_tren_3.xml | 30 + books/kochanowski_tren_4.xml | 30 + books/kochanowski_tren_5.xml | 31 + books/kochanowski_tren_6.xml | 30 + books/kochanowski_tren_7.xml | 30 + books/kochanowski_tren_8.xml | 31 + books/kochanowski_tren_9.xml | 30 + ...i_treny_epitafium_hannie_kochanowskiej.xml | 30 + books/kochanowski_treny_motto_i_dedykacja.xml | 30 + books/konopnicka_nasza_szkapa.xml | 28 + books/mickiewicz_do_m.xml | 29 + books/mickiewicz_lilije.xml | 31 + books/mickiewicz_oda_do_mlodosci.xml | 28 + books/mickiewicz_pani_twardowska.xml | 29 + books/mickiewicz_powrot_taty.xml | 29 + books/mickiewicz_reduta_ordona.xml | 28 + books/mickiewicz_rekawiczka.xml | 31 + books/mickiewicz_romantycznosc.xml | 31 + books/mickiewicz_rybka.xml | 31 + books/mickiewicz_smierc_pulkownika.xml | 28 + books/mickiewicz_switez.xml | 31 + books/mickiewicz_switezianka.xml | 31 + books/morsztyn_cuda_milosci_1.xml | 28 + books/morsztyn_cuda_milosci_2.xml | 28 + books/morsztyn_do_motyla.xml | 28 + books/morsztyn_do_swoich_ksiazek_1.xml | 28 + books/morsztyn_do_swoich_ksiazek_2.xml | 28 + books/morsztyn_do_trupa.xml | 29 + ...n_na_krzyzyk_na_piersiach_jednej_panny.xml | 28 + books/morsztyn_na_zegar_ciekacy.xml | 28 + books/morsztyn_nadgrobek_perlisi.xml | 28 + books/morsztyn_niestatek_1.xml | 28 + books/morsztyn_niestatek_2.xml | 28 + books/morsztyn_pszczola_w_bursztynie.xml | 28 + books/oppman_biala_dama.xml | 28 + books/oppman_chrystus_cudowny_u_fary.xml | 28 + books/oppman_kosciol_panny_marii.xml | 28 + .../oppman_legendy_warszawskie_bazyliszek.xml | 28 + books/oppman_syrena.xml | 28 + books/oppman_wstep.xml | 28 + books/oppman_zbojcy.xml | 28 + books/oppman_zlota_kaczka.xml | 28 + books/reymont_chlopi_jesien.xml | 29 + books/sienkiewicz_janko_muzykant.xml | 27 + books/sienkiewicz_latarnik.xml | 28 + books/slowacki_do_matki.xml | 26 + books/slowacki_grob_agamemnona.xml | 27 + books/slowacki_hymn.xml | 28 + ...owacki_odpowiedz_na_psalmy_przyszlosci.xml | 27 + books/slowacki_testament_moj.xml | 28 + .../slowacki_w_pamietniku_zofii_bobrowny.xml | 28 + books/sofokles_antygona.xml | 28 + books/sofokles_krol_edyp.xml | 28 + books/zeromski_doktor_piotr.xml | 28 + books/zeromski_ludzie_bezdomni_tom_drugi.xml | 28 + .../zeromski_ludzie_bezdomni_tom_pierwszy.xml | 28 + books/zeromski_silaczka.xml | 28 + catalogue/.DS_Store | Bin 0 -> 6148 bytes catalogue/__init__.py | 0 catalogue/admin.py | 33 + catalogue/fields.py | 51 + catalogue/forms.py | 39 + catalogue/lib/.DS_Store | Bin 0 -> 6148 bytes catalogue/lib/__init__.py | 0 catalogue/lib/dcparser/__init__.py | 5 + catalogue/lib/dcparser/converters.py | 34 + catalogue/lib/dcparser/dcparser.py | 121 + catalogue/lib/dcparser/person.py | 24 + catalogue/lib/slughifi.py | 56 + catalogue/management/.DS_Store | Bin 0 -> 6148 bytes catalogue/management/__init__.py | 0 catalogue/management/commands/.DS_Store | Bin 0 -> 6148 bytes catalogue/management/commands/__init__.py | 0 catalogue/management/commands/importbooks.py | 66 + catalogue/models.py | 128 + catalogue/templatetags/__init__.py | 0 catalogue/templatetags/catalogue.py | 152 + catalogue/urls.py | 17 + catalogue/utils.py | 9 + catalogue/views.py | 157 + chunks/__init__.py | 0 chunks/admin.py | 11 + chunks/models.py | 22 + chunks/templatetags/__init__.py | 0 chunks/templatetags/chunks.py | 45 + compress/__init__.py | 0 compress/conf/__init__.py | 0 compress/conf/settings.py | 22 + compress/filter_base.py | 14 + compress/filters/__init__.py | 0 compress/filters/csstidy/__init__.py | 33 + compress/filters/csstidy_python/__init__.py | 19 + compress/filters/csstidy_python/csstidy.py | 636 ++++ compress/filters/csstidy_python/data.py | 421 +++ compress/filters/csstidy_python/optimizer.py | 383 +++ compress/filters/csstidy_python/output.py | 101 + compress/filters/csstidy_python/tools.py | 109 + compress/filters/jsmin/__init__.py | 6 + compress/filters/jsmin/jsmin.py | 218 ++ compress/filters/yui/__init__.py | 44 + compress/management/__init__.py | 0 compress/management/commands/__init__.py | 0 compress/management/commands/synccompress.py | 51 + compress/models.py | 0 compress/signals.py | 4 + compress/templates/compress/css.html | 1 + compress/templates/compress/css_ie.html | 1 + compress/templates/compress/js.html | 1 + compress/templates/compress/js_ie.html | 1 + compress/templatetags/__init__.py | 0 compress/templatetags/compressed.py | 104 + compress/utils.py | 130 + feedparser.py | 2858 +++++++++++++++++ lektury.sqlite | Bin 0 -> 135168 bytes locale/pl/LC_MESSAGES/django.mo | Bin 0 -> 1199 bytes locale/pl/LC_MESSAGES/django.po | 105 + manage.py | 11 + media/.DS_Store | Bin 0 -> 6148 bytes media/books/.DS_Store | Bin 0 -> 6148 bytes .../books/odt/andersen_brzydkie_kaczatko.odt | Bin 0 -> 43646 bytes .../books/pdf/andersen_brzydkie_kaczatko.pdf | Bin 0 -> 281941 bytes media/css/jquery.autocomplete.css | 48 + media/css/master.css | 334 ++ media/img/.DS_Store | Bin 0 -> 6148 bytes media/img/bg.png | Bin 0 -> 760 bytes media/img/book.png | Bin 0 -> 803 bytes media/img/favicon.png | Bin 0 -> 120 bytes media/img/footer.png | Bin 0 -> 21220 bytes media/img/indicator.gif | Bin 0 -> 1553 bytes media/img/logo.png | Bin 0 -> 5173 bytes media/img/old/.DS_Store | Bin 0 -> 6148 bytes media/img/old/bg.png | Bin 0 -> 894 bytes media/img/old/book.png | Bin 0 -> 992 bytes media/img/old/favicon.png | Bin 0 -> 128 bytes media/img/old/footer.png | Bin 0 -> 30285 bytes media/img/old/indicator.gif | Bin 0 -> 1553 bytes media/img/old/logo.png | Bin 0 -> 7146 bytes media/js/.DS_Store | Bin 0 -> 6148 bytes media/js/jquery.autocolumn.js | 202 ++ media/js/jquery.autocomplete.js | 759 +++++ media/js/jquery.form.js | 601 ++++ media/js/jquery.jqmodal.js | 214 ++ media/js/jquery.js | 32 + media/js/jquery.labelify.js | 89 + middleware.py | 126 + newtagging/__init__.py | 0 newtagging/admin.py | 67 + newtagging/managers.py | 78 + newtagging/models.py | 501 +++ newtagging/utils.py | 34 + pagination/__init__.py | 1 + pagination/middleware.py | 10 + pagination/models.py | 1 + .../templates/pagination/pagination.html | 25 + pagination/templatetags/__init__.py | 1 + pagination/templatetags/pagination_tags.py | 200 ++ pagination/tests.py | 52 + settings.py | 122 + templates/404.html | 3 + templates/admin/base_site.html | 10 + templates/auth/login.html | 11 + templates/base.html | 62 + templates/catalogue/_book.html | 30 + templates/catalogue/book_detail.html | 96 + templates/catalogue/book_list.html | 34 + templates/catalogue/book_sets.html | 13 + templates/catalogue/latest_blog_posts.html | 5 + templates/catalogue/main_page.html | 86 + templates/catalogue/tagged_book_list.html | 153 + templates/pagination/pagination.html | 25 + urls.py | 26 + 315 files changed, 15968 insertions(+) create mode 100644 .DS_Store create mode 100644 .hgignore.swp create mode 100644 Makefile create mode 100644 __init__.py create mode 100755 books/.DS_Store create mode 100755 books/Bajki_i_przypowiesci_Czesc_czwarta.xml create mode 100755 books/Bajki_i_przypowiesci_Czesc_druga.xml create mode 100755 books/Bajki_i_przypowiesci_Czesc_pierwsza.xml create mode 100755 books/Bajki_i_przypowiesci_Czesc_trzecia.xml create mode 100755 books/Bajki_nowe_Czesc_czwarta.xml create mode 100755 books/Bajki_nowe_Czesc_druga.xml create mode 100755 books/Bajki_nowe_Czesc_pierwsza.xml create mode 100755 books/Bajki_nowe_Czesc_trzecia.xml create mode 100755 books/Cierpienia_mlodego_Wertera.xml create mode 100755 books/Dusiolek.xml create mode 100755 books/Dziewczyna.xml create mode 100755 books/Fraszki_Ksiegi_pierwsze.xml create mode 100755 books/Fraszki_Ksiegi_trzecie.xml create mode 100755 books/Fraszki_Ksiegi_wtore.xml create mode 100755 books/Fraszki_dodane.xml create mode 100755 books/Moralnosc_pani_Dulskiej.xml create mode 100755 books/Nie-Boska_komedia.xml create mode 100755 books/Poeta.xml create mode 100755 books/Przedwiosnie.xml create mode 100755 books/Przydatek_do_Bajek_i_przypowiesci.xml create mode 100755 books/Przydatek_do_Bajek_nowych.xml create mode 100755 books/Romeo_i_Julia.xml create mode 100755 books/Satyry_Cz1_Do_krola.xml create mode 100755 books/Satyry_Cz1_Gracz.xml create mode 100755 books/Satyry_Cz1_Marnotrawstwo.xml create mode 100755 books/Satyry_Cz1_Oszczednosc.xml create mode 100755 books/Satyry_Cz1_Palinodia.xml create mode 100755 books/Satyry_Cz1_Pan_niewart_slugi.xml create mode 100755 books/Satyry_Cz1_Pijanstwo.xml create mode 100755 books/Satyry_Cz1_Przestroga_mlodemu.xml create mode 100755 books/Satyry_Cz1_Swiat_zepsuty.xml create mode 100755 books/Satyry_Cz1_Szczesliwosc_filutow.xml create mode 100755 books/Satyry_Cz1_Zlosc_ukryta_i_jawna.xml create mode 100755 books/Satyry_Cz1_Zona_modna.xml create mode 100755 books/Satyry_Cz1_Zycie_dworskie.xml create mode 100755 books/Satyry_Cz2_Czlowiek_i_zwierz.xml create mode 100755 books/Satyry_Cz2_Klatki.xml create mode 100755 books/Satyry_Cz2_Malzenstwo.xml create mode 100755 books/Satyry_Cz2_Medrek.xml create mode 100755 books/Satyry_Cz2_Pochwala_glupstwa.xml create mode 100755 books/Satyry_Cz2_Pochwala_wieku.xml create mode 100755 books/Satyry_Cz2_Pochwaly_milczenia.xml create mode 100755 books/Satyry_Cz2_Podroz.xml create mode 100755 books/Satyry_Cz2_Wzietosc.xml create mode 100755 books/Sonety_krymskie_00_Motto_i_dedykacja.xml create mode 100755 books/Sonety_krymskie_01_Stepy_akermanskie.xml create mode 100755 books/Sonety_krymskie_02_Cisza_morska.xml create mode 100755 books/Sonety_krymskie_03_Zegluga.xml create mode 100755 books/Sonety_krymskie_04_Burza.xml create mode 100755 books/Sonety_krymskie_05_Widok_gor_ze_stepow_Kozlowa.xml create mode 100755 books/Sonety_krymskie_06_Bakczysaraj.xml create mode 100755 books/Sonety_krymskie_07_Bakczysaraj_w_nocy.xml create mode 100755 books/Sonety_krymskie_08_Grob_Potockiej.xml create mode 100755 books/Sonety_krymskie_09_Mogily_haremu.xml create mode 100755 books/Sonety_krymskie_10_Bajdary.xml create mode 100755 books/Sonety_krymskie_11_Aluszta_w_dzien.xml create mode 100755 books/Sonety_krymskie_12_Aluszta_w_nocy.xml create mode 100755 books/Sonety_krymskie_13_Czatyrdah.xml create mode 100755 books/Sonety_krymskie_14_Pielgrzym.xml create mode 100755 books/Sonety_krymskie_15_Droga_nad_przepascia_w_Czufut_Kale.xml create mode 100755 books/Sonety_krymskie_16_Gora_Kikneis.xml create mode 100755 books/Sonety_krymskie_17_Ruiny_zamku_w_Balaklawie.xml create mode 100755 books/Sonety_krymskie_18_Ajudah.xml create mode 100755 books/Swidryga_i_Midryga.xml create mode 100755 books/Urszula_Kochanowska.xml create mode 100755 books/W_malinowym_chrusniaku.xml create mode 100755 books/Wstep_do_Bajek_i_przypowiesci.xml create mode 100755 books/andersen_brzydkie_kaczatko.xml create mode 100755 books/andersen_krolowa_sniegu.xml create mode 100755 books/asnyk_daremne_zale.xml create mode 100755 books/asnyk_miedzy_nami_nic_nie_bylo.xml create mode 100755 books/asnyk_zaczarowana_krolewna.xml create mode 100755 books/bogurodzica.xml create mode 100755 books/fredro_zemsta.xml create mode 100755 books/kochanowski_odprawa_poslow_greckich.xml create mode 100755 books/kochanowski_piesn1_I.xml create mode 100755 books/kochanowski_piesn1_II.xml create mode 100755 books/kochanowski_piesn1_III.xml create mode 100755 books/kochanowski_piesn1_IV.xml create mode 100755 books/kochanowski_piesn1_IX.xml create mode 100755 books/kochanowski_piesn1_V.xml create mode 100755 books/kochanowski_piesn1_VI.xml create mode 100755 books/kochanowski_piesn1_VII.xml create mode 100755 books/kochanowski_piesn1_VIII.xml create mode 100755 books/kochanowski_piesn1_X.xml create mode 100755 books/kochanowski_piesn1_XI.xml create mode 100755 books/kochanowski_piesn1_XII.xml create mode 100755 books/kochanowski_piesn1_XIII.xml create mode 100755 books/kochanowski_piesn1_XIV.xml create mode 100755 books/kochanowski_piesn1_XIX.xml create mode 100755 books/kochanowski_piesn1_XV.xml create mode 100755 books/kochanowski_piesn1_XVI.xml create mode 100755 books/kochanowski_piesn1_XVII.xml create mode 100755 books/kochanowski_piesn1_XVIII.xml create mode 100755 books/kochanowski_piesn1_XX.xml create mode 100755 books/kochanowski_piesn1_XXI.xml create mode 100755 books/kochanowski_piesn1_XXII.xml create mode 100755 books/kochanowski_piesn1_XXIII.xml create mode 100755 books/kochanowski_piesn1_XXIV.xml create mode 100755 books/kochanowski_piesn1_XXV.xml create mode 100755 books/kochanowski_piesn2_I.xml create mode 100755 books/kochanowski_piesn2_II.xml create mode 100755 books/kochanowski_piesn2_III.xml create mode 100755 books/kochanowski_piesn2_IV.xml create mode 100755 books/kochanowski_piesn2_IX.xml create mode 100755 books/kochanowski_piesn2_V.xml create mode 100755 books/kochanowski_piesn2_VI.xml create mode 100755 books/kochanowski_piesn2_VII.xml create mode 100755 books/kochanowski_piesn2_VIII.xml create mode 100755 books/kochanowski_piesn2_X.xml create mode 100755 books/kochanowski_piesn2_XI.xml create mode 100755 books/kochanowski_piesn2_XII.xml create mode 100755 books/kochanowski_piesn2_XIII.xml create mode 100755 books/kochanowski_piesn2_XIV.xml create mode 100755 books/kochanowski_piesn2_XIX.xml create mode 100755 books/kochanowski_piesn2_XV.xml create mode 100755 books/kochanowski_piesn2_XVI.xml create mode 100755 books/kochanowski_piesn2_XVII.xml create mode 100755 books/kochanowski_piesn2_XVIII.xml create mode 100755 books/kochanowski_piesn2_XX.xml create mode 100755 books/kochanowski_piesn2_XXI.xml create mode 100755 books/kochanowski_piesn2_XXII.xml create mode 100755 books/kochanowski_piesn2_XXIII.xml create mode 100755 books/kochanowski_piesn2_XXIV.xml create mode 100755 books/kochanowski_piesn2_XXV.xml create mode 100755 books/kochanowski_piesn_swietojanska.xml create mode 100755 books/kochanowski_piesni_dedykacja.xml create mode 100755 books/kochanowski_tren_1.xml create mode 100755 books/kochanowski_tren_10.xml create mode 100755 books/kochanowski_tren_11.xml create mode 100755 books/kochanowski_tren_12.xml create mode 100755 books/kochanowski_tren_13.xml create mode 100755 books/kochanowski_tren_14.xml create mode 100755 books/kochanowski_tren_15.xml create mode 100755 books/kochanowski_tren_16.xml create mode 100755 books/kochanowski_tren_17.xml create mode 100755 books/kochanowski_tren_18.xml create mode 100755 books/kochanowski_tren_19_albo_sen.xml create mode 100755 books/kochanowski_tren_2.xml create mode 100755 books/kochanowski_tren_3.xml create mode 100755 books/kochanowski_tren_4.xml create mode 100755 books/kochanowski_tren_5.xml create mode 100755 books/kochanowski_tren_6.xml create mode 100755 books/kochanowski_tren_7.xml create mode 100755 books/kochanowski_tren_8.xml create mode 100755 books/kochanowski_tren_9.xml create mode 100755 books/kochanowski_treny_epitafium_hannie_kochanowskiej.xml create mode 100755 books/kochanowski_treny_motto_i_dedykacja.xml create mode 100755 books/konopnicka_nasza_szkapa.xml create mode 100755 books/mickiewicz_do_m.xml create mode 100755 books/mickiewicz_lilije.xml create mode 100755 books/mickiewicz_oda_do_mlodosci.xml create mode 100755 books/mickiewicz_pani_twardowska.xml create mode 100755 books/mickiewicz_powrot_taty.xml create mode 100755 books/mickiewicz_reduta_ordona.xml create mode 100755 books/mickiewicz_rekawiczka.xml create mode 100755 books/mickiewicz_romantycznosc.xml create mode 100755 books/mickiewicz_rybka.xml create mode 100755 books/mickiewicz_smierc_pulkownika.xml create mode 100755 books/mickiewicz_switez.xml create mode 100755 books/mickiewicz_switezianka.xml create mode 100755 books/morsztyn_cuda_milosci_1.xml create mode 100755 books/morsztyn_cuda_milosci_2.xml create mode 100755 books/morsztyn_do_motyla.xml create mode 100755 books/morsztyn_do_swoich_ksiazek_1.xml create mode 100755 books/morsztyn_do_swoich_ksiazek_2.xml create mode 100755 books/morsztyn_do_trupa.xml create mode 100755 books/morsztyn_na_krzyzyk_na_piersiach_jednej_panny.xml create mode 100755 books/morsztyn_na_zegar_ciekacy.xml create mode 100755 books/morsztyn_nadgrobek_perlisi.xml create mode 100755 books/morsztyn_niestatek_1.xml create mode 100755 books/morsztyn_niestatek_2.xml create mode 100755 books/morsztyn_pszczola_w_bursztynie.xml create mode 100755 books/oppman_biala_dama.xml create mode 100755 books/oppman_chrystus_cudowny_u_fary.xml create mode 100755 books/oppman_kosciol_panny_marii.xml create mode 100755 books/oppman_legendy_warszawskie_bazyliszek.xml create mode 100755 books/oppman_syrena.xml create mode 100755 books/oppman_wstep.xml create mode 100755 books/oppman_zbojcy.xml create mode 100755 books/oppman_zlota_kaczka.xml create mode 100755 books/reymont_chlopi_jesien.xml create mode 100755 books/sienkiewicz_janko_muzykant.xml create mode 100755 books/sienkiewicz_latarnik.xml create mode 100755 books/slowacki_do_matki.xml create mode 100755 books/slowacki_grob_agamemnona.xml create mode 100755 books/slowacki_hymn.xml create mode 100755 books/slowacki_odpowiedz_na_psalmy_przyszlosci.xml create mode 100755 books/slowacki_testament_moj.xml create mode 100755 books/slowacki_w_pamietniku_zofii_bobrowny.xml create mode 100755 books/sofokles_antygona.xml create mode 100755 books/sofokles_krol_edyp.xml create mode 100755 books/zeromski_doktor_piotr.xml create mode 100755 books/zeromski_ludzie_bezdomni_tom_drugi.xml create mode 100755 books/zeromski_ludzie_bezdomni_tom_pierwszy.xml create mode 100755 books/zeromski_silaczka.xml create mode 100644 catalogue/.DS_Store create mode 100644 catalogue/__init__.py create mode 100644 catalogue/admin.py create mode 100644 catalogue/fields.py create mode 100644 catalogue/forms.py create mode 100644 catalogue/lib/.DS_Store create mode 100644 catalogue/lib/__init__.py create mode 100644 catalogue/lib/dcparser/__init__.py create mode 100644 catalogue/lib/dcparser/converters.py create mode 100644 catalogue/lib/dcparser/dcparser.py create mode 100644 catalogue/lib/dcparser/person.py create mode 100644 catalogue/lib/slughifi.py create mode 100644 catalogue/management/.DS_Store create mode 100644 catalogue/management/__init__.py create mode 100644 catalogue/management/commands/.DS_Store create mode 100644 catalogue/management/commands/__init__.py create mode 100644 catalogue/management/commands/importbooks.py create mode 100644 catalogue/models.py create mode 100644 catalogue/templatetags/__init__.py create mode 100644 catalogue/templatetags/catalogue.py create mode 100644 catalogue/urls.py create mode 100644 catalogue/utils.py create mode 100644 catalogue/views.py create mode 100644 chunks/__init__.py create mode 100644 chunks/admin.py create mode 100644 chunks/models.py create mode 100644 chunks/templatetags/__init__.py create mode 100644 chunks/templatetags/chunks.py create mode 100644 compress/__init__.py create mode 100644 compress/conf/__init__.py create mode 100644 compress/conf/settings.py create mode 100644 compress/filter_base.py create mode 100644 compress/filters/__init__.py create mode 100644 compress/filters/csstidy/__init__.py create mode 100644 compress/filters/csstidy_python/__init__.py create mode 100644 compress/filters/csstidy_python/csstidy.py create mode 100644 compress/filters/csstidy_python/data.py create mode 100644 compress/filters/csstidy_python/optimizer.py create mode 100644 compress/filters/csstidy_python/output.py create mode 100644 compress/filters/csstidy_python/tools.py create mode 100644 compress/filters/jsmin/__init__.py create mode 100644 compress/filters/jsmin/jsmin.py create mode 100644 compress/filters/yui/__init__.py create mode 100644 compress/management/__init__.py create mode 100644 compress/management/commands/__init__.py create mode 100644 compress/management/commands/synccompress.py create mode 100644 compress/models.py create mode 100644 compress/signals.py create mode 100644 compress/templates/compress/css.html create mode 100644 compress/templates/compress/css_ie.html create mode 100644 compress/templates/compress/js.html create mode 100644 compress/templates/compress/js_ie.html create mode 100644 compress/templatetags/__init__.py create mode 100644 compress/templatetags/compressed.py create mode 100644 compress/utils.py create mode 100644 feedparser.py create mode 100644 lektury.sqlite create mode 100644 locale/pl/LC_MESSAGES/django.mo create mode 100644 locale/pl/LC_MESSAGES/django.po create mode 100755 manage.py create mode 100644 media/.DS_Store create mode 100644 media/books/.DS_Store create mode 100644 media/books/odt/andersen_brzydkie_kaczatko.odt create mode 100644 media/books/pdf/andersen_brzydkie_kaczatko.pdf create mode 100644 media/css/jquery.autocomplete.css create mode 100644 media/css/master.css create mode 100644 media/img/.DS_Store create mode 100644 media/img/bg.png create mode 100644 media/img/book.png create mode 100644 media/img/favicon.png create mode 100644 media/img/footer.png create mode 100644 media/img/indicator.gif create mode 100644 media/img/logo.png create mode 100644 media/img/old/.DS_Store create mode 100644 media/img/old/bg.png create mode 100644 media/img/old/book.png create mode 100644 media/img/old/favicon.png create mode 100644 media/img/old/footer.png create mode 100644 media/img/old/indicator.gif create mode 100644 media/img/old/logo.png create mode 100644 media/js/.DS_Store create mode 100644 media/js/jquery.autocolumn.js create mode 100644 media/js/jquery.autocomplete.js create mode 100644 media/js/jquery.form.js create mode 100644 media/js/jquery.jqmodal.js create mode 100644 media/js/jquery.js create mode 100644 media/js/jquery.labelify.js create mode 100644 middleware.py create mode 100644 newtagging/__init__.py create mode 100644 newtagging/admin.py create mode 100644 newtagging/managers.py create mode 100644 newtagging/models.py create mode 100644 newtagging/utils.py create mode 100644 pagination/__init__.py create mode 100644 pagination/middleware.py create mode 100644 pagination/models.py create mode 100644 pagination/templates/pagination/pagination.html create mode 100644 pagination/templatetags/__init__.py create mode 100644 pagination/templatetags/pagination_tags.py create mode 100644 pagination/tests.py create mode 100644 settings.py create mode 100644 templates/404.html create mode 100644 templates/admin/base_site.html create mode 100644 templates/auth/login.html create mode 100644 templates/base.html create mode 100644 templates/catalogue/_book.html create mode 100644 templates/catalogue/book_detail.html create mode 100644 templates/catalogue/book_list.html create mode 100644 templates/catalogue/book_sets.html create mode 100644 templates/catalogue/latest_blog_posts.html create mode 100644 templates/catalogue/main_page.html create mode 100644 templates/catalogue/tagged_book_list.html create mode 100644 templates/pagination/pagination.html create mode 100644 urls.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..280bd03c5f9558dcb5d8f6ce47142276fde34164 GIT binary patch literal 6148 zcmeHKK~4iP478z#A}&30%oE@TQB_{R2cQeAR$6rrPd6$(g629kkfAQ?yo7G%J4nXE4t zJTs3<29kll!2sWf0wvbK+0mX34AuewSRu;G0;*me()W+GNaoI=djnn*^#?&-NJ!c2pAzb JBm)aD@By^)B;Wu5 literal 0 HcmV?d00001 diff --git a/.hgignore.swp b/.hgignore.swp new file mode 100644 index 0000000000000000000000000000000000000000..0ec46619c3f15b3f7bcbb6e919b199416229a9b5 GIT binary patch literal 12288 zcmeI&F;2rU6vpuvBt`^+3k2xI-~rPT4OR^?)_~A)c{Bex4W8NnT9I!51hT6W>47bgKiL zF@8*jjd5SFKPTsn&Qy}CV8pD2Z%LNd8sEOgzHsJ(Z`oQ`b&H(8?v-z$s}=rL3u8{k zw;H1^)152e3b+FQP66K8V!geH?p*;_z!lgkAm4|CO)xdABI>7uPD=n{m&0o8OD!Qe ziD7D3MdTA&h^fSw8mzbB(93MO<_l`V#dl + + +Krasicki, Ignacy +Bajki i przypowieści (4) +Bajki i przypowieści +Goliński, Zbigniew +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Bajka +Przypowieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3044&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Bajki, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, Kraków, 1975 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2007-11-29 +SP2 +G +L +pol + + + diff --git a/books/Bajki_i_przypowiesci_Czesc_druga.xml b/books/Bajki_i_przypowiesci_Czesc_druga.xml new file mode 100755 index 000000000..ec00cd779 --- /dev/null +++ b/books/Bajki_i_przypowiesci_Czesc_druga.xml @@ -0,0 +1,33 @@ + + + +Krasicki, Ignacy +Bajki i przypowieści (2) +Bajki i przypowieści +Goliński, Zbigniew +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Bajka +Przypowieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3044&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Bajki, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, Kraków, 1975 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2007-11-29 +SP2 +G +L +pol + + + diff --git a/books/Bajki_i_przypowiesci_Czesc_pierwsza.xml b/books/Bajki_i_przypowiesci_Czesc_pierwsza.xml new file mode 100755 index 000000000..8939834ca --- /dev/null +++ b/books/Bajki_i_przypowiesci_Czesc_pierwsza.xml @@ -0,0 +1,33 @@ + + + +Krasicki, Ignacy +Bajki i przypowieści (1) +Bajki i przypowieści +Goliński, Zbigniew +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Bajka +Przypowieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3044&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Bajki, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, Kraków, 1975 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2007-11-29 +SP2 +G +L +pol + + + diff --git a/books/Bajki_i_przypowiesci_Czesc_trzecia.xml b/books/Bajki_i_przypowiesci_Czesc_trzecia.xml new file mode 100755 index 000000000..fa1bc602a --- /dev/null +++ b/books/Bajki_i_przypowiesci_Czesc_trzecia.xml @@ -0,0 +1,33 @@ + + + +Krasicki, Ignacy +Bajki i przypowieści (3) +Bajki i przypowieści +Goliński, Zbigniew +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Bajka +Przypowieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3044&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Bajki, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, Kraków, 1975 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2007-11-29 +SP2 +G +L +pol + + + diff --git a/books/Bajki_nowe_Czesc_czwarta.xml b/books/Bajki_nowe_Czesc_czwarta.xml new file mode 100755 index 000000000..205ed0edc --- /dev/null +++ b/books/Bajki_nowe_Czesc_czwarta.xml @@ -0,0 +1,33 @@ + + + +Krasicki, Ignacy +Bajki nowe (4) +Bajki nowe +Goliński, Zbigniew +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Bajka +Przypowieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3044&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Bajki, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, Kraków, 1975 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2007-11-29 +SP2 +G +L +pol + + + diff --git a/books/Bajki_nowe_Czesc_druga.xml b/books/Bajki_nowe_Czesc_druga.xml new file mode 100755 index 000000000..7bda731fa --- /dev/null +++ b/books/Bajki_nowe_Czesc_druga.xml @@ -0,0 +1,33 @@ + + + +Krasicki, Ignacy +Bajki nowe (2) +Bajki nowe +Goliński, Zbigniew +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Bajka +Przypowieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3044&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Bajki, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, Kraków, 1975 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2007-11-29 +SP2 +G +L +pol + + + diff --git a/books/Bajki_nowe_Czesc_pierwsza.xml b/books/Bajki_nowe_Czesc_pierwsza.xml new file mode 100755 index 000000000..750199f43 --- /dev/null +++ b/books/Bajki_nowe_Czesc_pierwsza.xml @@ -0,0 +1,33 @@ + + + +Krasicki, Ignacy +Bajki nowe (1) +Bajki nowe +Goliński, Zbigniew +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Bajka +Przypowieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3044&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Bajki, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, Kraków, 1975 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2007-11-29 +SP2 +G +L +pol + + + diff --git a/books/Bajki_nowe_Czesc_trzecia.xml b/books/Bajki_nowe_Czesc_trzecia.xml new file mode 100755 index 000000000..55ad09fa6 --- /dev/null +++ b/books/Bajki_nowe_Czesc_trzecia.xml @@ -0,0 +1,33 @@ + + + +Krasicki, Ignacy +Bajki nowe (3) +Bajki nowe +Goliński, Zbigniew +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Bajka +Przypowieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3044&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Bajki, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, Kraków, 1975 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2007-11-29 +SP2 +G +L +pol + + + diff --git a/books/Cierpienia_mlodego_Wertera.xml b/books/Cierpienia_mlodego_Wertera.xml new file mode 100755 index 000000000..2a70fb2df --- /dev/null +++ b/books/Cierpienia_mlodego_Wertera.xml @@ -0,0 +1,29 @@ + + + +Goethe, Johann Wolfgang von +Cierpienia młodego Wertera +Mirandola, Franciszek +Zygmunt, Zagórowski +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Epika +Powieść epistolarna +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Cierpienia+m%C5%82odego+Wertera +http://www.polona.pl/Content/3770 +Goethe, Johann Wolfgang von (1749-1832), Cierpienia młodego Wertera, tłum. Franciszek Mirandola, oprac. Zygmunt Zagórowski, Krakowska Spółka Wydawnicza, Kraków, 1922 +Domena publiczna - Johann Wolfgang von Goethe zm. 1832 +1832 +xml +text +text +2008-02-27 +L +pol + + + diff --git a/books/Dusiolek.xml b/books/Dusiolek.xml new file mode 100755 index 000000000..8c4f4b968 --- /dev/null +++ b/books/Dusiolek.xml @@ -0,0 +1,32 @@ + + + +Leśmian, Bolesław +Dusiołek +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Młoda Polska +Dwudziestolecie międzywojenne +Liryka +Epika +Ballada +Wiersz +Wiersz sylabotoniczny +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Dusio%C5%82ek +http://www.polona.pl/dlibra/doccontent2?id=7336&from=&from=generalsearch&dirids=1&lang=pl +Bolesław Leśmian (1877-1937), Łąka, Wydawnictwo Mortkowicza, Warszawa, 1920 +Domena publiczna - Bolesław Leśmian zm. 1937 +1937 +xml +text +text +2008-01-11 +G +L +pol + + + diff --git a/books/Dziewczyna.xml b/books/Dziewczyna.xml new file mode 100755 index 000000000..b5c66cf95 --- /dev/null +++ b/books/Dziewczyna.xml @@ -0,0 +1,31 @@ + + + +Leśmian, Bolesław +Dziewczyna +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Młoda Polska +Dwudziestolecie międzywojenne +Liryka +Epika +Ballada +Wiersz +Wiersz sylabotoniczny +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Dziewczyna +Bolesław Leśmian (1877-1937), Napój cienisty, Wydawnictwo Mortkowicza, Warszawa, 1936 +Domena publiczna - Bolesław Leśmian zm. 1937 +1937 +xml +text +text +2008-01-11 +G +L +pol + + + diff --git a/books/Fraszki_Ksiegi_pierwsze.xml b/books/Fraszki_Ksiegi_pierwsze.xml new file mode 100755 index 000000000..f2569b970 --- /dev/null +++ b/books/Fraszki_Ksiegi_pierwsze.xml @@ -0,0 +1,33 @@ + + + +Kochanowski, Jan +Fraszki - Księgi 1 +Fraszki +Krzyżanowski, Julian +Otwinowska, Barbara +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Fraszka +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=1499&from=editionindex&dirids=1 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Kochanowski zm. 1584 +1584 +xml +text +text +2007-09-07 +SP2 +G +L +pol + + + diff --git a/books/Fraszki_Ksiegi_trzecie.xml b/books/Fraszki_Ksiegi_trzecie.xml new file mode 100755 index 000000000..42c5b8a70 --- /dev/null +++ b/books/Fraszki_Ksiegi_trzecie.xml @@ -0,0 +1,33 @@ + + + +Kochanowski, Jan +Fraszki - Księgi 3 +Fraszki +Krzyżanowski, Julian +Otwinowska, Barbara +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Fraszka +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=1499&from=editionindex&dirids=1 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Kochanowski zm. 1584 +1584 +xml +text +text +2007-09-07 +SP2 +G +L +pol + + + diff --git a/books/Fraszki_Ksiegi_wtore.xml b/books/Fraszki_Ksiegi_wtore.xml new file mode 100755 index 000000000..d84e990a3 --- /dev/null +++ b/books/Fraszki_Ksiegi_wtore.xml @@ -0,0 +1,32 @@ + + + +Kochanowski, Jan +Fraszki - Księgi 2 +Fraszki +Krzyżanowski, Julian +Otwinowska, Barbara +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Fraszka +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=1499&from=editionindex&dirids=1 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Kochanowski zm. 1584 +1584 +xml +text +text +2007-09-07 +G +L +pol + + + diff --git a/books/Fraszki_dodane.xml b/books/Fraszki_dodane.xml new file mode 100755 index 000000000..d87ea17b9 --- /dev/null +++ b/books/Fraszki_dodane.xml @@ -0,0 +1,32 @@ + + + +Kochanowski, Jan +Fraszki - Utwory dodane +Fraszki +Krzyżanowski, Julian +Otwinowska, Barbara +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Fraszka +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=1499&from=editionindex&dirids=1 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Kochanowski zm. 1584 +1584 +xml +text +text +2007-09-07 +G +L +pol + + + diff --git a/books/Moralnosc_pani_Dulskiej.xml b/books/Moralnosc_pani_Dulskiej.xml new file mode 100755 index 000000000..80842d6e9 --- /dev/null +++ b/books/Moralnosc_pani_Dulskiej.xml @@ -0,0 +1,29 @@ + + + +Zapolska, Gabriela +Moralność pani Dulskiej +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Dramat +Tragifarsa +Komedia +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Moralno%C5%9B%C4%87+pani+Dulskiej +http://www.polona.pl/dlibra/doccontent2?id=582&from=&from=generalsearch&dirids=1&lang=pl +Zapolska, Gabriela (1857-1921), Moralność pani Dulskiej: komedya w trzech aktach, Tow. Akc. S. Orgelbranda S-ów, Warszawa, 1907 +Domena publiczna - Gabriela Zapolska, herbu Korwin, właśc. Maria Gabriela Korwin-Piotro, zm. 17 grudnia 1921 +1921 +xml +text +text +2007-11-10 +G +L +pol + + + diff --git a/books/Nie-Boska_komedia.xml b/books/Nie-Boska_komedia.xml new file mode 100755 index 000000000..94820e1ab --- /dev/null +++ b/books/Nie-Boska_komedia.xml @@ -0,0 +1,27 @@ + + + +Krasiński, Zygmunt +Nie-Boska komedia +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Dramat +Dramat romantyczny +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Nie-boska+komedia +http://www.polona.pl/dlibra/doccontent2?id=592 +Krasiński, Zygmunt (1812-1859), Nie-Boska komedia, Zakład Narodowy im. Ossolińskich, wyd. 8 zmien., Wrocław, 1965 +Domena publiczna - Zygmunt Krasiński zm. 1859 +1859 +xml +text +text +2007-11-10 +L +pol + + + diff --git a/books/Poeta.xml b/books/Poeta.xml new file mode 100755 index 000000000..28629f0cc --- /dev/null +++ b/books/Poeta.xml @@ -0,0 +1,28 @@ + + + +Leśmian, Bolesław +Poeta +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Młoda Polska +Dwudziestolecie międzywojenne +Liryka +Wiersz +Wiersz sylabotoniczny +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Poeta +Bolesław Leśmian (1877-1937), Napój cienisty, Wydawnictwo Mortkowicza, Warszawa, 1936 +Domena publiczna - Bolesław Leśmian zm. 1937 +1937 +xml +text +text +2008-01-11 +L +pol + + + diff --git a/books/Przedwiosnie.xml b/books/Przedwiosnie.xml new file mode 100755 index 000000000..961ed5740 --- /dev/null +++ b/books/Przedwiosnie.xml @@ -0,0 +1,28 @@ + + + +Żeromski, Stefan +Przedwiośnie +Sekuła, Aleksandra +Markiewicz, Henryk +Pigoń, Stanisław +Sobczyński, Mariusz +Fundacja Nowoczesna Polska +Dwudziestolecie międzywojenne +Epika +Powieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Przedwio%C5%9Bnie +Stefan Żeromski (1864-1925), Przedwiośnie, Czytelnik, Warszawa, 1976 +Domena publiczna - Stefan Żeromski zm. 1925 +1925 +xml +text +text +2008-04-10 +L +pol + + + diff --git a/books/Przydatek_do_Bajek_i_przypowiesci.xml b/books/Przydatek_do_Bajek_i_przypowiesci.xml new file mode 100755 index 000000000..7dd731363 --- /dev/null +++ b/books/Przydatek_do_Bajek_i_przypowiesci.xml @@ -0,0 +1,33 @@ + + + +Krasicki, Ignacy +Bajki i przypowieści (5) - przydatek +Bajki i przypowieści +Goliński, Zbigniew +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Bajka +Przypowieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3044&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Bajki, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, Kraków, 1975 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2007-11-29 +SP2 +G +L +pol + + + diff --git a/books/Przydatek_do_Bajek_nowych.xml b/books/Przydatek_do_Bajek_nowych.xml new file mode 100755 index 000000000..6db8b739a --- /dev/null +++ b/books/Przydatek_do_Bajek_nowych.xml @@ -0,0 +1,33 @@ + + + +Krasicki, Ignacy +Bajki nowe (5) - przydatek +Bajki nowe +Goliński, Zbigniew +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Bajka +Przypowieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3044&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Bajki, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, Kraków, 1975 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2007-11-29 +SP2 +G +L +pol + + + diff --git a/books/Romeo_i_Julia.xml b/books/Romeo_i_Julia.xml new file mode 100755 index 000000000..389ee86e5 --- /dev/null +++ b/books/Romeo_i_Julia.xml @@ -0,0 +1,31 @@ + + + +Shakespeare, William +Romeo i Julia +Paszkowski, Józef +Jabłkowska, Róża +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Renesans +Dramat +Dramat szekspirowski +Tragedia +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Romeo+i+Julia +http://www.polona.pl/Content/3719 +Shakespeare, William (1564-1616), Romeo i Julia, Państwowy Instytut Wydawniczy, wyd. 5, Warszawa, 1975 +Domena publiczna - tłumacz Józef Paszkowski zm. 1861 +1861 +xml +text +text +2007-08-31 +G +L +pol + + + diff --git a/books/Satyry_Cz1_Do_krola.xml b/books/Satyry_Cz1_Do_krola.xml new file mode 100755 index 000000000..d89e282c2 --- /dev/null +++ b/books/Satyry_Cz1_Do_krola.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (1) Do króla +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz1_Gracz.xml b/books/Satyry_Cz1_Gracz.xml new file mode 100755 index 000000000..d51e1fe0a --- /dev/null +++ b/books/Satyry_Cz1_Gracz.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (12) Gracz +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz1_Marnotrawstwo.xml b/books/Satyry_Cz1_Marnotrawstwo.xml new file mode 100755 index 000000000..8c428a406 --- /dev/null +++ b/books/Satyry_Cz1_Marnotrawstwo.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (5) Marnotrawstwo +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz1_Oszczednosc.xml b/books/Satyry_Cz1_Oszczednosc.xml new file mode 100755 index 000000000..23249c422 --- /dev/null +++ b/books/Satyry_Cz1_Oszczednosc.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (6) Oszczędność +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz1_Palinodia.xml b/books/Satyry_Cz1_Palinodia.xml new file mode 100755 index 000000000..50270d579 --- /dev/null +++ b/books/Satyry_Cz1_Palinodia.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (13) Palinodia +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz1_Pan_niewart_slugi.xml b/books/Satyry_Cz1_Pan_niewart_slugi.xml new file mode 100755 index 000000000..7a5e1986d --- /dev/null +++ b/books/Satyry_Cz1_Pan_niewart_slugi.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (11) Pan niewart sługi +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz1_Pijanstwo.xml b/books/Satyry_Cz1_Pijanstwo.xml new file mode 100755 index 000000000..5925ed5df --- /dev/null +++ b/books/Satyry_Cz1_Pijanstwo.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (7) Pijaństwo +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz1_Przestroga_mlodemu.xml b/books/Satyry_Cz1_Przestroga_mlodemu.xml new file mode 100755 index 000000000..ac9890b0e --- /dev/null +++ b/books/Satyry_Cz1_Przestroga_mlodemu.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (8) Przestroga młodemu +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz1_Swiat_zepsuty.xml b/books/Satyry_Cz1_Swiat_zepsuty.xml new file mode 100755 index 000000000..f66c350c1 --- /dev/null +++ b/books/Satyry_Cz1_Swiat_zepsuty.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (2) Świat zepsuty +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz1_Szczesliwosc_filutow.xml b/books/Satyry_Cz1_Szczesliwosc_filutow.xml new file mode 100755 index 000000000..7739e3b33 --- /dev/null +++ b/books/Satyry_Cz1_Szczesliwosc_filutow.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (4) Szczęśliwość filutów +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz1_Zlosc_ukryta_i_jawna.xml b/books/Satyry_Cz1_Zlosc_ukryta_i_jawna.xml new file mode 100755 index 000000000..dcafb927c --- /dev/null +++ b/books/Satyry_Cz1_Zlosc_ukryta_i_jawna.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (3) Złość ukryta i jawna +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz1_Zona_modna.xml b/books/Satyry_Cz1_Zona_modna.xml new file mode 100755 index 000000000..0330972ad --- /dev/null +++ b/books/Satyry_Cz1_Zona_modna.xml @@ -0,0 +1,28 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (9) Żona modna +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +G +L +pol + + + diff --git a/books/Satyry_Cz1_Zycie_dworskie.xml b/books/Satyry_Cz1_Zycie_dworskie.xml new file mode 100755 index 000000000..5e1bd84a1 --- /dev/null +++ b/books/Satyry_Cz1_Zycie_dworskie.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 1 - (10) Życie dworskie +Sekuła, Aleksandra +Hernas, Marcin +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz2_Czlowiek_i_zwierz.xml b/books/Satyry_Cz2_Czlowiek_i_zwierz.xml new file mode 100755 index 000000000..5847ef18b --- /dev/null +++ b/books/Satyry_Cz2_Czlowiek_i_zwierz.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 2 - (5) Człowiek i zwierz +Sekuła, Aleksandra +Sobczyński, Mariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz2_Klatki.xml b/books/Satyry_Cz2_Klatki.xml new file mode 100755 index 000000000..764587ebc --- /dev/null +++ b/books/Satyry_Cz2_Klatki.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 2 - (6) Klatki +Sekuła, Aleksandra +Sobczyński, Mariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz2_Malzenstwo.xml b/books/Satyry_Cz2_Malzenstwo.xml new file mode 100755 index 000000000..6f2e2aec6 --- /dev/null +++ b/books/Satyry_Cz2_Malzenstwo.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 2 - (8) Małżeństwo +Sekuła, Aleksandra +Sobczyński, Mariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz2_Medrek.xml b/books/Satyry_Cz2_Medrek.xml new file mode 100755 index 000000000..14344845d --- /dev/null +++ b/books/Satyry_Cz2_Medrek.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 2 - (7) Mędrek +Sekuła, Aleksandra +Sobczyński, Mariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz2_Pochwala_glupstwa.xml b/books/Satyry_Cz2_Pochwala_glupstwa.xml new file mode 100755 index 000000000..d6218996e --- /dev/null +++ b/books/Satyry_Cz2_Pochwala_glupstwa.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 2 - (3) Pochwała głupstwa +Sekuła, Aleksandra +Sobczyński, Mariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz2_Pochwala_wieku.xml b/books/Satyry_Cz2_Pochwala_wieku.xml new file mode 100755 index 000000000..16859dd00 --- /dev/null +++ b/books/Satyry_Cz2_Pochwala_wieku.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 2 - (2) Pochwała wieku +Sekuła, Aleksandra +Sobczyński, Mariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz2_Pochwaly_milczenia.xml b/books/Satyry_Cz2_Pochwaly_milczenia.xml new file mode 100755 index 000000000..0c52aebbd --- /dev/null +++ b/books/Satyry_Cz2_Pochwaly_milczenia.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 2 - (1) Pochwały milczenia +Sekuła, Aleksandra +Sobczyński, Mariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz2_Podroz.xml b/books/Satyry_Cz2_Podroz.xml new file mode 100755 index 000000000..4e0f3e546 --- /dev/null +++ b/books/Satyry_Cz2_Podroz.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 2 - (9) Podróż +Sekuła, Aleksandra +Sobczyński, Mariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Satyry_Cz2_Wzietosc.xml b/books/Satyry_Cz2_Wzietosc.xml new file mode 100755 index 000000000..aa8e9f712 --- /dev/null +++ b/books/Satyry_Cz2_Wzietosc.xml @@ -0,0 +1,27 @@ + + + +Krasicki, Ignacy +Satyry - Część 2 - (4) Wziętość +Sekuła, Aleksandra +Sobczyński, Mariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Satyra +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3761&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Satyry i listy, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, wyd. 1, Wrocław, 1958 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2008-02-12 +L +pol + + + diff --git a/books/Sonety_krymskie_00_Motto_i_dedykacja.xml b/books/Sonety_krymskie_00_Motto_i_dedykacja.xml new file mode 100755 index 000000000..574801343 --- /dev/null +++ b/books/Sonety_krymskie_00_Motto_i_dedykacja.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (00) Motto i dedykacja +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_01_Stepy_akermanskie.xml b/books/Sonety_krymskie_01_Stepy_akermanskie.xml new file mode 100755 index 000000000..0677af010 --- /dev/null +++ b/books/Sonety_krymskie_01_Stepy_akermanskie.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (01) Stepy akermańskie +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_02_Cisza_morska.xml b/books/Sonety_krymskie_02_Cisza_morska.xml new file mode 100755 index 000000000..6a9ceb7ee --- /dev/null +++ b/books/Sonety_krymskie_02_Cisza_morska.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (02) Cisza morska +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_03_Zegluga.xml b/books/Sonety_krymskie_03_Zegluga.xml new file mode 100755 index 000000000..aac2431c2 --- /dev/null +++ b/books/Sonety_krymskie_03_Zegluga.xml @@ -0,0 +1,29 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (03) Żegluga +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798 - 1855) Poezje, Tom 2, Wiersze z lat 1825 - 1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2, popr., druk. W. L. Anczyca, Kraków 1928 +OPIS STANU PRAWNEGO TEKSTU +1855 +xml +text +text +2008-01-29 +POZIOM NAUCZANIA +POZIOM NAUCZANIA +pol + + + diff --git a/books/Sonety_krymskie_04_Burza.xml b/books/Sonety_krymskie_04_Burza.xml new file mode 100755 index 000000000..26cb75802 --- /dev/null +++ b/books/Sonety_krymskie_04_Burza.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (04) Burza +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_05_Widok_gor_ze_stepow_Kozlowa.xml b/books/Sonety_krymskie_05_Widok_gor_ze_stepow_Kozlowa.xml new file mode 100755 index 000000000..a88b402f1 --- /dev/null +++ b/books/Sonety_krymskie_05_Widok_gor_ze_stepow_Kozlowa.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (05) Widok gór ze stepów Kozłowa +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_06_Bakczysaraj.xml b/books/Sonety_krymskie_06_Bakczysaraj.xml new file mode 100755 index 000000000..36e47160b --- /dev/null +++ b/books/Sonety_krymskie_06_Bakczysaraj.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (06) Bakczysaraj +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_07_Bakczysaraj_w_nocy.xml b/books/Sonety_krymskie_07_Bakczysaraj_w_nocy.xml new file mode 100755 index 000000000..204d4d6a5 --- /dev/null +++ b/books/Sonety_krymskie_07_Bakczysaraj_w_nocy.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (07) Bakczysaraj w nocy +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_08_Grob_Potockiej.xml b/books/Sonety_krymskie_08_Grob_Potockiej.xml new file mode 100755 index 000000000..70236a8dc --- /dev/null +++ b/books/Sonety_krymskie_08_Grob_Potockiej.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (08) Grób Potockiej +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_09_Mogily_haremu.xml b/books/Sonety_krymskie_09_Mogily_haremu.xml new file mode 100755 index 000000000..2549b7e88 --- /dev/null +++ b/books/Sonety_krymskie_09_Mogily_haremu.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (09) Mogiły haremu +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_10_Bajdary.xml b/books/Sonety_krymskie_10_Bajdary.xml new file mode 100755 index 000000000..70d573f4d --- /dev/null +++ b/books/Sonety_krymskie_10_Bajdary.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (10) Bajdary +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_11_Aluszta_w_dzien.xml b/books/Sonety_krymskie_11_Aluszta_w_dzien.xml new file mode 100755 index 000000000..600b678f0 --- /dev/null +++ b/books/Sonety_krymskie_11_Aluszta_w_dzien.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (11) Ałuszta w dzień +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_12_Aluszta_w_nocy.xml b/books/Sonety_krymskie_12_Aluszta_w_nocy.xml new file mode 100755 index 000000000..3b1cad46f --- /dev/null +++ b/books/Sonety_krymskie_12_Aluszta_w_nocy.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (12) Ałuszta w nocy +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_13_Czatyrdah.xml b/books/Sonety_krymskie_13_Czatyrdah.xml new file mode 100755 index 000000000..7867aa31f --- /dev/null +++ b/books/Sonety_krymskie_13_Czatyrdah.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (13) Czatyrdah +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_14_Pielgrzym.xml b/books/Sonety_krymskie_14_Pielgrzym.xml new file mode 100755 index 000000000..509f7c27b --- /dev/null +++ b/books/Sonety_krymskie_14_Pielgrzym.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (14) Pielgrzym +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_15_Droga_nad_przepascia_w_Czufut_Kale.xml b/books/Sonety_krymskie_15_Droga_nad_przepascia_w_Czufut_Kale.xml new file mode 100755 index 000000000..5fc3398b5 --- /dev/null +++ b/books/Sonety_krymskie_15_Droga_nad_przepascia_w_Czufut_Kale.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (15) Droga nad przepaścią w Czufut-Kale +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_16_Gora_Kikneis.xml b/books/Sonety_krymskie_16_Gora_Kikneis.xml new file mode 100755 index 000000000..35ec259aa --- /dev/null +++ b/books/Sonety_krymskie_16_Gora_Kikneis.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (16) Góra Kikineis +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_17_Ruiny_zamku_w_Balaklawie.xml b/books/Sonety_krymskie_17_Ruiny_zamku_w_Balaklawie.xml new file mode 100755 index 000000000..3011d249b --- /dev/null +++ b/books/Sonety_krymskie_17_Ruiny_zamku_w_Balaklawie.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (17) Ruiny zamku w Bałakławie +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Sonety_krymskie_18_Ajudah.xml b/books/Sonety_krymskie_18_Ajudah.xml new file mode 100755 index 000000000..44c22363e --- /dev/null +++ b/books/Sonety_krymskie_18_Ajudah.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Sonety krymskie - (18) Ajudah +Sonety krymskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=2223&from=editionindex&dirids=4 +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), wstęp i układ Józefa Kallenbacha, objaśn. zaopatrzył Jan Bystrzycki, Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., druk. W. L. Anczyca, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2008-01-29 +L +pol + + + diff --git a/books/Swidryga_i_Midryga.xml b/books/Swidryga_i_Midryga.xml new file mode 100755 index 000000000..020aa1baf --- /dev/null +++ b/books/Swidryga_i_Midryga.xml @@ -0,0 +1,29 @@ + + + +Leśmian, Bolesław +Świdryga i Midryga +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Młoda Polska +Dwudziestolecie międzywojenne +Liryka +Wiersz +Wiersz sylabotoniczny +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/%C5%9Awidryga+i+Midryga +http://www.polona.pl/dlibra/doccontent2?id=7336&from=&from=generalsearch&dirids=1&lang=pl +Bolesław Leśmian (1877-1937), Łąka, Wydawnictwo Mortkowicza, Warszawa, 1920 +Domena publiczna - Bolesław Leśmian zm. 1937 +1937 +xml +text +text +2008-01-11 +L +pol + + + diff --git a/books/Urszula_Kochanowska.xml b/books/Urszula_Kochanowska.xml new file mode 100755 index 000000000..fa8e0ce6a --- /dev/null +++ b/books/Urszula_Kochanowska.xml @@ -0,0 +1,28 @@ + + + +Leśmian, Bolesław +Urszula Kochanowska +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Młoda Polska +Dwudziestolecie międzywojenne +Liryka +Wiersz +Wiersz sylabotoniczny +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Urszula+Kochanowska +Bolesław Leśmian (1877-1937), Napój cienisty, Wydawnictwo Mortkowicza, Warszawa, 1936 +Domena publiczna - Bolesław Leśmian zm. 1937 +1937 +xml +text +text +2008-01-11 +G +pol + + + diff --git a/books/W_malinowym_chrusniaku.xml b/books/W_malinowym_chrusniaku.xml new file mode 100755 index 000000000..df0851c51 --- /dev/null +++ b/books/W_malinowym_chrusniaku.xml @@ -0,0 +1,30 @@ + + + +Leśmian, Bolesław +W malinowym chruśniaku +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Młoda Polska +Dwudziestolecie międzywojenne +Liryka +Wiersz +Wiersz sylabotoniczny +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/W+malinowym+chru%C5%9Bniaku +http://www.polona.pl/dlibra/doccontent2?id=7336&from=&from=generalsearch&dirids=1&lang=pl +Bolesław Leśmian (1877-1937), Łąka, Wydawnictwo Mortkowicza, Warszawa, 1920 +Domena publiczna - Bolesław Leśmian zm. 1937 +1937 +xml +text +text +2008-01-11 +G +L +pol + + + diff --git a/books/Wstep_do_Bajek_i_przypowiesci.xml b/books/Wstep_do_Bajek_i_przypowiesci.xml new file mode 100755 index 000000000..f254a71a7 --- /dev/null +++ b/books/Wstep_do_Bajek_i_przypowiesci.xml @@ -0,0 +1,33 @@ + + + +Krasicki, Ignacy +Bajki i przypowieści (0) - Wstęp +Bajki i przypowieści +Goliński, Zbigniew +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Oświecenie +Epika +Bajka +Przypowieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=3044&from=&from=generalsearch&dirids=1&lang=pl +Krasicki, Ignacy (1735-1801), Bajki, oprac. Zbigniew Goliński, Zakład Narodowy im. Ossolińskich, Kraków, 1975 +Domena publiczna - Ignacy Krasicki zm. 1801 +1801 +xml +text +text +2007-11-29 +SP1 +G +L +pol + + + diff --git a/books/andersen_brzydkie_kaczatko.xml b/books/andersen_brzydkie_kaczatko.xml new file mode 100755 index 000000000..8e1515856 --- /dev/null +++ b/books/andersen_brzydkie_kaczatko.xml @@ -0,0 +1,27 @@ + + + +Andersen, Hans Christian +Brzydkie kaczątko +Niewiadomska, Cecylia +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Romantyzm +Epika +Baśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Brzydkie+kacz%C4%85tko +http://www.polona.pl/dlibra/doccontent2?id=3563&dirids=4 +Andersen, Hans Christian (1805-1875), Baśnie, Gebethner i Wolff, wyd. 7, Kraków, 1925 +Domena publiczna - Cecylia Niewiadomska zm. 1925 +1925 +xml +text +text +2007-08-14 +SP1 +pol + + + diff --git a/books/andersen_krolowa_sniegu.xml b/books/andersen_krolowa_sniegu.xml new file mode 100755 index 000000000..28f5a6ec4 --- /dev/null +++ b/books/andersen_krolowa_sniegu.xml @@ -0,0 +1,27 @@ + + + +Andersen, Hans Christian +Królowa śniegu +Niewiadomska, Cecylia +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Romantyzm +Epika +Baśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Kr%C3%B3lowa+%C5%9Bniegu +http://www.polona.pl/dlibra/doccontent2?id=3563&dirids=4 +Andersen, Hans Christian (1805-1875), Baśnie, Gebethner i Wolff, wyd. 7, Kraków, 1925 +Domena publiczna - Cecylia Niewiadomska zm. 1925 +1925 +xml +text +text +2007-08-29 +SP1 +pol + + + diff --git a/books/asnyk_daremne_zale.xml b/books/asnyk_daremne_zale.xml new file mode 100755 index 000000000..2037e7f05 --- /dev/null +++ b/books/asnyk_daremne_zale.xml @@ -0,0 +1,27 @@ + + + +Asnyk, Adam +Daremne żale +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Pozytywizm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Daremne+%C5%BCale +http://www.polona.pl/Content/5164 +(Asnyk, Adam) El...y (1838-1897), Poezye, t. 3, Gebethner i Wolff, wyd. nowe poprzedzone słowem wstępnym St. Krzemińskiego, Warszawa, 1898 +Domena publiczna - Adam Asnyk zm. 1897 +1897 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/asnyk_miedzy_nami_nic_nie_bylo.xml b/books/asnyk_miedzy_nami_nic_nie_bylo.xml new file mode 100755 index 000000000..374fb9e24 --- /dev/null +++ b/books/asnyk_miedzy_nami_nic_nie_bylo.xml @@ -0,0 +1,27 @@ + + + +Asnyk, Adam +Między nami nic nie było +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Pozytywizm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Mi%C4%99dzy+nami+nic+nie+by%C5%82o +http://www.polona.pl/Content/5164 +(Asnyk, Adam) El...y (1838-1897), Poezye, t. 3, Gebethner i Wolff, wyd. nowe poprzedzone słowem wstępnym St. Krzemińskiego, Warszawa, 1898 +Domena publiczna - Adam Asnyk zm. 1897 +1897 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/asnyk_zaczarowana_krolewna.xml b/books/asnyk_zaczarowana_krolewna.xml new file mode 100755 index 000000000..08c6cdfd1 --- /dev/null +++ b/books/asnyk_zaczarowana_krolewna.xml @@ -0,0 +1,27 @@ + + + +Asnyk, Adam +Zaczarowana królewna +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Pozytywizm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Zaczarowana+kr%C3%B3lewna +http://www.polona.pl/Content/5164 +(Asnyk, Adam) El...y (1838-1897), Poezye, t. 3, Gebethner i Wolff, wyd. nowe poprzedzone słowem wstępnym St. Krzemińskiego, Warszawa, 1898 +Domena publiczna - Adam Asnyk zm. 1897 +1897 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/bogurodzica.xml b/books/bogurodzica.xml new file mode 100755 index 000000000..e9a6c1da6 --- /dev/null +++ b/books/bogurodzica.xml @@ -0,0 +1,30 @@ + + + +Anonim +Bogurodzica +Sekuła, Aleksandra +Feicht, Hieronim +Woronczak, Jerzy +Sutkowska, Olga +Fundacja Nowoczesna Polska +Średniowiecze +Liryka +Hymn +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Bogurodzica +http://www.polona.pl/Content/3073 +Bogurodzica, Biblioteka Pisarzów Polskich, Seria A, Liryka Średniowieczna, t. 1, Zakład Narodowy im. Ossolińskich. Wydawnictwo PAN, Wrocław, 1962 +Domena publiczna - Bogurodzica powstała we wczesnym średniowieczu, chociaż dokładna data jest nieznana. Przeważają hipotezy badaczy wskazujące na XI lub XII w. jako czas jej powstania. Pierwszy zapis tekstu jest późny, z początku XV w. (ok. 1407); wcześniejsze zapisy mogły zaginąć, ale też tekst mógł krążyć w obiegu ustnym. +1407 +xml +text +text +2007-09-06 +G +L +pol + + + diff --git a/books/fredro_zemsta.xml b/books/fredro_zemsta.xml new file mode 100755 index 000000000..05fa6c64c --- /dev/null +++ b/books/fredro_zemsta.xml @@ -0,0 +1,28 @@ + + + +Fredro, Aleksander +Zemsta +Maciejewski, Janusz +Sekuła, Aleksandra +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Romantyzm +Dramat +Komedia +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/3043 +Fredro, Aleksander (1793-1876), Zemsta, Wydawnictwo Łódź, wyd. 6, Łódź, 1975 +Aleksander Fredro zm. 1876 +1876 +xml +text +text +2007-08-30 +G +pol + + + diff --git a/books/kochanowski_odprawa_poslow_greckich.xml b/books/kochanowski_odprawa_poslow_greckich.xml new file mode 100755 index 000000000..1c89148e4 --- /dev/null +++ b/books/kochanowski_odprawa_poslow_greckich.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Odprawa posłów greckich +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Dramat +Tragedia +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Odprawa+pos%C5%82%C3%B3w+greckich +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_piesn1_I.xml b/books/kochanowski_piesn1_I.xml new file mode 100755 index 000000000..c126f354d --- /dev/null +++ b/books/kochanowski_piesn1_I.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń I (1) Byś wszystko złoto posiadł +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_II.xml b/books/kochanowski_piesn1_II.xml new file mode 100755 index 000000000..b6b47f95f --- /dev/null +++ b/books/kochanowski_piesn1_II.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Pieśń II (1) Serce roście patrząc na te czasy +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +G +L +pol + + + diff --git a/books/kochanowski_piesn1_III.xml b/books/kochanowski_piesn1_III.xml new file mode 100755 index 000000000..50aac6beb --- /dev/null +++ b/books/kochanowski_piesn1_III.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń III (1) Dzbanie mój pisany +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_IV.xml b/books/kochanowski_piesn1_IV.xml new file mode 100755 index 000000000..9fb0bd41b --- /dev/null +++ b/books/kochanowski_piesn1_IV.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń IV (1) Złota to strzała +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_IX.xml b/books/kochanowski_piesn1_IX.xml new file mode 100755 index 000000000..84678eb1d --- /dev/null +++ b/books/kochanowski_piesn1_IX.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń IX (1) Chcemy sobie być radzi +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_V.xml b/books/kochanowski_piesn1_V.xml new file mode 100755 index 000000000..e33b20f32 --- /dev/null +++ b/books/kochanowski_piesn1_V.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń V (1) Kto ma swego chleba +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_VI.xml b/books/kochanowski_piesn1_VI.xml new file mode 100755 index 000000000..5562d2a0b --- /dev/null +++ b/books/kochanowski_piesn1_VI.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń VI (1) Acz mię twa droga +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_VII.xml b/books/kochanowski_piesn1_VII.xml new file mode 100755 index 000000000..a2fac329a --- /dev/null +++ b/books/kochanowski_piesn1_VII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń VII (1) Trudna rada w tej mierze +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_VIII.xml b/books/kochanowski_piesn1_VIII.xml new file mode 100755 index 000000000..19345f2f4 --- /dev/null +++ b/books/kochanowski_piesn1_VIII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń VIII (1) Gdzieśkolwiek jest +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_X.xml b/books/kochanowski_piesn1_X.xml new file mode 100755 index 000000000..4e4db9693 --- /dev/null +++ b/books/kochanowski_piesn1_X.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń X (1) Kto mi dał skrzydła +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XI.xml b/books/kochanowski_piesn1_XI.xml new file mode 100755 index 000000000..56c1a8df5 --- /dev/null +++ b/books/kochanowski_piesn1_XI.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XI (1) Stronisz przede mną +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XII.xml b/books/kochanowski_piesn1_XII.xml new file mode 100755 index 000000000..3708bc85a --- /dev/null +++ b/books/kochanowski_piesn1_XII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XII (1) Muszę wyznać +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XIII.xml b/books/kochanowski_piesn1_XIII.xml new file mode 100755 index 000000000..7555e3117 --- /dev/null +++ b/books/kochanowski_piesn1_XIII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XIII (1) 0 piękna nocy nad zwyczaj +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XIV.xml b/books/kochanowski_piesn1_XIV.xml new file mode 100755 index 000000000..040c2f425 --- /dev/null +++ b/books/kochanowski_piesn1_XIV.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XIV (1) Patrzaj jako śnieg +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XIX.xml b/books/kochanowski_piesn1_XIX.xml new file mode 100755 index 000000000..02ef74cfc --- /dev/null +++ b/books/kochanowski_piesn1_XIX.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XIX (1) Żal mi cię +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XV.xml b/books/kochanowski_piesn1_XV.xml new file mode 100755 index 000000000..1fdcb1df3 --- /dev/null +++ b/books/kochanowski_piesn1_XV.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XV (1) Nie za staraniem +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XVI.xml b/books/kochanowski_piesn1_XVI.xml new file mode 100755 index 000000000..fb3047669 --- /dev/null +++ b/books/kochanowski_piesn1_XVI.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XVI (1) Królom moc na poddane i zwierzchność +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XVII.xml b/books/kochanowski_piesn1_XVII.xml new file mode 100755 index 000000000..4fd13a427 --- /dev/null +++ b/books/kochanowski_piesn1_XVII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XVII (1) Słońce już padło +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XVIII.xml b/books/kochanowski_piesn1_XVIII.xml new file mode 100755 index 000000000..909eb5ea9 --- /dev/null +++ b/books/kochanowski_piesn1_XVIII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XVIII (1) Czołem za cześć +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XX.xml b/books/kochanowski_piesn1_XX.xml new file mode 100755 index 000000000..020186d21 --- /dev/null +++ b/books/kochanowski_piesn1_XX.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XX (1) Miło szaleć +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XXI.xml b/books/kochanowski_piesn1_XXI.xml new file mode 100755 index 000000000..a9e05147a --- /dev/null +++ b/books/kochanowski_piesn1_XXI.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XXI (1) Ty spisz +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XXII.xml b/books/kochanowski_piesn1_XXII.xml new file mode 100755 index 000000000..e1b633d8e --- /dev/null +++ b/books/kochanowski_piesn1_XXII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XXII (1) Rozumie mój +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XXIII.xml b/books/kochanowski_piesn1_XXIII.xml new file mode 100755 index 000000000..b7a8d18e8 --- /dev/null +++ b/books/kochanowski_piesn1_XXIII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XXIII (1) Nieźle czasem zamilczeć +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XXIV.xml b/books/kochanowski_piesn1_XXIV.xml new file mode 100755 index 000000000..3a538b180 --- /dev/null +++ b/books/kochanowski_piesn1_XXIV.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XXIV (1) Zegar słyszę wybija +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn1_XXV.xml b/books/kochanowski_piesn1_XXV.xml new file mode 100755 index 000000000..9cdc2dc1d --- /dev/null +++ b/books/kochanowski_piesn1_XXV.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XXV (1) Użałuj się +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_I.xml b/books/kochanowski_piesn2_I.xml new file mode 100755 index 000000000..77f80ec13 --- /dev/null +++ b/books/kochanowski_piesn2_I.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń I (2) Przeciwne chmury +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_II.xml b/books/kochanowski_piesn2_II.xml new file mode 100755 index 000000000..b266eba01 --- /dev/null +++ b/books/kochanowski_piesn2_II.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń II (2) Nie dbam aby zimne skały +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_III.xml b/books/kochanowski_piesn2_III.xml new file mode 100755 index 000000000..7ef61e14f --- /dev/null +++ b/books/kochanowski_piesn2_III.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń III (2) Nie wierz Fortunie +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_IV.xml b/books/kochanowski_piesn2_IV.xml new file mode 100755 index 000000000..49690c629 --- /dev/null +++ b/books/kochanowski_piesn2_IV.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń IV (2) W twardej kamiennej wieży +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_IX.xml b/books/kochanowski_piesn2_IX.xml new file mode 100755 index 000000000..db94ce424 --- /dev/null +++ b/books/kochanowski_piesn2_IX.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Pieśń IX (2) Nie porzucaj nadzieje +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +G +L +pol + + + diff --git a/books/kochanowski_piesn2_V.xml b/books/kochanowski_piesn2_V.xml new file mode 100755 index 000000000..d9b09d711 --- /dev/null +++ b/books/kochanowski_piesn2_V.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń V (2) Wieczna sromota +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_VI.xml b/books/kochanowski_piesn2_VI.xml new file mode 100755 index 000000000..f317b94ad --- /dev/null +++ b/books/kochanowski_piesn2_VI.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń VI (2) Królewno lutnie złotej +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_VII.xml b/books/kochanowski_piesn2_VII.xml new file mode 100755 index 000000000..fd0254473 --- /dev/null +++ b/books/kochanowski_piesn2_VII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń VII (2) Słońce pali +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_VIII.xml b/books/kochanowski_piesn2_VIII.xml new file mode 100755 index 000000000..ab44182a3 --- /dev/null +++ b/books/kochanowski_piesn2_VIII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń VIII (2) Nie frasuj sobie +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_X.xml b/books/kochanowski_piesn2_X.xml new file mode 100755 index 000000000..f4852e9be --- /dev/null +++ b/books/kochanowski_piesn2_X.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń X (2) Może kto ręką sławy dostać w boju +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XI.xml b/books/kochanowski_piesn2_XI.xml new file mode 100755 index 000000000..1bedb3af0 --- /dev/null +++ b/books/kochanowski_piesn2_XI.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XI (2) Stateczny umysł +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XII.xml b/books/kochanowski_piesn2_XII.xml new file mode 100755 index 000000000..5bca7ee57 --- /dev/null +++ b/books/kochanowski_piesn2_XII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XII (2) Nie masz i po drugi raz +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XIII.xml b/books/kochanowski_piesn2_XIII.xml new file mode 100755 index 000000000..b3750e2f3 --- /dev/null +++ b/books/kochanowski_piesn2_XIII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XIII (2) Panu dzięki oddawajmy +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XIV.xml b/books/kochanowski_piesn2_XIV.xml new file mode 100755 index 000000000..56684a391 --- /dev/null +++ b/books/kochanowski_piesn2_XIV.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XIV (2) Wy którzy pospolitą rzeczą władacie +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XIX.xml b/books/kochanowski_piesn2_XIX.xml new file mode 100755 index 000000000..8424e7804 --- /dev/null +++ b/books/kochanowski_piesn2_XIX.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XIX (2) Jest kto co by wzgardziwszy +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XV.xml b/books/kochanowski_piesn2_XV.xml new file mode 100755 index 000000000..15d6e7f12 --- /dev/null +++ b/books/kochanowski_piesn2_XV.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XV (2) Nie zawżdy Apollo +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XVI.xml b/books/kochanowski_piesn2_XVI.xml new file mode 100755 index 000000000..56a77d81c --- /dev/null +++ b/books/kochanowski_piesn2_XVI.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XVI (2) Nic po tych zbytnich potrawach +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XVII.xml b/books/kochanowski_piesn2_XVII.xml new file mode 100755 index 000000000..72a9ba86c --- /dev/null +++ b/books/kochanowski_piesn2_XVII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XVII (2) Niegodzien tego ten świat zawikłany +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XVIII.xml b/books/kochanowski_piesn2_XVIII.xml new file mode 100755 index 000000000..cfaec1ee7 --- /dev/null +++ b/books/kochanowski_piesn2_XVIII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XVIII (2) Ucieszna lutni +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XX.xml b/books/kochanowski_piesn2_XX.xml new file mode 100755 index 000000000..11b83d4f7 --- /dev/null +++ b/books/kochanowski_piesn2_XX.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XX (2) Jaką rozumiesz zazdrość zjednałaś sobie +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XXI.xml b/books/kochanowski_piesn2_XXI.xml new file mode 100755 index 000000000..f7a66f251 --- /dev/null +++ b/books/kochanowski_piesn2_XXI.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XXI (2) Srogie łańcuchy na swym sercu czuję +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XXII.xml b/books/kochanowski_piesn2_XXII.xml new file mode 100755 index 000000000..a94835be3 --- /dev/null +++ b/books/kochanowski_piesn2_XXII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XXII (2) Proszę jeśli się z tobą co śpiewało +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XXIII.xml b/books/kochanowski_piesn2_XXIII.xml new file mode 100755 index 000000000..7ae251eec --- /dev/null +++ b/books/kochanowski_piesn2_XXIII.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XXIII (2) Nie zawżdy piękna Zofija +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XXIV.xml b/books/kochanowski_piesn2_XXIV.xml new file mode 100755 index 000000000..3c8521864 --- /dev/null +++ b/books/kochanowski_piesn2_XXIV.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśń XXIV (2) Niezwykłym i nie leda piórem opatrzony +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_piesn2_XXV.xml b/books/kochanowski_piesn2_XXV.xml new file mode 100755 index 000000000..1ccc85e3a --- /dev/null +++ b/books/kochanowski_piesn2_XXV.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Pieśń XXV (2) Czego chcesz od nas Panie +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +G +L +pol + + + diff --git a/books/kochanowski_piesn_swietojanska.xml b/books/kochanowski_piesn_swietojanska.xml new file mode 100755 index 000000000..563ef8fbc --- /dev/null +++ b/books/kochanowski_piesn_swietojanska.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Pieśń świętojańska o sobótce +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Pie%C5%9B%C5%84+%C5%9Bwi%C4%99toja%C5%84ska+o+sob%C3%B3tce +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +G +L +pol + + + diff --git a/books/kochanowski_piesni_dedykacja.xml b/books/kochanowski_piesni_dedykacja.xml new file mode 100755 index 000000000..1f48e1a93 --- /dev/null +++ b/books/kochanowski_piesni_dedykacja.xml @@ -0,0 +1,29 @@ + + + +Kochanowski, Jan +Pieśni - Dedykacja +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Pieśń +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Pie%C5%9Bni+-+Dedykacja +http://www.polona.pl/Content/1499 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 1, oprac. Julian Krzyżanowski, wyd. 8, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/kochanowski_tren_1.xml b/books/kochanowski_tren_1.xml new file mode 100755 index 000000000..2e684e157 --- /dev/null +++ b/books/kochanowski_tren_1.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren I (Wszytki płacze wszytki łzy) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_10.xml b/books/kochanowski_tren_10.xml new file mode 100755 index 000000000..84dd50885 --- /dev/null +++ b/books/kochanowski_tren_10.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren X (Orszulo moja wdzięczna) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_11.xml b/books/kochanowski_tren_11.xml new file mode 100755 index 000000000..f46f1806a --- /dev/null +++ b/books/kochanowski_tren_11.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren XI (Fraszka cnota!) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_12.xml b/books/kochanowski_tren_12.xml new file mode 100755 index 000000000..d411b59e6 --- /dev/null +++ b/books/kochanowski_tren_12.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren XII (Żaden ojciec podobno barziej nie miłował) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_13.xml b/books/kochanowski_tren_13.xml new file mode 100755 index 000000000..f446d0334 --- /dev/null +++ b/books/kochanowski_tren_13.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren XIII (Moja wdzięczna Orszulo) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_14.xml b/books/kochanowski_tren_14.xml new file mode 100755 index 000000000..7f6d8172b --- /dev/null +++ b/books/kochanowski_tren_14.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren XIV (Gdzie te wrota nieszczęsne) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_15.xml b/books/kochanowski_tren_15.xml new file mode 100755 index 000000000..0992a05a3 --- /dev/null +++ b/books/kochanowski_tren_15.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren XV (Erato złotowłosa i ty) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_16.xml b/books/kochanowski_tren_16.xml new file mode 100755 index 000000000..1ff10b152 --- /dev/null +++ b/books/kochanowski_tren_16.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren XVI (Nieszczęściu k'woli) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_17.xml b/books/kochanowski_tren_17.xml new file mode 100755 index 000000000..c6810e8d8 --- /dev/null +++ b/books/kochanowski_tren_17.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren XVII (Pańska ręka mię dotknęła) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_18.xml b/books/kochanowski_tren_18.xml new file mode 100755 index 000000000..4ef6b0f33 --- /dev/null +++ b/books/kochanowski_tren_18.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren VIII (My nieposłuszne Panie dzieci Twoje) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_19_albo_sen.xml b/books/kochanowski_tren_19_albo_sen.xml new file mode 100755 index 000000000..19a1b9459 --- /dev/null +++ b/books/kochanowski_tren_19_albo_sen.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren XIX albo Sen +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_2.xml b/books/kochanowski_tren_2.xml new file mode 100755 index 000000000..9bed641ee --- /dev/null +++ b/books/kochanowski_tren_2.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren II (Jeślim kiedy nad dziećmi) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_3.xml b/books/kochanowski_tren_3.xml new file mode 100755 index 000000000..61e884fef --- /dev/null +++ b/books/kochanowski_tren_3.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren III (Wzgardziłaś mną dziedziczko) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_4.xml b/books/kochanowski_tren_4.xml new file mode 100755 index 000000000..eacd8bd35 --- /dev/null +++ b/books/kochanowski_tren_4.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren IV (Zgwałciłaś niepobożna Śmierci) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_5.xml b/books/kochanowski_tren_5.xml new file mode 100755 index 000000000..0720f6e46 --- /dev/null +++ b/books/kochanowski_tren_5.xml @@ -0,0 +1,31 @@ + + + +Kochanowski, Jan +Tren V (Jako oliwka mała) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +G +L +pol + + + diff --git a/books/kochanowski_tren_6.xml b/books/kochanowski_tren_6.xml new file mode 100755 index 000000000..7ab9878eb --- /dev/null +++ b/books/kochanowski_tren_6.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren VI (Ucieszna moja śpiewaczko!) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_7.xml b/books/kochanowski_tren_7.xml new file mode 100755 index 000000000..ab67cc85d --- /dev/null +++ b/books/kochanowski_tren_7.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren VII (Nieszczęsne ochędóstwo) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_tren_8.xml b/books/kochanowski_tren_8.xml new file mode 100755 index 000000000..e186cbcd7 --- /dev/null +++ b/books/kochanowski_tren_8.xml @@ -0,0 +1,31 @@ + + + +Kochanowski, Jan +Tren VIII (Wielkieś mi uczyniła pustki) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +G +L +pol + + + diff --git a/books/kochanowski_tren_9.xml b/books/kochanowski_tren_9.xml new file mode 100755 index 000000000..9c5759caa --- /dev/null +++ b/books/kochanowski_tren_9.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Tren IX (Kupić by cię Mądrości) +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_treny_epitafium_hannie_kochanowskiej.xml b/books/kochanowski_treny_epitafium_hannie_kochanowskiej.xml new file mode 100755 index 000000000..b42c1e4f8 --- /dev/null +++ b/books/kochanowski_treny_epitafium_hannie_kochanowskiej.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Treny - Epitafium +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Treny+-+Epitafium +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/kochanowski_treny_motto_i_dedykacja.xml b/books/kochanowski_treny_motto_i_dedykacja.xml new file mode 100755 index 000000000..98b9dc2ce --- /dev/null +++ b/books/kochanowski_treny_motto_i_dedykacja.xml @@ -0,0 +1,30 @@ + + + +Kochanowski, Jan +Treny - Dedykacja +Treny +Sekuła, Aleksandra +Krzyżanowski, Julian +Otwinowska, Barbara +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Renesans +Liryka +Tren +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Treny+-+Dedykacja +http://www.polona.pl/Content/1501 +Kochanowski, Jan (1530-1584), Dzieła polskie, tom 2, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-08-30 +L +pol + + + diff --git a/books/konopnicka_nasza_szkapa.xml b/books/konopnicka_nasza_szkapa.xml new file mode 100755 index 000000000..fb8026e04 --- /dev/null +++ b/books/konopnicka_nasza_szkapa.xml @@ -0,0 +1,28 @@ + + + +Konopnicka, Maria +Nasza szkapa +Sekuła, Aleksandra +Sutkowska, Olga +Jurewicz, Kamil +Fundacja Nowoczesna Polska +Pozytywizm +Epika +Nowela +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Nasza+szkapa +http://www.polona.pl/Content/6012 +Maria Konopnicka, Nasza szkapa, Gebethner i Wolf, wyd. 3, Warszawa, 1913 +Domena publiczna - Maria Konopnicka zm. 1910 +1910 +xml +text +text +2008-06-10 +SP2 +pol + + + diff --git a/books/mickiewicz_do_m.xml b/books/mickiewicz_do_m.xml new file mode 100755 index 000000000..633bb5445 --- /dev/null +++ b/books/mickiewicz_do_m.xml @@ -0,0 +1,29 @@ + + + +Mickiewicz, Adam +Do M*** +Sekuła, Aleksandra +Kallenbach, Józef +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Do+M%2A%2A%2A +http://www.polona.pl/Content/2222 +Mickiewicz, Adam (1798-1855), Poezje, tom 1 (Wiersze młodzieńcze - Ballady i romanse - Wiersze do r. 1824), Krakowska Spółdzielnia Wydawnicza, wyd. 2 zwiększone, Kraków, 1922 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-09-06 +G +L +pol + + + diff --git a/books/mickiewicz_lilije.xml b/books/mickiewicz_lilije.xml new file mode 100755 index 000000000..1fea8a6e6 --- /dev/null +++ b/books/mickiewicz_lilije.xml @@ -0,0 +1,31 @@ + + + +Mickiewicz, Adam +Lilie +Ballady i romanse +Sekuła, Aleksandra +Kallenbach, Józef +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Ballada +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Lilie +http://www.polona.pl/Content/2222 +Mickiewicz, Adam (1798-1855), Poezje, tom 1 (Wiersze młodzieńcze - Ballady i romanse - Wiersze do r. 1824), Krakowska Spółdzielnia Wydawnicza, wyd. 2 zwiększone, Kraków, 1922 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-09-06 +SP2 +G +L +pol + + + diff --git a/books/mickiewicz_oda_do_mlodosci.xml b/books/mickiewicz_oda_do_mlodosci.xml new file mode 100755 index 000000000..cec6e5a6c --- /dev/null +++ b/books/mickiewicz_oda_do_mlodosci.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Oda do młodości +Sekuła, Aleksandra +Pigoń, Stanisław +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Oda +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Oda+do+m%C5%82odo%C5%9Bci +http://www.polona.pl/Content/2624 +Mickiewicz, Adam (1798-1855), Poezje, tom 1, Gubrynowicz, Lwów, 1929 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/mickiewicz_pani_twardowska.xml b/books/mickiewicz_pani_twardowska.xml new file mode 100755 index 000000000..ebb9eca05 --- /dev/null +++ b/books/mickiewicz_pani_twardowska.xml @@ -0,0 +1,29 @@ + + + +Mickiewicz, Adam +Pani Twardowska +Ballady i romanse +Sekuła, Aleksandra +Kallenbach, Józef +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Ballada +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Pani+Twardowska +http://www.polona.pl/Content/2222 +Mickiewicz, Adam (1798-1855), Poezje, tom 1 (Wiersze młodzieńcze - Ballady i romanse - Wiersze do r. 1824), Krakowska Spółdzielnia Wydawnicza, wyd. 2 zwiększone, Kraków, 1922 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-09-06 +SP2 +pol + + + diff --git a/books/mickiewicz_powrot_taty.xml b/books/mickiewicz_powrot_taty.xml new file mode 100755 index 000000000..d6e4ff581 --- /dev/null +++ b/books/mickiewicz_powrot_taty.xml @@ -0,0 +1,29 @@ + + + +Mickiewicz, Adam +Powrót taty +Ballady i romanse +Sekuła, Aleksandra +Kallenbach, Józef +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Ballada +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Powr%C3%B3t+taty +http://www.polona.pl/Content/2222 +Mickiewicz, Adam (1798-1855), Poezje, tom 1 (Wiersze młodzieńcze - Ballady i romanse - Wiersze do r. 1824), Krakowska Spółdzielnia Wydawnicza, wyd. 2 zwiększone, Kraków, 1922 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-09-06 +SP2 +pol + + + diff --git a/books/mickiewicz_reduta_ordona.xml b/books/mickiewicz_reduta_ordona.xml new file mode 100755 index 000000000..01f832dc4 --- /dev/null +++ b/books/mickiewicz_reduta_ordona.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Reduta Ordona +Sekuła, Aleksandra +Bystrzycki, Jan +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Reduta+Ordona +http://www.polona.pl/dlibra/doccontent2?id=2223&from=&from=generalsearch&dirids=1&lang=pl +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., W. L. Anczyc, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-12-20 +G +pol + + + diff --git a/books/mickiewicz_rekawiczka.xml b/books/mickiewicz_rekawiczka.xml new file mode 100755 index 000000000..53d0e1817 --- /dev/null +++ b/books/mickiewicz_rekawiczka.xml @@ -0,0 +1,31 @@ + + + +Mickiewicz, Adam +Rękawiczka +Ballady i romanse +Sekuła, Aleksandra +Kallenbach, Józef +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Ballada +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/R%C4%99kawiczka +http://www.polona.pl/Content/2222 +Mickiewicz, Adam (1798-1855), Poezje, tom 1 (Wiersze młodzieńcze - Ballady i romanse - Wiersze do r. 1824), Krakowska Spółdzielnia Wydawnicza, wyd. 2 zwiększone, Kraków, 1922 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-09-06 +SP2 +G +L +pol + + + diff --git a/books/mickiewicz_romantycznosc.xml b/books/mickiewicz_romantycznosc.xml new file mode 100755 index 000000000..a24c7427a --- /dev/null +++ b/books/mickiewicz_romantycznosc.xml @@ -0,0 +1,31 @@ + + + +Mickiewicz, Adam +Romantyczność +Ballady i romanse +Sekuła, Aleksandra +Kallenbach, Józef +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Ballada +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Romantyczno%C5%9B%C4%87 +http://www.polona.pl/Content/2222 +Mickiewicz, Adam (1798-1855), Poezje, tom 1 (Wiersze młodzieńcze - Ballady i romanse - Wiersze do r. 1824), Krakowska Spółdzielnia Wydawnicza, wyd. 2 zwiększone, Kraków, 1922 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-09-06 +SP2 +G +L +pol + + + diff --git a/books/mickiewicz_rybka.xml b/books/mickiewicz_rybka.xml new file mode 100755 index 000000000..b59f3d9a8 --- /dev/null +++ b/books/mickiewicz_rybka.xml @@ -0,0 +1,31 @@ + + + +Mickiewicz, Adam +Rybka +Ballady i romanse +Sekuła, Aleksandra +Kallenbach, Józef +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Ballada +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Rybka +http://www.polona.pl/Content/2222 +Mickiewicz, Adam (1798-1855), Poezje, tom 1 (Wiersze młodzieńcze - Ballady i romanse - Wiersze do r. 1824), Krakowska Spółdzielnia Wydawnicza, wyd. 2 zwiększone, Kraków, 1922 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-09-06 +SP2 +G +L +pol + + + diff --git a/books/mickiewicz_smierc_pulkownika.xml b/books/mickiewicz_smierc_pulkownika.xml new file mode 100755 index 000000000..0713a020d --- /dev/null +++ b/books/mickiewicz_smierc_pulkownika.xml @@ -0,0 +1,28 @@ + + + +Mickiewicz, Adam +Śmierć Pułkownika +Sekuła, Alaksandra +Bystrzycki, Jan +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/%C5%9Amier%C4%87+Pu%C5%82kownika +http://www.polona.pl/dlibra/doccontent2?id=2223&from=&from=generalsearch&dirids=1&lang=pl +Mickiewicz, Adam (1798-1855), Poezje, tom 2, Wiersze z lat 1825-1855 (Pieśni - Sonety - Poezje patrjotyczne, religijne i filozoficzne - Wiersze okolicznościowe - Bajki), Krakowska Spółdzielnia Wydawnicza, wyd. 2 popr., W. L. Anczyc, Kraków, 1928 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-12-20 +L +pol + + + diff --git a/books/mickiewicz_switez.xml b/books/mickiewicz_switez.xml new file mode 100755 index 000000000..22c853695 --- /dev/null +++ b/books/mickiewicz_switez.xml @@ -0,0 +1,31 @@ + + + +Mickiewicz, Adam +Świteź +Ballady i romanse +Sekuła, Aleksandra +Kallenbach, Józef +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Ballada +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/%C5%9Awite%C5%BA +http://www.polona.pl/Content/2222 +Mickiewicz, Adam (1798-1855), Poezje, tom 1 (Wiersze młodzieńcze - Ballady i romanse - Wiersze do r. 1824), Krakowska Spółdzielnia Wydawnicza, wyd. 2 zwiększone, Kraków, 1922 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-09-06 +SP2 +G +L +pol + + + diff --git a/books/mickiewicz_switezianka.xml b/books/mickiewicz_switezianka.xml new file mode 100755 index 000000000..871f953b9 --- /dev/null +++ b/books/mickiewicz_switezianka.xml @@ -0,0 +1,31 @@ + + + +Mickiewicz, Adam +Świtezianka +Ballady i romanse +Sekuła, Aleksandra +Kallenbach, Józef +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Ballada +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/%C5%9Awitezianka +http://www.polona.pl/Content/2222 +Mickiewicz, Adam (1798-1855), Poezje, tom 1 (Wiersze młodzieńcze - Ballady i romanse - Wiersze do r. 1824), Krakowska Spółdzielnia Wydawnicza, wyd. 2 zwiększone, Kraków, 1922 +Domena publiczna - Adam Mickiewicz zm. 1855 +1855 +xml +text +text +2007-09-06 +SP2 +G +L +pol + + + diff --git a/books/morsztyn_cuda_milosci_1.xml b/books/morsztyn_cuda_milosci_1.xml new file mode 100755 index 000000000..f9aeaa79c --- /dev/null +++ b/books/morsztyn_cuda_milosci_1.xml @@ -0,0 +1,28 @@ + + + +Morsztyn, Jan Andrzej +Cuda miłości (Karmię frasunkiem miłość) +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/morsztyn_cuda_milosci_2.xml b/books/morsztyn_cuda_milosci_2.xml new file mode 100755 index 000000000..27ba5af43 --- /dev/null +++ b/books/morsztyn_cuda_milosci_2.xml @@ -0,0 +1,28 @@ + + + +Morsztyn, Jan Andrzej +Cuda miłości (Przebóg! Jak żyję) +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/morsztyn_do_motyla.xml b/books/morsztyn_do_motyla.xml new file mode 100755 index 000000000..5ea0090ea --- /dev/null +++ b/books/morsztyn_do_motyla.xml @@ -0,0 +1,28 @@ + + + +Morsztyn, Jan Andrzej +Do motyla +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Do+motyla +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/morsztyn_do_swoich_ksiazek_1.xml b/books/morsztyn_do_swoich_ksiazek_1.xml new file mode 100755 index 000000000..dbd07a25e --- /dev/null +++ b/books/morsztyn_do_swoich_ksiazek_1.xml @@ -0,0 +1,28 @@ + + + +Morsztyn, Jan Andrzej +Do swoich książek (Dokąd się moja lutni) +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/morsztyn_do_swoich_ksiazek_2.xml b/books/morsztyn_do_swoich_ksiazek_2.xml new file mode 100755 index 000000000..622f41e93 --- /dev/null +++ b/books/morsztyn_do_swoich_ksiazek_2.xml @@ -0,0 +1,28 @@ + + + +Morsztyn, Jan Andrzej +Do swoich książek (Hola! już dosyć) +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/morsztyn_do_trupa.xml b/books/morsztyn_do_trupa.xml new file mode 100755 index 000000000..89f072b77 --- /dev/null +++ b/books/morsztyn_do_trupa.xml @@ -0,0 +1,29 @@ + + + +Morsztyn, Jan Andrzej +Do trupa +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Do+trupa +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +G +L +pol + + + diff --git a/books/morsztyn_na_krzyzyk_na_piersiach_jednej_panny.xml b/books/morsztyn_na_krzyzyk_na_piersiach_jednej_panny.xml new file mode 100755 index 000000000..53387c083 --- /dev/null +++ b/books/morsztyn_na_krzyzyk_na_piersiach_jednej_panny.xml @@ -0,0 +1,28 @@ + + + +Morsztyn, Jan Andrzej +Na krzyżyk na piersiach jednej panny +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Sonet +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Na+krzy%C5%BCyk+na+piersiach+jednej+panny +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/morsztyn_na_zegar_ciekacy.xml b/books/morsztyn_na_zegar_ciekacy.xml new file mode 100755 index 000000000..403815a5b --- /dev/null +++ b/books/morsztyn_na_zegar_ciekacy.xml @@ -0,0 +1,28 @@ + + + +Morsztyn, Jan Andrzej +Na zegarek ciekący +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Epigramat +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Na+zegarek+ciek%C4%85cy +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/morsztyn_nadgrobek_perlisi.xml b/books/morsztyn_nadgrobek_perlisi.xml new file mode 100755 index 000000000..ee2dec7f4 --- /dev/null +++ b/books/morsztyn_nadgrobek_perlisi.xml @@ -0,0 +1,28 @@ + + + +Morsztyn, Jan Andrzej +Nadgrobek Perlisi +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Nadgrobek+Perlisi +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/morsztyn_niestatek_1.xml b/books/morsztyn_niestatek_1.xml new file mode 100755 index 000000000..4f0d56e92 --- /dev/null +++ b/books/morsztyn_niestatek_1.xml @@ -0,0 +1,28 @@ + + + +Morsztyn, Jan Andrzej +Niestatek (Oczy są ogień) +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Epigramat +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/morsztyn_niestatek_2.xml b/books/morsztyn_niestatek_2.xml new file mode 100755 index 000000000..e3406f3b1 --- /dev/null +++ b/books/morsztyn_niestatek_2.xml @@ -0,0 +1,28 @@ + + + +Morsztyn, Jan Andrzej +Niestatek (Prędzej kto wiatr w wór zamknie) +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Epigramat +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. + +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/morsztyn_pszczola_w_bursztynie.xml b/books/morsztyn_pszczola_w_bursztynie.xml new file mode 100755 index 000000000..c05e51c30 --- /dev/null +++ b/books/morsztyn_pszczola_w_bursztynie.xml @@ -0,0 +1,28 @@ + + + +Morsztyn, Jan Andrzej +Pszczoła w bursztynie +Sekuła, Aleksandra +Kukulski, Leszek +Sutkowska, Olga +Fundacja Nowoczesna Polska +Barok +Liryka +Epigramat +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Pszczo%C5%82a+w+bursztynie +http://www.polona.pl/Content/5265 +Morsztyn, Jan Andrzej (1621-1693), 275 wierszy, Państwowy Instytut Wydawniczy, Warszawa, 1977 +Domena publiczna - Jan Andrzej Morsztyn zm. 1693 +1693 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/oppman_biala_dama.xml b/books/oppman_biala_dama.xml new file mode 100755 index 000000000..4705cce29 --- /dev/null +++ b/books/oppman_biala_dama.xml @@ -0,0 +1,28 @@ + + + +Oppman, Artur +Biała Dama +Legendy warszawskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Epika +Legenda +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Bia%C5%82a+DamaL +http://www.polona.pl/Content/799 +Oppman, Artur (1867-1931), Legendy warszawskie, Księgarnia św. Wojciecha, Poznań, Warszawa [etc.], 1925 +Domena publiczna - Artur Oppman zm. 1931 +1931 +xml +text +text +2007-08-30 +SP2 +pol + + + diff --git a/books/oppman_chrystus_cudowny_u_fary.xml b/books/oppman_chrystus_cudowny_u_fary.xml new file mode 100755 index 000000000..ce87d5814 --- /dev/null +++ b/books/oppman_chrystus_cudowny_u_fary.xml @@ -0,0 +1,28 @@ + + + +Oppman, Artur +Chrystus Cudowny u Fary +Legendy warszawskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Epika +Legenda +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Chrystus+Cudowny+u+Fary +http://www.polona.pl/Content/799 +Oppman, Artur (1867-1931), Legendy warszawskie, Księgarnia św. Wojciecha, Poznań, Warszawa [etc.], 1925 +Domena publiczna - Artur Oppman zm. 1931 +1931 +xml +text +text +2007-08-30 +SP2 +pol + + + diff --git a/books/oppman_kosciol_panny_marii.xml b/books/oppman_kosciol_panny_marii.xml new file mode 100755 index 000000000..182ea875b --- /dev/null +++ b/books/oppman_kosciol_panny_marii.xml @@ -0,0 +1,28 @@ + + + +Oppman, Artur +Kościół Panny Marii +Legendy warszawskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Epika +Legenda +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Ko%C5%9Bci%C3%B3%C5%82+Panny+Marii +http://www.polona.pl/Content/799 +Oppman, Artur (1867-1931), Legendy warszawskie, Księgarnia św. Wojciecha, Poznań, Warszawa [etc.], 1925 +Domena publiczna - Artur Oppman zm. 1931 +1931 +xml +text +text +2007-08-30 +SP2 +pol + + + diff --git a/books/oppman_legendy_warszawskie_bazyliszek.xml b/books/oppman_legendy_warszawskie_bazyliszek.xml new file mode 100755 index 000000000..6a46606c1 --- /dev/null +++ b/books/oppman_legendy_warszawskie_bazyliszek.xml @@ -0,0 +1,28 @@ + + + +Oppman, Artur +Bazyliszek +Legendy warszawskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Epika +Legenda +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Bazyliszek +http://www.polona.pl/Content/799 +Oppman, Artur (1867-1931), Legendy warszawskie, Księgarnia św. Wojciecha, Poznań, Warszawa [etc.], 1925 +Domena publiczna - Artur Oppman zm. 1931 +1931 +xml +text +text +2007-08-30 +SP2 +pol + + + diff --git a/books/oppman_syrena.xml b/books/oppman_syrena.xml new file mode 100755 index 000000000..8bf4d0e0a --- /dev/null +++ b/books/oppman_syrena.xml @@ -0,0 +1,28 @@ + + + +Oppman, Artur +Syrena +Legendy warszawskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Epika +Legenda +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Syrena +http://www.polona.pl/Content/799 +Oppman, Artur (1867-1931), Legendy warszawskie, Księgarnia św. Wojciecha, Poznań, Warszawa [etc.], 1925 +Domena publiczna - Artur Oppman zm. 1931 +1931 +xml +text +text +2007-08-30 +SP2 +pol + + + diff --git a/books/oppman_wstep.xml b/books/oppman_wstep.xml new file mode 100755 index 000000000..af8405326 --- /dev/null +++ b/books/oppman_wstep.xml @@ -0,0 +1,28 @@ + + + +Oppman, Artur +Wstęp +Legendy warszawskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Epika +Legenda +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Wst%C4%99p +http://www.polona.pl/Content/799 +Oppman, Artur (1867-1931), Legendy warszawskie, Księgarnia św. Wojciecha, Poznań, Warszawa [etc.], 1925 +Domena publiczna - Artur Oppman zm. 1931 +1931 +xml +text +text +2007-08-30 +SP2 +pol + + + diff --git a/books/oppman_zbojcy.xml b/books/oppman_zbojcy.xml new file mode 100755 index 000000000..7bf1e6939 --- /dev/null +++ b/books/oppman_zbojcy.xml @@ -0,0 +1,28 @@ + + + +Oppman, Artur +Zbójcy +Legendy warszawskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Epika +Legenda +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Zb%C3%B3jcy +http://www.polona.pl/Content/799 +Oppman, Artur (1867-1931), Legendy warszawskie, Księgarnia św. Wojciecha, Poznań, Warszawa [etc.], 1925 +Domena publiczna - Artur Oppman zm. 1931 +1931 +xml +text +text +2007-08-30 +SP2 +pol + + + diff --git a/books/oppman_zlota_kaczka.xml b/books/oppman_zlota_kaczka.xml new file mode 100755 index 000000000..20a184501 --- /dev/null +++ b/books/oppman_zlota_kaczka.xml @@ -0,0 +1,28 @@ + + + +Oppman, Artur +Złota kaczka +Legendy warszawskie +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Epika +Legenda +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Z%C5%82ota+kaczka +http://www.polona.pl/Content/799 +Oppman, Artur (1867-1931), Legendy warszawskie, Księgarnia św. Wojciecha, Poznań, Warszawa [etc.], 1925 +Domena publiczna - Artur Oppman zm. 1931 +1931 +xml +text +text +2007-08-30 +SP2 +pol + + + diff --git a/books/reymont_chlopi_jesien.xml b/books/reymont_chlopi_jesien.xml new file mode 100755 index 000000000..3b619adfc --- /dev/null +++ b/books/reymont_chlopi_jesien.xml @@ -0,0 +1,29 @@ + + + +Reymont, Władysław Stanisław +Chłopi - Jesień +Sekuła, Aleksandra +Jodełka-Burzecki, Tomasz +Orlewiczowa, Irena +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Epika +Powieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/Content/4072 +Reymont, Władysław Stanisław (1867-1925), Chłopi, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Władysław St. Reymont zm. 1925 +1925 +xml +text +text +2008-04-07 +L +pol + + + diff --git a/books/sienkiewicz_janko_muzykant.xml b/books/sienkiewicz_janko_muzykant.xml new file mode 100755 index 000000000..d72468e05 --- /dev/null +++ b/books/sienkiewicz_janko_muzykant.xml @@ -0,0 +1,27 @@ + + + +Sienkiewicz, Henryk +Janko Muzykant +Sekuła, Aleksandra +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Pozytywizm +Epika +Nowela +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Janko+Muzykant +http://www.polona.pl/dlibra/doccontent2?id=3751&from=editionindex&dirids=4 +Sienkiewicz, Henryk (1846-1916), Pisma wybrane. Nowele, tom 1, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Henryk Sienkiewicz zm. 1916 +1916 +xml +text +text +2007-08-30 +SP2 +pol + + + diff --git a/books/sienkiewicz_latarnik.xml b/books/sienkiewicz_latarnik.xml new file mode 100755 index 000000000..ebe9652b0 --- /dev/null +++ b/books/sienkiewicz_latarnik.xml @@ -0,0 +1,28 @@ + + + +Sienkiewicz, Henryk +Latarnik +Sekuła, Aleksandra +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Pozytywizm +Epika +Nowela +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Latarnik +http://www.polona.pl/dlibra/doccontent2?id=3752&from=editionindex&dirids=4 +Sienkiewicz, Henryk (1846-1916), Pisma wybrane. Nowele, tom 2, Państwowy Instytut Wydawniczy, Warszawa, 1976 +Domena publiczna - Henryk Sienkiewicz zm. 1916 +1916 +xml +text +text +2007-08-30 +SP2 +G +pol + + + diff --git a/books/slowacki_do_matki.xml b/books/slowacki_do_matki.xml new file mode 100755 index 000000000..3be4dce75 --- /dev/null +++ b/books/slowacki_do_matki.xml @@ -0,0 +1,26 @@ + + + +Słowacki, Juliusz +Do matki +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Do+matki +http://www.polona.pl/Content/4060 +Mazanowski, Antoni (1858-1916), Wypisy polskie na VII klasę gimnazyalną, [s.n.], Kraków, 1914 +Domena publiczna - Juliusz Słowacki zm. 1849 +1849 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/slowacki_grob_agamemnona.xml b/books/slowacki_grob_agamemnona.xml new file mode 100755 index 000000000..b0047c06d --- /dev/null +++ b/books/slowacki_grob_agamemnona.xml @@ -0,0 +1,27 @@ + + + +Słowacki, Juliusz +Grób Agamemnona +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Gr%C3%B3b+Agamemnona +http://www.polona.pl/dlibra/doccontent2?id=5175&from=editionindex&dirids=4 +Słowacki, Juliusz (1809-1849), Pisma Juliusza Słowackiego, tom 3, Lwów, 1925 +Domena publiczna - Juliusz Słowacki zm. 1849 +1849 +xml +text +text +2008-01-25 +L +pol + + + diff --git a/books/slowacki_hymn.xml b/books/slowacki_hymn.xml new file mode 100755 index 000000000..1c037fa48 --- /dev/null +++ b/books/slowacki_hymn.xml @@ -0,0 +1,28 @@ + + + +Słowacki, Juliusz +Hymn +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Hymn +http://www.polona.pl/Content/4060 +Mazanowski, Antoni (1858-1916), Wypisy polskie na VII klasę gimnazyalną, [s.n.], Kraków, 1914 +Domena publiczna - Juliusz Słowacki zm. 1849 +1849 +xml +text +text +2007-09-06 +G +L +pol + + + diff --git a/books/slowacki_odpowiedz_na_psalmy_przyszlosci.xml b/books/slowacki_odpowiedz_na_psalmy_przyszlosci.xml new file mode 100755 index 000000000..ed39178a9 --- /dev/null +++ b/books/slowacki_odpowiedz_na_psalmy_przyszlosci.xml @@ -0,0 +1,27 @@ + + + +Słowacki, Juliusz +Odpowiedź na "Psalmy przyszłości" +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Odpowied%C5%BA+na+%22Psalmy+przysz%C5%82o%C5%9Bci%22 +http://www.polona.pl/Content/4060 +Mazanowski, Antoni (1858-1916), Wypisy polskie na VII klasę gimnazyalną, [s.n.], Kraków, 1914 +Domena publiczna - Juliusz Słowacki zm. 1849 +1849 +xml +text +text +2007-09-06 +L +pol + + + diff --git a/books/slowacki_testament_moj.xml b/books/slowacki_testament_moj.xml new file mode 100755 index 000000000..d94741d31 --- /dev/null +++ b/books/slowacki_testament_moj.xml @@ -0,0 +1,28 @@ + + + +Słowacki, Juliusz +Testament mój +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Testament+m%C3%B3j +http://www.polona.pl/Content/4060 +Mazanowski, Antoni (1858-1916), Wypisy polskie na VII klasę gimnazyalną, [s.n.], Kraków, 1914 +Domena publiczna - Juliusz Słowacki zm. 1849 +1849 +xml +text +text +2007-09-06 +G +L +pol + + + diff --git a/books/slowacki_w_pamietniku_zofii_bobrowny.xml b/books/slowacki_w_pamietniku_zofii_bobrowny.xml new file mode 100755 index 000000000..53da69d06 --- /dev/null +++ b/books/slowacki_w_pamietniku_zofii_bobrowny.xml @@ -0,0 +1,28 @@ + + + +Słowacki, Juliusz +W pamiętniku Zofii Bobrówny +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Romantyzm +Liryka +Wiersz +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/W+pami%C4%99tniku+Zofii+Bobr%C3%B3wny +http://www.polona.pl/Content/4060 +Mazanowski, Antoni (1858-1916), Wypisy polskie na VII klasę gimnazyalną, [s.n.], Kraków, 1914 +Domena publiczna - Juliusz Słowacki zm. 1849 +1849 +xml +text +text +2007-09-06 +SP2 +L +pol + + + diff --git a/books/sofokles_antygona.xml b/books/sofokles_antygona.xml new file mode 100755 index 000000000..66dc3b0e8 --- /dev/null +++ b/books/sofokles_antygona.xml @@ -0,0 +1,28 @@ + + + +Sofokles +Antygona +Sekuła, Aleksandra +Morawski, Kazimierz +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Starożytność +Dramat +Tragedia +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Antygona +http://www.polona.pl/Content/3768 +Sofokles (496-406 a.C.), Antygona, Zakład Narodowy im. Ossolińskich, wyd. 7, Lwów, 1939 +Domena publiczna - tłumacz Kazimierz Morawski zm. 1925 +1925 +xml +text +text +2007-08-30 +G +pol + + + diff --git a/books/sofokles_krol_edyp.xml b/books/sofokles_krol_edyp.xml new file mode 100755 index 000000000..070c69f74 --- /dev/null +++ b/books/sofokles_krol_edyp.xml @@ -0,0 +1,28 @@ + + + +Sofokles +Król Edyp +Sekuła, Aleksandra +Morawski, Kazimierz +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Starożytność +Dramat +Tragedia +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Kr%C3%B3l+Edyp +http://www.polona.pl/Content/3067 +Sofokles (496-406 a.C.), Król Edyp, Zakład Narodowy im. Ossolińskich, wyd. 2, Kraków, 1947 +Domena publiczna - tłumacz Kazimierz Morawski zm. 1925 +1925 +xml +text +text +2007-08-31 +L +pol + + + diff --git a/books/zeromski_doktor_piotr.xml b/books/zeromski_doktor_piotr.xml new file mode 100755 index 000000000..179a3900d --- /dev/null +++ b/books/zeromski_doktor_piotr.xml @@ -0,0 +1,28 @@ + + + +Żeromski, Stefan +Doktor Piotr +Pigoń, Stanisław +Sekuła, Aleksandra +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Modernizm +Epika +Nowela +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Doktor+Piotr +http://www.polona.pl/dlibra/doccontent2?id=3343&from=editionindex&dirids=4 +Żeromski, Stefan (1864-1925), Opowiadania. Utwory powieściowe, Czytelnik, wyd. 5, Warszawa, 1973 +Domena publiczna - Stefan Żeromski zm. 1925 +1925 +xml +text +text +2007-08-31 +G +pol + + + diff --git a/books/zeromski_ludzie_bezdomni_tom_drugi.xml b/books/zeromski_ludzie_bezdomni_tom_drugi.xml new file mode 100755 index 000000000..e7784bf41 --- /dev/null +++ b/books/zeromski_ludzie_bezdomni_tom_drugi.xml @@ -0,0 +1,28 @@ + + + +Żeromski, Stefan +Ludzie bezdomni - tom 2 +Ludzie bezdomni +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Epika +Powieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=4134&from=editionindex&dirids=1 +Żeromski, Stefan (1864-1925), Ludzie bezdomni, Czytelnik, wyd. 24, Warszawa, 1976 +Domena publiczna: Stefan Żeromski zm. 1925 +1925 +xml +text +text +2007-11-10 +L +pol + + + diff --git a/books/zeromski_ludzie_bezdomni_tom_pierwszy.xml b/books/zeromski_ludzie_bezdomni_tom_pierwszy.xml new file mode 100755 index 000000000..b689e3583 --- /dev/null +++ b/books/zeromski_ludzie_bezdomni_tom_pierwszy.xml @@ -0,0 +1,28 @@ + + + +Żeromski, Stefan +Ludzie bezdomni - tom 1 +Ludzie bezdomni +Sekuła, Aleksandra +Sutkowska, Olga +Fundacja Nowoczesna Polska +Modernizm +Epika +Powieść +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +LINK DO STRONY W SERWISIE WOLNELEKTURY.PL +http://www.polona.pl/dlibra/doccontent2?id=4134&from=editionindex&dirids=1 +Żeromski, Stefan (1864-1925), Ludzie bezdomni, Czytelnik, wyd. 24, Warszawa, 1976 +Domena publiczna: Stefan Żeromski zm. 1925 +1925 +xml +text +text +2007-11-10 +L +pol + + + diff --git a/books/zeromski_silaczka.xml b/books/zeromski_silaczka.xml new file mode 100755 index 000000000..a6bd4854d --- /dev/null +++ b/books/zeromski_silaczka.xml @@ -0,0 +1,28 @@ + + + +Żeromski, Stefan +Siłaczka +Pigoń, Stanisław +Sekuła, Aleksandra +Gałecki, Dariusz +Fundacja Nowoczesna Polska +Modernizm +Epika +Nowela +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Partnerem projektu jest Prokom Software SA. Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://www.wolnelektury.pl/lektura/Si%C5%82aczka +http://www.polona.pl/Content/3343 +Żeromski, Stefan (1864-1925), Opowiadania. Utwory powieściowe, Czytelnik, wyd. 5, Warszawa, 1973 +Domena publiczna - Stefan Żeromski zm. 1925 +1925 +xml +text +text +2007-08-31 +G +pol + + + diff --git a/catalogue/.DS_Store b/catalogue/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..549fcd8336f7dd7c46000079e9d3cac46cf987d7 GIT binary patch literal 6148 zcmeHKOHRW;47F(&6>Pd>IY)pSL{&Kf7l4!!MGDD+Pq(=ix8ptA2&#r{q#|4LJdeko z$vi1DV-eBK`_rw+T0~Y*qSBZUx+jM&B6tZ@&e7h~-B6>)>CQv=?F;FomHPQ``u**$ z|KQ$!N4*}pp>N>%{PDKCW{AC$D$Yv1loxrF9@@wr_8#`zAF&8eNd}UEWFQ$x24-Nu z?=@Ln&9GK3kqjgQ=fwcehXN&5fuo}x9cZis0P?YG0^1({z(NPG3LG8bfvBefJyoN` z(5M~M(=lE}{OIWEqP8;TiIu;L7md + + ''' % { + 'attrs' : flatatt(final_attrs), + 'js' : self.render_js(final_attrs['id']), + } + + return mark_safe(html) + + +class JQueryAutoCompleteField(forms.CharField): + def __init__(self, source, options=None, *args, **kwargs): + if 'widget' not in kwargs: + kwargs['widget'] = JQueryAutoCompleteWidget(source, options) + + super(JQueryAutoCompleteField, self).__init__(*args, **kwargs) + diff --git a/catalogue/forms.py b/catalogue/forms.py new file mode 100644 index 000000000..b383f99ea --- /dev/null +++ b/catalogue/forms.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +from django import forms + +from catalogue.models import Tag +from catalogue.fields import JQueryAutoCompleteField +from catalogue.lib.slughifi import slughifi + + +class SearchForm(forms.Form): + q = JQueryAutoCompleteField('/katalog/tags/', {'minChars': 2, 'selectFirst': True, 'cacheLength': 50}) + + def __init__(self, *args, **kwargs): + super(SearchForm, self).__init__(*args, **kwargs) + self.fields['q'].widget.attrs['title'] = u'tytuł utworu, motyw lub kategoria' + + +class BookSetsForm(forms.Form): + def __init__(self, book, user, *args, **kwargs): + super(BookSetsForm, self).__init__(*args, **kwargs) + self.fields['set_ids'] = forms.MultipleChoiceField( + label=u'Zestawy', + required=False, + choices=[(tag.id, tag.name) for tag in Tag.objects.filter(category='set', user=user)], + initial=[tag.id for tag in book.tags.filter(category='set', user=user)], + widget=forms.CheckboxSelectMultiple + ) + + +class NewSetForm(forms.Form): + name = forms.CharField(max_length=50, required=True) + + def save(self, user, commit=True): + name = self.cleaned_data['name'] + new_set = Tag(name=name, slug=slughifi(name), sort_key=slughifi(name), + category='set', user=user) + + new_set.save() + return new_set + diff --git a/catalogue/lib/.DS_Store b/catalogue/lib/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f4064f480e2d93a8f7310ba697fe51e7532c3d8b GIT binary patch literal 6148 zcmeHKOG*Pl5UtWI21Llx<(xqD217^|uDyU}@?l`eNP>p!<}RMXtryexs#=&}?*byB z3VL33*QdK5Ojoyv=;U>AFESR90*$CtGQ#1k=^{CgfND9mvXiB3SNrBJljuJVaqWdH zq?Q+XmcjbxZ8wLF#F#Yo=8e0AWc+vgw%e>>`^edwdflabB$9KoUCRn=EiwCGZn;J8 z@X&VkUe*ZFo77`2u1HnKr5Dc8cfLAjqu1-l3vB5wvaFz`4d??X~Rl?rUjt+e6 z2>|4E)&#m;nSmt-fK|fY5hD=wP@soudSYn0ajS>JUM2tD(ZfY;X5>jT|2$qaUD&lW zchSl*zQI5+aLmA^cgL*%GyF=~NB(h0^n!t4;LI4%(e!aT!KPAe{k1*T+7j&vjY7Yk p3Iw{9VxW~`ba;;3n9=Peb=a$fy(6=5+`@rz5immH6Ab(T1K-i^GtU43 literal 0 HcmV?d00001 diff --git a/catalogue/lib/__init__.py b/catalogue/lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/catalogue/lib/dcparser/__init__.py b/catalogue/lib/dcparser/__init__.py new file mode 100644 index 000000000..793f5270d --- /dev/null +++ b/catalogue/lib/dcparser/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from dcparser import parse, ParseError +from person import Person + diff --git a/catalogue/lib/dcparser/converters.py b/catalogue/lib/dcparser/converters.py new file mode 100644 index 000000000..773aeddcb --- /dev/null +++ b/catalogue/lib/dcparser/converters.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from datetime import date +import time +import re + +from person import Person + + +def str_to_unicode(value): + return unicode(value) + + +def str_to_person(value): + comma_count = value.count(',') + + if comma_count == 0: + last_name, first_names = value, [] + elif comma_count == 1: + last_name, first_names = value.split(',') + first_names = [name for name in first_names.split(' ') if len(name)] + else: + raise ValueError("value contains more than one comma: %r" % value) + + return Person(last_name.strip(), *first_names) + + +def str_to_date(value): + try: + t = time.strptime(value, '%Y-%m-%d') + except ValueError: + t = time.strptime(value, '%Y') + return date(t[0], t[1], t[2]) + + diff --git a/catalogue/lib/dcparser/dcparser.py b/catalogue/lib/dcparser/dcparser.py new file mode 100644 index 000000000..e8a733a73 --- /dev/null +++ b/catalogue/lib/dcparser/dcparser.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +from xml.parsers.expat import ExpatError + +# Import ElementTree from anywhere +try: + import xml.etree.ElementTree as ET # Python >= 2.5 +except ImportError: + try: + import elementtree.ElementTree as ET # effbot's pure Python module + except ImportError: + import lxml.etree as ET # ElementTree API using libxml2 + +import converters + + + +__all__ = ('parse', 'ParseError') + + + +class ParseError(Exception): + def __init__(self, message): + super(self, Exception).__init__(message) + + + +class XMLNamespace(object): + '''Represents XML namespace.''' + + def __init__(self, uri): + self.uri = uri + + def __call__(self, tag): + return '{%s}%s' % (self.uri, tag) + + def __contains__(self, tag): + return tag.startswith(str(self)) + + def __repr__(self): + return 'NS(%r)' % self.uri + + def __str__(self): + return '%s' % self.uri + + + +class BookInfo(object): + RDF = XMLNamespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#') + DC = XMLNamespace('http://purl.org/dc/elements/1.1/') + + mapping = { + DC('creator') : ('author', converters.str_to_person), + DC('title') : ('title', converters.str_to_unicode), + DC('subject.period') : ('epoch', converters.str_to_unicode), + DC('subject.type') : ('kind', converters.str_to_unicode), + DC('subject.genre') : ('genre', converters.str_to_unicode), + DC('date') : ('created_at', converters.str_to_date), + DC('date.pd') : ('released_to_public_domain_at', converters.str_to_date), + DC('contributor.translator') : ('translator', converters.str_to_person), + DC('contributor.technical_editor') : ('technical_editor', converters.str_to_person), + DC('publisher') : ('publisher', converters.str_to_unicode), + DC('source') : ('source_name', converters.str_to_unicode), + DC('source.URL') : ('source_url', converters.str_to_unicode), + } + + + @classmethod + def from_string(cls, xml): + """docstring for from_string""" + from StringIO import StringIO + return cls.from_file(StringIO(xml)) + + + @classmethod + def from_file(cls, xml_file): + book_info = cls() + + try: + tree = ET.parse(xml_file) + except ExpatError, e: + raise ParseError(e) + + description = tree.find('//' + book_info.RDF('Description')) + if description is None: + raise ParseError('no Description tag found in document') + + for element in description.findall('*'): + book_info.parse_element(element) + + return book_info + + + def parse_element(self, element): + try: + attribute, converter = self.mapping[element.tag] + setattr(self, attribute, converter(element.text)) + except KeyError: + pass + + + def to_xml(self): + """XML representation of this object.""" + ET._namespace_map[str(self.RDF)] = 'rdf' + ET._namespace_map[str(self.DC)] = 'dc' + + root = ET.Element(self.RDF('RDF')) + description = ET.SubElement(root, self.RDF('Description')) + + for tag, (attribute, converter) in self.mapping.iteritems(): + if hasattr(self, attribute): + e = ET.Element(tag) + e.text = unicode(getattr(self, attribute)) + description.append(e) + + return unicode(ET.tostring(root, 'utf-8'), 'utf-8') + + +def parse(file_name): + return BookInfo.from_file(file_name) + + diff --git a/catalogue/lib/dcparser/person.py b/catalogue/lib/dcparser/person.py new file mode 100644 index 000000000..16412f768 --- /dev/null +++ b/catalogue/lib/dcparser/person.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + + +class Person(object): + """Single person with last name and a list of first names.""" + def __init__(self, last_name, *first_names): + self.last_name = last_name + self.first_names = first_names + + + def __eq__(self, right): + return self.last_name == right.last_name and self.first_names == right.first_names + + + def __unicode__(self): + if len(self.first_names) > 0: + return '%s, %s' % (self.last_name, ' '.join(self.first_names)) + else: + return self.last_name + + + def __repr__(self): + return 'Person(last_name=%r, first_names=*%r)' % (self.last_name, self.first_names) + diff --git a/catalogue/lib/slughifi.py b/catalogue/lib/slughifi.py new file mode 100644 index 000000000..e7fa2212d --- /dev/null +++ b/catalogue/lib/slughifi.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +import re +from types import UnicodeType + +from django.template.defaultfilters import slugify + +# default unicode character mapping ( you may not see some chars, leave as is ) +char_map = {u'À': 'A', u'Á': 'A', u'Â': 'A', u'Ã': 'A', u'Ä': 'Ae', u'Å': 'A', u'Æ': 'A', u'Ā': 'A', u'Ą': 'A', u'Ă': 'A', u'Ç': 'C', u'Ć': 'C', u'Č': 'C', u'Ĉ': 'C', u'Ċ': 'C', u'Ď': 'D', u'Đ': 'D', u'È': 'E', u'É': 'E', u'Ê': 'E', u'Ë': 'E', u'Ē': 'E', u'Ę': 'E', u'Ě': 'E', u'Ĕ': 'E', u'Ė': 'E', u'Ĝ': 'G', u'Ğ': 'G', u'Ġ': 'G', u'Ģ': 'G', u'Ĥ': 'H', u'Ħ': 'H', u'Ì': 'I', u'Í': 'I', u'Î': 'I', u'Ï': 'I', u'Ī': 'I', u'Ĩ': 'I', u'Ĭ': 'I', u'Į': 'I', u'İ': 'I', u'IJ': 'IJ', u'Ĵ': 'J', u'Ķ': 'K', u'Ľ': 'K', u'Ĺ': 'K', u'Ļ': 'K', u'Ŀ': 'K', u'Ł': 'L', u'Ñ': 'N', u'Ń': 'N', u'Ň': 'N', u'Ņ': 'N', u'Ŋ': 'N', u'Ò': 'O', u'Ó': 'O', u'Ô': 'O', u'Õ': 'O', u'Ö': 'Oe', u'Ø': 'O', u'Ō': 'O', u'Ő': 'O', u'Ŏ': 'O', u'Œ': 'OE', u'Ŕ': 'R', u'Ř': 'R', u'Ŗ': 'R', u'Ś': 'S', u'Ş': 'S', u'Ŝ': 'S', u'Ș': 'S', u'Š': 'S', u'Ť': 'T', u'Ţ': 'T', u'Ŧ': 'T', u'Ț': 'T', u'Ù': 'U', u'Ú': 'U', u'Û': 'U', u'Ü': 'Ue', u'Ū': 'U', u'Ů': 'U', u'Ű': 'U', u'Ŭ': 'U', u'Ũ': 'U', u'Ų': 'U', u'Ŵ': 'W', u'Ŷ': 'Y', u'Ÿ': 'Y', u'Ý': 'Y', u'Ź': 'Z', u'Ż': 'Z', u'Ž': 'Z', u'à': 'a', u'á': 'a', u'â': 'a', u'ã': 'a', u'ä': 'ae', u'ā': 'a', u'ą': 'a', u'ă': 'a', u'å': 'a', u'æ': 'ae', u'ç': 'c', u'ć': 'c', u'č': 'c', u'ĉ': 'c', u'ċ': 'c', u'ď': 'd', u'đ': 'd', u'è': 'e', u'é': 'e', u'ê': 'e', u'ë': 'e', u'ē': 'e', u'ę': 'e', u'ě': 'e', u'ĕ': 'e', u'ė': 'e', u'ƒ': 'f', u'ĝ': 'g', u'ğ': 'g', u'ġ': 'g', u'ģ': 'g', u'ĥ': 'h', u'ħ': 'h', u'ì': 'i', u'í': 'i', u'î': 'i', u'ï': 'i', u'ī': 'i', u'ĩ': 'i', u'ĭ': 'i', u'į': 'i', u'ı': 'i', u'ij': 'ij', u'ĵ': 'j', u'ķ': 'k', u'ĸ': 'k', u'ł': 'l', u'ľ': 'l', u'ĺ': 'l', u'ļ': 'l', u'ŀ': 'l', u'ñ': 'n', u'ń': 'n', u'ň': 'n', u'ņ': 'n', u'ʼn': 'n', u'ŋ': 'n', u'ò': 'o', u'ó': 'o', u'ô': 'o', u'õ': 'o', u'ö': 'oe', u'ø': 'o', u'ō': 'o', u'ő': 'o', u'ŏ': 'o', u'œ': 'oe', u'ŕ': 'r', u'ř': 'r', u'ŗ': 'r', u'ś': 's', u'š': 's', u'ť': 't', u'ù': 'u', u'ú': 'u', u'û': 'u', u'ü': 'ue', u'ū': 'u', u'ů': 'u', u'ű': 'u', u'ŭ': 'u', u'ũ': 'u', u'ų': 'u', u'ŵ': 'w', u'ÿ': 'y', u'ý': 'y', u'ŷ': 'y', u'ż': 'z', u'ź': 'z', u'ž': 'z', u'ß': 'ss', u'ſ': 'ss', u'Α': 'A', u'Ά': 'A', u'Ἀ': 'A', u'Ἁ': 'A', u'Ἂ': 'A', u'Ἃ': 'A', u'Ἄ': 'A', u'Ἅ': 'A', u'Ἆ': 'A', u'Ἇ': 'A', u'ᾈ': 'A', u'ᾉ': 'A', u'ᾊ': 'A', u'ᾋ': 'A', u'ᾌ': 'A', u'ᾍ': 'A', u'ᾎ': 'A', u'ᾏ': 'A', u'Ᾰ': 'A', u'Ᾱ': 'A', u'Ὰ': 'A', u'Ά': 'A', u'ᾼ': 'A', u'Β': 'B', u'Γ': 'G', u'Δ': 'D', u'Ε': 'E', u'Έ': 'E', u'Ἐ': 'E', u'Ἑ': 'E', u'Ἒ': 'E', u'Ἓ': 'E', u'Ἔ': 'E', u'Ἕ': 'E', u'Έ': 'E', u'Ὲ': 'E', u'Ζ': 'Z', u'Η': 'I', u'Ή': 'I', u'Ἠ': 'I', u'Ἡ': 'I', u'Ἢ': 'I', u'Ἣ': 'I', u'Ἤ': 'I', u'Ἥ': 'I', u'Ἦ': 'I', u'Ἧ': 'I', u'ᾘ': 'I', u'ᾙ': 'I', u'ᾚ': 'I', u'ᾛ': 'I', u'ᾜ': 'I', u'ᾝ': 'I', u'ᾞ': 'I', u'ᾟ': 'I', u'Ὴ': 'I', u'Ή': 'I', u'ῌ': 'I', u'Θ': 'TH', u'Ι': 'I', u'Ί': 'I', u'Ϊ': 'I', u'Ἰ': 'I', u'Ἱ': 'I', u'Ἲ': 'I', u'Ἳ': 'I', u'Ἴ': 'I', u'Ἵ': 'I', u'Ἶ': 'I', u'Ἷ': 'I', u'Ῐ': 'I', u'Ῑ': 'I', u'Ὶ': 'I', u'Ί': 'I', u'Κ': 'K', u'Λ': 'L', u'Μ': 'M', u'Ν': 'N', u'Ξ': 'KS', u'Ο': 'O', u'Ό': 'O', u'Ὀ': 'O', u'Ὁ': 'O', u'Ὂ': 'O', u'Ὃ': 'O', u'Ὄ': 'O', u'Ὅ': 'O', u'Ὸ': 'O', u'Ό': 'O', u'Π': 'P', u'Ρ': 'R', u'Ῥ': 'R', u'Σ': 'S', u'Τ': 'T', u'Υ': 'Y', u'Ύ': 'Y', u'Ϋ': 'Y', u'Ὑ': 'Y', u'Ὓ': 'Y', u'Ὕ': 'Y', u'Ὗ': 'Y', u'Ῠ': 'Y', u'Ῡ': 'Y', u'Ὺ': 'Y', u'Ύ': 'Y', u'Φ': 'F', u'Χ': 'X', u'Ψ': 'PS', u'Ω': 'O', u'Ώ': 'O', u'Ὠ': 'O', u'Ὡ': 'O', u'Ὢ': 'O', u'Ὣ': 'O', u'Ὤ': 'O', u'Ὥ': 'O', u'Ὦ': 'O', u'Ὧ': 'O', u'ᾨ': 'O', u'ᾩ': 'O', u'ᾪ': 'O', u'ᾫ': 'O', u'ᾬ': 'O', u'ᾭ': 'O', u'ᾮ': 'O', u'ᾯ': 'O', u'Ὼ': 'O', u'Ώ': 'O', u'ῼ': 'O', u'α': 'a', u'ά': 'a', u'ἀ': 'a', u'ἁ': 'a', u'ἂ': 'a', u'ἃ': 'a', u'ἄ': 'a', u'ἅ': 'a', u'ἆ': 'a', u'ἇ': 'a', u'ᾀ': 'a', u'ᾁ': 'a', u'ᾂ': 'a', u'ᾃ': 'a', u'ᾄ': 'a', u'ᾅ': 'a', u'ᾆ': 'a', u'ᾇ': 'a', u'ὰ': 'a', u'ά': 'a', u'ᾰ': 'a', u'ᾱ': 'a', u'ᾲ': 'a', u'ᾳ': 'a', u'ᾴ': 'a', u'ᾶ': 'a', u'ᾷ': 'a', u'β': 'b', u'γ': 'g', u'δ': 'd', u'ε': 'e', u'έ': 'e', u'ἐ': 'e', u'ἑ': 'e', u'ἒ': 'e', u'ἓ': 'e', u'ἔ': 'e', u'ἕ': 'e', u'ὲ': 'e', u'έ': 'e', u'ζ': 'z', u'η': 'i', u'ή': 'i', u'ἠ': 'i', u'ἡ': 'i', u'ἢ': 'i', u'ἣ': 'i', u'ἤ': 'i', u'ἥ': 'i', u'ἦ': 'i', u'ἧ': 'i', u'ᾐ': 'i', u'ᾑ': 'i', u'ᾒ': 'i', u'ᾓ': 'i', u'ᾔ': 'i', u'ᾕ': 'i', u'ᾖ': 'i', u'ᾗ': 'i', u'ὴ': 'i', u'ή': 'i', u'ῂ': 'i', u'ῃ': 'i', u'ῄ': 'i', u'ῆ': 'i', u'ῇ': 'i', u'θ': 'th', u'ι': 'i', u'ί': 'i', u'ϊ': 'i', u'ΐ': 'i', u'ἰ': 'i', u'ἱ': 'i', u'ἲ': 'i', u'ἳ': 'i', u'ἴ': 'i', u'ἵ': 'i', u'ἶ': 'i', u'ἷ': 'i', u'ὶ': 'i', u'ί': 'i', u'ῐ': 'i', u'ῑ': 'i', u'ῒ': 'i', u'ΐ': 'i', u'ῖ': 'i', u'ῗ': 'i', u'κ': 'k', u'λ': 'l', u'μ': 'm', u'ν': 'n', u'ξ': 'ks', u'ο': 'o', u'ό': 'o', u'ὀ': 'o', u'ὁ': 'o', u'ὂ': 'o', u'ὃ': 'o', u'ὄ': 'o', u'ὅ': 'o', u'ὸ': 'o', u'ό': 'o', u'π': 'p', u'ρ': 'r', u'ῤ': 'r', u'ῥ': 'r', u'σ': 's', u'ς': 's', u'τ': 't', u'υ': 'y', u'ύ': 'y', u'ϋ': 'y', u'ΰ': 'y', u'ὐ': 'y', u'ὑ': 'y', u'ὒ': 'y', u'ὓ': 'y', u'ὔ': 'y', u'ὕ': 'y', u'ὖ': 'y', u'ὗ': 'y', u'ὺ': 'y', u'ύ': 'y', u'ῠ': 'y', u'ῡ': 'y', u'ῢ': 'y', u'ΰ': 'y', u'ῦ': 'y', u'ῧ': 'y', u'φ': 'f', u'χ': 'x', u'ψ': 'ps', u'ω': 'o', u'ώ': 'o', u'ὠ': 'o', u'ὡ': 'o', u'ὢ': 'o', u'ὣ': 'o', u'ὤ': 'o', u'ὥ': 'o', u'ὦ': 'o', u'ὧ': 'o', u'ᾠ': 'o', u'ᾡ': 'o', u'ᾢ': 'o', u'ᾣ': 'o', u'ᾤ': 'o', u'ᾥ': 'o', u'ᾦ': 'o', u'ᾧ': 'o', u'ὼ': 'o', u'ώ': 'o', u'ῲ': 'o', u'ῳ': 'o', u'ῴ': 'o', u'ῶ': 'o', u'ῷ': 'o', u'¨': '', u'΅': '', u'᾿': '', u'῾': '', u'῍': '', u'῝': '', u'῎': '', u'῞': '', u'῏': '', u'῟': '', u'῀': '', u'῁': '', u'΄': '', u'΅': '', u'`': '', u'῭': '', u'ͺ': '', u'᾽': '', u'А': 'A', u'Б': 'B', u'В': 'V', u'Г': 'G', u'Д': 'D', u'Е': 'E', u'Ё': 'E', u'Ж': 'ZH', u'З': 'Z', u'И': 'I', u'Й': 'I', u'К': 'K', u'Л': 'L', u'М': 'M', u'Н': 'N', u'О': 'O', u'П': 'P', u'Р': 'R', u'С': 'S', u'Т': 'T', u'У': 'U', u'Ф': 'F', u'Х': 'KH', u'Ц': 'TS', u'Ч': 'CH', u'Ш': 'SH', u'Щ': 'SHCH', u'Ы': 'Y', u'Э': 'E', u'Ю': 'YU', u'Я': 'YA', u'а': 'A', u'б': 'B', u'в': 'V', u'г': 'G', u'д': 'D', u'е': 'E', u'ё': 'E', u'ж': 'ZH', u'з': 'Z', u'и': 'I', u'й': 'I', u'к': 'K', u'л': 'L', u'м': 'M', u'н': 'N', u'о': 'O', u'п': 'P', u'р': 'R', u'с': 'S', u'т': 'T', u'у': 'U', u'ф': 'F', u'х': 'KH', u'ц': 'TS', u'ч': 'CH', u'ш': 'SH', u'щ': 'SHCH', u'ы': 'Y', u'э': 'E', u'ю': 'YU', u'я': 'YA', u'Ъ': '', u'ъ': '', u'Ь': '', u'ь': '', u'ð': 'd', u'Ð': 'D', u'þ': 'th', u'Þ': 'TH', + u'ა': 'a', u'ბ': 'b', u'გ': 'g', u'დ': 'd', u'ე': 'e', u'ვ': 'v', u'ზ': 'z', u'თ': 't', u'ი': 'i', u'კ': 'k', u'ლ': 'l', u'მ': 'm', u'ნ': 'n', u'ო': 'o', u'პ': 'p', u'ჟ': 'zh', u'რ': 'r', u'ს': 's', u'ტ': 't', u'უ': 'u', u'ფ': 'p', u'ქ': 'k', u'ღ': 'gh', u'ყ': 'q', u'შ': 'sh', u'ჩ': 'ch', u'ც': 'ts', u'ძ': 'dz', u'წ': 'ts', u'ჭ': 'ch', u'ხ': 'kh', u'ჯ': 'j', u'ჰ': 'h' } + +def replace_char(m): + char = m.group() + if char_map.has_key(char): + return char_map[char] + else: + return char + +def slughifi(value, do_slugify=True, overwrite_char_map={}): + """ + High Fidelity slugify - slughifi.py, v 0.1 + + Examples : + + >>> text = 'C\'est déjà l\'été.' + + >>> slughifi(text) + 'cest-deja-lete' + + >>> slughifi(text, overwrite_char_map={u'\'': '-',}) + 'c-est-deja-l-ete' + + >>> slughifi(text, do_slugify=False) + "C'est deja l'ete." + + # Normal slugify removes accented characters + >>> slugify(text) + 'cest-dj-lt' + + """ + + # unicodification + if type(value) != UnicodeType: + value = unicode(value, 'utf-8', 'ignore') + + # overwrite chararcter mapping + char_map.update(overwrite_char_map) + + # try to replace chars + value = re.sub('[^a-zA-Z0-9\\s\\-]{1}', replace_char, value) + + # apply django default slugify + if do_slugify: + value = slugify(value) + + return value.encode('ascii', 'ignore') + diff --git a/catalogue/management/.DS_Store b/catalogue/management/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d58b7f84a2406d21ff3059bd0b5b1a95590f1da0 GIT binary patch literal 6148 zcmeHKOHRWu5S@W8BC*MmrH=qNh^n$+%>|&Ts3L`AQ9-x47N>*vJQGAzFDrzqnaX}+ z&nNbiYI{UP*YCS~ky=D5G@?=|2&aptD|cQ2HRpJdL3VO@?8ml{=s!+z?Ul4L${T*a z*1zq?Eo}AILh=?){9ljV-RwVavTKJAvH~giACCPv>|y&X*}HZ>dOi}*HL`^S1HnKr z5DWwZ=U~8YC#i1Ekt}iq1Hr&WF~IX7p%EL$$uJ)s=yC}F{CS>2XDz{)R+CV7tLQs{*>KC8^h>>fnZ?Cz_kr)-v1By%M^?J zWk`&Ifneam7|_+`X|u+r{BAwj9`D+O_KZfM-$Vrheenpufal0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 1: + print "Parsing '%s'" % file_path + + book_info = parse(file_path) + book = Book(title=book_info.title, slug=slughifi(book_info.title)) + book.save() + + book_tags = [] + for category in ('kind', 'genre', 'author', 'epoch'): + tag_name = getattr(book_info, category) + tag_sort_key = tag_name + if category == 'author': + tag_sort_key = tag_name.last_name + tag_name = ' '.join(tag_name.first_names) + ' ' + tag_name.last_name + tag, created = Tag.objects.get_or_create(name=tag_name, + slug=slughifi(tag_name), sort_key=slughifi(tag_sort_key), category=category) + tag.save() + book_tags.append(tag) + book.tags = book_tags + + + transaction.commit() + transaction.leave_transaction_management() + diff --git a/catalogue/models.py b/catalogue/models.py new file mode 100644 index 000000000..b49747b18 --- /dev/null +++ b/catalogue/models.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +from django.db import models +from django.db.models import permalink +from django.utils.translation import ugettext_lazy as _ +from django.contrib.auth.models import User + +from newtagging.models import TagBase +from newtagging import managers + + +TAG_CATEGORIES = ( + ('author', _('author')), + ('epoch', _('epoch')), + ('kind', _('kind')), + ('genre', _('genre')), + ('theme', _('theme')), + ('set', _('set')), +) + + +class TagSubcategoryManager(models.Manager): + def __init__(self, subcategory): + super(TagSubcategoryManager, self).__init__() + self.subcategory = subcategory + + def get_query_set(self): + return super(TagSubcategoryManager, self).get_query_set().filter(category=self.subcategory) + + +class Tag(TagBase): + name = models.CharField(_('name'), max_length=50, unique=True, db_index=True) + slug = models.SlugField(_('slug'), unique=True, db_index=True) + sort_key = models.SlugField(_('sort key'), db_index=True) + category = models.CharField(_('category'), max_length=50, blank=False, null=False, + db_index=True, choices=TAG_CATEGORIES) + description = models.TextField(blank=True) + + user = models.ForeignKey(User, blank=True, null=True) + + def has_description(self): + return len(self.description) > 0 + has_description.short_description = _('Has description') + has_description.boolean = True + + @permalink + def get_absolute_url(self): + return ('catalogue.views.tagged_book_list', [self.slug]) + + class Meta: + ordering = ('sort_key',) + verbose_name = _('tag') + verbose_name_plural = _('tags') + + def __unicode__(self): + return self.name + + +class Book(models.Model): + title = models.CharField(_('title'), max_length=120) + slug = models.SlugField(_('slug'), unique=True, db_index=True) + description = models.TextField(_('description'), blank=True) + created_at = models.DateTimeField(_('creation date'), auto_now=True) + + # Formats + pdf_file = models.FileField(_('PDF file'), upload_to='books/pdf', blank=True) + odt_file = models.FileField(_('ODT file'), upload_to='books/odt', blank=True) + html_file = models.FileField(_('HTML file'), upload_to='books/html', blank=True) + + objects = managers.ModelTaggedItemManager(Tag) + tags = managers.TagDescriptor(Tag) + + def has_description(self): + return len(self.description) > 0 + has_description.short_description = _('Has description') + has_description.boolean = True + + def has_pdf_file(self): + return bool(self.pdf_file) + has_pdf_file.short_description = 'PDF' + has_pdf_file.boolean = True + + def has_odt_file(self): + return bool(self.odt_file) + has_odt_file.short_description = 'ODT' + has_odt_file.boolean = True + + def has_html_file(self): + return bool(self.html_file) + has_html_file.short_description = 'HTML' + has_html_file.boolean = True + + @permalink + def get_absolute_url(self): + return ('catalogue.views.book_detail', [self.slug]) + + class Meta: + ordering = ('title',) + verbose_name = _('book') + verbose_name_plural = _('books') + + def __unicode__(self): + return self.title + + +# class Fragment(models.Model): +# id = models.IntegerField(primary_key=True) +# text = models.TextField(blank=True) +# start_paragraph = models.IntegerField(null=True, blank=True) +# book_id = models.IntegerField(null=True, blank=True) +# class Meta: +# db_table = u'fragment' + + +# class Inflections(models.Model): +# word = models.CharField(max_length=120, primary_key=True) +# cases = models.TextField() # This field type is a guess. +# class Meta: +# db_table = u'inflections' + + +# class Paragraph(models.Model): +# id = models.IntegerField(primary_key=True) +# number = models.IntegerField(null=True, blank=True) +# text = models.TextField(blank=True) +# book_id = models.IntegerField(null=True, blank=True) +# class Meta: +# db_table = u'paragraph' + diff --git a/catalogue/templatetags/__init__.py b/catalogue/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/catalogue/templatetags/catalogue.py b/catalogue/templatetags/catalogue.py new file mode 100644 index 000000000..1bf250c18 --- /dev/null +++ b/catalogue/templatetags/catalogue.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- +from django import template +from django.template import Node, Variable +from django.utils.encoding import smart_str +from django.core.urlresolvers import reverse + + +register = template.Library() + + +def iterable(obj): + try: + iter(obj) + return True + except TypeError: + return False + + +def capfirst(text): + try: + return '%s%s' % (text[0].upper(), text[1:]) + except IndexError: + return '' + + +@register.simple_tag +def title_from_tags(tags): + def split_tags(tags): + result = {} + for tag in tags: + result[tag.category] = tag + return result + + class Flection(object): + def get_case(self, name, flection): + return name + flection = Flection() + + self = split_tags(tags) + + title = u'' + + # Specjalny przypadek "Twórczość w pozytywizmie", wtedy gdy tylko epoka + # jest wybrana przez użytkownika + if 'epoch' in self and len(self) == 1: + text = u'Twórczość w %s' % flection.get_case(unicode(self['epoch']), u'miejscownik') + return capfirst(text) + + # Specjalny przypadek "Dramat w twórczości Sofoklesa", wtedy gdy podane + # są tylko rodzaj literacki i autor + if 'kind' in self and 'author' in self and len(self) == 2: + text = u'%s w twórczości %s' % (unicode(self['kind']), + flection.get_case(unicode(self['author']), u'dopełniacz')) + return capfirst(text) + + # Przypadki ogólniejsze + if 'theme' in self: + title += u'Motyw %s' % unicode(self['theme']) + + if 'genre' in self: + if 'theme' in self: + title += u' w %s' % flection.get_case(unicode(self['genre']), u'miejscownik') + else: + title += unicode(self['genre']) + + if 'kind' in self or 'author' in self or 'epoch' in self: + if 'genre' in self or 'theme' in self: + if 'kind' in self: + title += u' w %s ' % flection.get_case(unicode(self['kind']), u'miejscownik') + else: + title += u' w twórczości ' + else: + title += u'%s ' % unicode(self.get('kind', u'twórczość')) + + if 'author' in self: + title += flection.get_case(unicode(self['author']), u'dopełniacz') + elif 'epoch' in self: + title += flection.get_case(unicode(self['epoch']), u'dopełniacz') + + return capfirst(title) + + +@register.tag +def catalogue_url(parser, token): + bits = token.split_contents() + tag_name = bits[0] + + tags_to_add = [] + tags_to_remove = [] + for bit in bits[1:]: + if bit[0] == '-': + tags_to_remove.append(bit[1:]) + else: + tags_to_add.append(bit) + + return CatalogueURLNode(tags_to_add, tags_to_remove) + + +class CatalogueURLNode(Node): + def __init__(self, tags_to_add, tags_to_remove): + self.tags_to_add = [Variable(tag) for tag in tags_to_add] + self.tags_to_remove = [Variable(tag) for tag in tags_to_remove] + + def render(self, context): + tags_to_add = [] + tags_to_remove = [] + + for tag_variable in self.tags_to_add: + tag = tag_variable.resolve(context) + if isinstance(tag, (list, dict)): + tags_to_add += [t for t in tag] + else: + tags_to_add.append(tag) + + for tag_variable in self.tags_to_remove: + tag = tag_variable.resolve(context) + if iterable(tag): + tags_to_remove += [t for t in tag] + else: + tags_to_remove.append(tag) + + tag_slugs = [tag.slug for tag in tags_to_add] + for tag in tags_to_remove: + try: + tag_slugs.remove(tag.slug) + except KeyError: + pass + + if len(tag_slugs) > 0: + return reverse('tagged_book_list', kwargs={'tags': '/'.join(tag_slugs)}) + else: + return reverse('main_page') + + +@register.inclusion_tag('catalogue/latest_blog_posts.html') +def latest_blog_posts(feed_url, posts_to_show=5): + import feedparser + import datetime + + feed = feedparser.parse(feed_url) + posts = [] + for i in range(posts_to_show): + pub_date = feed['entries'][i].updated_parsed + published = datetime.date(pub_date[0], pub_date[1], pub_date[2] ) + posts.append({ + 'title': feed['entries'][i].title, + 'summary': feed['entries'][i].summary, + 'link': feed['entries'][i].link, + 'date': published, + }) + return {'posts': posts} + diff --git a/catalogue/urls.py b/catalogue/urls.py new file mode 100644 index 000000000..fb20dd1f5 --- /dev/null +++ b/catalogue/urls.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +import os + +from django.conf.urls.defaults import * +from django.views.generic.simple import redirect_to + + +urlpatterns = patterns('catalogue.views', + url(r'^$', 'main_page', name='main_page'), + url(r'^lektury/', 'book_list'), + url(r'^lektura/(?P[a-zA-Z0-9-]+)/zestawy/', 'book_sets'), + url(r'^zestawy/nowy/$', 'new_set'), + url(r'^lektura/(?P[a-zA-Z0-9-]+)/$', 'book_detail'), + url(r'^tags/$', 'tags_starting_with', name='hint'), + url(r'^(?P[a-zA-Z-/]+)/$', 'tagged_book_list', name='tagged_book_list'), +) + diff --git a/catalogue/utils.py b/catalogue/utils.py new file mode 100644 index 000000000..d1cee5045 --- /dev/null +++ b/catalogue/utils.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + + +def split_tags(tags): + result = {} + for tag in tags: + result.setdefault(tag.category, []).append(tag) + return result + diff --git a/catalogue/views.py b/catalogue/views.py new file mode 100644 index 000000000..a0315a4c6 --- /dev/null +++ b/catalogue/views.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- +from django.template import RequestContext +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponse, HttpResponseRedirect, Http404 +from django.core.urlresolvers import reverse +from django.db.models import Q +from django.contrib.auth.decorators import login_required +from django.utils.datastructures import SortedDict +from django.views.decorators.http import require_POST + +from catalogue import models +from catalogue import forms +from catalogue.utils import split_tags + + +def catalogue_redirect(request, tags=''): + if len(request.GET['q']) > 0: + try: + tag = models.Tag.objects.get(name=request.GET['q']) + if len(tags): + tags += '/' + tags = tags + tag.slug + except models.Tag.DoesNotExist: + book = get_object_or_404(models.Book, title=request.GET['q']) + return HttpResponseRedirect(book.get_absolute_url()) + if len(tags) > 0: + return HttpResponseRedirect(reverse('catalogue.views.tagged_book_list', kwargs=dict(tags=tags))) + else: + return HttpResponseRedirect(reverse('catalogue.views.main_page')) + + +def tags_starting_with(request): + try: + prefix = request.GET['q'] + if len(prefix) < 2: + raise KeyError + + books = models.Book.objects.filter(title__icontains=prefix) + tags = models.Tag.objects.filter(name__icontains=prefix) + if request.user.is_authenticated(): + tags = tags.filter(~Q(category='set') | Q(user=request.user)) + else: + tags = tags.filter(~Q(category='set')) + + completions = [book.title for book in books] + [tag.name for tag in tags] + + return HttpResponse('\n'.join(completions)) + + except KeyError: + return HttpResponse('') + + +def main_page(request): + if 'q' in request.GET: + return catalogue_redirect(request) + + if request.user.is_authenticated(): + extra_where = '(NOT catalogue_tag.category = "set" OR catalogue_tag.user_id = %d)' % request.user.id + else: + extra_where = 'NOT catalogue_tag.category = "set"' + tags = models.Tag.objects.usage_for_model(models.Book, counts=True, extra={'where': [extra_where]}) + categories = split_tags(tags) + + form = forms.SearchForm() + return render_to_response('catalogue/main_page.html', locals(), + context_instance=RequestContext(request)) + + +def book_list(request): + if 'q' in request.GET: + return catalogue_redirect(request) + + books = models.Book.objects.all() + form = forms.SearchForm() + + books_by_first_letter = SortedDict() + for book in books: + books_by_first_letter.setdefault(book.title[0], []).append(book) + + return render_to_response('catalogue/book_list.html', locals(), + context_instance=RequestContext(request)) + + +def tagged_book_list(request, tags=''): + if 'q' in request.GET: + return catalogue_redirect(request, tags) + + choices_split = tags.split('/') + tags = [] + for tag in choices_split: + tag = get_object_or_404(models.Tag, slug=tag) + if tag.category == 'set' and (not request.user.is_authenticated() or request.user != tag.user): + raise Http404 + tags.append(tag) + + books = models.Book.objects.with_all(tags) + + if request.user.is_authenticated(): + extra_where = '(NOT catalogue_tag.category = "set" OR catalogue_tag.user_id = %d)' % request.user.id + else: + extra_where = 'NOT catalogue_tag.category = "set"' + related_tags = models.Tag.objects.related_for_model(tags, models.Book, counts=True, extra={'where': [extra_where]}) + categories = split_tags(related_tags) + + form = forms.SearchForm() + + return render_to_response('catalogue/tagged_book_list.html', dict( + tags=tags, + form=form, + books=books, + categories=categories, + ), context_instance=RequestContext(request)) + + +def book_detail(request, slug): + book = get_object_or_404(models.Book, slug=slug) + tags = list(book.tags.filter(~Q(category='set'))) + categories = split_tags(tags) + search_form = forms.SearchForm() + + return render_to_response('catalogue/book_detail.html', locals(), + context_instance=RequestContext(request)) + + +@login_required +def book_sets(request, slug): + book = get_object_or_404(models.Book, slug=slug) + user_sets = models.Tag.objects.filter(category='set', user=request.user) + book_sets = book.tags.filter(category='set', user=request.user) + + if request.method == 'POST': + form = forms.BookSetsForm(book, request.user, request.POST) + if form.is_valid(): + book.tags = ([models.Tag.objects.get(pk=id) for id in form.cleaned_data['set_ids']] + + list(book.tags.filter(~Q(category='set') | ~Q(user=request.user)))) + if request.is_ajax(): + return HttpResponse('

Zestawy zostały zapisane

') + else: + return HttpResponseRedirect('/') + else: + form = forms.BookSetsForm(book, request.user) + new_set_form = forms.NewSetForm() + + return render_to_response('catalogue/book_sets.html', locals(), + context_instance=RequestContext(request)) + +@login_required +@require_POST +def new_set(request): + new_set_form = forms.NewSetForm(request.POST) + if new_set_form.is_valid(): + new_set = new_set_form.save(request.user) + return HttpResponse('

Zestaw %s został utworzony

' % new_set) + + return render_to_response('catalogue/book_sets.html', locals(), + context_instance=RequestContext(request)) + diff --git a/chunks/__init__.py b/chunks/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/chunks/admin.py b/chunks/admin.py new file mode 100644 index 000000000..29c1fc24f --- /dev/null +++ b/chunks/admin.py @@ -0,0 +1,11 @@ +from django.contrib import admin + +from chunks.models import Chunk + + +class ChunkAdmin(admin.ModelAdmin): + list_display = ('key',) + search_fields = ('key', 'content') + +admin.site.register(Chunk, ChunkAdmin) + diff --git a/chunks/models.py b/chunks/models.py new file mode 100644 index 000000000..ac164524b --- /dev/null +++ b/chunks/models.py @@ -0,0 +1,22 @@ +from django.db import models +from django.utils.translation import ugettext_lazy as _ + + +class Chunk(models.Model): + """ + A Chunk is a piece of content associated + with a unique key that can be inserted into + any template with the use of a special template + tag + """ + key = models.CharField(_('key'), help_text=_('A unique name for this chunk of content'), primary_key=True, max_length=255) + content = models.TextField(_('content'), blank=True) + + class Meta: + ordering = ('key',) + verbose_name = _('chunk') + verbose_name_plural = _('chunks') + + def __unicode__(self): + return u'%s' % (self.key,) + diff --git a/chunks/templatetags/__init__.py b/chunks/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/chunks/templatetags/chunks.py b/chunks/templatetags/chunks.py new file mode 100644 index 000000000..fe8efdefe --- /dev/null +++ b/chunks/templatetags/chunks.py @@ -0,0 +1,45 @@ +from django import template +from django.db import models +from django.core.cache import cache + +register = template.Library() + +Chunk = models.get_model('chunks', 'chunk') +CACHE_PREFIX = "chunk_" + +def do_get_chunk(parser, token): + # split_contents() knows not to split quoted strings. + tokens = token.split_contents() + if len(tokens) < 2 or len(tokens) > 3: + raise template.TemplateSyntaxError, "%r tag should have either 2 or 3 arguments" % (tokens[0],) + if len(tokens) == 2: + tag_name, key = tokens + cache_time = 0 + if len(tokens) == 3: + tag_name, key, cache_time = tokens + # Check to see if the key is properly double/single quoted + if not (key[0] == key[-1] and key[0] in ('"', "'")): + raise template.TemplateSyntaxError, "%r tag's argument should be in quotes" % tag_name + # Send key without quotes and caching time + return ChunkNode(key[1:-1], cache_time) + +class ChunkNode(template.Node): + def __init__(self, key, cache_time=0): + self.key = key + self.cache_time = cache_time + + def render(self, context): + try: + cache_key = CACHE_PREFIX + self.key + c = cache.get(cache_key) + if c is None: + c = Chunk.objects.get(key=self.key) + cache.set(cache_key, c, int(self.cache_time)) + content = c.content + except Chunk.DoesNotExist: + n = Chunk(key=self.key) + n.save() + return 'SOME TEXT PLEASE' + return content + +register.tag('chunk', do_get_chunk) diff --git a/compress/__init__.py b/compress/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compress/conf/__init__.py b/compress/conf/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compress/conf/settings.py b/compress/conf/settings.py new file mode 100644 index 000000000..f6949a201 --- /dev/null +++ b/compress/conf/settings.py @@ -0,0 +1,22 @@ +from django.core.exceptions import ImproperlyConfigured +from django.conf import settings + +COMPRESS = getattr(settings, 'COMPRESS', not settings.DEBUG) +COMPRESS_AUTO = getattr(settings, 'COMPRESS_AUTO', True) +COMPRESS_VERSION = getattr(settings, 'COMPRESS_VERSION', False) +COMPRESS_VERSION_PLACEHOLDER = getattr(settings, 'COMPRESS_VERSION_PLACEHOLDER', '?') +COMPRESS_VERSION_DEFAULT = getattr(settings, 'COMPRESS_VERSION_DEFAULT', '0') + +COMPRESS_CSS_FILTERS = getattr(settings, 'COMPRESS_CSS_FILTERS', ['compress.filters.csstidy.CSSTidyFilter']) +COMPRESS_JS_FILTERS = getattr(settings, 'COMPRESS_JS_FILTERS', ['compress.filters.jsmin.JSMinFilter']) +COMPRESS_CSS = getattr(settings, 'COMPRESS_CSS', {}) +COMPRESS_JS = getattr(settings, 'COMPRESS_JS', {}) + +if COMPRESS_CSS_FILTERS is None: + COMPRESS_CSS_FILTERS = [] + +if COMPRESS_JS_FILTERS is None: + COMPRESS_JS_FILTERS = [] + +if COMPRESS_VERSION and not COMPRESS_AUTO: + raise ImproperlyConfigured('COMPRESS_AUTO needs to be True when using COMPRESS_VERSION.') diff --git a/compress/filter_base.py b/compress/filter_base.py new file mode 100644 index 000000000..9b98531b6 --- /dev/null +++ b/compress/filter_base.py @@ -0,0 +1,14 @@ +class FilterBase: + def __init__(self, verbose): + self.verbose = verbose + + def filter_css(self, css): + raise NotImplementedError + def filter_js(self, js): + raise NotImplementedError + +class FilterError(Exception): + """ + This exception is raised when a filter fails + """ + pass \ No newline at end of file diff --git a/compress/filters/__init__.py b/compress/filters/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compress/filters/csstidy/__init__.py b/compress/filters/csstidy/__init__.py new file mode 100644 index 000000000..d40e8eebb --- /dev/null +++ b/compress/filters/csstidy/__init__.py @@ -0,0 +1,33 @@ +import os +import warnings +import tempfile + +from django.conf import settings + +from compress.filter_base import FilterBase + +BINARY = getattr(settings, 'CSSTIDY_BINARY', 'csstidy') +ARGUMENTS = getattr(settings, 'CSSTIDY_ARGUMENTS', '--template=highest') + +warnings.simplefilter('ignore', RuntimeWarning) + +class CSSTidyFilter(FilterBase): + def filter_css(self, css): + tmp_file = tempfile.NamedTemporaryFile(mode='w+b') + tmp_file.write(css) + tmp_file.flush() + + output_file = tempfile.NamedTemporaryFile(mode='w+b') + + command = '%s %s %s %s' % (BINARY, tmp_file.name, ARGUMENTS, output_file.name) + + command_output = os.popen(command).read() + + filtered_css = output_file.read() + output_file.close() + tmp_file.close() + + if self.verbose: + print command_output + + return filtered_css diff --git a/compress/filters/csstidy_python/__init__.py b/compress/filters/csstidy_python/__init__.py new file mode 100644 index 000000000..7d581ed43 --- /dev/null +++ b/compress/filters/csstidy_python/__init__.py @@ -0,0 +1,19 @@ +from django.conf import settings + +from compress.filter_base import FilterBase +from compress.filters.csstidy_python.csstidy import CSSTidy + +COMPRESS_CSSTIDY_SETTINGS = getattr(settings, 'COMPRESS_CSSTIDY_SETTINGS', {}) + +class CSSTidyFilter(FilterBase): + def filter_css(self, css): + tidy = CSSTidy() + + for k, v in COMPRESS_CSSTIDY_SETTINGS.items(): + tidy.setSetting(k, v) + + tidy.parse(css) + + r = tidy.Output('string') + + return r diff --git a/compress/filters/csstidy_python/csstidy.py b/compress/filters/csstidy_python/csstidy.py new file mode 100644 index 000000000..6ae8dc732 --- /dev/null +++ b/compress/filters/csstidy_python/csstidy.py @@ -0,0 +1,636 @@ +# CSSTidy - CSS Parse +# +# CSS Parser class +# +# This file is part of CSSTidy. +# +# CSSTidy is free software you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation either version 2 of the License, or +# (at your option) any later version. +# +# CSSTidy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with CSSTidy if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# @license http://opensource.org/licenses/gpl-license.php GNU Public License +# @package csstidy +# @author Dj Gilcrease (digitalxero at gmail dot com) 2005-2006 + +import re + +from optimizer import CSSOptimizer +from output import CSSPrinter +import data +from tools import SortedDict + +class CSSTidy(object): + #Saves the parsed CSS + _css = "" + _raw_css = SortedDict() + _optimized_css = SortedDict() + + #List of Tokens + _tokens = [] + + #Printer class + _output = None + + #Optimiser class + _optimizer = None + + #Saves the CSS charset (@charset) + _charset = '' + + #Saves all @import URLs + _import = [] + + #Saves the namespace + _namespace = '' + + #Contains the version of csstidy + _version = '1.3' + + #Stores the settings + _settings = {} + + # Saves the parser-status. + # + # Possible values: + # - is = in selector + # - ip = in property + # - iv = in value + # - instr = in string (started at " or ' or ( ) + # - ic = in comment (ignore everything) + # - at = in @-block + _status = 'is' + + #Saves the current at rule (@media) + _at = '' + + #Saves the current selector + _selector = '' + + #Saves the current property + _property = '' + + #Saves the position of , in selectors + _sel_separate = [] + + #Saves the current value + _value = '' + + #Saves the current sub-value + _sub_value = '' + + #Saves all subvalues for a property. + _sub_value_arr = [] + + #Saves the char which opened the last string + _str_char = '' + _cur_string = '' + + #Status from which the parser switched to ic or instr + _from = '' + + #Variable needed to manage string-in-strings, for example url("foo.png") + _str_in_str = False + + #=True if in invalid at-rule + _invalid_at = False + + #=True if something has been added to the current selector + _added = False + + #Saves the message log + _log = SortedDict() + + #Saves the line number + _line = 1 + + def __init__(self): + self._settings['remove_bslash'] = True + self._settings['compress_colors'] = True + self._settings['compress_font-weight'] = True + self._settings['lowercase_s'] = False + self._settings['optimise_shorthands'] = 2 + self._settings['remove_last_'] = False + self._settings['case_properties'] = 1 + self._settings['sort_properties'] = False + self._settings['sort_selectors'] = False + self._settings['merge_selectors'] = 2 + self._settings['discard_invalid_properties'] = False + self._settings['css_level'] = 'CSS2.1' + self._settings['preserve_css'] = False + self._settings['timestamp'] = False + self._settings['template'] = 'highest_compression' + + #Maps self._status to methods + self.__statusMethod = {'is':self.__parseStatus_is, 'ip': self.__parseStatus_ip, 'iv':self.__parseStatus_iv, 'instr':self.__parseStatus_instr, 'ic':self.__parseStatus_ic, 'at':self.__parseStatus_at} + + self._output = CSSPrinter(self) + self._optimizer = CSSOptimizer(self) + + #Public Methods + def getSetting(self, setting): + return self._settings.get(setting, False) + + #Set the value of a setting. + def setSetting(self, setting, value): + self._settings[setting] = value + return True + + def log(self, message, ttype, line = -1): + if line == -1: + line = self._line + + line = int(line) + + add = {'m': message, 't': ttype} + + if not self._log.has_key(line): + self._log[line] = [] + self._log[line].append(add) + elif add not in self._log[line]: + self._log[line].append(add) + + + #Checks if a character is escaped (and returns True if it is) + def escaped(self, string, pos): + return not (string[pos-1] != '\\' or self.escaped(string, pos-1)) + + #Adds CSS to an existing media/selector + def merge_css_blocks(self, media, selector, css_add): + for prop, value in css_add.iteritems(): + self.__css_add_property(media, selector, prop, value, False) + + #Checks if $value is !important. + def is_important(self, value): + return '!important' in value.lower() + + #Returns a value without !important + def gvw_important(self, value): + if self.is_important(value): + ret = value.strip() + ret = ret[0:-9] + ret = ret.strip() + ret = ret[0:-1] + ret = ret.strip() + return ret + + return value + + def parse(self, cssString): + #Switch from \r\n to \n + self._css = cssString.replace("\r\n", "\n") + ' ' + self._raw_css = {} + self._optimized_css = {} + self._curComment = '' + + #Start Parsing + i = 0 + while i < len(cssString): + if self._css[i] == "\n" or self._css[i] == "\r": + self._line += 1 + + i += self.__statusMethod[self._status](i) + + i += 1; + + self._optimized_css = self._optimizer.optimize(self._raw_css) + + def parseFile(self, filename): + try: + f = open(filename, "r") + self.parse(f.read()) + finally: + f.close() + + #Private Methods + def __parseStatus_is(self, idx): + """ + Parse in Selector + """ + ret = 0 + + if self.__is_token(self._css, idx): + if self._css[idx] == '/' and self._css[idx+1] == '*' and self._selector.strip() == '': + self._status = 'ic' + self._from = 'is' + return 1 + + elif self._css[idx] == '@' and self._selector.strip() == '': + #Check for at-rule + self._invalid_at = True + + for name, ttype in data.at_rules.iteritems(): + if self._css[idx+1:len(name)].lower() == name.lower(): + if ttype == 'at': + self._at = '@' + name + else: + self._selector = '@' + name + + self._status = ttype + self._invalid_at = False + ret += len(name) + + if self._invalid_at: + self._selector = '@' + invalid_at_name = '' + for j in xrange(idx+1, len(self._css)): + if not self._css[j].isalpha(): + break; + + invalid_at_name += self._css[j] + + self.log('Invalid @-rule: ' + invalid_at_name + ' (removed)', 'Warning') + + elif self._css[idx] == '"' or self._css[idx] == "'": + self._cur_string = self._css[idx] + self._status = 'instr' + self._str_char = self._css[idx] + self._from = 'is' + + elif self._invalid_at and self._css[idx] == ';': + self._invalid_at = False + self._status = 'is' + + elif self._css[idx] == '{': + self._status = 'ip' + self.__add_token(data.SEL_START, self._selector) + self._added = False; + + elif self._css[idx] == '}': + self.__add_token(data.AT_END, self._at) + self._at = '' + self._selector = '' + self._sel_separate = [] + + elif self._css[idx] == ',': + self._selector = self._selector.strip() + ',' + self._sel_separate.append(len(self._selector)) + + elif self._css[idx] == '\\': + self._selector += self.__unicode(idx) + + #remove unnecessary universal selector, FS#147 + elif not (self._css[idx] == '*' and self._css[idx+1] in ('.', '#', '[', ':')): + self._selector += self._css[idx] + + else: + lastpos = len(self._selector)-1 + + if lastpos == -1 or not ((self._selector[lastpos].isspace() or self.__is_token(self._selector, lastpos) and self._selector[lastpos] == ',') and self._css[idx].isspace()): + self._selector += self._css[idx] + + return ret + + def __parseStatus_ip(self, idx): + """ + Parse in property + """ + if self.__is_token(self._css, idx): + if (self._css[idx] == ':' or self._css[idx] == '=') and self._property != '': + self._status = 'iv' + + if not self.getSetting('discard_invalid_properties') or self.__property_is_valid(self._property): + self.__add_token(data.PROPERTY, self._property) + + elif self._css[idx] == '/' and self._css[idx+1] == '*' and self._property == '': + self._status = 'ic' + self._from = 'ip' + return 1 + + elif self._css[idx] == '}': + self.__explode_selectors() + self._status = 'is' + self._invalid_at = False + self.__add_token(data.SEL_END, self._selector) + self._selector = '' + self._property = '' + + elif self._css[idx] == ';': + self._property = '' + + elif self._css[idx] == '\\': + self._property += self.__unicode(idx) + + elif not self._css[idx].isspace(): + self._property += self._css[idx] + + return 0 + + def __parseStatus_iv(self, idx): + """ + Parse in value + """ + pn = (( self._css[idx] == "\n" or self._css[idx] == "\r") and self.__property_is_next(idx+1) or idx == len(self._css)) #CHECK# + if self.__is_token(self._css, idx) or pn: + if self._css[idx] == '/' and self._css[idx+1] == '*': + self._status = 'ic' + self._from = 'iv' + return 1 + + elif self._css[idx] == '"' or self._css[idx] == "'" or self._css[idx] == '(': + self._cur_string = self._css[idx] + self._str_char = ')' if self._css[idx] == '(' else self._css[idx] + self._status = 'instr' + self._from = 'iv' + + elif self._css[idx] == ',': + self._sub_value = self._sub_value.strip() + ',' + + elif self._css[idx] == '\\': + self._sub_value += self.__unicode(idx) + + elif self._css[idx] == ';' or pn: + if len(self._selector) > 0 and self._selector[0] == '@' and data.at_rules.has_key(self._selector[1:]) and data.at_rules[self._selector[1:]] == 'iv': + self._sub_value_arr.append(self._sub_value.strip()) + + self._status = 'is' + + if '@charset' in self._selector: + self._charset = self._sub_value_arr[0] + + elif '@namespace' in self._selector: + self._namespace = ' '.join(self._sub_value_arr) + + elif '@import' in self._selector: + self._import.append(' '.join(self._sub_value_arr)) + + + self._sub_value_arr = [] + self._sub_value = '' + self._selector = '' + self._sel_separate = [] + + else: + self._status = 'ip' + + elif self._css[idx] != '}': + self._sub_value += self._css[idx] + + if (self._css[idx] == '}' or self._css[idx] == ';' or pn) and self._selector != '': + if self._at == '': + self._at = data.DEFAULT_AT + + #case settings + if self.getSetting('lowercase_s'): + self._selector = self._selector.lower() + + self._property = self._property.lower() + + if self._sub_value != '': + self._sub_value_arr.append(self._sub_value) + self._sub_value = '' + + self._value = ' '.join(self._sub_value_arr) + + + self._selector = self._selector.strip() + + valid = self.__property_is_valid(self._property) + + if (not self._invalid_at or self.getSetting('preserve_css')) and (not self.getSetting('discard_invalid_properties') or valid): + self.__css_add_property(self._at, self._selector, self._property, self._value) + self.__add_token(data.VALUE, self._value) + + if not valid: + if self.getSetting('discard_invalid_properties'): + self.log('Removed invalid property: ' + self._property, 'Warning') + + else: + self.log('Invalid property in ' + self.getSetting('css_level').upper() + ': ' + self._property, 'Warning') + + self._property = ''; + self._sub_value_arr = [] + self._value = '' + + if self._css[idx] == '}': + self.__explode_selectors() + self.__add_token(data.SEL_END, self._selector) + self._status = 'is' + self._invalid_at = False + self._selector = '' + + elif not pn: + self._sub_value += self._css[idx] + + if self._css[idx].isspace(): + if self._sub_value != '': + self._sub_value_arr.append(self._sub_value) + self._sub_value = '' + + return 0 + + def __parseStatus_instr(self, idx): + """ + Parse in String + """ + if self._str_char == ')' and (self._css[idx] == '"' or self._css[idx] == "'") and not self.escaped(self._css, idx): + self._str_in_str = not self._str_in_str + + temp_add = self._css[idx] # ...and no not-escaped backslash at the previous position + if (self._css[idx] == "\n" or self._css[idx] == "\r") and not (self._css[idx-1] == '\\' and not self.escaped(self._css, idx-1)): + temp_add = "\\A " + self.log('Fixed incorrect newline in string', 'Warning') + + if not (self._str_char == ')' and self._css[idx].isspace() and not self._str_in_str): + self._cur_string += temp_add + + if self._css[idx] == self._str_char and not self.escaped(self._css, idx) and not self._str_in_str: + self._status = self._from + regex = re.compile(r'([\s]+)', re.I | re.U | re.S) + if regex.match(self._cur_string) is None and self._property != 'content': + if self._str_char == '"' or self._str_char == "'": + self._cur_string = self._cur_string[1:-1] + + elif len(self._cur_string) > 3 and (self._cur_string[1] == '"' or self._cur_string[1] == "'"): + self._cur_string = self._cur_string[0] + self._cur_string[2:-2] + self._cur_string[-1] + + if self._from == 'iv': + self._sub_value += self._cur_string + + elif self._from == 'is': + self._selector += self._cur_string + + return 0 + + def __parseStatus_ic(self, idx): + """ + Parse css In Comment + """ + if self._css[idx] == '*' and self._css[idx+1] == '/': + self._status = self._from + self.__add_token(data.COMMENT, self._curComment) + self._curComment = '' + return 1 + + else: + self._curComment += self._css[idx] + + return 0 + + def __parseStatus_at(self, idx): + """ + Parse in at-block + """ + if self.__is_token(string, idx): + if self._css[idx] == '/' and self._css[idx+1] == '*': + self._status = 'ic' + self._from = 'at' + return 1 + + elif self._css[i] == '{': + self._status = 'is' + self.__add_token(data.AT_START, self._at) + + elif self._css[i] == ',': + self._at = self._at.strip() + ',' + + elif self._css[i] == '\\': + self._at += self.__unicode(i) + else: + lastpos = len(self._at)-1 + if not (self._at[lastpos].isspace() or self.__is_token(self._at, lastpos) and self._at[lastpos] == ',') and self._css[i].isspace(): + self._at += self._css[i] + + return 0 + + def __explode_selectors(self): + #Explode multiple selectors + if self.getSetting('merge_selectors') == 1: + new_sels = [] + lastpos = 0; + self._sel_separate.append(len(self._selector)) + + for num in xrange(len(self._sel_separate)): + pos = self._sel_separate[num] + if num == (len(self._sel_separate)): #CHECK# + pos += 1 + + new_sels.append(self._selector[lastpos:(pos-lastpos-1)]) + lastpos = pos + + if len(new_sels) > 1: + for selector in new_sels: + self.merge_css_blocks(self._at, selector, self._raw_css[self._at][self._selector]) + + del self._raw_css[self._at][self._selector] + + self._sel_separate = [] + + #Adds a property with value to the existing CSS code + def __css_add_property(self, media, selector, prop, new_val): + if self.getSetting('preserve_css') or new_val.strip() == '': + return + + if not self._raw_css.has_key(media): + self._raw_css[media] = SortedDict() + + if not self._raw_css[media].has_key(selector): + self._raw_css[media][selector] = SortedDict() + + self._added = True + if self._raw_css[media][selector].has_key(prop): + if (self.is_important(self._raw_css[media][selector][prop]) and self.is_important(new_val)) or not self.is_important(self._raw_css[media][selector][prop]): + del self._raw_css[media][selector][prop] + self._raw_css[media][selector][prop] = new_val.strip() + + else: + self._raw_css[media][selector][prop] = new_val.strip() + + #Checks if the next word in a string from pos is a CSS property + def __property_is_next(self, pos): + istring = self._css[pos: len(self._css)] + pos = istring.find(':') + if pos == -1: + return False; + + istring = istring[:pos].strip().lower() + if data.all_properties.has_key(istring): + self.log('Added semicolon to the end of declaration', 'Warning') + return True + + return False; + + #Checks if a property is valid + def __property_is_valid(self, prop): + return (data.all_properties.has_key(prop) and data.all_properties[prop].find(self.getSetting('css_level').upper()) != -1) + + #Adds a token to self._tokens + def __add_token(self, ttype, cssdata, do=False): + if self.getSetting('preserve_css') or do: + if ttype == data.COMMENT: + token = [ttype, cssdata] + else: + token = [ttype, cssdata.strip()] + + self._tokens.append(token) + + #Parse unicode notations and find a replacement character + def __unicode(self, idx): + ##FIX## + return '' + + #Starts parsing from URL + ##USED? + def __parse_from_url(self, url): + try: + if "http" in url.lower() or "https" in url.lower(): + f = urllib.urlopen(url) + else: + f = open(url) + + data = f.read() + return self.parse(data) + finally: + f.close() + + #Checks if there is a token at the current position + def __is_token(self, string, idx): + return (string[idx] in data.tokens and not self.escaped(string, idx)) + + + #Property Methods + def _getOutput(self): + self._output.prepare(self._optimized_css) + return self._output.render + + def _getLog(self): + ret = "" + ks = self._log.keys() + ks.sort() + for line in ks: + for msg in self._log[line]: + ret += "Type: " + msg['t'] + "\n" + ret += "Message: " + msg['m'] + "\n" + ret += "\n" + + return ret + + def _getCSS(self): + return self._css + + + #Properties + Output = property(_getOutput, None) + Log = property(_getLog, None) + CSS = property(_getCSS, None) + + +if __name__ == '__main__': + import sys + tidy = CSSTidy() + f = open(sys.argv[1], "r") + css = f.read() + f.close() + tidy.parse(css) + tidy.Output('file', filename="Stylesheet.min.css") + print tidy.Output() + #print tidy._import \ No newline at end of file diff --git a/compress/filters/csstidy_python/data.py b/compress/filters/csstidy_python/data.py new file mode 100644 index 000000000..bd728cbaa --- /dev/null +++ b/compress/filters/csstidy_python/data.py @@ -0,0 +1,421 @@ +# Various CSS Data for CSSTidy +# +# This file is part of CSSTidy. +# +# CSSTidy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# CSSTidy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with CSSTidy; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# @license http://opensource.org/licenses/gpl-license.php GNU Public License +# @package csstidy +# @author Florian Schmitz (floele at gmail dot com) 2005 + +AT_START = 1 +AT_END = 2 +SEL_START = 3 +SEL_END = 4 +PROPERTY = 5 +VALUE = 6 +COMMENT = 7 +DEFAULT_AT = 41 + +# All whitespace allowed in CSS +# +# @global array whitespace +# @version 1.0 +whitespace = frozenset([' ',"\n","\t","\r","\x0B"]) + +# All CSS tokens used by csstidy +# +# @global string tokens +# @version 1.0 +tokens = '/@}{;:=\'"(,\\!$%&)#+.<>?[]^`|~' + +# All CSS units (CSS 3 units included) +# +# @see compress_numbers() +# @global array units +# @version 1.0 +units = frozenset(['in','cm','mm','pt','pc','px','rem','em','%','ex','gd','vw','vh','vm','deg','grad','rad','ms','s','khz','hz']) + +# Available at-rules +# +# @global array at_rules +# @version 1.0 +at_rules = {'page':'is', 'font-face':'is', 'charset':'iv', 'import':'iv', 'namespace':'iv', 'media':'at'} + +# Properties that need a value with unit +# +# @todo CSS3 properties +# @see compress_numbers() +# @global array unit_values +# @version 1.2 +unit_values = frozenset(['background', 'background-position', 'border', 'border-top', 'border-right', 'border-bottom', + 'border-left', 'border-width', 'border-top-width', 'border-right-width', 'border-left-width', + 'border-bottom-width', 'bottom', 'border-spacing', 'font-size','height', 'left', 'margin', 'margin-top', + 'margin-right', 'margin-bottom', 'margin-left', 'max-height', 'max-width', 'min-height', 'min-width', + 'outline-width', 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left','position', + 'right', 'top', 'text-indent', 'letter-spacing', 'word-spacing', 'width' + ]) + + +# Properties that allow as value +# +# @todo CSS3 properties +# @see compress_numbers() +# @global array color_values +# @version 1.0 +color_values = frozenset(['background-color', 'border-color', 'border-top-color', 'border-right-color', + 'border-bottom-color', 'border-left-color', 'color', 'outline-color']) + + +# Default values for the background properties +# +# @todo Possibly property names will change during CSS3 development +# @global array background_prop_default +# @see dissolve_short_bg() +# @see merge_bg() +# @version 1.0 +background_prop_default = {} +background_prop_default['background-image'] = 'none' +background_prop_default['background-size'] = 'auto' +background_prop_default['background-repeat'] = 'repeat' +background_prop_default['background-position'] = '0 0' +background_prop_default['background-attachment'] = 'scroll' +background_prop_default['background-clip'] = 'border' +background_prop_default['background-origin'] = 'padding' +background_prop_default['background-color'] = 'transparent' + +# A list of non-W3C color names which get replaced by their hex-codes +# +# @global array replace_colors +# @see cut_color() +# @version 1.0 +replace_colors = {} +replace_colors['aliceblue'] = '#F0F8FF' +replace_colors['antiquewhite'] = '#FAEBD7' +replace_colors['aquamarine'] = '#7FFFD4' +replace_colors['azure'] = '#F0FFFF' +replace_colors['beige'] = '#F5F5DC' +replace_colors['bisque'] = '#FFE4C4' +replace_colors['blanchedalmond'] = '#FFEBCD' +replace_colors['blueviolet'] = '#8A2BE2' +replace_colors['brown'] = '#A52A2A' +replace_colors['burlywood'] = '#DEB887' +replace_colors['cadetblue'] = '#5F9EA0' +replace_colors['chartreuse'] = '#7FFF00' +replace_colors['chocolate'] = '#D2691E' +replace_colors['coral'] = '#FF7F50' +replace_colors['cornflowerblue'] = '#6495ED' +replace_colors['cornsilk'] = '#FFF8DC' +replace_colors['crimson'] = '#DC143C' +replace_colors['cyan'] = '#00FFFF' +replace_colors['darkblue'] = '#00008B' +replace_colors['darkcyan'] = '#008B8B' +replace_colors['darkgoldenrod'] = '#B8860B' +replace_colors['darkgray'] = '#A9A9A9' +replace_colors['darkgreen'] = '#006400' +replace_colors['darkkhaki'] = '#BDB76B' +replace_colors['darkmagenta'] = '#8B008B' +replace_colors['darkolivegreen'] = '#556B2F' +replace_colors['darkorange'] = '#FF8C00' +replace_colors['darkorchid'] = '#9932CC' +replace_colors['darkred'] = '#8B0000' +replace_colors['darksalmon'] = '#E9967A' +replace_colors['darkseagreen'] = '#8FBC8F' +replace_colors['darkslateblue'] = '#483D8B' +replace_colors['darkslategray'] = '#2F4F4F' +replace_colors['darkturquoise'] = '#00CED1' +replace_colors['darkviolet'] = '#9400D3' +replace_colors['deeppink'] = '#FF1493' +replace_colors['deepskyblue'] = '#00BFFF' +replace_colors['dimgray'] = '#696969' +replace_colors['dodgerblue'] = '#1E90FF' +replace_colors['feldspar'] = '#D19275' +replace_colors['firebrick'] = '#B22222' +replace_colors['floralwhite'] = '#FFFAF0' +replace_colors['forestgreen'] = '#228B22' +replace_colors['gainsboro'] = '#DCDCDC' +replace_colors['ghostwhite'] = '#F8F8FF' +replace_colors['gold'] = '#FFD700' +replace_colors['goldenrod'] = '#DAA520' +replace_colors['greenyellow'] = '#ADFF2F' +replace_colors['honeydew'] = '#F0FFF0' +replace_colors['hotpink'] = '#FF69B4' +replace_colors['indianred'] = '#CD5C5C' +replace_colors['indigo'] = '#4B0082' +replace_colors['ivory'] = '#FFFFF0' +replace_colors['khaki'] = '#F0E68C' +replace_colors['lavender'] = '#E6E6FA' +replace_colors['lavenderblush'] = '#FFF0F5' +replace_colors['lawngreen'] = '#7CFC00' +replace_colors['lemonchiffon'] = '#FFFACD' +replace_colors['lightblue'] = '#ADD8E6' +replace_colors['lightcoral'] = '#F08080' +replace_colors['lightcyan'] = '#E0FFFF' +replace_colors['lightgoldenrodyellow'] = '#FAFAD2' +replace_colors['lightgrey'] = '#D3D3D3' +replace_colors['lightgreen'] = '#90EE90' +replace_colors['lightpink'] = '#FFB6C1' +replace_colors['lightsalmon'] = '#FFA07A' +replace_colors['lightseagreen'] = '#20B2AA' +replace_colors['lightskyblue'] = '#87CEFA' +replace_colors['lightslateblue'] = '#8470FF' +replace_colors['lightslategray'] = '#778899' +replace_colors['lightsteelblue'] = '#B0C4DE' +replace_colors['lightyellow'] = '#FFFFE0' +replace_colors['limegreen'] = '#32CD32' +replace_colors['linen'] = '#FAF0E6' +replace_colors['magenta'] = '#FF00FF' +replace_colors['mediumaquamarine'] = '#66CDAA' +replace_colors['mediumblue'] = '#0000CD' +replace_colors['mediumorchid'] = '#BA55D3' +replace_colors['mediumpurple'] = '#9370D8' +replace_colors['mediumseagreen'] = '#3CB371' +replace_colors['mediumslateblue'] = '#7B68EE' +replace_colors['mediumspringgreen'] = '#00FA9A' +replace_colors['mediumturquoise'] = '#48D1CC' +replace_colors['mediumvioletred'] = '#C71585' +replace_colors['midnightblue'] = '#191970' +replace_colors['mintcream'] = '#F5FFFA' +replace_colors['mistyrose'] = '#FFE4E1' +replace_colors['moccasin'] = '#FFE4B5' +replace_colors['navajowhite'] = '#FFDEAD' +replace_colors['oldlace'] = '#FDF5E6' +replace_colors['olivedrab'] = '#6B8E23' +replace_colors['orangered'] = '#FF4500' +replace_colors['orchid'] = '#DA70D6' +replace_colors['palegoldenrod'] = '#EEE8AA' +replace_colors['palegreen'] = '#98FB98' +replace_colors['paleturquoise'] = '#AFEEEE' +replace_colors['palevioletred'] = '#D87093' +replace_colors['papayawhip'] = '#FFEFD5' +replace_colors['peachpuff'] = '#FFDAB9' +replace_colors['peru'] = '#CD853F' +replace_colors['pink'] = '#FFC0CB' +replace_colors['plum'] = '#DDA0DD' +replace_colors['powderblue'] = '#B0E0E6' +replace_colors['rosybrown'] = '#BC8F8F' +replace_colors['royalblue'] = '#4169E1' +replace_colors['saddlebrown'] = '#8B4513' +replace_colors['salmon'] = '#FA8072' +replace_colors['sandybrown'] = '#F4A460' +replace_colors['seagreen'] = '#2E8B57' +replace_colors['seashell'] = '#FFF5EE' +replace_colors['sienna'] = '#A0522D' +replace_colors['skyblue'] = '#87CEEB' +replace_colors['slateblue'] = '#6A5ACD' +replace_colors['slategray'] = '#708090' +replace_colors['snow'] = '#FFFAFA' +replace_colors['springgreen'] = '#00FF7F' +replace_colors['steelblue'] = '#4682B4' +replace_colors['tan'] = '#D2B48C' +replace_colors['thistle'] = '#D8BFD8' +replace_colors['tomato'] = '#FF6347' +replace_colors['turquoise'] = '#40E0D0' +replace_colors['violet'] = '#EE82EE' +replace_colors['violetred'] = '#D02090' +replace_colors['wheat'] = '#F5DEB3' +replace_colors['whitesmoke'] = '#F5F5F5' +replace_colors['yellowgreen'] = '#9ACD32' + +#A list of optimized colors +optimize_colors = {} +optimize_colors['black'] = '#000' +optimize_colors['fuchsia'] = '#F0F' +optimize_colors['white'] = '#FFF' +optimize_colors['yellow'] = '#FF0' +optimize_colors['cyan'] = '#0FF' +optimize_colors['magenta'] = '#F0F' +optimize_colors['lightslategray'] = '#789' + +optimize_colors['#800000'] = 'maroon' +optimize_colors['#FFA500'] = 'orange' +optimize_colors['#808000'] = 'olive' +optimize_colors['#800080'] = 'purple' +optimize_colors['#008000'] = 'green' +optimize_colors['#000080'] = 'navy' +optimize_colors['#008080'] = 'teal' +optimize_colors['#C0C0C0'] = 'silver' +optimize_colors['#808080'] = 'gray' +optimize_colors['#4B0082'] = 'indigo' +optimize_colors['#FFD700'] = 'gold' +optimize_colors['#A52A2A'] = 'brown' +optimize_colors['#00FFFF'] = 'cyan' +optimize_colors['#EE82EE'] = 'violet' +optimize_colors['#DA70D6'] = 'orchid' +optimize_colors['#FFE4C4'] = 'bisque' +optimize_colors['#F0E68C'] = 'khaki' +optimize_colors['#F5DEB3'] = 'wheat' +optimize_colors['#FF7F50'] = 'coral' +optimize_colors['#F5F5DC'] = 'beige' +optimize_colors['#F0FFFF'] = 'azure' +optimize_colors['#A0522D'] = 'sienna' +optimize_colors['#CD853F'] = 'peru' +optimize_colors['#FFFFF0'] = 'ivory' +optimize_colors['#DDA0DD'] = 'plum' +optimize_colors['#D2B48C'] = 'tan' +optimize_colors['#FFC0CB'] = 'pink' +optimize_colors['#FFFAFA'] = 'snow' +optimize_colors['#FA8072'] = 'salmon' +optimize_colors['#FF6347'] = 'tomato' +optimize_colors['#FAF0E6'] = 'linen' +optimize_colors['#F00'] = 'red' + + +# A list of all shorthand properties that are devided into four properties and/or have four subvalues +# +# @global array shorthands +# @todo Are there new ones in CSS3? +# @see dissolve_4value_shorthands() +# @see merge_4value_shorthands() +# @version 1.0 +shorthands = {} +shorthands['border-color'] = ['border-top-color','border-right-color','border-bottom-color','border-left-color'] +shorthands['border-style'] = ['border-top-style','border-right-style','border-bottom-style','border-left-style'] +shorthands['border-width'] = ['border-top-width','border-right-width','border-bottom-width','border-left-width'] +shorthands['margin'] = ['margin-top','margin-right','margin-bottom','margin-left'] +shorthands['padding'] = ['padding-top','padding-right','padding-bottom','padding-left'] +shorthands['-moz-border-radius'] = 0 + +# All CSS Properties. Needed for csstidy::property_is_next() +# +# @global array all_properties +# @todo Add CSS3 properties +# @version 1.0 +# @see csstidy::property_is_next() +all_properties = {} +all_properties['background'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['background-color'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['background-image'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['background-repeat'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['background-attachment'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['background-position'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-top'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-right'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-bottom'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-left'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-color'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-top-color'] = 'CSS2.0,CSS2.1' +all_properties['border-bottom-color'] = 'CSS2.0,CSS2.1' +all_properties['border-left-color'] = 'CSS2.0,CSS2.1' +all_properties['border-right-color'] = 'CSS2.0,CSS2.1' +all_properties['border-style'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-top-style'] = 'CSS2.0,CSS2.1' +all_properties['border-right-style'] = 'CSS2.0,CSS2.1' +all_properties['border-left-style'] = 'CSS2.0,CSS2.1' +all_properties['border-bottom-style'] = 'CSS2.0,CSS2.1' +all_properties['border-width'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-top-width'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-right-width'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-left-width'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-bottom-width'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['border-collapse'] = 'CSS2.0,CSS2.1' +all_properties['border-spacing'] = 'CSS2.0,CSS2.1' +all_properties['bottom'] = 'CSS2.0,CSS2.1' +all_properties['caption-side'] = 'CSS2.0,CSS2.1' +all_properties['content'] = 'CSS2.0,CSS2.1' +all_properties['clear'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['clip'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['color'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['counter-reset'] = 'CSS2.0,CSS2.1' +all_properties['counter-increment'] = 'CSS2.0,CSS2.1' +all_properties['cursor'] = 'CSS2.0,CSS2.1' +all_properties['empty-cells'] = 'CSS2.0,CSS2.1' +all_properties['display'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['direction'] = 'CSS2.0,CSS2.1' +all_properties['float'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['font'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['font-family'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['font-style'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['font-variant'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['font-weight'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['font-stretch'] = 'CSS2.0' +all_properties['font-size-adjust'] = 'CSS2.0' +all_properties['font-size'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['height'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['left'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['line-height'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['list-style'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['list-style-type'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['list-style-image'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['list-style-position'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['margin'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['margin-top'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['margin-right'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['margin-bottom'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['margin-left'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['marks'] = 'CSS1.0,CSS2.0' +all_properties['marker-offset'] = 'CSS2.0' +all_properties['max-height'] = 'CSS2.0,CSS2.1' +all_properties['max-width'] = 'CSS2.0,CSS2.1' +all_properties['min-height'] = 'CSS2.0,CSS2.1' +all_properties['min-width'] = 'CSS2.0,CSS2.1' +all_properties['overflow'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['orphans'] = 'CSS2.0,CSS2.1' +all_properties['outline'] = 'CSS2.0,CSS2.1' +all_properties['outline-width'] = 'CSS2.0,CSS2.1' +all_properties['outline-style'] = 'CSS2.0,CSS2.1' +all_properties['outline-color'] = 'CSS2.0,CSS2.1' +all_properties['padding'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['padding-top'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['padding-right'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['padding-bottom'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['padding-left'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['page-break-before'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['page-break-after'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['page-break-inside'] = 'CSS2.0,CSS2.1' +all_properties['page'] = 'CSS2.0' +all_properties['position'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['quotes'] = 'CSS2.0,CSS2.1' +all_properties['right'] = 'CSS2.0,CSS2.1' +all_properties['size'] = 'CSS1.0,CSS2.0' +all_properties['speak-header'] = 'CSS2.0,CSS2.1' +all_properties['table-layout'] = 'CSS2.0,CSS2.1' +all_properties['top'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['text-indent'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['text-align'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['text-decoration'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['text-shadow'] = 'CSS2.0' +all_properties['letter-spacing'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['word-spacing'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['text-transform'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['white-space'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['unicode-bidi'] = 'CSS2.0,CSS2.1' +all_properties['vertical-align'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['visibility'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['width'] = 'CSS1.0,CSS2.0,CSS2.1' +all_properties['widows'] = 'CSS2.0,CSS2.1' +all_properties['z-index'] = 'CSS1.0,CSS2.0,CSS2.1' + +# Speech # +all_properties['volume'] = 'CSS2.0,CSS2.1' +all_properties['speak'] = 'CSS2.0,CSS2.1' +all_properties['pause'] = 'CSS2.0,CSS2.1' +all_properties['pause-before'] = 'CSS2.0,CSS2.1' +all_properties['pause-after'] = 'CSS2.0,CSS2.1' +all_properties['cue'] = 'CSS2.0,CSS2.1' +all_properties['cue-before'] = 'CSS2.0,CSS2.1' +all_properties['cue-after'] = 'CSS2.0,CSS2.1' +all_properties['play-during'] = 'CSS2.0,CSS2.1' +all_properties['azimuth'] = 'CSS2.0,CSS2.1' +all_properties['elevation'] = 'CSS2.0,CSS2.1' +all_properties['speech-rate'] = 'CSS2.0,CSS2.1' +all_properties['voice-family'] = 'CSS2.0,CSS2.1' +all_properties['pitch'] = 'CSS2.0,CSS2.1' +all_properties['pitch-range'] = 'CSS2.0,CSS2.1' +all_properties['stress'] = 'CSS2.0,CSS2.1' +all_properties['richness'] = 'CSS2.0,CSS2.1' +all_properties['speak-punctuation'] = 'CSS2.0,CSS2.1' +all_properties['speak-numeral'] = 'CSS2.0,CSS2.1' \ No newline at end of file diff --git a/compress/filters/csstidy_python/optimizer.py b/compress/filters/csstidy_python/optimizer.py new file mode 100644 index 000000000..7cd284cfc --- /dev/null +++ b/compress/filters/csstidy_python/optimizer.py @@ -0,0 +1,383 @@ +# CSSTidy - CSS Optimizer +# +# CSS Optimizer class +# +# This file is part of CSSTidy. +# +# CSSTidy is free software you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation either version 2 of the License, or +# (at your option) any later version. +# +# CSSTidy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with CSSTidy if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# @license http://opensource.org/licenses/gpl-license.php GNU Public License +# @package csstidy +# @author Dj Gilcrease (digitalxero at gmail dot com) 2005-2006 + +import data +from tools import SortedDict + + +class CSSOptimizer(object): + def __init__(self, parser): + #raw_css is a dict + self.parser = parser + self._optimized_css = SortedDict + + +#PUBLIC METHODS + def optimize(self, raw_css): + if self.parser.getSetting('preserve_css'): + return raw_css + + self._optimized_css = raw_css + + if self.parser.getSetting('merge_selectors') == 2: + self.__merge_selectors() + + ##OPTIMIZE## + for media, css in self._optimized_css.iteritems(): + for selector, cssdata in css.iteritems(): + if self.parser.getSetting('optimise_shorthands') >= 1: + cssdata = self.__merge_4value_shorthands(cssdata) + + if self.parser.getSetting('optimise_shorthands') >= 2: + cssdata = self.__merge_bg(cssdata) + + for item, value in cssdata.iteritems(): + value = self.__compress_numbers(item, value) + value = self.__compress_important(value) + + if item in data.color_values and self.parser.getSetting('compress_colors'): + old = value[:] + value = self.__compress_color(value) + if old != value: + self.parser.log('In "' + selector + '" Optimised ' + item + ': Changed ' + old + ' to ' + value, 'Information') + + if item == 'font-weight' and self.parser.getSetting('compress_font-weight'): + if value == 'bold': + value = '700' + self.parser.log('In "' + selector + '" Optimised font-weight: Changed "bold" to "700"', 'Information') + + elif value == 'normal': + value = '400' + self.parser.log('In "' + selector + '" Optimised font-weight: Changed "normal" to "400"', 'Information') + + self._optimized_css[media][selector][item] = value + + + return self._optimized_css + + +#PRIVATE METHODS + def __merge_bg(self, cssdata): + """ + Merges all background properties + @cssdata (dict) is a dictionary of the selector properties + """ + #Max number of background images. CSS3 not yet fully implemented + img = 1 + clr = 1 + bg_img_list = [] + if cssdata.has_key('background-image'): + img = len(cssdata['background-image'].split(',')) + bg_img_list = self.parser.gvw_important(cssdata['background-image']).split(',') + + elif cssdata.has_key('background-color'): + clr = len(cssdata['background-color'].split(',')) + + + number_of_values = max(img, clr, 1) + + new_bg_value = '' + important = '' + + for i in xrange(number_of_values): + for bg_property, default_value in data.background_prop_default.iteritems(): + #Skip if property does not exist + if not cssdata.has_key(bg_property): + continue + + cur_value = cssdata[bg_property] + + #Skip some properties if there is no background image + if (len(bg_img_list) > i and bg_img_list[i] == 'none') and bg_property in frozenset(['background-size', 'background-position', 'background-attachment', 'background-repeat']): + continue + + #Remove !important + if self.parser.is_important(cur_value): + important = ' !important' + cur_value = self.parser.gvw_important(cur_value) + + #Do not add default values + if cur_value == default_value: + continue + + temp = cur_value.split(',') + + if len(temp) > i: + if bg_property == 'background-size': + new_bg_value += '(' + temp[i] + ') ' + + else: + new_bg_value += temp[i] + ' ' + + new_bg_value = new_bg_value.strip() + if i != (number_of_values-1): + new_bg_value += ',' + + #Delete all background-properties + for bg_property, default_value in data.background_prop_default.iteritems(): + try: + del cssdata[bg_property] + except: + pass + + #Add new background property + if new_bg_value != '': + cssdata['background'] = new_bg_value + important + + return cssdata + + def __merge_4value_shorthands(self, cssdata): + """ + Merges Shorthand properties again, the opposite of dissolve_4value_shorthands() + @cssdata (dict) is a dictionary of the selector properties + """ + for key, value in data.shorthands.iteritems(): + important = '' + if value != 0 and cssdata.has_key(value[0]) and cssdata.has_key(value[1]) and cssdata.has_key(value[2]) and cssdata.has_key(value[3]): + cssdata[key] = '' + + for i in xrange(4): + val = cssdata[value[i]] + if self.parser.is_important(val): + important = '!important' + cssdata[key] += self.parser.gvw_important(val) + ' ' + + else: + cssdata[key] += val + ' ' + + del cssdata[value[i]] + if cssdata.has_key(key): + cssdata[key] = self.__shorthand(cssdata[key] + important.strip()) + + return cssdata + + + def __merge_selectors(self): + """ + Merges selectors with same properties. Example: a{color:red} b{color:red} . a,b{color:red} + Very basic and has at least one bug. Hopefully there is a replacement soon. + @selector_one (string) is the current selector + @value_one (dict) is a dictionary of the selector properties + Note: Currently is the elements of a selector are identical, but in a different order, they are not merged + """ + + ##OPTIMIZE## + ##FIX## + + raw_css = self._optimized_css.copy() + delete = [] + add = SortedDict() + for media, css in raw_css.iteritems(): + for selector_one, value_one in css.iteritems(): + newsel = selector_one + + for selector_two, value_two in css.iteritems(): + if selector_one == selector_two: + #We need to skip self + continue + + if value_one == value_two: + #Ok, we need to merge these two selectors + newsel += ', ' + selector_two + delete.append((media, selector_two)) + + + if not add.has_key(media): + add[media] = SortedDict() + + add[media][newsel] = value_one + delete.append((media, selector_one)) + + for item in delete: + try: + del self._optimized_css[item[0]][item[1]] + except: + #Must have already been deleted + continue + + for media, css in add.iteritems(): + self._optimized_css[media].update(css) + + + + def __shorthand(self, value): + """ + Compresses shorthand values. Example: margin:1px 1px 1px 1px . margin:1px + @value (string) + """ + + ##FIX## + + important = ''; + if self.parser.is_important(value): + value_list = self.parser.gvw_important(value) + important = '!important' + else: + value_list = value + + ret = value + value_list = value_list.split(' ') + + if len(value_list) == 4: + if value_list[0] == value_list[1] and value_list[0] == value_list[2] and value_list[0] == value_list[3]: + ret = value_list[0] + important + + elif value_list[1] == value_list[3] and value_list[0] == value_list[2]: + ret = value_list[0] + ' ' + value_list[1] + important + + elif value_list[1] == value_list[3]: + ret = value_list[0] + ' ' + value_list[1] + ' ' + value_list[2] + important + + elif len(value_list) == 3: + if value_list[0] == value_list[1] and value_list[0] == value_list[2]: + ret = value_list[0] + important + + elif value_list[0] == value_list[2]: + return value_list[0] + ' ' + value_list[1] + important + + elif len(value_list) == 2: + if value_list[0] == value_list[1]: + ret = value_list[0] + important + + if ret != value: + self.parser.log('Optimised shorthand notation: Changed "' + value + '" to "' + ret + '"', 'Information') + + return ret + + def __compress_important(self, value): + """ + Removes unnecessary whitespace in ! important + @value (string) + """ + if self.parser.is_important(value): + value = self.parser.gvw_important(value) + '!important' + + return value + + def __compress_numbers(self, prop, value): + """ + Compresses numbers (ie. 1.0 becomes 1 or 1.100 becomes 1.1 ) + @value (string) is the posible number to be compressed + """ + + ##FIX## + + value = value.split('/') + + for l in xrange(len(value)): + #continue if no numeric value + if not (len(value[l]) > 0 and (value[l][0].isdigit() or value[l][0] in ('+', '-') )): + continue + + #Fix bad colors + if prop in data.color_values: + value[l] = '#' + value[l] + + is_floatable = False + try: + float(value[l]) + is_floatable = True + except: + pass + + if is_floatable and float(value[l]) == 0: + value[l] = '0' + + elif value[l][0] != '#': + unit_found = False + for unit in data.units: + pos = value[l].lower().find(unit) + if pos != -1 and prop not in data.shorthands: + value[l] = self.__remove_leading_zeros(float(value[l][:pos])) + unit + unit_found = True + break; + + if not unit_found and prop in data.unit_values and prop not in data.shorthands: + value[l] = self.__remove_leading_zeros(float(value[l])) + 'px' + + elif not unit_found and prop not in data.shorthands: + value[l] = self.__remove_leading_zeros(float(value[l])) + + + if len(value) > 1: + return '/'.join(value) + + return value[0] + + def __remove_leading_zeros(self, float_val): + """ + Removes the leading zeros from a float value + @float_val (float) + @returns (string) + """ + #Remove leading zero + if abs(float_val) < 1: + if float_val < 0: + float_val = '-' . str(float_val)[2:] + else: + float_val = str(float_val)[1:] + + return str(float_val) + + def __compress_color(self, color): + """ + Color compression function. Converts all rgb() values to #-values and uses the short-form if possible. Also replaces 4 color names by #-values. + @color (string) the {posible} color to change + """ + + #rgb(0,0,0) . #000000 (or #000 in this case later) + if color[:4].lower() == 'rgb(': + color_tmp = color[4:(len(color)-5)] + color_tmp = color_tmp.split(',') + + for c in color_tmp: + c = c.strip() + if c[:-1] == '%': + c = round((255*color_tmp[i])/100) + + if color_tmp[i] > 255: + color_tmp[i] = 255 + + color = '#' + + for i in xrange(3): + if color_tmp[i] < 16: + color += '0' + str(hex(color_tmp[i])).replace('0x', '') + else: + color += str(hex(color_tmp[i])).replace('0x', '') + + #Fix bad color names + if data.replace_colors.has_key(color.lower()): + color = data.replace_colors[color.lower()] + + #aabbcc . #abc + if len(color) == 7: + color_temp = color.lower() + if color_temp[0] == '#' and color_temp[1] == color_temp[2] and color_temp[3] == color_temp[4] and color_temp[5] == color_temp[6]: + color = '#' + color[1] + color[3] + color[5] + + if data.optimize_colors.has_key(color.lower()): + color = data.optimize_colors[color.lower()] + + return color \ No newline at end of file diff --git a/compress/filters/csstidy_python/output.py b/compress/filters/csstidy_python/output.py new file mode 100644 index 000000000..795a0d050 --- /dev/null +++ b/compress/filters/csstidy_python/output.py @@ -0,0 +1,101 @@ +# CSSTidy - CSS Printer +# +# CSS Printer class +# +# This file is part of CSSTidy. +# +# CSSTidy is free software you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation either version 2 of the License, or +# (at your option) any later version. +# +# CSSTidy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with CSSTidy if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# @license http://opensource.org/licenses/gpl-license.php GNU Public License +# @package csstidy +# @author Dj Gilcrease (digitalxero at gmail dot com) 2005-2006 + +import data + +class CSSPrinter(object): + def __init__(self, parser): + self.parser = parser + self._css = {} + self.__renderMethods = {'string': self.__renderString, 'file': self.__renderFile} + +#PUBLIC METHODS + def prepare(self, css): + self._css = css + + def render(self, output="string", *args, **kwargs): + return self.__renderMethods[output](*args, **kwargs) + +#PRIVATE METHODS + def __renderString(self, *args, **kwargs): + ##OPTIMIZE## + template = self.parser.getSetting('template') + ret = "" + + if template == 'highest_compression': + top_line_end = "" + iner_line_end = "" + bottom_line_end = "" + indent = "" + + elif template == 'high_compression': + top_line_end = "\n" + iner_line_end = "" + bottom_line_end = "\n" + indent = "" + + elif template == 'default': + top_line_end = "\n" + iner_line_end = "\n" + bottom_line_end = "\n\n" + indent = "" + + elif template == 'low_compression': + top_line_end = "\n" + iner_line_end = "\n" + bottom_line_end = "\n\n" + indent = " " + + if self.parser.getSetting('timestamp'): + ret += '/# CSSTidy ' + self.parser.version + ': ' + datetime.now().strftime("%a, %d %b %Y %H:%M:%S +0000") + ' #/' + top_line_end + + for item in self.parser._import: + ret += '@import(' + item + ');' + top_line_end + + for item in self.parser._charset: + ret += '@charset(' + item + ');' + top_line_end + + for item in self.parser._namespace: + ret += '@namespace(' + item + ');' + top_line_end + + for media, css in self._css.iteritems(): + for selector, cssdata in css.iteritems(): + ret += selector + '{' + top_line_end + + for item, value in cssdata.iteritems(): + ret += indent + item + ':' + value + ';' + iner_line_end + + ret += '}' + bottom_line_end + + return ret + + def __renderFile(self, filename=None, *args, **kwargs): + if filename is None: + return self.__renderString() + + try: + f = open(filename, "w") + f.write(self.__renderString()) + finally: + f.close() \ No newline at end of file diff --git a/compress/filters/csstidy_python/tools.py b/compress/filters/csstidy_python/tools.py new file mode 100644 index 000000000..e62faef2c --- /dev/null +++ b/compress/filters/csstidy_python/tools.py @@ -0,0 +1,109 @@ + +class SortedDict(dict): + """ + A dictionary that keeps its keys in the order in which they're inserted. + """ + def __init__(self, data=None): + if data is None: + data = {} + super(SortedDict, self).__init__(data) + if isinstance(data, dict): + self.keyOrder = data.keys() + else: + self.keyOrder = [] + for key, value in data: + if key not in self.keyOrder: + self.keyOrder.append(key) + + def __deepcopy__(self, memo): + from copy import deepcopy + return self.__class__([(key, deepcopy(value, memo)) + for key, value in self.iteritems()]) + + def __setitem__(self, key, value): + super(SortedDict, self).__setitem__(key, value) + if key not in self.keyOrder: + self.keyOrder.append(key) + + def __delitem__(self, key): + super(SortedDict, self).__delitem__(key) + self.keyOrder.remove(key) + + def __iter__(self): + for k in self.keyOrder: + yield k + + def pop(self, k, *args): + result = super(SortedDict, self).pop(k, *args) + try: + self.keyOrder.remove(k) + except ValueError: + # Key wasn't in the dictionary in the first place. No problem. + pass + return result + + def popitem(self): + result = super(SortedDict, self).popitem() + self.keyOrder.remove(result[0]) + return result + + def items(self): + return zip(self.keyOrder, self.values()) + + def iteritems(self): + for key in self.keyOrder: + yield key, super(SortedDict, self).__getitem__(key) + + def keys(self): + return self.keyOrder[:] + + def iterkeys(self): + return iter(self.keyOrder) + + def values(self): + return [super(SortedDict, self).__getitem__(k) for k in self.keyOrder] + + def itervalues(self): + for key in self.keyOrder: + yield super(SortedDict, self).__getitem__(key) + + def update(self, dict_): + for k, v in dict_.items(): + self.__setitem__(k, v) + + def setdefault(self, key, default): + if key not in self.keyOrder: + self.keyOrder.append(key) + return super(SortedDict, self).setdefault(key, default) + + def value_for_index(self, index): + """Returns the value of the item at the given zero-based index.""" + return self[self.keyOrder[index]] + + def insert(self, index, key, value): + """Inserts the key, value pair before the item with the given index.""" + if key in self.keyOrder: + n = self.keyOrder.index(key) + del self.keyOrder[n] + if n < index: + index -= 1 + self.keyOrder.insert(index, key) + super(SortedDict, self).__setitem__(key, value) + + def copy(self): + """Returns a copy of this object.""" + # This way of initializing the copy means it works for subclasses, too. + obj = self.__class__(self) + obj.keyOrder = self.keyOrder[:] + return obj + + def __repr__(self): + """ + Replaces the normal dict.__repr__ with a version that returns the keys + in their sorted order. + """ + return '{%s}' % ', '.join(['%r: %r' % (k, v) for k, v in self.items()]) + + def clear(self): + super(SortedDict, self).clear() + self.keyOrder = [] \ No newline at end of file diff --git a/compress/filters/jsmin/__init__.py b/compress/filters/jsmin/__init__.py new file mode 100644 index 000000000..d22620081 --- /dev/null +++ b/compress/filters/jsmin/__init__.py @@ -0,0 +1,6 @@ +from compress.filters.jsmin.jsmin import jsmin +from compress.filter_base import FilterBase + +class JSMinFilter(FilterBase): + def filter_js(self, js): + return jsmin(js) \ No newline at end of file diff --git a/compress/filters/jsmin/jsmin.py b/compress/filters/jsmin/jsmin.py new file mode 100644 index 000000000..4f9d384f1 --- /dev/null +++ b/compress/filters/jsmin/jsmin.py @@ -0,0 +1,218 @@ +#!/usr/bin/python + +# This code is original from jsmin by Douglas Crockford, it was translated to +# Python by Baruch Even. The original code had the following copyright and +# license. +# +# /* jsmin.c +# 2007-05-22 +# +# Copyright (c) 2002 Douglas Crockford (www.crockford.com) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# The Software shall be used for Good, not Evil. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# */ + +from StringIO import StringIO + +def jsmin(js): + ins = StringIO(js) + outs = StringIO() + JavascriptMinify().minify(ins, outs) + str = outs.getvalue() + if len(str) > 0 and str[0] == '\n': + str = str[1:] + return str + +def isAlphanum(c): + """return true if the character is a letter, digit, underscore, + dollar sign, or non-ASCII character. + """ + return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or + (c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or (c is not None and ord(c) > 126)); + +class UnterminatedComment(Exception): + pass + +class UnterminatedStringLiteral(Exception): + pass + +class UnterminatedRegularExpression(Exception): + pass + +class JavascriptMinify(object): + + def _outA(self): + self.outstream.write(self.theA) + def _outB(self): + self.outstream.write(self.theB) + + def _get(self): + """return the next character from stdin. Watch out for lookahead. If + the character is a control character, translate it to a space or + linefeed. + """ + c = self.theLookahead + self.theLookahead = None + if c == None: + c = self.instream.read(1) + if c >= ' ' or c == '\n': + return c + if c == '': # EOF + return '\000' + if c == '\r': + return '\n' + return ' ' + + def _peek(self): + self.theLookahead = self._get() + return self.theLookahead + + def _next(self): + """get the next character, excluding comments. peek() is used to see + if a '/' is followed by a '/' or '*'. + """ + c = self._get() + if c == '/': + p = self._peek() + if p == '/': + c = self._get() + while c > '\n': + c = self._get() + return c + if p == '*': + c = self._get() + while 1: + c = self._get() + if c == '*': + if self._peek() == '/': + self._get() + return ' ' + if c == '\000': + raise UnterminatedComment() + + return c + + def _action(self, action): + """do something! What you do is determined by the argument: + 1 Output A. Copy B to A. Get the next B. + 2 Copy B to A. Get the next B. (Delete A). + 3 Get the next B. (Delete B). + action treats a string as a single character. Wow! + action recognizes a regular expression if it is preceded by ( or , or =. + """ + if action <= 1: + self._outA() + + if action <= 2: + self.theA = self.theB + if self.theA == "'" or self.theA == '"': + while 1: + self._outA() + self.theA = self._get() + if self.theA == self.theB: + break + if self.theA <= '\n': + raise UnterminatedStringLiteral() + if self.theA == '\\': + self._outA() + self.theA = self._get() + + + if action <= 3: + self.theB = self._next() + if self.theB == '/' and (self.theA == '(' or self.theA == ',' or + self.theA == '=' or self.theA == ':' or + self.theA == '[' or self.theA == '?' or + self.theA == '!' or self.theA == '&' or + self.theA == '|' or self.theA == ';' or + self.theA == '{' or self.theA == '}' or + self.theA == '\n'): + self._outA() + self._outB() + while 1: + self.theA = self._get() + if self.theA == '/': + break + elif self.theA == '\\': + self._outA() + self.theA = self._get() + elif self.theA <= '\n': + raise UnterminatedRegularExpression() + self._outA() + self.theB = self._next() + + + def _jsmin(self): + """Copy the input to the output, deleting the characters which are + insignificant to JavaScript. Comments will be removed. Tabs will be + replaced with spaces. Carriage returns will be replaced with linefeeds. + Most spaces and linefeeds will be removed. + """ + self.theA = '\n' + self._action(3) + + while self.theA != '\000': + if self.theA == ' ': + if isAlphanum(self.theB): + self._action(1) + else: + self._action(2) + elif self.theA == '\n': + if self.theB in ['{', '[', '(', '+', '-']: + self._action(1) + elif self.theB == ' ': + self._action(3) + else: + if isAlphanum(self.theB): + self._action(1) + else: + self._action(2) + else: + if self.theB == ' ': + if isAlphanum(self.theA): + self._action(1) + else: + self._action(3) + elif self.theB == '\n': + if self.theA in ['}', ']', ')', '+', '-', '"', '\'']: + self._action(1) + else: + if isAlphanum(self.theA): + self._action(1) + else: + self._action(3) + else: + self._action(1) + + def minify(self, instream, outstream): + self.instream = instream + self.outstream = outstream + self.theA = '\n' + self.theB = None + self.theLookahead = None + + self._jsmin() + self.instream.close() + +if __name__ == '__main__': + import sys + jsm = JavascriptMinify() + jsm.minify(sys.stdin, sys.stdout) \ No newline at end of file diff --git a/compress/filters/yui/__init__.py b/compress/filters/yui/__init__.py new file mode 100644 index 000000000..1e2e711fd --- /dev/null +++ b/compress/filters/yui/__init__.py @@ -0,0 +1,44 @@ +import subprocess + +from django.conf import settings + +from compress.filter_base import FilterBase, FilterError + +BINARY = getattr(settings, 'COMPRESS_YUI_BINARY', 'java -jar yuicompressor.jar') +CSS_ARGUMENTS = getattr(settings, 'COMPRESS_YUI_CSS_ARGUMENTS', '') +JS_ARGUMENTS = getattr(settings, 'COMPRESS_YUI_JS_ARGUMENTS', '') + +class YUICompressorFilter(FilterBase): + + def filter_common(self, content, type_, arguments): + command = '%s --type=%s %s' % (BINARY, type_, arguments) + + if self.verbose: + command += ' --verbose' + + p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) + p.stdin.write(content) + p.stdin.close() + + filtered_css = p.stdout.read() + p.stdout.close() + + err = p.stderr.read() + p.stderr.close() + + if p.wait() != 0: + if not err: + err = 'Unable to apply YUI Compressor filter' + + raise FilterError(err) + + if self.verbose: + print err + + return filtered_css + + def filter_js(self, js): + return self.filter_common(js, 'js', JS_ARGUMENTS) + + def filter_css(self, css): + return self.filter_common(css, 'css', CSS_ARGUMENTS) \ No newline at end of file diff --git a/compress/management/__init__.py b/compress/management/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compress/management/commands/__init__.py b/compress/management/commands/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compress/management/commands/synccompress.py b/compress/management/commands/synccompress.py new file mode 100644 index 000000000..6e31d254d --- /dev/null +++ b/compress/management/commands/synccompress.py @@ -0,0 +1,51 @@ +from django.core.management.base import NoArgsCommand +from optparse import make_option + +from django.conf import settings + +class Command(NoArgsCommand): + option_list = NoArgsCommand.option_list + ( + make_option('--force', action='store_true', default=False, help='Force update of all files, even if the source files are older than the current compressed file.'), + make_option('--verbosity', action='store', dest='verbosity', default='1', + type='choice', choices=['0', '1', '2'], + help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'), + ) + help = 'Updates and compresses CSS and JavsScript on-demand, without restarting Django' + args = '' + + def handle_noargs(self, **options): + + force = options.get('force', False) + verbosity = int(options.get('verbosity', 1)) + + from compress.utils import needs_update, filter_css, filter_js + + for name, css in settings.COMPRESS_CSS.items(): + u, version = needs_update(css['output_filename'], css['source_filenames']) + + if (force or u) or verbosity >= 2: + msg = 'CSS Group \'%s\'' % name + print msg + print len(msg) * '-' + print "Version: %s" % version + + if force or u: + filter_css(css, verbosity) + + if (force or u) or verbosity >= 2: + print + + for name, js in settings.COMPRESS_JS.items(): + u, version = needs_update(js['output_filename'], js['source_filenames']) + + if (force or u) or verbosity >= 2: + msg = 'JavaScript Group \'%s\'' % name + print msg + print len(msg) * '-' + print "Version: %s" % version + + if force or u: + filter_js(js, verbosity) + + if (force or u) or verbosity >= 2: + print \ No newline at end of file diff --git a/compress/models.py b/compress/models.py new file mode 100644 index 000000000..e69de29bb diff --git a/compress/signals.py b/compress/signals.py new file mode 100644 index 000000000..bd76a76e7 --- /dev/null +++ b/compress/signals.py @@ -0,0 +1,4 @@ +from django.dispatch import Signal + +css_filtered = Signal() +js_filtered = Signal() diff --git a/compress/templates/compress/css.html b/compress/templates/compress/css.html new file mode 100644 index 000000000..68ddbac25 --- /dev/null +++ b/compress/templates/compress/css.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/compress/templates/compress/css_ie.html b/compress/templates/compress/css_ie.html new file mode 100644 index 000000000..80372dc8e --- /dev/null +++ b/compress/templates/compress/css_ie.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/compress/templates/compress/js.html b/compress/templates/compress/js.html new file mode 100644 index 000000000..bfa2b593c --- /dev/null +++ b/compress/templates/compress/js.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/compress/templates/compress/js_ie.html b/compress/templates/compress/js_ie.html new file mode 100644 index 000000000..8235fe2c3 --- /dev/null +++ b/compress/templates/compress/js_ie.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/compress/templatetags/__init__.py b/compress/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compress/templatetags/compressed.py b/compress/templatetags/compressed.py new file mode 100644 index 000000000..2a020099f --- /dev/null +++ b/compress/templatetags/compressed.py @@ -0,0 +1,104 @@ +import os + +from django import template + +from django.conf import settings as django_settings + +from compress.conf import settings +from compress.utils import media_root, media_url, needs_update, filter_css, filter_js, get_output_filename, get_version + +register = template.Library() + +def render_common(template_name, obj, filename, version): + if settings.COMPRESS: + filename = get_output_filename(filename, version) + + context = obj.get('extra_context', {}) + context['url'] = media_url(filename) + + return template.loader.render_to_string(template_name, context) + +def render_css(css, filename, version=None): + return render_common(css.get('template_name', 'compress/css.html'), css, filename, version) + +def render_js(js, filename, version=None): + return render_common(js.get('template_name', 'compress/js.html'), js, filename, version) + +class CompressedCSSNode(template.Node): + def __init__(self, name): + self.name = name + + def render(self, context): + css_name = template.Variable(self.name).resolve(context) + + try: + css = settings.COMPRESS_CSS[css_name] + except KeyError: + return '' # fail silently, do not return anything if an invalid group is specified + + if settings.COMPRESS: + + version = None + + if settings.COMPRESS_AUTO: + u, version = needs_update(css['output_filename'], css['source_filenames']) + if u: + filter_css(css) + + return render_css(css, css['output_filename'], version) + else: + # output source files + r = '' + for source_file in css['source_filenames']: + r += render_css(css, source_file) + + return r + +class CompressedJSNode(template.Node): + def __init__(self, name): + self.name = name + + def render(self, context): + js_name = template.Variable(self.name).resolve(context) + + try: + js = settings.COMPRESS_JS[js_name] + except KeyError: + return '' # fail silently, do not return anything if an invalid group is specified + + if settings.COMPRESS: + + version = None + + if settings.COMPRESS_AUTO: + u, version = needs_update(js['output_filename'], js['source_filenames']) + if u: + filter_js(js) + + return render_js(js, js['output_filename'], version) + else: + # output source files + r = '' + for source_file in js['source_filenames']: + r += render_js(js, source_file) + return r + +#@register.tag +def compressed_css(parser, token): + try: + tag_name, name = token.split_contents() + except ValueError: + raise template.TemplateSyntaxError, '%r requires exactly one argument: the name of a group in the COMPRESS_CSS setting' % token.split_contents()[0] + + return CompressedCSSNode(name) +compressed_css = register.tag(compressed_css) + +#@register.tag +def compressed_js(parser, token): + try: + tag_name, name = token.split_contents() + except ValueError: + raise template.TemplateSyntaxError, '%r requires exactly one argument: the name of a group in the COMPRESS_JS setting' % token.split_contents()[0] + + return CompressedJSNode(name) +compressed_js = register.tag(compressed_js) diff --git a/compress/utils.py b/compress/utils.py new file mode 100644 index 000000000..1e0681f07 --- /dev/null +++ b/compress/utils.py @@ -0,0 +1,130 @@ +import os +import re +import tempfile + +from django.conf import settings as django_settings +from django.utils.http import urlquote +from django.dispatch import dispatcher + +from compress.conf import settings +from compress.signals import css_filtered, js_filtered + +def get_filter(compressor_class): + """ + Convert a string version of a function name to the callable object. + """ + + if not hasattr(compressor_class, '__bases__'): + + try: + compressor_class = compressor_class.encode('ascii') + mod_name, class_name = get_mod_func(compressor_class) + if class_name != '': + compressor_class = getattr(__import__(mod_name, {}, {}, ['']), class_name) + except (ImportError, AttributeError): + raise Exception('Failed to import filter %s' % compressor_class) + + return compressor_class + +def get_mod_func(callback): + """ + Converts 'django.views.news.stories.story_detail' to + ('django.views.news.stories', 'story_detail') + """ + + try: + dot = callback.rindex('.') + except ValueError: + return callback, '' + return callback[:dot], callback[dot+1:] + +def needs_update(output_file, source_files): + """ + Scan the source files for changes and returns True if the output_file needs to be updated. + """ + + mtime = max_mtime(source_files) + version = get_version(mtime) + + compressed_file_full = media_root(get_output_filename(output_file, version)) + + if not os.path.exists(compressed_file_full): + return True, version + + # Check if the output file is outdated + return (os.stat(compressed_file_full).st_mtime < mtime), mtime + +def media_root(filename): + """ + Return the full path to ``filename``. ``filename`` is a relative path name in MEDIA_ROOT + """ + return os.path.join(django_settings.MEDIA_ROOT, filename) + +def media_url(url): + return django_settings.MEDIA_URL + urlquote(url) + +def concat(filenames, separator=''): + """ + Concatenate the files from the list of the ``filenames``, ouput separated with ``separator``. + """ + r = '' + + for filename in filenames: + fd = open(media_root(filename), 'rb') + r += fd.read() + r += separator + fd.close() + + return r + +def max_mtime(files): + return int(max([os.stat(media_root(f)).st_mtime for f in files])) + +def save_file(filename, contents): + fd = open(media_root(filename), 'wb+') + fd.write(contents) + fd.close() + +def get_output_filename(filename, version): + if settings.COMPRESS_VERSION and version is not None: + return filename.replace(settings.COMPRESS_VERSION_PLACEHOLDER, get_version(version)) + else: + return filename.replace(settings.COMPRESS_VERSION_PLACEHOLDER, settings.COMPRESS_VERSION_DEFAULT) + +def get_version(version): + try: + return str(int(version)) + except ValueError: + return str(version) + +def remove_files(path, filename, verbosity=0): + regex = re.compile(r'^%s$' % (os.path.basename(get_output_filename(settings.COMPRESS_VERSION_PLACEHOLDER.join([re.escape(part) for part in filename.split(settings.COMPRESS_VERSION_PLACEHOLDER)]), r'\d+')))) + + for f in os.listdir(path): + if regex.match(f): + if verbosity >= 1: + print "Removing outdated file %s" % f + + os.unlink(os.path.join(path, f)) + +def filter_common(obj, verbosity, filters, attr, separator, signal): + output = concat(obj['source_filenames'], separator) + filename = get_output_filename(obj['output_filename'], get_version(max_mtime(obj['source_filenames']))) + + if settings.COMPRESS_VERSION: + remove_files(os.path.dirname(media_root(filename)), obj['output_filename'], verbosity) + + if verbosity >= 1: + print "Saving %s" % filename + + for f in filters: + output = getattr(get_filter(f)(verbose=(verbosity >= 2)), attr)(output) + + save_file(filename, output) + signal.send(None) + +def filter_css(css, verbosity=0): + return filter_common(css, verbosity, filters=settings.COMPRESS_CSS_FILTERS, attr='filter_css', separator='', signal=css_filtered) + +def filter_js(js, verbosity=0): + return filter_common(js, verbosity, filters=settings.COMPRESS_JS_FILTERS, attr='filter_js', separator=';', signal=js_filtered) diff --git a/feedparser.py b/feedparser.py new file mode 100644 index 000000000..bb802df16 --- /dev/null +++ b/feedparser.py @@ -0,0 +1,2858 @@ +#!/usr/bin/env python +"""Universal feed parser + +Handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds + +Visit http://feedparser.org/ for the latest version +Visit http://feedparser.org/docs/ for the latest documentation + +Required: Python 2.1 or later +Recommended: Python 2.3 or later +Recommended: CJKCodecs and iconv_codec +""" + +__version__ = "4.1"# + "$Revision: 1.92 $"[11:15] + "-cvs" +__license__ = """Copyright (c) 2002-2006, Mark Pilgrim, All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE.""" +__author__ = "Mark Pilgrim " +__contributors__ = ["Jason Diamond ", + "John Beimler ", + "Fazal Majid ", + "Aaron Swartz ", + "Kevin Marks "] +_debug = 0 + +# HTTP "User-Agent" header to send to servers when downloading feeds. +# If you are embedding feedparser in a larger application, you should +# change this to your application name and URL. +USER_AGENT = "UniversalFeedParser/%s +http://feedparser.org/" % __version__ + +# HTTP "Accept" header to send to servers when downloading feeds. If you don't +# want to send an Accept header, set this to None. +ACCEPT_HEADER = "application/atom+xml,application/rdf+xml,application/rss+xml,application/x-netcdf,application/xml;q=0.9,text/xml;q=0.2,*/*;q=0.1" + +# List of preferred XML parsers, by SAX driver name. These will be tried first, +# but if they're not installed, Python will keep searching through its own list +# of pre-installed parsers until it finds one that supports everything we need. +PREFERRED_XML_PARSERS = ["drv_libxml2"] + +# If you want feedparser to automatically run HTML markup through HTML Tidy, set +# this to 1. Requires mxTidy +# or utidylib . +TIDY_MARKUP = 0 + +# List of Python interfaces for HTML Tidy, in order of preference. Only useful +# if TIDY_MARKUP = 1 +PREFERRED_TIDY_INTERFACES = ["uTidy", "mxTidy"] + +# ---------- required modules (should come with any Python distribution) ---------- +import sgmllib, re, sys, copy, urlparse, time, rfc822, types, cgi, urllib, urllib2 +try: + from cStringIO import StringIO as _StringIO +except: + from StringIO import StringIO as _StringIO + +# ---------- optional modules (feedparser will work without these, but with reduced functionality) ---------- + +# gzip is included with most Python distributions, but may not be available if you compiled your own +try: + import gzip +except: + gzip = None +try: + import zlib +except: + zlib = None + +# If a real XML parser is available, feedparser will attempt to use it. feedparser has +# been tested with the built-in SAX parser, PyXML, and libxml2. On platforms where the +# Python distribution does not come with an XML parser (such as Mac OS X 10.2 and some +# versions of FreeBSD), feedparser will quietly fall back on regex-based parsing. +try: + import xml.sax + xml.sax.make_parser(PREFERRED_XML_PARSERS) # test for valid parsers + from xml.sax.saxutils import escape as _xmlescape + _XML_AVAILABLE = 1 +except: + _XML_AVAILABLE = 0 + def _xmlescape(data): + data = data.replace('&', '&') + data = data.replace('>', '>') + data = data.replace('<', '<') + return data + +# base64 support for Atom feeds that contain embedded binary data +try: + import base64, binascii +except: + base64 = binascii = None + +# cjkcodecs and iconv_codec provide support for more character encodings. +# Both are available from http://cjkpython.i18n.org/ +try: + import cjkcodecs.aliases +except: + pass +try: + import iconv_codec +except: + pass + +# chardet library auto-detects character encodings +# Download from http://chardet.feedparser.org/ +try: + import chardet + if _debug: + import chardet.constants + chardet.constants._debug = 1 +except: + chardet = None + +# ---------- don't touch these ---------- +class ThingsNobodyCaresAboutButMe(Exception): pass +class CharacterEncodingOverride(ThingsNobodyCaresAboutButMe): pass +class CharacterEncodingUnknown(ThingsNobodyCaresAboutButMe): pass +class NonXMLContentType(ThingsNobodyCaresAboutButMe): pass +class UndeclaredNamespace(Exception): pass + +sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') +sgmllib.special = re.compile('' % (tag, ''.join([' %s="%s"' % t for t in attrs])), escape=0) + + # match namespaces + if tag.find(':') <> -1: + prefix, suffix = tag.split(':', 1) + else: + prefix, suffix = '', tag + prefix = self.namespacemap.get(prefix, prefix) + if prefix: + prefix = prefix + '_' + + # special hack for better tracking of empty textinput/image elements in illformed feeds + if (not prefix) and tag not in ('title', 'link', 'description', 'name'): + self.intextinput = 0 + if (not prefix) and tag not in ('title', 'link', 'description', 'url', 'href', 'width', 'height'): + self.inimage = 0 + + # call special handler (if defined) or default handler + methodname = '_start_' + prefix + suffix + try: + method = getattr(self, methodname) + return method(attrsD) + except AttributeError: + return self.push(prefix + suffix, 1) + + def unknown_endtag(self, tag): + if _debug: sys.stderr.write('end %s\n' % tag) + # match namespaces + if tag.find(':') <> -1: + prefix, suffix = tag.split(':', 1) + else: + prefix, suffix = '', tag + prefix = self.namespacemap.get(prefix, prefix) + if prefix: + prefix = prefix + '_' + + # call special handler (if defined) or default handler + methodname = '_end_' + prefix + suffix + try: + method = getattr(self, methodname) + method() + except AttributeError: + self.pop(prefix + suffix) + + # track inline content + if self.incontent and self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'): + # element declared itself as escaped markup, but it isn't really + self.contentparams['type'] = 'application/xhtml+xml' + if self.incontent and self.contentparams.get('type') == 'application/xhtml+xml': + tag = tag.split(':')[-1] + self.handle_data('' % tag, escape=0) + + # track xml:base and xml:lang going out of scope + if self.basestack: + self.basestack.pop() + if self.basestack and self.basestack[-1]: + self.baseuri = self.basestack[-1] + if self.langstack: + self.langstack.pop() + if self.langstack: # and (self.langstack[-1] is not None): + self.lang = self.langstack[-1] + + def handle_charref(self, ref): + # called for each character reference, e.g. for ' ', ref will be '160' + if not self.elementstack: return + ref = ref.lower() + if ref in ('34', '38', '39', '60', '62', 'x22', 'x26', 'x27', 'x3c', 'x3e'): + text = '&#%s;' % ref + else: + if ref[0] == 'x': + c = int(ref[1:], 16) + else: + c = int(ref) + text = unichr(c).encode('utf-8') + self.elementstack[-1][2].append(text) + + def handle_entityref(self, ref): + # called for each entity reference, e.g. for '©', ref will be 'copy' + if not self.elementstack: return + if _debug: sys.stderr.write('entering handle_entityref with %s\n' % ref) + if ref in ('lt', 'gt', 'quot', 'amp', 'apos'): + text = '&%s;' % ref + else: + # entity resolution graciously donated by Aaron Swartz + def name2cp(k): + import htmlentitydefs + if hasattr(htmlentitydefs, 'name2codepoint'): # requires Python 2.3 + return htmlentitydefs.name2codepoint[k] + k = htmlentitydefs.entitydefs[k] + if k.startswith('&#') and k.endswith(';'): + return int(k[2:-1]) # not in latin-1 + return ord(k) + try: name2cp(ref) + except KeyError: text = '&%s;' % ref + else: text = unichr(name2cp(ref)).encode('utf-8') + self.elementstack[-1][2].append(text) + + def handle_data(self, text, escape=1): + # called for each block of plain text, i.e. outside of any tag and + # not containing any character or entity references + if not self.elementstack: return + if escape and self.contentparams.get('type') == 'application/xhtml+xml': + text = _xmlescape(text) + self.elementstack[-1][2].append(text) + + def handle_comment(self, text): + # called for each comment, e.g. + pass + + def handle_pi(self, text): + # called for each processing instruction, e.g. + pass + + def handle_decl(self, text): + pass + + def parse_declaration(self, i): + # override internal declaration handler to handle CDATA blocks + if _debug: sys.stderr.write('entering parse_declaration\n') + if self.rawdata[i:i+9] == '', i) + if k == -1: k = len(self.rawdata) + self.handle_data(_xmlescape(self.rawdata[i+9:k]), 0) + return k+3 + else: + k = self.rawdata.find('>', i) + return k+1 + + def mapContentType(self, contentType): + contentType = contentType.lower() + if contentType == 'text': + contentType = 'text/plain' + elif contentType == 'html': + contentType = 'text/html' + elif contentType == 'xhtml': + contentType = 'application/xhtml+xml' + return contentType + + def trackNamespace(self, prefix, uri): + loweruri = uri.lower() + if (prefix, loweruri) == (None, 'http://my.netscape.com/rdf/simple/0.9/') and not self.version: + self.version = 'rss090' + if loweruri == 'http://purl.org/rss/1.0/' and not self.version: + self.version = 'rss10' + if loweruri == 'http://www.w3.org/2005/atom' and not self.version: + self.version = 'atom10' + if loweruri.find('backend.userland.com/rss') <> -1: + # match any backend.userland.com namespace + uri = 'http://backend.userland.com/rss' + loweruri = uri + if self._matchnamespaces.has_key(loweruri): + self.namespacemap[prefix] = self._matchnamespaces[loweruri] + self.namespacesInUse[self._matchnamespaces[loweruri]] = uri + else: + self.namespacesInUse[prefix or ''] = uri + + def resolveURI(self, uri): + return _urljoin(self.baseuri or '', uri) + + def decodeEntities(self, element, data): + return data + + def push(self, element, expectingText): + self.elementstack.append([element, expectingText, []]) + + def pop(self, element, stripWhitespace=1): + if not self.elementstack: return + if self.elementstack[-1][0] != element: return + + element, expectingText, pieces = self.elementstack.pop() + output = ''.join(pieces) + if stripWhitespace: + output = output.strip() + if not expectingText: return output + + # decode base64 content + if base64 and self.contentparams.get('base64', 0): + try: + output = base64.decodestring(output) + except binascii.Error: + pass + except binascii.Incomplete: + pass + + # resolve relative URIs + if (element in self.can_be_relative_uri) and output: + output = self.resolveURI(output) + + # decode entities within embedded markup + if not self.contentparams.get('base64', 0): + output = self.decodeEntities(element, output) + + # remove temporary cruft from contentparams + try: + del self.contentparams['mode'] + except KeyError: + pass + try: + del self.contentparams['base64'] + except KeyError: + pass + + # resolve relative URIs within embedded markup + if self.mapContentType(self.contentparams.get('type', 'text/html')) in self.html_types: + if element in self.can_contain_relative_uris: + output = _resolveRelativeURIs(output, self.baseuri, self.encoding) + + # sanitize embedded markup + if self.mapContentType(self.contentparams.get('type', 'text/html')) in self.html_types: + if element in self.can_contain_dangerous_markup: + output = _sanitizeHTML(output, self.encoding) + + if self.encoding and type(output) != type(u''): + try: + output = unicode(output, self.encoding) + except: + pass + + # categories/tags/keywords/whatever are handled in _end_category + if element == 'category': + return output + + # store output in appropriate place(s) + if self.inentry and not self.insource: + if element == 'content': + self.entries[-1].setdefault(element, []) + contentparams = copy.deepcopy(self.contentparams) + contentparams['value'] = output + self.entries[-1][element].append(contentparams) + elif element == 'link': + self.entries[-1][element] = output + if output: + self.entries[-1]['links'][-1]['href'] = output + else: + if element == 'description': + element = 'summary' + self.entries[-1][element] = output + if self.incontent: + contentparams = copy.deepcopy(self.contentparams) + contentparams['value'] = output + self.entries[-1][element + '_detail'] = contentparams + elif (self.infeed or self.insource) and (not self.intextinput) and (not self.inimage): + context = self._getContext() + if element == 'description': + element = 'subtitle' + context[element] = output + if element == 'link': + context['links'][-1]['href'] = output + elif self.incontent: + contentparams = copy.deepcopy(self.contentparams) + contentparams['value'] = output + context[element + '_detail'] = contentparams + return output + + def pushContent(self, tag, attrsD, defaultContentType, expectingText): + self.incontent += 1 + self.contentparams = FeedParserDict({ + 'type': self.mapContentType(attrsD.get('type', defaultContentType)), + 'language': self.lang, + 'base': self.baseuri}) + self.contentparams['base64'] = self._isBase64(attrsD, self.contentparams) + self.push(tag, expectingText) + + def popContent(self, tag): + value = self.pop(tag) + self.incontent -= 1 + self.contentparams.clear() + return value + + def _mapToStandardPrefix(self, name): + colonpos = name.find(':') + if colonpos <> -1: + prefix = name[:colonpos] + suffix = name[colonpos+1:] + prefix = self.namespacemap.get(prefix, prefix) + name = prefix + ':' + suffix + return name + + def _getAttribute(self, attrsD, name): + return attrsD.get(self._mapToStandardPrefix(name)) + + def _isBase64(self, attrsD, contentparams): + if attrsD.get('mode', '') == 'base64': + return 1 + if self.contentparams['type'].startswith('text/'): + return 0 + if self.contentparams['type'].endswith('+xml'): + return 0 + if self.contentparams['type'].endswith('/xml'): + return 0 + return 1 + + def _itsAnHrefDamnIt(self, attrsD): + href = attrsD.get('url', attrsD.get('uri', attrsD.get('href', None))) + if href: + try: + del attrsD['url'] + except KeyError: + pass + try: + del attrsD['uri'] + except KeyError: + pass + attrsD['href'] = href + return attrsD + + def _save(self, key, value): + context = self._getContext() + context.setdefault(key, value) + + def _start_rss(self, attrsD): + versionmap = {'0.91': 'rss091u', + '0.92': 'rss092', + '0.93': 'rss093', + '0.94': 'rss094'} + if not self.version: + attr_version = attrsD.get('version', '') + version = versionmap.get(attr_version) + if version: + self.version = version + elif attr_version.startswith('2.'): + self.version = 'rss20' + else: + self.version = 'rss' + + def _start_dlhottitles(self, attrsD): + self.version = 'hotrss' + + def _start_channel(self, attrsD): + self.infeed = 1 + self._cdf_common(attrsD) + _start_feedinfo = _start_channel + + def _cdf_common(self, attrsD): + if attrsD.has_key('lastmod'): + self._start_modified({}) + self.elementstack[-1][-1] = attrsD['lastmod'] + self._end_modified() + if attrsD.has_key('href'): + self._start_link({}) + self.elementstack[-1][-1] = attrsD['href'] + self._end_link() + + def _start_feed(self, attrsD): + self.infeed = 1 + versionmap = {'0.1': 'atom01', + '0.2': 'atom02', + '0.3': 'atom03'} + if not self.version: + attr_version = attrsD.get('version') + version = versionmap.get(attr_version) + if version: + self.version = version + else: + self.version = 'atom' + + def _end_channel(self): + self.infeed = 0 + _end_feed = _end_channel + + def _start_image(self, attrsD): + self.inimage = 1 + self.push('image', 0) + context = self._getContext() + context.setdefault('image', FeedParserDict()) + + def _end_image(self): + self.pop('image') + self.inimage = 0 + + def _start_textinput(self, attrsD): + self.intextinput = 1 + self.push('textinput', 0) + context = self._getContext() + context.setdefault('textinput', FeedParserDict()) + _start_textInput = _start_textinput + + def _end_textinput(self): + self.pop('textinput') + self.intextinput = 0 + _end_textInput = _end_textinput + + def _start_author(self, attrsD): + self.inauthor = 1 + self.push('author', 1) + _start_managingeditor = _start_author + _start_dc_author = _start_author + _start_dc_creator = _start_author + _start_itunes_author = _start_author + + def _end_author(self): + self.pop('author') + self.inauthor = 0 + self._sync_author_detail() + _end_managingeditor = _end_author + _end_dc_author = _end_author + _end_dc_creator = _end_author + _end_itunes_author = _end_author + + def _start_itunes_owner(self, attrsD): + self.inpublisher = 1 + self.push('publisher', 0) + + def _end_itunes_owner(self): + self.pop('publisher') + self.inpublisher = 0 + self._sync_author_detail('publisher') + + def _start_contributor(self, attrsD): + self.incontributor = 1 + context = self._getContext() + context.setdefault('contributors', []) + context['contributors'].append(FeedParserDict()) + self.push('contributor', 0) + + def _end_contributor(self): + self.pop('contributor') + self.incontributor = 0 + + def _start_dc_contributor(self, attrsD): + self.incontributor = 1 + context = self._getContext() + context.setdefault('contributors', []) + context['contributors'].append(FeedParserDict()) + self.push('name', 0) + + def _end_dc_contributor(self): + self._end_name() + self.incontributor = 0 + + def _start_name(self, attrsD): + self.push('name', 0) + _start_itunes_name = _start_name + + def _end_name(self): + value = self.pop('name') + if self.inpublisher: + self._save_author('name', value, 'publisher') + elif self.inauthor: + self._save_author('name', value) + elif self.incontributor: + self._save_contributor('name', value) + elif self.intextinput: + context = self._getContext() + context['textinput']['name'] = value + _end_itunes_name = _end_name + + def _start_width(self, attrsD): + self.push('width', 0) + + def _end_width(self): + value = self.pop('width') + try: + value = int(value) + except: + value = 0 + if self.inimage: + context = self._getContext() + context['image']['width'] = value + + def _start_height(self, attrsD): + self.push('height', 0) + + def _end_height(self): + value = self.pop('height') + try: + value = int(value) + except: + value = 0 + if self.inimage: + context = self._getContext() + context['image']['height'] = value + + def _start_url(self, attrsD): + self.push('href', 1) + _start_homepage = _start_url + _start_uri = _start_url + + def _end_url(self): + value = self.pop('href') + if self.inauthor: + self._save_author('href', value) + elif self.incontributor: + self._save_contributor('href', value) + elif self.inimage: + context = self._getContext() + context['image']['href'] = value + elif self.intextinput: + context = self._getContext() + context['textinput']['link'] = value + _end_homepage = _end_url + _end_uri = _end_url + + def _start_email(self, attrsD): + self.push('email', 0) + _start_itunes_email = _start_email + + def _end_email(self): + value = self.pop('email') + if self.inpublisher: + self._save_author('email', value, 'publisher') + elif self.inauthor: + self._save_author('email', value) + elif self.incontributor: + self._save_contributor('email', value) + _end_itunes_email = _end_email + + def _getContext(self): + if self.insource: + context = self.sourcedata + elif self.inentry: + context = self.entries[-1] + else: + context = self.feeddata + return context + + def _save_author(self, key, value, prefix='author'): + context = self._getContext() + context.setdefault(prefix + '_detail', FeedParserDict()) + context[prefix + '_detail'][key] = value + self._sync_author_detail() + + def _save_contributor(self, key, value): + context = self._getContext() + context.setdefault('contributors', [FeedParserDict()]) + context['contributors'][-1][key] = value + + def _sync_author_detail(self, key='author'): + context = self._getContext() + detail = context.get('%s_detail' % key) + if detail: + name = detail.get('name') + email = detail.get('email') + if name and email: + context[key] = '%s (%s)' % (name, email) + elif name: + context[key] = name + elif email: + context[key] = email + else: + author = context.get(key) + if not author: return + emailmatch = re.search(r'''(([a-zA-Z0-9\_\-\.\+]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?))''', author) + if not emailmatch: return + email = emailmatch.group(0) + # probably a better way to do the following, but it passes all the tests + author = author.replace(email, '') + author = author.replace('()', '') + author = author.strip() + if author and (author[0] == '('): + author = author[1:] + if author and (author[-1] == ')'): + author = author[:-1] + author = author.strip() + context.setdefault('%s_detail' % key, FeedParserDict()) + context['%s_detail' % key]['name'] = author + context['%s_detail' % key]['email'] = email + + def _start_subtitle(self, attrsD): + self.pushContent('subtitle', attrsD, 'text/plain', 1) + _start_tagline = _start_subtitle + _start_itunes_subtitle = _start_subtitle + + def _end_subtitle(self): + self.popContent('subtitle') + _end_tagline = _end_subtitle + _end_itunes_subtitle = _end_subtitle + + def _start_rights(self, attrsD): + self.pushContent('rights', attrsD, 'text/plain', 1) + _start_dc_rights = _start_rights + _start_copyright = _start_rights + + def _end_rights(self): + self.popContent('rights') + _end_dc_rights = _end_rights + _end_copyright = _end_rights + + def _start_item(self, attrsD): + self.entries.append(FeedParserDict()) + self.push('item', 0) + self.inentry = 1 + self.guidislink = 0 + id = self._getAttribute(attrsD, 'rdf:about') + if id: + context = self._getContext() + context['id'] = id + self._cdf_common(attrsD) + _start_entry = _start_item + _start_product = _start_item + + def _end_item(self): + self.pop('item') + self.inentry = 0 + _end_entry = _end_item + + def _start_dc_language(self, attrsD): + self.push('language', 1) + _start_language = _start_dc_language + + def _end_dc_language(self): + self.lang = self.pop('language') + _end_language = _end_dc_language + + def _start_dc_publisher(self, attrsD): + self.push('publisher', 1) + _start_webmaster = _start_dc_publisher + + def _end_dc_publisher(self): + self.pop('publisher') + self._sync_author_detail('publisher') + _end_webmaster = _end_dc_publisher + + def _start_published(self, attrsD): + self.push('published', 1) + _start_dcterms_issued = _start_published + _start_issued = _start_published + + def _end_published(self): + value = self.pop('published') + self._save('published_parsed', _parse_date(value)) + _end_dcterms_issued = _end_published + _end_issued = _end_published + + def _start_updated(self, attrsD): + self.push('updated', 1) + _start_modified = _start_updated + _start_dcterms_modified = _start_updated + _start_pubdate = _start_updated + _start_dc_date = _start_updated + + def _end_updated(self): + value = self.pop('updated') + parsed_value = _parse_date(value) + self._save('updated_parsed', parsed_value) + _end_modified = _end_updated + _end_dcterms_modified = _end_updated + _end_pubdate = _end_updated + _end_dc_date = _end_updated + + def _start_created(self, attrsD): + self.push('created', 1) + _start_dcterms_created = _start_created + + def _end_created(self): + value = self.pop('created') + self._save('created_parsed', _parse_date(value)) + _end_dcterms_created = _end_created + + def _start_expirationdate(self, attrsD): + self.push('expired', 1) + + def _end_expirationdate(self): + self._save('expired_parsed', _parse_date(self.pop('expired'))) + + def _start_cc_license(self, attrsD): + self.push('license', 1) + value = self._getAttribute(attrsD, 'rdf:resource') + if value: + self.elementstack[-1][2].append(value) + self.pop('license') + + def _start_creativecommons_license(self, attrsD): + self.push('license', 1) + + def _end_creativecommons_license(self): + self.pop('license') + + def _addTag(self, term, scheme, label): + context = self._getContext() + tags = context.setdefault('tags', []) + if (not term) and (not scheme) and (not label): return + value = FeedParserDict({'term': term, 'scheme': scheme, 'label': label}) + if value not in tags: + tags.append(FeedParserDict({'term': term, 'scheme': scheme, 'label': label})) + + def _start_category(self, attrsD): + if _debug: sys.stderr.write('entering _start_category with %s\n' % repr(attrsD)) + term = attrsD.get('term') + scheme = attrsD.get('scheme', attrsD.get('domain')) + label = attrsD.get('label') + self._addTag(term, scheme, label) + self.push('category', 1) + _start_dc_subject = _start_category + _start_keywords = _start_category + + def _end_itunes_keywords(self): + for term in self.pop('itunes_keywords').split(): + self._addTag(term, 'http://www.itunes.com/', None) + + def _start_itunes_category(self, attrsD): + self._addTag(attrsD.get('text'), 'http://www.itunes.com/', None) + self.push('category', 1) + + def _end_category(self): + value = self.pop('category') + if not value: return + context = self._getContext() + tags = context['tags'] + if value and len(tags) and not tags[-1]['term']: + tags[-1]['term'] = value + else: + self._addTag(value, None, None) + _end_dc_subject = _end_category + _end_keywords = _end_category + _end_itunes_category = _end_category + + def _start_cloud(self, attrsD): + self._getContext()['cloud'] = FeedParserDict(attrsD) + + def _start_link(self, attrsD): + attrsD.setdefault('rel', 'alternate') + attrsD.setdefault('type', 'text/html') + attrsD = self._itsAnHrefDamnIt(attrsD) + if attrsD.has_key('href'): + attrsD['href'] = self.resolveURI(attrsD['href']) + expectingText = self.infeed or self.inentry or self.insource + context = self._getContext() + context.setdefault('links', []) + context['links'].append(FeedParserDict(attrsD)) + if attrsD['rel'] == 'enclosure': + self._start_enclosure(attrsD) + if attrsD.has_key('href'): + expectingText = 0 + if (attrsD.get('rel') == 'alternate') and (self.mapContentType(attrsD.get('type')) in self.html_types): + context['link'] = attrsD['href'] + else: + self.push('link', expectingText) + _start_producturl = _start_link + + def _end_link(self): + value = self.pop('link') + context = self._getContext() + if self.intextinput: + context['textinput']['link'] = value + if self.inimage: + context['image']['link'] = value + _end_producturl = _end_link + + def _start_guid(self, attrsD): + self.guidislink = (attrsD.get('ispermalink', 'true') == 'true') + self.push('id', 1) + + def _end_guid(self): + value = self.pop('id') + self._save('guidislink', self.guidislink and not self._getContext().has_key('link')) + if self.guidislink: + # guid acts as link, but only if 'ispermalink' is not present or is 'true', + # and only if the item doesn't already have a link element + self._save('link', value) + + def _start_title(self, attrsD): + self.pushContent('title', attrsD, 'text/plain', self.infeed or self.inentry or self.insource) + _start_dc_title = _start_title + _start_media_title = _start_title + + def _end_title(self): + value = self.popContent('title') + context = self._getContext() + if self.intextinput: + context['textinput']['title'] = value + elif self.inimage: + context['image']['title'] = value + _end_dc_title = _end_title + _end_media_title = _end_title + + def _start_description(self, attrsD): + context = self._getContext() + if context.has_key('summary'): + self._summaryKey = 'content' + self._start_content(attrsD) + else: + self.pushContent('description', attrsD, 'text/html', self.infeed or self.inentry or self.insource) + + def _start_abstract(self, attrsD): + self.pushContent('description', attrsD, 'text/plain', self.infeed or self.inentry or self.insource) + + def _end_description(self): + if self._summaryKey == 'content': + self._end_content() + else: + value = self.popContent('description') + context = self._getContext() + if self.intextinput: + context['textinput']['description'] = value + elif self.inimage: + context['image']['description'] = value + self._summaryKey = None + _end_abstract = _end_description + + def _start_info(self, attrsD): + self.pushContent('info', attrsD, 'text/plain', 1) + _start_feedburner_browserfriendly = _start_info + + def _end_info(self): + self.popContent('info') + _end_feedburner_browserfriendly = _end_info + + def _start_generator(self, attrsD): + if attrsD: + attrsD = self._itsAnHrefDamnIt(attrsD) + if attrsD.has_key('href'): + attrsD['href'] = self.resolveURI(attrsD['href']) + self._getContext()['generator_detail'] = FeedParserDict(attrsD) + self.push('generator', 1) + + def _end_generator(self): + value = self.pop('generator') + context = self._getContext() + if context.has_key('generator_detail'): + context['generator_detail']['name'] = value + + def _start_admin_generatoragent(self, attrsD): + self.push('generator', 1) + value = self._getAttribute(attrsD, 'rdf:resource') + if value: + self.elementstack[-1][2].append(value) + self.pop('generator') + self._getContext()['generator_detail'] = FeedParserDict({'href': value}) + + def _start_admin_errorreportsto(self, attrsD): + self.push('errorreportsto', 1) + value = self._getAttribute(attrsD, 'rdf:resource') + if value: + self.elementstack[-1][2].append(value) + self.pop('errorreportsto') + + def _start_summary(self, attrsD): + context = self._getContext() + if context.has_key('summary'): + self._summaryKey = 'content' + self._start_content(attrsD) + else: + self._summaryKey = 'summary' + self.pushContent(self._summaryKey, attrsD, 'text/plain', 1) + _start_itunes_summary = _start_summary + + def _end_summary(self): + if self._summaryKey == 'content': + self._end_content() + else: + self.popContent(self._summaryKey or 'summary') + self._summaryKey = None + _end_itunes_summary = _end_summary + + def _start_enclosure(self, attrsD): + attrsD = self._itsAnHrefDamnIt(attrsD) + self._getContext().setdefault('enclosures', []).append(FeedParserDict(attrsD)) + href = attrsD.get('href') + if href: + context = self._getContext() + if not context.get('id'): + context['id'] = href + + def _start_source(self, attrsD): + self.insource = 1 + + def _end_source(self): + self.insource = 0 + self._getContext()['source'] = copy.deepcopy(self.sourcedata) + self.sourcedata.clear() + + def _start_content(self, attrsD): + self.pushContent('content', attrsD, 'text/plain', 1) + src = attrsD.get('src') + if src: + self.contentparams['src'] = src + self.push('content', 1) + + def _start_prodlink(self, attrsD): + self.pushContent('content', attrsD, 'text/html', 1) + + def _start_body(self, attrsD): + self.pushContent('content', attrsD, 'application/xhtml+xml', 1) + _start_xhtml_body = _start_body + + def _start_content_encoded(self, attrsD): + self.pushContent('content', attrsD, 'text/html', 1) + _start_fullitem = _start_content_encoded + + def _end_content(self): + copyToDescription = self.mapContentType(self.contentparams.get('type')) in (['text/plain'] + self.html_types) + value = self.popContent('content') + if copyToDescription: + self._save('description', value) + _end_body = _end_content + _end_xhtml_body = _end_content + _end_content_encoded = _end_content + _end_fullitem = _end_content + _end_prodlink = _end_content + + def _start_itunes_image(self, attrsD): + self.push('itunes_image', 0) + self._getContext()['image'] = FeedParserDict({'href': attrsD.get('href')}) + _start_itunes_link = _start_itunes_image + + def _end_itunes_block(self): + value = self.pop('itunes_block', 0) + self._getContext()['itunes_block'] = (value == 'yes') and 1 or 0 + + def _end_itunes_explicit(self): + value = self.pop('itunes_explicit', 0) + self._getContext()['itunes_explicit'] = (value == 'yes') and 1 or 0 + +if _XML_AVAILABLE: + class _StrictFeedParser(_FeedParserMixin, xml.sax.handler.ContentHandler): + def __init__(self, baseuri, baselang, encoding): + if _debug: sys.stderr.write('trying StrictFeedParser\n') + xml.sax.handler.ContentHandler.__init__(self) + _FeedParserMixin.__init__(self, baseuri, baselang, encoding) + self.bozo = 0 + self.exc = None + + def startPrefixMapping(self, prefix, uri): + self.trackNamespace(prefix, uri) + + def startElementNS(self, name, qname, attrs): + namespace, localname = name + lowernamespace = str(namespace or '').lower() + if lowernamespace.find('backend.userland.com/rss') <> -1: + # match any backend.userland.com namespace + namespace = 'http://backend.userland.com/rss' + lowernamespace = namespace + if qname and qname.find(':') > 0: + givenprefix = qname.split(':')[0] + else: + givenprefix = None + prefix = self._matchnamespaces.get(lowernamespace, givenprefix) + if givenprefix and (prefix == None or (prefix == '' and lowernamespace == '')) and not self.namespacesInUse.has_key(givenprefix): + raise UndeclaredNamespace, "'%s' is not associated with a namespace" % givenprefix + if prefix: + localname = prefix + ':' + localname + localname = str(localname).lower() + if _debug: sys.stderr.write('startElementNS: qname = %s, namespace = %s, givenprefix = %s, prefix = %s, attrs = %s, localname = %s\n' % (qname, namespace, givenprefix, prefix, attrs.items(), localname)) + + # qname implementation is horribly broken in Python 2.1 (it + # doesn't report any), and slightly broken in Python 2.2 (it + # doesn't report the xml: namespace). So we match up namespaces + # with a known list first, and then possibly override them with + # the qnames the SAX parser gives us (if indeed it gives us any + # at all). Thanks to MatejC for helping me test this and + # tirelessly telling me that it didn't work yet. + attrsD = {} + for (namespace, attrlocalname), attrvalue in attrs._attrs.items(): + lowernamespace = (namespace or '').lower() + prefix = self._matchnamespaces.get(lowernamespace, '') + if prefix: + attrlocalname = prefix + ':' + attrlocalname + attrsD[str(attrlocalname).lower()] = attrvalue + for qname in attrs.getQNames(): + attrsD[str(qname).lower()] = attrs.getValueByQName(qname) + self.unknown_starttag(localname, attrsD.items()) + + def characters(self, text): + self.handle_data(text) + + def endElementNS(self, name, qname): + namespace, localname = name + lowernamespace = str(namespace or '').lower() + if qname and qname.find(':') > 0: + givenprefix = qname.split(':')[0] + else: + givenprefix = '' + prefix = self._matchnamespaces.get(lowernamespace, givenprefix) + if prefix: + localname = prefix + ':' + localname + localname = str(localname).lower() + self.unknown_endtag(localname) + + def error(self, exc): + self.bozo = 1 + self.exc = exc + + def fatalError(self, exc): + self.error(exc) + raise exc + +class _BaseHTMLProcessor(sgmllib.SGMLParser): + elements_no_end_tag = ['area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', + 'img', 'input', 'isindex', 'link', 'meta', 'param'] + + def __init__(self, encoding): + self.encoding = encoding + if _debug: sys.stderr.write('entering BaseHTMLProcessor, encoding=%s\n' % self.encoding) + sgmllib.SGMLParser.__init__(self) + + def reset(self): + self.pieces = [] + sgmllib.SGMLParser.reset(self) + + def _shorttag_replace(self, match): + tag = match.group(1) + if tag in self.elements_no_end_tag: + return '<' + tag + ' />' + else: + return '<' + tag + '>' + + def feed(self, data): + data = re.compile(r'', self._shorttag_replace, data) # bug [ 1399464 ] Bad regexp for _shorttag_replace + data = re.sub(r'<([^<\s]+?)\s*/>', self._shorttag_replace, data) + data = data.replace(''', "'") + data = data.replace('"', '"') + if self.encoding and type(data) == type(u''): + data = data.encode(self.encoding) + sgmllib.SGMLParser.feed(self, data) + + def normalize_attrs(self, attrs): + # utility method to be called by descendants + attrs = [(k.lower(), v) for k, v in attrs] + attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs] + return attrs + + def unknown_starttag(self, tag, attrs): + # called for each start tag + # attrs is a list of (attr, value) tuples + # e.g. for
, tag='pre', attrs=[('class', 'screen')]
+        if _debug: sys.stderr.write('_BaseHTMLProcessor, unknown_starttag, tag=%s\n' % tag)
+        uattrs = []
+        # thanks to Kevin Marks for this breathtaking hack to deal with (valid) high-bit attribute values in UTF-8 feeds
+        for key, value in attrs:
+            if type(value) != type(u''):
+                value = unicode(value, self.encoding)
+            uattrs.append((unicode(key, self.encoding), value))
+        strattrs = u''.join([u' %s="%s"' % (key, value) for key, value in uattrs]).encode(self.encoding)
+        if tag in self.elements_no_end_tag:
+            self.pieces.append('<%(tag)s%(strattrs)s />' % locals())
+        else:
+            self.pieces.append('<%(tag)s%(strattrs)s>' % locals())
+
+    def unknown_endtag(self, tag):
+        # called for each end tag, e.g. for 
, tag will be 'pre' + # Reconstruct the original end tag. + if tag not in self.elements_no_end_tag: + self.pieces.append("" % locals()) + + def handle_charref(self, ref): + # called for each character reference, e.g. for ' ', ref will be '160' + # Reconstruct the original character reference. + self.pieces.append('&#%(ref)s;' % locals()) + + def handle_entityref(self, ref): + # called for each entity reference, e.g. for '©', ref will be 'copy' + # Reconstruct the original entity reference. + self.pieces.append('&%(ref)s;' % locals()) + + def handle_data(self, text): + # called for each block of plain text, i.e. outside of any tag and + # not containing any character or entity references + # Store the original text verbatim. + if _debug: sys.stderr.write('_BaseHTMLProcessor, handle_text, text=%s\n' % text) + self.pieces.append(text) + + def handle_comment(self, text): + # called for each HTML comment, e.g. + # Reconstruct the original comment. + self.pieces.append('' % locals()) + + def handle_pi(self, text): + # called for each processing instruction, e.g. + # Reconstruct original processing instruction. + self.pieces.append('' % locals()) + + def handle_decl(self, text): + # called for the DOCTYPE, if present, e.g. + # + # Reconstruct original DOCTYPE + self.pieces.append('' % locals()) + + _new_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9:]*\s*').match + def _scan_name(self, i, declstartpos): + rawdata = self.rawdata + n = len(rawdata) + if i == n: + return None, -1 + m = self._new_declname_match(rawdata, i) + if m: + s = m.group() + name = s.strip() + if (i + len(s)) == n: + return None, -1 # end of buffer + return name.lower(), m.end() + else: + self.handle_data(rawdata) +# self.updatepos(declstartpos, i) + return None, -1 + + def output(self): + '''Return processed HTML as a single string''' + return ''.join([str(p) for p in self.pieces]) + +class _LooseFeedParser(_FeedParserMixin, _BaseHTMLProcessor): + def __init__(self, baseuri, baselang, encoding): + sgmllib.SGMLParser.__init__(self) + _FeedParserMixin.__init__(self, baseuri, baselang, encoding) + + def decodeEntities(self, element, data): + data = data.replace('<', '<') + data = data.replace('<', '<') + data = data.replace('>', '>') + data = data.replace('>', '>') + data = data.replace('&', '&') + data = data.replace('&', '&') + data = data.replace('"', '"') + data = data.replace('"', '"') + data = data.replace(''', ''') + data = data.replace(''', ''') + if self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'): + data = data.replace('<', '<') + data = data.replace('>', '>') + data = data.replace('&', '&') + data = data.replace('"', '"') + data = data.replace(''', "'") + return data + +class _RelativeURIResolver(_BaseHTMLProcessor): + relative_uris = [('a', 'href'), + ('applet', 'codebase'), + ('area', 'href'), + ('blockquote', 'cite'), + ('body', 'background'), + ('del', 'cite'), + ('form', 'action'), + ('frame', 'longdesc'), + ('frame', 'src'), + ('iframe', 'longdesc'), + ('iframe', 'src'), + ('head', 'profile'), + ('img', 'longdesc'), + ('img', 'src'), + ('img', 'usemap'), + ('input', 'src'), + ('input', 'usemap'), + ('ins', 'cite'), + ('link', 'href'), + ('object', 'classid'), + ('object', 'codebase'), + ('object', 'data'), + ('object', 'usemap'), + ('q', 'cite'), + ('script', 'src')] + + def __init__(self, baseuri, encoding): + _BaseHTMLProcessor.__init__(self, encoding) + self.baseuri = baseuri + + def resolveURI(self, uri): + return _urljoin(self.baseuri, uri) + + def unknown_starttag(self, tag, attrs): + attrs = self.normalize_attrs(attrs) + attrs = [(key, ((tag, key) in self.relative_uris) and self.resolveURI(value) or value) for key, value in attrs] + _BaseHTMLProcessor.unknown_starttag(self, tag, attrs) + +def _resolveRelativeURIs(htmlSource, baseURI, encoding): + if _debug: sys.stderr.write('entering _resolveRelativeURIs\n') + p = _RelativeURIResolver(baseURI, encoding) + p.feed(htmlSource) + return p.output() + +class _HTMLSanitizer(_BaseHTMLProcessor): + acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area', 'b', 'big', + 'blockquote', 'br', 'button', 'caption', 'center', 'cite', 'code', 'col', + 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', 'em', 'fieldset', + 'font', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input', + 'ins', 'kbd', 'label', 'legend', 'li', 'map', 'menu', 'ol', 'optgroup', + 'option', 'p', 'pre', 'q', 's', 'samp', 'select', 'small', 'span', 'strike', + 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', + 'thead', 'tr', 'tt', 'u', 'ul', 'var'] + + acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey', + 'action', 'align', 'alt', 'axis', 'border', 'cellpadding', 'cellspacing', + 'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'clear', 'cols', + 'colspan', 'color', 'compact', 'coords', 'datetime', 'dir', 'disabled', + 'enctype', 'for', 'frame', 'headers', 'height', 'href', 'hreflang', 'hspace', + 'id', 'ismap', 'label', 'lang', 'longdesc', 'maxlength', 'media', 'method', + 'multiple', 'name', 'nohref', 'noshade', 'nowrap', 'prompt', 'readonly', + 'rel', 'rev', 'rows', 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size', + 'span', 'src', 'start', 'summary', 'tabindex', 'target', 'title', 'type', + 'usemap', 'valign', 'value', 'vspace', 'width'] + + unacceptable_elements_with_end_tag = ['script', 'applet'] + + def reset(self): + _BaseHTMLProcessor.reset(self) + self.unacceptablestack = 0 + + def unknown_starttag(self, tag, attrs): + if not tag in self.acceptable_elements: + if tag in self.unacceptable_elements_with_end_tag: + self.unacceptablestack += 1 + return + attrs = self.normalize_attrs(attrs) + attrs = [(key, value) for key, value in attrs if key in self.acceptable_attributes] + _BaseHTMLProcessor.unknown_starttag(self, tag, attrs) + + def unknown_endtag(self, tag): + if not tag in self.acceptable_elements: + if tag in self.unacceptable_elements_with_end_tag: + self.unacceptablestack -= 1 + return + _BaseHTMLProcessor.unknown_endtag(self, tag) + + def handle_pi(self, text): + pass + + def handle_decl(self, text): + pass + + def handle_data(self, text): + if not self.unacceptablestack: + _BaseHTMLProcessor.handle_data(self, text) + +def _sanitizeHTML(htmlSource, encoding): + p = _HTMLSanitizer(encoding) + p.feed(htmlSource) + data = p.output() + if TIDY_MARKUP: + # loop through list of preferred Tidy interfaces looking for one that's installed, + # then set up a common _tidy function to wrap the interface-specific API. + _tidy = None + for tidy_interface in PREFERRED_TIDY_INTERFACES: + try: + if tidy_interface == "uTidy": + from tidy import parseString as _utidy + def _tidy(data, **kwargs): + return str(_utidy(data, **kwargs)) + break + elif tidy_interface == "mxTidy": + from mx.Tidy import Tidy as _mxtidy + def _tidy(data, **kwargs): + nerrors, nwarnings, data, errordata = _mxtidy.tidy(data, **kwargs) + return data + break + except: + pass + if _tidy: + utf8 = type(data) == type(u'') + if utf8: + data = data.encode('utf-8') + data = _tidy(data, output_xhtml=1, numeric_entities=1, wrap=0, char_encoding="utf8") + if utf8: + data = unicode(data, 'utf-8') + if data.count(''): + data = data.split('>', 1)[1] + if data.count('= '2.3.3' + assert base64 != None + user, passw = base64.decodestring(req.headers['Authorization'].split(' ')[1]).split(':') + realm = re.findall('realm="([^"]*)"', headers['WWW-Authenticate'])[0] + self.add_password(realm, host, user, passw) + retry = self.http_error_auth_reqed('www-authenticate', host, req, headers) + self.reset_retry_count() + return retry + except: + return self.http_error_default(req, fp, code, msg, headers) + +def _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers): + """URL, filename, or string --> stream + + This function lets you define parsers that take any input source + (URL, pathname to local or network file, or actual data as a string) + and deal with it in a uniform manner. Returned object is guaranteed + to have all the basic stdio read methods (read, readline, readlines). + Just .close() the object when you're done with it. + + If the etag argument is supplied, it will be used as the value of an + If-None-Match request header. + + If the modified argument is supplied, it must be a tuple of 9 integers + as returned by gmtime() in the standard Python time module. This MUST + be in GMT (Greenwich Mean Time). The formatted date/time will be used + as the value of an If-Modified-Since request header. + + If the agent argument is supplied, it will be used as the value of a + User-Agent request header. + + If the referrer argument is supplied, it will be used as the value of a + Referer[sic] request header. + + If handlers is supplied, it is a list of handlers used to build a + urllib2 opener. + """ + + if hasattr(url_file_stream_or_string, 'read'): + return url_file_stream_or_string + + if url_file_stream_or_string == '-': + return sys.stdin + + if urlparse.urlparse(url_file_stream_or_string)[0] in ('http', 'https', 'ftp'): + if not agent: + agent = USER_AGENT + # test for inline user:password for basic auth + auth = None + if base64: + urltype, rest = urllib.splittype(url_file_stream_or_string) + realhost, rest = urllib.splithost(rest) + if realhost: + user_passwd, realhost = urllib.splituser(realhost) + if user_passwd: + url_file_stream_or_string = '%s://%s%s' % (urltype, realhost, rest) + auth = base64.encodestring(user_passwd).strip() + # try to open with urllib2 (to use optional headers) + request = urllib2.Request(url_file_stream_or_string) + request.add_header('User-Agent', agent) + if etag: + request.add_header('If-None-Match', etag) + if modified: + # format into an RFC 1123-compliant timestamp. We can't use + # time.strftime() since the %a and %b directives can be affected + # by the current locale, but RFC 2616 states that dates must be + # in English. + short_weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] + months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] + request.add_header('If-Modified-Since', '%s, %02d %s %04d %02d:%02d:%02d GMT' % (short_weekdays[modified[6]], modified[2], months[modified[1] - 1], modified[0], modified[3], modified[4], modified[5])) + if referrer: + request.add_header('Referer', referrer) + if gzip and zlib: + request.add_header('Accept-encoding', 'gzip, deflate') + elif gzip: + request.add_header('Accept-encoding', 'gzip') + elif zlib: + request.add_header('Accept-encoding', 'deflate') + else: + request.add_header('Accept-encoding', '') + if auth: + request.add_header('Authorization', 'Basic %s' % auth) + if ACCEPT_HEADER: + request.add_header('Accept', ACCEPT_HEADER) + request.add_header('A-IM', 'feed') # RFC 3229 support + opener = apply(urllib2.build_opener, tuple([_FeedURLHandler()] + handlers)) + opener.addheaders = [] # RMK - must clear so we only send our custom User-Agent + try: + return opener.open(request) + finally: + opener.close() # JohnD + + # try to open with native open function (if url_file_stream_or_string is a filename) + try: + return open(url_file_stream_or_string) + except: + pass + + # treat url_file_stream_or_string as string + return _StringIO(str(url_file_stream_or_string)) + +_date_handlers = [] +def registerDateHandler(func): + '''Register a date handler function (takes string, returns 9-tuple date in GMT)''' + _date_handlers.insert(0, func) + +# ISO-8601 date parsing routines written by Fazal Majid. +# The ISO 8601 standard is very convoluted and irregular - a full ISO 8601 +# parser is beyond the scope of feedparser and would be a worthwhile addition +# to the Python library. +# A single regular expression cannot parse ISO 8601 date formats into groups +# as the standard is highly irregular (for instance is 030104 2003-01-04 or +# 0301-04-01), so we use templates instead. +# Please note the order in templates is significant because we need a +# greedy match. +_iso8601_tmpl = ['YYYY-?MM-?DD', 'YYYY-MM', 'YYYY-?OOO', + 'YY-?MM-?DD', 'YY-?OOO', 'YYYY', + '-YY-?MM', '-OOO', '-YY', + '--MM-?DD', '--MM', + '---DD', + 'CC', ''] +_iso8601_re = [ + tmpl.replace( + 'YYYY', r'(?P\d{4})').replace( + 'YY', r'(?P\d\d)').replace( + 'MM', r'(?P[01]\d)').replace( + 'DD', r'(?P[0123]\d)').replace( + 'OOO', r'(?P[0123]\d\d)').replace( + 'CC', r'(?P\d\d$)') + + r'(T?(?P\d{2}):(?P\d{2})' + + r'(:(?P\d{2}))?' + + r'(?P[+-](?P\d{2})(:(?P\d{2}))?|Z)?)?' + for tmpl in _iso8601_tmpl] +del tmpl +_iso8601_matches = [re.compile(regex).match for regex in _iso8601_re] +del regex +def _parse_date_iso8601(dateString): + '''Parse a variety of ISO-8601-compatible formats like 20040105''' + m = None + for _iso8601_match in _iso8601_matches: + m = _iso8601_match(dateString) + if m: break + if not m: return + if m.span() == (0, 0): return + params = m.groupdict() + ordinal = params.get('ordinal', 0) + if ordinal: + ordinal = int(ordinal) + else: + ordinal = 0 + year = params.get('year', '--') + if not year or year == '--': + year = time.gmtime()[0] + elif len(year) == 2: + # ISO 8601 assumes current century, i.e. 93 -> 2093, NOT 1993 + year = 100 * int(time.gmtime()[0] / 100) + int(year) + else: + year = int(year) + month = params.get('month', '-') + if not month or month == '-': + # ordinals are NOT normalized by mktime, we simulate them + # by setting month=1, day=ordinal + if ordinal: + month = 1 + else: + month = time.gmtime()[1] + month = int(month) + day = params.get('day', 0) + if not day: + # see above + if ordinal: + day = ordinal + elif params.get('century', 0) or \ + params.get('year', 0) or params.get('month', 0): + day = 1 + else: + day = time.gmtime()[2] + else: + day = int(day) + # special case of the century - is the first year of the 21st century + # 2000 or 2001 ? The debate goes on... + if 'century' in params.keys(): + year = (int(params['century']) - 1) * 100 + 1 + # in ISO 8601 most fields are optional + for field in ['hour', 'minute', 'second', 'tzhour', 'tzmin']: + if not params.get(field, None): + params[field] = 0 + hour = int(params.get('hour', 0)) + minute = int(params.get('minute', 0)) + second = int(params.get('second', 0)) + # weekday is normalized by mktime(), we can ignore it + weekday = 0 + # daylight savings is complex, but not needed for feedparser's purposes + # as time zones, if specified, include mention of whether it is active + # (e.g. PST vs. PDT, CET). Using -1 is implementation-dependent and + # and most implementations have DST bugs + daylight_savings_flag = 0 + tm = [year, month, day, hour, minute, second, weekday, + ordinal, daylight_savings_flag] + # ISO 8601 time zone adjustments + tz = params.get('tz') + if tz and tz != 'Z': + if tz[0] == '-': + tm[3] += int(params.get('tzhour', 0)) + tm[4] += int(params.get('tzmin', 0)) + elif tz[0] == '+': + tm[3] -= int(params.get('tzhour', 0)) + tm[4] -= int(params.get('tzmin', 0)) + else: + return None + # Python's time.mktime() is a wrapper around the ANSI C mktime(3c) + # which is guaranteed to normalize d/m/y/h/m/s. + # Many implementations have bugs, but we'll pretend they don't. + return time.localtime(time.mktime(tm)) +registerDateHandler(_parse_date_iso8601) + +# 8-bit date handling routines written by ytrewq1. +_korean_year = u'\ub144' # b3e2 in euc-kr +_korean_month = u'\uc6d4' # bff9 in euc-kr +_korean_day = u'\uc77c' # c0cf in euc-kr +_korean_am = u'\uc624\uc804' # bfc0 c0fc in euc-kr +_korean_pm = u'\uc624\ud6c4' # bfc0 c8c4 in euc-kr + +_korean_onblog_date_re = \ + re.compile('(\d{4})%s\s+(\d{2})%s\s+(\d{2})%s\s+(\d{2}):(\d{2}):(\d{2})' % \ + (_korean_year, _korean_month, _korean_day)) +_korean_nate_date_re = \ + re.compile(u'(\d{4})-(\d{2})-(\d{2})\s+(%s|%s)\s+(\d{,2}):(\d{,2}):(\d{,2})' % \ + (_korean_am, _korean_pm)) +def _parse_date_onblog(dateString): + '''Parse a string according to the OnBlog 8-bit date format''' + m = _korean_onblog_date_re.match(dateString) + if not m: return + w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \ + {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\ + 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\ + 'zonediff': '+09:00'} + if _debug: sys.stderr.write('OnBlog date parsed as: %s\n' % w3dtfdate) + return _parse_date_w3dtf(w3dtfdate) +registerDateHandler(_parse_date_onblog) + +def _parse_date_nate(dateString): + '''Parse a string according to the Nate 8-bit date format''' + m = _korean_nate_date_re.match(dateString) + if not m: return + hour = int(m.group(5)) + ampm = m.group(4) + if (ampm == _korean_pm): + hour += 12 + hour = str(hour) + if len(hour) == 1: + hour = '0' + hour + w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \ + {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\ + 'hour': hour, 'minute': m.group(6), 'second': m.group(7),\ + 'zonediff': '+09:00'} + if _debug: sys.stderr.write('Nate date parsed as: %s\n' % w3dtfdate) + return _parse_date_w3dtf(w3dtfdate) +registerDateHandler(_parse_date_nate) + +_mssql_date_re = \ + re.compile('(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})(\.\d+)?') +def _parse_date_mssql(dateString): + '''Parse a string according to the MS SQL date format''' + m = _mssql_date_re.match(dateString) + if not m: return + w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \ + {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\ + 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\ + 'zonediff': '+09:00'} + if _debug: sys.stderr.write('MS SQL date parsed as: %s\n' % w3dtfdate) + return _parse_date_w3dtf(w3dtfdate) +registerDateHandler(_parse_date_mssql) + +# Unicode strings for Greek date strings +_greek_months = \ + { \ + u'\u0399\u03b1\u03bd': u'Jan', # c9e1ed in iso-8859-7 + u'\u03a6\u03b5\u03b2': u'Feb', # d6e5e2 in iso-8859-7 + u'\u039c\u03ac\u03ce': u'Mar', # ccdcfe in iso-8859-7 + u'\u039c\u03b1\u03ce': u'Mar', # cce1fe in iso-8859-7 + u'\u0391\u03c0\u03c1': u'Apr', # c1f0f1 in iso-8859-7 + u'\u039c\u03ac\u03b9': u'May', # ccdce9 in iso-8859-7 + u'\u039c\u03b1\u03ca': u'May', # cce1fa in iso-8859-7 + u'\u039c\u03b1\u03b9': u'May', # cce1e9 in iso-8859-7 + u'\u0399\u03bf\u03cd\u03bd': u'Jun', # c9effded in iso-8859-7 + u'\u0399\u03bf\u03bd': u'Jun', # c9efed in iso-8859-7 + u'\u0399\u03bf\u03cd\u03bb': u'Jul', # c9effdeb in iso-8859-7 + u'\u0399\u03bf\u03bb': u'Jul', # c9f9eb in iso-8859-7 + u'\u0391\u03cd\u03b3': u'Aug', # c1fde3 in iso-8859-7 + u'\u0391\u03c5\u03b3': u'Aug', # c1f5e3 in iso-8859-7 + u'\u03a3\u03b5\u03c0': u'Sep', # d3e5f0 in iso-8859-7 + u'\u039f\u03ba\u03c4': u'Oct', # cfeaf4 in iso-8859-7 + u'\u039d\u03bf\u03ad': u'Nov', # cdefdd in iso-8859-7 + u'\u039d\u03bf\u03b5': u'Nov', # cdefe5 in iso-8859-7 + u'\u0394\u03b5\u03ba': u'Dec', # c4e5ea in iso-8859-7 + } + +_greek_wdays = \ + { \ + u'\u039a\u03c5\u03c1': u'Sun', # caf5f1 in iso-8859-7 + u'\u0394\u03b5\u03c5': u'Mon', # c4e5f5 in iso-8859-7 + u'\u03a4\u03c1\u03b9': u'Tue', # d4f1e9 in iso-8859-7 + u'\u03a4\u03b5\u03c4': u'Wed', # d4e5f4 in iso-8859-7 + u'\u03a0\u03b5\u03bc': u'Thu', # d0e5ec in iso-8859-7 + u'\u03a0\u03b1\u03c1': u'Fri', # d0e1f1 in iso-8859-7 + u'\u03a3\u03b1\u03b2': u'Sat', # d3e1e2 in iso-8859-7 + } + +_greek_date_format_re = \ + re.compile(u'([^,]+),\s+(\d{2})\s+([^\s]+)\s+(\d{4})\s+(\d{2}):(\d{2}):(\d{2})\s+([^\s]+)') + +def _parse_date_greek(dateString): + '''Parse a string according to a Greek 8-bit date format.''' + m = _greek_date_format_re.match(dateString) + if not m: return + try: + wday = _greek_wdays[m.group(1)] + month = _greek_months[m.group(3)] + except: + return + rfc822date = '%(wday)s, %(day)s %(month)s %(year)s %(hour)s:%(minute)s:%(second)s %(zonediff)s' % \ + {'wday': wday, 'day': m.group(2), 'month': month, 'year': m.group(4),\ + 'hour': m.group(5), 'minute': m.group(6), 'second': m.group(7),\ + 'zonediff': m.group(8)} + if _debug: sys.stderr.write('Greek date parsed as: %s\n' % rfc822date) + return _parse_date_rfc822(rfc822date) +registerDateHandler(_parse_date_greek) + +# Unicode strings for Hungarian date strings +_hungarian_months = \ + { \ + u'janu\u00e1r': u'01', # e1 in iso-8859-2 + u'febru\u00e1ri': u'02', # e1 in iso-8859-2 + u'm\u00e1rcius': u'03', # e1 in iso-8859-2 + u'\u00e1prilis': u'04', # e1 in iso-8859-2 + u'm\u00e1ujus': u'05', # e1 in iso-8859-2 + u'j\u00fanius': u'06', # fa in iso-8859-2 + u'j\u00falius': u'07', # fa in iso-8859-2 + u'augusztus': u'08', + u'szeptember': u'09', + u'okt\u00f3ber': u'10', # f3 in iso-8859-2 + u'november': u'11', + u'december': u'12', + } + +_hungarian_date_format_re = \ + re.compile(u'(\d{4})-([^-]+)-(\d{,2})T(\d{,2}):(\d{2})((\+|-)(\d{,2}:\d{2}))') + +def _parse_date_hungarian(dateString): + '''Parse a string according to a Hungarian 8-bit date format.''' + m = _hungarian_date_format_re.match(dateString) + if not m: return + try: + month = _hungarian_months[m.group(2)] + day = m.group(3) + if len(day) == 1: + day = '0' + day + hour = m.group(4) + if len(hour) == 1: + hour = '0' + hour + except: + return + w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s%(zonediff)s' % \ + {'year': m.group(1), 'month': month, 'day': day,\ + 'hour': hour, 'minute': m.group(5),\ + 'zonediff': m.group(6)} + if _debug: sys.stderr.write('Hungarian date parsed as: %s\n' % w3dtfdate) + return _parse_date_w3dtf(w3dtfdate) +registerDateHandler(_parse_date_hungarian) + +# W3DTF-style date parsing adapted from PyXML xml.utils.iso8601, written by +# Drake and licensed under the Python license. Removed all range checking +# for month, day, hour, minute, and second, since mktime will normalize +# these later +def _parse_date_w3dtf(dateString): + def __extract_date(m): + year = int(m.group('year')) + if year < 100: + year = 100 * int(time.gmtime()[0] / 100) + int(year) + if year < 1000: + return 0, 0, 0 + julian = m.group('julian') + if julian: + julian = int(julian) + month = julian / 30 + 1 + day = julian % 30 + 1 + jday = None + while jday != julian: + t = time.mktime((year, month, day, 0, 0, 0, 0, 0, 0)) + jday = time.gmtime(t)[-2] + diff = abs(jday - julian) + if jday > julian: + if diff < day: + day = day - diff + else: + month = month - 1 + day = 31 + elif jday < julian: + if day + diff < 28: + day = day + diff + else: + month = month + 1 + return year, month, day + month = m.group('month') + day = 1 + if month is None: + month = 1 + else: + month = int(month) + day = m.group('day') + if day: + day = int(day) + else: + day = 1 + return year, month, day + + def __extract_time(m): + if not m: + return 0, 0, 0 + hours = m.group('hours') + if not hours: + return 0, 0, 0 + hours = int(hours) + minutes = int(m.group('minutes')) + seconds = m.group('seconds') + if seconds: + seconds = int(seconds) + else: + seconds = 0 + return hours, minutes, seconds + + def __extract_tzd(m): + '''Return the Time Zone Designator as an offset in seconds from UTC.''' + if not m: + return 0 + tzd = m.group('tzd') + if not tzd: + return 0 + if tzd == 'Z': + return 0 + hours = int(m.group('tzdhours')) + minutes = m.group('tzdminutes') + if minutes: + minutes = int(minutes) + else: + minutes = 0 + offset = (hours*60 + minutes) * 60 + if tzd[0] == '+': + return -offset + return offset + + __date_re = ('(?P\d\d\d\d)' + '(?:(?P-|)' + '(?:(?P\d\d\d)' + '|(?P\d\d)(?:(?P=dsep)(?P\d\d))?))?') + __tzd_re = '(?P[-+](?P\d\d)(?::?(?P\d\d))|Z)' + __tzd_rx = re.compile(__tzd_re) + __time_re = ('(?P\d\d)(?P:|)(?P\d\d)' + '(?:(?P=tsep)(?P\d\d(?:[.,]\d+)?))?' + + __tzd_re) + __datetime_re = '%s(?:T%s)?' % (__date_re, __time_re) + __datetime_rx = re.compile(__datetime_re) + m = __datetime_rx.match(dateString) + if (m is None) or (m.group() != dateString): return + gmt = __extract_date(m) + __extract_time(m) + (0, 0, 0) + if gmt[0] == 0: return + return time.gmtime(time.mktime(gmt) + __extract_tzd(m) - time.timezone) +registerDateHandler(_parse_date_w3dtf) + +def _parse_date_rfc822(dateString): + '''Parse an RFC822, RFC1123, RFC2822, or asctime-style date''' + data = dateString.split() + if data[0][-1] in (',', '.') or data[0].lower() in rfc822._daynames: + del data[0] + if len(data) == 4: + s = data[3] + i = s.find('+') + if i > 0: + data[3:] = [s[:i], s[i+1:]] + else: + data.append('') + dateString = " ".join(data) + if len(data) < 5: + dateString += ' 00:00:00 GMT' + tm = rfc822.parsedate_tz(dateString) + if tm: + return time.gmtime(rfc822.mktime_tz(tm)) +# rfc822.py defines several time zones, but we define some extra ones. +# 'ET' is equivalent to 'EST', etc. +_additional_timezones = {'AT': -400, 'ET': -500, 'CT': -600, 'MT': -700, 'PT': -800} +rfc822._timezones.update(_additional_timezones) +registerDateHandler(_parse_date_rfc822) + +def _parse_date(dateString): + '''Parses a variety of date formats into a 9-tuple in GMT''' + for handler in _date_handlers: + try: + date9tuple = handler(dateString) + if not date9tuple: continue + if len(date9tuple) != 9: + if _debug: sys.stderr.write('date handler function must return 9-tuple\n') + raise ValueError + map(int, date9tuple) + return date9tuple + except Exception, e: + if _debug: sys.stderr.write('%s raised %s\n' % (handler.__name__, repr(e))) + pass + return None + +def _getCharacterEncoding(http_headers, xml_data): + '''Get the character encoding of the XML document + + http_headers is a dictionary + xml_data is a raw string (not Unicode) + + This is so much trickier than it sounds, it's not even funny. + According to RFC 3023 ('XML Media Types'), if the HTTP Content-Type + is application/xml, application/*+xml, + application/xml-external-parsed-entity, or application/xml-dtd, + the encoding given in the charset parameter of the HTTP Content-Type + takes precedence over the encoding given in the XML prefix within the + document, and defaults to 'utf-8' if neither are specified. But, if + the HTTP Content-Type is text/xml, text/*+xml, or + text/xml-external-parsed-entity, the encoding given in the XML prefix + within the document is ALWAYS IGNORED and only the encoding given in + the charset parameter of the HTTP Content-Type header should be + respected, and it defaults to 'us-ascii' if not specified. + + Furthermore, discussion on the atom-syntax mailing list with the + author of RFC 3023 leads me to the conclusion that any document + served with a Content-Type of text/* and no charset parameter + must be treated as us-ascii. (We now do this.) And also that it + must always be flagged as non-well-formed. (We now do this too.) + + If Content-Type is unspecified (input was local file or non-HTTP source) + or unrecognized (server just got it totally wrong), then go by the + encoding given in the XML prefix of the document and default to + 'iso-8859-1' as per the HTTP specification (RFC 2616). + + Then, assuming we didn't find a character encoding in the HTTP headers + (and the HTTP Content-type allowed us to look in the body), we need + to sniff the first few bytes of the XML data and try to determine + whether the encoding is ASCII-compatible. Section F of the XML + specification shows the way here: + http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info + + If the sniffed encoding is not ASCII-compatible, we need to make it + ASCII compatible so that we can sniff further into the XML declaration + to find the encoding attribute, which will tell us the true encoding. + + Of course, none of this guarantees that we will be able to parse the + feed in the declared character encoding (assuming it was declared + correctly, which many are not). CJKCodecs and iconv_codec help a lot; + you should definitely install them if you can. + http://cjkpython.i18n.org/ + ''' + + def _parseHTTPContentType(content_type): + '''takes HTTP Content-Type header and returns (content type, charset) + + If no charset is specified, returns (content type, '') + If no content type is specified, returns ('', '') + Both return parameters are guaranteed to be lowercase strings + ''' + content_type = content_type or '' + content_type, params = cgi.parse_header(content_type) + return content_type, params.get('charset', '').replace("'", '') + + sniffed_xml_encoding = '' + xml_encoding = '' + true_encoding = '' + http_content_type, http_encoding = _parseHTTPContentType(http_headers.get('content-type')) + # Must sniff for non-ASCII-compatible character encodings before + # searching for XML declaration. This heuristic is defined in + # section F of the XML specification: + # http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info + try: + if xml_data[:4] == '\x4c\x6f\xa7\x94': + # EBCDIC + xml_data = _ebcdic_to_ascii(xml_data) + elif xml_data[:4] == '\x00\x3c\x00\x3f': + # UTF-16BE + sniffed_xml_encoding = 'utf-16be' + xml_data = unicode(xml_data, 'utf-16be').encode('utf-8') + elif (len(xml_data) >= 4) and (xml_data[:2] == '\xfe\xff') and (xml_data[2:4] != '\x00\x00'): + # UTF-16BE with BOM + sniffed_xml_encoding = 'utf-16be' + xml_data = unicode(xml_data[2:], 'utf-16be').encode('utf-8') + elif xml_data[:4] == '\x3c\x00\x3f\x00': + # UTF-16LE + sniffed_xml_encoding = 'utf-16le' + xml_data = unicode(xml_data, 'utf-16le').encode('utf-8') + elif (len(xml_data) >= 4) and (xml_data[:2] == '\xff\xfe') and (xml_data[2:4] != '\x00\x00'): + # UTF-16LE with BOM + sniffed_xml_encoding = 'utf-16le' + xml_data = unicode(xml_data[2:], 'utf-16le').encode('utf-8') + elif xml_data[:4] == '\x00\x00\x00\x3c': + # UTF-32BE + sniffed_xml_encoding = 'utf-32be' + xml_data = unicode(xml_data, 'utf-32be').encode('utf-8') + elif xml_data[:4] == '\x3c\x00\x00\x00': + # UTF-32LE + sniffed_xml_encoding = 'utf-32le' + xml_data = unicode(xml_data, 'utf-32le').encode('utf-8') + elif xml_data[:4] == '\x00\x00\xfe\xff': + # UTF-32BE with BOM + sniffed_xml_encoding = 'utf-32be' + xml_data = unicode(xml_data[4:], 'utf-32be').encode('utf-8') + elif xml_data[:4] == '\xff\xfe\x00\x00': + # UTF-32LE with BOM + sniffed_xml_encoding = 'utf-32le' + xml_data = unicode(xml_data[4:], 'utf-32le').encode('utf-8') + elif xml_data[:3] == '\xef\xbb\xbf': + # UTF-8 with BOM + sniffed_xml_encoding = 'utf-8' + xml_data = unicode(xml_data[3:], 'utf-8').encode('utf-8') + else: + # ASCII-compatible + pass + xml_encoding_match = re.compile('^<\?.*encoding=[\'"](.*?)[\'"].*\?>').match(xml_data) + except: + xml_encoding_match = None + if xml_encoding_match: + xml_encoding = xml_encoding_match.groups()[0].lower() + if sniffed_xml_encoding and (xml_encoding in ('iso-10646-ucs-2', 'ucs-2', 'csunicode', 'iso-10646-ucs-4', 'ucs-4', 'csucs4', 'utf-16', 'utf-32', 'utf_16', 'utf_32', 'utf16', 'u16')): + xml_encoding = sniffed_xml_encoding + acceptable_content_type = 0 + application_content_types = ('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity') + text_content_types = ('text/xml', 'text/xml-external-parsed-entity') + if (http_content_type in application_content_types) or \ + (http_content_type.startswith('application/') and http_content_type.endswith('+xml')): + acceptable_content_type = 1 + true_encoding = http_encoding or xml_encoding or 'utf-8' + elif (http_content_type in text_content_types) or \ + (http_content_type.startswith('text/')) and http_content_type.endswith('+xml'): + acceptable_content_type = 1 + true_encoding = http_encoding or 'us-ascii' + elif http_content_type.startswith('text/'): + true_encoding = http_encoding or 'us-ascii' + elif http_headers and (not http_headers.has_key('content-type')): + true_encoding = xml_encoding or 'iso-8859-1' + else: + true_encoding = xml_encoding or 'utf-8' + return true_encoding, http_encoding, xml_encoding, sniffed_xml_encoding, acceptable_content_type + +def _toUTF8(data, encoding): + '''Changes an XML data stream on the fly to specify a new encoding + + data is a raw sequence of bytes (not Unicode) that is presumed to be in %encoding already + encoding is a string recognized by encodings.aliases + ''' + if _debug: sys.stderr.write('entering _toUTF8, trying encoding %s\n' % encoding) + # strip Byte Order Mark (if present) + if (len(data) >= 4) and (data[:2] == '\xfe\xff') and (data[2:4] != '\x00\x00'): + if _debug: + sys.stderr.write('stripping BOM\n') + if encoding != 'utf-16be': + sys.stderr.write('trying utf-16be instead\n') + encoding = 'utf-16be' + data = data[2:] + elif (len(data) >= 4) and (data[:2] == '\xff\xfe') and (data[2:4] != '\x00\x00'): + if _debug: + sys.stderr.write('stripping BOM\n') + if encoding != 'utf-16le': + sys.stderr.write('trying utf-16le instead\n') + encoding = 'utf-16le' + data = data[2:] + elif data[:3] == '\xef\xbb\xbf': + if _debug: + sys.stderr.write('stripping BOM\n') + if encoding != 'utf-8': + sys.stderr.write('trying utf-8 instead\n') + encoding = 'utf-8' + data = data[3:] + elif data[:4] == '\x00\x00\xfe\xff': + if _debug: + sys.stderr.write('stripping BOM\n') + if encoding != 'utf-32be': + sys.stderr.write('trying utf-32be instead\n') + encoding = 'utf-32be' + data = data[4:] + elif data[:4] == '\xff\xfe\x00\x00': + if _debug: + sys.stderr.write('stripping BOM\n') + if encoding != 'utf-32le': + sys.stderr.write('trying utf-32le instead\n') + encoding = 'utf-32le' + data = data[4:] + newdata = unicode(data, encoding) + if _debug: sys.stderr.write('successfully converted %s data to unicode\n' % encoding) + declmatch = re.compile('^<\?xml[^>]*?>') + newdecl = '''''' + if declmatch.search(newdata): + newdata = declmatch.sub(newdecl, newdata) + else: + newdata = newdecl + u'\n' + newdata + return newdata.encode('utf-8') + +def _stripDoctype(data): + '''Strips DOCTYPE from XML document, returns (rss_version, stripped_data) + + rss_version may be 'rss091n' or None + stripped_data is the same XML document, minus the DOCTYPE + ''' + entity_pattern = re.compile(r']*?)>', re.MULTILINE) + data = entity_pattern.sub('', data) + doctype_pattern = re.compile(r']*?)>', re.MULTILINE) + doctype_results = doctype_pattern.findall(data) + doctype = doctype_results and doctype_results[0] or '' + if doctype.lower().count('netscape'): + version = 'rss091n' + else: + version = None + data = doctype_pattern.sub('', data) + return version, data + +def parse(url_file_stream_or_string, etag=None, modified=None, agent=None, referrer=None, handlers=[]): + '''Parse a feed from a URL, file, stream, or string''' + result = FeedParserDict() + result['feed'] = FeedParserDict() + result['entries'] = [] + if _XML_AVAILABLE: + result['bozo'] = 0 + if type(handlers) == types.InstanceType: + handlers = [handlers] + try: + f = _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers) + data = f.read() + except Exception, e: + result['bozo'] = 1 + result['bozo_exception'] = e + data = '' + f = None + + # if feed is gzip-compressed, decompress it + if f and data and hasattr(f, 'headers'): + if gzip and f.headers.get('content-encoding', '') == 'gzip': + try: + data = gzip.GzipFile(fileobj=_StringIO(data)).read() + except Exception, e: + # Some feeds claim to be gzipped but they're not, so + # we get garbage. Ideally, we should re-request the + # feed without the 'Accept-encoding: gzip' header, + # but we don't. + result['bozo'] = 1 + result['bozo_exception'] = e + data = '' + elif zlib and f.headers.get('content-encoding', '') == 'deflate': + try: + data = zlib.decompress(data, -zlib.MAX_WBITS) + except Exception, e: + result['bozo'] = 1 + result['bozo_exception'] = e + data = '' + + # save HTTP headers + if hasattr(f, 'info'): + info = f.info() + result['etag'] = info.getheader('ETag') + last_modified = info.getheader('Last-Modified') + if last_modified: + result['modified'] = _parse_date(last_modified) + if hasattr(f, 'url'): + result['href'] = f.url + result['status'] = 200 + if hasattr(f, 'status'): + result['status'] = f.status + if hasattr(f, 'headers'): + result['headers'] = f.headers.dict + if hasattr(f, 'close'): + f.close() + + # there are four encodings to keep track of: + # - http_encoding is the encoding declared in the Content-Type HTTP header + # - xml_encoding is the encoding declared in the ; changed +# project name +#2.5 - 7/25/2003 - MAP - changed to Python license (all contributors agree); +# removed unnecessary urllib code -- urllib2 should always be available anyway; +# return actual url, status, and full HTTP headers (as result['url'], +# result['status'], and result['headers']) if parsing a remote feed over HTTP -- +# this should pass all the HTTP tests at ; +# added the latest namespace-of-the-week for RSS 2.0 +#2.5.1 - 7/26/2003 - RMK - clear opener.addheaders so we only send our custom +# User-Agent (otherwise urllib2 sends two, which confuses some servers) +#2.5.2 - 7/28/2003 - MAP - entity-decode inline xml properly; added support for +# inline and as used in some RSS 2.0 feeds +#2.5.3 - 8/6/2003 - TvdV - patch to track whether we're inside an image or +# textInput, and also to return the character encoding (if specified) +#2.6 - 1/1/2004 - MAP - dc:author support (MarekK); fixed bug tracking +# nested divs within content (JohnD); fixed missing sys import (JohanS); +# fixed regular expression to capture XML character encoding (Andrei); +# added support for Atom 0.3-style links; fixed bug with textInput tracking; +# added support for cloud (MartijnP); added support for multiple +# category/dc:subject (MartijnP); normalize content model: 'description' gets +# description (which can come from description, summary, or full content if no +# description), 'content' gets dict of base/language/type/value (which can come +# from content:encoded, xhtml:body, content, or fullitem); +# fixed bug matching arbitrary Userland namespaces; added xml:base and xml:lang +# tracking; fixed bug tracking unknown tags; fixed bug tracking content when +# element is not in default namespace (like Pocketsoap feed); +# resolve relative URLs in link, guid, docs, url, comments, wfw:comment, +# wfw:commentRSS; resolve relative URLs within embedded HTML markup in +# description, xhtml:body, content, content:encoded, title, subtitle, +# summary, info, tagline, and copyright; added support for pingback and +# trackback namespaces +#2.7 - 1/5/2004 - MAP - really added support for trackback and pingback +# namespaces, as opposed to 2.6 when I said I did but didn't really; +# sanitize HTML markup within some elements; added mxTidy support (if +# installed) to tidy HTML markup within some elements; fixed indentation +# bug in _parse_date (FazalM); use socket.setdefaulttimeout if available +# (FazalM); universal date parsing and normalization (FazalM): 'created', modified', +# 'issued' are parsed into 9-tuple date format and stored in 'created_parsed', +# 'modified_parsed', and 'issued_parsed'; 'date' is duplicated in 'modified' +# and vice-versa; 'date_parsed' is duplicated in 'modified_parsed' and vice-versa +#2.7.1 - 1/9/2004 - MAP - fixed bug handling " and '. fixed memory +# leak not closing url opener (JohnD); added dc:publisher support (MarekK); +# added admin:errorReportsTo support (MarekK); Python 2.1 dict support (MarekK) +#2.7.4 - 1/14/2004 - MAP - added workaround for improperly formed
tags in +# encoded HTML (skadz); fixed unicode handling in normalize_attrs (ChrisL); +# fixed relative URI processing for guid (skadz); added ICBM support; added +# base64 support +#2.7.5 - 1/15/2004 - MAP - added workaround for malformed DOCTYPE (seen on many +# blogspot.com sites); added _debug variable +#2.7.6 - 1/16/2004 - MAP - fixed bug with StringIO importing +#3.0b3 - 1/23/2004 - MAP - parse entire feed with real XML parser (if available); +# added several new supported namespaces; fixed bug tracking naked markup in +# description; added support for enclosure; added support for source; re-added +# support for cloud which got dropped somehow; added support for expirationDate +#3.0b4 - 1/26/2004 - MAP - fixed xml:lang inheritance; fixed multiple bugs tracking +# xml:base URI, one for documents that don't define one explicitly and one for +# documents that define an outer and an inner xml:base that goes out of scope +# before the end of the document +#3.0b5 - 1/26/2004 - MAP - fixed bug parsing multiple links at feed level +#3.0b6 - 1/27/2004 - MAP - added feed type and version detection, result['version'] +# will be one of SUPPORTED_VERSIONS.keys() or empty string if unrecognized; +# added support for creativeCommons:license and cc:license; added support for +# full Atom content model in title, tagline, info, copyright, summary; fixed bug +# with gzip encoding (not always telling server we support it when we do) +#3.0b7 - 1/28/2004 - MAP - support Atom-style author element in author_detail +# (dictionary of 'name', 'url', 'email'); map author to author_detail if author +# contains name + email address +#3.0b8 - 1/28/2004 - MAP - added support for contributor +#3.0b9 - 1/29/2004 - MAP - fixed check for presence of dict function; added +# support for summary +#3.0b10 - 1/31/2004 - MAP - incorporated ISO-8601 date parsing routines from +# xml.util.iso8601 +#3.0b11 - 2/2/2004 - MAP - added 'rights' to list of elements that can contain +# dangerous markup; fiddled with decodeEntities (not right); liberalized +# date parsing even further +#3.0b12 - 2/6/2004 - MAP - fiddled with decodeEntities (still not right); +# added support to Atom 0.2 subtitle; added support for Atom content model +# in copyright; better sanitizing of dangerous HTML elements with end tags +# (script, frameset) +#3.0b13 - 2/8/2004 - MAP - better handling of empty HTML tags (br, hr, img, +# etc.) in embedded markup, in either HTML or XHTML form (
,
,
) +#3.0b14 - 2/8/2004 - MAP - fixed CDATA handling in non-wellformed feeds under +# Python 2.1 +#3.0b15 - 2/11/2004 - MAP - fixed bug resolving relative links in wfw:commentRSS; +# fixed bug capturing author and contributor URL; fixed bug resolving relative +# links in author and contributor URL; fixed bug resolvin relative links in +# generator URL; added support for recognizing RSS 1.0; passed Simon Fell's +# namespace tests, and included them permanently in the test suite with his +# permission; fixed namespace handling under Python 2.1 +#3.0b16 - 2/12/2004 - MAP - fixed support for RSS 0.90 (broken in b15) +#3.0b17 - 2/13/2004 - MAP - determine character encoding as per RFC 3023 +#3.0b18 - 2/17/2004 - MAP - always map description to summary_detail (Andrei); +# use libxml2 (if available) +#3.0b19 - 3/15/2004 - MAP - fixed bug exploding author information when author +# name was in parentheses; removed ultra-problematic mxTidy support; patch to +# workaround crash in PyXML/expat when encountering invalid entities +# (MarkMoraes); support for textinput/textInput +#3.0b20 - 4/7/2004 - MAP - added CDF support +#3.0b21 - 4/14/2004 - MAP - added Hot RSS support +#3.0b22 - 4/19/2004 - MAP - changed 'channel' to 'feed', 'item' to 'entries' in +# results dict; changed results dict to allow getting values with results.key +# as well as results[key]; work around embedded illformed HTML with half +# a DOCTYPE; work around malformed Content-Type header; if character encoding +# is wrong, try several common ones before falling back to regexes (if this +# works, bozo_exception is set to CharacterEncodingOverride); fixed character +# encoding issues in BaseHTMLProcessor by tracking encoding and converting +# from Unicode to raw strings before feeding data to sgmllib.SGMLParser; +# convert each value in results to Unicode (if possible), even if using +# regex-based parsing +#3.0b23 - 4/21/2004 - MAP - fixed UnicodeDecodeError for feeds that contain +# high-bit characters in attributes in embedded HTML in description (thanks +# Thijs van de Vossen); moved guid, date, and date_parsed to mapped keys in +# FeedParserDict; tweaked FeedParserDict.has_key to return True if asking +# about a mapped key +#3.0fc1 - 4/23/2004 - MAP - made results.entries[0].links[0] and +# results.entries[0].enclosures[0] into FeedParserDict; fixed typo that could +# cause the same encoding to be tried twice (even if it failed the first time); +# fixed DOCTYPE stripping when DOCTYPE contained entity declarations; +# better textinput and image tracking in illformed RSS 1.0 feeds +#3.0fc2 - 5/10/2004 - MAP - added and passed Sam's amp tests; added and passed +# my blink tag tests +#3.0fc3 - 6/18/2004 - MAP - fixed bug in _changeEncodingDeclaration that +# failed to parse utf-16 encoded feeds; made source into a FeedParserDict; +# duplicate admin:generatorAgent/@rdf:resource in generator_detail.url; +# added support for image; refactored parse() fallback logic to try other +# encodings if SAX parsing fails (previously it would only try other encodings +# if re-encoding failed); remove unichr madness in normalize_attrs now that +# we're properly tracking encoding in and out of BaseHTMLProcessor; set +# feed.language from root-level xml:lang; set entry.id from rdf:about; +# send Accept header +#3.0 - 6/21/2004 - MAP - don't try iso-8859-1 (can't distinguish between +# iso-8859-1 and windows-1252 anyway, and most incorrectly marked feeds are +# windows-1252); fixed regression that could cause the same encoding to be +# tried twice (even if it failed the first time) +#3.0.1 - 6/22/2004 - MAP - default to us-ascii for all text/* content types; +# recover from malformed content-type header parameter with no equals sign +# ('text/xml; charset:iso-8859-1') +#3.1 - 6/28/2004 - MAP - added and passed tests for converting HTML entities +# to Unicode equivalents in illformed feeds (aaronsw); added and +# passed tests for converting character entities to Unicode equivalents +# in illformed feeds (aaronsw); test for valid parsers when setting +# XML_AVAILABLE; make version and encoding available when server returns +# a 304; add handlers parameter to pass arbitrary urllib2 handlers (like +# digest auth or proxy support); add code to parse username/password +# out of url and send as basic authentication; expose downloading-related +# exceptions in bozo_exception (aaronsw); added __contains__ method to +# FeedParserDict (aaronsw); added publisher_detail (aaronsw) +#3.2 - 7/3/2004 - MAP - use cjkcodecs and iconv_codec if available; always +# convert feed to UTF-8 before passing to XML parser; completely revamped +# logic for determining character encoding and attempting XML parsing +# (much faster); increased default timeout to 20 seconds; test for presence +# of Location header on redirects; added tests for many alternate character +# encodings; support various EBCDIC encodings; support UTF-16BE and +# UTF16-LE with or without a BOM; support UTF-8 with a BOM; support +# UTF-32BE and UTF-32LE with or without a BOM; fixed crashing bug if no +# XML parsers are available; added support for 'Content-encoding: deflate'; +# send blank 'Accept-encoding: ' header if neither gzip nor zlib modules +# are available +#3.3 - 7/15/2004 - MAP - optimize EBCDIC to ASCII conversion; fix obscure +# problem tracking xml:base and xml:lang if element declares it, child +# doesn't, first grandchild redeclares it, and second grandchild doesn't; +# refactored date parsing; defined public registerDateHandler so callers +# can add support for additional date formats at runtime; added support +# for OnBlog, Nate, MSSQL, Greek, and Hungarian dates (ytrewq1); added +# zopeCompatibilityHack() which turns FeedParserDict into a regular +# dictionary, required for Zope compatibility, and also makes command- +# line debugging easier because pprint module formats real dictionaries +# better than dictionary-like objects; added NonXMLContentType exception, +# which is stored in bozo_exception when a feed is served with a non-XML +# media type such as 'text/plain'; respect Content-Language as default +# language if not xml:lang is present; cloud dict is now FeedParserDict; +# generator dict is now FeedParserDict; better tracking of xml:lang, +# including support for xml:lang='' to unset the current language; +# recognize RSS 1.0 feeds even when RSS 1.0 namespace is not the default +# namespace; don't overwrite final status on redirects (scenarios: +# redirecting to a URL that returns 304, redirecting to a URL that +# redirects to another URL with a different type of redirect); add +# support for HTTP 303 redirects +#4.0 - MAP - support for relative URIs in xml:base attribute; fixed +# encoding issue with mxTidy (phopkins); preliminary support for RFC 3229; +# support for Atom 1.0; support for iTunes extensions; new 'tags' for +# categories/keywords/etc. as array of dict +# {'term': term, 'scheme': scheme, 'label': label} to match Atom 1.0 +# terminology; parse RFC 822-style dates with no time; lots of other +# bug fixes +#4.1 - MAP - removed socket timeout; added support for chardet library diff --git a/lektury.sqlite b/lektury.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..cdca909e5e41deb7a7062efd595d31e037854e88 GIT binary patch literal 135168 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 CAh^!} literal 0 HcmV?d00001 diff --git a/locale/pl/LC_MESSAGES/django.mo b/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..b46a010a034b841ce2f153e2a9f96dff55383978 GIT binary patch literal 1199 zcmYk3OKTKC5XalMuJ8B)5p2+#c3dTaWsKsOog|Ap*=4g46+Coi+DSW`>7}Q~H49!8 z!Gj(}M7;=tUOagckLDYA_A_|)AT?t&CI0_p#0d2Yc9_76b}_5{-*@EJ&Xzb?<;ffVOGNd6x|DmlfZ zI*}ZP9)OZRgayiQH7&ep-3H6>Wbi*dU zr+bPm$ehP2kF4%HZ8FxXcgGj)`rLRS3%6=4TQMdbO*xCCQ;D(bEHar>nd5G~uUKT2 zq!2vDHTyrN>YHelB`ULur8v*cxnUe`=&fKbknbQtw zwyhy+(TK%OWpg~^@wPvE!=DfM&7iZ?Xf0Mcc*i;s=82BQ^&-hd*Lb|rZgs_MnVYC1 zH;-ScR%-&|VwG2G-qe(+PFJfi6dm;YSEO+NbZPSi&xu>iMvdF|b zOFUj%(XPV!J)LsuH47y-eVva_(Bts}J!WVxx|`pF literal 0 HcmV?d00001 diff --git a/locale/pl/LC_MESSAGES/django.po b/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 000000000..d2ef7e17a --- /dev/null +++ b/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,105 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-08-10 08:44-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: catalogue/models.py:14 +msgid "author" +msgstr "autor" + +#: catalogue/models.py:15 +msgid "epoch" +msgstr "epoka" + +#: catalogue/models.py:16 +msgid "kind" +msgstr "rodzaj" + +#: catalogue/models.py:17 +msgid "genre" +msgstr "gatunek" + +#: catalogue/models.py:18 +msgid "theme" +msgstr "motyw" + +#: catalogue/models.py:32 +msgid "name" +msgstr "nazwa" + +#: catalogue/models.py:33 catalogue/models.py:59 +msgid "slug" +msgstr "slug" + +#: catalogue/models.py:34 +msgid "sort key" +msgstr "klucz sortowania" + +#: catalogue/models.py:35 +msgid "category" +msgstr "kategoria" + +#: catalogue/models.py:41 catalogue/models.py:73 +msgid "Has description" +msgstr "Ma opis" + +#: catalogue/models.py:50 newtagging/models.py:458 +msgid "tag" +msgstr "tag" + +#: catalogue/models.py:51 newtagging/admin.py:38 +msgid "tags" +msgstr "tagi" + +#: catalogue/models.py:58 +msgid "title" +msgstr "tytuł" + +#: catalogue/models.py:60 +msgid "description" +msgstr "opis" + +#: catalogue/models.py:61 +msgid "creation date" +msgstr "data utworzenia" + +#: catalogue/models.py:64 +msgid "PDF file" +msgstr "plik PDF" + +#: catalogue/models.py:65 +msgid "ODT file" +msgstr "plik ODT" + +#: catalogue/models.py:66 +msgid "HTML file" +msgstr "plik HTML" + +#: catalogue/models.py:82 +msgid "book" +msgstr "książka" + +#: catalogue/models.py:83 +msgid "books" +msgstr "książki" + +#: newtagging/models.py:459 +msgid "content type" +msgstr "typ zawartości" + +#: newtagging/models.py:460 +msgid "object id" +msgstr "id obiektu" diff --git a/manage.py b/manage.py new file mode 100755 index 000000000..5e78ea979 --- /dev/null +++ b/manage.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python +from django.core.management import execute_manager +try: + import settings # Assumed to be in the same directory. +except ImportError: + import sys + sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) + sys.exit(1) + +if __name__ == "__main__": + execute_manager(settings) diff --git a/media/.DS_Store b/media/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d47e3087277f7843fc87c084409ae0f58421b3e7 GIT binary patch literal 6148 zcmeHK!Ab)$5S_GDsv`Cz3Lf?gME_tZRq!bOfbD9R)wRK{wRqdR2Y*LTp8Opz-qknB zpu29Df(MZ@1Cy7X%p{XnGHHm&bSG!~L>(e(Lm6AEXl4kHvsR=bmJOhBb3|k*r3qcp zsN$^#Wk4DDZw&C+U8g?I>7=7JM`tl33^0JG(eQ4OUjZc zw&Kafq9xkIoLOa_XN*4jc@8(x7q8(o*(n~G+ zYSgEg&MR5GA$shyINotHv2Q##3-S7qg|pUVu>vly!SOkb>5gVG`-=7N3(Pi{{W+P4 zPbm*)tI48`+HApuMFuf=8J2%tvyB`c3OV3YWq}#+r;6HZ3%p0&nlhja{Eh*x4*`@h z6wE!k(t*Z30f2nnJ3*iSC~!<57z*YdF#<6@6zD^ZJTZ(9hdmI#P%!uC!^z0w!^p}; zUMR+`j`;)UPA2rItumktlo@FH&ko=J2lem&a*%#01IoZcF<@G~lU^5FlDoCCIlgNH s=qZ$i{c?{k1dUwBuESUH7SsvG0`34q!Q3M(5d9y2eGv9t3?#(u4wuTe!lVNGB(-(GA8KUzYr*Z!}?y>r@eZgmf+`&dW*!#=#jK4yK zKG++o$17Dd$fST2kOERb3P^!pD1ezwTi+%sN&zV#1uhEk|IpyXUN|MjuLFU{ch-4O z55sfZC4h|yU@x2!k%4(qfl2kcGkDUGZ`Icer^KY2$If_9?d)~s@Yo&s7VYLeQBev= zfw=-hE;pS25AZAZ|2au3DIf*@l>)xnJ?^&nq?)aZkK?Ru@F)1$&>QUtF^YjPim~7* dzWdhK_>6iloDzeMe9(b92v8T96!;4Tz5r!k7Iy#u literal 0 HcmV?d00001 diff --git a/media/books/odt/andersen_brzydkie_kaczatko.odt b/media/books/odt/andersen_brzydkie_kaczatko.odt new file mode 100644 index 0000000000000000000000000000000000000000..7bced51fe2da98f4690ace03c4c4160c5266d2a3 GIT binary patch literal 43646 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 G>i+?SPio!( literal 0 HcmV?d00001 diff --git a/media/books/pdf/andersen_brzydkie_kaczatko.pdf b/media/books/pdf/andersen_brzydkie_kaczatko.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8478abec6ad44c2f9bfd1827713ca303d3e94e5e GIT binary patch literal 281941 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%0ArGK-~#+q;cs-KS6%lgYHn|3%}cv?0dr0Tr)=o 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

kZ%z*quCq?X;B&Wz~F8M(pf^&!#ISfwMPTnl> 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�&8Ebr;c1>k2Bw#9CRJI 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 literal 0 HcmV?d00001 diff --git a/media/img/favicon.png b/media/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..6cffce8e5e27daf64eb36d295e05bb7d69042d6a GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP*BU$ z#WBR@;lC14 O7lWs(pUXO@geCxKOCaz7 literal 0 HcmV?d00001 diff --git a/media/img/footer.png b/media/img/footer.png new file mode 100644 index 0000000000000000000000000000000000000000..78634239cce42aef8b166946bb37ac0f9773e24f GIT binary patch literal 21220 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 literal 0 HcmV?d00001 diff --git a/media/img/logo.png b/media/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bf92ee0694aabdcd237fd69c94e69f781e9a4264 GIT binary patch literal 5173 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 literal 0 HcmV?d00001 diff --git a/media/img/old/.DS_Store b/media/img/old/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0mP00009a7bBm000XU z000XU0RWnu7ytkRFiAu~RCt{2SlhDOAPn49m}dI_ztT_ZbJPcJ;$lqBNt(JN&1CH0 zMWAJoWvIV@DK;z|KN0{0C>eMwe*m^WvUCWLd+iM!JjHfF0Pp2bd7!;#K>+U6Lk>%% zb|#WX+yO~mB!U$L$;Lsz?Pr=A(^Wta3V^)Dwi^&0_yG#j^wRKh0}2>WRRobcQ~^?} z=Q3FZ(ljLAB!Wq(X0q*-kld^G2DEDfw8W2kjlm#At*K4YxW+U`0FcR_LZWv`y%Tr2 zEnNvhl<0crX|PNyvP`rjNIDm{)f&jHR4*Eb`*GB^9Yhgg44a<~JZ#Ip)bX zhkgrikMMa-F$3yBYHDPsNAE&l*paVNk6Pf$s*`u9=Zr$lz(t0)kCwsM!QQ5x4N=Tz zGz0Fv3fp8~e3N78Ixo4#&KtQ$Gw{r!qfe+O1N#7vlKx1~!Ta#vERcHO>x97F84n@XzW}pao5t6(lh-5%k*>+uA6EG@~V? zXe+hY@Lf>Qi|B>Xt6pvNCxo>XOD`(4H|82CL~FVt7$wNSAc3%j4hCZDE^ROF-FBRP ze!0(j;Njf4_uTn@@44rkIZw~*?5t}gWty$TLs*G(_%$i=>8ef7QW7ZB>@EzTACKT} zEUTCt$M&SiPcI39GR>Cbu?YGc?r&l`gWfnkniTn?izX03x8hYii<@gElQ@F$s3(#l zzgVW(huDo-Tt9aey*iLG%@W~s19%O0)J!JuHNL63x3YgT-j0uB)i`KMpiHyJ@t$y( zcQ!CNhS3OmrpY^=!duve=_#`RvlTAQZU`GUgAWr{_5$sNi zyzG>~$C33k&fp*pCq+Kh1bBlG7jGb`EPadjlOq2;+P#Usq{v^V`z%<8m+=zTR+gr) z4<98(eyn1D9nRuXQsissFbHd)>+u2xk=2$bum_`cS4SDZE%jta$bhydZ6QNZk5ngH5!f2_SW@Ia zbOAhdP!hN9k=6#4nK1h54?aeSZ~N4m4hNoXZAhuh5@v+<7--vsKUf|1S zcJ)H^Fm8zB@kIjPC#2oZICUr~@;^Ey@I=&8IB^xAHww+jE^MqU{f*&Pd+P-Hqdw8@ z{^ND^3->&T6>(`=_-GvvD&OSQ5Sa5oL-)r&9$Vt?Y1~v5%;Z O0000NI6mxe%Qwr0kje94p#%a}{$i*M~pxYBSifq@}X WkG+X?;YM?yZU#?RKbLh*2~7ZS;3J9v literal 0 HcmV?d00001 diff --git a/media/img/old/footer.png b/media/img/old/footer.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0c61c62ba181085c69ee5fc2071806220e4a32 GIT binary patch literal 30285 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 literal 0 HcmV?d00001 diff --git a/media/img/old/indicator.gif b/media/img/old/indicator.gif new file mode 100644 index 0000000000000000000000000000000000000000..085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb GIT binary patch literal 1553 zcma)+TTl~c6vwlh>nb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? literal 0 HcmV?d00001 diff --git a/media/img/old/logo.png b/media/img/old/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..77cdd066811ee7b58f753d35bef3a4570f44207c GIT binary patch literal 7146 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 literal 0 HcmV?d00001 diff --git a/media/js/jquery.autocolumn.js b/media/js/jquery.autocolumn.js new file mode 100644 index 000000000..ea896b67f --- /dev/null +++ b/media/js/jquery.autocolumn.js @@ -0,0 +1,202 @@ +// version 1.1.0 +// http://welcome.totheinter.net/columnizer-jquery-plugin/ +// created by: Adam Wulf adam.wulf@gmail.com + +(function($){ + $.fn.columnize = function(options) { + + + var defaults = { + width: 400, + columns : false, + buildOnce : false + }; + var options = $.extend(defaults, options); + + return this.each(function() { + var $inBox = $(this); + var maxHeight = $inBox.height(); + var $cache = $('

'); // this is where we'll put the real content + var lastWidth = 0; + var columnizing = false; + $cache.append($inBox.children().clone()); + + columnizeIt(); + + $(window).resize(function() { + if(!options.buildOnce && $.browser.msie){ + if($inBox.data("timeout")){ + clearTimeout($inBox.data("timeout")); + } + $inBox.data("timeout", setTimeout(columnizeIt, 200)); + }else if(!options.buildOnce){ + columnizeIt(); + }else{ + // don't rebuild + } + }); + + /** + * return a node that has a height + * less than or equal to height + * + * @param putInHere, a dom element + * @$pullOutHere, a jQuery element + */ + function columnize($putInHere, $pullOutHere, $parentColumn, height){ + while($parentColumn.height() < height && + $pullOutHere[0].childNodes.length){ + $putInHere.append($pullOutHere[0].childNodes[0]); + } + if($putInHere[0].childNodes.length == 0) return; + + // now we're too tall, undo the last one + var kids = $putInHere[0].childNodes; + var lastKid = kids[kids.length-1]; + $putInHere[0].removeChild(lastKid); + var $item = $(lastKid); + if($item[0].nodeType == 3){ + // it's a text node, split it up + var oText = $item[0].nodeValue; + var counter2 = options.width / 8; + var columnText; + while($parentColumn.height() < height && oText.length){ + if (oText.indexOf(' ', counter2) != '-1') { + columnText = oText.substring(0, oText.indexOf(' ', counter2)); + } else { + columnText = oText; + } + $putInHere.append(document.createTextNode(columnText)); + if(oText.length > counter2){ + oText = oText.substring(oText.indexOf(' ', counter2)); + }else{ + oText = ""; + } + } + if(oText.length){ + $item[0].nodeValue = oText; + }else{ + return; + } + } + + if($pullOutHere.children().length){ + $pullOutHere.prepend($item); + }else{ + $pullOutHere.append($item); + } + } + + function split($putInHere, $pullOutHere, $parentColumn, height){ + if($pullOutHere.children().length){ + $cloneMe = $pullOutHere.children(":first"); + $clone = $cloneMe.clone(); + if($clone.attr("nodeType") == 1){ + $putInHere.append($clone); + if($clone.is("img") && $parentColumn.height() < height + 20){ + $cloneMe.remove(); + }else if(!$cloneMe.hasClass("dontsplit") && $parentColumn.height() < height + 20){ + $cloneMe.remove(); + }else if($clone.is("img") || $cloneMe.hasClass("dontsplit")){ + $clone.remove(); + }else{ + $clone.empty(); + columnize($clone, $cloneMe, $parentColumn, height); + if($cloneMe.children().length){ + split($clone, $cloneMe, $parentColumn, height); + } + } + } + } + } + + + function singleColumnizeIt() { + if ($inBox.data("columnized") && $inBox.children().length == 1) { + return; + } + $inBox.data("columnized", true); + $inBox.data("columnizing", true); + + $inBox.empty(); + $inBox.append($("
")); //" + $col = $inBox.children().eq($inBox.children().length-1); + $col.append($cache.clone()); + + $inBox.data("columnizing", false); + } + + + function columnizeIt() { + if(lastWidth == $inBox.width()) return; + lastWidth = $inBox.width(); + + var numCols = Math.round($inBox.width() / options.width); + if(options.columns) numCols = options.columns; +// if ($inBox.data("columnized") && numCols == $inBox.children().length) { +// return; +// } + if(numCols <= 1){ + return singleColumnizeIt(); + } + if($inBox.data("columnizing")) return; + $inBox.data("columnized", true); + $inBox.data("columnizing", true); + + $inBox.empty(); + $inBox.append($("
")); //" + $col = $inBox.children(":last"); + $col.append($cache.clone()); + maxHeight = $col.height(); + $inBox.empty(); + + var targetHeight = maxHeight / numCols; + var firstTime = true; + var maxLoops = 3; + for(var loopCount=0;loopCount")); //" + } + + // fill all but the last column + for (var i = 0; i < numCols-1; i++) { + var $col = $inBox.children().eq(i); + columnize($col, $destroyable, $col, targetHeight); + split($col, $destroyable, $col, targetHeight); + } + // the last column in the series + $col = $inBox.children().eq($inBox.children().length-1); + while($destroyable.children().length) $col.append($destroyable.children(":first")); + var afterH = $col.height(); + var diff = afterH - targetHeight; + var totalH = 0; + var min = 10000000; + var max = 0; + $inBox.children().each(function($inBox){ return function($item){ + var h = $inBox.children().eq($item).height(); + totalH += h; + if(h > max) max = h; + if(h < min) min = h; + }}($inBox)); + var avgH = totalH / numCols; + if(max - min > 30){ + targetHeight = avgH + 30; + }else if(Math.abs(avgH-targetHeight) > 20){ + targetHeight = avgH; + }else{ + loopCount = maxLoops; + } + $inBox.append($("
")); + } + $inBox.data("columnizing", false); + } + }); + }; +})(jQuery); diff --git a/media/js/jquery.autocomplete.js b/media/js/jquery.autocomplete.js new file mode 100644 index 000000000..5ad9178f8 --- /dev/null +++ b/media/js/jquery.autocomplete.js @@ -0,0 +1,759 @@ +/* + * Autocomplete - jQuery plugin 1.0.2 + * + * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $ + * + */ + +;(function($) { + +$.fn.extend({ + autocomplete: function(urlOrData, options) { + var isUrl = typeof urlOrData == "string"; + options = $.extend({}, $.Autocompleter.defaults, { + url: isUrl ? urlOrData : null, + data: isUrl ? null : urlOrData, + delay: isUrl ? $.Autocompleter.defaults.delay : 10, + max: options && !options.scroll ? 10 : 150 + }, options); + + // if highlight is set to false, replace it with a do-nothing function + options.highlight = options.highlight || function(value) { return value; }; + + // if the formatMatch option is not specified, then use formatItem for backwards compatibility + options.formatMatch = options.formatMatch || options.formatItem; + + return this.each(function() { + new $.Autocompleter(this, options); + }); + }, + result: function(handler) { + return this.bind("result", handler); + }, + search: function(handler) { + return this.trigger("search", [handler]); + }, + flushCache: function() { + return this.trigger("flushCache"); + }, + setOptions: function(options){ + return this.trigger("setOptions", [options]); + }, + unautocomplete: function() { + return this.trigger("unautocomplete"); + } +}); + +$.Autocompleter = function(input, options) { + + var KEY = { + UP: 38, + DOWN: 40, + DEL: 46, + TAB: 9, + RETURN: 13, + ESC: 27, + COMMA: 188, + PAGEUP: 33, + PAGEDOWN: 34, + BACKSPACE: 8 + }; + + // Create $ object for input element + var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass); + + var timeout; + var previousValue = ""; + var cache = $.Autocompleter.Cache(options); + var hasFocus = 0; + var lastKeyPressCode; + var config = { + mouseDownOnSelect: false + }; + var select = $.Autocompleter.Select(options, input, selectCurrent, config); + + var blockSubmit; + + // prevent form submit in opera when selecting with return key + $.browser.opera && $(input.form).bind("submit.autocomplete", function() { + if (blockSubmit) { + blockSubmit = false; + return false; + } + }); + + // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all + $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) { + // track last key pressed + lastKeyPressCode = event.keyCode; + switch(event.keyCode) { + + case KEY.UP: + event.preventDefault(); + if ( select.visible() ) { + select.prev(); + } else { + onChange(0, true); + } + break; + + case KEY.DOWN: + event.preventDefault(); + if ( select.visible() ) { + select.next(); + } else { + onChange(0, true); + } + break; + + case KEY.PAGEUP: + event.preventDefault(); + if ( select.visible() ) { + select.pageUp(); + } else { + onChange(0, true); + } + break; + + case KEY.PAGEDOWN: + event.preventDefault(); + if ( select.visible() ) { + select.pageDown(); + } else { + onChange(0, true); + } + break; + + // matches also semicolon + case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA: + case KEY.TAB: + case KEY.RETURN: + if( selectCurrent() ) { + // stop default to prevent a form submit, Opera needs special handling + event.preventDefault(); + blockSubmit = true; + return false; + } + break; + + case KEY.ESC: + select.hide(); + break; + + default: + clearTimeout(timeout); + timeout = setTimeout(onChange, options.delay); + break; + } + }).focus(function(){ + // track whether the field has focus, we shouldn't process any + // results if the field no longer has focus + hasFocus++; + }).blur(function() { + hasFocus = 0; + if (!config.mouseDownOnSelect) { + hideResults(); + } + }).click(function() { + // show select when clicking in a focused field + if ( hasFocus++ > 1 && !select.visible() ) { + onChange(0, true); + } + }).bind("search", function() { + // TODO why not just specifying both arguments? + var fn = (arguments.length > 1) ? arguments[1] : null; + function findValueCallback(q, data) { + var result; + if( data && data.length ) { + for (var i=0; i < data.length; i++) { + if( data[i].result.toLowerCase() == q.toLowerCase() ) { + result = data[i]; + break; + } + } + } + if( typeof fn == "function" ) fn(result); + else $input.trigger("result", result && [result.data, result.value]); + } + $.each(trimWords($input.val()), function(i, value) { + request(value, findValueCallback, findValueCallback); + }); + }).bind("flushCache", function() { + cache.flush(); + }).bind("setOptions", function() { + $.extend(options, arguments[1]); + // if we've updated the data, repopulate + if ( "data" in arguments[1] ) + cache.populate(); + }).bind("unautocomplete", function() { + select.unbind(); + $input.unbind(); + $(input.form).unbind(".autocomplete"); + }); + + + function selectCurrent() { + var selected = select.selected(); + if( !selected ) + return false; + + var v = selected.result; + previousValue = v; + + if ( options.multiple ) { + var words = trimWords($input.val()); + if ( words.length > 1 ) { + v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v; + } + v += options.multipleSeparator; + } + + $input.val(v); + hideResultsNow(); + $input.trigger("result", [selected.data, selected.value]); + return true; + } + + function onChange(crap, skipPrevCheck) { + if( lastKeyPressCode == KEY.DEL ) { + select.hide(); + return; + } + + var currentValue = $input.val(); + + if ( !skipPrevCheck && currentValue == previousValue ) + return; + + previousValue = currentValue; + + currentValue = lastWord(currentValue); + if ( currentValue.length >= options.minChars) { + $input.addClass(options.loadingClass); + if (!options.matchCase) + currentValue = currentValue.toLowerCase(); + request(currentValue, receiveData, hideResultsNow); + } else { + stopLoading(); + select.hide(); + } + }; + + function trimWords(value) { + if ( !value ) { + return [""]; + } + var words = value.split( options.multipleSeparator ); + var result = []; + $.each(words, function(i, value) { + if ( $.trim(value) ) + result[i] = $.trim(value); + }); + return result; + } + + function lastWord(value) { + if ( !options.multiple ) + return value; + var words = trimWords(value); + return words[words.length - 1]; + } + + // fills in the input box w/the first match (assumed to be the best match) + // q: the term entered + // sValue: the first matching result + function autoFill(q, sValue){ + // autofill in the complete box w/the first match as long as the user hasn't entered in more data + // if the last user key pressed was backspace, don't autofill + if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) { + // fill in the value (keep the case the user has typed) + $input.val($input.val() + sValue.substring(lastWord(previousValue).length)); + // select the portion of the value not typed by the user (so the next character will erase) + $.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length); + } + }; + + function hideResults() { + clearTimeout(timeout); + timeout = setTimeout(hideResultsNow, 200); + }; + + function hideResultsNow() { + var wasVisible = select.visible(); + select.hide(); + clearTimeout(timeout); + stopLoading(); + if (options.mustMatch) { + // call search and run callback + $input.search( + function (result){ + // if no value found, clear the input box + if( !result ) { + if (options.multiple) { + var words = trimWords($input.val()).slice(0, -1); + $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") ); + } + else + $input.val( "" ); + } + } + ); + } + if (wasVisible) + // position cursor at end of input field + $.Autocompleter.Selection(input, input.value.length, input.value.length); + }; + + function receiveData(q, data) { + if ( data && data.length && hasFocus ) { + stopLoading(); + select.display(data, q); + autoFill(q, data[0].value); + select.show(); + } else { + hideResultsNow(); + } + }; + + function request(term, success, failure) { + if (!options.matchCase) + term = term.toLowerCase(); + var data = cache.load(term); + // recieve the cached data + if (data && data.length) { + success(term, data); + // if an AJAX url has been supplied, try loading the data now + } else if( (typeof options.url == "string") && (options.url.length > 0) ){ + + var extraParams = { + timestamp: +new Date() + }; + $.each(options.extraParams, function(key, param) { + extraParams[key] = typeof param == "function" ? param() : param; + }); + + $.ajax({ + // try to leverage ajaxQueue plugin to abort previous requests + mode: "abort", + // limit abortion to this input + port: "autocomplete" + input.name, + dataType: options.dataType, + url: options.url, + data: $.extend({ + q: lastWord(term), + limit: options.max + }, extraParams), + success: function(data) { + var parsed = options.parse && options.parse(data) || parse(data); + cache.add(term, parsed); + success(term, parsed); + } + }); + } else { + // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match + select.emptyList(); + failure(term); + } + }; + + function parse(data) { + var parsed = []; + var rows = data.split("\n"); + for (var i=0; i < rows.length; i++) { + var row = $.trim(rows[i]); + if (row) { + row = row.split("|"); + parsed[parsed.length] = { + data: row, + value: row[0], + result: options.formatResult && options.formatResult(row, row[0]) || row[0] + }; + } + } + return parsed; + }; + + function stopLoading() { + $input.removeClass(options.loadingClass); + }; + +}; + +$.Autocompleter.defaults = { + inputClass: "ac_input", + resultsClass: "ac_results", + loadingClass: "ac_loading", + minChars: 1, + delay: 400, + matchCase: false, + matchSubset: true, + matchContains: false, + cacheLength: 10, + max: 100, + mustMatch: false, + extraParams: {}, + selectFirst: true, + formatItem: function(row) { return row[0]; }, + formatMatch: null, + autoFill: false, + width: 0, + multiple: false, + multipleSeparator: ", ", + highlight: function(value, term) { + return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "$1"); + }, + scroll: true, + scrollHeight: 180 +}; + +$.Autocompleter.Cache = function(options) { + + var data = {}; + var length = 0; + + function matchSubset(s, sub) { + if (!options.matchCase) + s = s.toLowerCase(); + var i = s.indexOf(sub); + if (i == -1) return false; + return i == 0 || options.matchContains; + }; + + function add(q, value) { + if (length > options.cacheLength){ + flush(); + } + if (!data[q]){ + length++; + } + data[q] = value; + } + + function populate(){ + if( !options.data ) return false; + // track the matches + var stMatchSets = {}, + nullData = 0; + + // no url was specified, we need to adjust the cache length to make sure it fits the local data store + if( !options.url ) options.cacheLength = 1; + + // track all options for minChars = 0 + stMatchSets[""] = []; + + // loop through the array and create a lookup structure + for ( var i = 0, ol = options.data.length; i < ol; i++ ) { + var rawValue = options.data[i]; + // if rawValue is a string, make an array otherwise just reference the array + rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue; + + var value = options.formatMatch(rawValue, i+1, options.data.length); + if ( value === false ) + continue; + + var firstChar = value.charAt(0).toLowerCase(); + // if no lookup array for this character exists, look it up now + if( !stMatchSets[firstChar] ) + stMatchSets[firstChar] = []; + + // if the match is a string + var row = { + value: value, + data: rawValue, + result: options.formatResult && options.formatResult(rawValue) || value + }; + + // push the current match into the set list + stMatchSets[firstChar].push(row); + + // keep track of minChars zero items + if ( nullData++ < options.max ) { + stMatchSets[""].push(row); + } + }; + + // add the data items to the cache + $.each(stMatchSets, function(i, value) { + // increase the cache size + options.cacheLength++; + // add to the cache + add(i, value); + }); + } + + // populate any existing data + setTimeout(populate, 25); + + function flush(){ + data = {}; + length = 0; + } + + return { + flush: flush, + add: add, + populate: populate, + load: function(q) { + if (!options.cacheLength || !length) + return null; + /* + * if dealing w/local data and matchContains than we must make sure + * to loop through all the data collections looking for matches + */ + if( !options.url && options.matchContains ){ + // track all matches + var csub = []; + // loop through all the data grids for matches + for( var k in data ){ + // don't search through the stMatchSets[""] (minChars: 0) cache + // this prevents duplicates + if( k.length > 0 ){ + var c = data[k]; + $.each(c, function(i, x) { + // if we've got a match, add it to the array + if (matchSubset(x.value, q)) { + csub.push(x); + } + }); + } + } + return csub; + } else + // if the exact item exists, use it + if (data[q]){ + return data[q]; + } else + if (options.matchSubset) { + for (var i = q.length - 1; i >= options.minChars; i--) { + var c = data[q.substr(0, i)]; + if (c) { + var csub = []; + $.each(c, function(i, x) { + if (matchSubset(x.value, q)) { + csub[csub.length] = x; + } + }); + return csub; + } + } + } + return null; + } + }; +}; + +$.Autocompleter.Select = function (options, input, select, config) { + var CLASSES = { + ACTIVE: "ac_over" + }; + + var listItems, + active = -1, + data, + term = "", + needsInit = true, + element, + list; + + // Create results + function init() { + if (!needsInit) + return; + element = $("
") + .hide() + .addClass(options.resultsClass) + .css("position", "absolute") + .appendTo(document.body); + + list = $("
    ").appendTo(element).mouseover( function(event) { + if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') { + active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event)); + $(target(event)).addClass(CLASSES.ACTIVE); + } + }).click(function(event) { + $(target(event)).addClass(CLASSES.ACTIVE); + select(); + // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus + input.focus(); + return false; + }).mousedown(function() { + config.mouseDownOnSelect = true; + }).mouseup(function() { + config.mouseDownOnSelect = false; + }); + + if( options.width > 0 ) + element.css("width", options.width); + + needsInit = false; + } + + function target(event) { + var element = event.target; + while(element && element.tagName != "LI") + element = element.parentNode; + // more fun with IE, sometimes event.target is empty, just ignore it then + if(!element) + return []; + return element; + } + + function moveSelect(step) { + listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE); + movePosition(step); + var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE); + if(options.scroll) { + var offset = 0; + listItems.slice(0, active).each(function() { + offset += this.offsetHeight; + }); + if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) { + list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight()); + } else if(offset < list.scrollTop()) { + list.scrollTop(offset); + } + } + }; + + function movePosition(step) { + active += step; + if (active < 0) { + active = listItems.size() - 1; + } else if (active >= listItems.size()) { + active = 0; + } + } + + function limitNumberOfItems(available) { + return options.max && options.max < available + ? options.max + : available; + } + + function fillList() { + list.empty(); + var max = limitNumberOfItems(data.length); + for (var i=0; i < max; i++) { + if (!data[i]) + continue; + var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term); + if ( formatted === false ) + continue; + var li = $("
  • ").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0]; + $.data(li, "ac_data", data[i]); + } + listItems = list.find("li"); + if ( options.selectFirst ) { + listItems.slice(0, 1).addClass(CLASSES.ACTIVE); + active = 0; + } + // apply bgiframe if available + if ( $.fn.bgiframe ) + list.bgiframe(); + } + + return { + display: function(d, q) { + init(); + data = d; + term = q; + fillList(); + }, + next: function() { + moveSelect(1); + }, + prev: function() { + moveSelect(-1); + }, + pageUp: function() { + if (active != 0 && active - 8 < 0) { + moveSelect( -active ); + } else { + moveSelect(-8); + } + }, + pageDown: function() { + if (active != listItems.size() - 1 && active + 8 > listItems.size()) { + moveSelect( listItems.size() - 1 - active ); + } else { + moveSelect(8); + } + }, + hide: function() { + element && element.hide(); + listItems && listItems.removeClass(CLASSES.ACTIVE); + active = -1; + }, + visible : function() { + return element && element.is(":visible"); + }, + current: function() { + return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]); + }, + show: function() { + var offset = $(input).offset(); + element.css({ + width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(), + top: offset.top + input.offsetHeight, + left: offset.left + }).show(); + if(options.scroll) { + list.scrollTop(0); + list.css({ + maxHeight: options.scrollHeight, + overflow: 'auto' + }); + + if($.browser.msie && typeof document.body.style.maxHeight === "undefined") { + var listHeight = 0; + listItems.each(function() { + listHeight += this.offsetHeight; + }); + var scrollbarsVisible = listHeight > options.scrollHeight; + list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight ); + if (!scrollbarsVisible) { + // IE doesn't recalculate width when scrollbar disappears + listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) ); + } + } + + } + }, + selected: function() { + var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE); + return selected && selected.length && $.data(selected[0], "ac_data"); + }, + emptyList: function (){ + list && list.empty(); + }, + unbind: function() { + element && element.remove(); + } + }; +}; + +$.Autocompleter.Selection = function(field, start, end) { + if( field.createTextRange ){ + var selRange = field.createTextRange(); + selRange.collapse(true); + selRange.moveStart("character", start); + selRange.moveEnd("character", end); + selRange.select(); + } else if( field.setSelectionRange ){ + field.setSelectionRange(start, end); + } else { + if( field.selectionStart ){ + field.selectionStart = start; + field.selectionEnd = end; + } + } + field.focus(); +}; + +})(jQuery); \ No newline at end of file diff --git a/media/js/jquery.form.js b/media/js/jquery.form.js new file mode 100644 index 000000000..659baa989 --- /dev/null +++ b/media/js/jquery.form.js @@ -0,0 +1,601 @@ +/* + * jQuery Form Plugin + * version: 2.12 (06/07/2008) + * @requires jQuery v1.2.2 or later + * + * Examples and documentation at: http://malsup.com/jquery/form/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id$ + */ +(function($) { + +/* + Usage Note: + ----------- + Do not use both ajaxSubmit and ajaxForm on the same form. These + functions are intended to be exclusive. Use ajaxSubmit if you want + to bind your own submit handler to the form. For example, + + $(document).ready(function() { + $('#myForm').bind('submit', function() { + $(this).ajaxSubmit({ + target: '#output' + }); + return false; // <-- important! + }); + }); + + Use ajaxForm when you want the plugin to manage all the event binding + for you. For example, + + $(document).ready(function() { + $('#myForm').ajaxForm({ + target: '#output' + }); + }); + + When using ajaxForm, the ajaxSubmit function will be invoked for you + at the appropriate time. +*/ + +/** + * ajaxSubmit() provides a mechanism for immediately submitting + * an HTML form using AJAX. + */ +$.fn.ajaxSubmit = function(options) { + // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) + if (!this.length) { + log('ajaxSubmit: skipping submit process - no element selected'); + return this; + } + + if (typeof options == 'function') + options = { success: options }; + + options = $.extend({ + url: this.attr('action') || window.location.toString(), + type: this.attr('method') || 'GET' + }, options || {}); + + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + this.trigger('form-pre-serialize', [this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); + return this; + } + + var a = this.formToArray(options.semantic); + if (options.data) { + options.extraData = options.data; + for (var n in options.data) + a.push( { name: n, value: options.data[n] } ); + } + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSubmit callback'); + return this; + } + + // fire vetoable 'validate' event + this.trigger('form-submit-validate', [a, this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); + return this; + } + + var q = $.param(a); + + if (options.type.toUpperCase() == 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else + options.data = q; // data is the query string for 'post' + + var $form = this, callbacks = []; + if (options.resetForm) callbacks.push(function() { $form.resetForm(); }); + if (options.clearForm) callbacks.push(function() { $form.clearForm(); }); + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data) { + $(options.target).html(data).each(oldSuccess, arguments); + }); + } + else if (options.success) + callbacks.push(options.success); + + options.success = function(data, status) { + for (var i=0, max=callbacks.length; i < max; i++) + callbacks[i](data, status, $form); + }; + + // are there files to upload? + var files = $('input:file', this).fieldValue(); + var found = false; + for (var j=0; j < files.length; j++) + if (files[j]) + found = true; + + // options.iframe allows user to force iframe mode + if (options.iframe || found) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if ($.browser.safari && options.closeKeepAlive) + $.get(options.closeKeepAlive, fileUpload); + else + fileUpload(); + } + else + $.ajax(options); + + // fire 'notify' event + this.trigger('form-submit-notify', [this, options]); + return this; + + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUpload() { + var form = $form[0]; + + if ($(':input[@name=submit]', form).length) { + alert('Error: Form elements must not be named "submit".'); + return; + } + + var opts = $.extend({}, $.ajaxSettings, options); + + var id = 'jqFormIO' + (new Date().getTime()); + var $io = $('').css({opacity:0}), + +// O: The jqModal default Open Callback; +// IF ie6; Add the iframe to the overlay (if overlay exists) OR to the modal (if an iframe doesn't already exist from a previous opening) +// Execute the Modal Focus Function +O=function(h){if(ie6)h.o&&h.o.html('

    ').prepend(i)||(!$('iframe.jqm',h.w)[0]&&h.w.prepend(i)); f(h);}, + +// f: The Modal Focus Function; +// Attempt to focus the first visible input within the modal +f=function(h){try{$(':input:visible',h.w)[0].focus();}catch(e){}}, + +// F: The Keep Focus Function; +// Binds or Unbinds (t) the Focus Examination Function to keypresses and clicks +F=function(t){$()[t]("keypress",x)[t]("keydown",x)[t]("mousedown",x);}, + +// x: The Focus Examination Function; +// Fetch the current modal's Hash as h (supports nested modals) +// Determine if the click/press falls within the modal. If not (r===true); +// call the Modal Focus Function and prevent click/press follow-through (return false [!true]) +// ELSE if so (r===false); follow event (return true [!false]) +x=function(e){var h=H[A[A.length-1]],r=(!$(e.target).parents('.jqmID'+h.s)[0]);r&&f(h);return !r;}, + +// hide-show function; assigns click events to trigger elements that +// hide, show, or hide AND show modals. + +// Expandos (jqmShow and/or jqmHide) are added to all trigger elements. +// These Expandos hold an array of modal serials {INT} to show or hide. + +// w: {DOM Element} The modal element (window/dialog/notice/etc. container) +// e: {DOM Elemet||jQ Selector String} The triggering element +// y: {String} Type (jqmHide||jqmShow) + +// s: {array} the serial number of passed modals, calculated below; +HS=function(w,e,y){var s=[];w.each(function(){s.push(this._jqm)}); + +// for each triggering element attach the jqmHide or jqmShow expando (y) +// or else expand the expando with the current serial array + $(e).each(function(){if(this[y])$.extend(this[y],s); + + // Assign a click event on the trigger element which examines the element's + // jqmHide/Show expandos and attempts to execute $.jqmHide/Show on matching modals + else{this[y]=s;$(this).click(function(){for(var i in {jqmShow:1,jqmHide:1})for(var s in this[i])if(H[this[i][s]])H[this[i][s]].w[i](this);return false;});}});return w;}; +})(jQuery); \ No newline at end of file diff --git a/media/js/jquery.js b/media/js/jquery.js new file mode 100644 index 000000000..82b98e1d7 --- /dev/null +++ b/media/js/jquery.js @@ -0,0 +1,32 @@ +/* + * jQuery 1.2.6 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ + * $Rev: 5685 $ + */ +(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else +return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else +return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else +selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else +this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else +return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else +jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else +jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("",""]||!tags.indexOf("",""]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
    "]||!tags.indexOf("",""]||(!tags.indexOf("",""]||!tags.indexOf("",""]||jQuery.browser.msie&&[1,"div

    ","
    "]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf(""&&tags.indexOf("=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else +ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else +while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return im[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else +for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("
    ").append(res.responseText.replace(//g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else +xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else +jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else +for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else +s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else +e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;ithis.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})(); \ No newline at end of file diff --git a/media/js/jquery.labelify.js b/media/js/jquery.labelify.js new file mode 100644 index 000000000..13196b289 --- /dev/null +++ b/media/js/jquery.labelify.js @@ -0,0 +1,89 @@ +/** + * jQuery.labelify - Display in-textbox hints + * Stuart Langridge, http://www.kryogenix.org/ + * Released into the public domain + * Date: 25th June 2008 + * @author Stuart Langridge + * @version 1.3 + * + * + * Basic calling syntax: $("input").labelify(); + * Defaults to taking the in-field label from the field's title attribute + * + * You can also pass an options object with the following keys: + * text + * "title" to get the in-field label from the field's title attribute + * (this is the default) + * "label" to get the in-field label from the inner text of the field's label + * (note that the label must be attached to the field with for="fieldid") + * a function which takes one parameter, the input field, and returns + * whatever text it likes + * + * labelledClass + * a class that will be applied to the input field when it contains the + * label and removed when it contains user input. Defaults to blank. + * + */ +jQuery.fn.labelify = function(settings) { + settings = jQuery.extend({ + text: "title", + labelledClass: "" + }, settings); + var lookups = { + title: function(input) { + return $(input).attr("title"); + }, + label: function(input) { + return $("label[for=" + input.id +"]").text(); + } + }; + var lookup; + var jQuery_labellified_elements = $(this); + return $(this).each(function() { + if (typeof settings.text === "string") { + lookup = lookups[settings.text]; // what if not there? + } else { + lookup = settings.text; // what if not a fn? + }; + // bail if lookup isn't a function or if it returns undefined + if (typeof lookup !== "function") { return; } + var lookupval = lookup(this); + if (!lookupval) { return; } + + // need to strip newlines because the browser strips them + // if you set textbox.value to a string containing them + $(this).data("label",lookup(this).replace(/\n/g,'')); + $(this).focus(function() { + if (this.value === $(this).data("label")) { + this.value = this.defaultValue; + $(this).removeClass(settings.labelledClass); + } + }).blur(function(){ + if (this.value === this.defaultValue) { + this.value = $(this).data("label"); + $(this).addClass(settings.labelledClass); + } + }); + + var removeValuesOnExit = function() { + jQuery_labellified_elements.each(function(){ + if (this.value === $(this).data("label")) { + this.value = this.defaultValue; + $(this).removeClass(settings.labelledClass); + } + }) + }; + + $(this).parents("form").submit(removeValuesOnExit); + $(window).unload(removeValuesOnExit); + + if (this.value !== this.defaultValue) { + // user already started typing; don't overwrite their work! + return; + } + // actually set the value + this.value = $(this).data("label"); + $(this).addClass(settings.labelledClass); + + }); +}; \ No newline at end of file diff --git a/middleware.py b/middleware.py new file mode 100644 index 000000000..c9a17dc3a --- /dev/null +++ b/middleware.py @@ -0,0 +1,126 @@ +# Orignal version taken from http://www.djangosnippets.org/snippets/186/ +# Original author: udfalkso +# Modified by: Shwagroo Team + +import sys +import os +import re +import hotshot, hotshot.stats +import tempfile +import StringIO +import pprint + +from django.conf import settings +from django.db import connection + + +words_re = re.compile( r'\s+' ) + +group_prefix_re = [ + re.compile( "^.*/django/[^/]+" ), + re.compile( "^(.*)/[^/]+$" ), # extract module path + re.compile( ".*" ), # catch strange entries +] + + +class ProfileMiddleware(object): + """ + Displays hotshot profiling for any view. + http://yoursite.com/yourview/?prof + + Add the "prof" key to query string by appending ?prof (or &prof=) + and you'll see the profiling results in your browser. + It's set up to only be available in django's debug mode, is available for superuser otherwise, + but you really shouldn't add this middleware to any production configuration. + + WARNING: It uses hotshot profiler which is not thread safe. + """ + def process_request(self, request): + if (settings.DEBUG or request.user.is_superuser) and request.GET.has_key('prof'): + connection.queries = [] + self.tmpfile = tempfile.mktemp() + self.prof = hotshot.Profile(self.tmpfile) + + def process_view(self, request, callback, callback_args, callback_kwargs): + if (settings.DEBUG or request.user.is_superuser) and request.GET.has_key('prof'): + return self.prof.runcall(callback, request, *callback_args, **callback_kwargs) + + def get_group(self, file): + for g in group_prefix_re: + name = g.findall( file ) + if name: + return name[0] + + def get_summary(self, results_dict, sum): + list = [ (item[1], item[0]) for item in results_dict.items() ] + list.sort( reverse = True ) + list = list[:40] + + res = " tottime\n" + for item in list: + if sum == 0: + foo = 0 + else: + foo = 100*item[0]/sum + res += "%4.1f%% %7.3f %s\n" % (foo, item[0], item[1] ) + + return res + + def summary_for_files(self, stats_str): + stats_str = stats_str.split("\n")[5:] + + mystats = {} + mygroups = {} + + sum = 0 + + for s in stats_str: + fields = words_re.split(s); + if len(fields) == 7: + time = float(fields[2]) + sum += time + file = fields[6].split(":")[0] + + if not file in mystats: + mystats[file] = 0 + mystats[file] += time + + group = self.get_group(file) + if not group in mygroups: + mygroups[ group ] = 0 + mygroups[ group ] += time + + return "
    " + \
    +               " ---- By file ----\n\n" + self.get_summary(mystats,sum) + "\n" + \
    +               " ---- By group ---\n\n" + self.get_summary(mygroups,sum) + \
    +               "
    " + + def process_response(self, request, response): + if (settings.DEBUG or request.user.is_superuser) and request.GET.has_key('prof'): + self.prof.close() + + out = StringIO.StringIO() + old_stdout = sys.stdout + sys.stdout = out + + stats = hotshot.stats.load(self.tmpfile) + stats.sort_stats('time', 'calls') + stats.print_stats() + + sys.stdout = old_stdout + stats_str = out.getvalue() + + if response and response.content and stats_str: + response.content = "
    " + stats_str + "
    " + + response.content = "\n".join(response.content.split("\n")[:40]) + + response.content += self.summary_for_files(stats_str) + + os.unlink(self.tmpfile) + + response.content += '\n%d SQL Queries:\n' % len(connection.queries) + response.content += pprint.pformat(connection.queries) + + return response + diff --git a/newtagging/__init__.py b/newtagging/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/newtagging/admin.py b/newtagging/admin.py new file mode 100644 index 000000000..2ecc84d87 --- /dev/null +++ b/newtagging/admin.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from django import forms +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext_lazy as _ + + +class FilteredSelectMultiple(forms.SelectMultiple): + """ + A SelectMultiple with a JavaScript filter interface. + + Note that the resulting JavaScript assumes that the SelectFilter2.js + library and its dependencies have been loaded in the HTML page. + """ + def _media(self): + from django.conf import settings + js = ['js/SelectBox.js' , 'js/SelectFilter2.js'] + return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js]) + media = property(_media) + + def __init__(self, verbose_name, is_stacked, attrs=None, choices=()): + self.verbose_name = verbose_name + self.is_stacked = is_stacked + super(FilteredSelectMultiple, self).__init__(attrs, choices) + + def render(self, name, value, attrs=None, choices=()): + from django.conf import settings + output = [super(FilteredSelectMultiple, self).render(name, value, attrs, choices)] + output.append(u'\n' % \ + (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), settings.ADMIN_MEDIA_PREFIX)) + return mark_safe(u''.join(output)) + + +class TaggableModelForm(forms.ModelForm): + tags = forms.MultipleChoiceField(label=_('tags').capitalize(), required=True, widget=FilteredSelectMultiple(_('tags'), False)) + + def __init__(self, *args, **kwargs): + self.tags.choices = [(tag.id, tag.name) for tag in self.tag_model.objects.all()] + if 'instance' in kwargs: + if 'initial' not in kwargs: + kwargs['initial'] = {} + kwargs['initial']['tags'] = [tag.id for tag in self.tag_model.objects.get_for_object(kwargs['instance'])] + super(TaggableModelForm, self).__init__(*args, **kwargs) + + def save(self, commit): + obj = super(TaggableModelForm, self).save() + tag_ids = self.cleaned_data['tags'] + tags = self.tag_model.objects.filter(pk__in=tag_ids) + self.tag_model.objects.update_tags(obj, tags) + return obj + + def save_m2m(self): + # TODO: Shouldn't be needed + pass + + +class TaggableModelAdmin(admin.ModelAdmin): + form = TaggableModelForm + + def get_form(self, request, obj=None): + form = super(TaggableModelAdmin, self).get_form(request, obj) + form.tag_model = self.tag_model + return form + diff --git a/newtagging/managers.py b/newtagging/managers.py new file mode 100644 index 000000000..04db00fdd --- /dev/null +++ b/newtagging/managers.py @@ -0,0 +1,78 @@ +""" +Custom managers for Django models registered with the tagging +application. +""" +from django.contrib.contenttypes.models import ContentType +from django.db import models + + +class ModelTagManager(models.Manager): + """ + A manager for retrieving tags for a particular model. + """ + def __init__(self, tag_model): + super(ModelTagManager, self).__init__() + self.tag_model = tag_model + + def get_query_set(self): + content_type = ContentType.objects.get_for_model(self.model) + return self.tag_model.objects.filter( + items__content_type__pk=content_type.pk).distinct() + + def related(self, tags, *args, **kwargs): + return self.tag_model.objects.related_for_model(tags, self.model, *args, **kwargs) + + def usage(self, *args, **kwargs): + return self.tag_model.objects.usage_for_model(self.model, *arg, **kwargs) + + +class ModelTaggedItemManager(models.Manager): + """ + A manager for retrieving model instances based on their tags. + """ + def __init__(self, tag_model): + super(ModelTaggedItemManager, self).__init__() + self.intermediary_table_model = tag_model.objects.intermediary_table_model + + def related_to(self, obj, queryset=None, num=None): + if queryset is None: + return self.intermediary_table_model.objects.get_related(obj, self.model, num=num) + else: + return self.intermediary_table_model.objects.get_related(obj, queryset, num=num) + + def with_all(self, tags, queryset=None): + if queryset is None: + return self.intermediary_table_model.objects.get_by_model(self.model, tags) + else: + return self.intermediary_table_model.objects.get_by_model(queryset, tags) + + def with_any(self, tags, queryset=None): + if queryset is None: + return self.intermediary_table_model.objects.get_union_by_model(self.model, tags) + else: + return self.intermediary_table_model.objects.get_union_by_model(queryset, tags) + + +class TagDescriptor(object): + """ + A descriptor which provides access to a ``ModelTagManager`` for + model classes and simple retrieval, updating and deletion of tags + for model instances. + """ + def __init__(self, tag_model): + self.tag_model = tag_model + + def __get__(self, instance, owner): + if not instance: + tag_manager = ModelTagManager(self.tag_model) + tag_manager.model = owner + return tag_manager + else: + return self.tag_model.objects.get_for_object(instance) + + def __set__(self, instance, value): + self.tag_model.objects.update_tags(instance, value) + + def __del__(self, instance): + self.tag_model.objects.update_tags(instance, []) + diff --git a/newtagging/models.py b/newtagging/models.py new file mode 100644 index 000000000..96647726e --- /dev/null +++ b/newtagging/models.py @@ -0,0 +1,501 @@ +""" +Models and managers for generic tagging. +""" +# Python 2.3 compatibility +if not hasattr(__builtins__, 'set'): + from sets import Set as set + +from django.contrib.contenttypes import generic +from django.contrib.contenttypes.models import ContentType +from django.db import connection, models +from django.db.models.query import QuerySet +from django.utils.translation import ugettext_lazy as _ +from django.db.models.base import ModelBase + +from newtagging.utils import get_tag_list, get_queryset_and_model + +qn = connection.ops.quote_name + +try: + from django.db.models.query import parse_lookup +except ImportError: + parse_lookup = None + + +############ +# Managers # +############ + +class TagManager(models.Manager): + def __init__(self, intermediary_table_model): + super(TagManager, self).__init__() + self.intermediary_table_model = intermediary_table_model + + def update_tags(self, obj, tags): + """ + Update tags associated with an object. + """ + content_type = ContentType.objects.get_for_model(obj) + current_tags = list(self.filter(items__content_type__pk=content_type.pk, + items__object_id=obj.pk)) + updated_tags = get_tag_list(tags) + + # Remove tags which no longer apply + tags_for_removal = [tag for tag in current_tags \ + if tag not in updated_tags] + if len(tags_for_removal): + self.intermediary_table_model._default_manager.filter(content_type__pk=content_type.pk, + object_id=obj.pk, + tag__in=tags_for_removal).delete() + # Add new tags + for tag in updated_tags: + if tag not in current_tags: + self.intermediary_table_model._default_manager.create(tag=tag, content_object=obj) + + # def add_tag(self, obj, tag_name): + # """ + # Associates the given object with a tag. + # """ + # tag_names = parse_tag_input(tag_name) + # if not len(tag_names): + # raise AttributeError(_('No tags were given: "%s".') % tag_name) + # if len(tag_names) > 1: + # raise AttributeError(_('Multiple tags were given: "%s".') % tag_name) + # tag_name = tag_names[0] + # # if settings.FORCE_LOWERCASE_TAGS: + # # tag_name = tag_name.lower() + # tag, created = self.get_or_create(name=tag_name) + # ctype = ContentType.objects.get_for_model(obj) + # self.intermediary_table_model._default_manager.get_or_create( + # tag=tag, content_type=ctype, object_id=obj.pk) + + def get_for_object(self, obj): + """ + Create a queryset matching all tags associated with the given + object. + """ + ctype = ContentType.objects.get_for_model(obj) + return self.filter(items__content_type__pk=ctype.pk, + items__object_id=obj.pk) + + def _get_usage(self, model, counts=False, min_count=None, extra_joins=None, extra_criteria=None, params=None, extra=None): + """ + Perform the custom SQL query for ``usage_for_model`` and + ``usage_for_queryset``. + """ + if min_count is not None: counts = True + + model_table = qn(model._meta.db_table) + model_pk = '%s.%s' % (model_table, qn(model._meta.pk.column)) + tag_columns = self._get_tag_columns() + + if extra is None: extra = {} + extra_where = '' + if 'where' in extra: + extra_where = 'AND ' + ' AND '.join(extra['where']) + + query = """ + SELECT DISTINCT %(tag_columns)s%(count_sql)s + FROM + %(tag)s + INNER JOIN %(tagged_item)s + ON %(tag)s.id = %(tagged_item)s.tag_id + INNER JOIN %(model)s + ON %(tagged_item)s.object_id = %(model_pk)s + %%s + WHERE %(tagged_item)s.content_type_id = %(content_type_id)s + %%s + %(extra_where)s + GROUP BY %(tag)s.id, %(tag)s.name + %%s + ORDER BY %(tag)s.%(ordering)s ASC""" % { + 'tag': qn(self.model._meta.db_table), + 'ordering': ', '.join(qn(field) for field in self.model._meta.ordering), + 'tag_columns': tag_columns, + 'count_sql': counts and (', COUNT(%s)' % model_pk) or '', + 'tagged_item': qn(self.intermediary_table_model._meta.db_table), + 'model': model_table, + 'model_pk': model_pk, + 'extra_where': extra_where, + 'content_type_id': ContentType.objects.get_for_model(model).pk, + } + + min_count_sql = '' + if min_count is not None: + min_count_sql = 'HAVING COUNT(%s) >= %%s' % model_pk + params.append(min_count) + + cursor = connection.cursor() + cursor.execute(query % (extra_joins, extra_criteria, min_count_sql), params) + tags = [] + for row in cursor.fetchall(): + t = self.model(*row[:len(self.model._meta.fields)]) + if counts: + t.count = row[len(self.model._meta.fields)] + tags.append(t) + return tags + + def usage_for_model(self, model, counts=False, min_count=None, filters=None, extra=None): + """ + Obtain a list of tags associated with instances of the given + Model class. + + If ``counts`` is True, a ``count`` attribute will be added to + each tag, indicating how many times it has been used against + the Model class in question. + + If ``min_count`` is given, only tags which have a ``count`` + greater than or equal to ``min_count`` will be returned. + Passing a value for ``min_count`` implies ``counts=True``. + + To limit the tags (and counts, if specified) returned to those + used by a subset of the Model's instances, pass a dictionary + of field lookups to be applied to the given Model as the + ``filters`` argument. + """ + if extra is None: extra = {} + if filters is None: filters = {} + + if not parse_lookup: + # post-queryset-refactor (hand off to usage_for_queryset) + queryset = model._default_manager.filter() + for f in filters.items(): + queryset.query.add_filter(f) + usage = self.usage_for_queryset(queryset, counts, min_count, extra) + else: + # pre-queryset-refactor + extra_joins = '' + extra_criteria = '' + params = [] + if len(filters) > 0: + joins, where, params = parse_lookup(filters.items(), model._meta) + extra_joins = ' '.join(['%s %s AS %s ON %s' % (join_type, table, alias, condition) + for (alias, (table, join_type, condition)) in joins.items()]) + extra_criteria = 'AND %s' % (' AND '.join(where)) + usage = self._get_usage(model, counts, min_count, extra_joins, extra_criteria, params, extra) + + return usage + + def usage_for_queryset(self, queryset, counts=False, min_count=None, extra=None): + """ + Obtain a list of tags associated with instances of a model + contained in the given queryset. + + If ``counts`` is True, a ``count`` attribute will be added to + each tag, indicating how many times it has been used against + the Model class in question. + + If ``min_count`` is given, only tags which have a ``count`` + greater than or equal to ``min_count`` will be returned. + Passing a value for ``min_count`` implies ``counts=True``. + """ + if parse_lookup: + raise AttributeError("'TagManager.usage_for_queryset' is not compatible with pre-queryset-refactor versions of Django.") + + extra_joins = ' '.join(queryset.query.get_from_clause()[0][1:]) + where, params = queryset.query.where.as_sql() + if where: + extra_criteria = 'AND %s' % where + else: + extra_criteria = '' + return self._get_usage(queryset.model, counts, min_count, extra_joins, extra_criteria, params, extra) + + def related_for_model(self, tags, model, counts=False, min_count=None, extra=None): + """ + Obtain a list of tags related to a given list of tags - that + is, other tags used by items which have all the given tags. + + If ``counts`` is True, a ``count`` attribute will be added to + each tag, indicating the number of items which have it in + addition to the given list of tags. + + If ``min_count`` is given, only tags which have a ``count`` + greater than or equal to ``min_count`` will be returned. + Passing a value for ``min_count`` implies ``counts=True``. + """ + if min_count is not None: counts = True + tags = get_tag_list(tags) + tag_count = len(tags) + tagged_item_table = qn(self.intermediary_table_model._meta.db_table) + tag_columns = self._get_tag_columns() + + if extra is None: extra = {} + extra_where = '' + if 'where' in extra: + extra_where = 'AND ' + ' AND '.join(extra['where']) + + query = """ + SELECT %(tag_columns)s%(count_sql)s + FROM %(tagged_item)s INNER JOIN %(tag)s ON %(tagged_item)s.tag_id = %(tag)s.id + WHERE %(tagged_item)s.content_type_id = %(content_type_id)s + AND %(tagged_item)s.object_id IN + ( + SELECT %(tagged_item)s.object_id + FROM %(tagged_item)s, %(tag)s + WHERE %(tagged_item)s.content_type_id = %(content_type_id)s + AND %(tag)s.id = %(tagged_item)s.tag_id + AND %(tag)s.id IN (%(tag_id_placeholders)s) + GROUP BY %(tagged_item)s.object_id + HAVING COUNT(%(tagged_item)s.object_id) = %(tag_count)s + ) + AND %(tag)s.id NOT IN (%(tag_id_placeholders)s) + %(extra_where)s + GROUP BY %(tag)s.id, %(tag)s.name + %(min_count_sql)s + ORDER BY %(tag)s.%(ordering)s ASC""" % { + 'tag': qn(self.model._meta.db_table), + 'ordering': ', '.join(qn(field) for field in self.model._meta.ordering), + 'tag_columns': tag_columns, + 'count_sql': counts and ', COUNT(%s.object_id)' % tagged_item_table or '', + 'tagged_item': tagged_item_table, + 'content_type_id': ContentType.objects.get_for_model(model).pk, + 'tag_id_placeholders': ','.join(['%s'] * tag_count), + 'extra_where': extra_where, + 'tag_count': tag_count, + 'min_count_sql': min_count is not None and ('HAVING COUNT(%s.object_id) >= %%s' % tagged_item_table) or '', + } + + params = [tag.pk for tag in tags] * 2 + if min_count is not None: + params.append(min_count) + + cursor = connection.cursor() + cursor.execute(query, params) + related = [] + for row in cursor.fetchall(): + tag = self.model(*row[:len(self.model._meta.fields)]) + if counts is True: + tag.count = row[len(self.model._meta.fields)] + related.append(tag) + return related + + def _get_tag_columns(self): + tag_table = qn(self.model._meta.db_table) + return ', '.join('%s.%s' % (tag_table, qn(field.column)) for field in self.model._meta.fields) + + +class TaggedItemManager(models.Manager): + """ + FIXME There's currently no way to get the ``GROUP BY`` and ``HAVING`` + SQL clauses required by many of this manager's methods into + Django's ORM. + + For now, we manually execute a query to retrieve the PKs of + objects we're interested in, then use the ORM's ``__in`` + lookup to return a ``QuerySet``. + + Once the queryset-refactor branch lands in trunk, this can be + tidied up significantly. + """ + def get_by_model(self, queryset_or_model, tags): + """ + Create a ``QuerySet`` containing instances of the specified + model associated with a given tag or list of tags. + """ + tags = get_tag_list(tags) + tag_count = len(tags) + if tag_count == 0: + # No existing tags were given + queryset, model = get_queryset_and_model(queryset_or_model) + return model._default_manager.none() + elif tag_count == 1: + # Optimisation for single tag - fall through to the simpler + # query below. + tag = tags[0] + else: + return self.get_intersection_by_model(queryset_or_model, tags) + + queryset, model = get_queryset_and_model(queryset_or_model) + content_type = ContentType.objects.get_for_model(model) + opts = self.model._meta + tagged_item_table = qn(opts.db_table) + return queryset.extra( + tables=[opts.db_table], + where=[ + '%s.content_type_id = %%s' % tagged_item_table, + '%s.tag_id = %%s' % tagged_item_table, + '%s.%s = %s.object_id' % (qn(model._meta.db_table), + qn(model._meta.pk.column), + tagged_item_table) + ], + params=[content_type.pk, tag.pk], + ) + + def get_intersection_by_model(self, queryset_or_model, tags): + """ + Create a ``QuerySet`` containing instances of the specified + model associated with *all* of the given list of tags. + """ + tags = get_tag_list(tags) + tag_count = len(tags) + queryset, model = get_queryset_and_model(queryset_or_model) + + if not tag_count: + return model._default_manager.none() + + model_table = qn(model._meta.db_table) + # This query selects the ids of all objects which have all the + # given tags. + query = """ + SELECT %(model_pk)s + FROM %(model)s, %(tagged_item)s + WHERE %(tagged_item)s.content_type_id = %(content_type_id)s + AND %(tagged_item)s.tag_id IN (%(tag_id_placeholders)s) + AND %(model_pk)s = %(tagged_item)s.object_id + GROUP BY %(model_pk)s + HAVING COUNT(%(model_pk)s) = %(tag_count)s""" % { + 'model_pk': '%s.%s' % (model_table, qn(model._meta.pk.column)), + 'model': model_table, + 'tagged_item': qn(self.model._meta.db_table), + 'content_type_id': ContentType.objects.get_for_model(model).pk, + 'tag_id_placeholders': ','.join(['%s'] * tag_count), + 'tag_count': tag_count, + } + + cursor = connection.cursor() + cursor.execute(query, [tag.pk for tag in tags]) + object_ids = [row[0] for row in cursor.fetchall()] + if len(object_ids) > 0: + return queryset.filter(pk__in=object_ids) + else: + return model._default_manager.none() + + def get_union_by_model(self, queryset_or_model, tags): + """ + Create a ``QuerySet`` containing instances of the specified + model associated with *any* of the given list of tags. + """ + tags = get_tag_list(tags) + tag_count = len(tags) + queryset, model = get_queryset_and_model(queryset_or_model) + + if not tag_count: + return model._default_manager.none() + + model_table = qn(model._meta.db_table) + # This query selects the ids of all objects which have any of + # the given tags. + query = """ + SELECT %(model_pk)s + FROM %(model)s, %(tagged_item)s + WHERE %(tagged_item)s.content_type_id = %(content_type_id)s + AND %(tagged_item)s.tag_id IN (%(tag_id_placeholders)s) + AND %(model_pk)s = %(tagged_item)s.object_id + GROUP BY %(model_pk)s""" % { + 'model_pk': '%s.%s' % (model_table, qn(model._meta.pk.column)), + 'model': model_table, + 'tagged_item': qn(self.model._meta.db_table), + 'content_type_id': ContentType.objects.get_for_model(model).pk, + 'tag_id_placeholders': ','.join(['%s'] * tag_count), + } + + cursor = connection.cursor() + cursor.execute(query, [tag.pk for tag in tags]) + object_ids = [row[0] for row in cursor.fetchall()] + if len(object_ids) > 0: + return queryset.filter(pk__in=object_ids) + else: + return model._default_manager.none() + + def get_related(self, obj, queryset_or_model, num=None): + """ + Retrieve a list of instances of the specified model which share + tags with the model instance ``obj``, ordered by the number of + shared tags in descending order. + + If ``num`` is given, a maximum of ``num`` instances will be + returned. + """ + queryset, model = get_queryset_and_model(queryset_or_model) + model_table = qn(model._meta.db_table) + content_type = ContentType.objects.get_for_model(obj) + related_content_type = ContentType.objects.get_for_model(model) + query = """ + SELECT %(model_pk)s, COUNT(related_tagged_item.object_id) AS %(count)s + FROM %(model)s, %(tagged_item)s, %(tag)s, %(tagged_item)s related_tagged_item + WHERE %(tagged_item)s.object_id = %%s + AND %(tagged_item)s.content_type_id = %(content_type_id)s + AND %(tag)s.id = %(tagged_item)s.tag_id + AND related_tagged_item.content_type_id = %(related_content_type_id)s + AND related_tagged_item.tag_id = %(tagged_item)s.tag_id + AND %(model_pk)s = related_tagged_item.object_id""" + if content_type.pk == related_content_type.pk: + # Exclude the given instance itself if determining related + # instances for the same model. + query += """ + AND related_tagged_item.object_id != %(tagged_item)s.object_id""" + query += """ + GROUP BY %(model_pk)s + ORDER BY %(count)s DESC + %(limit_offset)s""" + query = query % { + 'model_pk': '%s.%s' % (model_table, qn(model._meta.pk.column)), + 'count': qn('count'), + 'model': model_table, + 'tagged_item': qn(self.model._meta.db_table), + 'tag': qn(self.model._meta.get_field('tag').rel.to._meta.db_table), + 'content_type_id': content_type.pk, + 'related_content_type_id': related_content_type.pk, + 'limit_offset': num is not None and connection.ops.limit_offset_sql(num) or '', + } + + cursor = connection.cursor() + cursor.execute(query, [obj.pk]) + object_ids = [row[0] for row in cursor.fetchall()] + if len(object_ids) > 0: + # Use in_bulk here instead of an id__in lookup, because id__in would + # clobber the ordering. + object_dict = queryset.in_bulk(object_ids) + return [object_dict[object_id] for object_id in object_ids \ + if object_id in object_dict] + else: + return [] + + +########## +# Models # +########## +def create_intermediary_table_model(model): + """Create an intermediary table model for the specific tag model""" + name = model.__name__ + 'Relation' + + class Meta: + db_table = '%s_relation' % model._meta.db_table + unique_together = (('tag', 'content_type', 'object_id'),) + + def obj_unicode(self): + return u'%s [%s]' % (self.content_type.get_object_for_this_type(pk=self.object_id), self.tag) + + # Set up a dictionary to simulate declarations within a class + attrs = { + '__module__': model.__module__, + 'Meta': Meta, + 'tag': models.ForeignKey(model, verbose_name=_('tag'), related_name='items'), + 'content_type': models.ForeignKey(ContentType, verbose_name=_('content type')), + 'object_id': models.PositiveIntegerField(_('object id'), db_index=True), + 'content_object': generic.GenericForeignKey('content_type', 'object_id'), + '__unicode__': obj_unicode, + } + + return type(name, (models.Model,), attrs) + + +class TagMeta(ModelBase): + "Metaclass for tag models (models inheriting from TagBase)." + def __new__(cls, name, bases, attrs): + model = super(TagMeta, cls).__new__(cls, name, bases, attrs) + if not model._meta.abstract: + # Create an intermediary table and register custom managers for concrete models + intermediary_table_model = create_intermediary_table_model(model) + TagManager(intermediary_table_model).contribute_to_class(model, 'objects') + TaggedItemManager().contribute_to_class(intermediary_table_model, 'objects') + return model + + +class TagBase(models.Model): + """Abstract class to be inherited by model classes.""" + __metaclass__ = TagMeta + + class Meta: + abstract = True + diff --git a/newtagging/utils.py b/newtagging/utils.py new file mode 100644 index 000000000..bfdfecf82 --- /dev/null +++ b/newtagging/utils.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +""" +Tagging utilities - from user tag input parsing to tag cloud +calculation. +""" + + +def get_queryset_and_model(queryset_or_model): + """ + Given a ``QuerySet`` or a ``Model``, returns a two-tuple of + (queryset, model). + + If a ``Model`` is given, the ``QuerySet`` returned will be created + using its default manager. + """ + try: + return queryset_or_model, queryset_or_model.model + except AttributeError: + return queryset_or_model._default_manager.all(), queryset_or_model + + +def get_tag_list(tags): + """ + Utility function for accepting tag input in a flexible manner. + + If a ``Tag`` object is given, it will be returned in a list as + its single occupant. + """ + from newtagging.models import TagBase + if isinstance(tags, TagBase): + return [tags] + else: + return tags + diff --git a/pagination/__init__.py b/pagination/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/pagination/__init__.py @@ -0,0 +1 @@ + diff --git a/pagination/middleware.py b/pagination/middleware.py new file mode 100644 index 000000000..0bab76712 --- /dev/null +++ b/pagination/middleware.py @@ -0,0 +1,10 @@ +class PaginationMiddleware(object): + """ + Inserts a variable representing the current page onto the request object if + it exists in either **GET** or **POST** portions of the request. + """ + def process_request(self, request): + try: + request.page = int(request.REQUEST['page']) + except (KeyError, ValueError): + request.page = 1 \ No newline at end of file diff --git a/pagination/models.py b/pagination/models.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/pagination/models.py @@ -0,0 +1 @@ + diff --git a/pagination/templates/pagination/pagination.html b/pagination/templates/pagination/pagination.html new file mode 100644 index 000000000..3799314e4 --- /dev/null +++ b/pagination/templates/pagination/pagination.html @@ -0,0 +1,25 @@ +{% if is_paginated %} + +{% endif %} diff --git a/pagination/templatetags/__init__.py b/pagination/templatetags/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/pagination/templatetags/__init__.py @@ -0,0 +1 @@ + diff --git a/pagination/templatetags/pagination_tags.py b/pagination/templatetags/pagination_tags.py new file mode 100644 index 000000000..55e5392fe --- /dev/null +++ b/pagination/templatetags/pagination_tags.py @@ -0,0 +1,200 @@ +try: + set +except NameError: + from sets import Set as set +from django import template +from django.db.models.query import QuerySet +from django.core.paginator import Paginator, QuerySetPaginator, InvalidPage + +register = template.Library() + +DEFAULT_PAGINATION = 20 +DEFAULT_WINDOW = 4 +DEFAULT_ORPHANS = 0 + +def do_autopaginate(parser, token): + """ + Splits the arguments to the autopaginate tag and formats them correctly. + """ + split = token.split_contents() + if len(split) == 2: + return AutoPaginateNode(split[1]) + elif len(split) == 3: + try: + paginate_by = int(split[2]) + except ValueError: + raise template.TemplateSyntaxError(u'Got %s, but expected integer.' % split[2]) + return AutoPaginateNode(split[1], paginate_by=paginate_by) + elif len(split) == 4: + try: + paginate_by = int(split[2]) + except ValueError: + raise template.TemplateSyntaxError(u'Got %s, but expected integer.' % split[2]) + try: + orphans = int(split[3]) + except ValueError: + raise template.TemplateSyntaxError(u'Got %s, but expected integer.' % split[3]) + return AutoPaginateNode(split[1], paginate_by=paginate_by, orphans=orphans) + else: + raise template.TemplateSyntaxError('%r tag takes one required argument and one optional argument' % split[0]) + +class AutoPaginateNode(template.Node): + """ + Emits the required objects to allow for Digg-style pagination. + + First, it looks in the current context for the variable specified. This + should be either a QuerySet or a list. + + 1. If it is a QuerySet, this ``AutoPaginateNode`` will emit a + ``QuerySetPaginator`` and the current page object into the context names + ``paginator`` and ``page_obj``, respectively. + + 2. If it is a list, this ``AutoPaginateNode`` will emit a simple + ``Paginator`` and the current page object into the context names + ``paginator`` and ``page_obj``, respectively. + + It will then replace the variable specified with only the objects for the + current page. + + .. note:: + + It is recommended to use *{% paginate %}* after using the autopaginate + tag. If you choose not to use *{% paginate %}*, make sure to display the + list of availabale pages, or else the application may seem to be buggy. + """ + def __init__(self, queryset_var, paginate_by=DEFAULT_PAGINATION, orphans=DEFAULT_ORPHANS): + self.queryset_var = template.Variable(queryset_var) + self.paginate_by = paginate_by + self.orphans = orphans + + def render(self, context): + key = self.queryset_var.var + value = self.queryset_var.resolve(context) + if issubclass(value.__class__, QuerySet): + model = value.model + paginator_class = QuerySetPaginator + else: + value = list(value) + try: + model = value[0].__class__ + except IndexError: + return u'' + paginator_class = Paginator + paginator = paginator_class(value, self.paginate_by, self.orphans) + try: + page_obj = paginator.page(context['request'].page) + except InvalidPage: + context[key] = [] + context['invalid_page'] = True + return u'' + context[key] = page_obj.object_list + context['paginator'] = paginator + context['page_obj'] = page_obj + return u'' + +def paginate(context, window=DEFAULT_WINDOW): + """ + Renders the ``pagination/pagination.html`` template, resulting in a + Digg-like display of the available pages, given the current page. If there + are too many pages to be displayed before and after the current page, then + elipses will be used to indicate the undisplayed gap between page numbers. + + Requires one argument, ``context``, which should be a dictionary-like data + structure and must contain the following keys: + + ``paginator`` + A ``Paginator`` or ``QuerySetPaginator`` object. + + ``page_obj`` + This should be the result of calling the page method on the + aforementioned ``Paginator`` or ``QuerySetPaginator`` object, given + the current page. + + This same ``context`` dictionary-like data structure may also include: + + ``getvars`` + A dictionary of all of the **GET** parameters in the current request. + This is useful to maintain certain types of state, even when requesting + a different page. + """ + try: + paginator = context['paginator'] + page_obj = context['page_obj'] + page_range = paginator.page_range + # First and last are simply the first *n* pages and the last *n* pages, + # where *n* is the current window size. + first = set(page_range[:window]) + last = set(page_range[-window:]) + # Now we look around our current page, making sure that we don't wrap + # around. + current_start = page_obj.number-1-window + if current_start < 0: + current_start = 0 + current_end = page_obj.number-1+window + if current_end < 0: + current_end = 0 + current = set(page_range[current_start:current_end]) + pages = [] + # If there's no overlap between the first set of pages and the current + # set of pages, then there's a possible need for elusion. + if len(first.intersection(current)) == 0: + first_list = sorted(list(first)) + second_list = sorted(list(current)) + pages.extend(first_list) + diff = second_list[0] - first_list[-1] + # If there is a gap of two, between the last page of the first + # set and the first page of the current set, then we're missing a + # page. + if diff == 2: + pages.append(second_list[0] - 1) + # If the difference is just one, then there's nothing to be done, + # as the pages need no elusion and are correct. + elif diff == 1: + pass + # Otherwise, there's a bigger gap which needs to be signaled for + # elusion, by pushing a None value to the page list. + else: + pages.append(None) + pages.extend(second_list) + else: + pages.extend(sorted(list(first.union(current)))) + # If there's no overlap between the current set of pages and the last + # set of pages, then there's a possible need for elusion. + if len(current.intersection(last)) == 0: + second_list = sorted(list(last)) + diff = second_list[0] - pages[-1] + # If there is a gap of two, between the last page of the current + # set and the first page of the last set, then we're missing a + # page. + if diff == 2: + pages.append(second_list[0] - 1) + # If the difference is just one, then there's nothing to be done, + # as the pages need no elusion and are correct. + elif diff == 1: + pass + # Otherwise, there's a bigger gap which needs to be signaled for + # elusion, by pushing a None value to the page list. + else: + pages.append(None) + pages.extend(second_list) + else: + pages.extend(sorted(list(last.difference(current)))) + to_return = { + 'pages': pages, + 'page_obj': page_obj, + 'paginator': paginator, + 'is_paginated': paginator.count > paginator.per_page, + } + if 'request' in context: + getvars = context['request'].GET.copy() + if 'page' in getvars: + del getvars['page'] + if len(getvars.keys()) > 0: + to_return['getvars'] = "&%s" % getvars.urlencode() + else: + to_return['getvars'] = '' + return to_return + except KeyError: + return {} +register.inclusion_tag('pagination/pagination.html', takes_context=True)(paginate) +register.tag('autopaginate', do_autopaginate) \ No newline at end of file diff --git a/pagination/tests.py b/pagination/tests.py new file mode 100644 index 000000000..837e55cfe --- /dev/null +++ b/pagination/tests.py @@ -0,0 +1,52 @@ +""" +>>> from django.core.paginator import Paginator +>>> from pagination.templatetags.pagination_tags import paginate +>>> from django.template import Template, Context + +>>> p = Paginator(range(15), 2) +>>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] +[1, 2, 3, 4, 5, 6, 7, 8] + +>>> p = Paginator(range(17), 2) +>>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] +[1, 2, 3, 4, 5, 6, 7, 8, 9] + +>>> p = Paginator(range(19), 2) +>>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] +[1, 2, 3, 4, None, 7, 8, 9, 10] + +>>> p = Paginator(range(21), 2) +>>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] +[1, 2, 3, 4, None, 8, 9, 10, 11] + +# Testing orphans +>>> p = Paginator(range(5), 2, 1) +>>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] +[1, 2] + +>>> p = Paginator(range(21), 2, 1) +>>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] +[1, 2, 3, 4, None, 7, 8, 9, 10] + +>>> t = Template("{% load pagination_tags %}{% autopaginate var 2 %}{% paginate %}") + +# WARNING: Please, please nobody read this portion of the code! +>>> class GetProxy(object): +... def __iter__(self): yield self.__dict__.__iter__ +... def copy(self): return self +... def urlencode(self): return u'' +... def keys(self): return [] +>>> class RequestProxy(object): +... page = 1 +... GET = GetProxy() +>>> +# ENDWARNING + +>>> t.render(Context({'var': range(21), 'request': RequestProxy()})) +u'\\n