From ed19b23c9242378de1cc9e279029da5b9c073945 Mon Sep 17 00:00:00 2001 From: duck Date: Sat, 31 Jul 2010 15:24:13 +0000 Subject: [PATCH 001/317] Website revamp, work in progress. --- www.i2p2/pages/_layout.html | 49 +++- www.i2p2/pages/_menu.html | 347 ++++--------------------- www.i2p2/pages/index.html | 188 ++++++++------ www.i2p2/static/images/btn_left.png | Bin 0 -> 699 bytes www.i2p2/static/images/btn_right.png | Bin 0 -> 686 bytes www.i2p2/static/images/btn_stretch.png | Bin 0 -> 212 bytes www.i2p2/static/styles/960.css | 1 + www.i2p2/static/styles/default.css | 84 ++++++ www.i2p2/static/styles/mainmenu.css | 165 ++++++++++++ 9 files changed, 449 insertions(+), 385 deletions(-) create mode 100644 www.i2p2/static/images/btn_left.png create mode 100644 www.i2p2/static/images/btn_right.png create mode 100644 www.i2p2/static/images/btn_stretch.png create mode 100644 www.i2p2/static/styles/960.css create mode 100644 www.i2p2/static/styles/default.css create mode 100644 www.i2p2/static/styles/mainmenu.css diff --git a/www.i2p2/pages/_layout.html b/www.i2p2/pages/_layout.html index 0271a3af..b75ebf3f 100644 --- a/www.i2p2/pages/_layout.html +++ b/www.i2p2/pages/_layout.html @@ -1,27 +1,48 @@ -{% include "_urlify" %} +{% include "_urlify" -%} {% filter capture('title') %}{% block title %}{% endblock %}{% endfilter %} - I2P - - + + + + - - + + +
Skip navigation
- -

{{ title }}

- -
- {% block content %}{% endblock %} +
+ +
+
+ {% block content %}{% endblock %} +
diff --git a/www.i2p2/pages/_menu.html b/www.i2p2/pages/_menu.html index 6512639a..d0b066c1 100644 --- a/www.i2p2/pages/_menu.html +++ b/www.i2p2/pages/_menu.html @@ -1,293 +1,56 @@ -
-English -Deutsch -中文 -Français -
-Italiano -Nederlands -Русский -
+ -
Dark  -Light -
- -{% if lang == "de" %} -
Willkommen bei I2P
-
Download
-
News
- Ankündigungen
- - Entwicklertreffen
- Zeitplan
- Aufgabenliste
-
Über I2P
- FAQ
- Forum
- Prämien
- Beteilige dich
- Spende!
- - I2P Team
- Ruhmeshalle
-
Dokumentationen
- Wie funktioniert es?
- Tech-intro
- Howto Dokumente
- Anwendungen
-
Entwickeln
- API
- Lizenzen
- Trac - -

Syndie
-
Links
-
Mirror -
Mirror 2 -
Mirror 3 -
Secure Site -
Secure Mirror -
-
Impressum
- -{% elif lang == "it" %} -
Benvenuti su I2P! -
Download -
News
- Versioni
- - Incontraci
- Roadmap
- Cose-da-fare
-
Informazioni su I2P
- FAQ
- Forum
- Bounties
- Get Involved!
- Donazioni
- - Team I2P
- Hall of Fame
-
Documentazione
- Come funziona?
- Introduzione Tecnica
- Come funziona
- documenti

- Applicazioni
-
Sviluppo
- API
- Licenze
- Trac - -

Syndie
-
Links
-
Mirror 1 -
Mirror 2 -
Mirror 3 -
Secure Site -
Secure Mirror -
-
Impressum
- -{% elif lang == "nl" %} -
Welkom bij I2P
-
Download
-
Nieuws
- Aankondigingen
- Vergaderingen
- Routekaart
- Taken lijst
-
Over I2P
- FAQ
- Forum
- Premies
- Werk mee
- Doneer!
- - I2P Team
- Eregalerij
-
Documentation
- Hoe werkt het?
- Tech intro
- Howto docs
- Applicaties
-
Development
- API
- Licenties
- Trac - -

Syndie
-
Links
-
Mirror -
Mirror 2 -
Mirror 3 -
Beveiligde Site -
Beveiligde Mirror -
-
Impressum
- -{% elif lang == "zh" %} -
√ I2P首页
-
√ I2P下载
- - -
项目动态
- 公告
- - - 会议
- 路线图
- 任务
-
I2P简介
- √ 常见问题集
- i2p论坛
- 赏金项目
- 志愿者
- 捐助!
- - I2P团队
- 名人堂
-
技术文档
- 工作原理
- 技术内幕
- 安装指南
- 程序开发
-
开发
- API
- 许可证
- Trac - -

Syndie
-
链接
-
Mirror -
Mirror 2 -
Mirror 3 -
Secure Site -
Secure Mirror -
-
Impressum
- -{% elif lang == "fr" %} -
Bienvenue sur I2P
-
Téléchargement
- - -
Nouveautés
- Versions
- - - Rencontres i2p
- Roadmap
- Les choses à faire
-
A propos d'i2p
- Foire aux questions
- I2P forums
- Primes
- Contribuer
- Faire un don
- - L'équipe
- Panthéon des héros
-
Documentation
- Fonctionnement
- Intro technique
- Turoriaux (How to)
- Applications pour I2P
-
Développement
- API
- Licences
- Trac - -

Syndie
-
Liens
-
Mirror -
Mirror 2 -
Mirror 3 -
Secure Site -
Secure Mirror -
-
Impressum
- - -{% elif lang == "ru" %} -
Добро пожаловать
-
Скачать
- -
Новости
- Объявления
- Проектные митинги
- План развития
- Список задач
- -
О проекте I2P
- FAQ
- Форумы
- Премии за проекты
- Как стать участником
- Donate!
- - Команда I2P
- Зал Славы
- -
Документация
- Как это работает?
- Техническая вводная
- Howto docs
- Приложения
- -
Разработка
- API
- Лицензии
- Багтрекер - -

Syndie
-
Ссылки
-
Mirror -
Mirror 2 -
Mirror 3 -
Secure Site -
Secure Mirror -
-
Impressum
- - -{% else %} -
Welcome to I2P
-
Download
- -
News
- Announcements
- - - Meetings
- Roadmap
- Task list
-
About I2P
- FAQ
- Forums
- Bounties
- Get involved
- Donate!
- - I2P Team
- Hall of Fame
-
Documentation
- How does it work?
- Tech intro
- Howto docs
- Applications
-
Development
- API
- Licenses
- Trac - -

Syndie
-
Links
-
Mirror -
Mirror 2 -
Mirror 3 -
Secure Site -
Secure Mirror -
-
Impressum
-{% endif %} +
+
+English +Deutsch +中文 +Français +Italiano +Nederlands +Русский +
+
diff --git a/www.i2p2/pages/index.html b/www.i2p2/pages/index.html index 3805ef14..e2d97fc1 100644 --- a/www.i2p2/pages/index.html +++ b/www.i2p2/pages/index.html @@ -1,88 +1,118 @@ {% extends "_layout.html" %} {% block title %}I2P Anonymous Network{% endblock %} {% block content %} -
-
-Latest version:
-2010-07-12 - I2P 0.8 - {{ urlify("release-0.8", "Announcement", "html")}} -- Download
-2007-09-28 - Syndie 1.101a - - -- Download +
+
+

What can I2P do for you?

+ +

The I2P network provides strong privacy protections for communication over the Internet. Many activities that would risk your privacy on the public Internet can be conducted anonymously on I2P. Though suitable for general privacy-conscious usage, I2P is also designed to protect users under high risk, such as:

+ +
    +
  • + Activists
    + Coordinate on human rights, free speech, peace. +
  • +
  • + Marginalized groups
    + Associate without threat of ethnic, political, or religious persecution. +
  • +
+ +
-
-Latest News:
-2010-07-12 - I2P 0.8 -Released -
-2010-06-07 - I2P 0.7.14 -Released -
-2010-04-27 - I2P 0.7.13 -Released -
-2010-03-15 - I2P 0.7.12 -Released -
- -
-
-

I2P is an anonymizing network, offering a simple layer that identity-sensitive -applications can use to securely communicate. All data is wrapped with several -layers of encryption, and the network is both distributed and dynamic, with no trusted parties.

-

-Many applications are available that interface with I2P, including -mail, peer-peer, IRC chat, and others. -

-I2P is growing fast! There were nine releases in 2009, and traffic grew by a factor of 5: -

-

-2009 bandwidth -
-

- -

-The I2P project was formed in 2003 to support the efforts of -those trying to build a more free society by offering them an uncensorable, -anonymous, and secure communication system. I2P is a development effort -producing a low latency, fully distributed, autonomous, scalable, anonymous, -resilient, and secure network. The goal is to operate successfully in -hostile environments. even when an organization with substantial financial -or political resources attacks it. All aspects of the network are open source and -available without cost, as this should both assure the people using it that the software -does what it claims, as well as enable others to contribute and improve -upon it to defeat aggressive attempts to -stifle free speech. -

- -

Anonymity is not a boolean - we are not trying to make something -"perfectly anonymous", but instead are working at making attacks more and more -expensive to mount. I2P is a low latency mix network, -and there are limits to the anonymity offered by such a system, but the applications -on top of I2P, such as Syndie, I2P mail, -and I2PSnark extend it to offer both additional functionality and protection.

- -

I2P is still a work in progress. -It should not be relied upon for "guaranteed" anonymity at this time, -due to the relatively small size of the network and the lack of extensive academic review. -It is not immune to to attacks from those with unlimited resources, and may never be, -due to the inherent limitations of low-latency mix networks. -

- -

-I2P works by routing traffic through other peers, as shown in the following picture. -All traffic is encrypted end-to-end. -For more information about how I2P works, see the -Introduction. -

-

-
-end to end layered encryption +
+

Get started with I2P

-
+ +
+
+ Download Now +   +
+
+
+ +
+

How does I2P work?

+

+Network diagram

+

On the public Internet your external IP address is unique and provides a strong correlation between your online activities and your true identity. Effective privacy is hard to achieve because the Internet, by design, allows senders and receivers to see each other's external IP address. Another fundamental threat to privacy results from Internet-enabled applications that don't encrypt – or don't sufficiently encrypt – your sensitive communications.

+ +

I2P anonymizes Internet communications by: 1) employing many techniques to make it exceedingly difficult for a receiver to prove the IP address of a sender and vice versa; and 2) by strongly encrypting all communication between the sender and receiver.

+ +

To explore the workings of I2P in further detail please read A Gentle Introduction to the I2P Network. The technically-minded may wish to proceed to the I2P Network Technical Introduction.

+
+
+ +
+
+

Supported Applications

+ +
+ + + + +
{% endblock %} diff --git a/www.i2p2/static/images/btn_left.png b/www.i2p2/static/images/btn_left.png new file mode 100644 index 0000000000000000000000000000000000000000..9e49dd0028f4f784d39eaa1a55b0f46b03092af1 GIT binary patch literal 699 zcmV;s0!00ZP);#Ek>=2XNrVKjBYtZ~g#WkT~Q3;*>;!8>%WkdO$*;!XXuq z!ou!$-o)NIt0ctI$YXo_-kTXO$cToZv0AO}`~CjSY&KhOHk(K6IgS%zmQqF%frG)| zy4UNC%H{G^Hk2&(zd_I4GCLCZkzP=Eu?RI;lg*+S%ei(+JK>{I3 zM_^#qF8Gm<(PIo6jd3zSAq#^b;4)xf&m=*<;6QU=3>Q#ZAZaP=E3ncbG)a*d_MQs_ zjV7oxl4eO+%BO}fy(C1T^vzIQ7(kSS#Au*GsWc@Jh3>U*5kSUCX!Q8d4rFQy;!+y% zn4#5PGqtH>yy?23RYS?;(TF06Xs?0Jh@dtd0D{qK>*N-mPN$gKDz*vYdMYhEvgwl4 ztQ(Y|PL?N$=(gMKO{rA++-kMf$jdT_j*Q_wO41nVB$D>Oh1fu6E(I!$n0y0vAp4An zWL`m(Hnq@*Zw8tcUVe`{8Sx(Kx3Yd7csw58g{bsrsjN;sdmsEJ;rYJ*8dB^7(a{=T zLNwKQ>NO!MEAXZ6L@J-pdz4H>--!cseIYq3Rjbv$&`)2K$z(izV9d22>fgfpX1xFa002ovPDHLkV1mC>LoWaT literal 0 HcmV?d00001 diff --git a/www.i2p2/static/images/btn_right.png b/www.i2p2/static/images/btn_right.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a6d2b8ae87fb30be8c369fec1352a74e9749c1 GIT binary patch literal 686 zcmV;f0#W^mP)2CB6ZLaFP2n1G8 z620o3oNqF78D}@#J#d)e%y+)?y7#bNuXiV1O?RjbvvqtR&02^ezDL&liI9cu2Y)#^T#NaAy*RQ zr;0JT?)UqENZ59}JqWr;C?2F1FdBuxQJhXEPZt9gI2gR7oMD4V0fTOha@LQLlW~l4 zGL_o`8#w~W#PN7!rr9u1DtJ^j!;C20ixFg|iUFeu>oVd*u{Z^2bq73Cj422w0VSNd z&8B&w^);Rei{kveK70666z6E-~sB`om12Sz> zKw{)(gxvaKE=~v)BWYD%39FYjqXMSW=_^`!vfXZHVEpJ7kw_$bTA+!1KA&8#*THNy z`z&g;+O@r;u(&V{TB6=^xeWUK{tbP+AMp6eWvo;xFFKvhn{KyzTP~Lyc>F8C068iw UvLE!R#{d8T07*qoM6N<$f#@c;k- literal 0 HcmV?d00001 diff --git a/www.i2p2/static/images/btn_stretch.png b/www.i2p2/static/images/btn_stretch.png new file mode 100644 index 0000000000000000000000000000000000000000..4dd0197e8eaa83b3ac66bdb5a0221ecdfe113ab4 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfx!3HGlw@oMqQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%rFptIhE&`t>Aon~puppN`-;E) zp9EgF0`fro1StS@$+x6Y9mQ}k0ZDjCt^>bP0 Hl+XkK>G4X? literal 0 HcmV?d00001 diff --git a/www.i2p2/static/styles/960.css b/www.i2p2/static/styles/960.css new file mode 100644 index 00000000..fe3d05f6 --- /dev/null +++ b/www.i2p2/static/styles/960.css @@ -0,0 +1 @@ +.container_12,.container_16{margin-left:auto;margin-right:auto;width:960px}.grid_1,.grid_2,.grid_3,.grid_4,.grid_5,.grid_6,.grid_7,.grid_8,.grid_9,.grid_10,.grid_11,.grid_12,.grid_13,.grid_14,.grid_15,.grid_16{display:inline;float:left;margin-left:10px;margin-right:10px}.push_1,.pull_1,.push_2,.pull_2,.push_3,.pull_3,.push_4,.pull_4,.push_5,.pull_5,.push_6,.pull_6,.push_7,.pull_7,.push_8,.pull_8,.push_9,.pull_9,.push_10,.pull_10,.push_11,.pull_11,.push_12,.pull_12,.push_13,.pull_13,.push_14,.pull_14,.push_15,.pull_15{position:relative}.container_12 .grid_3,.container_16 .grid_4{width:220px}.container_12 .grid_6,.container_16 .grid_8{width:460px}.container_12 .grid_9,.container_16 .grid_12{width:700px}.container_12 .grid_12,.container_16 .grid_16{width:940px}.alpha{margin-left:0}.omega{margin-right:0}.container_12 .grid_1{width:60px}.container_12 .grid_2{width:140px}.container_12 .grid_4{width:300px}.container_12 .grid_5{width:380px}.container_12 .grid_7{width:540px}.container_12 .grid_8{width:620px}.container_12 .grid_10{width:780px}.container_12 .grid_11{width:860px}.container_16 .grid_1{width:40px}.container_16 .grid_2{width:100px}.container_16 .grid_3{width:160px}.container_16 .grid_5{width:280px}.container_16 .grid_6{width:340px}.container_16 .grid_7{width:400px}.container_16 .grid_9{width:520px}.container_16 .grid_10{width:580px}.container_16 .grid_11{width:640px}.container_16 .grid_13{width:760px}.container_16 .grid_14{width:820px}.container_16 .grid_15{width:880px}.container_12 .prefix_3,.container_16 .prefix_4{padding-left:240px}.container_12 .prefix_6,.container_16 .prefix_8{padding-left:480px}.container_12 .prefix_9,.container_16 .prefix_12{padding-left:720px}.container_12 .prefix_1{padding-left:80px}.container_12 .prefix_2{padding-left:160px}.container_12 .prefix_4{padding-left:320px}.container_12 .prefix_5{padding-left:400px}.container_12 .prefix_7{padding-left:560px}.container_12 .prefix_8{padding-left:640px}.container_12 .prefix_10{padding-left:800px}.container_12 .prefix_11{padding-left:880px}.container_16 .prefix_1{padding-left:60px}.container_16 .prefix_2{padding-left:120px}.container_16 .prefix_3{padding-left:180px}.container_16 .prefix_5{padding-left:300px}.container_16 .prefix_6{padding-left:360px}.container_16 .prefix_7{padding-left:420px}.container_16 .prefix_9{padding-left:540px}.container_16 .prefix_10{padding-left:600px}.container_16 .prefix_11{padding-left:660px}.container_16 .prefix_13{padding-left:780px}.container_16 .prefix_14{padding-left:840px}.container_16 .prefix_15{padding-left:900px}.container_12 .suffix_3,.container_16 .suffix_4{padding-right:240px}.container_12 .suffix_6,.container_16 .suffix_8{padding-right:480px}.container_12 .suffix_9,.container_16 .suffix_12{padding-right:720px}.container_12 .suffix_1{padding-right:80px}.container_12 .suffix_2{padding-right:160px}.container_12 .suffix_4{padding-right:320px}.container_12 .suffix_5{padding-right:400px}.container_12 .suffix_7{padding-right:560px}.container_12 .suffix_8{padding-right:640px}.container_12 .suffix_10{padding-right:800px}.container_12 .suffix_11{padding-right:880px}.container_16 .suffix_1{padding-right:60px}.container_16 .suffix_2{padding-right:120px}.container_16 .suffix_3{padding-right:180px}.container_16 .suffix_5{padding-right:300px}.container_16 .suffix_6{padding-right:360px}.container_16 .suffix_7{padding-right:420px}.container_16 .suffix_9{padding-right:540px}.container_16 .suffix_10{padding-right:600px}.container_16 .suffix_11{padding-right:660px}.container_16 .suffix_13{padding-right:780px}.container_16 .suffix_14{padding-right:840px}.container_16 .suffix_15{padding-right:900px}.container_12 .push_3,.container_16 .push_4{left:240px}.container_12 .push_6,.container_16 .push_8{left:480px}.container_12 .push_9,.container_16 .push_12{left:720px}.container_12 .push_1{left:80px}.container_12 .push_2{left:160px}.container_12 .push_4{left:320px}.container_12 .push_5{left:400px}.container_12 .push_7{left:560px}.container_12 .push_8{left:640px}.container_12 .push_10{left:800px}.container_12 .push_11{left:880px}.container_16 .push_1{left:60px}.container_16 .push_2{left:120px}.container_16 .push_3{left:180px}.container_16 .push_5{left:300px}.container_16 .push_6{left:360px}.container_16 .push_7{left:420px}.container_16 .push_9{left:540px}.container_16 .push_10{left:600px}.container_16 .push_11{left:660px}.container_16 .push_13{left:780px}.container_16 .push_14{left:840px}.container_16 .push_15{left:900px}.container_12 .pull_3,.container_16 .pull_4{left:-240px}.container_12 .pull_6,.container_16 .pull_8{left:-480px}.container_12 .pull_9,.container_16 .pull_12{left:-720px}.container_12 .pull_1{left:-80px}.container_12 .pull_2{left:-160px}.container_12 .pull_4{left:-320px}.container_12 .pull_5{left:-400px}.container_12 .pull_7{left:-560px}.container_12 .pull_8{left:-640px}.container_12 .pull_10{left:-800px}.container_12 .pull_11{left:-880px}.container_16 .pull_1{left:-60px}.container_16 .pull_2{left:-120px}.container_16 .pull_3{left:-180px}.container_16 .pull_5{left:-300px}.container_16 .pull_6{left:-360px}.container_16 .pull_7{left:-420px}.container_16 .pull_9{left:-540px}.container_16 .pull_10{left:-600px}.container_16 .pull_11{left:-660px}.container_16 .pull_13{left:-780px}.container_16 .pull_14{left:-840px}.container_16 .pull_15{left:-900px}.clear{clear:both;display:block;overflow:hidden;visibility:hidden;width:0;height:0}.clearfix:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;width:0;height:0}* html .clearfix,*:first-child+html .clearfix{zoom:1} \ No newline at end of file diff --git a/www.i2p2/static/styles/default.css b/www.i2p2/static/styles/default.css new file mode 100644 index 00000000..4862060c --- /dev/null +++ b/www.i2p2/static/styles/default.css @@ -0,0 +1,84 @@ +html,body,h1,h2,h3,ol,ul,p{margin:0;padding:0} + +body { + font-family: sans-serif; +} + +p,ol,ul {margin-bottom:10px} + +img {border:0;} + +.hide { + display: none; +} + +#header { + border-bottom:1px solid black; /* give us a black border underneath */ + margin-bottom: 10px; +} + +#logo { + margin-top: 12px; + height: 42px; +} + +#slogan { + margin-top: 12px; + height: 42px; +} + +#searchbox { + margin-top: 18px; +} + +#searchbox form{ + float: right; +} + +#flags { + float: right; +} + +.content li { + margin-left: 1.4em; +} + +#try_i2p_now { + margin-top: 6px; + margin-bottom: 10px; +} + +#supported_applications { + font-size: smaller; +} + +#news { + font-size: smaller; +} + +.btn { + float: left; + clear: both; + background: url(../images/btn_left.png) no-repeat; + padding: 0 0 0 10px; + margin: 5px 0; +} +.btn a{ + float: left; + height: 40px; + background: url(../images/btn_stretch.png) repeat-x left top; + line-height: 40px; + padding: 0 10px; + color: #fff; + font-size: 1.5em; + font-weight: bold; + text-decoration: none; +} +.btn span { + background: url(../images/btn_right.png) no-repeat; + float: left; + width: 10px; + height: 40px; +} +.btn_download { background-color: red; } +.btn_donate { background-color: green; } diff --git a/www.i2p2/static/styles/mainmenu.css b/www.i2p2/static/styles/mainmenu.css new file mode 100644 index 00000000..7299b342 --- /dev/null +++ b/www.i2p2/static/styles/mainmenu.css @@ -0,0 +1,165 @@ +/*============================================================================== + + GRC multi-level script-free pure-CSS menuing system stylesheet. + This code is hereby placed into the public domain by its author + Steve Gibson. It may be freely used for any purpose whatsoever. + + Computed Geometries: with a default 12px font, 1.0em == 12px and + 1px == 0.08333em. + Thus, our 98px wide Freeware & Research buttons are 8.166666em wide. + + PUBLIC DOMAIN CONTRIBUTION NOTICE + This work has been explicitly placed into the Public Domain for the + benefit of anyone who may find it useful for any purpose whatsoever. + +==============================================================================*/ + + /*========================= TOP OF THE MENU CASCADE =========================*/ + +.menu { + position:relative; /* establish a menu-relative positioning context */ + float:left; /* play nicely with others */ + margin:0; + padding:0; + border:0; + height:24px; /* the menu's overall height */ +} + +.menu img { + vertical-align: top; /* prevent images from being pushed down by text */ +} + +.menu ul { + margin:0; + list-style-type:none; /* we don't want to view the list as a list */ + line-height:1.5em; /* globally set the menu's item spacing. note */ +} /* this must be 1.0 or 1.5 or 2.0 for Mozilla */ + +.menu li { + float:left; /* this creates the side-by-side array of top-level buttons */ + position:relative; /* create local positioning contexts for each button */ + margin:0; + margin-right: 2em; +} + +.drop { + display:block; + padding:0px 0.33em; /* this sets the l/r margins for our menu item */ + margin:0; + text-align:right; /* this right alignment goes with the float:left below */ + cursor:pointer; /* IE tries to switch back to an I-beam, don't let it */ + cursor:hand; /* IE5 only knows about "hand", so set it both ways */ +} + +.drop span { /* this simultaneously left and right aligns the text and */ + float:left; /* the >> in the drop-down menus which link to sub-menus */ +} + +.rightmenu { + position:relative; /* establish a local positioning context for YAH label */ + float:right; /* and right-align it at the top of our page */ +} + +/*======================== TOP LEVEL MENU DEFINITIONS ========================*/ + +.menu ul li ul { + display:none; /* initially hide the entire list hierarchy */ + padding:1px; /* this is our box border width */ +} + +.menu ul li a, +.menu ul li a:visited { /* unselected top-level menu items */ + display:block; + float:left; + text-decoration:none; + height:24px; +} + +/*======================== 2ND LEVEL MENU DEFINITIONS ========================*/ + +.menu ul li:hover ul, +.menu ul li a:hover ul { /* 2nd level drop-down box */ + display:block; + position:absolute; + margin:0; + top:24px; /* place us just up underneath the top-level images */ + left:-1px; /* left-align our drop-down to the previous button border */ + height:auto; /* the drop-down height will be determiend by line count */ + width:13.5em; + color:black; /* this sets the unselected-text color */ + background:black; /* this sets our menu's effective "border" color */ +} + +.menu ul li:hover ul.leftbutton, +.menu ul li a:hover ul.leftbutton {/* our first dropdown should not be skewed */ + left:0px; +} + +.menu ul li:hover ul.skinny, +.menu ul li a:hover ul.skinny { /* 2nd level skinny drop-down box */ + width:8.08333em; /* with a 12px default font, this is 97px width (97/12) */ +} + +.menu ul.rightmenu li:hover ul, +.menu ul.rightmenu li a:hover ul { /* 2nd level neighborhood drop-down box */ + left:auto; + right:0; /* nudge the right menu right to line up under the border */ + width:400px; /* with a 12px default font, this is 228px width (228/12) */ +} + +* html .menu ul.rightmenu li a:hover ul { /* IE5/6 needs a tweak here */ + right:-1px; +} + +.menu ul li:hover ul li a, +.menu ul li a:hover ul li a { /* 2nd level unselected items */ + border:0; + margin:0; + padding:0; + height:auto; + color:#000; /* this sets the unselected drop-down text color */ + background:#d8d8d8; /* this sets the drop-down menu background color */ + width:13.5em; +} + +.menu ul li:hover ul li:hover a, +.menu ul li a:hover ul li a:hover { /* 2nd level selected item */ + color:black; + background:white; +} + +.menu ul li:hover ul.skinny li a, +.menu ul li a:hover ul.skinny li a, +.menu ul li:hover ul.skinny li a:hover, +.menu ul li a:hover ul.skinny li a:hover { /* 2nd level un+selected items */ + width:8.08333em; +} + +/*======================== 3RD LEVEL MENU DEFINITIONS ========================*/ + +.menu ul li:hover ul li ul, +.menu ul li a:hover ul li a ul { /* hide inactive 3rd-level menus */ + visibility:hidden; +} + +.menu ul li:hover ul li:hover ul, +.menu ul li a:hover ul li a:hover ul { /* 3rd level drop-down box */ + visibility:visible; + position:absolute; + margin-top:-1px; /* bring the top edge of the 3rd level menu up one */ + top:0; + left:8.08333em; + width:14em; +} + +.menu ul li:hover ul li:hover ul li a, +.menu ul li a:hover ul li a:hover ul li a { /* 3rd level unselected items */ + width:14em; + background:#d8d8d8; +} + +.menu ul li:hover ul li:hover ul li a:hover, +.menu ul li a:hover ul li a:hover ul li a:hover { /* level3 selected items */ + width:14em; + background:white; +} From cdc3328bbf12f17633ecc3869511bdea40b3f2a4 Mon Sep 17 00:00:00 2001 From: dev Date: Wed, 5 Oct 2011 21:35:41 +0000 Subject: [PATCH 002/317] started working on the new version of the website --- app.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 app.py diff --git a/app.py b/app.py new file mode 100644 index 00000000..e14803b3 --- /dev/null +++ b/app.py @@ -0,0 +1,76 @@ +from jinja2 import Environment, FileSystemLoader +from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash + +app=application=Flask(__name__, template_folder=TEMPLATE_DIR) +app.debug=bool(os.environ.get('APP_DEBUG', 'False')) + +@app.url_value_preprocessor +def pull_lang(endpoint, values): + if not values: + return + g.lang=values.pop('lang', None) + +@app.view('/') +def main_index(): + redirect(url_for('site_show', lang='en')) + +@app.view('//site/') +@app.view('//site/') +def site_show(page=''): + # TODO: set content_type + +@app.view('//meetings/') +def meetings_index(): + return render_template('meetings/index.html') + +@app.view('//meetings/') +def meetings_show(id): + # TODO: implement + +@app.view('//meetings//raw') +def meetings_show_raw(id): + # TODO: implement + +@app.view('//download') +def downloads_list(): + # TODO: implement + +@app.view('//download/') +def downloads_select(file): + # TODO: implement + +@app.view('/download//any/') +@app.view('/download///') +def downloads_redirect(protocol, file, mirror=None): + # TODO: implement + +@app.view('//blog/') +@app.view('//blog/page/') +def blog_index(page=0): + # TODO: implement + +@app.view('//blog/entry/') +def blog_entry(slug): + # TODO: implement + +@app.view('/feed/blog/rss') +def blog_rss(): + # TODO: implement + +@app.view('/feed/blog/atom') +def blog_atom(): + # TODO: implement + +@app.view('/'): +def legacy_show(f): + # TODO: redirect to correct new url + +@app.view('/meeting') +@app.view('/meeting.html') +def legacy_meeting(id): + redirect(url_for('meetings_show', id=id, lang='en')) + +@app.view('/status---') +@app.view('/status---.html') +def legacy_status(year, month, day): + redirect(url_for('blog_entry', lang='en', slug=('%s/%s/%s/status' % (year, month, day)))) From 894b9bb72b1b8c48e32b9491aa2983ae6b86c795 Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 1 Jun 2012 21:15:42 +0000 Subject: [PATCH 003/317] finally! some progress --- app.py | 116 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 87 insertions(+), 29 deletions(-) diff --git a/app.py b/app.py index e14803b3..7c79e524 100644 --- a/app.py +++ b/app.py @@ -1,8 +1,16 @@ from jinja2 import Environment, FileSystemLoader -from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash +from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, send_from_directory, safe_join +import os.path +import fileinput + + +TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'pages') +MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings') + +app = application = Flask(__name__, template_folder=TEMPLATE_DIR) +app.debug = bool(os.environ.get('APP_DEBUG', 'False')) + -app=application=Flask(__name__, template_folder=TEMPLATE_DIR) -app.debug=bool(os.environ.get('APP_DEBUG', 'False')) @app.url_value_preprocessor def pull_lang(endpoint, values): @@ -10,67 +18,117 @@ def pull_lang(endpoint, values): return g.lang=values.pop('lang', None) -@app.view('/') +@app.route('/') def main_index(): - redirect(url_for('site_show', lang='en')) + return redirect(url_for('site_show', lang='en')) -@app.view('//site/') -@app.view('//site/') +@app.route('//site/') +@app.route('//site/') def site_show(page=''): # TODO: set content_type + pass -@app.view('//meetings/') +@app.route('//meetings/') def meetings_index(): return render_template('meetings/index.html') -@app.view('//meetings/') -def meetings_show(id): - # TODO: implement +@app.route('//meetings/') +def meetings_show(id, raw=False): + """ + Render the meeting X. + Either display the raw IRC .log or render as html and include .rst as header if it exists + """ + # generate file name for the raw meeting file(and header) + lname = str(id) + '.log' + hname = str(id) + '.rst' + lfile = safe_join(MEETINGS_DIR, lname) + hfile = safe_join(MEETINGS_DIR, hname) + + # check if meeting file exists and throw error if it does not.. + if not os.path.exists(lfile): + abort(404) + + log='' + header=None -@app.view('//meetings//raw') + # load log + with open(lfile, 'rb') as fd: + log = fd.read() + + # now try to load header if that makes sense + if os.path.exists(hfile): + with open(hfile, 'rb') as fd: + header = fd.read() + + + + # now only rendering left to do + if raw: + # hmm... maybe replace with something non-render_template like? + # return render_template('meetings/show_raw.html', log=log) + return send_from_directory(MEETINGS_DIR, lname, mimetype='text/plain') + else: + return render_template('meetings/show.html', log=log, header=header) + + +@app.route('//meetings//raw') def meetings_show_raw(id): - # TODO: implement + return meetings_show(id, raw=True) -@app.view('//download') +@app.route('//download') def downloads_list(): # TODO: implement + pass -@app.view('//download/') +@app.route('//download/') def downloads_select(file): # TODO: implement + pass -@app.view('/download//any/') -@app.view('/download///') +@app.route('/download//any/') +@app.route('/download///') def downloads_redirect(protocol, file, mirror=None): # TODO: implement + pass -@app.view('//blog/') -@app.view('//blog/page/') +@app.route('//blog/') +@app.route('//blog/page/') def blog_index(page=0): # TODO: implement + pass -@app.view('//blog/entry/') +@app.route('//blog/entry/') def blog_entry(slug): # TODO: implement + pass -@app.view('/feed/blog/rss') +@app.route('/feed/blog/rss') def blog_rss(): # TODO: implement + pass -@app.view('/feed/blog/atom') +@app.route('/feed/blog/atom') def blog_atom(): # TODO: implement + pass -@app.view('/'): -def legacy_show(f): - # TODO: redirect to correct new url -@app.view('/meeting') -@app.view('/meeting.html') + + +## legacy stuff: + +@app.route('/meeting') +@app.route('/meeting.html') def legacy_meeting(id): redirect(url_for('meetings_show', id=id, lang='en')) -@app.view('/status---') -@app.view('/status---.html') +@app.route('/status---') +@app.route('/status---.html') def legacy_status(year, month, day): redirect(url_for('blog_entry', lang='en', slug=('%s/%s/%s/status' % (year, month, day)))) + + +@app.route('/') +def legacy_show(f): + # TODO: redirect to correct new url + pass From a4571ab6dae8954c0112020dd86e80dc0deacc71 Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 1 Jun 2012 23:15:41 +0000 Subject: [PATCH 004/317] more progress! --- app.py | 79 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 26 deletions(-) diff --git a/app.py b/app.py index 7c79e524..263c26fb 100644 --- a/app.py +++ b/app.py @@ -1,16 +1,30 @@ -from jinja2 import Environment, FileSystemLoader +from jinja2 import Environment, FileSystemLoader, environmentfilter from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, send_from_directory, safe_join import os.path +import os import fileinput +import codecs TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'pages') +STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static') + MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings') -app = application = Flask(__name__, template_folder=TEMPLATE_DIR) +app = application = Flask(__name__, template_folder=TEMPLATE_DIR, static_url_path='/_static', static_folder=STATIC_DIR) app.debug = bool(os.environ.get('APP_DEBUG', 'False')) +@app.template_filter('restructuredtext') +def restructuredtext(env, value): + try: + from docutils.core import publish_parts + except ImportError: + print u"Install docutils!!11" + raise + parts = publish_parts(source=value, writer_name="html") + return parts['html_body'] + @app.url_value_preprocessor def pull_lang(endpoint, values): @@ -18,6 +32,10 @@ def pull_lang(endpoint, values): return g.lang=values.pop('lang', None) +#@app.url_value_preprocessor +#def fix_theme(endpoint, values): +# pass + @app.route('/') def main_index(): return redirect(url_for('site_show', lang='en')) @@ -33,7 +51,7 @@ def meetings_index(): return render_template('meetings/index.html') @app.route('//meetings/') -def meetings_show(id, raw=False): +def meetings_show(id, log=False, rst=False): """ Render the meeting X. Either display the raw IRC .log or render as html and include .rst as header if it exists @@ -48,32 +66,41 @@ def meetings_show(id, raw=False): if not os.path.exists(lfile): abort(404) - log='' - header=None - - # load log - with open(lfile, 'rb') as fd: - log = fd.read() - - # now try to load header if that makes sense - if os.path.exists(hfile): - with open(hfile, 'rb') as fd: - header = fd.read() - - - - # now only rendering left to do - if raw: + # if the user just wanted the .log + if log: # hmm... maybe replace with something non-render_template like? # return render_template('meetings/show_raw.html', log=log) return send_from_directory(MEETINGS_DIR, lname, mimetype='text/plain') - else: - return render_template('meetings/show.html', log=log, header=header) + + log='' + header=None + + # try to load header if that makes sense + if os.path.exists(hfile): + # if the user just wanted the .rst... + if rst: + return send_from_directory(MEETINGS_DIR, hname, mimetype='text/plain') + + # open the file as utf-8 file + with codecs.open(hfile, encoding='utf-8') as fd: + header = fd.read() + elif rst: + abort(404) + + # load log + with codecs.open(lfile, encoding='utf-8') as fd: + log = fd.read() + + return render_template('meetings/show.html', log=log, header=header, id=id) -@app.route('//meetings//raw') -def meetings_show_raw(id): - return meetings_show(id, raw=True) +@app.route('//meetings/.log') +def meetings_show_log(id): + return meetings_show(id, log=True) + +@app.route('//meetings/.rst') +def meetings_show_rst(id): + return meetings_show(id, rst=True) @app.route('//download') def downloads_list(): @@ -120,12 +147,12 @@ def blog_atom(): @app.route('/meeting') @app.route('/meeting.html') def legacy_meeting(id): - redirect(url_for('meetings_show', id=id, lang='en')) + return redirect(url_for('meetings_show', id=id, lang='en')) @app.route('/status---') @app.route('/status---.html') def legacy_status(year, month, day): - redirect(url_for('blog_entry', lang='en', slug=('%s/%s/%s/status' % (year, month, day)))) + return redirect(url_for('blog_entry', lang='en', slug=('%s/%s/%s/status' % (year, month, day)))) @app.route('/') From 7baf77ad1c381ca07c33218ccba123d5d8617b9d Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 1 Jun 2012 23:36:38 +0000 Subject: [PATCH 005/317] first kinda working setup well.. kinda... /en/meetings/208 works and that's about it --- app.py | 35 ++++++++- .../pages/meeting208.html => meetings/208.log | 71 ------------------ .../_layout.html => pages/global/layout.html | 14 ++-- .../_menu.html => pages/global/menu.html | 22 +++--- www.i2p2/pages/_urlify => pages/global/urlify | 2 +- .../meetings/index.html | 2 +- {www.i2p2/static => static}/favicon.ico | Bin .../images/I2PTunnel-streamr.png | Bin .../images/add-key-terminal.png | Bin .../images/bandwidth2009.png | Bin {www.i2p2/static => static}/images/cz.png | Bin {www.i2p2/static => static}/images/dark.png | Bin .../static => static}/images/darkbluebg.png | Bin .../static => static}/images/darkbluetile.png | Bin .../images/darkerbluetile.png | Bin {www.i2p2/static => static}/images/de.png | Bin .../static => static}/images/download.png | Bin .../images/download_dark.png | Bin .../images/endToEndEncryption.png | Bin .../images/endToEndEncryption_fr.png | Bin .../images/endToEndEncryption_zh.png | Bin {www.i2p2/static => static}/images/es.png | Bin {www.i2p2/static => static}/images/eu.png | Bin .../images/firefox.options.jpg | Bin .../images/firefox.options_fr.png | Bin .../images/firefox.proxyports.jpg | Bin .../images/firefox.proxyports_fr.png | Bin {www.i2p2/static => static}/images/fr.png | Bin .../static => static}/images/garliccloves.png | Bin {www.i2p2/static => static}/images/help.png | Bin .../static => static}/images/help_dark.png | Bin .../static => static}/images/i2plogo.png | Bin .../images/i2ptunnel_peertopeer.png | Bin .../images/i2ptunnel_serverclient.png | Bin .../static => static}/images/i2pvstor_zh.png | Bin .../static => static}/images/ie.options.jpg | Bin .../images/ie.options_fr.png | Bin .../images/ie.proxyports.jpg | Bin .../images/ie.proxyports_fr.png | Bin {www.i2p2/static => static}/images/info.png | Bin .../static => static}/images/info_dark.png | Bin {www.i2p2/static => static}/images/it.png | Bin .../static => static}/images/itoopie.png | Bin .../images/konqueror.options.jpg | Bin .../images/konqueror.options_fr.jpg | Bin .../images/konqueror.proxyports.jpg | Bin .../images/konqueror.proxyports_fr.jpg | Bin .../static => static}/images/lang_ar.png | Bin {www.i2p2/static => static}/images/light.png | Bin .../images/lightbluetile.png | Bin {www.i2p2/static => static}/images/link.png | Bin .../static => static}/images/link_dark.png | Bin .../static => static}/images/logo07c.jpg | Bin {www.i2p2/static => static}/images/net.png | Bin {www.i2p2/static => static}/images/net_fr.png | Bin .../images/netdb_get_leaseset.png | Bin .../images/netdb_get_leaseset_fr.png | Bin .../images/netdb_get_routerinfo_1.png | Bin .../images/netdb_get_routerinfo_1_fr.png | Bin .../images/netdb_get_routerinfo_2.png | Bin .../images/netdb_get_routerinfo_2_fr.png | Bin {www.i2p2/static => static}/images/nl.png | Bin {www.i2p2/static => static}/images/plan.png | Bin .../images/protocol_stack.png | Bin .../images/protocol_stack_fr.png | Bin {www.i2p2/static => static}/images/ru.png | Bin .../static => static}/images/sqbullet.png | Bin .../images/stackoverflow_ad.png | Bin .../static => static}/images/tabletile.png | Bin .../images/tabletile_alt.png | Bin .../images/tabletitledark.png | Bin .../images/tabletitlelight-tall.png | Bin .../images/tabletitlelight.png | Bin {www.i2p2/static => static}/images/target.png | Bin .../images/tunnelSending.png | Bin .../static => static}/images/tunnels.png | Bin .../static => static}/images/tunnels_fr.png | Bin {www.i2p2/static => static}/images/udp.png | Bin {www.i2p2/static => static}/images/us.png | Bin {www.i2p2/static => static}/images/zh.png | Bin {www.i2p2/static => static}/news/news.xml | 0 {www.i2p2/static => static}/pdf/I2CP_spec.pdf | Bin {www.i2p2/static => static}/pdf/I2NP_spec.pdf | Bin .../pdf/I2P-PET-CON-2009.1.pdf | Bin .../static => static}/pdf/datastructures.pdf | Bin .../static => static}/pdf/i2p_philosophy.pdf | Bin .../pdf/polling_http_transport.pdf | Bin {www.i2p2/static => static}/styles/dark.css | 0 {www.i2p2/static => static}/styles/light.css | 0 .../static => static}/styles/light_ar.css | 0 .../static => static}/styles/light_zh.css | 0 91 files changed, 51 insertions(+), 95 deletions(-) rename www.i2p2/pages/meeting208.html => meetings/208.log (83%) rename www.i2p2/pages/_layout.html => pages/global/layout.html (59%) rename www.i2p2/pages/_menu.html => pages/global/menu.html (95%) rename www.i2p2/pages/_urlify => pages/global/urlify (79%) rename www.i2p2/pages/meetings.html => pages/meetings/index.html (99%) rename {www.i2p2/static => static}/favicon.ico (100%) rename {www.i2p2/static => static}/images/I2PTunnel-streamr.png (100%) rename {www.i2p2/static => static}/images/add-key-terminal.png (100%) rename {www.i2p2/static => static}/images/bandwidth2009.png (100%) rename {www.i2p2/static => static}/images/cz.png (100%) rename {www.i2p2/static => static}/images/dark.png (100%) rename {www.i2p2/static => static}/images/darkbluebg.png (100%) rename {www.i2p2/static => static}/images/darkbluetile.png (100%) rename {www.i2p2/static => static}/images/darkerbluetile.png (100%) rename {www.i2p2/static => static}/images/de.png (100%) rename {www.i2p2/static => static}/images/download.png (100%) rename {www.i2p2/static => static}/images/download_dark.png (100%) rename {www.i2p2/static => static}/images/endToEndEncryption.png (100%) rename {www.i2p2/static => static}/images/endToEndEncryption_fr.png (100%) rename {www.i2p2/static => static}/images/endToEndEncryption_zh.png (100%) rename {www.i2p2/static => static}/images/es.png (100%) rename {www.i2p2/static => static}/images/eu.png (100%) rename {www.i2p2/static => static}/images/firefox.options.jpg (100%) rename {www.i2p2/static => static}/images/firefox.options_fr.png (100%) rename {www.i2p2/static => static}/images/firefox.proxyports.jpg (100%) rename {www.i2p2/static => static}/images/firefox.proxyports_fr.png (100%) rename {www.i2p2/static => static}/images/fr.png (100%) rename {www.i2p2/static => static}/images/garliccloves.png (100%) rename {www.i2p2/static => static}/images/help.png (100%) rename {www.i2p2/static => static}/images/help_dark.png (100%) rename {www.i2p2/static => static}/images/i2plogo.png (100%) rename {www.i2p2/static => static}/images/i2ptunnel_peertopeer.png (100%) rename {www.i2p2/static => static}/images/i2ptunnel_serverclient.png (100%) rename {www.i2p2/static => static}/images/i2pvstor_zh.png (100%) rename {www.i2p2/static => static}/images/ie.options.jpg (100%) rename {www.i2p2/static => static}/images/ie.options_fr.png (100%) rename {www.i2p2/static => static}/images/ie.proxyports.jpg (100%) rename {www.i2p2/static => static}/images/ie.proxyports_fr.png (100%) rename {www.i2p2/static => static}/images/info.png (100%) rename {www.i2p2/static => static}/images/info_dark.png (100%) rename {www.i2p2/static => static}/images/it.png (100%) rename {www.i2p2/static => static}/images/itoopie.png (100%) rename {www.i2p2/static => static}/images/konqueror.options.jpg (100%) rename {www.i2p2/static => static}/images/konqueror.options_fr.jpg (100%) rename {www.i2p2/static => static}/images/konqueror.proxyports.jpg (100%) rename {www.i2p2/static => static}/images/konqueror.proxyports_fr.jpg (100%) rename {www.i2p2/static => static}/images/lang_ar.png (100%) rename {www.i2p2/static => static}/images/light.png (100%) rename {www.i2p2/static => static}/images/lightbluetile.png (100%) rename {www.i2p2/static => static}/images/link.png (100%) rename {www.i2p2/static => static}/images/link_dark.png (100%) rename {www.i2p2/static => static}/images/logo07c.jpg (100%) rename {www.i2p2/static => static}/images/net.png (100%) rename {www.i2p2/static => static}/images/net_fr.png (100%) rename {www.i2p2/static => static}/images/netdb_get_leaseset.png (100%) rename {www.i2p2/static => static}/images/netdb_get_leaseset_fr.png (100%) rename {www.i2p2/static => static}/images/netdb_get_routerinfo_1.png (100%) rename {www.i2p2/static => static}/images/netdb_get_routerinfo_1_fr.png (100%) rename {www.i2p2/static => static}/images/netdb_get_routerinfo_2.png (100%) rename {www.i2p2/static => static}/images/netdb_get_routerinfo_2_fr.png (100%) rename {www.i2p2/static => static}/images/nl.png (100%) rename {www.i2p2/static => static}/images/plan.png (100%) rename {www.i2p2/static => static}/images/protocol_stack.png (100%) rename {www.i2p2/static => static}/images/protocol_stack_fr.png (100%) rename {www.i2p2/static => static}/images/ru.png (100%) rename {www.i2p2/static => static}/images/sqbullet.png (100%) rename {www.i2p2/static => static}/images/stackoverflow_ad.png (100%) rename {www.i2p2/static => static}/images/tabletile.png (100%) rename {www.i2p2/static => static}/images/tabletile_alt.png (100%) rename {www.i2p2/static => static}/images/tabletitledark.png (100%) rename {www.i2p2/static => static}/images/tabletitlelight-tall.png (100%) rename {www.i2p2/static => static}/images/tabletitlelight.png (100%) rename {www.i2p2/static => static}/images/target.png (100%) rename {www.i2p2/static => static}/images/tunnelSending.png (100%) rename {www.i2p2/static => static}/images/tunnels.png (100%) rename {www.i2p2/static => static}/images/tunnels_fr.png (100%) rename {www.i2p2/static => static}/images/udp.png (100%) rename {www.i2p2/static => static}/images/us.png (100%) rename {www.i2p2/static => static}/images/zh.png (100%) rename {www.i2p2/static => static}/news/news.xml (100%) rename {www.i2p2/static => static}/pdf/I2CP_spec.pdf (100%) rename {www.i2p2/static => static}/pdf/I2NP_spec.pdf (100%) rename {www.i2p2/static => static}/pdf/I2P-PET-CON-2009.1.pdf (100%) rename {www.i2p2/static => static}/pdf/datastructures.pdf (100%) rename {www.i2p2/static => static}/pdf/i2p_philosophy.pdf (100%) rename {www.i2p2/static => static}/pdf/polling_http_transport.pdf (100%) rename {www.i2p2/static => static}/styles/dark.css (100%) rename {www.i2p2/static => static}/styles/light.css (100%) rename {www.i2p2/static => static}/styles/light_ar.css (100%) rename {www.i2p2/static => static}/styles/light_zh.css (100%) diff --git a/app.py b/app.py index 263c26fb..5108529b 100644 --- a/app.py +++ b/app.py @@ -14,9 +14,21 @@ MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings') app = application = Flask(__name__, template_folder=TEMPLATE_DIR, static_url_path='/_static', static_folder=STATIC_DIR) app.debug = bool(os.environ.get('APP_DEBUG', 'False')) +@app.after_request +def call_after_request_callbacks(response): + for callback in getattr(g, 'after_request_callbacks', ()): + response = callback(response) + return response + +def after_this_request(f): + if not hasattr(g, 'after_request_callbacks'): + g.after_request_callbacks = [] + g.after_request_callbacks.append(f) + return f + @app.template_filter('restructuredtext') -def restructuredtext(env, value): +def restructuredtext(value): try: from docutils.core import publish_parts except ImportError: @@ -32,9 +44,24 @@ def pull_lang(endpoint, values): return g.lang=values.pop('lang', None) -#@app.url_value_preprocessor -#def fix_theme(endpoint, values): -# pass +@app.before_request +def detect_theme(): + theme = 'light' + if 'style' in request.cookies: + theme = request.cookies['style'] + if 'theme' in request.args.keys(): + theme = request.args['theme'] + if not os.path.isfile(safe_join('static/styles', '%s.css' % theme)): + theme = 'light' + g.theme = theme + @after_this_request + def remember_theme(resp): + if g.theme == 'light' and 'style' in request.cookies: + resp.delete_cookie('style') + elif g.theme != 'light': + resp.set_cookie('style', g.theme) + return resp + @app.route('/') def main_index(): diff --git a/www.i2p2/pages/meeting208.html b/meetings/208.log similarity index 83% rename from www.i2p2/pages/meeting208.html rename to meetings/208.log index 18448cd8..0d0f5157 100644 --- a/www.i2p2/pages/meeting208.html +++ b/meetings/208.log @@ -1,69 +1,3 @@ -{% extends "_layout.html" %} -{% block title %}I2P Development Meeting 208{% endblock %} -{% block content %}

I2P dev meeting, September 8, 2010

-
-

Quick recap

-
    -
  • Present: duck, eche|on, Mathiasdm, Moru (later on), superuser, whitenoise, zzz
  • -
  • - Website content progress: -

    - The website overhaul has taken 7 weeks so far. Progress is not fast enough. We need more people to join in! -

    -
  • -
  • - Website backend progress: -

    - No report yet, welterde could not attend the meeting. -

    -
  • -
  • - Location for development discussion: -

    - Most people agree that IRC is not an ideal location to post long-winded development discussions, it's too volatile, not backed up and not everyone can read it. All developers are advised to post their discussions (or a writeup) to another medium, like zzz.i2p, mailing lists or forum.i2p. - Opinions on the alternatives are a bit more divided. zzz.i2p is currently the location for most discussions, but a number of people also like the idea of a mailing list. No decision has been made on which alternative would be best suited. -

    -
  • -
  • - Task appointing and disagreements: -

    - Currently, people appoint themselves to a task by editing the team.html page (this requires monotone access, so there is at least a level of trust implied before being allowed to appoint yourself). - However, what happens if people disagree? -

    -

    - The discussion pointed out that when disagreeing, a discussion should be held (for example on zzz.i2p). If that doesn't resolve the issue, a vote is a possibility, or the Project Manager (zzz) or repository maintainers (welterde, eche|on) can make a decision. -

    -
  • -
  • - Status updates: -

    - Status updates will be started next weekend. They will mostly consist of a 'what work did you do last week?' and 'what work will you do next week?'. -

    -
  • -
  • - Development conferences: -

    - Nothing big was mentioned. -

    -
  • -
  • - Promoting the usage of the bittorrent protocol inside I2P: pros and cons: -

    - Filesharing in general and bittorrent more specifically can be either good or bad for I2P. - On one hand, they could give I2P a bad reputation. On the other hand, they could boost I2P popularity. - What to do? -

    -

    - Filesharing on I2P will not be promoted specifically. Instead, general usability should be looked at and improved. - If people decide to use filesharing on I2P (or any other service, like e-mail or browsing), it should become easier as a result of improving the usability. -

    -
  • -
-
-
-

Full IRC Log

-
-{% filter escape %}
 22:02 <@Mathiasdm> okay
 22:02 <@Mathiasdm> meeting time
 22:03 <@Mathiasdm> 0) Hello
@@ -327,8 +261,3 @@
 23:24 < eche|on> COOKIES!
 23:25 <@Mathiasdm> don't eat all of them
 23:25  * Mathiasdm pokes eche|on 
-{% endfilter %}
-{# TODO: pygments #}
-
-
-{% endblock %} diff --git a/www.i2p2/pages/_layout.html b/pages/global/layout.html similarity index 59% rename from www.i2p2/pages/_layout.html rename to pages/global/layout.html index 26fa7599..4889c68a 100644 --- a/www.i2p2/pages/_layout.html +++ b/pages/global/layout.html @@ -1,24 +1,24 @@ -{% include "_urlify" -%} +{% include "global/urlify" -%} - {% filter capture('title') %}{% block title %}{% endblock %}{% endfilter %} - I2P + {% block title %}{% endblock %} - I2P - - + + -

{{ title }}

+

{{ self.title() }}

{% block content %}{% endblock %} diff --git a/www.i2p2/pages/_menu.html b/pages/global/menu.html similarity index 95% rename from www.i2p2/pages/_menu.html rename to pages/global/menu.html index 046e00a2..86adfcae 100644 --- a/www.i2p2/pages/_menu.html +++ b/pages/global/menu.html @@ -1,20 +1,20 @@
-English -Deutsch -Castellano -中文 +English +Deutsch +Castellano +中文
-Français -Italiano -Nederlands -Русский +Français +Italiano +Nederlands +Русский
-Čeština -العربية +Čeština +العربية
Dark  -Light +Light
{% if lang == "de" %} diff --git a/www.i2p2/pages/_urlify b/pages/global/urlify similarity index 79% rename from www.i2p2/pages/_urlify rename to pages/global/urlify index a9bdbf3d..59ffe02c 100644 --- a/www.i2p2/pages/_urlify +++ b/pages/global/urlify @@ -1,4 +1,4 @@ -{% macro urlify url, title, suffix %} +{% macro urlify(url, title, suffix) %} {% if static %} {{title}} {% else %} diff --git a/www.i2p2/pages/meetings.html b/pages/meetings/index.html similarity index 99% rename from www.i2p2/pages/meetings.html rename to pages/meetings/index.html index 9e65b231..b8effc6b 100644 --- a/www.i2p2/pages/meetings.html +++ b/pages/meetings/index.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}Meetings{% endblock %} {% block content %}

Logs of past I2P meetings

diff --git a/www.i2p2/static/favicon.ico b/static/favicon.ico similarity index 100% rename from www.i2p2/static/favicon.ico rename to static/favicon.ico diff --git a/www.i2p2/static/images/I2PTunnel-streamr.png b/static/images/I2PTunnel-streamr.png similarity index 100% rename from www.i2p2/static/images/I2PTunnel-streamr.png rename to static/images/I2PTunnel-streamr.png diff --git a/www.i2p2/static/images/add-key-terminal.png b/static/images/add-key-terminal.png similarity index 100% rename from www.i2p2/static/images/add-key-terminal.png rename to static/images/add-key-terminal.png diff --git a/www.i2p2/static/images/bandwidth2009.png b/static/images/bandwidth2009.png similarity index 100% rename from www.i2p2/static/images/bandwidth2009.png rename to static/images/bandwidth2009.png diff --git a/www.i2p2/static/images/cz.png b/static/images/cz.png similarity index 100% rename from www.i2p2/static/images/cz.png rename to static/images/cz.png diff --git a/www.i2p2/static/images/dark.png b/static/images/dark.png similarity index 100% rename from www.i2p2/static/images/dark.png rename to static/images/dark.png diff --git a/www.i2p2/static/images/darkbluebg.png b/static/images/darkbluebg.png similarity index 100% rename from www.i2p2/static/images/darkbluebg.png rename to static/images/darkbluebg.png diff --git a/www.i2p2/static/images/darkbluetile.png b/static/images/darkbluetile.png similarity index 100% rename from www.i2p2/static/images/darkbluetile.png rename to static/images/darkbluetile.png diff --git a/www.i2p2/static/images/darkerbluetile.png b/static/images/darkerbluetile.png similarity index 100% rename from www.i2p2/static/images/darkerbluetile.png rename to static/images/darkerbluetile.png diff --git a/www.i2p2/static/images/de.png b/static/images/de.png similarity index 100% rename from www.i2p2/static/images/de.png rename to static/images/de.png diff --git a/www.i2p2/static/images/download.png b/static/images/download.png similarity index 100% rename from www.i2p2/static/images/download.png rename to static/images/download.png diff --git a/www.i2p2/static/images/download_dark.png b/static/images/download_dark.png similarity index 100% rename from www.i2p2/static/images/download_dark.png rename to static/images/download_dark.png diff --git a/www.i2p2/static/images/endToEndEncryption.png b/static/images/endToEndEncryption.png similarity index 100% rename from www.i2p2/static/images/endToEndEncryption.png rename to static/images/endToEndEncryption.png diff --git a/www.i2p2/static/images/endToEndEncryption_fr.png b/static/images/endToEndEncryption_fr.png similarity index 100% rename from www.i2p2/static/images/endToEndEncryption_fr.png rename to static/images/endToEndEncryption_fr.png diff --git a/www.i2p2/static/images/endToEndEncryption_zh.png b/static/images/endToEndEncryption_zh.png similarity index 100% rename from www.i2p2/static/images/endToEndEncryption_zh.png rename to static/images/endToEndEncryption_zh.png diff --git a/www.i2p2/static/images/es.png b/static/images/es.png similarity index 100% rename from www.i2p2/static/images/es.png rename to static/images/es.png diff --git a/www.i2p2/static/images/eu.png b/static/images/eu.png similarity index 100% rename from www.i2p2/static/images/eu.png rename to static/images/eu.png diff --git a/www.i2p2/static/images/firefox.options.jpg b/static/images/firefox.options.jpg similarity index 100% rename from www.i2p2/static/images/firefox.options.jpg rename to static/images/firefox.options.jpg diff --git a/www.i2p2/static/images/firefox.options_fr.png b/static/images/firefox.options_fr.png similarity index 100% rename from www.i2p2/static/images/firefox.options_fr.png rename to static/images/firefox.options_fr.png diff --git a/www.i2p2/static/images/firefox.proxyports.jpg b/static/images/firefox.proxyports.jpg similarity index 100% rename from www.i2p2/static/images/firefox.proxyports.jpg rename to static/images/firefox.proxyports.jpg diff --git a/www.i2p2/static/images/firefox.proxyports_fr.png b/static/images/firefox.proxyports_fr.png similarity index 100% rename from www.i2p2/static/images/firefox.proxyports_fr.png rename to static/images/firefox.proxyports_fr.png diff --git a/www.i2p2/static/images/fr.png b/static/images/fr.png similarity index 100% rename from www.i2p2/static/images/fr.png rename to static/images/fr.png diff --git a/www.i2p2/static/images/garliccloves.png b/static/images/garliccloves.png similarity index 100% rename from www.i2p2/static/images/garliccloves.png rename to static/images/garliccloves.png diff --git a/www.i2p2/static/images/help.png b/static/images/help.png similarity index 100% rename from www.i2p2/static/images/help.png rename to static/images/help.png diff --git a/www.i2p2/static/images/help_dark.png b/static/images/help_dark.png similarity index 100% rename from www.i2p2/static/images/help_dark.png rename to static/images/help_dark.png diff --git a/www.i2p2/static/images/i2plogo.png b/static/images/i2plogo.png similarity index 100% rename from www.i2p2/static/images/i2plogo.png rename to static/images/i2plogo.png diff --git a/www.i2p2/static/images/i2ptunnel_peertopeer.png b/static/images/i2ptunnel_peertopeer.png similarity index 100% rename from www.i2p2/static/images/i2ptunnel_peertopeer.png rename to static/images/i2ptunnel_peertopeer.png diff --git a/www.i2p2/static/images/i2ptunnel_serverclient.png b/static/images/i2ptunnel_serverclient.png similarity index 100% rename from www.i2p2/static/images/i2ptunnel_serverclient.png rename to static/images/i2ptunnel_serverclient.png diff --git a/www.i2p2/static/images/i2pvstor_zh.png b/static/images/i2pvstor_zh.png similarity index 100% rename from www.i2p2/static/images/i2pvstor_zh.png rename to static/images/i2pvstor_zh.png diff --git a/www.i2p2/static/images/ie.options.jpg b/static/images/ie.options.jpg similarity index 100% rename from www.i2p2/static/images/ie.options.jpg rename to static/images/ie.options.jpg diff --git a/www.i2p2/static/images/ie.options_fr.png b/static/images/ie.options_fr.png similarity index 100% rename from www.i2p2/static/images/ie.options_fr.png rename to static/images/ie.options_fr.png diff --git a/www.i2p2/static/images/ie.proxyports.jpg b/static/images/ie.proxyports.jpg similarity index 100% rename from www.i2p2/static/images/ie.proxyports.jpg rename to static/images/ie.proxyports.jpg diff --git a/www.i2p2/static/images/ie.proxyports_fr.png b/static/images/ie.proxyports_fr.png similarity index 100% rename from www.i2p2/static/images/ie.proxyports_fr.png rename to static/images/ie.proxyports_fr.png diff --git a/www.i2p2/static/images/info.png b/static/images/info.png similarity index 100% rename from www.i2p2/static/images/info.png rename to static/images/info.png diff --git a/www.i2p2/static/images/info_dark.png b/static/images/info_dark.png similarity index 100% rename from www.i2p2/static/images/info_dark.png rename to static/images/info_dark.png diff --git a/www.i2p2/static/images/it.png b/static/images/it.png similarity index 100% rename from www.i2p2/static/images/it.png rename to static/images/it.png diff --git a/www.i2p2/static/images/itoopie.png b/static/images/itoopie.png similarity index 100% rename from www.i2p2/static/images/itoopie.png rename to static/images/itoopie.png diff --git a/www.i2p2/static/images/konqueror.options.jpg b/static/images/konqueror.options.jpg similarity index 100% rename from www.i2p2/static/images/konqueror.options.jpg rename to static/images/konqueror.options.jpg diff --git a/www.i2p2/static/images/konqueror.options_fr.jpg b/static/images/konqueror.options_fr.jpg similarity index 100% rename from www.i2p2/static/images/konqueror.options_fr.jpg rename to static/images/konqueror.options_fr.jpg diff --git a/www.i2p2/static/images/konqueror.proxyports.jpg b/static/images/konqueror.proxyports.jpg similarity index 100% rename from www.i2p2/static/images/konqueror.proxyports.jpg rename to static/images/konqueror.proxyports.jpg diff --git a/www.i2p2/static/images/konqueror.proxyports_fr.jpg b/static/images/konqueror.proxyports_fr.jpg similarity index 100% rename from www.i2p2/static/images/konqueror.proxyports_fr.jpg rename to static/images/konqueror.proxyports_fr.jpg diff --git a/www.i2p2/static/images/lang_ar.png b/static/images/lang_ar.png similarity index 100% rename from www.i2p2/static/images/lang_ar.png rename to static/images/lang_ar.png diff --git a/www.i2p2/static/images/light.png b/static/images/light.png similarity index 100% rename from www.i2p2/static/images/light.png rename to static/images/light.png diff --git a/www.i2p2/static/images/lightbluetile.png b/static/images/lightbluetile.png similarity index 100% rename from www.i2p2/static/images/lightbluetile.png rename to static/images/lightbluetile.png diff --git a/www.i2p2/static/images/link.png b/static/images/link.png similarity index 100% rename from www.i2p2/static/images/link.png rename to static/images/link.png diff --git a/www.i2p2/static/images/link_dark.png b/static/images/link_dark.png similarity index 100% rename from www.i2p2/static/images/link_dark.png rename to static/images/link_dark.png diff --git a/www.i2p2/static/images/logo07c.jpg b/static/images/logo07c.jpg similarity index 100% rename from www.i2p2/static/images/logo07c.jpg rename to static/images/logo07c.jpg diff --git a/www.i2p2/static/images/net.png b/static/images/net.png similarity index 100% rename from www.i2p2/static/images/net.png rename to static/images/net.png diff --git a/www.i2p2/static/images/net_fr.png b/static/images/net_fr.png similarity index 100% rename from www.i2p2/static/images/net_fr.png rename to static/images/net_fr.png diff --git a/www.i2p2/static/images/netdb_get_leaseset.png b/static/images/netdb_get_leaseset.png similarity index 100% rename from www.i2p2/static/images/netdb_get_leaseset.png rename to static/images/netdb_get_leaseset.png diff --git a/www.i2p2/static/images/netdb_get_leaseset_fr.png b/static/images/netdb_get_leaseset_fr.png similarity index 100% rename from www.i2p2/static/images/netdb_get_leaseset_fr.png rename to static/images/netdb_get_leaseset_fr.png diff --git a/www.i2p2/static/images/netdb_get_routerinfo_1.png b/static/images/netdb_get_routerinfo_1.png similarity index 100% rename from www.i2p2/static/images/netdb_get_routerinfo_1.png rename to static/images/netdb_get_routerinfo_1.png diff --git a/www.i2p2/static/images/netdb_get_routerinfo_1_fr.png b/static/images/netdb_get_routerinfo_1_fr.png similarity index 100% rename from www.i2p2/static/images/netdb_get_routerinfo_1_fr.png rename to static/images/netdb_get_routerinfo_1_fr.png diff --git a/www.i2p2/static/images/netdb_get_routerinfo_2.png b/static/images/netdb_get_routerinfo_2.png similarity index 100% rename from www.i2p2/static/images/netdb_get_routerinfo_2.png rename to static/images/netdb_get_routerinfo_2.png diff --git a/www.i2p2/static/images/netdb_get_routerinfo_2_fr.png b/static/images/netdb_get_routerinfo_2_fr.png similarity index 100% rename from www.i2p2/static/images/netdb_get_routerinfo_2_fr.png rename to static/images/netdb_get_routerinfo_2_fr.png diff --git a/www.i2p2/static/images/nl.png b/static/images/nl.png similarity index 100% rename from www.i2p2/static/images/nl.png rename to static/images/nl.png diff --git a/www.i2p2/static/images/plan.png b/static/images/plan.png similarity index 100% rename from www.i2p2/static/images/plan.png rename to static/images/plan.png diff --git a/www.i2p2/static/images/protocol_stack.png b/static/images/protocol_stack.png similarity index 100% rename from www.i2p2/static/images/protocol_stack.png rename to static/images/protocol_stack.png diff --git a/www.i2p2/static/images/protocol_stack_fr.png b/static/images/protocol_stack_fr.png similarity index 100% rename from www.i2p2/static/images/protocol_stack_fr.png rename to static/images/protocol_stack_fr.png diff --git a/www.i2p2/static/images/ru.png b/static/images/ru.png similarity index 100% rename from www.i2p2/static/images/ru.png rename to static/images/ru.png diff --git a/www.i2p2/static/images/sqbullet.png b/static/images/sqbullet.png similarity index 100% rename from www.i2p2/static/images/sqbullet.png rename to static/images/sqbullet.png diff --git a/www.i2p2/static/images/stackoverflow_ad.png b/static/images/stackoverflow_ad.png similarity index 100% rename from www.i2p2/static/images/stackoverflow_ad.png rename to static/images/stackoverflow_ad.png diff --git a/www.i2p2/static/images/tabletile.png b/static/images/tabletile.png similarity index 100% rename from www.i2p2/static/images/tabletile.png rename to static/images/tabletile.png diff --git a/www.i2p2/static/images/tabletile_alt.png b/static/images/tabletile_alt.png similarity index 100% rename from www.i2p2/static/images/tabletile_alt.png rename to static/images/tabletile_alt.png diff --git a/www.i2p2/static/images/tabletitledark.png b/static/images/tabletitledark.png similarity index 100% rename from www.i2p2/static/images/tabletitledark.png rename to static/images/tabletitledark.png diff --git a/www.i2p2/static/images/tabletitlelight-tall.png b/static/images/tabletitlelight-tall.png similarity index 100% rename from www.i2p2/static/images/tabletitlelight-tall.png rename to static/images/tabletitlelight-tall.png diff --git a/www.i2p2/static/images/tabletitlelight.png b/static/images/tabletitlelight.png similarity index 100% rename from www.i2p2/static/images/tabletitlelight.png rename to static/images/tabletitlelight.png diff --git a/www.i2p2/static/images/target.png b/static/images/target.png similarity index 100% rename from www.i2p2/static/images/target.png rename to static/images/target.png diff --git a/www.i2p2/static/images/tunnelSending.png b/static/images/tunnelSending.png similarity index 100% rename from www.i2p2/static/images/tunnelSending.png rename to static/images/tunnelSending.png diff --git a/www.i2p2/static/images/tunnels.png b/static/images/tunnels.png similarity index 100% rename from www.i2p2/static/images/tunnels.png rename to static/images/tunnels.png diff --git a/www.i2p2/static/images/tunnels_fr.png b/static/images/tunnels_fr.png similarity index 100% rename from www.i2p2/static/images/tunnels_fr.png rename to static/images/tunnels_fr.png diff --git a/www.i2p2/static/images/udp.png b/static/images/udp.png similarity index 100% rename from www.i2p2/static/images/udp.png rename to static/images/udp.png diff --git a/www.i2p2/static/images/us.png b/static/images/us.png similarity index 100% rename from www.i2p2/static/images/us.png rename to static/images/us.png diff --git a/www.i2p2/static/images/zh.png b/static/images/zh.png similarity index 100% rename from www.i2p2/static/images/zh.png rename to static/images/zh.png diff --git a/www.i2p2/static/news/news.xml b/static/news/news.xml similarity index 100% rename from www.i2p2/static/news/news.xml rename to static/news/news.xml diff --git a/www.i2p2/static/pdf/I2CP_spec.pdf b/static/pdf/I2CP_spec.pdf similarity index 100% rename from www.i2p2/static/pdf/I2CP_spec.pdf rename to static/pdf/I2CP_spec.pdf diff --git a/www.i2p2/static/pdf/I2NP_spec.pdf b/static/pdf/I2NP_spec.pdf similarity index 100% rename from www.i2p2/static/pdf/I2NP_spec.pdf rename to static/pdf/I2NP_spec.pdf diff --git a/www.i2p2/static/pdf/I2P-PET-CON-2009.1.pdf b/static/pdf/I2P-PET-CON-2009.1.pdf similarity index 100% rename from www.i2p2/static/pdf/I2P-PET-CON-2009.1.pdf rename to static/pdf/I2P-PET-CON-2009.1.pdf diff --git a/www.i2p2/static/pdf/datastructures.pdf b/static/pdf/datastructures.pdf similarity index 100% rename from www.i2p2/static/pdf/datastructures.pdf rename to static/pdf/datastructures.pdf diff --git a/www.i2p2/static/pdf/i2p_philosophy.pdf b/static/pdf/i2p_philosophy.pdf similarity index 100% rename from www.i2p2/static/pdf/i2p_philosophy.pdf rename to static/pdf/i2p_philosophy.pdf diff --git a/www.i2p2/static/pdf/polling_http_transport.pdf b/static/pdf/polling_http_transport.pdf similarity index 100% rename from www.i2p2/static/pdf/polling_http_transport.pdf rename to static/pdf/polling_http_transport.pdf diff --git a/www.i2p2/static/styles/dark.css b/static/styles/dark.css similarity index 100% rename from www.i2p2/static/styles/dark.css rename to static/styles/dark.css diff --git a/www.i2p2/static/styles/light.css b/static/styles/light.css similarity index 100% rename from www.i2p2/static/styles/light.css rename to static/styles/light.css diff --git a/www.i2p2/static/styles/light_ar.css b/static/styles/light_ar.css similarity index 100% rename from www.i2p2/static/styles/light_ar.css rename to static/styles/light_ar.css diff --git a/www.i2p2/static/styles/light_zh.css b/static/styles/light_zh.css similarity index 100% rename from www.i2p2/static/styles/light_zh.css rename to static/styles/light_zh.css From b26bbd81d98b93f91282274c4e2d89a9168d18c9 Mon Sep 17 00:00:00 2001 From: dev Date: Sun, 3 Jun 2012 01:06:09 +0000 Subject: [PATCH 006/317] 1/2 of blog implementation done! --- app.py | 94 ++++++++++++++++--- .../2006/10/10/status.html | 9 +- blog/2006/10/10/status.rst | 6 ++ .../downloads/list.html | 2 +- pages/global/error_404.html | 21 +++++ pages/global/urlify | 2 + {www.i2p2/pages => pages/site}/index.html | 5 +- www.i2p2/pages/not_found.html | 5 - www.i2p2/pages/not_found_de.html | 5 - www.i2p2/pages/not_found_zh.html | 7 -- 10 files changed, 115 insertions(+), 41 deletions(-) rename www.i2p2/pages/status-2006-10-10.html => blog/2006/10/10/status.html (94%) create mode 100644 blog/2006/10/10/status.rst rename www.i2p2/pages/download.html => pages/downloads/list.html (99%) create mode 100644 pages/global/error_404.html rename {www.i2p2/pages => pages/site}/index.html (94%) delete mode 100644 www.i2p2/pages/not_found.html delete mode 100644 www.i2p2/pages/not_found_de.html delete mode 100644 www.i2p2/pages/not_found_zh.html diff --git a/app.py b/app.py index 5108529b..866b6308 100644 --- a/app.py +++ b/app.py @@ -1,5 +1,6 @@ from jinja2 import Environment, FileSystemLoader, environmentfilter from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, send_from_directory, safe_join +from docutils.core import publish_parts import os.path import os import fileinput @@ -9,6 +10,7 @@ import codecs TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'pages') STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static') +BLOG_DIR = os.path.join(os.path.dirname(__file__), 'blog') MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings') app = application = Flask(__name__, template_folder=TEMPLATE_DIR, static_url_path='/_static', static_folder=STATIC_DIR) @@ -29,11 +31,6 @@ def after_this_request(f): @app.template_filter('restructuredtext') def restructuredtext(value): - try: - from docutils.core import publish_parts - except ImportError: - print u"Install docutils!!11" - raise parts = publish_parts(source=value, writer_name="html") return parts['html_body'] @@ -44,6 +41,15 @@ def pull_lang(endpoint, values): return g.lang=values.pop('lang', None) +@app.url_defaults +def set_lang(endpoint, values): + if not values: + return + if 'lang' in values: + return + if hasattr(g, 'lang'): + values['lang'] = g.lang + @app.before_request def detect_theme(): theme = 'light' @@ -63,15 +69,30 @@ def detect_theme(): return resp +@app.errorhandler(404) +def page_not_found(error): + return render_template('global/error_404.html'), 404 + @app.route('/') def main_index(): return redirect(url_for('site_show', lang='en')) + + @app.route('//site/') @app.route('//site/') -def site_show(page=''): - # TODO: set content_type - pass +def site_show(page='index'): + if page.endswith('.html'): + return redirect(url_for('site_show', page=page[:-5])) + name = 'site/%s.html' % page + page_file = safe_join(TEMPLATE_DIR, name) + + # bah! those damn users all the time! + if not os.path.exists(page_file): + abort(404) + + # hah! + return render_template(name, page=page) @app.route('//meetings/') def meetings_index(): @@ -131,8 +152,8 @@ def meetings_show_rst(id): @app.route('//download') def downloads_list(): - # TODO: implement - pass + # TODO: read mirror list or list of available files + return render_template('downloads/list.html') @app.route('//download/') def downloads_select(file): @@ -145,6 +166,28 @@ def downloads_redirect(protocol, file, mirror=None): # TODO: implement pass + + +def render_blog_entry(slug): + """ + Render the blog entry + TODO: + - caching + - move to own file + """ + # check if that file actually exists + path = safe_join(BLOG_DIR, slug + ".rst") + if not os.path.exists(path): + abort(404) + + # read file + with codecs.open(path, encoding='utf-8') as fd: + content = fd.read() + + return publish_parts(source=content, source_path=BLOG_DIR, writer_name="html") + + + @app.route('//blog/') @app.route('//blog/page/') def blog_index(page=0): @@ -153,8 +196,15 @@ def blog_index(page=0): @app.route('//blog/entry/') def blog_entry(slug): - # TODO: implement - pass + # try to render that blog entry.. throws 404 if it does not exist + parts = render_blog_entry(slug) + + if parts: + # now just pass to simple template file and we are done + return render_template('blog/entry.html', parts=parts, title=parts['title'], body=parts['fragment']) + else: + abort(404) + @app.route('/feed/blog/rss') def blog_rss(): @@ -181,8 +231,24 @@ def legacy_meeting(id): def legacy_status(year, month, day): return redirect(url_for('blog_entry', lang='en', slug=('%s/%s/%s/status' % (year, month, day)))) +LEGACY_MAP={ + 'download': 'downloads_list' +} +@app.route('/_') +@app.route('/_.html') @app.route('/') +@app.route('/.html') def legacy_show(f): - # TODO: redirect to correct new url - pass + lang = 'en' + if hasattr(g, 'lang') and g.lang: + lang = g.lang + if f in LEGACY_MAP: + return redirect(url_for(LEGACY_MAP[f], lang=lang)) + else: + return redirect(url_for('site_show', lang=lang, page=f)) + + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/www.i2p2/pages/status-2006-10-10.html b/blog/2006/10/10/status.html similarity index 94% rename from www.i2p2/pages/status-2006-10-10.html rename to blog/2006/10/10/status.html index 6578b642..a3c787e3 100644 --- a/www.i2p2/pages/status-2006-10-10.html +++ b/blog/2006/10/10/status.html @@ -1,7 +1,5 @@ -{% extends "_layout.html" %} -{% block title %}I2P Status Notes for 2006-10-10{% endblock %} -{% block content %}

I2P Status Notes for 2006-10-10

-
-----BEGIN PGP SIGNED MESSAGE-----
+
+-----BEGIN PGP SIGNED MESSAGE-----
 Hash: SHA1
 
 Hi y'all, brief status notes this week
@@ -79,7 +77,4 @@ iD8DBQFFK6hgzgi8JTPcjUkRAuG2AJ46vK/13GIEngzQe05KRuEP2ZYvRQCeJB3j
 VmEzybBbtZSpSrFcU4qdvks=
 =QlDy
 -----END PGP SIGNATURE-----
-
-
 
-{% endblock %} diff --git a/blog/2006/10/10/status.rst b/blog/2006/10/10/status.rst new file mode 100644 index 00000000..b77847b7 --- /dev/null +++ b/blog/2006/10/10/status.rst @@ -0,0 +1,6 @@ +=============================== +I2P STATUS NOTES FOR 2006-10-10 +=============================== + +.. raw:: html + :file: blog/2006/10/10/status.html diff --git a/www.i2p2/pages/download.html b/pages/downloads/list.html similarity index 99% rename from www.i2p2/pages/download.html rename to pages/downloads/list.html index 7f5f9201..f7e5667f 100644 --- a/www.i2p2/pages/download.html +++ b/pages/downloads/list.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}Download{% endblock %} {% block content %}

Download I2P

diff --git a/pages/global/error_404.html b/pages/global/error_404.html new file mode 100644 index 00000000..d8563c03 --- /dev/null +++ b/pages/global/error_404.html @@ -0,0 +1,21 @@ +{% extends "global/layout.html" %} +{% block title -%} +{% if g.lang == 'de' %} +Nicht gefunden +{% elif g.lang == 'zh' %} +未找到 +{% else %} +Not found +{% endif %} +{%- endblock %} + +{% block content %} +{% if g.lang == 'de' %} +Yep... die Information nach der du suchst, nennt sich anders, existiert nicht oder wurde entfernt. +{% elif g.lang == 'zh' %} +您搜索的页面或资源的名称不正确或不存在或已被删除。 +{% else %} +Yep... the resource, you were searching for, is named differently, doesn't exist or was removed. +{% endif %} + +{% endblock %} diff --git a/pages/global/urlify b/pages/global/urlify index 59ffe02c..e8c9cd78 100644 --- a/pages/global/urlify +++ b/pages/global/urlify @@ -1,7 +1,9 @@ {% macro urlify(url, title, suffix) %} + {% autoescape false %} {% if static %} {{title}} {% else %} {{title}} {% endif %} + {% endautoescape %} {% endmacro %} \ No newline at end of file diff --git a/www.i2p2/pages/index.html b/pages/site/index.html similarity index 94% rename from www.i2p2/pages/index.html rename to pages/site/index.html index 4c6debbf..c3df28ee 100644 --- a/www.i2p2/pages/index.html +++ b/pages/site/index.html @@ -1,10 +1,11 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} +{% from "global/urlify" import urlify as urlify %} {% block title %}I2P Anonymous Network{% endblock %} {% block content %} - + diff --git a/www.i2p2/pages/bounty_syndie2012.html b/i2p2www/pages/site/volunteer/bounties/syndie2012.html similarity index 96% rename from www.i2p2/pages/bounty_syndie2012.html rename to i2p2www/pages/site/volunteer/bounties/syndie2012.html index c9e0e807..5c3f0980 100644 --- a/www.i2p2/pages/bounty_syndie2012.html +++ b/i2p2www/pages/site/volunteer/bounties/syndie2012.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}Syndie development{% endblock %} {% block content %} diff --git a/www.i2p2/pages/bounty_syndie2012_de.html b/www.i2p2/pages/translations/bounty_syndie2012_de.html similarity index 100% rename from www.i2p2/pages/bounty_syndie2012_de.html rename to www.i2p2/pages/translations/bounty_syndie2012_de.html From 8b608ea750cefc13672bf5c4ec7e41518769a86c Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 14 Dec 2012 05:18:40 +0000 Subject: [PATCH 157/317] Prepare meetings_index() for pagination --- i2p2www/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 82dac44f..517844f6 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -265,7 +265,8 @@ def render_meeting_rst(id): # Meeting index @app.route('//meetings/') -def meetings_index(): +@app.route('//meetings/page/') +def meetings_index(page=0): meetings = get_meetings() return render_template('meetings/index.html', meetings=meetings) From 3f19792df777cce555236a299b0796d68e163e0a Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 14 Dec 2012 05:27:03 +0000 Subject: [PATCH 158/317] Use Werkzeug route level defaults to ensure unique urls --- i2p2www/__init__.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 517844f6..74f924fb 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -165,9 +165,9 @@ def main_index(): return redirect(url_for('site_show', lang='en')) # Site pages -@app.route('//site/') +@app.route('//site/', defaults={'page': 'index'}) @app.route('//site/') -def site_show(page='index'): +def site_show(page): if page.endswith('.html'): return redirect(url_for('site_show', page=page[:-5])) name = 'site/%s.html' % page @@ -264,9 +264,9 @@ def render_meeting_rst(id): # Meeting handlers # Meeting index -@app.route('//meetings/') +@app.route('//meetings/', defaults={'page': 1}) @app.route('//meetings/page/') -def meetings_index(page=0): +def meetings_index(page): meetings = get_meetings() return render_template('meetings/index.html', meetings=meetings) @@ -384,9 +384,9 @@ def downloads_select(file): obj.append(a) return render_template('downloads/select.html', mirrors=obj, file=file) -@app.route('/download//any/') +@app.route('/download//any/', defaults={'mirror': None}) @app.route('/download///') -def downloads_redirect(protocol, file, mirror=None): +def downloads_redirect(protocol, file, mirror): mirrors=read_mirrors() if not protocol in mirrors: abort(404) @@ -473,9 +473,9 @@ def render_blog_entry(slug): ############### # Blog handlers -@app.route('//blog/') +@app.route('//blog/', defaults={'page': 1}) @app.route('//blog/page/') -def blog_index(page=0): +def blog_index(page): entries = get_blog_entries() return render_template('blog/index.html', entries=entries) From fe76f20f0c4cdd880ca82aa868bb76d43500c237 Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 14 Dec 2012 06:26:21 +0000 Subject: [PATCH 159/317] Implemented pagination for meetings and blog entries --- i2p2www/__init__.py | 41 +++++++++++++++++++++++++------ i2p2www/helpers.py | 32 ++++++++++++++++++++++++ i2p2www/pages/blog/index.html | 2 ++ i2p2www/pages/global/macros | 26 ++++++++++++++++++++ i2p2www/pages/meetings/index.html | 2 ++ 5 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 i2p2www/helpers.py diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 74f924fb..c8d98b11 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -14,6 +14,7 @@ try: except ImportError: import simplejson as json +from helpers import Pagination TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'pages') STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static') @@ -21,6 +22,9 @@ STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static') BLOG_DIR = os.path.join(os.path.dirname(__file__), 'blog') MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings') +BLOG_ENTRIES_PER_PAGE = 20 +MEETINGS_PER_PAGE = 20 + MIRRORS_FILE = os.path.join(TEMPLATE_DIR, 'downloads/mirrors') app = application = Flask('i2p2www', template_folder=TEMPLATE_DIR, static_url_path='/_static', static_folder=STATIC_DIR) @@ -141,7 +145,15 @@ def utility_processor(): except KeyError: # The I2P site has no known clearnet address, so use an inproxy return value + '.to' - return dict(i2pconv=convert_url_to_clearnet) + + # Convert a paginated URL to that of another page + def url_for_other_page(page): + args = request.view_args.copy() + args['page'] = page + return url_for(request.endpoint, **args) + + return dict(i2pconv=convert_url_to_clearnet, + url_for_other_page=url_for_other_page) ################ @@ -156,6 +168,15 @@ def server_error(error): return render_template('global/error_500.html'), 500 +######################## +# General helper methods + +def get_for_page(items, page, per_page): + from_item = (page-1)*per_page + to_item = page*per_page + return items[from_item:to_item] + + ####################### # General page handlers @@ -267,9 +288,12 @@ def render_meeting_rst(id): @app.route('//meetings/', defaults={'page': 1}) @app.route('//meetings/page/') def meetings_index(page): - meetings = get_meetings() - - return render_template('meetings/index.html', meetings=meetings) + all_meetings = get_meetings() + meetings = get_for_page(all_meetings, page, MEETINGS_PER_PAGE) + if not meetings and page != 1: + abort(404) + pagination = Pagination(page, MEETINGS_PER_PAGE, len(all_meetings)) + return render_template('meetings/index.html', pagination=pagination, meetings=meetings) # Renderer for specific meetings @app.route('//meetings/') @@ -476,9 +500,12 @@ def render_blog_entry(slug): @app.route('//blog/', defaults={'page': 1}) @app.route('//blog/page/') def blog_index(page): - entries = get_blog_entries() - - return render_template('blog/index.html', entries=entries) + all_entries = get_blog_entries() + entries = get_for_page(all_entries, page, BLOG_ENTRIES_PER_PAGE) + if not entries and page != 1: + abort(404) + pagination = Pagination(page, BLOG_ENTRIES_PER_PAGE, len(all_entries)) + return render_template('blog/index.html', pagination=pagination, entries=entries) @app.route('//blog/entry/') def blog_entry(slug): diff --git a/i2p2www/helpers.py b/i2p2www/helpers.py new file mode 100644 index 00000000..bbd8a656 --- /dev/null +++ b/i2p2www/helpers.py @@ -0,0 +1,32 @@ +from math import ceil + +class Pagination(object): + def __init__(self, page, per_page, total_count): + self.page = page + self.per_page = per_page + self.total_count = total_count + + @property + def pages(self): + return int(ceil(self.total_count / float(self.per_page))) + + @property + def has_prev(self): + return self.page > 1 + + @property + def has_next(self): + return self.page < self.pages + + def iter_pages(self, left_edge=2, left_current=2, + right_current=5, right_edge=2): + last = 0 + for num in xrange(1, self.pages + 1): + if num <= left_edge or \ + (num > self.page - left_current - 1 and \ + num < self.page + right_current) or \ + num > self.pages - right_edge: + if last + 1 != num: + yield None + yield num + last = num diff --git a/i2p2www/pages/blog/index.html b/i2p2www/pages/blog/index.html index 2b8d7d05..06e99752 100644 --- a/i2p2www/pages/blog/index.html +++ b/i2p2www/pages/blog/index.html @@ -10,4 +10,6 @@
  • {{ entry[1] }} - {{ entry[2] }}
  • {%- endfor %} +{%- from "global/macros" import render_pagination with context -%} +{{ render_pagination(pagination) | safe }} {% endblock %} diff --git a/i2p2www/pages/global/macros b/i2p2www/pages/global/macros index 8fd460a6..a1470155 100644 --- a/i2p2www/pages/global/macros +++ b/i2p2www/pages/global/macros @@ -3,6 +3,7 @@ {%- else -%}{{ url_for('site_show', lang=g.lang) }} {%- endif -%} {%- endmacro -%} + {%- macro change_lang(lang) -%} {%- if request.endpoint == 'site_show' -%}{{ url_for('site_show', lang=lang, page=page) }} {%- elif request.endpoint == 'blog_entry' -%}{{ url_for('blog_entry', lang=lang, slug=slug) }} @@ -12,8 +13,33 @@ {%- else -%}{{ url_for('site_show', lang=lang) }} {%- endif -%} {%- endmacro -%} + {%- macro ver(string=None) -%} {%- if string -%}{{ string % '0.9.3' }} {%- else -%}{{ '0.9.3' }} {%- endif -%} {%- endmacro -%} + +{%- macro render_pagination(pagination) %} + +{%- endmacro -%} diff --git a/i2p2www/pages/meetings/index.html b/i2p2www/pages/meetings/index.html index 0046b71b..8ca96792 100644 --- a/i2p2www/pages/meetings/index.html +++ b/i2p2www/pages/meetings/index.html @@ -15,4 +15,6 @@
  • Meeting {{ meeting['id'] }}{% if meeting['date'] %} - {{ meeting['date'].strftime("%B %d, %Y") }}{% endif %}
  • {%- endfor %} +{%- from "global/macros" import render_pagination with context -%} +{{ render_pagination(pagination) | safe }} {% endblock %} From 3284f92ae34866087f4579b93f9c1965ad2656db Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 14 Dec 2012 07:56:28 +0000 Subject: [PATCH 160/317] New heading for middle column of front page --- i2p2www/pages/site/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i2p2www/pages/site/index.html b/i2p2www/pages/site/index.html index 7f51efdc..0888c0ee 100644 --- a/i2p2www/pages/site/index.html +++ b/i2p2www/pages/site/index.html @@ -19,7 +19,7 @@
    -

    {{ _('Supported Software') }}

    +

    {{ _('What can you do with I2P?') }}

    • Email Integrated web mail interface, plugin for serverless email. From d129c789671cadee7776ea2f8176683097db5af0 Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 14 Dec 2012 08:00:02 +0000 Subject: [PATCH 161/317] "anonymously on I2P." -> "anonymously inside I2P." --- i2p2www/pages/site/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i2p2www/pages/site/index.html b/i2p2www/pages/site/index.html index 0888c0ee..3c1fd9f5 100644 --- a/i2p2www/pages/site/index.html +++ b/i2p2www/pages/site/index.html @@ -3,7 +3,7 @@ {% block content_outer %}

      {% trans %}What does I2P do for you?{% endtrans %}

      -

      {% trans %}The I2P network provides strong privacy protections for communication over the Internet. Many activities that would risk your privacy on the public Internet can be conducted anonymously on I2P.{% endtrans %}

      +

      {% trans %}The I2P network provides strong privacy protections for communication over the Internet. Many activities that would risk your privacy on the public Internet can be conducted anonymously inside I2P.{% endtrans %}

      {% trans version=ver() %}Get I2P {{ version }}{% endtrans %}
      From 2bc59701cb33d333e6b248eecb494e890787481f Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 14 Dec 2012 21:39:59 +0000 Subject: [PATCH 162/317] Added missing lu flag --- i2p2www/static/images/lu.png | Bin 0 -> 481 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 i2p2www/static/images/lu.png diff --git a/i2p2www/static/images/lu.png b/i2p2www/static/images/lu.png new file mode 100644 index 0000000000000000000000000000000000000000..4cabba98ae70837922beadc41453b5f848f03854 GIT binary patch literal 481 zcmV<70UrK|P)?-#?r-wgj45C|ZESQtLMVW?~Zs{a4) zALIXj41fOq2a1uNeOQW%&E= z|DQh$fB%40fEE4z10q3;-;ClCKpOx8h=su~@}N>;ErcnO|V^hXG82+5i4Q+5aFU0|N&GK!5=N X;lz1sunOP500000NkvXXu0mjf*7env literal 0 HcmV?d00001 From cd5adeb8593cb1929cac1634d1b709d80d122b32 Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 14 Dec 2012 21:47:01 +0000 Subject: [PATCH 163/317] Reorganized flags and removed duplicates --- i2p2www/pages/downloads/select.html | 2 +- i2p2www/pages/global/lang.html | 24 +++++++++++------------ i2p2www/static/images/cz.png | Bin 476 -> 0 bytes i2p2www/static/images/{ => flags}/ar.png | Bin i2p2www/static/images/{ => flags}/cs.png | Bin i2p2www/static/images/{ => flags}/de.png | Bin i2p2www/static/images/{ => flags}/el.png | Bin i2p2www/static/images/{ => flags}/es.png | Bin i2p2www/static/images/{ => flags}/eu.png | Bin i2p2www/static/images/{ => flags}/fr.png | Bin i2p2www/static/images/{ => flags}/it.png | Bin i2p2www/static/images/{ => flags}/lu.png | Bin i2p2www/static/images/{ => flags}/nl.png | Bin i2p2www/static/images/{ => flags}/ru.png | Bin i2p2www/static/images/{ => flags}/sv.png | Bin i2p2www/static/images/{ => flags}/us.png | Bin i2p2www/static/images/{ => flags}/zh.png | Bin i2p2www/static/images/lang_ar.png | Bin 228 -> 0 bytes 18 files changed, 13 insertions(+), 13 deletions(-) delete mode 100644 i2p2www/static/images/cz.png rename i2p2www/static/images/{ => flags}/ar.png (100%) rename i2p2www/static/images/{ => flags}/cs.png (100%) rename i2p2www/static/images/{ => flags}/de.png (100%) rename i2p2www/static/images/{ => flags}/el.png (100%) rename i2p2www/static/images/{ => flags}/es.png (100%) rename i2p2www/static/images/{ => flags}/eu.png (100%) rename i2p2www/static/images/{ => flags}/fr.png (100%) rename i2p2www/static/images/{ => flags}/it.png (100%) rename i2p2www/static/images/{ => flags}/lu.png (100%) rename i2p2www/static/images/{ => flags}/nl.png (100%) rename i2p2www/static/images/{ => flags}/ru.png (100%) rename i2p2www/static/images/{ => flags}/sv.png (100%) rename i2p2www/static/images/{ => flags}/us.png (100%) rename i2p2www/static/images/{ => flags}/zh.png (100%) delete mode 100644 i2p2www/static/images/lang_ar.png diff --git a/i2p2www/pages/downloads/select.html b/i2p2www/pages/downloads/select.html index 3eaf46a9..2745a2b2 100644 --- a/i2p2www/pages/downloads/select.html +++ b/i2p2www/pages/downloads/select.html @@ -9,7 +9,7 @@
      diff --git a/i2p2www/pages/global/lang.html b/i2p2www/pages/global/lang.html index 1a930207..8e3d6572 100644 --- a/i2p2www/pages/global/lang.html +++ b/i2p2www/pages/global/lang.html @@ -1,14 +1,14 @@
        -
      • English
      • -
      • Castellano
      • -
      • Chinese
      • -
      • Deutsch
      • -
      • Français
      • -
      • Italiano
      • -
      • Nederlands
      • -
      • Russian
      • -
      • Svenska
      • -
      • Czech
      • -
      • Arabic
      • -
      • Greek
      • +
      • English
      • +
      • Castellano
      • +
      • Chinese
      • +
      • Deutsch
      • +
      • Français
      • +
      • Italiano
      • +
      • Nederlands
      • +
      • Russian
      • +
      • Svenska
      • +
      • Czech
      • +
      • Arabic
      • +
      • Greek
      diff --git a/i2p2www/static/images/cz.png b/i2p2www/static/images/cz.png deleted file mode 100644 index c8403dd21fd15f46d501a766a7a97733462f3b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476 zcmV<20VDp2P)? z0048MLcfb{@Lpld*gfdL?Z zSQvhRtN^J#x6%GQNHxSfxHgc;AD{-1tAIKH0tl!9q}uD*5!1Kl8Kk6va!f$;fJ%WL z`2Cv^NdEc54D$xi27mx!VfgXqT8ME7!~2)OPy-`SXu#NiAkhzFFflLy1Q-A_8F>@M S6G{sJ00004#3RcVi4%-E25xf8IheWCU;o|NGe2%p zDuXgJv$GiU{zvZ7l1EK%#kfcxXgQOZl8~Tb`)j7-pVRT5cz&Edav Date: Fri, 14 Dec 2012 21:51:45 +0000 Subject: [PATCH 164/317] Fixed custom theme loader --- i2p2www/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index c8d98b11..e512eb75 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -89,7 +89,7 @@ def detect_theme(): theme = request.cookies['style'] if 'theme' in request.args.keys(): theme = request.args['theme'] - if not os.path.isfile(safe_join('static/styles', '%s.css' % theme)): + if not os.path.isfile(safe_join(safe_join(STATIC_DIR, 'styles'), '%s.css' % theme)): theme = 'duck' g.theme = theme @after_this_request From 96df3373452da1e5716e4401be2bd0eee44f60cb Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 14 Dec 2012 22:00:12 +0000 Subject: [PATCH 165/317] Tweak to (unused in default theme) mainmenu.css to detect the menu --- i2p2www/static/styles/mainmenu.css | 64 +++++++++++++++--------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/i2p2www/static/styles/mainmenu.css b/i2p2www/static/styles/mainmenu.css index 9d410985..ea350e57 100644 --- a/i2p2www/static/styles/mainmenu.css +++ b/i2p2www/static/styles/mainmenu.css @@ -16,7 +16,7 @@ /*========================= TOP OF THE MENU CASCADE =========================*/ -.menu { +#cssmenu { position:relative; /* establish a menu-relative positioning context */ float:left; /* play nicely with others */ margin:0; @@ -25,17 +25,17 @@ height:24px; /* the menu's overall height */ } -.menu img { +#cssmenu img { vertical-align: top; /* prevent images from being pushed down by text */ } -.menu ul { +#cssmenu ul { margin:0; list-style-type:none; /* we don't want to view the list as a list */ line-height:1.5em; /* globally set the menu's item spacing. note */ } /* this must be 1.0 or 1.5 or 2.0 for Mozilla */ -.menu li { +#cssmenu li { float:left; /* this creates the side-by-side array of top-level buttons */ position:relative; /* create local positioning contexts for each button */ margin:0; @@ -62,13 +62,13 @@ /*======================== TOP LEVEL MENU DEFINITIONS ========================*/ -.menu ul li ul { +#cssmenu ul li ul { display:none; /* initially hide the entire list hierarchy */ padding:1px; /* this is our box border width */ } -.menu ul li a, -.menu ul li a:visited { /* unselected top-level menu items */ +#cssmenu ul li a, +#cssmenu ul li a:visited { /* unselected top-level menu items */ display:block; float:left; text-decoration:none; @@ -77,8 +77,8 @@ /*======================== 2ND LEVEL MENU DEFINITIONS ========================*/ -.menu ul li:hover ul, -.menu ul li a:hover ul { /* 2nd level drop-down box */ +#cssmenu ul li:hover ul, +#cssmenu ul li a:hover ul { /* 2nd level drop-down box */ display:block; position:absolute; margin:0; @@ -90,29 +90,29 @@ background:black; /* this sets our menu's effective "border" color */ } -.menu ul li:hover ul.leftbutton, -.menu ul li a:hover ul.leftbutton {/* our first dropdown should not be skewed */ +#cssmenu ul li:hover ul.leftbutton, +#cssmenu ul li a:hover ul.leftbutton {/* our first dropdown should not be skewed */ left:0px; } -.menu ul li:hover ul.skinny, -.menu ul li a:hover ul.skinny { /* 2nd level skinny drop-down box */ +#cssmenu ul li:hover ul.skinny, +#cssmenu ul li a:hover ul.skinny { /* 2nd level skinny drop-down box */ width:8.08333em; /* with a 12px default font, this is 97px width (97/12) */ } -.menu ul.rightmenu li:hover ul, -.menu ul.rightmenu li a:hover ul { /* 2nd level neighborhood drop-down box */ +#cssmenu ul.rightmenu li:hover ul, +#cssmenu ul.rightmenu li a:hover ul { /* 2nd level neighborhood drop-down box */ left:auto; right:0; /* nudge the right menu right to line up under the border */ width:400px; /* with a 12px default font, this is 228px width (228/12) */ } -* html .menu ul.rightmenu li a:hover ul { /* IE5/6 needs a tweak here */ +* html #cssmenu ul.rightmenu li a:hover ul { /* IE5/6 needs a tweak here */ right:-1px; } -.menu ul li:hover ul li a, -.menu ul li a:hover ul li a { /* 2nd level unselected items */ +#cssmenu ul li:hover ul li a, +#cssmenu ul li a:hover ul li a { /* 2nd level unselected items */ border:0; margin:0; padding:0; @@ -122,28 +122,28 @@ width:13.5em; } -.menu ul li:hover ul li:hover a, -.menu ul li a:hover ul li a:hover { /* 2nd level selected item */ +#cssmenu ul li:hover ul li:hover a, +#cssmenu ul li a:hover ul li a:hover { /* 2nd level selected item */ color:black; background:white; } -.menu ul li:hover ul.skinny li a, -.menu ul li a:hover ul.skinny li a, -.menu ul li:hover ul.skinny li a:hover, -.menu ul li a:hover ul.skinny li a:hover { /* 2nd level un+selected items */ +#cssmenu ul li:hover ul.skinny li a, +#cssmenu ul li a:hover ul.skinny li a, +#cssmenu ul li:hover ul.skinny li a:hover, +#cssmenu ul li a:hover ul.skinny li a:hover { /* 2nd level un+selected items */ width:8.08333em; } /*======================== 3RD LEVEL MENU DEFINITIONS ========================*/ -.menu ul li:hover ul li ul, -.menu ul li a:hover ul li a ul { /* hide inactive 3rd-level menus */ +#cssmenu ul li:hover ul li ul, +#cssmenu ul li a:hover ul li a ul { /* hide inactive 3rd-level menus */ visibility:hidden; } -.menu ul li:hover ul li:hover ul, -.menu ul li a:hover ul li a:hover ul { /* 3rd level drop-down box */ +#cssmenu ul li:hover ul li:hover ul, +#cssmenu ul li a:hover ul li a:hover ul { /* 3rd level drop-down box */ visibility:visible; position:absolute; margin-top:-1px; /* bring the top edge of the 3rd level menu up one */ @@ -152,14 +152,14 @@ width:14em; } -.menu ul li:hover ul li:hover ul li a, -.menu ul li a:hover ul li a:hover ul li a { /* 3rd level unselected items */ +#cssmenu ul li:hover ul li:hover ul li a, +#cssmenu ul li a:hover ul li a:hover ul li a { /* 3rd level unselected items */ width:14em; background:#d8d8d8; } -.menu ul li:hover ul li:hover ul li a:hover, -.menu ul li a:hover ul li a:hover ul li a:hover { /* level3 selected items */ +#cssmenu ul li:hover ul li:hover ul li a:hover, +#cssmenu ul li a:hover ul li a:hover ul li a:hover { /* level3 selected items */ width:14em; background:white; } From 963cc90c6a75b9fb7185f75d58029d2567639b87 Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 01:35:48 +0000 Subject: [PATCH 166/317] ".main" -> "#content", ".menu" -> "#cssmenu" in dark.css --- i2p2www/static/styles/dark.css | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/i2p2www/static/styles/dark.css b/i2p2www/static/styles/dark.css index 0b86749a..9466250d 100644 --- a/i2p2www/static/styles/dark.css +++ b/i2p2www/static/styles/dark.css @@ -38,7 +38,7 @@ div.logo { font-color: #fff; } -div.menu { +div#cssmenu { /* width: 8em; */ /* height: 5em; */ /* position: fixed; */ @@ -63,7 +63,7 @@ div.menu { } /* -div.menu a:link { +div#cssmenu a:link { border:1px solid #000022; border-left: 3px solid #000022; margin: 10px 0; @@ -76,13 +76,13 @@ background-color: #9999ff; */ /* -div.menu a:link{color:#99f;margin: 15px 0;padding: 0px 5px 0px 10px; border-left: 5px solid #99f;line-height: 240%; text-decoration: none;} +div#cssmenu a:link{color:#99f;margin: 15px 0;padding: 0px 5px 0px 10px; border-left: 5px solid #99f;line-height: 240%; text-decoration: none;} */ -div.menu a:link{color:#99f;} -div.menu a:visited{color:#60f} -div.menu a:hover{color:#ff6600;} -/* div.menu a:hover{color:#ff6600;border-left: 5px solid #fff;}*/ -div.menu a:active{color:#900} +div#cssmenu a:link{color:#99f;} +div#cssmenu a:visited{color:#60f} +div#cssmenu a:hover{color:#ff6600;} +/* div#cssmenu a:hover{color:#ff6600;border-left: 5px solid #fff;}*/ +div#cssmenu a:active{color:#900} div.warning { margin: 0em 1em 1em 12em; @@ -93,7 +93,7 @@ div.warning { color: inherit; } -div.main { +div#content { margin: 0px 0px 0px 0px; padding: 25px 40px 20px 190px; background-color: #001; @@ -103,7 +103,7 @@ div.main { border-bottom: 1px solid #99f; } -div.main h1 { +div#content h1 { text-align: left; color: #99f; padding-left: 10px; @@ -437,4 +437,4 @@ td.announce { .targetlist { list-style-image: url(/_static/images/target.png); -} \ No newline at end of file +} From f76b8998668413e84f7285af2ea756d7698532ce Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 01:37:16 +0000 Subject: [PATCH 167/317] ".main" -> "#content", ".menu" -> "#cssmenu" in light.css --- i2p2www/static/styles/light.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/i2p2www/static/styles/light.css b/i2p2www/static/styles/light.css index d339a9c7..0c3bfec6 100644 --- a/i2p2www/static/styles/light.css +++ b/i2p2www/static/styles/light.css @@ -38,7 +38,7 @@ div.logo { font-color: #fff; } -div.menu { +div#cssmenu { /* width: 8em; */ /* height: 5em; */ /* position: fixed; */ @@ -63,7 +63,7 @@ div.menu { } /* -div.menu a:link { +div#cssmenu a:link { border:1px solid #000022; border-left: 3px solid #000022; margin: 10px 0; @@ -83,7 +83,7 @@ div.warning { color: inherit; } -div.main { +div#content { margin: 0px 0px 0px 0px; padding: 25px 40px 20px 190px; background-color: #eeeeff; @@ -93,7 +93,7 @@ div.main { border-bottom: 1px solid #000; } -div.main h1 { +div#content h1 { text-align: left; color: #000022; padding-left: 10px; From c42a4604f394962bd145c853cb4c0a04032edc85 Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 01:38:09 +0000 Subject: [PATCH 168/317] ".main" -> "#content", ".menu" -> "#cssmenu" in light_ar.css --- i2p2www/static/styles/light_ar.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/i2p2www/static/styles/light_ar.css b/i2p2www/static/styles/light_ar.css index 88cedcec..6298e8e3 100644 --- a/i2p2www/static/styles/light_ar.css +++ b/i2p2www/static/styles/light_ar.css @@ -38,7 +38,7 @@ div.logo { font-color: #fff; } -div.menu { +div#cssmenu { /* width: 8em; */ /* height: 5em; */ /* position: fixed; */ @@ -63,7 +63,7 @@ div.menu { } /* -div.menu a:link { +div#cssmenu a:link { border:1px solid #000022; border-left: 3px solid #000022; margin: 10px 0; @@ -83,7 +83,7 @@ div.warning { color: inherit; } -div.main { +div#content { margin: 0px 0px 0px 0px; padding: 30px 200px 20px 19px; background-color: #eeeeff; @@ -93,7 +93,7 @@ div.main { border-bottom: 1px solid #000; } -div.main h1 { +div#content h1 { text-align: right; color: #000022; padding-left: 10px; From cfbc0cdd48aae022ad85c33f29118b676899e106 Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 01:38:43 +0000 Subject: [PATCH 169/317] ".main" -> "#content", ".menu" -> "#cssmenu" in light_zh.css --- i2p2www/static/styles/light_zh.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/i2p2www/static/styles/light_zh.css b/i2p2www/static/styles/light_zh.css index 337ae867..cc8bc814 100644 --- a/i2p2www/static/styles/light_zh.css +++ b/i2p2www/static/styles/light_zh.css @@ -38,7 +38,7 @@ div.logo { font-color: #fff; } -div.menu { +div#cssmenu { width: 8em; /* height: 5em; */ /* position: fixed; */ @@ -64,7 +64,7 @@ div.menu { } /* -div.menu a:link { +div#cssmenu a:link { border:1px solid #000022; border-left: 3px solid #000022; margin: 10px 0; @@ -84,7 +84,7 @@ div.warning { color: inherit; } -div.main { +div#content { margin: 0px 0px 0px 0px; padding: 25px 40px 20px 190px; background-color: #eeeeff; @@ -95,7 +95,7 @@ div.main { line-height: 21px; } -div.main h1 { +div#content h1 { text-align: left; color: #000022; padding-left: 10px; From 05dfa49133f243f586ca53ac104f6cbf93b8b59c Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 01:55:37 +0000 Subject: [PATCH 170/317] Apply the h1 theming to div.title in old themes (like on current site) --- i2p2www/static/styles/dark.css | 2 +- i2p2www/static/styles/light.css | 2 +- i2p2www/static/styles/light_ar.css | 2 +- i2p2www/static/styles/light_zh.css | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/i2p2www/static/styles/dark.css b/i2p2www/static/styles/dark.css index 9466250d..3e429ea5 100644 --- a/i2p2www/static/styles/dark.css +++ b/i2p2www/static/styles/dark.css @@ -172,7 +172,7 @@ ul { text-indent: -4em; } -h1 { +h1, div.title { color: #9999ff; text-shadow: 0px 0px 2px rgba(255, 255, 255, 0.9); text-align: right; diff --git a/i2p2www/static/styles/light.css b/i2p2www/static/styles/light.css index 0c3bfec6..bce6d6eb 100644 --- a/i2p2www/static/styles/light.css +++ b/i2p2www/static/styles/light.css @@ -160,7 +160,7 @@ ul { text-indent: -4em; } -h1 { +h1, div.title { color: #9999ff; /* text-shadow: 0px 0px 2px rgba(255, 255, 255, 0.9); */ text-align: right; diff --git a/i2p2www/static/styles/light_ar.css b/i2p2www/static/styles/light_ar.css index 6298e8e3..00c5d3ea 100644 --- a/i2p2www/static/styles/light_ar.css +++ b/i2p2www/static/styles/light_ar.css @@ -160,7 +160,7 @@ ul { text-indent: -4em; } -h1 { +h1, div.title { color: #9999ff; /* text-shadow: 0px 0px 2px rgba(255, 255, 255, 0.9); */ text-align: right; diff --git a/i2p2www/static/styles/light_zh.css b/i2p2www/static/styles/light_zh.css index cc8bc814..e75fe817 100644 --- a/i2p2www/static/styles/light_zh.css +++ b/i2p2www/static/styles/light_zh.css @@ -163,7 +163,7 @@ ul { text-indent: -4em; } -h1 { +h1, div.title { color: #9999ff; font-family:"SimHei","黑体"; text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.9); From 046acf4b36f522751ba8d07d10990f84fe071f74 Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 11:14:41 +0000 Subject: [PATCH 171/317] Text change suggestions from zab --- i2p2www/pages/global/nav.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i2p2www/pages/global/nav.html b/i2p2www/pages/global/nav.html index b231cabc..da203c9f 100644 --- a/i2p2www/pages/global/nav.html +++ b/i2p2www/pages/global/nav.html @@ -95,10 +95,10 @@
    • {{ _('Plugins') }}
    -
  • {{ _('Support') }} +
  • {{ _('Help') }}
    • {{ _('FAQ') }}
    • -
    • {{ _('Web browser configuration') }}
    • +
    • {{ _('How to browse I2P') }}
    • {{ _('Glossary') }}
    • {{ _('Performance') }}
    • {{ _('Forums') }}
    • From df7a02df2b5c4352e6822d128d0fb84f0791b1f7 Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 11:27:07 +0000 Subject: [PATCH 172/317] Added support/performance page based on eche|on's i2pspeed.txt document --- .../pages/site/support/performance/index.html | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 i2p2www/pages/site/support/performance/index.html diff --git a/i2p2www/pages/site/support/performance/index.html b/i2p2www/pages/site/support/performance/index.html new file mode 100644 index 00000000..30b139f6 --- /dev/null +++ b/i2p2www/pages/site/support/performance/index.html @@ -0,0 +1,105 @@ +{% extends "global/layout.html" %} +{% block title %}Performance{% endblock %} +{% block content %} + +

      How does I2P work, why is it slow, and why does it not use my full bandwidth?

      + +

      Probably one of the most frequent things people ask is "how fast is I2P?", +and no one seems to like the answer - "it depends". After trying out I2P, the +next thing they ask is "will it get faster?", and the answer to that is a most +emphatic yes.

      + +

      +I2P is a full dynamic network. Each client is known to other nodes and tests local known nodes for reachability and capacity. +Only reachable and capable nodes are saved to a local NetDB (This is generally only a portion of the network, around 500-1000). +When I2P builds tunnels, it selects the best resource from this pool. For example, a small subset of 20-50 nodes are only available to build tunnels with. +Because testing happens every minute, the pool of used nodes changes every minute. +Each I2P node knows a different part of the net, meaning that each router has a different set of I2P nodes to be used for tunnels. +Even if two routers have the same subset of known nodes, the tests for reachability and capacity will likely show different results, as the other routers could be under load just as one router tests, but be free if the second router tests. +

      + +

      +The above describes why each I2P node has different nodes to build tunnels. +Because every I2P node has a different latency and bandwith, tunnels (which are built via those nodes) have different latency and bandwidth values. +And because every I2P node has different tunnels built, no two I2P nodes have the same tunnel sets. +

      + +

      +A server/client is known as a "destination" and each destination has at least one inbound and one outbound tunnel. The default is 3 hops per tunnel. +This adds up to 12 hops (aka 12 different I2P nodes) for a full roundtrip client-server-client. +

      + +

      +Each data package is sent through 6 other I2P nodes until it reaches the server: +

      +
      +client - hop1 - hop2 - hop3 - hopa1 - hopa2 - hopa3 - server
      +
      +

      +and on way back 6 different I2P nodes: +

      +
      +server - hopb1 - hopb2 - hopb3 - hopc1 - hopc2 - hopc3 - client
      +
      + +

      +As most traffic on I2P (www, torrent,...) needs ack packages until new data is sent, it needs to wait until a ack package returns from the server. +In the end: send data, wait for ack, send more data, wait for ack,.. +As the RTT (RoundTripTime) adds up from the latency of each individual I2P node and each connection on this roundtrip, it takes usually 1-3 seconds until a ack package comes back to the client. +With some internals of TCP and I2P transport, a data package has a limited size and cannot be as large as we want it to be. +Together these conditions set a limit of max bandwidth per tunnel of 20-50 kbyte/sec. +But if ONLY ONE hop in the tunnel has only 5 kb/sec bandwidth to spend, the whole tunnel is limited to 5 kb/sec, independent of the +latency and other limitations. +

      + +

      +Due to encryption used and other setups in I2P (howto built up tunnels, latency, ...) it is quite expensive in CPU time to build a tunnel. This is +why a destination is only allowed to have a max of 6 IN and 6 OUT tunnels to transport data. With a max of 50 kb/sec per tunnel, a destination could +use roughly 300 kb/sec traffic combined ( in reality it could be more if shorter tunnels are used with low or no anonymity available). +Used tunnels are discarded every 10 minutes and new ones are built up. +This change of tunnels (and sometimes clients that shutdown hard due to usage of "shut down at once" or situations where there is power loss) does +sometimes break tunnels and connections, as seen on the IRC2P Network in loss of connection (ping timeout) or on when using eepget. +

      + +

      +With a limited set of destinations and a limited set of tunnels per destination, one I2P node only uses a limited set of tunnels across other I2P nodes. +For example, if an I2P node is "hop1" in the small example above, we only see 1 participating tunnel originating from the client. +If we sum up the whole I2P network, only a rather limited number of participating tunnels could be built with a limited amount of bandwidth all together. +If one distributes these limited numbers across the number of I2P nodes, there is only a fraction of available bandwidth/capacity available for use. +

      + +

      +To remain anonymous one router should not be used by the whole network for building tunnels. +If one router does act as a tunnel router for ALL I2P nodes, it becomes a very real central point of failure as well as a central point to grab IPs and data from the clients. This is not good. +I2P attempts to spread the load across a lot of I2P nodes because of this reason. +

      + +

      +Another point is the full mesh network. Each connection hop-hop utilizes one TCP or UDP connection on the I2P nodes. With 1000 connections, one sees +1000 TCP connections. That is quite a lot and some home and small office routers (DSL, cable,..) only allow a small number of connections (or just go mad if you use more than X connections). +I2P tries to limit these connections to be under 1500 per UDP and per TCP type. +This limits the amount of traffic routed across your I2P node as well. +

      + +

      +In summary, I2P is very complex and there is no easy way to pinpoint why your node is not used. +If your node is reachable and has a bandwidth setting of >128 kbyte/sec shared and is reachable 24/7, it should be used after some time for participating traffic. +If it is down in between, the testing of your I2P node done by other nodes will tell them: you are not reachable. This blocks your node for at least +24h on other nodes. So, the other nodes which tested you as down will not use your node for 24h for building tunnels. This is why your traffic will +be lower after a restart/shutdown for a minimum of 24h. +

      + +

      +Also: other I2P nodes needs to know your I2P router to test it for reachability and capacity. It takes time for other nodes to get known to your node. +It will be faster if you use I2P and build more tunnels, e.g. use a torrent or www for some time. +

      + +

      Performance Improvements

      + +

      For possible future performance improvements see +Future Performance Improvements.

      + +

      For past performance improvements see the +Performance History.

      + +{% endblock %} From 0c837b7a05e3bfd2d35663b5eafca6f68811a171 Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 11:28:34 +0000 Subject: [PATCH 173/317] forum.i2p2.i2p is currently not clearnet-hosted --- i2p2www/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index e512eb75..279d3e72 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -128,7 +128,7 @@ def utility_processor(): # Convert an I2P url to an equivalent clearnet one i2ptoclear = { 'www.i2p2.i2p': 'www.i2p2.de', - 'forum.i2p': 'forum.i2p2.de', + #'forum.i2p': 'forum.i2p2.de', 'trac.i2p2.i2p': 'trac.i2p2.de', } def convert_url_to_clearnet(value): From cf40d5ded73e812946e76d3263b6a484fd51c472 Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 11:29:19 +0000 Subject: [PATCH 174/317] Moved bug tracker link into Volunteer -> Develop --- i2p2www/pages/global/nav.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i2p2www/pages/global/nav.html b/i2p2www/pages/global/nav.html index da203c9f..45016de5 100644 --- a/i2p2www/pages/global/nav.html +++ b/i2p2www/pages/global/nav.html @@ -102,7 +102,6 @@
    • {{ _('Glossary') }}
    • {{ _('Performance') }}
    • {{ _('Forums') }}
    • -
    • {{ _('Bug tracker') }}
  • {{ _('Volunteer') }} @@ -115,6 +114,7 @@
  • {{ _('Release signing keys') }}
  • {{ _('Signed keys') }}
  • {{ _('Developers keys') }}
  • +
  • {{ _('Bug tracker') }}
  • {{ _('Guides') }} From 65c2e96f9a5b08facef4fbe953eb30725e61a4b7 Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 11:42:41 +0000 Subject: [PATCH 175/317] Moved Docs menu into About menu --- i2p2www/pages/global/nav.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/i2p2www/pages/global/nav.html b/i2p2www/pages/global/nav.html index 45016de5..c4912aac 100644 --- a/i2p2www/pages/global/nav.html +++ b/i2p2www/pages/global/nav.html @@ -12,13 +12,7 @@
  • {{ _('About') }} -
  • -
  • {{ _('Docs') }} +
  • {{ _('Documentation') }} +
  • +
  • {{ _('Team') }}
  • +
  • {{ _('Hall of Fame') }}
  • +
  • {{ _('Papers and presentations') }}
  • +
  • {{ _('Contact us') }}
  • +
  • {{ _('Help') }}
      From 6ee28ea4292b29a88f5ea8c3e74e3965c55a471b Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 12:09:29 +0000 Subject: [PATCH 176/317] Added feed icon for blog to front page --- i2p2www/pages/site/index.html | 1 + i2p2www/static/images/feed-icon-28x28.png | Bin 0 -> 1737 bytes i2p2www/static/styles/duck.css | 10 ++++++++++ 3 files changed, 11 insertions(+) create mode 100644 i2p2www/static/images/feed-icon-28x28.png diff --git a/i2p2www/pages/site/index.html b/i2p2www/pages/site/index.html index 3c1fd9f5..daa5dfed 100644 --- a/i2p2www/pages/site/index.html +++ b/i2p2www/pages/site/index.html @@ -48,6 +48,7 @@
  • + I2P Blog ATOM Feed

    {% trans %}News & Updates{% endtrans %}

    {% include "blog/latest.html" %}
    diff --git a/i2p2www/static/images/feed-icon-28x28.png b/i2p2www/static/images/feed-icon-28x28.png new file mode 100644 index 0000000000000000000000000000000000000000..d64c669c7589d3a886682dbd1f3c83b716a420f5 GIT binary patch literal 1737 zcmV;)1~&PLP)sAF&N>2z!Fdr4Imm26om*2a>%jE0(;Kv%yf78|JB{oGfPNxX8x(_?yCCg`;V_$ zXsz+vi(@PROR2wt+9on+`tt9tz79KlSO2H>IyGO>#kRR$cU=`Hmyc#J&lVDyanqor z1tA1LcZEeQ^@U{`(^^*e%-kna7Wft+z>JVkoMv=$6&UWDkQ$<2lKHssGAf!lTvqVr4)B+FQFUkn06c#WX1OxA_5 z;;t4x27iQdkQg)F7+O{!f8h`chd+YqxfC)gbK_tz9fLAfFeIEn@r7e^t8mW`EtHtl zf~sX-Ks>w(zD$JfL<}?-ObbNSqyoSo8EhI@Me*$0_W}BkY=u=l5_at*Bqz>Bs-YQ{ zos4mvG?H^x!JY63{2$(dmAw(OgDBN4r@D?n>1$kSvMo%1n@ne~L*#Ej+@`@-enjuF z&(K|SKhjN0k!f56nXE1WtNKQG3pT>t|2pJAM+hc@!uQ#Vl>I(@D{D3pxKswlb>~tD zb^TOW4Rc`CjDzjiNDWa)=dPf5=zVl-eHJ}`?5*&!96k~1@ekpr?gI+6@IV)I-%YZ1 z=-v+aWGLp%CKUe#s$sz;wpp^;mX)Y(TnOzI;dNa_{>&cebNk>B1K00F_Tam4Z(qQO zd23_Pq2no`*2DW|3GJHdIgFd8T4NJhnrn;yjGBaL&ff6-AOJ$zP&E^gesm2|&uoXB zvj$EwiHzuj`}0P$f4kO{ObL|Si{@9rxo7|l7_S!?%oAqFYC^>-3Q9eduY7-u)FfIoCHc?ZV)@-|{<8PO#m0!q@K`h=j&~-o;Qk3aNwz=j=|n zt*@f@(}n2RJRjZ1wpX$pMoIGICP*h?K<~6}fS2ozSx$Zo7}Z$8j=^Jwto#h>^+V-5 z;CNj~*)B4qf2rJg3h)YcC8lmRCX=+ze4R)W{Rjv-OrYtP6i`tkW#ZBZo zAquzQ)1pNRc%A~zt)gVgBrSNqe~I>8uMwtO7Oxi|M?C$Fs^Ts74UpfJM^h3sV?wMW0WJehh2{~g4ogxB$XB+z3 zj>dqsQ-JDmG0PG|RvIr$F{C4kCg$jP$}HFbr*4{YjY!qNUc40!F-=kycOU+QnB?Mx z8|Kk4n-6^So&Tjm@IeU{f$7jOq0(5vX+iOD$&HEn>6Ln&9A*v|n??7|MdU7@C{vjR z$f_|A5hO^O4ut*#ZxgtJGkT`cL-*i%v!F$w>{{>2ab(X< zB7{67ze4nP(?WE=r;}pbYUptK=i7b_Vo0DObgB4h*)ZMw#4Moef;n1P)m$$SapFyk zgn28|VG$Q8#!==OS!68?6Qk&A<31f;^D`aBP}NOF+u83;43FmqXr@XA^@G5zL#R|Z z-6OEbB$o=0VUJMXVpoM`Q5^X>w^j&dHb$?C`9O1za}2k1oIVYauA>==_^=F>L6=L^ zy)3G=Vq5~I&uoz(IUI+sizYAj3Qn3MPY>NxTc2EAJ9P$ Date: Sat, 15 Dec 2012 12:49:03 +0000 Subject: [PATCH 177/317] Updated internal links in downloads/* --- i2p2www/pages/downloads/debian.html | 6 +++--- i2p2www/pages/downloads/list.html | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/i2p2www/pages/downloads/debian.html b/i2p2www/pages/downloads/debian.html index e4c3d56c..2ab9f960 100644 --- a/i2p2www/pages/downloads/debian.html +++ b/i2p2www/pages/downloads/debian.html @@ -15,7 +15,7 @@ have been tested and should work on x86
  • gNewSense 2.3
  • Nexenta 3.0.1
  • -The I2P packages may work on systems not listed above. Please report any issues with these packages on Trac at http://trac.i2p2.de. +The I2P packages may work on systems not listed above. Please report any issues with these packages on Trac at http://{{ i2pconv('trac.i2p2.i2p') }}.
    • Option 1: Recent versions of Ubuntu and its derivatives (Try this if you're not using Debian)
    • Option 2: Debian (including systems based on Debian and older versions of Ubuntu)
    • @@ -55,7 +55,7 @@ user to root with "su" or by prefixing each command with "sudo").
    • Add the GPG key that signs the repository with the following command:
          apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EB2CC88B
      You'll have output like the following if the command was successful:
      -    
    • +    
    • For Debian Oldstable (Lenny) and Stable (Squeeze): Add the following entries to /etc/apt/sources.list.d/i2p.list
          deb http://ppa.launchpad.net/i2p-maintainers/i2p/ubuntu natty main
          deb-src http://ppa.launchpad.net/i2p-maintainers/i2p/ubuntu natty main

      @@ -109,5 +109,5 @@ you may portforward.com to be helpful. as the default settings of 96 KB/s down / 40 KB/s up are fairly conservative.

      -If you want to reach eepsites via your browser, have a look on the browser proxy setup page for an easy howto.

      +If you want to reach eepsites via your browser, have a look on the browser proxy setup page for an easy howto.

      {% endblock %} diff --git a/i2p2www/pages/downloads/list.html b/i2p2www/pages/downloads/list.html index d5fb82d3..b873d5b2 100644 --- a/i2p2www/pages/downloads/list.html +++ b/i2p2www/pages/downloads/list.html @@ -44,7 +44,7 @@ or type java -version at your command prompt. (SHA256 39a7d6859bf4bd9ac56fd83a5e32d47d1b24ba06f912a027804492ca941936dd sig)
      - Alternately, you can fetch the source from monotone. + Alternately, you can fetch the source from monotone.
      Run (tar xjvf i2psource_{{ ver() }}.tar.bz2 ; cd i2p-{{ ver() }} ; ant pkg) then either run the GUI installer or headless install as above
    • @@ -71,7 +71,7 @@ start the router with "sh runplain.sh" instead.

      When installing for the first time, please remember to adjust your NAT/firewall if you can, bearing in mind the Internet-facing ports I2P uses, -described here among other ports. +described here among other ports. If you have successfully opened your port to inbound TCP, also enable inbound TCP on the configuration page.

      @@ -82,7 +82,7 @@ as the default settings of 96 KBps down / 40 KBps up are fairly slow.

      -If you want to reach eepsites via your browser, have a look on the browser proxy setup page for an easy howto. +If you want to reach eepsites via your browser, have a look on the browser proxy setup page for an easy howto.

      Updates from earlier releases:

      @@ -99,7 +99,7 @@ may get a "downloaded version is not greater than current version" error, and should use the manual update method below.

      If you are running 0.7.4 or earlier, please see -the 0.7.5 release notes +the 0.7.5 release notes for important information about how to configure your router to automatically receive the release.

      @@ -132,12 +132,12 @@ receive the release. The file is signed by zzz, -whose key is here. +whose key is here.

      Previous Releases

      Previous releases are available on Google Code and Launchpad -and within the I2P network on echelon.i2p. +and within the I2P network on {{ i2pconv('echelon.i2p') }}. {% endblock %} From 885d8fc2a45c1193b846088fd436ff5002903eac Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 12:54:30 +0000 Subject: [PATCH 178/317] Added mail.i2p to i2pconv list so emails can be rewritten --- i2p2www/pages/site/about/halloffame.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i2p2www/pages/site/about/halloffame.html b/i2p2www/pages/site/about/halloffame.html index 45c34140..31dba8c3 100644 --- a/i2p2www/pages/site/about/halloffame.html +++ b/i2p2www/pages/site/about/halloffame.html @@ -26,7 +26,7 @@
    Latest version:
    -2012-05-02 - I2P 0.9 - {{ urlify("release-0.9", "Announcement", "html")}} +2012-05-02 - I2P 0.9 - Announcement - Download
    2007-09-28 - Syndie 1.101a - diff --git a/www.i2p2/pages/not_found.html b/www.i2p2/pages/not_found.html deleted file mode 100644 index a6c2a3fd..00000000 --- a/www.i2p2/pages/not_found.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "_layout.html" %} -{% block title %}Not found{% endblock %} -{% block content %} -Yep... the resource, you were searching for, is named differently, doesn't exist or was removed. -{% endblock %} diff --git a/www.i2p2/pages/not_found_de.html b/www.i2p2/pages/not_found_de.html deleted file mode 100644 index 42fa6929..00000000 --- a/www.i2p2/pages/not_found_de.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "_layout_de.html" %} -{% block title %}Nicht gefunden{% endblock %} -{% block content %} -Yep... die Information nach der du suchst, nennt sich anders, existiert nicht oder wurde entfernt. -{% endblock %} diff --git a/www.i2p2/pages/not_found_zh.html b/www.i2p2/pages/not_found_zh.html deleted file mode 100644 index 95b66982..00000000 --- a/www.i2p2/pages/not_found_zh.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "_layout_zh.html" %} -{% block title %} -未找到 -{% endblock %} -{% block content %} -您搜索的页面或资源的名称不正确或不存在或已被删除。 -{% endblock %} \ No newline at end of file From 382d158489f6b80f0f3c4def02775c61c6e8fd8d Mon Sep 17 00:00:00 2001 From: dev Date: Mon, 10 Sep 2012 09:38:42 +0000 Subject: [PATCH 007/317] start hacking blog index --- app.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app.py b/app.py index 866b6308..8e942443 100644 --- a/app.py +++ b/app.py @@ -168,6 +168,24 @@ def downloads_redirect(protocol, file, mirror=None): +def get_blog_index(): + """ + Returns list of valid slugs sorted by date + """ + ret=[] + + # list of slugs(not sorted in any way) + entries=[] + # walk over all directories/files + for v in os.walk(BLOG_DIR): + # iterate over all files + for f in v[2]: + # ignore all non-.rst files + if not f.endswith('.rst'): + continue + + + def render_blog_entry(slug): """ Render the blog entry From 17224eba28e7a97be474eb57131f0f5b4a9bd5e1 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 10 Sep 2012 11:28:34 +0000 Subject: [PATCH 008/317] Removed whitespace --- app.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/app.py b/app.py index 8e942443..8a9651b0 100644 --- a/app.py +++ b/app.py @@ -72,7 +72,7 @@ def detect_theme(): @app.errorhandler(404) def page_not_found(error): return render_template('global/error_404.html'), 404 - + @app.route('/') def main_index(): return redirect(url_for('site_show', lang='en')) @@ -86,11 +86,11 @@ def site_show(page='index'): return redirect(url_for('site_show', page=page[:-5])) name = 'site/%s.html' % page page_file = safe_join(TEMPLATE_DIR, name) - + # bah! those damn users all the time! if not os.path.exists(page_file): abort(404) - + # hah! return render_template(name, page=page) @@ -109,38 +109,38 @@ def meetings_show(id, log=False, rst=False): hname = str(id) + '.rst' lfile = safe_join(MEETINGS_DIR, lname) hfile = safe_join(MEETINGS_DIR, hname) - + # check if meeting file exists and throw error if it does not.. if not os.path.exists(lfile): abort(404) - + # if the user just wanted the .log if log: # hmm... maybe replace with something non-render_template like? # return render_template('meetings/show_raw.html', log=log) return send_from_directory(MEETINGS_DIR, lname, mimetype='text/plain') - + log='' header=None - + # try to load header if that makes sense if os.path.exists(hfile): # if the user just wanted the .rst... if rst: return send_from_directory(MEETINGS_DIR, hname, mimetype='text/plain') - + # open the file as utf-8 file with codecs.open(hfile, encoding='utf-8') as fd: header = fd.read() elif rst: abort(404) - + # load log with codecs.open(lfile, encoding='utf-8') as fd: log = fd.read() - + return render_template('meetings/show.html', log=log, header=header, id=id) - + @app.route('//meetings/.log') def meetings_show_log(id): @@ -173,7 +173,7 @@ def get_blog_index(): Returns list of valid slugs sorted by date """ ret=[] - + # list of slugs(not sorted in any way) entries=[] # walk over all directories/files @@ -183,7 +183,6 @@ def get_blog_index(): # ignore all non-.rst files if not f.endswith('.rst'): continue - def render_blog_entry(slug): @@ -201,7 +200,7 @@ def render_blog_entry(slug): # read file with codecs.open(path, encoding='utf-8') as fd: content = fd.read() - + return publish_parts(source=content, source_path=BLOG_DIR, writer_name="html") @@ -216,13 +215,13 @@ def blog_index(page=0): def blog_entry(slug): # try to render that blog entry.. throws 404 if it does not exist parts = render_blog_entry(slug) - + if parts: # now just pass to simple template file and we are done return render_template('blog/entry.html', parts=parts, title=parts['title'], body=parts['fragment']) else: abort(404) - + @app.route('/feed/blog/rss') def blog_rss(): From 9b575cb30afc4c4fd9db4f1c0fa44002e8871e64 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 10 Sep 2012 11:56:51 +0000 Subject: [PATCH 009/317] Some comments to clarify app.py --- app.py | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/app.py b/app.py index 8a9651b0..449a677c 100644 --- a/app.py +++ b/app.py @@ -69,16 +69,23 @@ def detect_theme(): return resp +############### +# Error handlers + @app.errorhandler(404) def page_not_found(error): return render_template('global/error_404.html'), 404 + +####################### +# General page handlers + +# Index - redirects to en homepage @app.route('/') def main_index(): return redirect(url_for('site_show', lang='en')) - - +# Site pages @app.route('//site/') @app.route('//site/') def site_show(page='index'): @@ -94,10 +101,16 @@ def site_show(page='index'): # hah! return render_template(name, page=page) + +################## +# Meeting handlers + +# Meeting index @app.route('//meetings/') def meetings_index(): return render_template('meetings/index.html') +# Renderer for specific meetings @app.route('//meetings/') def meetings_show(id, log=False, rst=False): """ @@ -141,20 +154,27 @@ def meetings_show(id, log=False, rst=False): return render_template('meetings/show.html', log=log, header=header, id=id) - +# Just return the raw .log for the meeting @app.route('//meetings/.log') def meetings_show_log(id): return meetings_show(id, log=True) +# Just return the raw .rst for the meeting @app.route('//meetings/.rst') def meetings_show_rst(id): return meetings_show(id, rst=True) + +################### +# Download handlers + +# List of downloads @app.route('//download') def downloads_list(): # TODO: read mirror list or list of available files return render_template('downloads/list.html') +# Specific file downloader @app.route('//download/') def downloads_select(file): # TODO: implement @@ -167,6 +187,8 @@ def downloads_redirect(protocol, file, mirror=None): pass +##################### +# Blog helper methods def get_blog_index(): """ @@ -204,6 +226,8 @@ def render_blog_entry(slug): return publish_parts(source=content, source_path=BLOG_DIR, writer_name="html") +############### +# Blog handlers @app.route('//blog/') @app.route('//blog/page/') @@ -234,9 +258,8 @@ def blog_atom(): pass - - -## legacy stuff: +############## +# Legacy paths @app.route('/meeting') @app.route('/meeting.html') From c9640766f86046d4a4197c136e67e98571be21fa Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 10 Sep 2012 12:14:29 +0000 Subject: [PATCH 010/317] Reordered and commented hooks --- app.py | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/app.py b/app.py index 449a677c..477c4c87 100644 --- a/app.py +++ b/app.py @@ -16,11 +16,9 @@ MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings') app = application = Flask(__name__, template_folder=TEMPLATE_DIR, static_url_path='/_static', static_folder=STATIC_DIR) app.debug = bool(os.environ.get('APP_DEBUG', 'False')) -@app.after_request -def call_after_request_callbacks(response): - for callback in getattr(g, 'after_request_callbacks', ()): - response = callback(response) - return response + +########################## +# Hooks - helper functions def after_this_request(f): if not hasattr(g, 'after_request_callbacks'): @@ -29,11 +27,8 @@ def after_this_request(f): return f -@app.template_filter('restructuredtext') -def restructuredtext(value): - parts = publish_parts(source=value, writer_name="html") - return parts['html_body'] - +########################### +# Hooks - url preprocessing @app.url_value_preprocessor def pull_lang(endpoint, values): @@ -50,6 +45,11 @@ def set_lang(endpoint, values): if hasattr(g, 'lang'): values['lang'] = g.lang + +######################## +# Hooks - before request + +# Detect and store chosen theme @app.before_request def detect_theme(): theme = 'light' @@ -69,6 +69,25 @@ def detect_theme(): return resp +############################ +# Hooks - request processing + +@app.template_filter('restructuredtext') +def restructuredtext(value): + parts = publish_parts(source=value, writer_name="html") + return parts['html_body'] + + +####################### +# Hooks - after request + +@app.after_request +def call_after_request_callbacks(response): + for callback in getattr(g, 'after_request_callbacks', ()): + response = callback(response) + return response + + ############### # Error handlers From d48acb9c8aadff874aff67480cec5ba157ee0d39 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 10 Sep 2012 12:34:33 +0000 Subject: [PATCH 011/317] Moved "new website" into a package in www.i2p2 dir --- app.py => www.i2p2/i2p2www/__init__.py | 0 .../i2p2www/blog}/2006/10/10/status.html | 0 .../i2p2www/blog}/2006/10/10/status.rst | 0 {meetings => www.i2p2/i2p2www/meetings}/208.log | 0 .../i2p2www/pages}/downloads/list.html | 0 .../i2p2www/pages}/global/error_404.html | 0 .../i2p2www/pages}/global/layout.html | 0 {pages => www.i2p2/i2p2www/pages}/global/menu.html | 0 {pages => www.i2p2/i2p2www/pages}/global/urlify | 0 .../i2p2www/pages}/meetings/index.html | 0 {pages => www.i2p2/i2p2www/pages}/site/index.html | 0 {static => www.i2p2/i2p2www/static}/favicon.ico | Bin .../i2p2www/static}/images/I2PTunnel-streamr.png | Bin .../i2p2www/static}/images/add-key-terminal.png | Bin .../i2p2www/static}/images/bandwidth2009.png | Bin {static => www.i2p2/i2p2www/static}/images/cz.png | Bin {static => www.i2p2/i2p2www/static}/images/dark.png | Bin .../i2p2www/static}/images/darkbluebg.png | Bin .../i2p2www/static}/images/darkbluetile.png | Bin .../i2p2www/static}/images/darkerbluetile.png | Bin {static => www.i2p2/i2p2www/static}/images/de.png | Bin .../i2p2www/static}/images/download.png | Bin .../i2p2www/static}/images/download_dark.png | Bin .../i2p2www/static}/images/endToEndEncryption.png | Bin .../static}/images/endToEndEncryption_fr.png | Bin .../static}/images/endToEndEncryption_zh.png | Bin {static => www.i2p2/i2p2www/static}/images/es.png | Bin {static => www.i2p2/i2p2www/static}/images/eu.png | Bin .../i2p2www/static}/images/firefox.options.jpg | Bin .../i2p2www/static}/images/firefox.options_fr.png | Bin .../i2p2www/static}/images/firefox.proxyports.jpg | Bin .../static}/images/firefox.proxyports_fr.png | Bin {static => www.i2p2/i2p2www/static}/images/fr.png | Bin .../i2p2www/static}/images/garliccloves.png | Bin {static => www.i2p2/i2p2www/static}/images/help.png | Bin .../i2p2www/static}/images/help_dark.png | Bin .../i2p2www/static}/images/i2plogo.png | Bin .../i2p2www/static}/images/i2ptunnel_peertopeer.png | Bin .../static}/images/i2ptunnel_serverclient.png | Bin .../i2p2www/static}/images/i2pvstor_zh.png | Bin .../i2p2www/static}/images/ie.options.jpg | Bin .../i2p2www/static}/images/ie.options_fr.png | Bin .../i2p2www/static}/images/ie.proxyports.jpg | Bin .../i2p2www/static}/images/ie.proxyports_fr.png | Bin {static => www.i2p2/i2p2www/static}/images/info.png | Bin .../i2p2www/static}/images/info_dark.png | Bin {static => www.i2p2/i2p2www/static}/images/it.png | Bin .../i2p2www/static}/images/itoopie.png | Bin .../i2p2www/static}/images/konqueror.options.jpg | Bin .../i2p2www/static}/images/konqueror.options_fr.jpg | Bin .../i2p2www/static}/images/konqueror.proxyports.jpg | Bin .../static}/images/konqueror.proxyports_fr.jpg | Bin .../i2p2www/static}/images/lang_ar.png | Bin .../i2p2www/static}/images/light.png | Bin .../i2p2www/static}/images/lightbluetile.png | Bin {static => www.i2p2/i2p2www/static}/images/link.png | Bin .../i2p2www/static}/images/link_dark.png | Bin .../i2p2www/static}/images/logo07c.jpg | Bin {static => www.i2p2/i2p2www/static}/images/net.png | Bin .../i2p2www/static}/images/net_fr.png | Bin .../i2p2www/static}/images/netdb_get_leaseset.png | Bin .../static}/images/netdb_get_leaseset_fr.png | Bin .../static}/images/netdb_get_routerinfo_1.png | Bin .../static}/images/netdb_get_routerinfo_1_fr.png | Bin .../static}/images/netdb_get_routerinfo_2.png | Bin .../static}/images/netdb_get_routerinfo_2_fr.png | Bin {static => www.i2p2/i2p2www/static}/images/nl.png | Bin {static => www.i2p2/i2p2www/static}/images/plan.png | Bin .../i2p2www/static}/images/protocol_stack.png | Bin .../i2p2www/static}/images/protocol_stack_fr.png | Bin {static => www.i2p2/i2p2www/static}/images/ru.png | Bin .../i2p2www/static}/images/sqbullet.png | Bin .../i2p2www/static}/images/stackoverflow_ad.png | Bin .../i2p2www/static}/images/tabletile.png | Bin .../i2p2www/static}/images/tabletile_alt.png | Bin .../i2p2www/static}/images/tabletitledark.png | Bin .../i2p2www/static}/images/tabletitlelight-tall.png | Bin .../i2p2www/static}/images/tabletitlelight.png | Bin .../i2p2www/static}/images/target.png | Bin .../i2p2www/static}/images/tunnelSending.png | Bin .../i2p2www/static}/images/tunnels.png | Bin .../i2p2www/static}/images/tunnels_fr.png | Bin {static => www.i2p2/i2p2www/static}/images/udp.png | Bin {static => www.i2p2/i2p2www/static}/images/us.png | Bin {static => www.i2p2/i2p2www/static}/images/zh.png | Bin {static => www.i2p2/i2p2www/static}/news/news.xml | 0 .../i2p2www/static}/pdf/I2CP_spec.pdf | Bin .../i2p2www/static}/pdf/I2NP_spec.pdf | Bin .../i2p2www/static}/pdf/I2P-PET-CON-2009.1.pdf | Bin .../i2p2www/static}/pdf/datastructures.pdf | Bin .../i2p2www/static}/pdf/i2p_philosophy.pdf | Bin .../i2p2www/static}/pdf/polling_http_transport.pdf | Bin {static => www.i2p2/i2p2www/static}/styles/dark.css | 0 .../i2p2www/static}/styles/light.css | 0 .../i2p2www/static}/styles/light_ar.css | 0 .../i2p2www/static}/styles/light_zh.css | 0 www.i2p2/runserver.py | 2 ++ 97 files changed, 2 insertions(+) rename app.py => www.i2p2/i2p2www/__init__.py (100%) rename {blog => www.i2p2/i2p2www/blog}/2006/10/10/status.html (100%) rename {blog => www.i2p2/i2p2www/blog}/2006/10/10/status.rst (100%) rename {meetings => www.i2p2/i2p2www/meetings}/208.log (100%) rename {pages => www.i2p2/i2p2www/pages}/downloads/list.html (100%) rename {pages => www.i2p2/i2p2www/pages}/global/error_404.html (100%) rename {pages => www.i2p2/i2p2www/pages}/global/layout.html (100%) rename {pages => www.i2p2/i2p2www/pages}/global/menu.html (100%) rename {pages => www.i2p2/i2p2www/pages}/global/urlify (100%) rename {pages => www.i2p2/i2p2www/pages}/meetings/index.html (100%) rename {pages => www.i2p2/i2p2www/pages}/site/index.html (100%) rename {static => www.i2p2/i2p2www/static}/favicon.ico (100%) rename {static => www.i2p2/i2p2www/static}/images/I2PTunnel-streamr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/add-key-terminal.png (100%) rename {static => www.i2p2/i2p2www/static}/images/bandwidth2009.png (100%) rename {static => www.i2p2/i2p2www/static}/images/cz.png (100%) rename {static => www.i2p2/i2p2www/static}/images/dark.png (100%) rename {static => www.i2p2/i2p2www/static}/images/darkbluebg.png (100%) rename {static => www.i2p2/i2p2www/static}/images/darkbluetile.png (100%) rename {static => www.i2p2/i2p2www/static}/images/darkerbluetile.png (100%) rename {static => www.i2p2/i2p2www/static}/images/de.png (100%) rename {static => www.i2p2/i2p2www/static}/images/download.png (100%) rename {static => www.i2p2/i2p2www/static}/images/download_dark.png (100%) rename {static => www.i2p2/i2p2www/static}/images/endToEndEncryption.png (100%) rename {static => www.i2p2/i2p2www/static}/images/endToEndEncryption_fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/endToEndEncryption_zh.png (100%) rename {static => www.i2p2/i2p2www/static}/images/es.png (100%) rename {static => www.i2p2/i2p2www/static}/images/eu.png (100%) rename {static => www.i2p2/i2p2www/static}/images/firefox.options.jpg (100%) rename {static => www.i2p2/i2p2www/static}/images/firefox.options_fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/firefox.proxyports.jpg (100%) rename {static => www.i2p2/i2p2www/static}/images/firefox.proxyports_fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/garliccloves.png (100%) rename {static => www.i2p2/i2p2www/static}/images/help.png (100%) rename {static => www.i2p2/i2p2www/static}/images/help_dark.png (100%) rename {static => www.i2p2/i2p2www/static}/images/i2plogo.png (100%) rename {static => www.i2p2/i2p2www/static}/images/i2ptunnel_peertopeer.png (100%) rename {static => www.i2p2/i2p2www/static}/images/i2ptunnel_serverclient.png (100%) rename {static => www.i2p2/i2p2www/static}/images/i2pvstor_zh.png (100%) rename {static => www.i2p2/i2p2www/static}/images/ie.options.jpg (100%) rename {static => www.i2p2/i2p2www/static}/images/ie.options_fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/ie.proxyports.jpg (100%) rename {static => www.i2p2/i2p2www/static}/images/ie.proxyports_fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/info.png (100%) rename {static => www.i2p2/i2p2www/static}/images/info_dark.png (100%) rename {static => www.i2p2/i2p2www/static}/images/it.png (100%) rename {static => www.i2p2/i2p2www/static}/images/itoopie.png (100%) rename {static => www.i2p2/i2p2www/static}/images/konqueror.options.jpg (100%) rename {static => www.i2p2/i2p2www/static}/images/konqueror.options_fr.jpg (100%) rename {static => www.i2p2/i2p2www/static}/images/konqueror.proxyports.jpg (100%) rename {static => www.i2p2/i2p2www/static}/images/konqueror.proxyports_fr.jpg (100%) rename {static => www.i2p2/i2p2www/static}/images/lang_ar.png (100%) rename {static => www.i2p2/i2p2www/static}/images/light.png (100%) rename {static => www.i2p2/i2p2www/static}/images/lightbluetile.png (100%) rename {static => www.i2p2/i2p2www/static}/images/link.png (100%) rename {static => www.i2p2/i2p2www/static}/images/link_dark.png (100%) rename {static => www.i2p2/i2p2www/static}/images/logo07c.jpg (100%) rename {static => www.i2p2/i2p2www/static}/images/net.png (100%) rename {static => www.i2p2/i2p2www/static}/images/net_fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/netdb_get_leaseset.png (100%) rename {static => www.i2p2/i2p2www/static}/images/netdb_get_leaseset_fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/netdb_get_routerinfo_1.png (100%) rename {static => www.i2p2/i2p2www/static}/images/netdb_get_routerinfo_1_fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/netdb_get_routerinfo_2.png (100%) rename {static => www.i2p2/i2p2www/static}/images/netdb_get_routerinfo_2_fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/nl.png (100%) rename {static => www.i2p2/i2p2www/static}/images/plan.png (100%) rename {static => www.i2p2/i2p2www/static}/images/protocol_stack.png (100%) rename {static => www.i2p2/i2p2www/static}/images/protocol_stack_fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/ru.png (100%) rename {static => www.i2p2/i2p2www/static}/images/sqbullet.png (100%) rename {static => www.i2p2/i2p2www/static}/images/stackoverflow_ad.png (100%) rename {static => www.i2p2/i2p2www/static}/images/tabletile.png (100%) rename {static => www.i2p2/i2p2www/static}/images/tabletile_alt.png (100%) rename {static => www.i2p2/i2p2www/static}/images/tabletitledark.png (100%) rename {static => www.i2p2/i2p2www/static}/images/tabletitlelight-tall.png (100%) rename {static => www.i2p2/i2p2www/static}/images/tabletitlelight.png (100%) rename {static => www.i2p2/i2p2www/static}/images/target.png (100%) rename {static => www.i2p2/i2p2www/static}/images/tunnelSending.png (100%) rename {static => www.i2p2/i2p2www/static}/images/tunnels.png (100%) rename {static => www.i2p2/i2p2www/static}/images/tunnels_fr.png (100%) rename {static => www.i2p2/i2p2www/static}/images/udp.png (100%) rename {static => www.i2p2/i2p2www/static}/images/us.png (100%) rename {static => www.i2p2/i2p2www/static}/images/zh.png (100%) rename {static => www.i2p2/i2p2www/static}/news/news.xml (100%) rename {static => www.i2p2/i2p2www/static}/pdf/I2CP_spec.pdf (100%) rename {static => www.i2p2/i2p2www/static}/pdf/I2NP_spec.pdf (100%) rename {static => www.i2p2/i2p2www/static}/pdf/I2P-PET-CON-2009.1.pdf (100%) rename {static => www.i2p2/i2p2www/static}/pdf/datastructures.pdf (100%) rename {static => www.i2p2/i2p2www/static}/pdf/i2p_philosophy.pdf (100%) rename {static => www.i2p2/i2p2www/static}/pdf/polling_http_transport.pdf (100%) rename {static => www.i2p2/i2p2www/static}/styles/dark.css (100%) rename {static => www.i2p2/i2p2www/static}/styles/light.css (100%) rename {static => www.i2p2/i2p2www/static}/styles/light_ar.css (100%) rename {static => www.i2p2/i2p2www/static}/styles/light_zh.css (100%) create mode 100644 www.i2p2/runserver.py diff --git a/app.py b/www.i2p2/i2p2www/__init__.py similarity index 100% rename from app.py rename to www.i2p2/i2p2www/__init__.py diff --git a/blog/2006/10/10/status.html b/www.i2p2/i2p2www/blog/2006/10/10/status.html similarity index 100% rename from blog/2006/10/10/status.html rename to www.i2p2/i2p2www/blog/2006/10/10/status.html diff --git a/blog/2006/10/10/status.rst b/www.i2p2/i2p2www/blog/2006/10/10/status.rst similarity index 100% rename from blog/2006/10/10/status.rst rename to www.i2p2/i2p2www/blog/2006/10/10/status.rst diff --git a/meetings/208.log b/www.i2p2/i2p2www/meetings/208.log similarity index 100% rename from meetings/208.log rename to www.i2p2/i2p2www/meetings/208.log diff --git a/pages/downloads/list.html b/www.i2p2/i2p2www/pages/downloads/list.html similarity index 100% rename from pages/downloads/list.html rename to www.i2p2/i2p2www/pages/downloads/list.html diff --git a/pages/global/error_404.html b/www.i2p2/i2p2www/pages/global/error_404.html similarity index 100% rename from pages/global/error_404.html rename to www.i2p2/i2p2www/pages/global/error_404.html diff --git a/pages/global/layout.html b/www.i2p2/i2p2www/pages/global/layout.html similarity index 100% rename from pages/global/layout.html rename to www.i2p2/i2p2www/pages/global/layout.html diff --git a/pages/global/menu.html b/www.i2p2/i2p2www/pages/global/menu.html similarity index 100% rename from pages/global/menu.html rename to www.i2p2/i2p2www/pages/global/menu.html diff --git a/pages/global/urlify b/www.i2p2/i2p2www/pages/global/urlify similarity index 100% rename from pages/global/urlify rename to www.i2p2/i2p2www/pages/global/urlify diff --git a/pages/meetings/index.html b/www.i2p2/i2p2www/pages/meetings/index.html similarity index 100% rename from pages/meetings/index.html rename to www.i2p2/i2p2www/pages/meetings/index.html diff --git a/pages/site/index.html b/www.i2p2/i2p2www/pages/site/index.html similarity index 100% rename from pages/site/index.html rename to www.i2p2/i2p2www/pages/site/index.html diff --git a/static/favicon.ico b/www.i2p2/i2p2www/static/favicon.ico similarity index 100% rename from static/favicon.ico rename to www.i2p2/i2p2www/static/favicon.ico diff --git a/static/images/I2PTunnel-streamr.png b/www.i2p2/i2p2www/static/images/I2PTunnel-streamr.png similarity index 100% rename from static/images/I2PTunnel-streamr.png rename to www.i2p2/i2p2www/static/images/I2PTunnel-streamr.png diff --git a/static/images/add-key-terminal.png b/www.i2p2/i2p2www/static/images/add-key-terminal.png similarity index 100% rename from static/images/add-key-terminal.png rename to www.i2p2/i2p2www/static/images/add-key-terminal.png diff --git a/static/images/bandwidth2009.png b/www.i2p2/i2p2www/static/images/bandwidth2009.png similarity index 100% rename from static/images/bandwidth2009.png rename to www.i2p2/i2p2www/static/images/bandwidth2009.png diff --git a/static/images/cz.png b/www.i2p2/i2p2www/static/images/cz.png similarity index 100% rename from static/images/cz.png rename to www.i2p2/i2p2www/static/images/cz.png diff --git a/static/images/dark.png b/www.i2p2/i2p2www/static/images/dark.png similarity index 100% rename from static/images/dark.png rename to www.i2p2/i2p2www/static/images/dark.png diff --git a/static/images/darkbluebg.png b/www.i2p2/i2p2www/static/images/darkbluebg.png similarity index 100% rename from static/images/darkbluebg.png rename to www.i2p2/i2p2www/static/images/darkbluebg.png diff --git a/static/images/darkbluetile.png b/www.i2p2/i2p2www/static/images/darkbluetile.png similarity index 100% rename from static/images/darkbluetile.png rename to www.i2p2/i2p2www/static/images/darkbluetile.png diff --git a/static/images/darkerbluetile.png b/www.i2p2/i2p2www/static/images/darkerbluetile.png similarity index 100% rename from static/images/darkerbluetile.png rename to www.i2p2/i2p2www/static/images/darkerbluetile.png diff --git a/static/images/de.png b/www.i2p2/i2p2www/static/images/de.png similarity index 100% rename from static/images/de.png rename to www.i2p2/i2p2www/static/images/de.png diff --git a/static/images/download.png b/www.i2p2/i2p2www/static/images/download.png similarity index 100% rename from static/images/download.png rename to www.i2p2/i2p2www/static/images/download.png diff --git a/static/images/download_dark.png b/www.i2p2/i2p2www/static/images/download_dark.png similarity index 100% rename from static/images/download_dark.png rename to www.i2p2/i2p2www/static/images/download_dark.png diff --git a/static/images/endToEndEncryption.png b/www.i2p2/i2p2www/static/images/endToEndEncryption.png similarity index 100% rename from static/images/endToEndEncryption.png rename to www.i2p2/i2p2www/static/images/endToEndEncryption.png diff --git a/static/images/endToEndEncryption_fr.png b/www.i2p2/i2p2www/static/images/endToEndEncryption_fr.png similarity index 100% rename from static/images/endToEndEncryption_fr.png rename to www.i2p2/i2p2www/static/images/endToEndEncryption_fr.png diff --git a/static/images/endToEndEncryption_zh.png b/www.i2p2/i2p2www/static/images/endToEndEncryption_zh.png similarity index 100% rename from static/images/endToEndEncryption_zh.png rename to www.i2p2/i2p2www/static/images/endToEndEncryption_zh.png diff --git a/static/images/es.png b/www.i2p2/i2p2www/static/images/es.png similarity index 100% rename from static/images/es.png rename to www.i2p2/i2p2www/static/images/es.png diff --git a/static/images/eu.png b/www.i2p2/i2p2www/static/images/eu.png similarity index 100% rename from static/images/eu.png rename to www.i2p2/i2p2www/static/images/eu.png diff --git a/static/images/firefox.options.jpg b/www.i2p2/i2p2www/static/images/firefox.options.jpg similarity index 100% rename from static/images/firefox.options.jpg rename to www.i2p2/i2p2www/static/images/firefox.options.jpg diff --git a/static/images/firefox.options_fr.png b/www.i2p2/i2p2www/static/images/firefox.options_fr.png similarity index 100% rename from static/images/firefox.options_fr.png rename to www.i2p2/i2p2www/static/images/firefox.options_fr.png diff --git a/static/images/firefox.proxyports.jpg b/www.i2p2/i2p2www/static/images/firefox.proxyports.jpg similarity index 100% rename from static/images/firefox.proxyports.jpg rename to www.i2p2/i2p2www/static/images/firefox.proxyports.jpg diff --git a/static/images/firefox.proxyports_fr.png b/www.i2p2/i2p2www/static/images/firefox.proxyports_fr.png similarity index 100% rename from static/images/firefox.proxyports_fr.png rename to www.i2p2/i2p2www/static/images/firefox.proxyports_fr.png diff --git a/static/images/fr.png b/www.i2p2/i2p2www/static/images/fr.png similarity index 100% rename from static/images/fr.png rename to www.i2p2/i2p2www/static/images/fr.png diff --git a/static/images/garliccloves.png b/www.i2p2/i2p2www/static/images/garliccloves.png similarity index 100% rename from static/images/garliccloves.png rename to www.i2p2/i2p2www/static/images/garliccloves.png diff --git a/static/images/help.png b/www.i2p2/i2p2www/static/images/help.png similarity index 100% rename from static/images/help.png rename to www.i2p2/i2p2www/static/images/help.png diff --git a/static/images/help_dark.png b/www.i2p2/i2p2www/static/images/help_dark.png similarity index 100% rename from static/images/help_dark.png rename to www.i2p2/i2p2www/static/images/help_dark.png diff --git a/static/images/i2plogo.png b/www.i2p2/i2p2www/static/images/i2plogo.png similarity index 100% rename from static/images/i2plogo.png rename to www.i2p2/i2p2www/static/images/i2plogo.png diff --git a/static/images/i2ptunnel_peertopeer.png b/www.i2p2/i2p2www/static/images/i2ptunnel_peertopeer.png similarity index 100% rename from static/images/i2ptunnel_peertopeer.png rename to www.i2p2/i2p2www/static/images/i2ptunnel_peertopeer.png diff --git a/static/images/i2ptunnel_serverclient.png b/www.i2p2/i2p2www/static/images/i2ptunnel_serverclient.png similarity index 100% rename from static/images/i2ptunnel_serverclient.png rename to www.i2p2/i2p2www/static/images/i2ptunnel_serverclient.png diff --git a/static/images/i2pvstor_zh.png b/www.i2p2/i2p2www/static/images/i2pvstor_zh.png similarity index 100% rename from static/images/i2pvstor_zh.png rename to www.i2p2/i2p2www/static/images/i2pvstor_zh.png diff --git a/static/images/ie.options.jpg b/www.i2p2/i2p2www/static/images/ie.options.jpg similarity index 100% rename from static/images/ie.options.jpg rename to www.i2p2/i2p2www/static/images/ie.options.jpg diff --git a/static/images/ie.options_fr.png b/www.i2p2/i2p2www/static/images/ie.options_fr.png similarity index 100% rename from static/images/ie.options_fr.png rename to www.i2p2/i2p2www/static/images/ie.options_fr.png diff --git a/static/images/ie.proxyports.jpg b/www.i2p2/i2p2www/static/images/ie.proxyports.jpg similarity index 100% rename from static/images/ie.proxyports.jpg rename to www.i2p2/i2p2www/static/images/ie.proxyports.jpg diff --git a/static/images/ie.proxyports_fr.png b/www.i2p2/i2p2www/static/images/ie.proxyports_fr.png similarity index 100% rename from static/images/ie.proxyports_fr.png rename to www.i2p2/i2p2www/static/images/ie.proxyports_fr.png diff --git a/static/images/info.png b/www.i2p2/i2p2www/static/images/info.png similarity index 100% rename from static/images/info.png rename to www.i2p2/i2p2www/static/images/info.png diff --git a/static/images/info_dark.png b/www.i2p2/i2p2www/static/images/info_dark.png similarity index 100% rename from static/images/info_dark.png rename to www.i2p2/i2p2www/static/images/info_dark.png diff --git a/static/images/it.png b/www.i2p2/i2p2www/static/images/it.png similarity index 100% rename from static/images/it.png rename to www.i2p2/i2p2www/static/images/it.png diff --git a/static/images/itoopie.png b/www.i2p2/i2p2www/static/images/itoopie.png similarity index 100% rename from static/images/itoopie.png rename to www.i2p2/i2p2www/static/images/itoopie.png diff --git a/static/images/konqueror.options.jpg b/www.i2p2/i2p2www/static/images/konqueror.options.jpg similarity index 100% rename from static/images/konqueror.options.jpg rename to www.i2p2/i2p2www/static/images/konqueror.options.jpg diff --git a/static/images/konqueror.options_fr.jpg b/www.i2p2/i2p2www/static/images/konqueror.options_fr.jpg similarity index 100% rename from static/images/konqueror.options_fr.jpg rename to www.i2p2/i2p2www/static/images/konqueror.options_fr.jpg diff --git a/static/images/konqueror.proxyports.jpg b/www.i2p2/i2p2www/static/images/konqueror.proxyports.jpg similarity index 100% rename from static/images/konqueror.proxyports.jpg rename to www.i2p2/i2p2www/static/images/konqueror.proxyports.jpg diff --git a/static/images/konqueror.proxyports_fr.jpg b/www.i2p2/i2p2www/static/images/konqueror.proxyports_fr.jpg similarity index 100% rename from static/images/konqueror.proxyports_fr.jpg rename to www.i2p2/i2p2www/static/images/konqueror.proxyports_fr.jpg diff --git a/static/images/lang_ar.png b/www.i2p2/i2p2www/static/images/lang_ar.png similarity index 100% rename from static/images/lang_ar.png rename to www.i2p2/i2p2www/static/images/lang_ar.png diff --git a/static/images/light.png b/www.i2p2/i2p2www/static/images/light.png similarity index 100% rename from static/images/light.png rename to www.i2p2/i2p2www/static/images/light.png diff --git a/static/images/lightbluetile.png b/www.i2p2/i2p2www/static/images/lightbluetile.png similarity index 100% rename from static/images/lightbluetile.png rename to www.i2p2/i2p2www/static/images/lightbluetile.png diff --git a/static/images/link.png b/www.i2p2/i2p2www/static/images/link.png similarity index 100% rename from static/images/link.png rename to www.i2p2/i2p2www/static/images/link.png diff --git a/static/images/link_dark.png b/www.i2p2/i2p2www/static/images/link_dark.png similarity index 100% rename from static/images/link_dark.png rename to www.i2p2/i2p2www/static/images/link_dark.png diff --git a/static/images/logo07c.jpg b/www.i2p2/i2p2www/static/images/logo07c.jpg similarity index 100% rename from static/images/logo07c.jpg rename to www.i2p2/i2p2www/static/images/logo07c.jpg diff --git a/static/images/net.png b/www.i2p2/i2p2www/static/images/net.png similarity index 100% rename from static/images/net.png rename to www.i2p2/i2p2www/static/images/net.png diff --git a/static/images/net_fr.png b/www.i2p2/i2p2www/static/images/net_fr.png similarity index 100% rename from static/images/net_fr.png rename to www.i2p2/i2p2www/static/images/net_fr.png diff --git a/static/images/netdb_get_leaseset.png b/www.i2p2/i2p2www/static/images/netdb_get_leaseset.png similarity index 100% rename from static/images/netdb_get_leaseset.png rename to www.i2p2/i2p2www/static/images/netdb_get_leaseset.png diff --git a/static/images/netdb_get_leaseset_fr.png b/www.i2p2/i2p2www/static/images/netdb_get_leaseset_fr.png similarity index 100% rename from static/images/netdb_get_leaseset_fr.png rename to www.i2p2/i2p2www/static/images/netdb_get_leaseset_fr.png diff --git a/static/images/netdb_get_routerinfo_1.png b/www.i2p2/i2p2www/static/images/netdb_get_routerinfo_1.png similarity index 100% rename from static/images/netdb_get_routerinfo_1.png rename to www.i2p2/i2p2www/static/images/netdb_get_routerinfo_1.png diff --git a/static/images/netdb_get_routerinfo_1_fr.png b/www.i2p2/i2p2www/static/images/netdb_get_routerinfo_1_fr.png similarity index 100% rename from static/images/netdb_get_routerinfo_1_fr.png rename to www.i2p2/i2p2www/static/images/netdb_get_routerinfo_1_fr.png diff --git a/static/images/netdb_get_routerinfo_2.png b/www.i2p2/i2p2www/static/images/netdb_get_routerinfo_2.png similarity index 100% rename from static/images/netdb_get_routerinfo_2.png rename to www.i2p2/i2p2www/static/images/netdb_get_routerinfo_2.png diff --git a/static/images/netdb_get_routerinfo_2_fr.png b/www.i2p2/i2p2www/static/images/netdb_get_routerinfo_2_fr.png similarity index 100% rename from static/images/netdb_get_routerinfo_2_fr.png rename to www.i2p2/i2p2www/static/images/netdb_get_routerinfo_2_fr.png diff --git a/static/images/nl.png b/www.i2p2/i2p2www/static/images/nl.png similarity index 100% rename from static/images/nl.png rename to www.i2p2/i2p2www/static/images/nl.png diff --git a/static/images/plan.png b/www.i2p2/i2p2www/static/images/plan.png similarity index 100% rename from static/images/plan.png rename to www.i2p2/i2p2www/static/images/plan.png diff --git a/static/images/protocol_stack.png b/www.i2p2/i2p2www/static/images/protocol_stack.png similarity index 100% rename from static/images/protocol_stack.png rename to www.i2p2/i2p2www/static/images/protocol_stack.png diff --git a/static/images/protocol_stack_fr.png b/www.i2p2/i2p2www/static/images/protocol_stack_fr.png similarity index 100% rename from static/images/protocol_stack_fr.png rename to www.i2p2/i2p2www/static/images/protocol_stack_fr.png diff --git a/static/images/ru.png b/www.i2p2/i2p2www/static/images/ru.png similarity index 100% rename from static/images/ru.png rename to www.i2p2/i2p2www/static/images/ru.png diff --git a/static/images/sqbullet.png b/www.i2p2/i2p2www/static/images/sqbullet.png similarity index 100% rename from static/images/sqbullet.png rename to www.i2p2/i2p2www/static/images/sqbullet.png diff --git a/static/images/stackoverflow_ad.png b/www.i2p2/i2p2www/static/images/stackoverflow_ad.png similarity index 100% rename from static/images/stackoverflow_ad.png rename to www.i2p2/i2p2www/static/images/stackoverflow_ad.png diff --git a/static/images/tabletile.png b/www.i2p2/i2p2www/static/images/tabletile.png similarity index 100% rename from static/images/tabletile.png rename to www.i2p2/i2p2www/static/images/tabletile.png diff --git a/static/images/tabletile_alt.png b/www.i2p2/i2p2www/static/images/tabletile_alt.png similarity index 100% rename from static/images/tabletile_alt.png rename to www.i2p2/i2p2www/static/images/tabletile_alt.png diff --git a/static/images/tabletitledark.png b/www.i2p2/i2p2www/static/images/tabletitledark.png similarity index 100% rename from static/images/tabletitledark.png rename to www.i2p2/i2p2www/static/images/tabletitledark.png diff --git a/static/images/tabletitlelight-tall.png b/www.i2p2/i2p2www/static/images/tabletitlelight-tall.png similarity index 100% rename from static/images/tabletitlelight-tall.png rename to www.i2p2/i2p2www/static/images/tabletitlelight-tall.png diff --git a/static/images/tabletitlelight.png b/www.i2p2/i2p2www/static/images/tabletitlelight.png similarity index 100% rename from static/images/tabletitlelight.png rename to www.i2p2/i2p2www/static/images/tabletitlelight.png diff --git a/static/images/target.png b/www.i2p2/i2p2www/static/images/target.png similarity index 100% rename from static/images/target.png rename to www.i2p2/i2p2www/static/images/target.png diff --git a/static/images/tunnelSending.png b/www.i2p2/i2p2www/static/images/tunnelSending.png similarity index 100% rename from static/images/tunnelSending.png rename to www.i2p2/i2p2www/static/images/tunnelSending.png diff --git a/static/images/tunnels.png b/www.i2p2/i2p2www/static/images/tunnels.png similarity index 100% rename from static/images/tunnels.png rename to www.i2p2/i2p2www/static/images/tunnels.png diff --git a/static/images/tunnels_fr.png b/www.i2p2/i2p2www/static/images/tunnels_fr.png similarity index 100% rename from static/images/tunnels_fr.png rename to www.i2p2/i2p2www/static/images/tunnels_fr.png diff --git a/static/images/udp.png b/www.i2p2/i2p2www/static/images/udp.png similarity index 100% rename from static/images/udp.png rename to www.i2p2/i2p2www/static/images/udp.png diff --git a/static/images/us.png b/www.i2p2/i2p2www/static/images/us.png similarity index 100% rename from static/images/us.png rename to www.i2p2/i2p2www/static/images/us.png diff --git a/static/images/zh.png b/www.i2p2/i2p2www/static/images/zh.png similarity index 100% rename from static/images/zh.png rename to www.i2p2/i2p2www/static/images/zh.png diff --git a/static/news/news.xml b/www.i2p2/i2p2www/static/news/news.xml similarity index 100% rename from static/news/news.xml rename to www.i2p2/i2p2www/static/news/news.xml diff --git a/static/pdf/I2CP_spec.pdf b/www.i2p2/i2p2www/static/pdf/I2CP_spec.pdf similarity index 100% rename from static/pdf/I2CP_spec.pdf rename to www.i2p2/i2p2www/static/pdf/I2CP_spec.pdf diff --git a/static/pdf/I2NP_spec.pdf b/www.i2p2/i2p2www/static/pdf/I2NP_spec.pdf similarity index 100% rename from static/pdf/I2NP_spec.pdf rename to www.i2p2/i2p2www/static/pdf/I2NP_spec.pdf diff --git a/static/pdf/I2P-PET-CON-2009.1.pdf b/www.i2p2/i2p2www/static/pdf/I2P-PET-CON-2009.1.pdf similarity index 100% rename from static/pdf/I2P-PET-CON-2009.1.pdf rename to www.i2p2/i2p2www/static/pdf/I2P-PET-CON-2009.1.pdf diff --git a/static/pdf/datastructures.pdf b/www.i2p2/i2p2www/static/pdf/datastructures.pdf similarity index 100% rename from static/pdf/datastructures.pdf rename to www.i2p2/i2p2www/static/pdf/datastructures.pdf diff --git a/static/pdf/i2p_philosophy.pdf b/www.i2p2/i2p2www/static/pdf/i2p_philosophy.pdf similarity index 100% rename from static/pdf/i2p_philosophy.pdf rename to www.i2p2/i2p2www/static/pdf/i2p_philosophy.pdf diff --git a/static/pdf/polling_http_transport.pdf b/www.i2p2/i2p2www/static/pdf/polling_http_transport.pdf similarity index 100% rename from static/pdf/polling_http_transport.pdf rename to www.i2p2/i2p2www/static/pdf/polling_http_transport.pdf diff --git a/static/styles/dark.css b/www.i2p2/i2p2www/static/styles/dark.css similarity index 100% rename from static/styles/dark.css rename to www.i2p2/i2p2www/static/styles/dark.css diff --git a/static/styles/light.css b/www.i2p2/i2p2www/static/styles/light.css similarity index 100% rename from static/styles/light.css rename to www.i2p2/i2p2www/static/styles/light.css diff --git a/static/styles/light_ar.css b/www.i2p2/i2p2www/static/styles/light_ar.css similarity index 100% rename from static/styles/light_ar.css rename to www.i2p2/i2p2www/static/styles/light_ar.css diff --git a/static/styles/light_zh.css b/www.i2p2/i2p2www/static/styles/light_zh.css similarity index 100% rename from static/styles/light_zh.css rename to www.i2p2/i2p2www/static/styles/light_zh.css diff --git a/www.i2p2/runserver.py b/www.i2p2/runserver.py new file mode 100644 index 00000000..45e60621 --- /dev/null +++ b/www.i2p2/runserver.py @@ -0,0 +1,2 @@ +from i2p2www import app +app.run(debug=True) From cd26692cdb032926f0ec663aa232464004e3639b Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 10 Sep 2012 13:12:03 +0000 Subject: [PATCH 012/317] Link logo to / instead of index.html --- www.i2p2/i2p2www/pages/global/layout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www.i2p2/i2p2www/pages/global/layout.html b/www.i2p2/i2p2www/pages/global/layout.html index 4889c68a..102251c6 100644 --- a/www.i2p2/i2p2www/pages/global/layout.html +++ b/www.i2p2/i2p2www/pages/global/layout.html @@ -14,7 +14,7 @@

    {{ self.title() }}

    s to make them readable --- i2p2www/static/styles/duck.css | 1 + 1 file changed, 1 insertion(+) diff --git a/i2p2www/static/styles/duck.css b/i2p2www/static/styles/duck.css index becc05ea..ac71926a 100644 --- a/i2p2www/static/styles/duck.css +++ b/i2p2www/static/styles/duck.css @@ -237,6 +237,7 @@ div#content .main { div#content .inner h3 {font-size:1.4em;} div#content .inner ul {margin:1.5em; 1em;} div#content .inner p {margin:1em 0;} + div#content .inner td {padding:2px 5px;} div#footer {width:auto; border-top:3px solid #883333; background:#552222; box-shadow:0px -4px 8px rgba(0,0,0,.3); padding:1em 10%; background:-moz-linear-gradient(#883333, #772222);} div#footer .aside {display:inline-block; width:15%; margin-left:1%; vertical-align:top;} From 791cffb2e974b787ae38dd33f3ff3a5e4edcc13d Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 14 Dec 2012 04:33:13 +0000 Subject: [PATCH 156/317] Migrated the bounty_syndie2012* pages --- i2p2www/pages/site/volunteer/bounties/index.html | 2 +- .../pages/site/volunteer/bounties/syndie2012.html | 2 +- www.i2p2/pages/{ => translations}/bounty_syndie2012_de.html | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename www.i2p2/pages/bounty_syndie2012.html => i2p2www/pages/site/volunteer/bounties/syndie2012.html (96%) rename www.i2p2/pages/{ => translations}/bounty_syndie2012_de.html (100%) diff --git a/i2p2www/pages/site/volunteer/bounties/index.html b/i2p2www/pages/site/volunteer/bounties/index.html index b80f7523..0c480cb1 100644 --- a/i2p2www/pages/site/volunteer/bounties/index.html +++ b/i2p2www/pages/site/volunteer/bounties/index.html @@ -74,7 +74,7 @@ etc), and the like.

    3000 €, of which 300 € already paid for done jobs

    Syndie

    Syndie

    Proposal in development

    I2P team

    [vacant]

    Big thanks go to the following people who have donated to I2P!

    -If you have made a donation, please send an email to echelon +If you have made a donation, please send an email to echelon with your name or nick (and optionally homepage) so we can list you here.

    From 7775b8ed48f4d764ae44ee49ab88d5966e6cfac1 Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 13:01:09 +0000 Subject: [PATCH 179/317] Missed __init__.py in last commit --- i2p2www/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 279d3e72..5341abdf 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -130,6 +130,7 @@ def utility_processor(): 'www.i2p2.i2p': 'www.i2p2.de', #'forum.i2p': 'forum.i2p2.de', 'trac.i2p2.i2p': 'trac.i2p2.de', + 'mail.i2p': 'i2pmail.org', } def convert_url_to_clearnet(value): if not value.endswith('.i2p'): From 471178471a274913c177b6f445ef4cb66c05b73c Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 13:01:44 +0000 Subject: [PATCH 180/317] Updated links in about/* --- i2p2www/pages/site/about/papers.html | 4 ++-- i2p2www/pages/site/about/team.html | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/i2p2www/pages/site/about/papers.html b/i2p2www/pages/site/about/papers.html index a4881172..9a0fe279 100644 --- a/i2p2www/pages/site/about/papers.html +++ b/i2p2www/pages/site/about/papers.html @@ -15,11 +15,11 @@ Newest links are at the bottom of each section.
    • -Invisible Internet Project (I2P) Project Overview, jrandom, August 28, 2003. +Invisible Internet Project (I2P) Project Overview, jrandom, August 28, 2003.
    • -Peer Profiling and Selection in the I2P Anonymous Network - +Peer Profiling and Selection in the I2P Anonymous Network - zzz and Lars Schimmer, presented at PET-CON 2009.1, diff --git a/i2p2www/pages/site/about/team.html b/i2p2www/pages/site/about/team.html index 5bd06e7d..db394d57 100644 --- a/i2p2www/pages/site/about/team.html +++ b/i2p2www/pages/site/about/team.html @@ -26,7 +26,7 @@ network. press contact, manages public relations and affairs - Forum admin + Forum admin cervantes manage the public user forum @@ -81,12 +81,12 @@ network. manage the public project website content design - Webserver admin + Webserver admin welterde manage the public project webservers - Website admin + Website admin [vacant] manage the public project website content @@ -108,47 +108,47 @@ network. lead dev for the SDK and router - I2P mail lead + I2P mail lead postman organize and develop the i2p mail system - I2Host lead + I2Host lead sponge I2Host addressbook application - BOB lead + BOB lead sponge Basic Open Bridge - I2P-Bote lead + I2P-Bote lead HungryHobo I2PBote plugin - Robert lead + Robert lead sponge Robert BitTorrent client - I2Phex lead + I2Phex lead [vacant] I2Phex Gnutella client - I2PSnark lead + I2PSnark lead zzz Maintains the integrated Bittorrent client - iMule lead + iMule lead [vacant] eMule client over I2P - Syndie lead + Syndie lead [vacant] Syndie development From a9b34ce7ad2aaa242e4fea8ab5eda3da5b4f3e83 Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 13:12:54 +0000 Subject: [PATCH 181/317] Updated links in support/* --- i2p2www/pages/site/support/faq.html | 27 +++++++++---------- .../site/support/performance/future.html | 2 +- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/i2p2www/pages/site/support/faq.html b/i2p2www/pages/site/support/faq.html index e7705af6..82941ca6 100644 --- a/i2p2www/pages/site/support/faq.html +++ b/i2p2www/pages/site/support/faq.html @@ -49,7 +49,7 @@

      What systems will I2P run on? (link)

      -

      While I2P has been reported to run PCs as meagre as a low-end Pentium II with 64 MB of RAM, you'll have a much better experience on a Pentium III (or better) with 128MB of RAM (or more). A chart comparing the performance of the various JREs can be found at http://trac.i2p2.de/wiki/java, but in short: it's at all possible, use Sun/Oracle Java or OpenJDK.

      +

      While I2P has been reported to run PCs as meagre as a low-end Pentium II with 64 MB of RAM, you'll have a much better experience on a Pentium III (or better) with 128MB of RAM (or more). A chart comparing the performance of the various JREs can be found at http://{{ i2pconv('trac.i2p2.i2p') }}/wiki/java, but in short: it's at all possible, use Sun/Oracle Java or OpenJDK.

      I2P has been tested on Windows, Linux, FreeBSD (see the note below), OSX, and OpenSolaris. There is work underway to bring I2P to the Android platform.

      @@ -58,8 +58,8 @@ Here are some places, pick one or more.

      @@ -97,7 +97,7 @@ We do not know if or when jrandom will return. The *.i2p.net domains were left in a non-functioning state after a power outage at the hosting company.

      See this page for jrandom's parting message and additional information - on the migration of *.i2p.net to this website.

      + on the migration of *.i2p.net to this website.

      I2P remains in active development.

      My router is using too much CPU?!? @@ -198,13 +198,13 @@ All routers adjust dynamically to changing network conditions and demands. If you are running release 0.6.1.31 or later, you probably don't need to do this. If you are running release 0.6.1.26 or earlier, either follow the manual reseed instructions below - or install the latest release. + or install the latest release. Possible alternate method - add wrapper.java.additional.5=-Di2p.reseedURL=http://netdb.i2p2.de/ to wrapper.config, shutdown the router completely, then start again, then click "reseed". Let us know if this works.

      -

      ...but you *really* should upgrade to the latest version.

      +

      ...but you *really* should upgrade to the latest version.

      My router has very few active peers, is this OK? (link)

      @@ -261,7 +261,7 @@ The best way to stay "better-connected" to the network is to h2ik's for the address. + See this forum post of h2ik's for the address. Make sure Shared Client, Delay Connect, AutoStart are checked. Other options should be left at the defaults. Click Save. In tunnel manger, click the Start button next to your new tunnel.
    • In firefox, click through Tools>Options>Advanced>Network>Setting. @@ -284,7 +284,7 @@ The best way to stay "better-connected" to the network is to zzz.i2p. + There is additional discussion about this on zzz.i2p.

      How do I access IRC, BitTorrent, or other services on the regular Internet? @@ -301,7 +301,7 @@ The best way to stay "better-connected" to the network is to perv.i2p tracks active eepsites. + perv.i2p tracks active eepsites.

      How do I set up my own eepsite? @@ -332,15 +332,14 @@ keeps you well-integrated in the network and helps your own transfer speeds.

      I2P is a work in progress. Lots of improvements and fixes are being implemented, and generally speaking, running the latest release will help your performance. -If you haven't, install the latest release. +If you haven't, install the latest release.

      Bittorrent / I2PSnark / Azureus I2P Plugin Questions? (link)

      See the -I2P Bittorrent FAQ -(outside I2P) +I2P Bittorrent FAQ

      How do I connect to IRC within I2P? (link)

      @@ -426,7 +425,7 @@ router advanced configuration option i2cp.tcp.bindAllInterfaces=true an extremely dangerous.

      If you would like more information on the socks proxy application anyway, - there are some helpful hints on the socks page. + there are some helpful hints on the socks page.

      What ports does I2P use? @@ -639,7 +638,7 @@ click Shutdown, wait 11 minutes, then start I2P.

      (link)

      Great! Find us on IRC irc.freenode.net #i2p or post to - the forum (within I2P) and we'll post it here (with + the forum (within I2P) and we'll post it here (with the answer, hopefully).

      {% endblock %} diff --git a/i2p2www/pages/site/support/performance/future.html b/i2p2www/pages/site/support/performance/future.html index a07d3571..95bdafbe 100644 --- a/i2p2www/pages/site/support/performance/future.html +++ b/i2p2www/pages/site/support/performance/future.html @@ -115,6 +115,6 @@ bandwidth, latency, and CPU usage.

    Additional ideas for improving the streaming library are described on the -streaming library page. +streaming library page.

    {% endblock %} From f7c84f3473d0c21eebda9daa9d2ad572b8ba4059 Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 15 Dec 2012 21:57:32 +0000 Subject: [PATCH 182/317] Removed duplicate links from footer, and added theme changing links --- i2p2www/__init__.py | 9 ++++++++- i2p2www/pages/global/footer.html | 24 +++++++++++------------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 5341abdf..ff1b73ae 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -153,8 +153,15 @@ def utility_processor(): args['page'] = page return url_for(request.endpoint, **args) + # Change the theme of the current page + def change_theme(theme): + args = request.view_args.copy() + args['theme'] = theme + return url_for(request.endpoint, **args) + return dict(i2pconv=convert_url_to_clearnet, - url_for_other_page=url_for_other_page) + url_for_other_page=url_for_other_page, + change_theme=change_theme) ################ diff --git a/i2p2www/pages/global/footer.html b/i2p2www/pages/global/footer.html index dda9b768..9edbab19 100644 --- a/i2p2www/pages/global/footer.html +++ b/i2p2www/pages/global/footer.html @@ -1,18 +1,14 @@
    -

    {{ _('About I2P') }}

    - -
    -

    {{ _('Mirrors') }}

    -
    +

    {{ _('Secure') }}

    -
    +

    {{ _('Misc.') }}

    -
    +

    {{ _('T-Shirts!') }}

    +
    + From 1f65a8110eda38e28bf1f538f8bc666d38ec457e Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 17 Dec 2012 19:55:08 +0000 Subject: [PATCH 183/317] Migrated over 0.9.4 release page --- i2p2www/blog/2012/12/17/I2P_0.9.4_released.rst | 6 ++++++ .../pages => i2p2www/blog/2012/12/17}/release-0.9.4.html | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 i2p2www/blog/2012/12/17/I2P_0.9.4_released.rst rename {www.i2p2/pages => i2p2www/blog/2012/12/17}/release-0.9.4.html (96%) diff --git a/i2p2www/blog/2012/12/17/I2P_0.9.4_released.rst b/i2p2www/blog/2012/12/17/I2P_0.9.4_released.rst new file mode 100644 index 00000000..c7ae40cf --- /dev/null +++ b/i2p2www/blog/2012/12/17/I2P_0.9.4_released.rst @@ -0,0 +1,6 @@ +============= +0.9.4 Release +============= + +.. raw:: html + :file: blog/2012/12/17/release-0.9.4.html diff --git a/www.i2p2/pages/release-0.9.4.html b/i2p2www/blog/2012/12/17/release-0.9.4.html similarity index 96% rename from www.i2p2/pages/release-0.9.4.html rename to i2p2www/blog/2012/12/17/release-0.9.4.html index 7945a92a..3ce2459c 100644 --- a/www.i2p2/pages/release-0.9.4.html +++ b/i2p2www/blog/2012/12/17/release-0.9.4.html @@ -1,7 +1,3 @@ -{% extends "_layout.html" %} -{% block title %}0.9.4 Release{% endblock %} -{% block content %} -

    0.9.4 includes a fix for a network capacity bug, introduced in 0.9.2, that was reducing network performance and reliability. It also includes major changes in the in-network update system, and adds the capability @@ -67,5 +63,3 @@ SHA256 Checksums:

    - -{% endblock %} From b8a1626b163a3830d8de3aa411a6eb3cdb1e6733 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 17 Dec 2012 20:33:43 +0000 Subject: [PATCH 184/317] Fix after merge --- i2p2www/pages/downloads/list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i2p2www/pages/downloads/list.html b/i2p2www/pages/downloads/list.html index fa7f7261..8dfaac62 100644 --- a/i2p2www/pages/downloads/list.html +++ b/i2p2www/pages/downloads/list.html @@ -119,7 +119,7 @@ receive the release.

    Updates from earlier releases (manual method):

      -
    1. Download i2pupdate_0.9.4.zip +
    2. Download i2pupdate_{{ ver() }}.zip (SHA256 0f369d9b85793f157ec67c4d59723a2ad0c1de2a0902d35e11c26a2c74add824 sig) to your I2P From 0a5b848f953405b206ffe9f9e99ee7b1ccfa4a67 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 17 Dec 2012 20:35:52 +0000 Subject: [PATCH 185/317] 0.9.4 --- i2p2www/pages/global/macros | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i2p2www/pages/global/macros b/i2p2www/pages/global/macros index a1470155..52783c00 100644 --- a/i2p2www/pages/global/macros +++ b/i2p2www/pages/global/macros @@ -15,8 +15,8 @@ {%- endmacro -%} {%- macro ver(string=None) -%} -{%- if string -%}{{ string % '0.9.3' }} -{%- else -%}{{ '0.9.3' }} +{%- if string -%}{{ string % '0.9.4' }} +{%- else -%}{{ '0.9.4' }} {%- endif -%} {%- endmacro -%} From 6772b465636513d9bad31217a7cb9c566ea25cb1 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 17 Dec 2012 21:21:47 +0000 Subject: [PATCH 186/317] Migrated over meetings 211 and 212 --- .../meetings/211.log | 35 ------------------- i2p2www/meetings/211.rst | 19 ++++++++++ .../meetings/212.log | 33 ----------------- i2p2www/meetings/212.rst | 17 +++++++++ 4 files changed, 36 insertions(+), 68 deletions(-) rename www.i2p2/pages/meeting211.html => i2p2www/meetings/211.log (96%) create mode 100644 i2p2www/meetings/211.rst rename www.i2p2/pages/meeting212.html => i2p2www/meetings/212.log (89%) create mode 100644 i2p2www/meetings/212.rst diff --git a/www.i2p2/pages/meeting211.html b/i2p2www/meetings/211.log similarity index 96% rename from www.i2p2/pages/meeting211.html rename to i2p2www/meetings/211.log index 62d4f38e..0845fd1e 100644 --- a/www.i2p2/pages/meeting211.html +++ b/i2p2www/meetings/211.log @@ -1,33 +1,3 @@ -{% extends "_layout.html" %} -{% block title %}I2P Development Meeting 211{% endblock %} -{% block content %}

      I2P dev meeting, December 4, 2012 @ 20:00 UTC

      -
      -

      Quick recap

      -
        -
      • Present: - - dg, - hottuna, - KillYourTV, - lillith, - Meeh, - psi, - str4d, - weltende, - zzz -
      • -
      • - Next Meeting -

        - The next meeting is scheduled for Tuesday, December 11 @ 20:00 UTC (8:00PM) -

        -
      • -
      -
      -
      -

      Full IRC Log

      -
      -{% filter escape %}
       20:18:53  * KillYourTV has noticed that we're 17 minutes into the meeting...and we're off to a quiet start...
       20:19:31   i was wondering that, did i also get the wrong time or something?
       20:20:23  * dg is waiting for self to be free
      @@ -261,8 +231,3 @@
       22:28:10  * psi lag
       22:28:55   Meeh, to be decided, maybe before since this one wasn't a great success
       22:29:25   true true, next week then
      -{% endfilter %}
      -{# TODO: pygments #}
      -
      -
      -{% endblock %} diff --git a/i2p2www/meetings/211.rst b/i2p2www/meetings/211.rst new file mode 100644 index 00000000..c0746a65 --- /dev/null +++ b/i2p2www/meetings/211.rst @@ -0,0 +1,19 @@ +I2P dev meeting, December 4, 2012 @ 20:00 UTC +============================================== + +Quick recap +----------- + +* **Present:** + dg, + hottuna, + KillYourTV, + lillith, + Meeh, + psi, + str4d, + weltende, + zzz + +* **Next Meeting** + The next meeting is scheduled for Tuesday, December 11 @ 20:00 UTC (8:00PM) diff --git a/www.i2p2/pages/meeting212.html b/i2p2www/meetings/212.log similarity index 89% rename from www.i2p2/pages/meeting212.html rename to i2p2www/meetings/212.log index e82fa34a..23a705cc 100644 --- a/www.i2p2/pages/meeting212.html +++ b/i2p2www/meetings/212.log @@ -1,31 +1,3 @@ -{% extends "_layout.html" %} -{% block title %}I2P Development Meeting 212{% endblock %} -{% block content %}

      I2P dev meeting, December 11, 2012 @ 20:00 UTC

      -
      -

      Quick recap

      -
        -
      • Present: - - lillith, - Meeh, - postman, - psi, - str4d, - topiltzin, - zzz -
      • -
      • - Next Meeting -

        - The next meeting is scheduled for Tuesday, December 18 @ 20:00 UTC (8:00PM) -

        -
      • -
      -
      -
      -

      Full IRC Log

      -
      -{% filter escape %}
       20:20:09    Not sure where dg is, so I propose that we get the meeting started anyway, continuing on with the agenda from last week (or restarting it if necessary).
       20:20:09   (http://zzz.i2p/posts/5779)
       20:20:18   Title: zzz.i2p: IRC Meetings (at zzz.i2p)
      @@ -99,8 +71,3 @@
       22:07:     i'l leave this to dg , presumably it will be 8.00 UTC next tuesday (18th)
       22:08:     topiltzin, i'l take a look
       22:09:     I'd say this meeting is now officially over then :)
      -{% endfilter %}
      -{# TODO: pygments #}
      -
      -
      -{% endblock %} diff --git a/i2p2www/meetings/212.rst b/i2p2www/meetings/212.rst new file mode 100644 index 00000000..8502917d --- /dev/null +++ b/i2p2www/meetings/212.rst @@ -0,0 +1,17 @@ +I2P dev meeting, December 11, 2012 @ 20:00 UTC +=============================================== + +Quick recap +----------- + +* **Present:** + lillith, + Meeh, + postman, + psi, + str4d, + topiltzin, + zzz + +* **Next Meeting** + The next meeting is scheduled for Tuesday, December 18 @ 20:00 UTC (8:00PM) From a665d6153fc45494ef7ca0da39884886c98fe61b Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 17 Dec 2012 21:31:55 +0000 Subject: [PATCH 187/317] 500 error page should have minimal reliance on the backend (so it doesn't error itself) --- i2p2www/pages/global/error_500.html | 33 ++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/i2p2www/pages/global/error_500.html b/i2p2www/pages/global/error_500.html index c6cc1159..e96680d0 100644 --- a/i2p2www/pages/global/error_500.html +++ b/i2p2www/pages/global/error_500.html @@ -1,12 +1,21 @@ -{% extends "global/layout.html" %} -{% block title -%} -{% trans -%} -Server error -{%- endtrans %} -{%- endblock %} - -{% block content %} -{% trans -%} -Umm... the server encountered some sort of error. -{%- endtrans %} -{% endblock %} + + + + + {% trans %}Server error{% endtrans %} - I2P + + + + + +
      +

      I2P

      +
      {% trans %}500 Server error{% endtrans %}
      +
      +
      +
      + {% trans %}Umm... the server encountered some sort of error.{% endtrans %} +
      +
      + + From 68ce69fdd1b0c4570a78fb7937c3e4dd54056b60 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 17 Dec 2012 21:36:43 +0000 Subject: [PATCH 188/317] Add title to blog ATOM feed link on front page --- i2p2www/pages/site/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i2p2www/pages/site/index.html b/i2p2www/pages/site/index.html index daa5dfed..1b6820f1 100644 --- a/i2p2www/pages/site/index.html +++ b/i2p2www/pages/site/index.html @@ -48,7 +48,7 @@
    - I2P Blog ATOM Feed + I2P Blog ATOM Feed

    {% trans %}News & Updates{% endtrans %}

    {% include "blog/latest.html" %}
    From 262040fd301db4b1af50af3bc135a28e5e29dd2e Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 17 Dec 2012 21:59:41 +0000 Subject: [PATCH 189/317] Tweaked mirror code so mirror urls can contain the current I2P version, added Launchpad as HTTPS mirror NOTE: this enables mirrors that require a version string to download the current version of files. Older file versions will *not* be downloadable (that would require parsing the requested filename to try and find a version). Hey, it's better than no support at all =) --- i2p2www/__init__.py | 16 +++++++++++++--- i2p2www/pages/downloads/mirrors | 7 ++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index ff1b73ae..e1a572c5 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -16,6 +16,8 @@ except ImportError: from helpers import Pagination +CURRENT_I2P_VERSION = '0.9.4' + TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'pages') STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static') @@ -406,13 +408,17 @@ def downloads_select(file): if (file == 'debian'): return render_template('downloads/debian.html') mirrors=read_mirrors() + data = { + 'version': CURRENT_I2P_VERSION, + 'file': file, + } obj=[] for protocol in mirrors.keys(): a={} a['name']=protocol a['mirrors']=mirrors[protocol] for mirror in a['mirrors']: - mirror['url']=mirror['url'] % file + mirror['url']=mirror['url'] % data obj.append(a) return render_template('downloads/select.html', mirrors=obj, file=file) @@ -423,9 +429,13 @@ def downloads_redirect(protocol, file, mirror): if not protocol in mirrors: abort(404) mirrors=mirrors[protocol] + data = { + 'version': CURRENT_I2P_VERSION, + 'file': file, + } if mirror: - return redirect(mirrors[mirror]['url'] % file) - return redirect(mirrors[randint(0, len(mirrors) - 1)]['url'] % file) + return redirect(mirrors[mirror]['url'] % data) + return redirect(mirrors[randint(0, len(mirrors) - 1)]['url'] % data) ##################### diff --git a/i2p2www/pages/downloads/mirrors b/i2p2www/pages/downloads/mirrors index 82ab9b31..b3368578 100644 --- a/i2p2www/pages/downloads/mirrors +++ b/i2p2www/pages/downloads/mirrors @@ -1,3 +1,4 @@ -{"url": "http://i2p.googlecode.com/files/%s", "org": "Google Code", "org_url": "http://code.google.com", "protocol": "http", "country": "us"} -{"url": "http://golden.mtveurope.org/~yang/i2p_mirror/%s", "org": "VServer.si", "org_url": "http://www.vserver.si", "protocol": "http", "country": "lu"} -{"url": "http://a.mirror.geti2p.net/releases/current/%s", "org": "welterde", "protocol": "http", "country": "de"} +{"url": "http://i2p.googlecode.com/files/%(file)s", "org": "Google Code", "org_url": "http://code.google.com", "protocol": "http", "country": "us"} +{"url": "http://golden.mtveurope.org/~yang/i2p_mirror/%(file)s", "org": "VServer.si", "org_url": "http://www.vserver.si", "protocol": "http", "country": "lu"} +{"url": "http://a.mirror.geti2p.net/releases/current/%(file)s", "org": "welterde", "protocol": "http", "country": "de"} +{"url": "https://launchpad.net/i2p/trunk/%(version)s/+download/%(file)s", "org": "Launchpad", "org_url": "https://launchpad.net", "protocol": "https", "country": "us"} From 9acb01be7a7dc3ded60bd32c982786301cf1e6a1 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 17 Dec 2012 22:19:39 +0000 Subject: [PATCH 190/317] Added Google Code as an HTTPS mirror, sorted mirrors file by org --- i2p2www/pages/downloads/mirrors | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/i2p2www/pages/downloads/mirrors b/i2p2www/pages/downloads/mirrors index b3368578..4913ac68 100644 --- a/i2p2www/pages/downloads/mirrors +++ b/i2p2www/pages/downloads/mirrors @@ -1,4 +1,5 @@ {"url": "http://i2p.googlecode.com/files/%(file)s", "org": "Google Code", "org_url": "http://code.google.com", "protocol": "http", "country": "us"} +{"url": "https://i2p.googlecode.com/files/%(file)s", "org": "Google Code", "org_url": "https://code.google.com", "protocol": "https", "country": "us"} +{"url": "https://launchpad.net/i2p/trunk/%(version)s/+download/%(file)s", "org": "Launchpad", "org_url": "https://launchpad.net", "protocol": "https", "country": "us"} {"url": "http://golden.mtveurope.org/~yang/i2p_mirror/%(file)s", "org": "VServer.si", "org_url": "http://www.vserver.si", "protocol": "http", "country": "lu"} {"url": "http://a.mirror.geti2p.net/releases/current/%(file)s", "org": "welterde", "protocol": "http", "country": "de"} -{"url": "https://launchpad.net/i2p/trunk/%(version)s/+download/%(file)s", "org": "Launchpad", "org_url": "https://launchpad.net", "protocol": "https", "country": "us"} From 18e26d6cc3dd3494eaa8aafbe671a895b653d6ec Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 18 Dec 2012 00:42:19 +0000 Subject: [PATCH 191/317] Replace half of .inner padding with margin -> adds side border to all pages --- i2p2www/static/styles/duck.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i2p2www/static/styles/duck.css b/i2p2www/static/styles/duck.css index 64a0992a..66fcc14f 100644 --- a/i2p2www/static/styles/duck.css +++ b/i2p2www/static/styles/duck.css @@ -237,7 +237,7 @@ div#content .main { * The .inner class is for the content wrapper on inner pages (as opposed to the home page) */ div#content .inner { - width:auto; padding: 4em 10%; position:relative; + width:auto; margin: 0 5%; padding: 4em 5%; position:relative; background: rgba(171, 204, 113, 0.6); border-top:2px solid #abcc71; color:black; font-size:1.2em; line-height:1.4em; } From 32db04d701b77c2485abfa762cec66c5cab20777 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 18 Dec 2012 00:44:54 +0000 Subject: [PATCH 192/317] Rounded bottom corners of .lastupdated box --- i2p2www/static/styles/duck.css | 1 + 1 file changed, 1 insertion(+) diff --git a/i2p2www/static/styles/duck.css b/i2p2www/static/styles/duck.css index 66fcc14f..8d36404a 100644 --- a/i2p2www/static/styles/duck.css +++ b/i2p2www/static/styles/duck.css @@ -225,6 +225,7 @@ div#content .main { div#content .lastupdated { background-color: #ffffdd; + border-radius: 0 0 5px 5px; padding: 2px 4px; position: absolute; right: 10%; From 914492e6259b0d37278dcc865da7c30b245bc61d Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 01:47:48 +0000 Subject: [PATCH 193/317] Moved the last few unsorted pages into misc/ (and ports into docs/) --- {www.i2p2/pages => i2p2www/pages/site/docs}/ports.html | 8 ++++---- .../pages/site/misc}/i2ptunnel_services.html | 2 +- {www.i2p2/pages => i2p2www/pages/site/misc}/jbigi.html | 9 ++++----- .../pages => i2p2www/pages/site/misc}/manualwrapper.html | 4 ++-- {www.i2p2/pages => i2p2www/pages/site/misc}/minwww.html | 4 ++-- .../pages => i2p2www/pages/site/misc}/ratestats.html | 2 +- 6 files changed, 14 insertions(+), 15 deletions(-) rename {www.i2p2/pages => i2p2www/pages/site/docs}/ports.html (92%) rename {www.i2p2/pages => i2p2www/pages/site/misc}/i2ptunnel_services.html (99%) rename {www.i2p2/pages => i2p2www/pages/site/misc}/jbigi.html (96%) rename {www.i2p2/pages => i2p2www/pages/site/misc}/manualwrapper.html (95%) rename {www.i2p2/pages => i2p2www/pages/site/misc}/minwww.html (99%) rename {www.i2p2/pages => i2p2www/pages/site/misc}/ratestats.html (99%) diff --git a/www.i2p2/pages/ports.html b/i2p2www/pages/site/docs/ports.html similarity index 92% rename from www.i2p2/pages/ports.html rename to i2p2www/pages/site/docs/ports.html index 557746d0..22dcfd89 100644 --- a/www.i2p2/pages/ports.html +++ b/i2p2www/pages/site/docs/ports.html @@ -1,5 +1,7 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}Ports Used by I2P{% endblock %} +{% block lastupdated %}May 2012{% endblock %} +{% block accuratefor %}0.9{% endblock %} {% block content %}

    @@ -7,10 +9,8 @@ These are the ports used or reserved by I2P, including those for known plugins, common alternates, and some typical related applications.

    -Updated May 2012, current for router version 0.9. -

    Note that many of these are not enabled by default. -There is more information in the FAQ. +There is more information in the FAQ. See also the documentation for individual plugins. Plugin authors please add any ports you use here. For new plugins, we recommend using the next available port diff --git a/www.i2p2/pages/i2ptunnel_services.html b/i2p2www/pages/site/misc/i2ptunnel_services.html similarity index 99% rename from www.i2p2/pages/i2ptunnel_services.html rename to i2p2www/pages/site/misc/i2ptunnel_services.html index 507cdf2b..a9e9433a 100644 --- a/www.i2p2/pages/i2ptunnel_services.html +++ b/i2p2www/pages/site/misc/i2ptunnel_services.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}i2ptunnel services{% endblock %} {% block content %}Below is quick copy of aum's eepsite deployment guide.
    diff --git a/www.i2p2/pages/jbigi.html b/i2p2www/pages/site/misc/jbigi.html similarity index 96% rename from www.i2p2/pages/jbigi.html rename to i2p2www/pages/site/misc/jbigi.html index 47747a4d..5a123c5b 100644 --- a/www.i2p2/pages/jbigi.html +++ b/i2p2www/pages/site/misc/jbigi.html @@ -1,9 +1,8 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}jbigi{% endblock %} +{% block lastupdated %}August 2011{% endblock %} +{% block accuratefor %}0.8.7{% endblock %} {% block content %} - -Updated August 2011, current as of router version 0.8.7 -

    Overview

    Using JNI (Java Native Interface), a bit of C code (thanks ugha!), a little manual work and a piece of chewing gum we have made several @@ -77,7 +76,7 @@ If your encrypt time is less than 50ms for a relatively new processor, or less t for an older processor, and the native BigInteger library was loaded, you are probably fine.

  • Get the latest released source code of I2P from -the download page, or get the cutting-edge source +the download page, or get the cutting-edge source out of the monotone database mtn.i2p2.de
  • Inside the source tree change directory to: core/c/jbigi
  • Read the README file. diff --git a/www.i2p2/pages/manualwrapper.html b/i2p2www/pages/site/misc/manualwrapper.html similarity index 95% rename from www.i2p2/pages/manualwrapper.html rename to i2p2www/pages/site/misc/manualwrapper.html index b2c71411..3aba9b90 100644 --- a/www.i2p2/pages/manualwrapper.html +++ b/i2p2www/pages/site/misc/manualwrapper.html @@ -1,9 +1,9 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}Manually Installing the Java Wrapper{% endblock %} {% block content %}

    Manually Installing the Java Wrapper

    -

    The installation package for the I2P router comes +

    The installation package for the I2P router comes with a Java wrapper for the most common architectures. If your system is not supported by our installer—or if you want to update the wrapper to a newer version—the following steps describe installing the wrapper manually. diff --git a/www.i2p2/pages/minwww.html b/i2p2www/pages/site/misc/minwww.html similarity index 99% rename from www.i2p2/pages/minwww.html rename to i2p2www/pages/site/misc/minwww.html index 2fc32768..a4307741 100644 --- a/www.i2p2/pages/minwww.html +++ b/i2p2www/pages/site/misc/minwww.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}minwww{% endblock %} {% block content %}

    Here's an outline and rationale for a minimal WWW proxy app for use over I2P.

    @@ -100,4 +100,4 @@ size, but that's going to be going away since it involves either excessive memor overhead on intermediary routers, or additional implementation details to handle. I2PTunnel is currently limited to 128KB and hasn't been a burden, so perhaps it could be increased to 256KB when the I2CP spec is updated)

    -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/www.i2p2/pages/ratestats.html b/i2p2www/pages/site/misc/ratestats.html similarity index 99% rename from www.i2p2/pages/ratestats.html rename to i2p2www/pages/site/misc/ratestats.html index e51b0c01..83cd79b7 100644 --- a/www.i2p2/pages/ratestats.html +++ b/i2p2www/pages/site/misc/ratestats.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}RateStat list{% endblock %} {% block content %}

    RateStat list

    From db3a7de35d46f126aa8a6fbd64020890a4080933 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 01:58:58 +0000 Subject: [PATCH 194/317] Moved the old (but not replaced) pages into misc/ --- .../old => i2p2www/pages/site/misc}/clt.html | 2 +- .../old => i2p2www/pages/site/misc}/cvs.html | 4 ++-- .../pages/site/misc}/i2ptunnel_migration.html | 4 ++-- i2p2www/pages/site/misc/invisiblenet.html | 23 +++++++++++++++++++ .../pages/site/misc}/jrandom-awol.html | 2 +- .../pages/site/misc}/myi2p.html | 8 +++---- .../pages/site/misc}/transition-guide.html | 6 ++--- .../pages/site/misc}/transition-guide.txt | 0 .../pages/site/misc}/upgrade-0.6.1.30.html | 6 ++--- www.i2p2/pages/old/invisiblenet.html | 23 ------------------- 10 files changed, 39 insertions(+), 39 deletions(-) rename {www.i2p2/pages/old => i2p2www/pages/site/misc}/clt.html (96%) rename {www.i2p2/pages/old => i2p2www/pages/site/misc}/cvs.html (88%) rename {www.i2p2/pages/old => i2p2www/pages/site/misc}/i2ptunnel_migration.html (97%) create mode 100644 i2p2www/pages/site/misc/invisiblenet.html rename {www.i2p2/pages/old => i2p2www/pages/site/misc}/jrandom-awol.html (98%) rename {www.i2p2/pages/old => i2p2www/pages/site/misc}/myi2p.html (86%) rename {www.i2p2/pages/old => i2p2www/pages/site/misc}/transition-guide.html (80%) rename {www.i2p2/pages/old => i2p2www/pages/site/misc}/transition-guide.txt (100%) rename {www.i2p2/pages/old => i2p2www/pages/site/misc}/upgrade-0.6.1.30.html (93%) delete mode 100644 www.i2p2/pages/old/invisiblenet.html diff --git a/www.i2p2/pages/old/clt.html b/i2p2www/pages/site/misc/clt.html similarity index 96% rename from www.i2p2/pages/old/clt.html rename to i2p2www/pages/site/misc/clt.html index 0532fdee..9a529f74 100644 --- a/www.i2p2/pages/old/clt.html +++ b/i2p2www/pages/site/misc/clt.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}I2P at CLT and PetCon 2009.1{% endblock %} {% block content %}

    Members of I2P will held a talk at CLT and PetCon 2009.1

    Two members of the I2P team will be at two forthcoming Linux day and security convention. diff --git a/www.i2p2/pages/old/cvs.html b/i2p2www/pages/site/misc/cvs.html similarity index 88% rename from www.i2p2/pages/old/cvs.html rename to i2p2www/pages/site/misc/cvs.html index 26f93a9f..52365d9d 100644 --- a/www.i2p2/pages/old/cvs.html +++ b/i2p2www/pages/site/misc/cvs.html @@ -1,6 +1,6 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}CVS{% endblock %} -{% block content %}

    The I2P sourcecode was kept in a CVS repository. Nowadays it is kept in an Monotone repository. +{% block content %}

    The I2P sourcecode was kept in a CVS repository. Nowadays it is kept in an Monotone repository. For those who aren't very familiar with CVS, there is a fantastic book on the subject (developers only need to deal with the first chapter - "An Overview of diff --git a/www.i2p2/pages/old/i2ptunnel_migration.html b/i2p2www/pages/site/misc/i2ptunnel_migration.html similarity index 97% rename from www.i2p2/pages/old/i2ptunnel_migration.html rename to i2p2www/pages/site/misc/i2ptunnel_migration.html index 888ce4ab..0c5fa751 100644 --- a/www.i2p2/pages/old/i2ptunnel_migration.html +++ b/i2p2www/pages/site/misc/i2ptunnel_migration.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}i2ptunnel migration{% endblock %} {% block content %}

    I2PTunnel migration:

    @@ -41,4 +41,4 @@ existing tunnels and rebuild new ones)

    into the network before you are able to use the /i2ptunnel/ web interface. It will say "Please be patient" if you try to beforehand, which means that it is still trying to build the -necessary I2PTunnel sessions it has been configured to create.

    {% endblock %} \ No newline at end of file +necessary I2PTunnel sessions it has been configured to create.

    {% endblock %} diff --git a/i2p2www/pages/site/misc/invisiblenet.html b/i2p2www/pages/site/misc/invisiblenet.html new file mode 100644 index 00000000..5c2c7a10 --- /dev/null +++ b/i2p2www/pages/site/misc/invisiblenet.html @@ -0,0 +1,23 @@ +{% extends "global/layout.html" %} +{% block title %}Old Documents{% endblock %} +{% block content %} + +Following is a list of documents originally on www.invisiblenet.net/i2p/ and +rescued via the +Wayback Machine. +They are quite dated and may or may not be accurate. +However, the I2CP and I2NP documents in particular have some good information. + + +

    Index of /i2p

    +
    Name                    Last modified       Size
    +
    +I2CP_spec.pdf 03-Sep-2003 12:49 119k +I2NP_spec.pdf 03-Sep-2003 12:49 356k +datastructures.pdf 03-Sep-2003 12:49 149k +i2p_philosophy.pdf 03-Sep-2003 12:52 126k +polling_http_transpo..> 03-Sep-2003 12:49 189k +
    + + +{% endblock %} diff --git a/www.i2p2/pages/old/jrandom-awol.html b/i2p2www/pages/site/misc/jrandom-awol.html similarity index 98% rename from www.i2p2/pages/old/jrandom-awol.html rename to i2p2www/pages/site/misc/jrandom-awol.html index 5ca4aff9..a5ea40c6 100644 --- a/www.i2p2/pages/old/jrandom-awol.html +++ b/i2p2www/pages/site/misc/jrandom-awol.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}Jrandom's Announcement{% endblock %} {% block content %} The following message was received in mid-November 2007. We have no further information diff --git a/www.i2p2/pages/old/myi2p.html b/i2p2www/pages/site/misc/myi2p.html similarity index 86% rename from www.i2p2/pages/old/myi2p.html rename to i2p2www/pages/site/misc/myi2p.html index 4daf83c2..e78b1b93 100644 --- a/www.i2p2/pages/old/myi2p.html +++ b/i2p2www/pages/site/misc/myi2p.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}MYI2P{% endblock %} {% block content %}

    There has been discussion about a distributed blogging application for a few months now called "MyI2P". While the original discussions were lost, we were @@ -8,7 +8,7 @@ that ensued.

    The application itself is not yet implemented, and the ideas behind it have been made less ambitious over time, but they are still valid and the current -plan is to have the core MyI2P functionality available +plan is to have the core MyI2P functionality available along side the I2P 1.0 release. That will include a distributed address book to enable secure, distributed, and human readable naming by sacrificing the need for global uniqueness - basically everyone has their own local address book @@ -19,7 +19,7 @@ system using a reduced and secured subset of bbcode to essentially provide an anonymous LiveJournal with a 'friends list' and transparent access control (authenticated by the I2P -datagrams with rules defined based on the address book).

    +datagrams with rules defined based on the address book).

    Additional functionality, such as integration with a DHT backing store or swarming file transfers for 'attachments' can be added later. Email may or may @@ -27,4 +27,4 @@ not get in the first pass either, though its implementation is essentially just a blog entry with private access, so perhaps some UI designer can come up with something. Exporting the data to RSS or access through ATOM will be an option down the road as well.

    -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/www.i2p2/pages/old/transition-guide.html b/i2p2www/pages/site/misc/transition-guide.html similarity index 80% rename from www.i2p2/pages/old/transition-guide.html rename to i2p2www/pages/site/misc/transition-guide.html index 0f10d1c8..4480f02d 100644 --- a/www.i2p2/pages/old/transition-guide.html +++ b/i2p2www/pages/site/misc/transition-guide.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}Monotone{% endblock %} {% block content %}

    The I2P sourcecode is kept in several distributed monotone repositories. See the @@ -8,7 +8,7 @@ See this forum post on i2p monotone for more information on how to get started and check out the source anonymously. There is also a quick-start guide on the -new developer's page. +new developer's page.

    @@ -21,7 +21,7 @@ The i2p source code branch is "i2p.i2p". The following is a detailed guide by Complication.

    -  {% include "transition-guide.txt" %}
    +  {% include "site/misc/transition-guide.txt" %}
     
    {% endblock %} diff --git a/www.i2p2/pages/old/transition-guide.txt b/i2p2www/pages/site/misc/transition-guide.txt similarity index 100% rename from www.i2p2/pages/old/transition-guide.txt rename to i2p2www/pages/site/misc/transition-guide.txt diff --git a/www.i2p2/pages/old/upgrade-0.6.1.30.html b/i2p2www/pages/site/misc/upgrade-0.6.1.30.html similarity index 93% rename from www.i2p2/pages/old/upgrade-0.6.1.30.html rename to i2p2www/pages/site/misc/upgrade-0.6.1.30.html index 5adc7362..0d5b3e2c 100644 --- a/www.i2p2/pages/old/upgrade-0.6.1.30.html +++ b/i2p2www/pages/site/misc/upgrade-0.6.1.30.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "global/layout.html" %} {% block title %}How to Upgrade from 0.6.1.30 and Earlier{% endblock %} {% block content %}

    @@ -6,7 +6,7 @@ 2008-02-05: Upgrading from 0.6.1.30 and Earlier Releases

    Since i2p's lead developer -has gone AWOL, +has gone AWOL, we do not have his update signing key or access to www.i2p[.net] or dev.i2p[.net]. Complication and zzz have generated new signing keys, and they and Amiga are providing @@ -18,7 +18,7 @@ the latest release. We recommend the automated process as it will verify the key of the signed update file. If you do not make these changes, you may manually download the i2pupdate.zip file from -the download page. +the download page.

    1. On configupdate.jsp: diff --git a/www.i2p2/pages/old/invisiblenet.html b/www.i2p2/pages/old/invisiblenet.html deleted file mode 100644 index de48244f..00000000 --- a/www.i2p2/pages/old/invisiblenet.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "_layout.html" %} -{% block title %}Old Documents{% endblock %} -{% block content %} - -Following is a list of documents originally on www.invisiblenet.net/i2p/ and -rescued via the -Wayback Machine. -They are quite dated and may or may not be accurate. -However, the I2CP and I2NP documents in particular have some good information. - - -

      Index of /i2p

      -
      Name                    Last modified       Size
      -
      -I2CP_spec.pdf 03-Sep-2003 12:49 119k -I2NP_spec.pdf 03-Sep-2003 12:49 356k -datastructures.pdf 03-Sep-2003 12:49 149k -i2p_philosophy.pdf 03-Sep-2003 12:52 126k -polling_http_transpo..> 03-Sep-2003 12:49 189k -
      - - -{% endblock %} From e6287d4edb5cff748b44cc323a821a5b9b7e4602 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 02:07:10 +0000 Subject: [PATCH 195/317] Fixed a url-building error on support/faq --- i2p2www/pages/site/support/faq.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i2p2www/pages/site/support/faq.html b/i2p2www/pages/site/support/faq.html index 82941ca6..b455f71c 100644 --- a/i2p2www/pages/site/support/faq.html +++ b/i2p2www/pages/site/support/faq.html @@ -198,13 +198,13 @@ All routers adjust dynamically to changing network conditions and demands. If you are running release 0.6.1.31 or later, you probably don't need to do this. If you are running release 0.6.1.26 or earlier, either follow the manual reseed instructions below - or install the latest release. + or install the latest release. Possible alternate method - add wrapper.java.additional.5=-Di2p.reseedURL=http://netdb.i2p2.de/ to wrapper.config, shutdown the router completely, then start again, then click "reseed". Let us know if this works.

      -

      ...but you *really* should upgrade to the latest version.

      +

      ...but you *really* should upgrade to the latest version.

      My router has very few active peers, is this OK? (link)

      From 766c8059f4cdddf0776f7d0f9d1f71a09abdd91d Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 02:53:11 +0000 Subject: [PATCH 196/317] Keep the current website's title for the front page (to help keep its existing page rank for "anonymous network") --- i2p2www/pages/global/layout.html | 2 +- i2p2www/pages/site/index.html | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/i2p2www/pages/global/layout.html b/i2p2www/pages/global/layout.html index 9c8a7b44..1d71c19f 100644 --- a/i2p2www/pages/global/layout.html +++ b/i2p2www/pages/global/layout.html @@ -3,7 +3,7 @@ - {% block title %}{% endblock %} - I2P + {% block title_outer %}{% block title %}{% endblock %} - I2P{% endblock %} diff --git a/i2p2www/pages/site/index.html b/i2p2www/pages/site/index.html index 1b6820f1..605a0291 100644 --- a/i2p2www/pages/site/index.html +++ b/i2p2www/pages/site/index.html @@ -1,4 +1,5 @@ {% extends "global/layout.html" %} +{% block title_outer %}{% trans %}I2P Anonymous Network{% endtrans %}{% endblock %} {% block title %}{% trans %}The Invisible Internet Project{% endtrans %}{% endblock %} {% block content_outer %}
      From fe4852a9eb11ba625d78d8771d6d81d4728a8f8a Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 04:08:41 +0000 Subject: [PATCH 197/317] Display current language flag next to the Language menu (for easier identification) --- i2p2www/pages/global/lang.html | 2 +- i2p2www/pages/global/nav.html | 2 +- i2p2www/static/images/flags/{us.png => en.png} | Bin 3 files changed, 2 insertions(+), 2 deletions(-) rename i2p2www/static/images/flags/{us.png => en.png} (100%) diff --git a/i2p2www/pages/global/lang.html b/i2p2www/pages/global/lang.html index 8e3d6572..a7f9a9d3 100644 --- a/i2p2www/pages/global/lang.html +++ b/i2p2www/pages/global/lang.html @@ -1,5 +1,5 @@
        -
      • English
      • +
      • English
      • Castellano
      • Chinese
      • Deutsch
      • diff --git a/i2p2www/pages/global/nav.html b/i2p2www/pages/global/nav.html index c4912aac..31b58380 100644 --- a/i2p2www/pages/global/nav.html +++ b/i2p2www/pages/global/nav.html @@ -130,7 +130,7 @@
      • {{ _('Task list') }}
    2. -
    3. {{ _('Language') }} +
    4. {{ _('Language') }} {% include "global/lang.html" %}
    5. diff --git a/i2p2www/static/images/flags/us.png b/i2p2www/static/images/flags/en.png similarity index 100% rename from i2p2www/static/images/flags/us.png rename to i2p2www/static/images/flags/en.png From 8b5633c8810d4ae5abef9fab84c8b5c2906cd04b Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 04:29:43 +0000 Subject: [PATCH 198/317] Added rel="alternate" hreflang="XX" to language changer links AFAICT these attributes are meant to be on tags, but it shouldn't hurt having them here instead (though if it doesn't help and tags need to be added, then this commit should probably be reverted). --- i2p2www/pages/global/lang.html | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/i2p2www/pages/global/lang.html b/i2p2www/pages/global/lang.html index a7f9a9d3..dab824fe 100644 --- a/i2p2www/pages/global/lang.html +++ b/i2p2www/pages/global/lang.html @@ -1,14 +1,14 @@
        -
      • English
      • -
      • Castellano
      • -
      • Chinese
      • -
      • Deutsch
      • -
      • Français
      • -
      • Italiano
      • -
      • Nederlands
      • -
      • Russian
      • -
      • Svenska
      • -
      • Czech
      • -
      • Arabic
      • -
      • Greek
      • +
      • English
      • +
      • Castellano
      • +
      • Chinese
      • +
      • Deutsch
      • +
      • Français
      • +
      • Italiano
      • +
      • Nederlands
      • +
      • Russian
      • +
      • Svenska
      • +
      • Czech
      • +
      • Arabic
      • +
      • Greek
      From c9a4c5e77cb765e4f89491f5add4f40514d8a1c4 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 04:51:36 +0000 Subject: [PATCH 199/317] Add canonical link to of each page --- i2p2www/__init__.py | 10 +++++++++- i2p2www/pages/global/layout.html | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index e1a572c5..328917f5 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -18,6 +18,8 @@ from helpers import Pagination CURRENT_I2P_VERSION = '0.9.4' +CANONICAL_DOMAIN = 'www.i2p2.de' + TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'pages') STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static') @@ -127,6 +129,11 @@ def restructuredtext(value): @app.context_processor def utility_processor(): + # Provide the canonical link to the current page + def get_canonical_link(): + protocol = request.url.split('//')[0] + return protocol + '//' + CANONICAL_DOMAIN + request.path + # Convert an I2P url to an equivalent clearnet one i2ptoclear = { 'www.i2p2.i2p': 'www.i2p2.de', @@ -163,7 +170,8 @@ def utility_processor(): return dict(i2pconv=convert_url_to_clearnet, url_for_other_page=url_for_other_page, - change_theme=change_theme) + change_theme=change_theme, + canonical=get_canonical_link) ################ diff --git a/i2p2www/pages/global/layout.html b/i2p2www/pages/global/layout.html index 1d71c19f..494d2566 100644 --- a/i2p2www/pages/global/layout.html +++ b/i2p2www/pages/global/layout.html @@ -4,6 +4,7 @@ {% block title_outer %}{% block title %}{% endblock %} - I2P{% endblock %} + From 254fab592cf8ce9bdd22f84557340f4db1d6511c Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 04:58:44 +0000 Subject: [PATCH 200/317] Removed "site/" from the main site URLs It seems that Werkzeug doesn't get confused between /en/blog/ and /en/ --- i2p2www/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 328917f5..4342c142 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -204,8 +204,8 @@ def main_index(): return redirect(url_for('site_show', lang='en')) # Site pages -@app.route('//site/', defaults={'page': 'index'}) -@app.route('//site/') +@app.route('//', defaults={'page': 'index'}) +@app.route('//') def site_show(page): if page.endswith('.html'): return redirect(url_for('site_show', page=page[:-5])) From 8f9e8fb178ded11160000c8f89f2a804114399ba Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 05:28:01 +0000 Subject: [PATCH 201/317] Added LazyView from http://flask.pocoo.org/docs/patterns/lazyloading/ to helpers --- i2p2www/helpers.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/i2p2www/helpers.py b/i2p2www/helpers.py index bbd8a656..aabf4a5e 100644 --- a/i2p2www/helpers.py +++ b/i2p2www/helpers.py @@ -1,4 +1,17 @@ from math import ceil +from werkzeug import import_string, cached_property + +class LazyView(object): + def __init__(self, import_name): + self.__module__, self.__name__ = import_name.rsplit('.', 1) + self.import_name = import_name + + @cached_property + def view(self): + return import_string(self.import_name) + + def __call__(self, *args, **kwargs): + return self.view(*args, **kwargs) class Pagination(object): def __init__(self, page, per_page, total_count): From 785f627d7a0384648e87244b5eddf3d1111283b0 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 06:53:59 +0000 Subject: [PATCH 202/317] Reorganized site and blog views and helpers to use LazyView This increases the speed of the site by not requiring the site and blog code to be imported on every request - just those that are relevant. It also splits the code into modules which are easier to work with. --- i2p2www/__init__.py | 181 ++++----------------------------------- i2p2www/blog/__init__.py | 0 i2p2www/blog/helpers.py | 82 ++++++++++++++++++ i2p2www/blog/views.py | 44 ++++++++++ i2p2www/helpers.py | 12 +++ 5 files changed, 157 insertions(+), 162 deletions(-) create mode 100644 i2p2www/blog/__init__.py create mode 100644 i2p2www/blog/helpers.py create mode 100644 i2p2www/blog/views.py diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 4342c142..8ebd1baa 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -14,7 +14,7 @@ try: except ImportError: import simplejson as json -from helpers import Pagination +from helpers import LazyView, Pagination CURRENT_I2P_VERSION = '0.9.4' @@ -36,6 +36,24 @@ app.debug = bool(os.environ.get('APP_DEBUG', 'False')) babel = Babel(app) +###### +# URLs + +def url(url_rule, import_name, **options): + view = LazyView('i2p2www.' + import_name) + app.add_url_rule(url_rule, view_func=view, **options) + +url('/', 'views.main_index') +url('//', 'views.site_show', defaults={'page': 'index'}) +url('//', 'views.site_show') + +url('//blog/', 'blog.views.blog_index', defaults={'page': 1}) +url('//blog/page/', 'blog.views.blog_index') +url('//blog/entry/', 'blog.views.blog_entry') +url('//feed/blog/rss', 'blog.views.blog_rss') +url('//feed/blog/atom', 'blog.views.blog_atom') + + ################# # Babel selectors @@ -186,50 +204,6 @@ def server_error(error): return render_template('global/error_500.html'), 500 -######################## -# General helper methods - -def get_for_page(items, page, per_page): - from_item = (page-1)*per_page - to_item = page*per_page - return items[from_item:to_item] - - -####################### -# General page handlers - -# Index - redirects to en homepage -@app.route('/') -def main_index(): - return redirect(url_for('site_show', lang='en')) - -# Site pages -@app.route('//', defaults={'page': 'index'}) -@app.route('//') -def site_show(page): - if page.endswith('.html'): - return redirect(url_for('site_show', page=page[:-5])) - name = 'site/%s.html' % page - page_file = safe_join(TEMPLATE_DIR, name) - - if not os.path.exists(page_file): - # Could be a directory, so try index.html - name = 'site/%s/index.html' % page - page_file = safe_join(TEMPLATE_DIR, name) - if not os.path.exists(page_file): - # bah! those damn users all the time! - abort(404) - - options = { - 'page': page, - } - if (page == 'index'): - options['blog_entries'] = get_blog_entries(8) - - # hah! - return render_template(name, **options) - - ######################## # Meeting helper methods @@ -446,123 +420,6 @@ def downloads_redirect(protocol, file, mirror): return redirect(mirrors[randint(0, len(mirrors) - 1)]['url'] % data) -##################### -# Blog helper methods - -def get_blog_feed_items(num=0): - entries = get_blog_entries(num) - items = [] - for entry in entries: - parts = render_blog_entry(entry[0]) - if parts: - a = {} - a['title'] = parts['title'] - a['content'] = parts['fragment'] - a['url'] = url_for('blog_entry', lang=g.lang, slug=entry[0]) - a['updated'] = datetime.datetime.strptime(entry[1], '%Y-%m-%d') - items.append(a) - return items - -def get_blog_entries(num=0): - """ - Returns the latest #num valid entries sorted by date, or all slugs if num=0. - """ - slugs = get_blog_slugs(num) - entries= [] - for slug in slugs: - date = get_date_from_slug(slug) - titlepart = slug.rsplit('/', 1)[1] - title = ' '.join(titlepart.split('_')) - entries.append((slug, date, title)) - return entries - -def get_blog_slugs(num=0): - """ - Returns the latest #num valid slugs sorted by date, or all slugs if num=0. - """ - # list of slugs - slugs=[] - # walk over all directories/files - for v in os.walk(BLOG_DIR): - # iterate over all files - slugbase = os.path.relpath(v[0], BLOG_DIR) - for f in v[2]: - # ignore all non-.rst files - if not f.endswith('.rst'): - continue - slugs.append(safe_join(slugbase, f[:-4])) - slugs.sort() - slugs.reverse() - if (num > 0): - return slugs[:num] - return slugs - -def get_date_from_slug(slug): - parts = slug.split('/') - return "%s-%s-%s" % (parts[0], parts[1], parts[2]) - -def render_blog_entry(slug): - """ - Render the blog entry - TODO: - - caching - - move to own file - """ - # check if that file actually exists - path = safe_join(BLOG_DIR, slug + ".rst") - if not os.path.exists(path): - abort(404) - - # read file - with codecs.open(path, encoding='utf-8') as fd: - content = fd.read() - - return publish_parts(source=content, source_path=BLOG_DIR, writer_name="html") - - -############### -# Blog handlers - -@app.route('//blog/', defaults={'page': 1}) -@app.route('//blog/page/') -def blog_index(page): - all_entries = get_blog_entries() - entries = get_for_page(all_entries, page, BLOG_ENTRIES_PER_PAGE) - if not entries and page != 1: - abort(404) - pagination = Pagination(page, BLOG_ENTRIES_PER_PAGE, len(all_entries)) - return render_template('blog/index.html', pagination=pagination, entries=entries) - -@app.route('//blog/entry/') -def blog_entry(slug): - # try to render that blog entry.. throws 404 if it does not exist - parts = render_blog_entry(slug) - - if parts: - # now just pass to simple template file and we are done - return render_template('blog/entry.html', parts=parts, title=parts['title'], body=parts['fragment'], slug=slug) - else: - abort(404) - -@app.route('//feed/blog/rss') -def blog_rss(): - # TODO: implement - pass - -@app.route('//feed/blog/atom') -def blog_atom(): - # TODO: Only output beginning of each blog entry - feed = AtomFeed('I2P Blog', feed_url=request.url, url=request.url_root) - items = get_blog_feed_items(10) - for item in items: - feed.add(item['title'], - item['content'], - content_type='html', - url=item['url'], - updated=item['updated']) - return feed.get_response() - - ############ # Root files diff --git a/i2p2www/blog/__init__.py b/i2p2www/blog/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/i2p2www/blog/helpers.py b/i2p2www/blog/helpers.py new file mode 100644 index 00000000..15a19a90 --- /dev/null +++ b/i2p2www/blog/helpers.py @@ -0,0 +1,82 @@ +import codecs +import datetime +from docutils.core import publish_parts +from flask import abort, g, safe_join, url_for +import os +import os.path + +from i2p2www import BLOG_DIR + + +##################### +# Blog helper methods + +def get_blog_feed_items(num=0): + entries = get_blog_entries(num) + items = [] + for entry in entries: + parts = render_blog_entry(entry[0]) + if parts: + a = {} + a['title'] = parts['title'] + a['content'] = parts['fragment'] + a['url'] = url_for('blog_entry', lang=g.lang, slug=entry[0]) + a['updated'] = datetime.datetime.strptime(entry[1], '%Y-%m-%d') + items.append(a) + return items + +def get_blog_entries(num=0): + """ + Returns the latest #num valid entries sorted by date, or all slugs if num=0. + """ + slugs = get_blog_slugs(num) + entries= [] + for slug in slugs: + date = get_date_from_slug(slug) + titlepart = slug.rsplit('/', 1)[1] + title = ' '.join(titlepart.split('_')) + entries.append((slug, date, title)) + return entries + +def get_blog_slugs(num=0): + """ + Returns the latest #num valid slugs sorted by date, or all slugs if num=0. + """ + # list of slugs + slugs=[] + # walk over all directories/files + for v in os.walk(BLOG_DIR): + # iterate over all files + slugbase = os.path.relpath(v[0], BLOG_DIR) + for f in v[2]: + # ignore all non-.rst files + if not f.endswith('.rst'): + continue + slugs.append(safe_join(slugbase, f[:-4])) + slugs.sort() + slugs.reverse() + if (num > 0): + return slugs[:num] + return slugs + +def get_date_from_slug(slug): + parts = slug.split('/') + return "%s-%s-%s" % (parts[0], parts[1], parts[2]) + +def render_blog_entry(slug): + """ + Render the blog entry + TODO: + - caching + - move to own file + """ + # check if that file actually exists + path = safe_join(BLOG_DIR, slug + ".rst") + if not os.path.exists(path): + abort(404) + + # read file + with codecs.open(path, encoding='utf-8') as fd: + content = fd.read() + + return publish_parts(source=content, source_path=BLOG_DIR, writer_name="html") diff --git a/i2p2www/blog/views.py b/i2p2www/blog/views.py new file mode 100644 index 00000000..a61d6c36 --- /dev/null +++ b/i2p2www/blog/views.py @@ -0,0 +1,44 @@ +from flask import request, abort, render_template +from werkzeug.contrib.atom import AtomFeed + +from i2p2www import BLOG_ENTRIES_PER_PAGE +from i2p2www.blog.helpers import get_blog_entries, get_blog_feed_items, render_blog_entry +from i2p2www.helpers import Pagination, get_for_page + + +############ +# Blog views + +def blog_index(page): + all_entries = get_blog_entries() + entries = get_for_page(all_entries, page, BLOG_ENTRIES_PER_PAGE) + if not entries and page != 1: + abort(404) + pagination = Pagination(page, BLOG_ENTRIES_PER_PAGE, len(all_entries)) + return render_template('blog/index.html', pagination=pagination, entries=entries) + +def blog_entry(slug): + # try to render that blog entry.. throws 404 if it does not exist + parts = render_blog_entry(slug) + + if parts: + # now just pass to simple template file and we are done + return render_template('blog/entry.html', parts=parts, title=parts['title'], body=parts['fragment'], slug=slug) + else: + abort(404) + +def blog_rss(): + # TODO: implement + pass + +def blog_atom(): + # TODO: Only output beginning of each blog entry + feed = AtomFeed('I2P Blog', feed_url=request.url, url=request.url_root) + items = get_blog_feed_items(10) + for item in items: + feed.add(item['title'], + item['content'], + content_type='html', + url=item['url'], + updated=item['updated']) + return feed.get_response() diff --git a/i2p2www/helpers.py b/i2p2www/helpers.py index aabf4a5e..04bd49ee 100644 --- a/i2p2www/helpers.py +++ b/i2p2www/helpers.py @@ -1,6 +1,18 @@ from math import ceil from werkzeug import import_string, cached_property +######################## +# General helper methods + +def get_for_page(items, page, per_page): + from_item = (page-1)*per_page + to_item = page*per_page + return items[from_item:to_item] + + +######################## +# General helper classes + class LazyView(object): def __init__(self, import_name): self.__module__, self.__name__ = import_name.rsplit('.', 1) From 3ff5e146dcf5526801091aa8e12a188afdf057ac Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 06:58:07 +0000 Subject: [PATCH 203/317] Moved meetings/* to meetings/logs/ (ready for splitting out meetings code) --- i2p2www/__init__.py | 2 +- i2p2www/meetings/{ => logs}/1.log | 0 i2p2www/meetings/{ => logs}/1.rst | 0 i2p2www/meetings/{ => logs}/10.log | 0 i2p2www/meetings/{ => logs}/10.rst | 0 i2p2www/meetings/{ => logs}/100.log | 0 i2p2www/meetings/{ => logs}/100.rst | 0 i2p2www/meetings/{ => logs}/101.log | 0 i2p2www/meetings/{ => logs}/101.rst | 0 i2p2www/meetings/{ => logs}/102.log | 0 i2p2www/meetings/{ => logs}/102.rst | 0 i2p2www/meetings/{ => logs}/103.log | 0 i2p2www/meetings/{ => logs}/103.rst | 0 i2p2www/meetings/{ => logs}/104.log | 0 i2p2www/meetings/{ => logs}/104.rst | 0 i2p2www/meetings/{ => logs}/105.log | 0 i2p2www/meetings/{ => logs}/105.rst | 0 i2p2www/meetings/{ => logs}/106.log | 0 i2p2www/meetings/{ => logs}/106.rst | 0 i2p2www/meetings/{ => logs}/107.log | 0 i2p2www/meetings/{ => logs}/107.rst | 0 i2p2www/meetings/{ => logs}/108.log | 0 i2p2www/meetings/{ => logs}/108.rst | 0 i2p2www/meetings/{ => logs}/109.log | 0 i2p2www/meetings/{ => logs}/109.rst | 0 i2p2www/meetings/{ => logs}/11.log | 0 i2p2www/meetings/{ => logs}/11.rst | 0 i2p2www/meetings/{ => logs}/110.log | 0 i2p2www/meetings/{ => logs}/110.rst | 0 i2p2www/meetings/{ => logs}/111.log | 0 i2p2www/meetings/{ => logs}/111.rst | 0 i2p2www/meetings/{ => logs}/112.log | 0 i2p2www/meetings/{ => logs}/112.rst | 0 i2p2www/meetings/{ => logs}/113.log | 0 i2p2www/meetings/{ => logs}/113.rst | 0 i2p2www/meetings/{ => logs}/114.log | 0 i2p2www/meetings/{ => logs}/114.rst | 0 i2p2www/meetings/{ => logs}/115.log | 0 i2p2www/meetings/{ => logs}/115.rst | 0 i2p2www/meetings/{ => logs}/116.log | 0 i2p2www/meetings/{ => logs}/116.rst | 0 i2p2www/meetings/{ => logs}/117.log | 0 i2p2www/meetings/{ => logs}/117.rst | 0 i2p2www/meetings/{ => logs}/118.log | 0 i2p2www/meetings/{ => logs}/118.rst | 0 i2p2www/meetings/{ => logs}/119.log | 0 i2p2www/meetings/{ => logs}/119.rst | 0 i2p2www/meetings/{ => logs}/12.log | 0 i2p2www/meetings/{ => logs}/12.rst | 0 i2p2www/meetings/{ => logs}/120.log | 0 i2p2www/meetings/{ => logs}/120.rst | 0 i2p2www/meetings/{ => logs}/121.log | 0 i2p2www/meetings/{ => logs}/121.rst | 0 i2p2www/meetings/{ => logs}/122.log | 0 i2p2www/meetings/{ => logs}/122.rst | 0 i2p2www/meetings/{ => logs}/123.log | 0 i2p2www/meetings/{ => logs}/123.rst | 0 i2p2www/meetings/{ => logs}/124.log | 0 i2p2www/meetings/{ => logs}/124.rst | 0 i2p2www/meetings/{ => logs}/125.log | 0 i2p2www/meetings/{ => logs}/125.rst | 0 i2p2www/meetings/{ => logs}/126.log | 0 i2p2www/meetings/{ => logs}/126.rst | 0 i2p2www/meetings/{ => logs}/127.log | 0 i2p2www/meetings/{ => logs}/127.rst | 0 i2p2www/meetings/{ => logs}/128.log | 0 i2p2www/meetings/{ => logs}/128.rst | 0 i2p2www/meetings/{ => logs}/129.log | 0 i2p2www/meetings/{ => logs}/129.rst | 0 i2p2www/meetings/{ => logs}/130.log | 0 i2p2www/meetings/{ => logs}/130.rst | 0 i2p2www/meetings/{ => logs}/131.log | 0 i2p2www/meetings/{ => logs}/131.rst | 0 i2p2www/meetings/{ => logs}/132.log | 0 i2p2www/meetings/{ => logs}/132.rst | 0 i2p2www/meetings/{ => logs}/133.log | 0 i2p2www/meetings/{ => logs}/133.rst | 0 i2p2www/meetings/{ => logs}/134.log | 0 i2p2www/meetings/{ => logs}/134.rst | 0 i2p2www/meetings/{ => logs}/135.log | 0 i2p2www/meetings/{ => logs}/135.rst | 0 i2p2www/meetings/{ => logs}/136.log | 0 i2p2www/meetings/{ => logs}/136.rst | 0 i2p2www/meetings/{ => logs}/137.log | 0 i2p2www/meetings/{ => logs}/137.rst | 0 i2p2www/meetings/{ => logs}/138.log | 0 i2p2www/meetings/{ => logs}/138.rst | 0 i2p2www/meetings/{ => logs}/139.log | 0 i2p2www/meetings/{ => logs}/139.rst | 0 i2p2www/meetings/{ => logs}/140.log | 0 i2p2www/meetings/{ => logs}/140.rst | 0 i2p2www/meetings/{ => logs}/141.log | 0 i2p2www/meetings/{ => logs}/141.rst | 0 i2p2www/meetings/{ => logs}/142.log | 0 i2p2www/meetings/{ => logs}/142.rst | 0 i2p2www/meetings/{ => logs}/143.log | 0 i2p2www/meetings/{ => logs}/143.rst | 0 i2p2www/meetings/{ => logs}/144.log | 0 i2p2www/meetings/{ => logs}/144.rst | 0 i2p2www/meetings/{ => logs}/145.log | 0 i2p2www/meetings/{ => logs}/145.rst | 0 i2p2www/meetings/{ => logs}/146.log | 0 i2p2www/meetings/{ => logs}/146.rst | 0 i2p2www/meetings/{ => logs}/147.log | 0 i2p2www/meetings/{ => logs}/147.rst | 0 i2p2www/meetings/{ => logs}/148.log | 0 i2p2www/meetings/{ => logs}/148.rst | 0 i2p2www/meetings/{ => logs}/149.log | 0 i2p2www/meetings/{ => logs}/149.rst | 0 i2p2www/meetings/{ => logs}/15.log | 0 i2p2www/meetings/{ => logs}/15.rst | 0 i2p2www/meetings/{ => logs}/150.log | 0 i2p2www/meetings/{ => logs}/150.rst | 0 i2p2www/meetings/{ => logs}/151.log | 0 i2p2www/meetings/{ => logs}/151.rst | 0 i2p2www/meetings/{ => logs}/152.log | 0 i2p2www/meetings/{ => logs}/152.rst | 0 i2p2www/meetings/{ => logs}/153.log | 0 i2p2www/meetings/{ => logs}/153.rst | 0 i2p2www/meetings/{ => logs}/154.log | 0 i2p2www/meetings/{ => logs}/154.rst | 0 i2p2www/meetings/{ => logs}/155.log | 0 i2p2www/meetings/{ => logs}/155.rst | 0 i2p2www/meetings/{ => logs}/156.log | 0 i2p2www/meetings/{ => logs}/156.rst | 0 i2p2www/meetings/{ => logs}/157.log | 0 i2p2www/meetings/{ => logs}/157.rst | 0 i2p2www/meetings/{ => logs}/158.log | 0 i2p2www/meetings/{ => logs}/158.rst | 0 i2p2www/meetings/{ => logs}/159.log | 0 i2p2www/meetings/{ => logs}/159.rst | 0 i2p2www/meetings/{ => logs}/160.log | 0 i2p2www/meetings/{ => logs}/160.rst | 0 i2p2www/meetings/{ => logs}/161.log | 0 i2p2www/meetings/{ => logs}/161.rst | 0 i2p2www/meetings/{ => logs}/162.log | 0 i2p2www/meetings/{ => logs}/162.rst | 0 i2p2www/meetings/{ => logs}/163.log | 0 i2p2www/meetings/{ => logs}/163.rst | 0 i2p2www/meetings/{ => logs}/164.log | 0 i2p2www/meetings/{ => logs}/164.rst | 0 i2p2www/meetings/{ => logs}/165.log | 0 i2p2www/meetings/{ => logs}/165.rst | 0 i2p2www/meetings/{ => logs}/166.log | 0 i2p2www/meetings/{ => logs}/166.rst | 0 i2p2www/meetings/{ => logs}/167.log | 0 i2p2www/meetings/{ => logs}/167.rst | 0 i2p2www/meetings/{ => logs}/168.log | 0 i2p2www/meetings/{ => logs}/168.rst | 0 i2p2www/meetings/{ => logs}/170.log | 0 i2p2www/meetings/{ => logs}/170.rst | 0 i2p2www/meetings/{ => logs}/171.log | 0 i2p2www/meetings/{ => logs}/171.rst | 0 i2p2www/meetings/{ => logs}/172.log | 0 i2p2www/meetings/{ => logs}/172.rst | 0 i2p2www/meetings/{ => logs}/173.log | 0 i2p2www/meetings/{ => logs}/173.rst | 0 i2p2www/meetings/{ => logs}/174.log | 0 i2p2www/meetings/{ => logs}/174.rst | 0 i2p2www/meetings/{ => logs}/175.log | 0 i2p2www/meetings/{ => logs}/175.rst | 0 i2p2www/meetings/{ => logs}/176.log | 0 i2p2www/meetings/{ => logs}/176.rst | 0 i2p2www/meetings/{ => logs}/177.log | 0 i2p2www/meetings/{ => logs}/177.rst | 0 i2p2www/meetings/{ => logs}/178.log | 0 i2p2www/meetings/{ => logs}/178.rst | 0 i2p2www/meetings/{ => logs}/179.log | 0 i2p2www/meetings/{ => logs}/179.rst | 0 i2p2www/meetings/{ => logs}/18.log | 0 i2p2www/meetings/{ => logs}/18.rst | 0 i2p2www/meetings/{ => logs}/180.log | 0 i2p2www/meetings/{ => logs}/180.rst | 0 i2p2www/meetings/{ => logs}/181.log | 0 i2p2www/meetings/{ => logs}/181.rst | 0 i2p2www/meetings/{ => logs}/182.log | 0 i2p2www/meetings/{ => logs}/182.rst | 0 i2p2www/meetings/{ => logs}/183.log | 0 i2p2www/meetings/{ => logs}/183.rst | 0 i2p2www/meetings/{ => logs}/184.log | 0 i2p2www/meetings/{ => logs}/184.rst | 0 i2p2www/meetings/{ => logs}/185.log | 0 i2p2www/meetings/{ => logs}/185.rst | 0 i2p2www/meetings/{ => logs}/186.log | 0 i2p2www/meetings/{ => logs}/186.rst | 0 i2p2www/meetings/{ => logs}/187.log | 0 i2p2www/meetings/{ => logs}/187.rst | 0 i2p2www/meetings/{ => logs}/188.log | 0 i2p2www/meetings/{ => logs}/188.rst | 0 i2p2www/meetings/{ => logs}/189.log | 0 i2p2www/meetings/{ => logs}/189.rst | 0 i2p2www/meetings/{ => logs}/190.log | 0 i2p2www/meetings/{ => logs}/190.rst | 0 i2p2www/meetings/{ => logs}/191.log | 0 i2p2www/meetings/{ => logs}/191.rst | 0 i2p2www/meetings/{ => logs}/192.log | 0 i2p2www/meetings/{ => logs}/192.rst | 0 i2p2www/meetings/{ => logs}/193.log | 0 i2p2www/meetings/{ => logs}/193.rst | 0 i2p2www/meetings/{ => logs}/194.log | 0 i2p2www/meetings/{ => logs}/194.rst | 0 i2p2www/meetings/{ => logs}/195.log | 0 i2p2www/meetings/{ => logs}/195.rst | 0 i2p2www/meetings/{ => logs}/196.log | 0 i2p2www/meetings/{ => logs}/196.rst | 0 i2p2www/meetings/{ => logs}/197.log | 0 i2p2www/meetings/{ => logs}/197.rst | 0 i2p2www/meetings/{ => logs}/198.log | 0 i2p2www/meetings/{ => logs}/198.rst | 0 i2p2www/meetings/{ => logs}/199.log | 0 i2p2www/meetings/{ => logs}/199.rst | 0 i2p2www/meetings/{ => logs}/2.log | 0 i2p2www/meetings/{ => logs}/2.rst | 0 i2p2www/meetings/{ => logs}/20.log | 0 i2p2www/meetings/{ => logs}/20.rst | 0 i2p2www/meetings/{ => logs}/200.log | 0 i2p2www/meetings/{ => logs}/200.rst | 0 i2p2www/meetings/{ => logs}/201.log | 0 i2p2www/meetings/{ => logs}/201.rst | 0 i2p2www/meetings/{ => logs}/202.log | 0 i2p2www/meetings/{ => logs}/202.rst | 0 i2p2www/meetings/{ => logs}/203.log | 0 i2p2www/meetings/{ => logs}/203.rst | 0 i2p2www/meetings/{ => logs}/204.log | 0 i2p2www/meetings/{ => logs}/204.rst | 0 i2p2www/meetings/{ => logs}/205.log | 0 i2p2www/meetings/{ => logs}/205.rst | 0 i2p2www/meetings/{ => logs}/206.log | 0 i2p2www/meetings/{ => logs}/206.rst | 0 i2p2www/meetings/{ => logs}/207.log | 0 i2p2www/meetings/{ => logs}/207.rst | 0 i2p2www/meetings/{ => logs}/208.log | 0 i2p2www/meetings/{ => logs}/208.rst | 0 i2p2www/meetings/{ => logs}/209.log | 0 i2p2www/meetings/{ => logs}/209.rst | 0 i2p2www/meetings/{ => logs}/21.log | 0 i2p2www/meetings/{ => logs}/21.rst | 0 i2p2www/meetings/{ => logs}/210.log | 0 i2p2www/meetings/{ => logs}/210.rst | 0 i2p2www/meetings/{ => logs}/211.log | 0 i2p2www/meetings/{ => logs}/211.rst | 0 i2p2www/meetings/{ => logs}/212.log | 0 i2p2www/meetings/{ => logs}/212.rst | 0 i2p2www/meetings/{ => logs}/22.log | 0 i2p2www/meetings/{ => logs}/22.rst | 0 i2p2www/meetings/{ => logs}/23.log | 0 i2p2www/meetings/{ => logs}/23.rst | 0 i2p2www/meetings/{ => logs}/25.log | 0 i2p2www/meetings/{ => logs}/25.rst | 0 i2p2www/meetings/{ => logs}/26.log | 0 i2p2www/meetings/{ => logs}/26.rst | 0 i2p2www/meetings/{ => logs}/28.log | 0 i2p2www/meetings/{ => logs}/28.rst | 0 i2p2www/meetings/{ => logs}/29.log | 0 i2p2www/meetings/{ => logs}/29.rst | 0 i2p2www/meetings/{ => logs}/3.log | 0 i2p2www/meetings/{ => logs}/3.rst | 0 i2p2www/meetings/{ => logs}/30.log | 0 i2p2www/meetings/{ => logs}/30.rst | 0 i2p2www/meetings/{ => logs}/31.log | 0 i2p2www/meetings/{ => logs}/31.rst | 0 i2p2www/meetings/{ => logs}/32.log | 0 i2p2www/meetings/{ => logs}/32.rst | 0 i2p2www/meetings/{ => logs}/33.log | 0 i2p2www/meetings/{ => logs}/33.rst | 0 i2p2www/meetings/{ => logs}/34.log | 0 i2p2www/meetings/{ => logs}/34.rst | 0 i2p2www/meetings/{ => logs}/35.log | 0 i2p2www/meetings/{ => logs}/35.rst | 0 i2p2www/meetings/{ => logs}/4.log | 0 i2p2www/meetings/{ => logs}/4.rst | 0 i2p2www/meetings/{ => logs}/47.log | 0 i2p2www/meetings/{ => logs}/47.rst | 0 i2p2www/meetings/{ => logs}/49.log | 0 i2p2www/meetings/{ => logs}/49.rst | 0 i2p2www/meetings/{ => logs}/50.log | 0 i2p2www/meetings/{ => logs}/50.rst | 0 i2p2www/meetings/{ => logs}/51.log | 0 i2p2www/meetings/{ => logs}/51.rst | 0 i2p2www/meetings/{ => logs}/52.log | 0 i2p2www/meetings/{ => logs}/52.rst | 0 i2p2www/meetings/{ => logs}/53.log | 0 i2p2www/meetings/{ => logs}/53.rst | 0 i2p2www/meetings/{ => logs}/54.log | 0 i2p2www/meetings/{ => logs}/54.rst | 0 i2p2www/meetings/{ => logs}/55.log | 0 i2p2www/meetings/{ => logs}/55.rst | 0 i2p2www/meetings/{ => logs}/56.log | 0 i2p2www/meetings/{ => logs}/56.rst | 0 i2p2www/meetings/{ => logs}/57.log | 0 i2p2www/meetings/{ => logs}/57.rst | 0 i2p2www/meetings/{ => logs}/58.log | 0 i2p2www/meetings/{ => logs}/58.rst | 0 i2p2www/meetings/{ => logs}/59.log | 0 i2p2www/meetings/{ => logs}/59.rst | 0 i2p2www/meetings/{ => logs}/60.log | 0 i2p2www/meetings/{ => logs}/60.rst | 0 i2p2www/meetings/{ => logs}/61.log | 0 i2p2www/meetings/{ => logs}/61.rst | 0 i2p2www/meetings/{ => logs}/62.log | 0 i2p2www/meetings/{ => logs}/62.rst | 0 i2p2www/meetings/{ => logs}/63.log | 0 i2p2www/meetings/{ => logs}/63.rst | 0 i2p2www/meetings/{ => logs}/64.log | 0 i2p2www/meetings/{ => logs}/64.rst | 0 i2p2www/meetings/{ => logs}/65.log | 0 i2p2www/meetings/{ => logs}/65.rst | 0 i2p2www/meetings/{ => logs}/66.log | 0 i2p2www/meetings/{ => logs}/66.rst | 0 i2p2www/meetings/{ => logs}/68.log | 0 i2p2www/meetings/{ => logs}/68.rst | 0 i2p2www/meetings/{ => logs}/69.log | 0 i2p2www/meetings/{ => logs}/69.rst | 0 i2p2www/meetings/{ => logs}/7.log | 0 i2p2www/meetings/{ => logs}/7.rst | 0 i2p2www/meetings/{ => logs}/70.log | 0 i2p2www/meetings/{ => logs}/70.rst | 0 i2p2www/meetings/{ => logs}/71.log | 0 i2p2www/meetings/{ => logs}/71.rst | 0 i2p2www/meetings/{ => logs}/72.log | 0 i2p2www/meetings/{ => logs}/72.rst | 0 i2p2www/meetings/{ => logs}/73.log | 0 i2p2www/meetings/{ => logs}/73.rst | 0 i2p2www/meetings/{ => logs}/74.log | 0 i2p2www/meetings/{ => logs}/74.rst | 0 i2p2www/meetings/{ => logs}/75.log | 0 i2p2www/meetings/{ => logs}/75.rst | 0 i2p2www/meetings/{ => logs}/76.log | 0 i2p2www/meetings/{ => logs}/76.rst | 0 i2p2www/meetings/{ => logs}/77.log | 0 i2p2www/meetings/{ => logs}/77.rst | 0 i2p2www/meetings/{ => logs}/78.log | 0 i2p2www/meetings/{ => logs}/78.rst | 0 i2p2www/meetings/{ => logs}/79.log | 0 i2p2www/meetings/{ => logs}/79.rst | 0 i2p2www/meetings/{ => logs}/8.log | 0 i2p2www/meetings/{ => logs}/8.rst | 0 i2p2www/meetings/{ => logs}/80.log | 0 i2p2www/meetings/{ => logs}/80.rst | 0 i2p2www/meetings/{ => logs}/81.log | 0 i2p2www/meetings/{ => logs}/81.rst | 0 i2p2www/meetings/{ => logs}/82.log | 0 i2p2www/meetings/{ => logs}/82.rst | 0 i2p2www/meetings/{ => logs}/9.log | 0 i2p2www/meetings/{ => logs}/9.rst | 0 i2p2www/meetings/{ => logs}/90.log | 0 i2p2www/meetings/{ => logs}/90.rst | 0 i2p2www/meetings/{ => logs}/92.log | 0 i2p2www/meetings/{ => logs}/92.rst | 0 i2p2www/meetings/{ => logs}/93.log | 0 i2p2www/meetings/{ => logs}/93.rst | 0 i2p2www/meetings/{ => logs}/95.log | 0 i2p2www/meetings/{ => logs}/95.rst | 0 i2p2www/meetings/{ => logs}/99.log | 0 i2p2www/meetings/{ => logs}/99.rst | 0 355 files changed, 1 insertion(+), 1 deletion(-) rename i2p2www/meetings/{ => logs}/1.log (100%) rename i2p2www/meetings/{ => logs}/1.rst (100%) rename i2p2www/meetings/{ => logs}/10.log (100%) rename i2p2www/meetings/{ => logs}/10.rst (100%) rename i2p2www/meetings/{ => logs}/100.log (100%) rename i2p2www/meetings/{ => logs}/100.rst (100%) rename i2p2www/meetings/{ => logs}/101.log (100%) rename i2p2www/meetings/{ => logs}/101.rst (100%) rename i2p2www/meetings/{ => logs}/102.log (100%) rename i2p2www/meetings/{ => logs}/102.rst (100%) rename i2p2www/meetings/{ => logs}/103.log (100%) rename i2p2www/meetings/{ => logs}/103.rst (100%) rename i2p2www/meetings/{ => logs}/104.log (100%) rename i2p2www/meetings/{ => logs}/104.rst (100%) rename i2p2www/meetings/{ => logs}/105.log (100%) rename i2p2www/meetings/{ => logs}/105.rst (100%) rename i2p2www/meetings/{ => logs}/106.log (100%) rename i2p2www/meetings/{ => logs}/106.rst (100%) rename i2p2www/meetings/{ => logs}/107.log (100%) rename i2p2www/meetings/{ => logs}/107.rst (100%) rename i2p2www/meetings/{ => logs}/108.log (100%) rename i2p2www/meetings/{ => logs}/108.rst (100%) rename i2p2www/meetings/{ => logs}/109.log (100%) rename i2p2www/meetings/{ => logs}/109.rst (100%) rename i2p2www/meetings/{ => logs}/11.log (100%) rename i2p2www/meetings/{ => logs}/11.rst (100%) rename i2p2www/meetings/{ => logs}/110.log (100%) rename i2p2www/meetings/{ => logs}/110.rst (100%) rename i2p2www/meetings/{ => logs}/111.log (100%) rename i2p2www/meetings/{ => logs}/111.rst (100%) rename i2p2www/meetings/{ => logs}/112.log (100%) rename i2p2www/meetings/{ => logs}/112.rst (100%) rename i2p2www/meetings/{ => logs}/113.log (100%) rename i2p2www/meetings/{ => logs}/113.rst (100%) rename i2p2www/meetings/{ => logs}/114.log (100%) rename i2p2www/meetings/{ => logs}/114.rst (100%) rename i2p2www/meetings/{ => logs}/115.log (100%) rename i2p2www/meetings/{ => logs}/115.rst (100%) rename i2p2www/meetings/{ => logs}/116.log (100%) rename i2p2www/meetings/{ => logs}/116.rst (100%) rename i2p2www/meetings/{ => logs}/117.log (100%) rename i2p2www/meetings/{ => logs}/117.rst (100%) rename i2p2www/meetings/{ => logs}/118.log (100%) rename i2p2www/meetings/{ => logs}/118.rst (100%) rename i2p2www/meetings/{ => logs}/119.log (100%) rename i2p2www/meetings/{ => logs}/119.rst (100%) rename i2p2www/meetings/{ => logs}/12.log (100%) rename i2p2www/meetings/{ => logs}/12.rst (100%) rename i2p2www/meetings/{ => logs}/120.log (100%) rename i2p2www/meetings/{ => logs}/120.rst (100%) rename i2p2www/meetings/{ => logs}/121.log (100%) rename i2p2www/meetings/{ => logs}/121.rst (100%) rename i2p2www/meetings/{ => logs}/122.log (100%) rename i2p2www/meetings/{ => logs}/122.rst (100%) rename i2p2www/meetings/{ => logs}/123.log (100%) rename i2p2www/meetings/{ => logs}/123.rst (100%) rename i2p2www/meetings/{ => logs}/124.log (100%) rename i2p2www/meetings/{ => logs}/124.rst (100%) rename i2p2www/meetings/{ => logs}/125.log (100%) rename i2p2www/meetings/{ => logs}/125.rst (100%) rename i2p2www/meetings/{ => logs}/126.log (100%) rename i2p2www/meetings/{ => logs}/126.rst (100%) rename i2p2www/meetings/{ => logs}/127.log (100%) rename i2p2www/meetings/{ => logs}/127.rst (100%) rename i2p2www/meetings/{ => logs}/128.log (100%) rename i2p2www/meetings/{ => logs}/128.rst (100%) rename i2p2www/meetings/{ => logs}/129.log (100%) rename i2p2www/meetings/{ => logs}/129.rst (100%) rename i2p2www/meetings/{ => logs}/130.log (100%) rename i2p2www/meetings/{ => logs}/130.rst (100%) rename i2p2www/meetings/{ => logs}/131.log (100%) rename i2p2www/meetings/{ => logs}/131.rst (100%) rename i2p2www/meetings/{ => logs}/132.log (100%) rename i2p2www/meetings/{ => logs}/132.rst (100%) rename i2p2www/meetings/{ => logs}/133.log (100%) rename i2p2www/meetings/{ => logs}/133.rst (100%) rename i2p2www/meetings/{ => logs}/134.log (100%) rename i2p2www/meetings/{ => logs}/134.rst (100%) rename i2p2www/meetings/{ => logs}/135.log (100%) rename i2p2www/meetings/{ => logs}/135.rst (100%) rename i2p2www/meetings/{ => logs}/136.log (100%) rename i2p2www/meetings/{ => logs}/136.rst (100%) rename i2p2www/meetings/{ => logs}/137.log (100%) rename i2p2www/meetings/{ => logs}/137.rst (100%) rename i2p2www/meetings/{ => logs}/138.log (100%) rename i2p2www/meetings/{ => logs}/138.rst (100%) rename i2p2www/meetings/{ => logs}/139.log (100%) rename i2p2www/meetings/{ => logs}/139.rst (100%) rename i2p2www/meetings/{ => logs}/140.log (100%) rename i2p2www/meetings/{ => logs}/140.rst (100%) rename i2p2www/meetings/{ => logs}/141.log (100%) rename i2p2www/meetings/{ => logs}/141.rst (100%) rename i2p2www/meetings/{ => logs}/142.log (100%) rename i2p2www/meetings/{ => logs}/142.rst (100%) rename i2p2www/meetings/{ => logs}/143.log (100%) rename i2p2www/meetings/{ => logs}/143.rst (100%) rename i2p2www/meetings/{ => logs}/144.log (100%) rename i2p2www/meetings/{ => logs}/144.rst (100%) rename i2p2www/meetings/{ => logs}/145.log (100%) rename i2p2www/meetings/{ => logs}/145.rst (100%) rename i2p2www/meetings/{ => logs}/146.log (100%) rename i2p2www/meetings/{ => logs}/146.rst (100%) rename i2p2www/meetings/{ => logs}/147.log (100%) rename i2p2www/meetings/{ => logs}/147.rst (100%) rename i2p2www/meetings/{ => logs}/148.log (100%) rename i2p2www/meetings/{ => logs}/148.rst (100%) rename i2p2www/meetings/{ => logs}/149.log (100%) rename i2p2www/meetings/{ => logs}/149.rst (100%) rename i2p2www/meetings/{ => logs}/15.log (100%) rename i2p2www/meetings/{ => logs}/15.rst (100%) rename i2p2www/meetings/{ => logs}/150.log (100%) rename i2p2www/meetings/{ => logs}/150.rst (100%) rename i2p2www/meetings/{ => logs}/151.log (100%) rename i2p2www/meetings/{ => logs}/151.rst (100%) rename i2p2www/meetings/{ => logs}/152.log (100%) rename i2p2www/meetings/{ => logs}/152.rst (100%) rename i2p2www/meetings/{ => logs}/153.log (100%) rename i2p2www/meetings/{ => logs}/153.rst (100%) rename i2p2www/meetings/{ => logs}/154.log (100%) rename i2p2www/meetings/{ => logs}/154.rst (100%) rename i2p2www/meetings/{ => logs}/155.log (100%) rename i2p2www/meetings/{ => logs}/155.rst (100%) rename i2p2www/meetings/{ => logs}/156.log (100%) rename i2p2www/meetings/{ => logs}/156.rst (100%) rename i2p2www/meetings/{ => logs}/157.log (100%) rename i2p2www/meetings/{ => logs}/157.rst (100%) rename i2p2www/meetings/{ => logs}/158.log (100%) rename i2p2www/meetings/{ => logs}/158.rst (100%) rename i2p2www/meetings/{ => logs}/159.log (100%) rename i2p2www/meetings/{ => logs}/159.rst (100%) rename i2p2www/meetings/{ => logs}/160.log (100%) rename i2p2www/meetings/{ => logs}/160.rst (100%) rename i2p2www/meetings/{ => logs}/161.log (100%) rename i2p2www/meetings/{ => logs}/161.rst (100%) rename i2p2www/meetings/{ => logs}/162.log (100%) rename i2p2www/meetings/{ => logs}/162.rst (100%) rename i2p2www/meetings/{ => logs}/163.log (100%) rename i2p2www/meetings/{ => logs}/163.rst (100%) rename i2p2www/meetings/{ => logs}/164.log (100%) rename i2p2www/meetings/{ => logs}/164.rst (100%) rename i2p2www/meetings/{ => logs}/165.log (100%) rename i2p2www/meetings/{ => logs}/165.rst (100%) rename i2p2www/meetings/{ => logs}/166.log (100%) rename i2p2www/meetings/{ => logs}/166.rst (100%) rename i2p2www/meetings/{ => logs}/167.log (100%) rename i2p2www/meetings/{ => logs}/167.rst (100%) rename i2p2www/meetings/{ => logs}/168.log (100%) rename i2p2www/meetings/{ => logs}/168.rst (100%) rename i2p2www/meetings/{ => logs}/170.log (100%) rename i2p2www/meetings/{ => logs}/170.rst (100%) rename i2p2www/meetings/{ => logs}/171.log (100%) rename i2p2www/meetings/{ => logs}/171.rst (100%) rename i2p2www/meetings/{ => logs}/172.log (100%) rename i2p2www/meetings/{ => logs}/172.rst (100%) rename i2p2www/meetings/{ => logs}/173.log (100%) rename i2p2www/meetings/{ => logs}/173.rst (100%) rename i2p2www/meetings/{ => logs}/174.log (100%) rename i2p2www/meetings/{ => logs}/174.rst (100%) rename i2p2www/meetings/{ => logs}/175.log (100%) rename i2p2www/meetings/{ => logs}/175.rst (100%) rename i2p2www/meetings/{ => logs}/176.log (100%) rename i2p2www/meetings/{ => logs}/176.rst (100%) rename i2p2www/meetings/{ => logs}/177.log (100%) rename i2p2www/meetings/{ => logs}/177.rst (100%) rename i2p2www/meetings/{ => logs}/178.log (100%) rename i2p2www/meetings/{ => logs}/178.rst (100%) rename i2p2www/meetings/{ => logs}/179.log (100%) rename i2p2www/meetings/{ => logs}/179.rst (100%) rename i2p2www/meetings/{ => logs}/18.log (100%) rename i2p2www/meetings/{ => logs}/18.rst (100%) rename i2p2www/meetings/{ => logs}/180.log (100%) rename i2p2www/meetings/{ => logs}/180.rst (100%) rename i2p2www/meetings/{ => logs}/181.log (100%) rename i2p2www/meetings/{ => logs}/181.rst (100%) rename i2p2www/meetings/{ => logs}/182.log (100%) rename i2p2www/meetings/{ => logs}/182.rst (100%) rename i2p2www/meetings/{ => logs}/183.log (100%) rename i2p2www/meetings/{ => logs}/183.rst (100%) rename i2p2www/meetings/{ => logs}/184.log (100%) rename i2p2www/meetings/{ => logs}/184.rst (100%) rename i2p2www/meetings/{ => logs}/185.log (100%) rename i2p2www/meetings/{ => logs}/185.rst (100%) rename i2p2www/meetings/{ => logs}/186.log (100%) rename i2p2www/meetings/{ => logs}/186.rst (100%) rename i2p2www/meetings/{ => logs}/187.log (100%) rename i2p2www/meetings/{ => logs}/187.rst (100%) rename i2p2www/meetings/{ => logs}/188.log (100%) rename i2p2www/meetings/{ => logs}/188.rst (100%) rename i2p2www/meetings/{ => logs}/189.log (100%) rename i2p2www/meetings/{ => logs}/189.rst (100%) rename i2p2www/meetings/{ => logs}/190.log (100%) rename i2p2www/meetings/{ => logs}/190.rst (100%) rename i2p2www/meetings/{ => logs}/191.log (100%) rename i2p2www/meetings/{ => logs}/191.rst (100%) rename i2p2www/meetings/{ => logs}/192.log (100%) rename i2p2www/meetings/{ => logs}/192.rst (100%) rename i2p2www/meetings/{ => logs}/193.log (100%) rename i2p2www/meetings/{ => logs}/193.rst (100%) rename i2p2www/meetings/{ => logs}/194.log (100%) rename i2p2www/meetings/{ => logs}/194.rst (100%) rename i2p2www/meetings/{ => logs}/195.log (100%) rename i2p2www/meetings/{ => logs}/195.rst (100%) rename i2p2www/meetings/{ => logs}/196.log (100%) rename i2p2www/meetings/{ => logs}/196.rst (100%) rename i2p2www/meetings/{ => logs}/197.log (100%) rename i2p2www/meetings/{ => logs}/197.rst (100%) rename i2p2www/meetings/{ => logs}/198.log (100%) rename i2p2www/meetings/{ => logs}/198.rst (100%) rename i2p2www/meetings/{ => logs}/199.log (100%) rename i2p2www/meetings/{ => logs}/199.rst (100%) rename i2p2www/meetings/{ => logs}/2.log (100%) rename i2p2www/meetings/{ => logs}/2.rst (100%) rename i2p2www/meetings/{ => logs}/20.log (100%) rename i2p2www/meetings/{ => logs}/20.rst (100%) rename i2p2www/meetings/{ => logs}/200.log (100%) rename i2p2www/meetings/{ => logs}/200.rst (100%) rename i2p2www/meetings/{ => logs}/201.log (100%) rename i2p2www/meetings/{ => logs}/201.rst (100%) rename i2p2www/meetings/{ => logs}/202.log (100%) rename i2p2www/meetings/{ => logs}/202.rst (100%) rename i2p2www/meetings/{ => logs}/203.log (100%) rename i2p2www/meetings/{ => logs}/203.rst (100%) rename i2p2www/meetings/{ => logs}/204.log (100%) rename i2p2www/meetings/{ => logs}/204.rst (100%) rename i2p2www/meetings/{ => logs}/205.log (100%) rename i2p2www/meetings/{ => logs}/205.rst (100%) rename i2p2www/meetings/{ => logs}/206.log (100%) rename i2p2www/meetings/{ => logs}/206.rst (100%) rename i2p2www/meetings/{ => logs}/207.log (100%) rename i2p2www/meetings/{ => logs}/207.rst (100%) rename i2p2www/meetings/{ => logs}/208.log (100%) rename i2p2www/meetings/{ => logs}/208.rst (100%) rename i2p2www/meetings/{ => logs}/209.log (100%) rename i2p2www/meetings/{ => logs}/209.rst (100%) rename i2p2www/meetings/{ => logs}/21.log (100%) rename i2p2www/meetings/{ => logs}/21.rst (100%) rename i2p2www/meetings/{ => logs}/210.log (100%) rename i2p2www/meetings/{ => logs}/210.rst (100%) rename i2p2www/meetings/{ => logs}/211.log (100%) rename i2p2www/meetings/{ => logs}/211.rst (100%) rename i2p2www/meetings/{ => logs}/212.log (100%) rename i2p2www/meetings/{ => logs}/212.rst (100%) rename i2p2www/meetings/{ => logs}/22.log (100%) rename i2p2www/meetings/{ => logs}/22.rst (100%) rename i2p2www/meetings/{ => logs}/23.log (100%) rename i2p2www/meetings/{ => logs}/23.rst (100%) rename i2p2www/meetings/{ => logs}/25.log (100%) rename i2p2www/meetings/{ => logs}/25.rst (100%) rename i2p2www/meetings/{ => logs}/26.log (100%) rename i2p2www/meetings/{ => logs}/26.rst (100%) rename i2p2www/meetings/{ => logs}/28.log (100%) rename i2p2www/meetings/{ => logs}/28.rst (100%) rename i2p2www/meetings/{ => logs}/29.log (100%) rename i2p2www/meetings/{ => logs}/29.rst (100%) rename i2p2www/meetings/{ => logs}/3.log (100%) rename i2p2www/meetings/{ => logs}/3.rst (100%) rename i2p2www/meetings/{ => logs}/30.log (100%) rename i2p2www/meetings/{ => logs}/30.rst (100%) rename i2p2www/meetings/{ => logs}/31.log (100%) rename i2p2www/meetings/{ => logs}/31.rst (100%) rename i2p2www/meetings/{ => logs}/32.log (100%) rename i2p2www/meetings/{ => logs}/32.rst (100%) rename i2p2www/meetings/{ => logs}/33.log (100%) rename i2p2www/meetings/{ => logs}/33.rst (100%) rename i2p2www/meetings/{ => logs}/34.log (100%) rename i2p2www/meetings/{ => logs}/34.rst (100%) rename i2p2www/meetings/{ => logs}/35.log (100%) rename i2p2www/meetings/{ => logs}/35.rst (100%) rename i2p2www/meetings/{ => logs}/4.log (100%) rename i2p2www/meetings/{ => logs}/4.rst (100%) rename i2p2www/meetings/{ => logs}/47.log (100%) rename i2p2www/meetings/{ => logs}/47.rst (100%) rename i2p2www/meetings/{ => logs}/49.log (100%) rename i2p2www/meetings/{ => logs}/49.rst (100%) rename i2p2www/meetings/{ => logs}/50.log (100%) rename i2p2www/meetings/{ => logs}/50.rst (100%) rename i2p2www/meetings/{ => logs}/51.log (100%) rename i2p2www/meetings/{ => logs}/51.rst (100%) rename i2p2www/meetings/{ => logs}/52.log (100%) rename i2p2www/meetings/{ => logs}/52.rst (100%) rename i2p2www/meetings/{ => logs}/53.log (100%) rename i2p2www/meetings/{ => logs}/53.rst (100%) rename i2p2www/meetings/{ => logs}/54.log (100%) rename i2p2www/meetings/{ => logs}/54.rst (100%) rename i2p2www/meetings/{ => logs}/55.log (100%) rename i2p2www/meetings/{ => logs}/55.rst (100%) rename i2p2www/meetings/{ => logs}/56.log (100%) rename i2p2www/meetings/{ => logs}/56.rst (100%) rename i2p2www/meetings/{ => logs}/57.log (100%) rename i2p2www/meetings/{ => logs}/57.rst (100%) rename i2p2www/meetings/{ => logs}/58.log (100%) rename i2p2www/meetings/{ => logs}/58.rst (100%) rename i2p2www/meetings/{ => logs}/59.log (100%) rename i2p2www/meetings/{ => logs}/59.rst (100%) rename i2p2www/meetings/{ => logs}/60.log (100%) rename i2p2www/meetings/{ => logs}/60.rst (100%) rename i2p2www/meetings/{ => logs}/61.log (100%) rename i2p2www/meetings/{ => logs}/61.rst (100%) rename i2p2www/meetings/{ => logs}/62.log (100%) rename i2p2www/meetings/{ => logs}/62.rst (100%) rename i2p2www/meetings/{ => logs}/63.log (100%) rename i2p2www/meetings/{ => logs}/63.rst (100%) rename i2p2www/meetings/{ => logs}/64.log (100%) rename i2p2www/meetings/{ => logs}/64.rst (100%) rename i2p2www/meetings/{ => logs}/65.log (100%) rename i2p2www/meetings/{ => logs}/65.rst (100%) rename i2p2www/meetings/{ => logs}/66.log (100%) rename i2p2www/meetings/{ => logs}/66.rst (100%) rename i2p2www/meetings/{ => logs}/68.log (100%) rename i2p2www/meetings/{ => logs}/68.rst (100%) rename i2p2www/meetings/{ => logs}/69.log (100%) rename i2p2www/meetings/{ => logs}/69.rst (100%) rename i2p2www/meetings/{ => logs}/7.log (100%) rename i2p2www/meetings/{ => logs}/7.rst (100%) rename i2p2www/meetings/{ => logs}/70.log (100%) rename i2p2www/meetings/{ => logs}/70.rst (100%) rename i2p2www/meetings/{ => logs}/71.log (100%) rename i2p2www/meetings/{ => logs}/71.rst (100%) rename i2p2www/meetings/{ => logs}/72.log (100%) rename i2p2www/meetings/{ => logs}/72.rst (100%) rename i2p2www/meetings/{ => logs}/73.log (100%) rename i2p2www/meetings/{ => logs}/73.rst (100%) rename i2p2www/meetings/{ => logs}/74.log (100%) rename i2p2www/meetings/{ => logs}/74.rst (100%) rename i2p2www/meetings/{ => logs}/75.log (100%) rename i2p2www/meetings/{ => logs}/75.rst (100%) rename i2p2www/meetings/{ => logs}/76.log (100%) rename i2p2www/meetings/{ => logs}/76.rst (100%) rename i2p2www/meetings/{ => logs}/77.log (100%) rename i2p2www/meetings/{ => logs}/77.rst (100%) rename i2p2www/meetings/{ => logs}/78.log (100%) rename i2p2www/meetings/{ => logs}/78.rst (100%) rename i2p2www/meetings/{ => logs}/79.log (100%) rename i2p2www/meetings/{ => logs}/79.rst (100%) rename i2p2www/meetings/{ => logs}/8.log (100%) rename i2p2www/meetings/{ => logs}/8.rst (100%) rename i2p2www/meetings/{ => logs}/80.log (100%) rename i2p2www/meetings/{ => logs}/80.rst (100%) rename i2p2www/meetings/{ => logs}/81.log (100%) rename i2p2www/meetings/{ => logs}/81.rst (100%) rename i2p2www/meetings/{ => logs}/82.log (100%) rename i2p2www/meetings/{ => logs}/82.rst (100%) rename i2p2www/meetings/{ => logs}/9.log (100%) rename i2p2www/meetings/{ => logs}/9.rst (100%) rename i2p2www/meetings/{ => logs}/90.log (100%) rename i2p2www/meetings/{ => logs}/90.rst (100%) rename i2p2www/meetings/{ => logs}/92.log (100%) rename i2p2www/meetings/{ => logs}/92.rst (100%) rename i2p2www/meetings/{ => logs}/93.log (100%) rename i2p2www/meetings/{ => logs}/93.rst (100%) rename i2p2www/meetings/{ => logs}/95.log (100%) rename i2p2www/meetings/{ => logs}/95.rst (100%) rename i2p2www/meetings/{ => logs}/99.log (100%) rename i2p2www/meetings/{ => logs}/99.rst (100%) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 8ebd1baa..18c4bac0 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -24,7 +24,7 @@ TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'pages') STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static') BLOG_DIR = os.path.join(os.path.dirname(__file__), 'blog') -MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings') +MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings/logs') BLOG_ENTRIES_PER_PAGE = 20 MEETINGS_PER_PAGE = 20 diff --git a/i2p2www/meetings/1.log b/i2p2www/meetings/logs/1.log similarity index 100% rename from i2p2www/meetings/1.log rename to i2p2www/meetings/logs/1.log diff --git a/i2p2www/meetings/1.rst b/i2p2www/meetings/logs/1.rst similarity index 100% rename from i2p2www/meetings/1.rst rename to i2p2www/meetings/logs/1.rst diff --git a/i2p2www/meetings/10.log b/i2p2www/meetings/logs/10.log similarity index 100% rename from i2p2www/meetings/10.log rename to i2p2www/meetings/logs/10.log diff --git a/i2p2www/meetings/10.rst b/i2p2www/meetings/logs/10.rst similarity index 100% rename from i2p2www/meetings/10.rst rename to i2p2www/meetings/logs/10.rst diff --git a/i2p2www/meetings/100.log b/i2p2www/meetings/logs/100.log similarity index 100% rename from i2p2www/meetings/100.log rename to i2p2www/meetings/logs/100.log diff --git a/i2p2www/meetings/100.rst b/i2p2www/meetings/logs/100.rst similarity index 100% rename from i2p2www/meetings/100.rst rename to i2p2www/meetings/logs/100.rst diff --git a/i2p2www/meetings/101.log b/i2p2www/meetings/logs/101.log similarity index 100% rename from i2p2www/meetings/101.log rename to i2p2www/meetings/logs/101.log diff --git a/i2p2www/meetings/101.rst b/i2p2www/meetings/logs/101.rst similarity index 100% rename from i2p2www/meetings/101.rst rename to i2p2www/meetings/logs/101.rst diff --git a/i2p2www/meetings/102.log b/i2p2www/meetings/logs/102.log similarity index 100% rename from i2p2www/meetings/102.log rename to i2p2www/meetings/logs/102.log diff --git a/i2p2www/meetings/102.rst b/i2p2www/meetings/logs/102.rst similarity index 100% rename from i2p2www/meetings/102.rst rename to i2p2www/meetings/logs/102.rst diff --git a/i2p2www/meetings/103.log b/i2p2www/meetings/logs/103.log similarity index 100% rename from i2p2www/meetings/103.log rename to i2p2www/meetings/logs/103.log diff --git a/i2p2www/meetings/103.rst b/i2p2www/meetings/logs/103.rst similarity index 100% rename from i2p2www/meetings/103.rst rename to i2p2www/meetings/logs/103.rst diff --git a/i2p2www/meetings/104.log b/i2p2www/meetings/logs/104.log similarity index 100% rename from i2p2www/meetings/104.log rename to i2p2www/meetings/logs/104.log diff --git a/i2p2www/meetings/104.rst b/i2p2www/meetings/logs/104.rst similarity index 100% rename from i2p2www/meetings/104.rst rename to i2p2www/meetings/logs/104.rst diff --git a/i2p2www/meetings/105.log b/i2p2www/meetings/logs/105.log similarity index 100% rename from i2p2www/meetings/105.log rename to i2p2www/meetings/logs/105.log diff --git a/i2p2www/meetings/105.rst b/i2p2www/meetings/logs/105.rst similarity index 100% rename from i2p2www/meetings/105.rst rename to i2p2www/meetings/logs/105.rst diff --git a/i2p2www/meetings/106.log b/i2p2www/meetings/logs/106.log similarity index 100% rename from i2p2www/meetings/106.log rename to i2p2www/meetings/logs/106.log diff --git a/i2p2www/meetings/106.rst b/i2p2www/meetings/logs/106.rst similarity index 100% rename from i2p2www/meetings/106.rst rename to i2p2www/meetings/logs/106.rst diff --git a/i2p2www/meetings/107.log b/i2p2www/meetings/logs/107.log similarity index 100% rename from i2p2www/meetings/107.log rename to i2p2www/meetings/logs/107.log diff --git a/i2p2www/meetings/107.rst b/i2p2www/meetings/logs/107.rst similarity index 100% rename from i2p2www/meetings/107.rst rename to i2p2www/meetings/logs/107.rst diff --git a/i2p2www/meetings/108.log b/i2p2www/meetings/logs/108.log similarity index 100% rename from i2p2www/meetings/108.log rename to i2p2www/meetings/logs/108.log diff --git a/i2p2www/meetings/108.rst b/i2p2www/meetings/logs/108.rst similarity index 100% rename from i2p2www/meetings/108.rst rename to i2p2www/meetings/logs/108.rst diff --git a/i2p2www/meetings/109.log b/i2p2www/meetings/logs/109.log similarity index 100% rename from i2p2www/meetings/109.log rename to i2p2www/meetings/logs/109.log diff --git a/i2p2www/meetings/109.rst b/i2p2www/meetings/logs/109.rst similarity index 100% rename from i2p2www/meetings/109.rst rename to i2p2www/meetings/logs/109.rst diff --git a/i2p2www/meetings/11.log b/i2p2www/meetings/logs/11.log similarity index 100% rename from i2p2www/meetings/11.log rename to i2p2www/meetings/logs/11.log diff --git a/i2p2www/meetings/11.rst b/i2p2www/meetings/logs/11.rst similarity index 100% rename from i2p2www/meetings/11.rst rename to i2p2www/meetings/logs/11.rst diff --git a/i2p2www/meetings/110.log b/i2p2www/meetings/logs/110.log similarity index 100% rename from i2p2www/meetings/110.log rename to i2p2www/meetings/logs/110.log diff --git a/i2p2www/meetings/110.rst b/i2p2www/meetings/logs/110.rst similarity index 100% rename from i2p2www/meetings/110.rst rename to i2p2www/meetings/logs/110.rst diff --git a/i2p2www/meetings/111.log b/i2p2www/meetings/logs/111.log similarity index 100% rename from i2p2www/meetings/111.log rename to i2p2www/meetings/logs/111.log diff --git a/i2p2www/meetings/111.rst b/i2p2www/meetings/logs/111.rst similarity index 100% rename from i2p2www/meetings/111.rst rename to i2p2www/meetings/logs/111.rst diff --git a/i2p2www/meetings/112.log b/i2p2www/meetings/logs/112.log similarity index 100% rename from i2p2www/meetings/112.log rename to i2p2www/meetings/logs/112.log diff --git a/i2p2www/meetings/112.rst b/i2p2www/meetings/logs/112.rst similarity index 100% rename from i2p2www/meetings/112.rst rename to i2p2www/meetings/logs/112.rst diff --git a/i2p2www/meetings/113.log b/i2p2www/meetings/logs/113.log similarity index 100% rename from i2p2www/meetings/113.log rename to i2p2www/meetings/logs/113.log diff --git a/i2p2www/meetings/113.rst b/i2p2www/meetings/logs/113.rst similarity index 100% rename from i2p2www/meetings/113.rst rename to i2p2www/meetings/logs/113.rst diff --git a/i2p2www/meetings/114.log b/i2p2www/meetings/logs/114.log similarity index 100% rename from i2p2www/meetings/114.log rename to i2p2www/meetings/logs/114.log diff --git a/i2p2www/meetings/114.rst b/i2p2www/meetings/logs/114.rst similarity index 100% rename from i2p2www/meetings/114.rst rename to i2p2www/meetings/logs/114.rst diff --git a/i2p2www/meetings/115.log b/i2p2www/meetings/logs/115.log similarity index 100% rename from i2p2www/meetings/115.log rename to i2p2www/meetings/logs/115.log diff --git a/i2p2www/meetings/115.rst b/i2p2www/meetings/logs/115.rst similarity index 100% rename from i2p2www/meetings/115.rst rename to i2p2www/meetings/logs/115.rst diff --git a/i2p2www/meetings/116.log b/i2p2www/meetings/logs/116.log similarity index 100% rename from i2p2www/meetings/116.log rename to i2p2www/meetings/logs/116.log diff --git a/i2p2www/meetings/116.rst b/i2p2www/meetings/logs/116.rst similarity index 100% rename from i2p2www/meetings/116.rst rename to i2p2www/meetings/logs/116.rst diff --git a/i2p2www/meetings/117.log b/i2p2www/meetings/logs/117.log similarity index 100% rename from i2p2www/meetings/117.log rename to i2p2www/meetings/logs/117.log diff --git a/i2p2www/meetings/117.rst b/i2p2www/meetings/logs/117.rst similarity index 100% rename from i2p2www/meetings/117.rst rename to i2p2www/meetings/logs/117.rst diff --git a/i2p2www/meetings/118.log b/i2p2www/meetings/logs/118.log similarity index 100% rename from i2p2www/meetings/118.log rename to i2p2www/meetings/logs/118.log diff --git a/i2p2www/meetings/118.rst b/i2p2www/meetings/logs/118.rst similarity index 100% rename from i2p2www/meetings/118.rst rename to i2p2www/meetings/logs/118.rst diff --git a/i2p2www/meetings/119.log b/i2p2www/meetings/logs/119.log similarity index 100% rename from i2p2www/meetings/119.log rename to i2p2www/meetings/logs/119.log diff --git a/i2p2www/meetings/119.rst b/i2p2www/meetings/logs/119.rst similarity index 100% rename from i2p2www/meetings/119.rst rename to i2p2www/meetings/logs/119.rst diff --git a/i2p2www/meetings/12.log b/i2p2www/meetings/logs/12.log similarity index 100% rename from i2p2www/meetings/12.log rename to i2p2www/meetings/logs/12.log diff --git a/i2p2www/meetings/12.rst b/i2p2www/meetings/logs/12.rst similarity index 100% rename from i2p2www/meetings/12.rst rename to i2p2www/meetings/logs/12.rst diff --git a/i2p2www/meetings/120.log b/i2p2www/meetings/logs/120.log similarity index 100% rename from i2p2www/meetings/120.log rename to i2p2www/meetings/logs/120.log diff --git a/i2p2www/meetings/120.rst b/i2p2www/meetings/logs/120.rst similarity index 100% rename from i2p2www/meetings/120.rst rename to i2p2www/meetings/logs/120.rst diff --git a/i2p2www/meetings/121.log b/i2p2www/meetings/logs/121.log similarity index 100% rename from i2p2www/meetings/121.log rename to i2p2www/meetings/logs/121.log diff --git a/i2p2www/meetings/121.rst b/i2p2www/meetings/logs/121.rst similarity index 100% rename from i2p2www/meetings/121.rst rename to i2p2www/meetings/logs/121.rst diff --git a/i2p2www/meetings/122.log b/i2p2www/meetings/logs/122.log similarity index 100% rename from i2p2www/meetings/122.log rename to i2p2www/meetings/logs/122.log diff --git a/i2p2www/meetings/122.rst b/i2p2www/meetings/logs/122.rst similarity index 100% rename from i2p2www/meetings/122.rst rename to i2p2www/meetings/logs/122.rst diff --git a/i2p2www/meetings/123.log b/i2p2www/meetings/logs/123.log similarity index 100% rename from i2p2www/meetings/123.log rename to i2p2www/meetings/logs/123.log diff --git a/i2p2www/meetings/123.rst b/i2p2www/meetings/logs/123.rst similarity index 100% rename from i2p2www/meetings/123.rst rename to i2p2www/meetings/logs/123.rst diff --git a/i2p2www/meetings/124.log b/i2p2www/meetings/logs/124.log similarity index 100% rename from i2p2www/meetings/124.log rename to i2p2www/meetings/logs/124.log diff --git a/i2p2www/meetings/124.rst b/i2p2www/meetings/logs/124.rst similarity index 100% rename from i2p2www/meetings/124.rst rename to i2p2www/meetings/logs/124.rst diff --git a/i2p2www/meetings/125.log b/i2p2www/meetings/logs/125.log similarity index 100% rename from i2p2www/meetings/125.log rename to i2p2www/meetings/logs/125.log diff --git a/i2p2www/meetings/125.rst b/i2p2www/meetings/logs/125.rst similarity index 100% rename from i2p2www/meetings/125.rst rename to i2p2www/meetings/logs/125.rst diff --git a/i2p2www/meetings/126.log b/i2p2www/meetings/logs/126.log similarity index 100% rename from i2p2www/meetings/126.log rename to i2p2www/meetings/logs/126.log diff --git a/i2p2www/meetings/126.rst b/i2p2www/meetings/logs/126.rst similarity index 100% rename from i2p2www/meetings/126.rst rename to i2p2www/meetings/logs/126.rst diff --git a/i2p2www/meetings/127.log b/i2p2www/meetings/logs/127.log similarity index 100% rename from i2p2www/meetings/127.log rename to i2p2www/meetings/logs/127.log diff --git a/i2p2www/meetings/127.rst b/i2p2www/meetings/logs/127.rst similarity index 100% rename from i2p2www/meetings/127.rst rename to i2p2www/meetings/logs/127.rst diff --git a/i2p2www/meetings/128.log b/i2p2www/meetings/logs/128.log similarity index 100% rename from i2p2www/meetings/128.log rename to i2p2www/meetings/logs/128.log diff --git a/i2p2www/meetings/128.rst b/i2p2www/meetings/logs/128.rst similarity index 100% rename from i2p2www/meetings/128.rst rename to i2p2www/meetings/logs/128.rst diff --git a/i2p2www/meetings/129.log b/i2p2www/meetings/logs/129.log similarity index 100% rename from i2p2www/meetings/129.log rename to i2p2www/meetings/logs/129.log diff --git a/i2p2www/meetings/129.rst b/i2p2www/meetings/logs/129.rst similarity index 100% rename from i2p2www/meetings/129.rst rename to i2p2www/meetings/logs/129.rst diff --git a/i2p2www/meetings/130.log b/i2p2www/meetings/logs/130.log similarity index 100% rename from i2p2www/meetings/130.log rename to i2p2www/meetings/logs/130.log diff --git a/i2p2www/meetings/130.rst b/i2p2www/meetings/logs/130.rst similarity index 100% rename from i2p2www/meetings/130.rst rename to i2p2www/meetings/logs/130.rst diff --git a/i2p2www/meetings/131.log b/i2p2www/meetings/logs/131.log similarity index 100% rename from i2p2www/meetings/131.log rename to i2p2www/meetings/logs/131.log diff --git a/i2p2www/meetings/131.rst b/i2p2www/meetings/logs/131.rst similarity index 100% rename from i2p2www/meetings/131.rst rename to i2p2www/meetings/logs/131.rst diff --git a/i2p2www/meetings/132.log b/i2p2www/meetings/logs/132.log similarity index 100% rename from i2p2www/meetings/132.log rename to i2p2www/meetings/logs/132.log diff --git a/i2p2www/meetings/132.rst b/i2p2www/meetings/logs/132.rst similarity index 100% rename from i2p2www/meetings/132.rst rename to i2p2www/meetings/logs/132.rst diff --git a/i2p2www/meetings/133.log b/i2p2www/meetings/logs/133.log similarity index 100% rename from i2p2www/meetings/133.log rename to i2p2www/meetings/logs/133.log diff --git a/i2p2www/meetings/133.rst b/i2p2www/meetings/logs/133.rst similarity index 100% rename from i2p2www/meetings/133.rst rename to i2p2www/meetings/logs/133.rst diff --git a/i2p2www/meetings/134.log b/i2p2www/meetings/logs/134.log similarity index 100% rename from i2p2www/meetings/134.log rename to i2p2www/meetings/logs/134.log diff --git a/i2p2www/meetings/134.rst b/i2p2www/meetings/logs/134.rst similarity index 100% rename from i2p2www/meetings/134.rst rename to i2p2www/meetings/logs/134.rst diff --git a/i2p2www/meetings/135.log b/i2p2www/meetings/logs/135.log similarity index 100% rename from i2p2www/meetings/135.log rename to i2p2www/meetings/logs/135.log diff --git a/i2p2www/meetings/135.rst b/i2p2www/meetings/logs/135.rst similarity index 100% rename from i2p2www/meetings/135.rst rename to i2p2www/meetings/logs/135.rst diff --git a/i2p2www/meetings/136.log b/i2p2www/meetings/logs/136.log similarity index 100% rename from i2p2www/meetings/136.log rename to i2p2www/meetings/logs/136.log diff --git a/i2p2www/meetings/136.rst b/i2p2www/meetings/logs/136.rst similarity index 100% rename from i2p2www/meetings/136.rst rename to i2p2www/meetings/logs/136.rst diff --git a/i2p2www/meetings/137.log b/i2p2www/meetings/logs/137.log similarity index 100% rename from i2p2www/meetings/137.log rename to i2p2www/meetings/logs/137.log diff --git a/i2p2www/meetings/137.rst b/i2p2www/meetings/logs/137.rst similarity index 100% rename from i2p2www/meetings/137.rst rename to i2p2www/meetings/logs/137.rst diff --git a/i2p2www/meetings/138.log b/i2p2www/meetings/logs/138.log similarity index 100% rename from i2p2www/meetings/138.log rename to i2p2www/meetings/logs/138.log diff --git a/i2p2www/meetings/138.rst b/i2p2www/meetings/logs/138.rst similarity index 100% rename from i2p2www/meetings/138.rst rename to i2p2www/meetings/logs/138.rst diff --git a/i2p2www/meetings/139.log b/i2p2www/meetings/logs/139.log similarity index 100% rename from i2p2www/meetings/139.log rename to i2p2www/meetings/logs/139.log diff --git a/i2p2www/meetings/139.rst b/i2p2www/meetings/logs/139.rst similarity index 100% rename from i2p2www/meetings/139.rst rename to i2p2www/meetings/logs/139.rst diff --git a/i2p2www/meetings/140.log b/i2p2www/meetings/logs/140.log similarity index 100% rename from i2p2www/meetings/140.log rename to i2p2www/meetings/logs/140.log diff --git a/i2p2www/meetings/140.rst b/i2p2www/meetings/logs/140.rst similarity index 100% rename from i2p2www/meetings/140.rst rename to i2p2www/meetings/logs/140.rst diff --git a/i2p2www/meetings/141.log b/i2p2www/meetings/logs/141.log similarity index 100% rename from i2p2www/meetings/141.log rename to i2p2www/meetings/logs/141.log diff --git a/i2p2www/meetings/141.rst b/i2p2www/meetings/logs/141.rst similarity index 100% rename from i2p2www/meetings/141.rst rename to i2p2www/meetings/logs/141.rst diff --git a/i2p2www/meetings/142.log b/i2p2www/meetings/logs/142.log similarity index 100% rename from i2p2www/meetings/142.log rename to i2p2www/meetings/logs/142.log diff --git a/i2p2www/meetings/142.rst b/i2p2www/meetings/logs/142.rst similarity index 100% rename from i2p2www/meetings/142.rst rename to i2p2www/meetings/logs/142.rst diff --git a/i2p2www/meetings/143.log b/i2p2www/meetings/logs/143.log similarity index 100% rename from i2p2www/meetings/143.log rename to i2p2www/meetings/logs/143.log diff --git a/i2p2www/meetings/143.rst b/i2p2www/meetings/logs/143.rst similarity index 100% rename from i2p2www/meetings/143.rst rename to i2p2www/meetings/logs/143.rst diff --git a/i2p2www/meetings/144.log b/i2p2www/meetings/logs/144.log similarity index 100% rename from i2p2www/meetings/144.log rename to i2p2www/meetings/logs/144.log diff --git a/i2p2www/meetings/144.rst b/i2p2www/meetings/logs/144.rst similarity index 100% rename from i2p2www/meetings/144.rst rename to i2p2www/meetings/logs/144.rst diff --git a/i2p2www/meetings/145.log b/i2p2www/meetings/logs/145.log similarity index 100% rename from i2p2www/meetings/145.log rename to i2p2www/meetings/logs/145.log diff --git a/i2p2www/meetings/145.rst b/i2p2www/meetings/logs/145.rst similarity index 100% rename from i2p2www/meetings/145.rst rename to i2p2www/meetings/logs/145.rst diff --git a/i2p2www/meetings/146.log b/i2p2www/meetings/logs/146.log similarity index 100% rename from i2p2www/meetings/146.log rename to i2p2www/meetings/logs/146.log diff --git a/i2p2www/meetings/146.rst b/i2p2www/meetings/logs/146.rst similarity index 100% rename from i2p2www/meetings/146.rst rename to i2p2www/meetings/logs/146.rst diff --git a/i2p2www/meetings/147.log b/i2p2www/meetings/logs/147.log similarity index 100% rename from i2p2www/meetings/147.log rename to i2p2www/meetings/logs/147.log diff --git a/i2p2www/meetings/147.rst b/i2p2www/meetings/logs/147.rst similarity index 100% rename from i2p2www/meetings/147.rst rename to i2p2www/meetings/logs/147.rst diff --git a/i2p2www/meetings/148.log b/i2p2www/meetings/logs/148.log similarity index 100% rename from i2p2www/meetings/148.log rename to i2p2www/meetings/logs/148.log diff --git a/i2p2www/meetings/148.rst b/i2p2www/meetings/logs/148.rst similarity index 100% rename from i2p2www/meetings/148.rst rename to i2p2www/meetings/logs/148.rst diff --git a/i2p2www/meetings/149.log b/i2p2www/meetings/logs/149.log similarity index 100% rename from i2p2www/meetings/149.log rename to i2p2www/meetings/logs/149.log diff --git a/i2p2www/meetings/149.rst b/i2p2www/meetings/logs/149.rst similarity index 100% rename from i2p2www/meetings/149.rst rename to i2p2www/meetings/logs/149.rst diff --git a/i2p2www/meetings/15.log b/i2p2www/meetings/logs/15.log similarity index 100% rename from i2p2www/meetings/15.log rename to i2p2www/meetings/logs/15.log diff --git a/i2p2www/meetings/15.rst b/i2p2www/meetings/logs/15.rst similarity index 100% rename from i2p2www/meetings/15.rst rename to i2p2www/meetings/logs/15.rst diff --git a/i2p2www/meetings/150.log b/i2p2www/meetings/logs/150.log similarity index 100% rename from i2p2www/meetings/150.log rename to i2p2www/meetings/logs/150.log diff --git a/i2p2www/meetings/150.rst b/i2p2www/meetings/logs/150.rst similarity index 100% rename from i2p2www/meetings/150.rst rename to i2p2www/meetings/logs/150.rst diff --git a/i2p2www/meetings/151.log b/i2p2www/meetings/logs/151.log similarity index 100% rename from i2p2www/meetings/151.log rename to i2p2www/meetings/logs/151.log diff --git a/i2p2www/meetings/151.rst b/i2p2www/meetings/logs/151.rst similarity index 100% rename from i2p2www/meetings/151.rst rename to i2p2www/meetings/logs/151.rst diff --git a/i2p2www/meetings/152.log b/i2p2www/meetings/logs/152.log similarity index 100% rename from i2p2www/meetings/152.log rename to i2p2www/meetings/logs/152.log diff --git a/i2p2www/meetings/152.rst b/i2p2www/meetings/logs/152.rst similarity index 100% rename from i2p2www/meetings/152.rst rename to i2p2www/meetings/logs/152.rst diff --git a/i2p2www/meetings/153.log b/i2p2www/meetings/logs/153.log similarity index 100% rename from i2p2www/meetings/153.log rename to i2p2www/meetings/logs/153.log diff --git a/i2p2www/meetings/153.rst b/i2p2www/meetings/logs/153.rst similarity index 100% rename from i2p2www/meetings/153.rst rename to i2p2www/meetings/logs/153.rst diff --git a/i2p2www/meetings/154.log b/i2p2www/meetings/logs/154.log similarity index 100% rename from i2p2www/meetings/154.log rename to i2p2www/meetings/logs/154.log diff --git a/i2p2www/meetings/154.rst b/i2p2www/meetings/logs/154.rst similarity index 100% rename from i2p2www/meetings/154.rst rename to i2p2www/meetings/logs/154.rst diff --git a/i2p2www/meetings/155.log b/i2p2www/meetings/logs/155.log similarity index 100% rename from i2p2www/meetings/155.log rename to i2p2www/meetings/logs/155.log diff --git a/i2p2www/meetings/155.rst b/i2p2www/meetings/logs/155.rst similarity index 100% rename from i2p2www/meetings/155.rst rename to i2p2www/meetings/logs/155.rst diff --git a/i2p2www/meetings/156.log b/i2p2www/meetings/logs/156.log similarity index 100% rename from i2p2www/meetings/156.log rename to i2p2www/meetings/logs/156.log diff --git a/i2p2www/meetings/156.rst b/i2p2www/meetings/logs/156.rst similarity index 100% rename from i2p2www/meetings/156.rst rename to i2p2www/meetings/logs/156.rst diff --git a/i2p2www/meetings/157.log b/i2p2www/meetings/logs/157.log similarity index 100% rename from i2p2www/meetings/157.log rename to i2p2www/meetings/logs/157.log diff --git a/i2p2www/meetings/157.rst b/i2p2www/meetings/logs/157.rst similarity index 100% rename from i2p2www/meetings/157.rst rename to i2p2www/meetings/logs/157.rst diff --git a/i2p2www/meetings/158.log b/i2p2www/meetings/logs/158.log similarity index 100% rename from i2p2www/meetings/158.log rename to i2p2www/meetings/logs/158.log diff --git a/i2p2www/meetings/158.rst b/i2p2www/meetings/logs/158.rst similarity index 100% rename from i2p2www/meetings/158.rst rename to i2p2www/meetings/logs/158.rst diff --git a/i2p2www/meetings/159.log b/i2p2www/meetings/logs/159.log similarity index 100% rename from i2p2www/meetings/159.log rename to i2p2www/meetings/logs/159.log diff --git a/i2p2www/meetings/159.rst b/i2p2www/meetings/logs/159.rst similarity index 100% rename from i2p2www/meetings/159.rst rename to i2p2www/meetings/logs/159.rst diff --git a/i2p2www/meetings/160.log b/i2p2www/meetings/logs/160.log similarity index 100% rename from i2p2www/meetings/160.log rename to i2p2www/meetings/logs/160.log diff --git a/i2p2www/meetings/160.rst b/i2p2www/meetings/logs/160.rst similarity index 100% rename from i2p2www/meetings/160.rst rename to i2p2www/meetings/logs/160.rst diff --git a/i2p2www/meetings/161.log b/i2p2www/meetings/logs/161.log similarity index 100% rename from i2p2www/meetings/161.log rename to i2p2www/meetings/logs/161.log diff --git a/i2p2www/meetings/161.rst b/i2p2www/meetings/logs/161.rst similarity index 100% rename from i2p2www/meetings/161.rst rename to i2p2www/meetings/logs/161.rst diff --git a/i2p2www/meetings/162.log b/i2p2www/meetings/logs/162.log similarity index 100% rename from i2p2www/meetings/162.log rename to i2p2www/meetings/logs/162.log diff --git a/i2p2www/meetings/162.rst b/i2p2www/meetings/logs/162.rst similarity index 100% rename from i2p2www/meetings/162.rst rename to i2p2www/meetings/logs/162.rst diff --git a/i2p2www/meetings/163.log b/i2p2www/meetings/logs/163.log similarity index 100% rename from i2p2www/meetings/163.log rename to i2p2www/meetings/logs/163.log diff --git a/i2p2www/meetings/163.rst b/i2p2www/meetings/logs/163.rst similarity index 100% rename from i2p2www/meetings/163.rst rename to i2p2www/meetings/logs/163.rst diff --git a/i2p2www/meetings/164.log b/i2p2www/meetings/logs/164.log similarity index 100% rename from i2p2www/meetings/164.log rename to i2p2www/meetings/logs/164.log diff --git a/i2p2www/meetings/164.rst b/i2p2www/meetings/logs/164.rst similarity index 100% rename from i2p2www/meetings/164.rst rename to i2p2www/meetings/logs/164.rst diff --git a/i2p2www/meetings/165.log b/i2p2www/meetings/logs/165.log similarity index 100% rename from i2p2www/meetings/165.log rename to i2p2www/meetings/logs/165.log diff --git a/i2p2www/meetings/165.rst b/i2p2www/meetings/logs/165.rst similarity index 100% rename from i2p2www/meetings/165.rst rename to i2p2www/meetings/logs/165.rst diff --git a/i2p2www/meetings/166.log b/i2p2www/meetings/logs/166.log similarity index 100% rename from i2p2www/meetings/166.log rename to i2p2www/meetings/logs/166.log diff --git a/i2p2www/meetings/166.rst b/i2p2www/meetings/logs/166.rst similarity index 100% rename from i2p2www/meetings/166.rst rename to i2p2www/meetings/logs/166.rst diff --git a/i2p2www/meetings/167.log b/i2p2www/meetings/logs/167.log similarity index 100% rename from i2p2www/meetings/167.log rename to i2p2www/meetings/logs/167.log diff --git a/i2p2www/meetings/167.rst b/i2p2www/meetings/logs/167.rst similarity index 100% rename from i2p2www/meetings/167.rst rename to i2p2www/meetings/logs/167.rst diff --git a/i2p2www/meetings/168.log b/i2p2www/meetings/logs/168.log similarity index 100% rename from i2p2www/meetings/168.log rename to i2p2www/meetings/logs/168.log diff --git a/i2p2www/meetings/168.rst b/i2p2www/meetings/logs/168.rst similarity index 100% rename from i2p2www/meetings/168.rst rename to i2p2www/meetings/logs/168.rst diff --git a/i2p2www/meetings/170.log b/i2p2www/meetings/logs/170.log similarity index 100% rename from i2p2www/meetings/170.log rename to i2p2www/meetings/logs/170.log diff --git a/i2p2www/meetings/170.rst b/i2p2www/meetings/logs/170.rst similarity index 100% rename from i2p2www/meetings/170.rst rename to i2p2www/meetings/logs/170.rst diff --git a/i2p2www/meetings/171.log b/i2p2www/meetings/logs/171.log similarity index 100% rename from i2p2www/meetings/171.log rename to i2p2www/meetings/logs/171.log diff --git a/i2p2www/meetings/171.rst b/i2p2www/meetings/logs/171.rst similarity index 100% rename from i2p2www/meetings/171.rst rename to i2p2www/meetings/logs/171.rst diff --git a/i2p2www/meetings/172.log b/i2p2www/meetings/logs/172.log similarity index 100% rename from i2p2www/meetings/172.log rename to i2p2www/meetings/logs/172.log diff --git a/i2p2www/meetings/172.rst b/i2p2www/meetings/logs/172.rst similarity index 100% rename from i2p2www/meetings/172.rst rename to i2p2www/meetings/logs/172.rst diff --git a/i2p2www/meetings/173.log b/i2p2www/meetings/logs/173.log similarity index 100% rename from i2p2www/meetings/173.log rename to i2p2www/meetings/logs/173.log diff --git a/i2p2www/meetings/173.rst b/i2p2www/meetings/logs/173.rst similarity index 100% rename from i2p2www/meetings/173.rst rename to i2p2www/meetings/logs/173.rst diff --git a/i2p2www/meetings/174.log b/i2p2www/meetings/logs/174.log similarity index 100% rename from i2p2www/meetings/174.log rename to i2p2www/meetings/logs/174.log diff --git a/i2p2www/meetings/174.rst b/i2p2www/meetings/logs/174.rst similarity index 100% rename from i2p2www/meetings/174.rst rename to i2p2www/meetings/logs/174.rst diff --git a/i2p2www/meetings/175.log b/i2p2www/meetings/logs/175.log similarity index 100% rename from i2p2www/meetings/175.log rename to i2p2www/meetings/logs/175.log diff --git a/i2p2www/meetings/175.rst b/i2p2www/meetings/logs/175.rst similarity index 100% rename from i2p2www/meetings/175.rst rename to i2p2www/meetings/logs/175.rst diff --git a/i2p2www/meetings/176.log b/i2p2www/meetings/logs/176.log similarity index 100% rename from i2p2www/meetings/176.log rename to i2p2www/meetings/logs/176.log diff --git a/i2p2www/meetings/176.rst b/i2p2www/meetings/logs/176.rst similarity index 100% rename from i2p2www/meetings/176.rst rename to i2p2www/meetings/logs/176.rst diff --git a/i2p2www/meetings/177.log b/i2p2www/meetings/logs/177.log similarity index 100% rename from i2p2www/meetings/177.log rename to i2p2www/meetings/logs/177.log diff --git a/i2p2www/meetings/177.rst b/i2p2www/meetings/logs/177.rst similarity index 100% rename from i2p2www/meetings/177.rst rename to i2p2www/meetings/logs/177.rst diff --git a/i2p2www/meetings/178.log b/i2p2www/meetings/logs/178.log similarity index 100% rename from i2p2www/meetings/178.log rename to i2p2www/meetings/logs/178.log diff --git a/i2p2www/meetings/178.rst b/i2p2www/meetings/logs/178.rst similarity index 100% rename from i2p2www/meetings/178.rst rename to i2p2www/meetings/logs/178.rst diff --git a/i2p2www/meetings/179.log b/i2p2www/meetings/logs/179.log similarity index 100% rename from i2p2www/meetings/179.log rename to i2p2www/meetings/logs/179.log diff --git a/i2p2www/meetings/179.rst b/i2p2www/meetings/logs/179.rst similarity index 100% rename from i2p2www/meetings/179.rst rename to i2p2www/meetings/logs/179.rst diff --git a/i2p2www/meetings/18.log b/i2p2www/meetings/logs/18.log similarity index 100% rename from i2p2www/meetings/18.log rename to i2p2www/meetings/logs/18.log diff --git a/i2p2www/meetings/18.rst b/i2p2www/meetings/logs/18.rst similarity index 100% rename from i2p2www/meetings/18.rst rename to i2p2www/meetings/logs/18.rst diff --git a/i2p2www/meetings/180.log b/i2p2www/meetings/logs/180.log similarity index 100% rename from i2p2www/meetings/180.log rename to i2p2www/meetings/logs/180.log diff --git a/i2p2www/meetings/180.rst b/i2p2www/meetings/logs/180.rst similarity index 100% rename from i2p2www/meetings/180.rst rename to i2p2www/meetings/logs/180.rst diff --git a/i2p2www/meetings/181.log b/i2p2www/meetings/logs/181.log similarity index 100% rename from i2p2www/meetings/181.log rename to i2p2www/meetings/logs/181.log diff --git a/i2p2www/meetings/181.rst b/i2p2www/meetings/logs/181.rst similarity index 100% rename from i2p2www/meetings/181.rst rename to i2p2www/meetings/logs/181.rst diff --git a/i2p2www/meetings/182.log b/i2p2www/meetings/logs/182.log similarity index 100% rename from i2p2www/meetings/182.log rename to i2p2www/meetings/logs/182.log diff --git a/i2p2www/meetings/182.rst b/i2p2www/meetings/logs/182.rst similarity index 100% rename from i2p2www/meetings/182.rst rename to i2p2www/meetings/logs/182.rst diff --git a/i2p2www/meetings/183.log b/i2p2www/meetings/logs/183.log similarity index 100% rename from i2p2www/meetings/183.log rename to i2p2www/meetings/logs/183.log diff --git a/i2p2www/meetings/183.rst b/i2p2www/meetings/logs/183.rst similarity index 100% rename from i2p2www/meetings/183.rst rename to i2p2www/meetings/logs/183.rst diff --git a/i2p2www/meetings/184.log b/i2p2www/meetings/logs/184.log similarity index 100% rename from i2p2www/meetings/184.log rename to i2p2www/meetings/logs/184.log diff --git a/i2p2www/meetings/184.rst b/i2p2www/meetings/logs/184.rst similarity index 100% rename from i2p2www/meetings/184.rst rename to i2p2www/meetings/logs/184.rst diff --git a/i2p2www/meetings/185.log b/i2p2www/meetings/logs/185.log similarity index 100% rename from i2p2www/meetings/185.log rename to i2p2www/meetings/logs/185.log diff --git a/i2p2www/meetings/185.rst b/i2p2www/meetings/logs/185.rst similarity index 100% rename from i2p2www/meetings/185.rst rename to i2p2www/meetings/logs/185.rst diff --git a/i2p2www/meetings/186.log b/i2p2www/meetings/logs/186.log similarity index 100% rename from i2p2www/meetings/186.log rename to i2p2www/meetings/logs/186.log diff --git a/i2p2www/meetings/186.rst b/i2p2www/meetings/logs/186.rst similarity index 100% rename from i2p2www/meetings/186.rst rename to i2p2www/meetings/logs/186.rst diff --git a/i2p2www/meetings/187.log b/i2p2www/meetings/logs/187.log similarity index 100% rename from i2p2www/meetings/187.log rename to i2p2www/meetings/logs/187.log diff --git a/i2p2www/meetings/187.rst b/i2p2www/meetings/logs/187.rst similarity index 100% rename from i2p2www/meetings/187.rst rename to i2p2www/meetings/logs/187.rst diff --git a/i2p2www/meetings/188.log b/i2p2www/meetings/logs/188.log similarity index 100% rename from i2p2www/meetings/188.log rename to i2p2www/meetings/logs/188.log diff --git a/i2p2www/meetings/188.rst b/i2p2www/meetings/logs/188.rst similarity index 100% rename from i2p2www/meetings/188.rst rename to i2p2www/meetings/logs/188.rst diff --git a/i2p2www/meetings/189.log b/i2p2www/meetings/logs/189.log similarity index 100% rename from i2p2www/meetings/189.log rename to i2p2www/meetings/logs/189.log diff --git a/i2p2www/meetings/189.rst b/i2p2www/meetings/logs/189.rst similarity index 100% rename from i2p2www/meetings/189.rst rename to i2p2www/meetings/logs/189.rst diff --git a/i2p2www/meetings/190.log b/i2p2www/meetings/logs/190.log similarity index 100% rename from i2p2www/meetings/190.log rename to i2p2www/meetings/logs/190.log diff --git a/i2p2www/meetings/190.rst b/i2p2www/meetings/logs/190.rst similarity index 100% rename from i2p2www/meetings/190.rst rename to i2p2www/meetings/logs/190.rst diff --git a/i2p2www/meetings/191.log b/i2p2www/meetings/logs/191.log similarity index 100% rename from i2p2www/meetings/191.log rename to i2p2www/meetings/logs/191.log diff --git a/i2p2www/meetings/191.rst b/i2p2www/meetings/logs/191.rst similarity index 100% rename from i2p2www/meetings/191.rst rename to i2p2www/meetings/logs/191.rst diff --git a/i2p2www/meetings/192.log b/i2p2www/meetings/logs/192.log similarity index 100% rename from i2p2www/meetings/192.log rename to i2p2www/meetings/logs/192.log diff --git a/i2p2www/meetings/192.rst b/i2p2www/meetings/logs/192.rst similarity index 100% rename from i2p2www/meetings/192.rst rename to i2p2www/meetings/logs/192.rst diff --git a/i2p2www/meetings/193.log b/i2p2www/meetings/logs/193.log similarity index 100% rename from i2p2www/meetings/193.log rename to i2p2www/meetings/logs/193.log diff --git a/i2p2www/meetings/193.rst b/i2p2www/meetings/logs/193.rst similarity index 100% rename from i2p2www/meetings/193.rst rename to i2p2www/meetings/logs/193.rst diff --git a/i2p2www/meetings/194.log b/i2p2www/meetings/logs/194.log similarity index 100% rename from i2p2www/meetings/194.log rename to i2p2www/meetings/logs/194.log diff --git a/i2p2www/meetings/194.rst b/i2p2www/meetings/logs/194.rst similarity index 100% rename from i2p2www/meetings/194.rst rename to i2p2www/meetings/logs/194.rst diff --git a/i2p2www/meetings/195.log b/i2p2www/meetings/logs/195.log similarity index 100% rename from i2p2www/meetings/195.log rename to i2p2www/meetings/logs/195.log diff --git a/i2p2www/meetings/195.rst b/i2p2www/meetings/logs/195.rst similarity index 100% rename from i2p2www/meetings/195.rst rename to i2p2www/meetings/logs/195.rst diff --git a/i2p2www/meetings/196.log b/i2p2www/meetings/logs/196.log similarity index 100% rename from i2p2www/meetings/196.log rename to i2p2www/meetings/logs/196.log diff --git a/i2p2www/meetings/196.rst b/i2p2www/meetings/logs/196.rst similarity index 100% rename from i2p2www/meetings/196.rst rename to i2p2www/meetings/logs/196.rst diff --git a/i2p2www/meetings/197.log b/i2p2www/meetings/logs/197.log similarity index 100% rename from i2p2www/meetings/197.log rename to i2p2www/meetings/logs/197.log diff --git a/i2p2www/meetings/197.rst b/i2p2www/meetings/logs/197.rst similarity index 100% rename from i2p2www/meetings/197.rst rename to i2p2www/meetings/logs/197.rst diff --git a/i2p2www/meetings/198.log b/i2p2www/meetings/logs/198.log similarity index 100% rename from i2p2www/meetings/198.log rename to i2p2www/meetings/logs/198.log diff --git a/i2p2www/meetings/198.rst b/i2p2www/meetings/logs/198.rst similarity index 100% rename from i2p2www/meetings/198.rst rename to i2p2www/meetings/logs/198.rst diff --git a/i2p2www/meetings/199.log b/i2p2www/meetings/logs/199.log similarity index 100% rename from i2p2www/meetings/199.log rename to i2p2www/meetings/logs/199.log diff --git a/i2p2www/meetings/199.rst b/i2p2www/meetings/logs/199.rst similarity index 100% rename from i2p2www/meetings/199.rst rename to i2p2www/meetings/logs/199.rst diff --git a/i2p2www/meetings/2.log b/i2p2www/meetings/logs/2.log similarity index 100% rename from i2p2www/meetings/2.log rename to i2p2www/meetings/logs/2.log diff --git a/i2p2www/meetings/2.rst b/i2p2www/meetings/logs/2.rst similarity index 100% rename from i2p2www/meetings/2.rst rename to i2p2www/meetings/logs/2.rst diff --git a/i2p2www/meetings/20.log b/i2p2www/meetings/logs/20.log similarity index 100% rename from i2p2www/meetings/20.log rename to i2p2www/meetings/logs/20.log diff --git a/i2p2www/meetings/20.rst b/i2p2www/meetings/logs/20.rst similarity index 100% rename from i2p2www/meetings/20.rst rename to i2p2www/meetings/logs/20.rst diff --git a/i2p2www/meetings/200.log b/i2p2www/meetings/logs/200.log similarity index 100% rename from i2p2www/meetings/200.log rename to i2p2www/meetings/logs/200.log diff --git a/i2p2www/meetings/200.rst b/i2p2www/meetings/logs/200.rst similarity index 100% rename from i2p2www/meetings/200.rst rename to i2p2www/meetings/logs/200.rst diff --git a/i2p2www/meetings/201.log b/i2p2www/meetings/logs/201.log similarity index 100% rename from i2p2www/meetings/201.log rename to i2p2www/meetings/logs/201.log diff --git a/i2p2www/meetings/201.rst b/i2p2www/meetings/logs/201.rst similarity index 100% rename from i2p2www/meetings/201.rst rename to i2p2www/meetings/logs/201.rst diff --git a/i2p2www/meetings/202.log b/i2p2www/meetings/logs/202.log similarity index 100% rename from i2p2www/meetings/202.log rename to i2p2www/meetings/logs/202.log diff --git a/i2p2www/meetings/202.rst b/i2p2www/meetings/logs/202.rst similarity index 100% rename from i2p2www/meetings/202.rst rename to i2p2www/meetings/logs/202.rst diff --git a/i2p2www/meetings/203.log b/i2p2www/meetings/logs/203.log similarity index 100% rename from i2p2www/meetings/203.log rename to i2p2www/meetings/logs/203.log diff --git a/i2p2www/meetings/203.rst b/i2p2www/meetings/logs/203.rst similarity index 100% rename from i2p2www/meetings/203.rst rename to i2p2www/meetings/logs/203.rst diff --git a/i2p2www/meetings/204.log b/i2p2www/meetings/logs/204.log similarity index 100% rename from i2p2www/meetings/204.log rename to i2p2www/meetings/logs/204.log diff --git a/i2p2www/meetings/204.rst b/i2p2www/meetings/logs/204.rst similarity index 100% rename from i2p2www/meetings/204.rst rename to i2p2www/meetings/logs/204.rst diff --git a/i2p2www/meetings/205.log b/i2p2www/meetings/logs/205.log similarity index 100% rename from i2p2www/meetings/205.log rename to i2p2www/meetings/logs/205.log diff --git a/i2p2www/meetings/205.rst b/i2p2www/meetings/logs/205.rst similarity index 100% rename from i2p2www/meetings/205.rst rename to i2p2www/meetings/logs/205.rst diff --git a/i2p2www/meetings/206.log b/i2p2www/meetings/logs/206.log similarity index 100% rename from i2p2www/meetings/206.log rename to i2p2www/meetings/logs/206.log diff --git a/i2p2www/meetings/206.rst b/i2p2www/meetings/logs/206.rst similarity index 100% rename from i2p2www/meetings/206.rst rename to i2p2www/meetings/logs/206.rst diff --git a/i2p2www/meetings/207.log b/i2p2www/meetings/logs/207.log similarity index 100% rename from i2p2www/meetings/207.log rename to i2p2www/meetings/logs/207.log diff --git a/i2p2www/meetings/207.rst b/i2p2www/meetings/logs/207.rst similarity index 100% rename from i2p2www/meetings/207.rst rename to i2p2www/meetings/logs/207.rst diff --git a/i2p2www/meetings/208.log b/i2p2www/meetings/logs/208.log similarity index 100% rename from i2p2www/meetings/208.log rename to i2p2www/meetings/logs/208.log diff --git a/i2p2www/meetings/208.rst b/i2p2www/meetings/logs/208.rst similarity index 100% rename from i2p2www/meetings/208.rst rename to i2p2www/meetings/logs/208.rst diff --git a/i2p2www/meetings/209.log b/i2p2www/meetings/logs/209.log similarity index 100% rename from i2p2www/meetings/209.log rename to i2p2www/meetings/logs/209.log diff --git a/i2p2www/meetings/209.rst b/i2p2www/meetings/logs/209.rst similarity index 100% rename from i2p2www/meetings/209.rst rename to i2p2www/meetings/logs/209.rst diff --git a/i2p2www/meetings/21.log b/i2p2www/meetings/logs/21.log similarity index 100% rename from i2p2www/meetings/21.log rename to i2p2www/meetings/logs/21.log diff --git a/i2p2www/meetings/21.rst b/i2p2www/meetings/logs/21.rst similarity index 100% rename from i2p2www/meetings/21.rst rename to i2p2www/meetings/logs/21.rst diff --git a/i2p2www/meetings/210.log b/i2p2www/meetings/logs/210.log similarity index 100% rename from i2p2www/meetings/210.log rename to i2p2www/meetings/logs/210.log diff --git a/i2p2www/meetings/210.rst b/i2p2www/meetings/logs/210.rst similarity index 100% rename from i2p2www/meetings/210.rst rename to i2p2www/meetings/logs/210.rst diff --git a/i2p2www/meetings/211.log b/i2p2www/meetings/logs/211.log similarity index 100% rename from i2p2www/meetings/211.log rename to i2p2www/meetings/logs/211.log diff --git a/i2p2www/meetings/211.rst b/i2p2www/meetings/logs/211.rst similarity index 100% rename from i2p2www/meetings/211.rst rename to i2p2www/meetings/logs/211.rst diff --git a/i2p2www/meetings/212.log b/i2p2www/meetings/logs/212.log similarity index 100% rename from i2p2www/meetings/212.log rename to i2p2www/meetings/logs/212.log diff --git a/i2p2www/meetings/212.rst b/i2p2www/meetings/logs/212.rst similarity index 100% rename from i2p2www/meetings/212.rst rename to i2p2www/meetings/logs/212.rst diff --git a/i2p2www/meetings/22.log b/i2p2www/meetings/logs/22.log similarity index 100% rename from i2p2www/meetings/22.log rename to i2p2www/meetings/logs/22.log diff --git a/i2p2www/meetings/22.rst b/i2p2www/meetings/logs/22.rst similarity index 100% rename from i2p2www/meetings/22.rst rename to i2p2www/meetings/logs/22.rst diff --git a/i2p2www/meetings/23.log b/i2p2www/meetings/logs/23.log similarity index 100% rename from i2p2www/meetings/23.log rename to i2p2www/meetings/logs/23.log diff --git a/i2p2www/meetings/23.rst b/i2p2www/meetings/logs/23.rst similarity index 100% rename from i2p2www/meetings/23.rst rename to i2p2www/meetings/logs/23.rst diff --git a/i2p2www/meetings/25.log b/i2p2www/meetings/logs/25.log similarity index 100% rename from i2p2www/meetings/25.log rename to i2p2www/meetings/logs/25.log diff --git a/i2p2www/meetings/25.rst b/i2p2www/meetings/logs/25.rst similarity index 100% rename from i2p2www/meetings/25.rst rename to i2p2www/meetings/logs/25.rst diff --git a/i2p2www/meetings/26.log b/i2p2www/meetings/logs/26.log similarity index 100% rename from i2p2www/meetings/26.log rename to i2p2www/meetings/logs/26.log diff --git a/i2p2www/meetings/26.rst b/i2p2www/meetings/logs/26.rst similarity index 100% rename from i2p2www/meetings/26.rst rename to i2p2www/meetings/logs/26.rst diff --git a/i2p2www/meetings/28.log b/i2p2www/meetings/logs/28.log similarity index 100% rename from i2p2www/meetings/28.log rename to i2p2www/meetings/logs/28.log diff --git a/i2p2www/meetings/28.rst b/i2p2www/meetings/logs/28.rst similarity index 100% rename from i2p2www/meetings/28.rst rename to i2p2www/meetings/logs/28.rst diff --git a/i2p2www/meetings/29.log b/i2p2www/meetings/logs/29.log similarity index 100% rename from i2p2www/meetings/29.log rename to i2p2www/meetings/logs/29.log diff --git a/i2p2www/meetings/29.rst b/i2p2www/meetings/logs/29.rst similarity index 100% rename from i2p2www/meetings/29.rst rename to i2p2www/meetings/logs/29.rst diff --git a/i2p2www/meetings/3.log b/i2p2www/meetings/logs/3.log similarity index 100% rename from i2p2www/meetings/3.log rename to i2p2www/meetings/logs/3.log diff --git a/i2p2www/meetings/3.rst b/i2p2www/meetings/logs/3.rst similarity index 100% rename from i2p2www/meetings/3.rst rename to i2p2www/meetings/logs/3.rst diff --git a/i2p2www/meetings/30.log b/i2p2www/meetings/logs/30.log similarity index 100% rename from i2p2www/meetings/30.log rename to i2p2www/meetings/logs/30.log diff --git a/i2p2www/meetings/30.rst b/i2p2www/meetings/logs/30.rst similarity index 100% rename from i2p2www/meetings/30.rst rename to i2p2www/meetings/logs/30.rst diff --git a/i2p2www/meetings/31.log b/i2p2www/meetings/logs/31.log similarity index 100% rename from i2p2www/meetings/31.log rename to i2p2www/meetings/logs/31.log diff --git a/i2p2www/meetings/31.rst b/i2p2www/meetings/logs/31.rst similarity index 100% rename from i2p2www/meetings/31.rst rename to i2p2www/meetings/logs/31.rst diff --git a/i2p2www/meetings/32.log b/i2p2www/meetings/logs/32.log similarity index 100% rename from i2p2www/meetings/32.log rename to i2p2www/meetings/logs/32.log diff --git a/i2p2www/meetings/32.rst b/i2p2www/meetings/logs/32.rst similarity index 100% rename from i2p2www/meetings/32.rst rename to i2p2www/meetings/logs/32.rst diff --git a/i2p2www/meetings/33.log b/i2p2www/meetings/logs/33.log similarity index 100% rename from i2p2www/meetings/33.log rename to i2p2www/meetings/logs/33.log diff --git a/i2p2www/meetings/33.rst b/i2p2www/meetings/logs/33.rst similarity index 100% rename from i2p2www/meetings/33.rst rename to i2p2www/meetings/logs/33.rst diff --git a/i2p2www/meetings/34.log b/i2p2www/meetings/logs/34.log similarity index 100% rename from i2p2www/meetings/34.log rename to i2p2www/meetings/logs/34.log diff --git a/i2p2www/meetings/34.rst b/i2p2www/meetings/logs/34.rst similarity index 100% rename from i2p2www/meetings/34.rst rename to i2p2www/meetings/logs/34.rst diff --git a/i2p2www/meetings/35.log b/i2p2www/meetings/logs/35.log similarity index 100% rename from i2p2www/meetings/35.log rename to i2p2www/meetings/logs/35.log diff --git a/i2p2www/meetings/35.rst b/i2p2www/meetings/logs/35.rst similarity index 100% rename from i2p2www/meetings/35.rst rename to i2p2www/meetings/logs/35.rst diff --git a/i2p2www/meetings/4.log b/i2p2www/meetings/logs/4.log similarity index 100% rename from i2p2www/meetings/4.log rename to i2p2www/meetings/logs/4.log diff --git a/i2p2www/meetings/4.rst b/i2p2www/meetings/logs/4.rst similarity index 100% rename from i2p2www/meetings/4.rst rename to i2p2www/meetings/logs/4.rst diff --git a/i2p2www/meetings/47.log b/i2p2www/meetings/logs/47.log similarity index 100% rename from i2p2www/meetings/47.log rename to i2p2www/meetings/logs/47.log diff --git a/i2p2www/meetings/47.rst b/i2p2www/meetings/logs/47.rst similarity index 100% rename from i2p2www/meetings/47.rst rename to i2p2www/meetings/logs/47.rst diff --git a/i2p2www/meetings/49.log b/i2p2www/meetings/logs/49.log similarity index 100% rename from i2p2www/meetings/49.log rename to i2p2www/meetings/logs/49.log diff --git a/i2p2www/meetings/49.rst b/i2p2www/meetings/logs/49.rst similarity index 100% rename from i2p2www/meetings/49.rst rename to i2p2www/meetings/logs/49.rst diff --git a/i2p2www/meetings/50.log b/i2p2www/meetings/logs/50.log similarity index 100% rename from i2p2www/meetings/50.log rename to i2p2www/meetings/logs/50.log diff --git a/i2p2www/meetings/50.rst b/i2p2www/meetings/logs/50.rst similarity index 100% rename from i2p2www/meetings/50.rst rename to i2p2www/meetings/logs/50.rst diff --git a/i2p2www/meetings/51.log b/i2p2www/meetings/logs/51.log similarity index 100% rename from i2p2www/meetings/51.log rename to i2p2www/meetings/logs/51.log diff --git a/i2p2www/meetings/51.rst b/i2p2www/meetings/logs/51.rst similarity index 100% rename from i2p2www/meetings/51.rst rename to i2p2www/meetings/logs/51.rst diff --git a/i2p2www/meetings/52.log b/i2p2www/meetings/logs/52.log similarity index 100% rename from i2p2www/meetings/52.log rename to i2p2www/meetings/logs/52.log diff --git a/i2p2www/meetings/52.rst b/i2p2www/meetings/logs/52.rst similarity index 100% rename from i2p2www/meetings/52.rst rename to i2p2www/meetings/logs/52.rst diff --git a/i2p2www/meetings/53.log b/i2p2www/meetings/logs/53.log similarity index 100% rename from i2p2www/meetings/53.log rename to i2p2www/meetings/logs/53.log diff --git a/i2p2www/meetings/53.rst b/i2p2www/meetings/logs/53.rst similarity index 100% rename from i2p2www/meetings/53.rst rename to i2p2www/meetings/logs/53.rst diff --git a/i2p2www/meetings/54.log b/i2p2www/meetings/logs/54.log similarity index 100% rename from i2p2www/meetings/54.log rename to i2p2www/meetings/logs/54.log diff --git a/i2p2www/meetings/54.rst b/i2p2www/meetings/logs/54.rst similarity index 100% rename from i2p2www/meetings/54.rst rename to i2p2www/meetings/logs/54.rst diff --git a/i2p2www/meetings/55.log b/i2p2www/meetings/logs/55.log similarity index 100% rename from i2p2www/meetings/55.log rename to i2p2www/meetings/logs/55.log diff --git a/i2p2www/meetings/55.rst b/i2p2www/meetings/logs/55.rst similarity index 100% rename from i2p2www/meetings/55.rst rename to i2p2www/meetings/logs/55.rst diff --git a/i2p2www/meetings/56.log b/i2p2www/meetings/logs/56.log similarity index 100% rename from i2p2www/meetings/56.log rename to i2p2www/meetings/logs/56.log diff --git a/i2p2www/meetings/56.rst b/i2p2www/meetings/logs/56.rst similarity index 100% rename from i2p2www/meetings/56.rst rename to i2p2www/meetings/logs/56.rst diff --git a/i2p2www/meetings/57.log b/i2p2www/meetings/logs/57.log similarity index 100% rename from i2p2www/meetings/57.log rename to i2p2www/meetings/logs/57.log diff --git a/i2p2www/meetings/57.rst b/i2p2www/meetings/logs/57.rst similarity index 100% rename from i2p2www/meetings/57.rst rename to i2p2www/meetings/logs/57.rst diff --git a/i2p2www/meetings/58.log b/i2p2www/meetings/logs/58.log similarity index 100% rename from i2p2www/meetings/58.log rename to i2p2www/meetings/logs/58.log diff --git a/i2p2www/meetings/58.rst b/i2p2www/meetings/logs/58.rst similarity index 100% rename from i2p2www/meetings/58.rst rename to i2p2www/meetings/logs/58.rst diff --git a/i2p2www/meetings/59.log b/i2p2www/meetings/logs/59.log similarity index 100% rename from i2p2www/meetings/59.log rename to i2p2www/meetings/logs/59.log diff --git a/i2p2www/meetings/59.rst b/i2p2www/meetings/logs/59.rst similarity index 100% rename from i2p2www/meetings/59.rst rename to i2p2www/meetings/logs/59.rst diff --git a/i2p2www/meetings/60.log b/i2p2www/meetings/logs/60.log similarity index 100% rename from i2p2www/meetings/60.log rename to i2p2www/meetings/logs/60.log diff --git a/i2p2www/meetings/60.rst b/i2p2www/meetings/logs/60.rst similarity index 100% rename from i2p2www/meetings/60.rst rename to i2p2www/meetings/logs/60.rst diff --git a/i2p2www/meetings/61.log b/i2p2www/meetings/logs/61.log similarity index 100% rename from i2p2www/meetings/61.log rename to i2p2www/meetings/logs/61.log diff --git a/i2p2www/meetings/61.rst b/i2p2www/meetings/logs/61.rst similarity index 100% rename from i2p2www/meetings/61.rst rename to i2p2www/meetings/logs/61.rst diff --git a/i2p2www/meetings/62.log b/i2p2www/meetings/logs/62.log similarity index 100% rename from i2p2www/meetings/62.log rename to i2p2www/meetings/logs/62.log diff --git a/i2p2www/meetings/62.rst b/i2p2www/meetings/logs/62.rst similarity index 100% rename from i2p2www/meetings/62.rst rename to i2p2www/meetings/logs/62.rst diff --git a/i2p2www/meetings/63.log b/i2p2www/meetings/logs/63.log similarity index 100% rename from i2p2www/meetings/63.log rename to i2p2www/meetings/logs/63.log diff --git a/i2p2www/meetings/63.rst b/i2p2www/meetings/logs/63.rst similarity index 100% rename from i2p2www/meetings/63.rst rename to i2p2www/meetings/logs/63.rst diff --git a/i2p2www/meetings/64.log b/i2p2www/meetings/logs/64.log similarity index 100% rename from i2p2www/meetings/64.log rename to i2p2www/meetings/logs/64.log diff --git a/i2p2www/meetings/64.rst b/i2p2www/meetings/logs/64.rst similarity index 100% rename from i2p2www/meetings/64.rst rename to i2p2www/meetings/logs/64.rst diff --git a/i2p2www/meetings/65.log b/i2p2www/meetings/logs/65.log similarity index 100% rename from i2p2www/meetings/65.log rename to i2p2www/meetings/logs/65.log diff --git a/i2p2www/meetings/65.rst b/i2p2www/meetings/logs/65.rst similarity index 100% rename from i2p2www/meetings/65.rst rename to i2p2www/meetings/logs/65.rst diff --git a/i2p2www/meetings/66.log b/i2p2www/meetings/logs/66.log similarity index 100% rename from i2p2www/meetings/66.log rename to i2p2www/meetings/logs/66.log diff --git a/i2p2www/meetings/66.rst b/i2p2www/meetings/logs/66.rst similarity index 100% rename from i2p2www/meetings/66.rst rename to i2p2www/meetings/logs/66.rst diff --git a/i2p2www/meetings/68.log b/i2p2www/meetings/logs/68.log similarity index 100% rename from i2p2www/meetings/68.log rename to i2p2www/meetings/logs/68.log diff --git a/i2p2www/meetings/68.rst b/i2p2www/meetings/logs/68.rst similarity index 100% rename from i2p2www/meetings/68.rst rename to i2p2www/meetings/logs/68.rst diff --git a/i2p2www/meetings/69.log b/i2p2www/meetings/logs/69.log similarity index 100% rename from i2p2www/meetings/69.log rename to i2p2www/meetings/logs/69.log diff --git a/i2p2www/meetings/69.rst b/i2p2www/meetings/logs/69.rst similarity index 100% rename from i2p2www/meetings/69.rst rename to i2p2www/meetings/logs/69.rst diff --git a/i2p2www/meetings/7.log b/i2p2www/meetings/logs/7.log similarity index 100% rename from i2p2www/meetings/7.log rename to i2p2www/meetings/logs/7.log diff --git a/i2p2www/meetings/7.rst b/i2p2www/meetings/logs/7.rst similarity index 100% rename from i2p2www/meetings/7.rst rename to i2p2www/meetings/logs/7.rst diff --git a/i2p2www/meetings/70.log b/i2p2www/meetings/logs/70.log similarity index 100% rename from i2p2www/meetings/70.log rename to i2p2www/meetings/logs/70.log diff --git a/i2p2www/meetings/70.rst b/i2p2www/meetings/logs/70.rst similarity index 100% rename from i2p2www/meetings/70.rst rename to i2p2www/meetings/logs/70.rst diff --git a/i2p2www/meetings/71.log b/i2p2www/meetings/logs/71.log similarity index 100% rename from i2p2www/meetings/71.log rename to i2p2www/meetings/logs/71.log diff --git a/i2p2www/meetings/71.rst b/i2p2www/meetings/logs/71.rst similarity index 100% rename from i2p2www/meetings/71.rst rename to i2p2www/meetings/logs/71.rst diff --git a/i2p2www/meetings/72.log b/i2p2www/meetings/logs/72.log similarity index 100% rename from i2p2www/meetings/72.log rename to i2p2www/meetings/logs/72.log diff --git a/i2p2www/meetings/72.rst b/i2p2www/meetings/logs/72.rst similarity index 100% rename from i2p2www/meetings/72.rst rename to i2p2www/meetings/logs/72.rst diff --git a/i2p2www/meetings/73.log b/i2p2www/meetings/logs/73.log similarity index 100% rename from i2p2www/meetings/73.log rename to i2p2www/meetings/logs/73.log diff --git a/i2p2www/meetings/73.rst b/i2p2www/meetings/logs/73.rst similarity index 100% rename from i2p2www/meetings/73.rst rename to i2p2www/meetings/logs/73.rst diff --git a/i2p2www/meetings/74.log b/i2p2www/meetings/logs/74.log similarity index 100% rename from i2p2www/meetings/74.log rename to i2p2www/meetings/logs/74.log diff --git a/i2p2www/meetings/74.rst b/i2p2www/meetings/logs/74.rst similarity index 100% rename from i2p2www/meetings/74.rst rename to i2p2www/meetings/logs/74.rst diff --git a/i2p2www/meetings/75.log b/i2p2www/meetings/logs/75.log similarity index 100% rename from i2p2www/meetings/75.log rename to i2p2www/meetings/logs/75.log diff --git a/i2p2www/meetings/75.rst b/i2p2www/meetings/logs/75.rst similarity index 100% rename from i2p2www/meetings/75.rst rename to i2p2www/meetings/logs/75.rst diff --git a/i2p2www/meetings/76.log b/i2p2www/meetings/logs/76.log similarity index 100% rename from i2p2www/meetings/76.log rename to i2p2www/meetings/logs/76.log diff --git a/i2p2www/meetings/76.rst b/i2p2www/meetings/logs/76.rst similarity index 100% rename from i2p2www/meetings/76.rst rename to i2p2www/meetings/logs/76.rst diff --git a/i2p2www/meetings/77.log b/i2p2www/meetings/logs/77.log similarity index 100% rename from i2p2www/meetings/77.log rename to i2p2www/meetings/logs/77.log diff --git a/i2p2www/meetings/77.rst b/i2p2www/meetings/logs/77.rst similarity index 100% rename from i2p2www/meetings/77.rst rename to i2p2www/meetings/logs/77.rst diff --git a/i2p2www/meetings/78.log b/i2p2www/meetings/logs/78.log similarity index 100% rename from i2p2www/meetings/78.log rename to i2p2www/meetings/logs/78.log diff --git a/i2p2www/meetings/78.rst b/i2p2www/meetings/logs/78.rst similarity index 100% rename from i2p2www/meetings/78.rst rename to i2p2www/meetings/logs/78.rst diff --git a/i2p2www/meetings/79.log b/i2p2www/meetings/logs/79.log similarity index 100% rename from i2p2www/meetings/79.log rename to i2p2www/meetings/logs/79.log diff --git a/i2p2www/meetings/79.rst b/i2p2www/meetings/logs/79.rst similarity index 100% rename from i2p2www/meetings/79.rst rename to i2p2www/meetings/logs/79.rst diff --git a/i2p2www/meetings/8.log b/i2p2www/meetings/logs/8.log similarity index 100% rename from i2p2www/meetings/8.log rename to i2p2www/meetings/logs/8.log diff --git a/i2p2www/meetings/8.rst b/i2p2www/meetings/logs/8.rst similarity index 100% rename from i2p2www/meetings/8.rst rename to i2p2www/meetings/logs/8.rst diff --git a/i2p2www/meetings/80.log b/i2p2www/meetings/logs/80.log similarity index 100% rename from i2p2www/meetings/80.log rename to i2p2www/meetings/logs/80.log diff --git a/i2p2www/meetings/80.rst b/i2p2www/meetings/logs/80.rst similarity index 100% rename from i2p2www/meetings/80.rst rename to i2p2www/meetings/logs/80.rst diff --git a/i2p2www/meetings/81.log b/i2p2www/meetings/logs/81.log similarity index 100% rename from i2p2www/meetings/81.log rename to i2p2www/meetings/logs/81.log diff --git a/i2p2www/meetings/81.rst b/i2p2www/meetings/logs/81.rst similarity index 100% rename from i2p2www/meetings/81.rst rename to i2p2www/meetings/logs/81.rst diff --git a/i2p2www/meetings/82.log b/i2p2www/meetings/logs/82.log similarity index 100% rename from i2p2www/meetings/82.log rename to i2p2www/meetings/logs/82.log diff --git a/i2p2www/meetings/82.rst b/i2p2www/meetings/logs/82.rst similarity index 100% rename from i2p2www/meetings/82.rst rename to i2p2www/meetings/logs/82.rst diff --git a/i2p2www/meetings/9.log b/i2p2www/meetings/logs/9.log similarity index 100% rename from i2p2www/meetings/9.log rename to i2p2www/meetings/logs/9.log diff --git a/i2p2www/meetings/9.rst b/i2p2www/meetings/logs/9.rst similarity index 100% rename from i2p2www/meetings/9.rst rename to i2p2www/meetings/logs/9.rst diff --git a/i2p2www/meetings/90.log b/i2p2www/meetings/logs/90.log similarity index 100% rename from i2p2www/meetings/90.log rename to i2p2www/meetings/logs/90.log diff --git a/i2p2www/meetings/90.rst b/i2p2www/meetings/logs/90.rst similarity index 100% rename from i2p2www/meetings/90.rst rename to i2p2www/meetings/logs/90.rst diff --git a/i2p2www/meetings/92.log b/i2p2www/meetings/logs/92.log similarity index 100% rename from i2p2www/meetings/92.log rename to i2p2www/meetings/logs/92.log diff --git a/i2p2www/meetings/92.rst b/i2p2www/meetings/logs/92.rst similarity index 100% rename from i2p2www/meetings/92.rst rename to i2p2www/meetings/logs/92.rst diff --git a/i2p2www/meetings/93.log b/i2p2www/meetings/logs/93.log similarity index 100% rename from i2p2www/meetings/93.log rename to i2p2www/meetings/logs/93.log diff --git a/i2p2www/meetings/93.rst b/i2p2www/meetings/logs/93.rst similarity index 100% rename from i2p2www/meetings/93.rst rename to i2p2www/meetings/logs/93.rst diff --git a/i2p2www/meetings/95.log b/i2p2www/meetings/logs/95.log similarity index 100% rename from i2p2www/meetings/95.log rename to i2p2www/meetings/logs/95.log diff --git a/i2p2www/meetings/95.rst b/i2p2www/meetings/logs/95.rst similarity index 100% rename from i2p2www/meetings/95.rst rename to i2p2www/meetings/logs/95.rst diff --git a/i2p2www/meetings/99.log b/i2p2www/meetings/logs/99.log similarity index 100% rename from i2p2www/meetings/99.log rename to i2p2www/meetings/logs/99.log diff --git a/i2p2www/meetings/99.rst b/i2p2www/meetings/logs/99.rst similarity index 100% rename from i2p2www/meetings/99.rst rename to i2p2www/meetings/logs/99.rst From 5a088b76c7af40926220a1822a6cca5ebd09979a Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 07:59:22 +0000 Subject: [PATCH 204/317] Split off meetings code --- i2p2www/__init__.py | 161 ++--------------------------------- i2p2www/blog/views.py | 2 +- i2p2www/meetings/__init__.py | 0 i2p2www/meetings/helpers.py | 77 +++++++++++++++++ i2p2www/meetings/views.py | 84 ++++++++++++++++++ 5 files changed, 169 insertions(+), 155 deletions(-) create mode 100644 i2p2www/meetings/__init__.py create mode 100644 i2p2www/meetings/helpers.py create mode 100644 i2p2www/meetings/views.py diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 18c4bac0..fecf8534 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -1,13 +1,10 @@ from jinja2 import Environment, FileSystemLoader, environmentfilter from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, send_from_directory, safe_join from flaskext.babel import Babel -from werkzeug.contrib.atom import AtomFeed from docutils.core import publish_parts -import datetime import os.path import os import fileinput -import codecs from random import randint try: import json @@ -53,6 +50,13 @@ url('//blog/entry/', 'blog.views.blog_entry') url('//feed/blog/rss', 'blog.views.blog_rss') url('//feed/blog/atom', 'blog.views.blog_atom') +url('//meetings/', 'meetings.views.meetings_index', defaults={'page': 1}) +url('//meetings/page/', 'meetings.views.meetings_index') +url('//meetings/', 'meetings.views.meetings_show') +url('//meetings/.log', 'meetings.views.meetings_show_log') +url('//meetings/.rst', 'meetings.views.meetings_show_rst') +url('//feed/meetings/atom', 'meetings.views.meetings_atom') + ################# # Babel selectors @@ -204,157 +208,6 @@ def server_error(error): return render_template('global/error_500.html'), 500 -######################## -# Meeting helper methods - -def get_meetings_feed_items(num=0): - meetings = get_meetings(num) - items = [] - for meeting in meetings: - a = {} - a['title'] = meeting['parts']['title'] - a['content'] = meeting['parts']['fragment'] - a['url'] = url_for('meetings_show', lang=g.lang, id=meeting['id']) - a['updated'] = (meeting['date'] if meeting['date'] else datetime.datetime(0)) - items.append(a) - return items - -def get_meetings(num=0): - meetings_ids = get_meetings_ids(num) - meetings = [] - for id in meetings_ids: - parts = render_meeting_rst(id) - if parts: - try: - date = datetime.datetime.strptime(parts['title'], 'I2P dev meeting, %B %d, %Y @ %H:%M %Z') - except ValueError: - try: - date = datetime.datetime.strptime(parts['title'], 'I2P dev meeting, %B %d, %Y') - except ValueError: - date = None - a = {} - a['id'] = id - a['date'] = date - a['parts'] = parts - meetings.append(a) - return meetings - -def get_meetings_ids(num=0): - """ - Returns the latest #num valid meetings, or all meetings if num=0. - """ - # list of meetings - meetings=[] - # walk over all directories/files - for v in os.walk(MEETINGS_DIR): - # iterate over all files - for f in v[2]: - # ignore all non-.rst files - if not f.endswith('.rst'): - continue - meetings.append(int(f[:-4])) - meetings.sort() - meetings.reverse() - if (num > 0): - return meetings[:num] - return meetings - -def render_meeting_rst(id): - # check if that file actually exists - name = str(id) + '.rst' - path = safe_join(MEETINGS_DIR, name) - if not os.path.exists(path): - abort(404) - - # read file - with codecs.open(path, encoding='utf-8') as fd: - content = fd.read() - - return publish_parts(source=content, source_path=MEETINGS_DIR, writer_name="html") - - -################## -# Meeting handlers - -# Meeting index -@app.route('//meetings/', defaults={'page': 1}) -@app.route('//meetings/page/') -def meetings_index(page): - all_meetings = get_meetings() - meetings = get_for_page(all_meetings, page, MEETINGS_PER_PAGE) - if not meetings and page != 1: - abort(404) - pagination = Pagination(page, MEETINGS_PER_PAGE, len(all_meetings)) - return render_template('meetings/index.html', pagination=pagination, meetings=meetings) - -# Renderer for specific meetings -@app.route('//meetings/') -def meetings_show(id, log=False, rst=False): - """ - Render the meeting X. - Either display the raw IRC .log or render as html and include .rst as header if it exists - """ - # generate file name for the raw meeting file(and header) - lname = str(id) + '.log' - hname = str(id) + '.rst' - lfile = safe_join(MEETINGS_DIR, lname) - hfile = safe_join(MEETINGS_DIR, hname) - - # check if meeting file exists and throw error if it does not.. - if not os.path.exists(lfile): - abort(404) - - # if the user just wanted the .log - if log: - # hmm... maybe replace with something non-render_template like? - # return render_template('meetings/show_raw.html', log=log) - return send_from_directory(MEETINGS_DIR, lname, mimetype='text/plain') - - log='' - header=None - - # try to load header if that makes sense - if os.path.exists(hfile): - # if the user just wanted the .rst... - if rst: - return send_from_directory(MEETINGS_DIR, hname, mimetype='text/plain') - - # open the file as utf-8 file - with codecs.open(hfile, encoding='utf-8') as fd: - header = fd.read() - elif rst: - abort(404) - - # load log - with codecs.open(lfile, encoding='utf-8') as fd: - log = fd.read() - - return render_template('meetings/show.html', log=log, header=header, id=id) - -# Just return the raw .log for the meeting -@app.route('//meetings/.log') -def meetings_show_log(id): - return meetings_show(id, log=True) - -# Just return the raw .rst for the meeting -@app.route('//meetings/.rst') -def meetings_show_rst(id): - return meetings_show(id, rst=True) - -@app.route('//feed/meetings/atom') -def meetings_atom(): - feed = AtomFeed('I2P Meetings', feed_url=request.url, url=request.url_root) - items = get_meetings_feed_items(10) - for item in items: - feed.add(item['title'], - item['content'], - title_type='html', - content_type='html', - url=item['url'], - updated=item['updated']) - return feed.get_response() - - ################### # Download handlers diff --git a/i2p2www/blog/views.py b/i2p2www/blog/views.py index a61d6c36..4e893464 100644 --- a/i2p2www/blog/views.py +++ b/i2p2www/blog/views.py @@ -1,4 +1,4 @@ -from flask import request, abort, render_template +from flask import abort, render_template, request from werkzeug.contrib.atom import AtomFeed from i2p2www import BLOG_ENTRIES_PER_PAGE diff --git a/i2p2www/meetings/__init__.py b/i2p2www/meetings/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/i2p2www/meetings/helpers.py b/i2p2www/meetings/helpers.py new file mode 100644 index 00000000..204aff0a --- /dev/null +++ b/i2p2www/meetings/helpers.py @@ -0,0 +1,77 @@ +import codecs +import datetime +from docutils.core import publish_parts +from flask import abort, g, safe_join, url_for +import os +import os.path + +from i2p2www import MEETINGS_DIR + + +######################## +# Meeting helper methods + +def get_meetings_feed_items(num=0): + meetings = get_meetings(num) + items = [] + for meeting in meetings: + a = {} + a['title'] = meeting['parts']['title'] + a['content'] = meeting['parts']['fragment'] + a['url'] = url_for('meetings_show', lang=g.lang, id=meeting['id']) + a['updated'] = (meeting['date'] if meeting['date'] else datetime.datetime(0)) + items.append(a) + return items + +def get_meetings(num=0): + meetings_ids = get_meetings_ids(num) + meetings = [] + for id in meetings_ids: + parts = render_meeting_rst(id) + if parts: + try: + date = datetime.datetime.strptime(parts['title'], 'I2P dev meeting, %B %d, %Y @ %H:%M %Z') + except ValueError: + try: + date = datetime.datetime.strptime(parts['title'], 'I2P dev meeting, %B %d, %Y') + except ValueError: + date = None + a = {} + a['id'] = id + a['date'] = date + a['parts'] = parts + meetings.append(a) + return meetings + +def get_meetings_ids(num=0): + """ + Returns the latest #num valid meetings, or all meetings if num=0. + """ + # list of meetings + meetings=[] + # walk over all directories/files + for v in os.walk(MEETINGS_DIR): + # iterate over all files + for f in v[2]: + # ignore all non-.rst files + if not f.endswith('.rst'): + continue + meetings.append(int(f[:-4])) + meetings.sort() + meetings.reverse() + if (num > 0): + return meetings[:num] + return meetings + +def render_meeting_rst(id): + # check if that file actually exists + name = str(id) + '.rst' + path = safe_join(MEETINGS_DIR, name) + if not os.path.exists(path): + abort(404) + + # read file + with codecs.open(path, encoding='utf-8') as fd: + content = fd.read() + + return publish_parts(source=content, source_path=MEETINGS_DIR, writer_name="html") diff --git a/i2p2www/meetings/views.py b/i2p2www/meetings/views.py new file mode 100644 index 00000000..8c40bce8 --- /dev/null +++ b/i2p2www/meetings/views.py @@ -0,0 +1,84 @@ +import codecs +from flask import abort, render_template, request, safe_join +import os.path +from werkzeug.contrib.atom import AtomFeed + +from i2p2www import MEETINGS_DIR, MEETINGS_PER_PAGE +from i2p2www.helpers import Pagination, get_for_page +from i2p2www.meetings.helpers import get_meetings, get_meetings_feed_items + + +################## +# Meeting handlers + +# Meeting index +def meetings_index(page): + all_meetings = get_meetings() + meetings = get_for_page(all_meetings, page, MEETINGS_PER_PAGE) + if not meetings and page != 1: + abort(404) + pagination = Pagination(page, MEETINGS_PER_PAGE, len(all_meetings)) + return render_template('meetings/index.html', pagination=pagination, meetings=meetings) + +# Renderer for specific meetings +def meetings_show(id, log=False, rst=False): + """ + Render the meeting X. + Either display the raw IRC .log or render as html and include .rst as header if it exists + """ + # generate file name for the raw meeting file(and header) + lname = str(id) + '.log' + hname = str(id) + '.rst' + lfile = safe_join(MEETINGS_DIR, lname) + hfile = safe_join(MEETINGS_DIR, hname) + + # check if meeting file exists and throw error if it does not.. + if not os.path.exists(lfile): + abort(404) + + # if the user just wanted the .log + if log: + # hmm... maybe replace with something non-render_template like? + # return render_template('meetings/show_raw.html', log=log) + return send_from_directory(MEETINGS_DIR, lname, mimetype='text/plain') + + log='' + header=None + + # try to load header if that makes sense + if os.path.exists(hfile): + # if the user just wanted the .rst... + if rst: + return send_from_directory(MEETINGS_DIR, hname, mimetype='text/plain') + + # open the file as utf-8 file + with codecs.open(hfile, encoding='utf-8') as fd: + header = fd.read() + elif rst: + abort(404) + + # load log + with codecs.open(lfile, encoding='utf-8') as fd: + log = fd.read() + + return render_template('meetings/show.html', log=log, header=header, id=id) + +# Just return the raw .log for the meeting +def meetings_show_log(id): + return meetings_show(id, log=True) + +# Just return the raw .rst for the meeting +def meetings_show_rst(id): + return meetings_show(id, rst=True) + +def meetings_atom(): + feed = AtomFeed('I2P Meetings', feed_url=request.url, url=request.url_root) + items = get_meetings_feed_items(10) + for item in items: + feed.add(item['title'], + item['content'], + title_type='html', + content_type='html', + url=item['url'], + updated=item['updated']) + return feed.get_response() From 7dbf4a35bde25aaba1693be95ad06cef92b4d78f Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 10:30:49 +0000 Subject: [PATCH 205/317] Split off legacy support code --- i2p2www/__init__.py | 40 +++++++++------------------------------- i2p2www/legacy.py | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 31 deletions(-) create mode 100644 i2p2www/legacy.py diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index fecf8534..c7920f78 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -57,6 +57,15 @@ url('//meetings/.log', 'meetings.views.meetings_show_log') url('//meetings/.rst', 'meetings.views.meetings_show_rst') url('//feed/meetings/atom', 'meetings.views.meetings_atom') +url('/meeting', 'legacy.legacy_meeting') +url('/meeting.html', 'legacy.legacy_meeting') +url('/status---', 'legacy.legacy_status') +url('/status---.html', 'legacy.legacy_status') +url('/_', 'legacy.legacy_show') +url('/_.html', 'legacy.legacy_show') +url('/', 'legacy.legacy_show') +url('/.html', 'legacy.legacy_show') + ################# # Babel selectors @@ -284,37 +293,6 @@ def hosts(): def robots(): return send_from_directory(STATIC_DIR, 'robots.txt', mimetype='text/plain') - -############## -# Legacy paths - -@app.route('/meeting') -@app.route('/meeting.html') -def legacy_meeting(id): - return redirect(url_for('meetings_show', id=id, lang='en')) - -@app.route('/status---') -@app.route('/status---.html') -def legacy_status(year, month, day): - return redirect(url_for('blog_entry', lang='en', slug=('%s/%s/%s/status' % (year, month, day)))) - -LEGACY_MAP={ - 'download': 'downloads_list' -} - -@app.route('/_') -@app.route('/_.html') -@app.route('/') -@app.route('/.html') -def legacy_show(f): - lang = 'en' - if hasattr(g, 'lang') and g.lang: - lang = g.lang - if f in LEGACY_MAP: - return redirect(url_for(LEGACY_MAP[f], lang=lang)) - else: - return redirect(url_for('site_show', lang=lang, page=f)) - @app.route('/favicon.ico') def favicon(): return send_from_directory(os.path.join(app.root_path, 'static'), diff --git a/i2p2www/legacy.py b/i2p2www/legacy.py new file mode 100644 index 00000000..0b6f2f0b --- /dev/null +++ b/i2p2www/legacy.py @@ -0,0 +1,24 @@ +from flask import g, redirect, url_for + + +############## +# Legacy paths + +LEGACY_MAP={ + 'download': 'downloads_list' +} + +def legacy_show(f): + lang = 'en' + if hasattr(g, 'lang') and g.lang: + lang = g.lang + if f in LEGACY_MAP: + return redirect(url_for(LEGACY_MAP[f], lang=lang)) + else: + return redirect(url_for('site_show', lang=lang, page=f)) + +def legacy_meeting(id): + return redirect(url_for('meetings_show', id=id, lang='en')) + +def legacy_status(year, month, day): + return redirect(url_for('blog_entry', lang='en', slug=('%s/%s/%s/status' % (year, month, day)))) From 85c2ca464c147d84c41deff194e05d6b42bc08c4 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 10:55:11 +0000 Subject: [PATCH 206/317] Added a few legacy pages (and distinguished them from pages that are now functions) --- i2p2www/legacy.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/i2p2www/legacy.py b/i2p2www/legacy.py index 0b6f2f0b..2068ae73 100644 --- a/i2p2www/legacy.py +++ b/i2p2www/legacy.py @@ -4,16 +4,24 @@ from flask import g, redirect, url_for ############## # Legacy paths -LEGACY_MAP={ +LEGACY_FUNCTIONS_MAP={ 'download': 'downloads_list' } +LEGACY_PAGES_MAP={ + 'bounties': 'volunteer/bounties', + 'getinvolved': 'volunteer', + 'faq': 'support/faq', +} + def legacy_show(f): lang = 'en' if hasattr(g, 'lang') and g.lang: lang = g.lang - if f in LEGACY_MAP: - return redirect(url_for(LEGACY_MAP[f], lang=lang)) + if f in LEGACY_FUNCTIONS_MAP: + return redirect(url_for(LEGACY_FUNCTIONS_MAP[f], lang=lang)) + elif f in LEGACY_PAGES_MAP: + return redirect(url_for('site_show', lang=lang, page=LEGACY_PAGES_MAP[f])) else: return redirect(url_for('site_show', lang=lang, page=f)) From 3da28685892ae18a353d859946cb8c54447e16d8 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 11:29:33 +0000 Subject: [PATCH 207/317] Added LangConverter so that /en/ can be distinguished from legacy urls like /faq This is required because "site/" was removed from the urls, but a little backend trickery is usually necessary to get the urls looking right ^_^ --- i2p2www/__init__.py | 52 ++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index c7920f78..43c5ae28 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -1,6 +1,7 @@ from jinja2 import Environment, FileSystemLoader, environmentfilter from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, send_from_directory, safe_join from flaskext.babel import Babel +from werkzeug.routing import BaseConverter from docutils.core import publish_parts import os.path import os @@ -33,6 +34,23 @@ app.debug = bool(os.environ.get('APP_DEBUG', 'False')) babel = Babel(app) +####################### +# Custom URL converters + +class LangConverter(BaseConverter): + def __init__(self, url_map): + super(LangConverter, self).__init__(url_map) + self.regex = '(?:[a-z]{2})' + + def to_python(self, value): + return value + + def to_url(self, value): + return value + +app.url_map.converters['lang'] = LangConverter + + ###### # URLs @@ -41,28 +59,28 @@ def url(url_rule, import_name, **options): app.add_url_rule(url_rule, view_func=view, **options) url('/', 'views.main_index') -url('//', 'views.site_show', defaults={'page': 'index'}) -url('//', 'views.site_show') +url('//', 'views.site_show', defaults={'page': 'index'}) +url('//', 'views.site_show') -url('//blog/', 'blog.views.blog_index', defaults={'page': 1}) -url('//blog/page/', 'blog.views.blog_index') -url('//blog/entry/', 'blog.views.blog_entry') -url('//feed/blog/rss', 'blog.views.blog_rss') -url('//feed/blog/atom', 'blog.views.blog_atom') +url('//blog/', 'blog.views.blog_index', defaults={'page': 1}) +url('//blog/page/', 'blog.views.blog_index') +url('//blog/entry/', 'blog.views.blog_entry') +url('//feed/blog/rss', 'blog.views.blog_rss') +url('//feed/blog/atom', 'blog.views.blog_atom') -url('//meetings/', 'meetings.views.meetings_index', defaults={'page': 1}) -url('//meetings/page/', 'meetings.views.meetings_index') -url('//meetings/', 'meetings.views.meetings_show') -url('//meetings/.log', 'meetings.views.meetings_show_log') -url('//meetings/.rst', 'meetings.views.meetings_show_rst') -url('//feed/meetings/atom', 'meetings.views.meetings_atom') +url('//meetings/', 'meetings.views.meetings_index', defaults={'page': 1}) +url('//meetings/page/', 'meetings.views.meetings_index') +url('//meetings/', 'meetings.views.meetings_show') +url('//meetings/.log', 'meetings.views.meetings_show_log') +url('//meetings/.rst', 'meetings.views.meetings_show_rst') +url('//feed/meetings/atom', 'meetings.views.meetings_atom') url('/meeting', 'legacy.legacy_meeting') url('/meeting.html', 'legacy.legacy_meeting') url('/status---', 'legacy.legacy_status') url('/status---.html', 'legacy.legacy_status') -url('/_', 'legacy.legacy_show') -url('/_.html', 'legacy.legacy_show') +url('/_', 'legacy.legacy_show') +url('/_.html', 'legacy.legacy_show') url('/', 'legacy.legacy_show') url('/.html', 'legacy.legacy_show') @@ -241,13 +259,13 @@ def read_mirrors(): return ret # List of downloads -@app.route('//download') +@app.route('//download') def downloads_list(): # TODO: read mirror list or list of available files return render_template('downloads/list.html') # Specific file downloader -@app.route('//download/') +@app.route('//download/') def downloads_select(file): if (file == 'debian'): return render_template('downloads/debian.html') From 487e9ae9350779f155ef17e1bc714fa2e78d13aa Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 11:37:11 +0000 Subject: [PATCH 208/317] Added / to the end of the base legacy url route This is required because Flask is forcing (via 301) / to be appended to the url which previously resulted in no rule matching legacy pages. We could disable strict_slashes to fix this, but it might cause issues elsewhere. --- i2p2www/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 43c5ae28..a6371c57 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -81,7 +81,7 @@ url('/status---', 'legacy.legacy_status') url('/status---.html', 'legacy.legacy_status') url('/_', 'legacy.legacy_show') url('/_.html', 'legacy.legacy_show') -url('/', 'legacy.legacy_show') +url('//', 'legacy.legacy_show') url('/.html', 'legacy.legacy_show') From 66dca619d702e2f0cd3a1ffa2669f91d93c1c1b8 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 11:43:40 +0000 Subject: [PATCH 209/317] Moved site_url macro into context processor so could use hasattr(g, 'lang') to fix a bug --- i2p2www/__init__.py | 11 +++++++++++ i2p2www/pages/global/layout.html | 2 +- i2p2www/pages/global/macros | 6 ------ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index a6371c57..35165ac8 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -178,6 +178,16 @@ def restructuredtext(value): @app.context_processor def utility_processor(): + # Shorthand for getting a site url + def get_site_url(path=None): + lang = 'en' + if hasattr(g, 'lang') and g.lang: + lang = g.lang + if path: + return url_for('site_show', lang=lang, page=path) + else: + return url_for('site_show', lang=lang) + # Provide the canonical link to the current page def get_canonical_link(): protocol = request.url.split('//')[0] @@ -220,6 +230,7 @@ def utility_processor(): return dict(i2pconv=convert_url_to_clearnet, url_for_other_page=url_for_other_page, change_theme=change_theme, + site_url=get_site_url, canonical=get_canonical_link) diff --git a/i2p2www/pages/global/layout.html b/i2p2www/pages/global/layout.html index 494d2566..b6d01ae6 100644 --- a/i2p2www/pages/global/layout.html +++ b/i2p2www/pages/global/layout.html @@ -1,4 +1,4 @@ -{%- from "global/macros" import site_url, change_lang, ver with context -%} +{%- from "global/macros" import change_lang, ver with context -%} diff --git a/i2p2www/pages/global/macros b/i2p2www/pages/global/macros index 52783c00..074b2b7b 100644 --- a/i2p2www/pages/global/macros +++ b/i2p2www/pages/global/macros @@ -1,9 +1,3 @@ -{%- macro site_url(path=None) -%} -{%- if path -%}{{ url_for('site_show', lang=g.lang, page=path) }} -{%- else -%}{{ url_for('site_show', lang=g.lang) }} -{%- endif -%} -{%- endmacro -%} - {%- macro change_lang(lang) -%} {%- if request.endpoint == 'site_show' -%}{{ url_for('site_show', lang=lang, page=page) }} {%- elif request.endpoint == 'blog_entry' -%}{{ url_for('blog_entry', lang=lang, slug=slug) }} From 91a70314e352e53aef35ea63993aec2525f7cc69 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 11:55:05 +0000 Subject: [PATCH 210/317] Added regionalization support to LangConverter --- i2p2www/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 35165ac8..34a805d7 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -40,12 +40,18 @@ babel = Babel(app) class LangConverter(BaseConverter): def __init__(self, url_map): super(LangConverter, self).__init__(url_map) - self.regex = '(?:[a-z]{2})' + self.regex = '(?:[a-z]{2})(-[a-z]{2})?' def to_python(self, value): + parts = value.split('-') + if len(parts) == 2: + return parts[0] + '_' + parts[1].upper() return value def to_url(self, value): + parts = value.split('_') + if len(parts) == 2: + return parts[0] + '-' + parts[1].lower() return value app.url_map.converters['lang'] = LangConverter From 2ce24d59d3a494f67665a2c591546cb1b2579e14 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 12:00:12 +0000 Subject: [PATCH 211/317] Removed unused imports --- i2p2www/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 34a805d7..beccae24 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -1,11 +1,9 @@ -from jinja2 import Environment, FileSystemLoader, environmentfilter -from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, send_from_directory, safe_join +from flask import Flask, request, g, redirect, url_for, abort, render_template, send_from_directory, safe_join from flaskext.babel import Babel from werkzeug.routing import BaseConverter from docutils.core import publish_parts import os.path import os -import fileinput from random import randint try: import json From bc57b82753645d33da67fff94636a7314af1da19 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 12:13:51 +0000 Subject: [PATCH 212/317] Added shorthand functions to make language handling more stable --- i2p2www/__init__.py | 18 ++++++++++++++++++ i2p2www/pages/global/nav.html | 15 ++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index beccae24..ba4d228b 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -192,6 +192,22 @@ def utility_processor(): else: return url_for('site_show', lang=lang) + # Shorthand for getting a language-specific url + def get_url_with_lang(endpoint, **args): + lang = 'en' + if hasattr(g, 'lang') and g.lang: + lang = g.lang + return url_for(endpoint, lang=lang, **args) + + # Get a specific language flag, or the flag for the current language + def get_flag(lang=None): + if not lang: + if hasattr(g, 'lang') and g.lang: + lang = g.lang + else: + lang = 'en' + return url_for('static', filename='images/flags/'+lang+'.png') + # Provide the canonical link to the current page def get_canonical_link(): protocol = request.url.split('//')[0] @@ -235,6 +251,8 @@ def utility_processor(): url_for_other_page=url_for_other_page, change_theme=change_theme, site_url=get_site_url, + get_url=get_url_with_lang, + get_flag=get_flag, canonical=get_canonical_link) diff --git a/i2p2www/pages/global/nav.html b/i2p2www/pages/global/nav.html index 31b58380..eea2bed0 100644 --- a/i2p2www/pages/global/nav.html +++ b/i2p2www/pages/global/nav.html @@ -2,11 +2,11 @@
    6. {{ _('Team') }}
    7. +
    8. {{ _('Blog') }}
    9. {{ _('Hall of Fame') }}
    10. {{ _('Papers and presentations') }}
    11. {{ _('Contact us') }}
    12. @@ -125,12 +126,12 @@
    13. {{ _('Bounties') }}
    14. -
    15. {{ _('Meetings') }}
    16. +
    17. {{ _('Meetings') }}
    18. {{ _('Roadmap') }}
    19. {{ _('Task list') }}
    20. -
    21. {{ _('Language') }} +
    22. {{ _('Language') }} {% include "global/lang.html" %}
    23. From 30876c09f31760f1b2953fce843eeb15a4e3ef23 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 12:18:14 +0000 Subject: [PATCH 213/317] Use the new get_flag() template function in the Language menu --- i2p2www/pages/global/lang.html | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/i2p2www/pages/global/lang.html b/i2p2www/pages/global/lang.html index dab824fe..5aded9cc 100644 --- a/i2p2www/pages/global/lang.html +++ b/i2p2www/pages/global/lang.html @@ -1,14 +1,14 @@
        -
      • English
      • -
      • Castellano
      • -
      • Chinese
      • -
      • Deutsch
      • -
      • Français
      • -
      • Italiano
      • -
      • Nederlands
      • -
      • Russian
      • -
      • Svenska
      • -
      • Czech
      • -
      • Arabic
      • -
      • Greek
      • +
      • English
      • +
      • Castellano
      • +
      • Chinese
      • +
      • Deutsch
      • +
      • Français
      • +
      • Italiano
      • +
      • Nederlands
      • +
      • Russian
      • +
      • Svenska
      • +
      • Czech
      • +
      • Arabic
      • +
      • Greek
      From c7b8d77da0c1a9a863b0ccda96386acff68e1a78 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 12:25:19 +0000 Subject: [PATCH 214/317] Made change_theme() more stable (so 404 pages render properly) --- i2p2www/__init__.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index ba4d228b..bda0cc09 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -243,9 +243,14 @@ def utility_processor(): # Change the theme of the current page def change_theme(theme): - args = request.view_args.copy() + args = {} + if request.view_args: + args = request.view_args.copy() args['theme'] = theme - return url_for(request.endpoint, **args) + if request.endpoint: + return url_for(request.endpoint, **args) + # Probably a 404 error page + return url_for('main_index', **args) return dict(i2pconv=convert_url_to_clearnet, url_for_other_page=url_for_other_page, From 7701835ece85b05d828503883707b65a102060d1 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 12:39:53 +0000 Subject: [PATCH 215/317] Moved root file views into i2p2www.views, and committed this file (which was missed earlier) --- i2p2www/__init__.py | 21 ++++--------------- i2p2www/views.py | 50 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 17 deletions(-) create mode 100644 i2p2www/views.py diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index bda0cc09..20477fb6 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -88,6 +88,10 @@ url('/_.html', 'legacy.legacy_show') url('//', 'legacy.legacy_show') url('/.html', 'legacy.legacy_show') +url('/hosts.txt', 'views.hosts') +url('/robots.txt', 'views.robots') +url('/favicon.ico', 'views.favicon') + ################# # Babel selectors @@ -337,22 +341,5 @@ def downloads_redirect(protocol, file, mirror): return redirect(mirrors[mirror]['url'] % data) return redirect(mirrors[randint(0, len(mirrors) - 1)]['url'] % data) - -############ -# Root files - -@app.route('/hosts.txt') -def hosts(): - return send_from_directory(STATIC_DIR, 'hosts.txt', mimetype='text/plain') - -@app.route('/robots.txt') -def robots(): - return send_from_directory(STATIC_DIR, 'robots.txt', mimetype='text/plain') - -@app.route('/favicon.ico') -def favicon(): - return send_from_directory(os.path.join(app.root_path, 'static'), - 'favicon.ico', mimetype='image/vnd.microsoft.icon') - if __name__ == '__main__': app.run(debug=True) diff --git a/i2p2www/views.py b/i2p2www/views.py new file mode 100644 index 00000000..dc94ae5d --- /dev/null +++ b/i2p2www/views.py @@ -0,0 +1,50 @@ +from flask import abort, redirect, render_template, safe_join, send_from_directory, url_for +import os.path + +from i2p2www import STATIC_DIR, TEMPLATE_DIR +from i2p2www.blog.helpers import get_blog_entries + + +####################### +# General page handlers + +# Index - redirects to en homepage +def main_index(): + return redirect(url_for('site_show', lang='en')) + +# Site pages +def site_show(page): + if page.endswith('.html'): + return redirect(url_for('site_show', page=page[:-5])) + name = 'site/%s.html' % page + page_file = safe_join(TEMPLATE_DIR, name) + + if not os.path.exists(page_file): + # Could be a directory, so try index.html + name = 'site/%s/index.html' % page + page_file = safe_join(TEMPLATE_DIR, name) + if not os.path.exists(page_file): + # bah! those damn users all the time! + abort(404) + + options = { + 'page': page, + } + if (page == 'index'): + options['blog_entries'] = get_blog_entries(8) + + # hah! + return render_template(name, **options) + + +############ +# Root files + +def hosts(): + return send_from_directory(STATIC_DIR, 'hosts.txt', mimetype='text/plain') + +def robots(): + return send_from_directory(STATIC_DIR, 'robots.txt', mimetype='text/plain') + +def favicon(): + return send_from_directory(STATIC_DIR, 'favicon.ico', mimetype='image/vnd.microsoft.icon') From 53d9e4030303617a24ff812e79f2b5d7d3b9d0f7 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 12:52:05 +0000 Subject: [PATCH 216/317] Split off downloads code --- i2p2www/__init__.py | 75 +++----------------------------------------- i2p2www/downloads.py | 69 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 70 deletions(-) create mode 100644 i2p2www/downloads.py diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 20477fb6..72775575 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -4,11 +4,6 @@ from werkzeug.routing import BaseConverter from docutils.core import publish_parts import os.path import os -from random import randint -try: - import json -except ImportError: - import simplejson as json from helpers import LazyView, Pagination @@ -79,6 +74,11 @@ url('//meetings/.log', 'meetings.views.meetings_show_log') url('//meetings/.rst', 'meetings.views.meetings_show_rst') url('//feed/meetings/atom', 'meetings.views.meetings_atom') +url('//download', 'downloads.downloads_list') +url('//download/', 'downloads.downloads_select') +url('/download//any/', 'downloads.downloads_redirect', defaults={'mirror': None}) +url('/download///', 'downloads.downloads_redirect') + url('/meeting', 'legacy.legacy_meeting') url('/meeting.html', 'legacy.legacy_meeting') url('/status---', 'legacy.legacy_status') @@ -276,70 +276,5 @@ def page_not_found(error): def server_error(error): return render_template('global/error_500.html'), 500 - -################### -# Download handlers - -# Read in mirrors from file -def read_mirrors(): - file = open(MIRRORS_FILE, 'r') - dat = file.read() - file.close() - lines=dat.split('\n') - ret={} - for line in lines: - try: - obj=json.loads(line) - except ValueError: - continue - if 'protocol' not in obj: - continue - protocol=obj['protocol'] - if protocol not in ret: - ret[protocol]=[] - ret[protocol].append(obj) - return ret - -# List of downloads -@app.route('//download') -def downloads_list(): - # TODO: read mirror list or list of available files - return render_template('downloads/list.html') - -# Specific file downloader -@app.route('//download/') -def downloads_select(file): - if (file == 'debian'): - return render_template('downloads/debian.html') - mirrors=read_mirrors() - data = { - 'version': CURRENT_I2P_VERSION, - 'file': file, - } - obj=[] - for protocol in mirrors.keys(): - a={} - a['name']=protocol - a['mirrors']=mirrors[protocol] - for mirror in a['mirrors']: - mirror['url']=mirror['url'] % data - obj.append(a) - return render_template('downloads/select.html', mirrors=obj, file=file) - -@app.route('/download//any/', defaults={'mirror': None}) -@app.route('/download///') -def downloads_redirect(protocol, file, mirror): - mirrors=read_mirrors() - if not protocol in mirrors: - abort(404) - mirrors=mirrors[protocol] - data = { - 'version': CURRENT_I2P_VERSION, - 'file': file, - } - if mirror: - return redirect(mirrors[mirror]['url'] % data) - return redirect(mirrors[randint(0, len(mirrors) - 1)]['url'] % data) - if __name__ == '__main__': app.run(debug=True) diff --git a/i2p2www/downloads.py b/i2p2www/downloads.py new file mode 100644 index 00000000..a9b32592 --- /dev/null +++ b/i2p2www/downloads.py @@ -0,0 +1,69 @@ +from flask import redirect, render_template +try: + import json +except ImportError: + import simplejson as json +from random import randint + +from i2p2www import CURRENT_I2P_VERSION, MIRRORS_FILE + + +################### +# Download handlers + +# Read in mirrors from file +def read_mirrors(): + file = open(MIRRORS_FILE, 'r') + dat = file.read() + file.close() + lines=dat.split('\n') + ret={} + for line in lines: + try: + obj=json.loads(line) + except ValueError: + continue + if 'protocol' not in obj: + continue + protocol=obj['protocol'] + if protocol not in ret: + ret[protocol]=[] + ret[protocol].append(obj) + return ret + +# List of downloads +def downloads_list(): + # TODO: read mirror list or list of available files + return render_template('downloads/list.html') + +# Specific file downloader +def downloads_select(file): + if (file == 'debian'): + return render_template('downloads/debian.html') + mirrors=read_mirrors() + data = { + 'version': CURRENT_I2P_VERSION, + 'file': file, + } + obj=[] + for protocol in mirrors.keys(): + a={} + a['name']=protocol + a['mirrors']=mirrors[protocol] + for mirror in a['mirrors']: + mirror['url']=mirror['url'] % data + obj.append(a) + return render_template('downloads/select.html', mirrors=obj, file=file) + +def downloads_redirect(protocol, file, mirror): + mirrors=read_mirrors() + if not protocol in mirrors: + abort(404) + mirrors=mirrors[protocol] + data = { + 'version': CURRENT_I2P_VERSION, + 'file': file, + } + if mirror: + return redirect(mirrors[mirror]['url'] % data) + return redirect(mirrors[randint(0, len(mirrors) - 1)]['url'] % data) From 9def101b3229fc11d2030ddb8ad432b0a11f7137 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 13:02:16 +0000 Subject: [PATCH 217/317] Split of template functions into a separate file --- i2p2www/__init__.py | 88 ++--------------------------------------- i2p2www/templatevars.py | 88 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 84 deletions(-) create mode 100644 i2p2www/templatevars.py diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 72775575..1f2d07f3 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -181,90 +181,6 @@ def restructuredtext(value): return parts['html_body'] -#################### -# Context processors - -@app.context_processor -def utility_processor(): - # Shorthand for getting a site url - def get_site_url(path=None): - lang = 'en' - if hasattr(g, 'lang') and g.lang: - lang = g.lang - if path: - return url_for('site_show', lang=lang, page=path) - else: - return url_for('site_show', lang=lang) - - # Shorthand for getting a language-specific url - def get_url_with_lang(endpoint, **args): - lang = 'en' - if hasattr(g, 'lang') and g.lang: - lang = g.lang - return url_for(endpoint, lang=lang, **args) - - # Get a specific language flag, or the flag for the current language - def get_flag(lang=None): - if not lang: - if hasattr(g, 'lang') and g.lang: - lang = g.lang - else: - lang = 'en' - return url_for('static', filename='images/flags/'+lang+'.png') - - # Provide the canonical link to the current page - def get_canonical_link(): - protocol = request.url.split('//')[0] - return protocol + '//' + CANONICAL_DOMAIN + request.path - - # Convert an I2P url to an equivalent clearnet one - i2ptoclear = { - 'www.i2p2.i2p': 'www.i2p2.de', - #'forum.i2p': 'forum.i2p2.de', - 'trac.i2p2.i2p': 'trac.i2p2.de', - 'mail.i2p': 'i2pmail.org', - } - def convert_url_to_clearnet(value): - if not value.endswith('.i2p'): - # The url being passed in isn't an I2P url, so just return it - return value - if request.headers.get('X-I2P-Desthash') and not request.headers.get('X-Forwarded-Server'): - # The request is from within I2P, so use I2P url - return value - # The request is either directly from clearnet or through an inproxy - try: - # Return the known clearnet url corresponding to the I2P url - return i2ptoclear[value] - except KeyError: - # The I2P site has no known clearnet address, so use an inproxy - return value + '.to' - - # Convert a paginated URL to that of another page - def url_for_other_page(page): - args = request.view_args.copy() - args['page'] = page - return url_for(request.endpoint, **args) - - # Change the theme of the current page - def change_theme(theme): - args = {} - if request.view_args: - args = request.view_args.copy() - args['theme'] = theme - if request.endpoint: - return url_for(request.endpoint, **args) - # Probably a 404 error page - return url_for('main_index', **args) - - return dict(i2pconv=convert_url_to_clearnet, - url_for_other_page=url_for_other_page, - change_theme=change_theme, - site_url=get_site_url, - get_url=get_url_with_lang, - get_flag=get_flag, - canonical=get_canonical_link) - - ################ # Error handlers @@ -276,5 +192,9 @@ def page_not_found(error): def server_error(error): return render_template('global/error_500.html'), 500 + +# Import these to ensure they get loaded +import templatevars + if __name__ == '__main__': app.run(debug=True) diff --git a/i2p2www/templatevars.py b/i2p2www/templatevars.py new file mode 100644 index 00000000..3790f505 --- /dev/null +++ b/i2p2www/templatevars.py @@ -0,0 +1,88 @@ +from flask import g, request, url_for + +from i2p2www import CANONICAL_DOMAIN, app + +I2P_TO_CLEAR = { + 'www.i2p2.i2p': 'www.i2p2.de', + #'forum.i2p': 'forum.i2p2.de', + 'trac.i2p2.i2p': 'trac.i2p2.de', + 'mail.i2p': 'i2pmail.org', + } + + +#################### +# Template functions + +@app.context_processor +def utility_processor(): + # Shorthand for getting a site url + def get_site_url(path=None): + lang = 'en' + if hasattr(g, 'lang') and g.lang: + lang = g.lang + if path: + return url_for('site_show', lang=lang, page=path) + else: + return url_for('site_show', lang=lang) + + # Shorthand for getting a language-specific url + def get_url_with_lang(endpoint, **args): + lang = 'en' + if hasattr(g, 'lang') and g.lang: + lang = g.lang + return url_for(endpoint, lang=lang, **args) + + # Get a specific language flag, or the flag for the current language + def get_flag(lang=None): + if not lang: + if hasattr(g, 'lang') and g.lang: + lang = g.lang + else: + lang = 'en' + return url_for('static', filename='images/flags/'+lang+'.png') + + # Provide the canonical link to the current page + def get_canonical_link(): + protocol = request.url.split('//')[0] + return protocol + '//' + CANONICAL_DOMAIN + request.path + + # Convert an I2P url to an equivalent clearnet one + def convert_url_to_clearnet(value): + if not value.endswith('.i2p'): + # The url being passed in isn't an I2P url, so just return it + return value + if request.headers.get('X-I2P-Desthash') and not request.headers.get('X-Forwarded-Server'): + # The request is from within I2P, so use I2P url + return value + # The request is either directly from clearnet or through an inproxy + try: + # Return the known clearnet url corresponding to the I2P url + return I2P_TO_CLEAR[value] + except KeyError: + # The I2P site has no known clearnet address, so use an inproxy + return value + '.to' + + # Convert a paginated URL to that of another page + def url_for_other_page(page): + args = request.view_args.copy() + args['page'] = page + return url_for(request.endpoint, **args) + + # Change the theme of the current page + def change_theme(theme): + args = {} + if request.view_args: + args = request.view_args.copy() + args['theme'] = theme + if request.endpoint: + return url_for(request.endpoint, **args) + # Probably a 404 error page + return url_for('main_index', **args) + + return dict(i2pconv=convert_url_to_clearnet, + url_for_other_page=url_for_other_page, + change_theme=change_theme, + site_url=get_site_url, + get_url=get_url_with_lang, + get_flag=get_flag, + canonical=get_canonical_link) From 0312088547528afb113811d8e8acd3f77e1f722b Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 20:53:18 +0000 Subject: [PATCH 218/317] Removed rel="nofollow" from the footer links to the t-shirt sites (they aren't mirrors) --- i2p2www/pages/global/footer.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i2p2www/pages/global/footer.html b/i2p2www/pages/global/footer.html index 9edbab19..ec7df978 100644 --- a/i2p2www/pages/global/footer.html +++ b/i2p2www/pages/global/footer.html @@ -33,8 +33,8 @@
      From d633b4a704844b30570176206532be7787a2c37d Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 21:30:06 +0000 Subject: [PATCH 219/317] Split off urls --- i2p2www/__init__.py | 70 +-------------------------------------------- i2p2www/urls.py | 70 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 69 deletions(-) create mode 100644 i2p2www/urls.py diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 1f2d07f3..1bb725c2 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -1,12 +1,9 @@ from flask import Flask, request, g, redirect, url_for, abort, render_template, send_from_directory, safe_join from flaskext.babel import Babel -from werkzeug.routing import BaseConverter from docutils.core import publish_parts import os.path import os -from helpers import LazyView, Pagination - CURRENT_I2P_VERSION = '0.9.4' CANONICAL_DOMAIN = 'www.i2p2.de' @@ -27,72 +24,6 @@ app.debug = bool(os.environ.get('APP_DEBUG', 'False')) babel = Babel(app) -####################### -# Custom URL converters - -class LangConverter(BaseConverter): - def __init__(self, url_map): - super(LangConverter, self).__init__(url_map) - self.regex = '(?:[a-z]{2})(-[a-z]{2})?' - - def to_python(self, value): - parts = value.split('-') - if len(parts) == 2: - return parts[0] + '_' + parts[1].upper() - return value - - def to_url(self, value): - parts = value.split('_') - if len(parts) == 2: - return parts[0] + '-' + parts[1].lower() - return value - -app.url_map.converters['lang'] = LangConverter - - -###### -# URLs - -def url(url_rule, import_name, **options): - view = LazyView('i2p2www.' + import_name) - app.add_url_rule(url_rule, view_func=view, **options) - -url('/', 'views.main_index') -url('//', 'views.site_show', defaults={'page': 'index'}) -url('//', 'views.site_show') - -url('//blog/', 'blog.views.blog_index', defaults={'page': 1}) -url('//blog/page/', 'blog.views.blog_index') -url('//blog/entry/', 'blog.views.blog_entry') -url('//feed/blog/rss', 'blog.views.blog_rss') -url('//feed/blog/atom', 'blog.views.blog_atom') - -url('//meetings/', 'meetings.views.meetings_index', defaults={'page': 1}) -url('//meetings/page/', 'meetings.views.meetings_index') -url('//meetings/', 'meetings.views.meetings_show') -url('//meetings/.log', 'meetings.views.meetings_show_log') -url('//meetings/.rst', 'meetings.views.meetings_show_rst') -url('//feed/meetings/atom', 'meetings.views.meetings_atom') - -url('//download', 'downloads.downloads_list') -url('//download/', 'downloads.downloads_select') -url('/download//any/', 'downloads.downloads_redirect', defaults={'mirror': None}) -url('/download///', 'downloads.downloads_redirect') - -url('/meeting', 'legacy.legacy_meeting') -url('/meeting.html', 'legacy.legacy_meeting') -url('/status---', 'legacy.legacy_status') -url('/status---.html', 'legacy.legacy_status') -url('/_', 'legacy.legacy_show') -url('/_.html', 'legacy.legacy_show') -url('//', 'legacy.legacy_show') -url('/.html', 'legacy.legacy_show') - -url('/hosts.txt', 'views.hosts') -url('/robots.txt', 'views.robots') -url('/favicon.ico', 'views.favicon') - - ################# # Babel selectors @@ -195,6 +126,7 @@ def server_error(error): # Import these to ensure they get loaded import templatevars +import urls if __name__ == '__main__': app.run(debug=True) diff --git a/i2p2www/urls.py b/i2p2www/urls.py new file mode 100644 index 00000000..84ed409d --- /dev/null +++ b/i2p2www/urls.py @@ -0,0 +1,70 @@ +from werkzeug.routing import BaseConverter + +from i2p2www import app +from i2p2www.helpers import LazyView + + +####################### +# Custom URL converters + +class LangConverter(BaseConverter): + def __init__(self, url_map): + super(LangConverter, self).__init__(url_map) + self.regex = '(?:[a-z]{2})(-[a-z]{2})?' + + def to_python(self, value): + parts = value.split('-') + if len(parts) == 2: + return parts[0] + '_' + parts[1].upper() + return value + + def to_url(self, value): + parts = value.split('_') + if len(parts) == 2: + return parts[0] + '-' + parts[1].lower() + return value + +app.url_map.converters['lang'] = LangConverter + + +###### +# URLs + +def url(url_rule, import_name, **options): + view = LazyView('i2p2www.' + import_name) + app.add_url_rule(url_rule, view_func=view, **options) + +url('/', 'views.main_index') +url('//', 'views.site_show', defaults={'page': 'index'}) +url('//', 'views.site_show') + +url('//blog/', 'blog.views.blog_index', defaults={'page': 1}) +url('//blog/page/', 'blog.views.blog_index') +url('//blog/entry/', 'blog.views.blog_entry') +url('//feed/blog/rss', 'blog.views.blog_rss') +url('//feed/blog/atom', 'blog.views.blog_atom') + +url('//meetings/', 'meetings.views.meetings_index', defaults={'page': 1}) +url('//meetings/page/', 'meetings.views.meetings_index') +url('//meetings/', 'meetings.views.meetings_show') +url('//meetings/.log', 'meetings.views.meetings_show_log') +url('//meetings/.rst', 'meetings.views.meetings_show_rst') +url('//feed/meetings/atom', 'meetings.views.meetings_atom') + +url('//download', 'downloads.downloads_list') +url('//download/', 'downloads.downloads_select') +url('/download//any/', 'downloads.downloads_redirect', defaults={'mirror': None}) +url('/download///', 'downloads.downloads_redirect') + +url('/meeting', 'legacy.legacy_meeting') +url('/meeting.html', 'legacy.legacy_meeting') +url('/status---', 'legacy.legacy_status') +url('/status---.html', 'legacy.legacy_status') +url('/_', 'legacy.legacy_show') +url('/_.html', 'legacy.legacy_show') +url('//', 'legacy.legacy_show') +url('/.html', 'legacy.legacy_show') + +url('/hosts.txt', 'views.hosts') +url('/robots.txt', 'views.robots') +url('/favicon.ico', 'views.favicon') From d7bce012883eb6dc7626a7a6e97bf101eefddda8 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 19 Dec 2012 21:32:10 +0000 Subject: [PATCH 220/317] Removed unnecessary block at end of __init__.py --- i2p2www/__init__.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py index 1bb725c2..a9c4093a 100644 --- a/i2p2www/__init__.py +++ b/i2p2www/__init__.py @@ -127,6 +127,3 @@ def server_error(error): # Import these to ensure they get loaded import templatevars import urls - -if __name__ == '__main__': - app.run(debug=True) From f1a1d63e2aaddc6137b13453f20187242cea197c Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 20 Dec 2012 01:41:26 +0000 Subject: [PATCH 221/317] Changes to the menubar CSS to bring it as close to duck's original theme as possible --- i2p2www/static/styles/duck.css | 59 ++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/i2p2www/static/styles/duck.css b/i2p2www/static/styles/duck.css index 8d36404a..0905664d 100644 --- a/i2p2www/static/styles/duck.css +++ b/i2p2www/static/styles/duck.css @@ -12,7 +12,7 @@ a {color:#d00e0e; text-decoration:none;} div.hide {display:none;} -div#branding {width:80%; margin:1em auto; position:relative;} +div#branding {width:80%; /*margin:1em auto;*/ margin: 1em auto 0; position:relative;} div#branding #logo img:hover { filter:alpha(opacity=60); -moz-opacity: 0.6; @@ -39,16 +39,17 @@ menu ul, position: relative; } #cssmenu { - height: 49px; - background: #141414; + /*height: 49px;*/ + height: 40px; + /*background: #141414; background: -moz-linear-gradient(top, #32323a 0%, #141414 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #32323a), color-stop(100%, #141414)); background: -webkit-linear-gradient(top, #32323a 0%, #141414 100%); background: -o-linear-gradient(top, #32323a 0%, #141414 100%); background: -ms-linear-gradient(top, #32323a 0%, #141414 100%); - background: linear-gradient(to bottom, #32323a 0%, #141414 100%); + background: linear-gradient(to bottom, #32323a 0%, #141414 100%);*/ filter: progid:DXImageTransform.Microsoft.Gradient(StartColorStr='#32323a', EndColorStr='#141414', GradientType=0); - border-bottom: 2px solid #0fa1e0; + /*border-bottom: 2px solid #0fa1e0;*/ } #cssmenu:after, #cssmenu ul:after { @@ -57,22 +58,26 @@ menu ul, clear: both; } #cssmenu a { - background: #141414; + /*background: #141414; background: -moz-linear-gradient(top, #32323a 0%, #141414 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #32323a), color-stop(100%, #141414)); background: -webkit-linear-gradient(top, #32323a 0%, #141414 100%); background: -o-linear-gradient(top, #32323a 0%, #141414 100%); background: -ms-linear-gradient(top, #32323a 0%, #141414 100%); - background: linear-gradient(to bottom, #32323a 0%, #141414 100%); + background: linear-gradient(to bottom, #32323a 0%, #141414 100%);*/ filter: progid:DXImageTransform.Microsoft.Gradient(StartColorStr='#32323a', EndColorStr='#141414', GradientType=0); - color: #ffffff; + /*color: #ffffff;*/ + color: #d00e0e; display: inline-block; font-family: "URW Gothic L", "Century Gothic", sans-serif; - font-size: 11pt; + /*font-size: 11pt;*/ + font-size: 2em; font-weight: bold; text-shadow: 1px 1px 1px rgba(100,20,20,.2); - line-height: 49px; - padding: 0 20px; + /*line-height: 49px;*/ + line-height: 40px; + /*padding: 0 20px;*/ + padding: 0 10px; text-decoration: none; } #cssmenu ul { @@ -99,10 +104,11 @@ menu ul, bottom: 0; border-left: 10px solid transparent; border-right: 10px solid transparent; - border-bottom: 10px solid #0fa1e0; + /*border-bottom: 10px solid #0fa1e0;*/ + border-bottom: 10px solid #abcc71; margin-left: -10px; } -#cssmenu > ul > li:first-child > a { +/*#cssmenu > ul > li:first-child > a { border-radius: 5px 0 0 0; -moz-border-radius: 5px 0 0 0; -webkit-border-radius: 5px 0 0 0; @@ -111,6 +117,11 @@ menu ul, border-radius: 0 5px 0 0; -moz-border-radius: 0 5px 0 0; -webkit-border-radius: 0 5px 0 0; +}*/ +#cssmenu > ul > li > a { + border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; } #cssmenu > ul > li.active > a { box-shadow: inset 0 0 3px #000000; @@ -126,13 +137,13 @@ menu ul, filter: progid:DXImageTransform.Microsoft.Gradient(StartColorStr='#26262c', EndColorStr='#070707', GradientType=0); } #cssmenu > ul > li:hover > a { - background: #070707; + /*background: #070707; background: -moz-linear-gradient(top, #26262c 0%, #070707 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #26262c), color-stop(100%, #070707)); background: -webkit-linear-gradient(top, #26262c 0%, #070707 100%); background: -o-linear-gradient(top, #26262c 0%, #070707 100%); background: -ms-linear-gradient(top, #26262c 0%, #070707 100%); - background: linear-gradient(to bottom, #26262c 0%, #070707 100%); + background: linear-gradient(to bottom, #26262c 0%, #070707 100%);*/ filter: progid:DXImageTransform.Microsoft.Gradient(StartColorStr='#26262c', EndColorStr='#070707', GradientType=0); box-shadow: inset 0 0 3px #000000; -moz-box-shadow: inset 0 0 3px #000000; @@ -155,8 +166,10 @@ menu ul, *margin-bottom: -1px; } #cssmenu .has-sub ul li a { - background: #0fa1e0; - border-bottom: 1px dotted #6fc7ec; + /*background: #0fa1e0;*/ + /*border-bottom: 1px dotted #6fc7ec;*/ + background: #abcc71; + border-bottom: 1px dotted #ffffcc; filter: none; font-size: 9pt; display: block; @@ -164,7 +177,8 @@ menu ul, padding: 10px; } #cssmenu .has-sub ul li:hover a { - background: #0c7fb0; + /*background: #0c7fb0;*/ + background: #8bac51; } #cssmenu .has-sub .has-sub:hover > ul { display: block; @@ -176,11 +190,14 @@ menu ul, top: 0; } #cssmenu .has-sub .has-sub ul li a { - background: #0c7fb0; - border-bottom: 1px dotted #6db2d0; + /*background: #0c7fb0; + border-bottom: 1px dotted #6db2d0;*/ + background: #8bac51; + border-bottom: 1px dotted #ffffcc; } #cssmenu .has-sub .has-sub ul li a:hover { - background: #095c80; + /*background: #095c80;*/ + background: #6bac31; } /* End of dropdown menu CSS */ From d99220f113bd50869cfbc2df4d1a21054f4998c2 Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 20 Dec 2012 01:42:23 +0000 Subject: [PATCH 222/317] Added side borders to .inner and rounded the top corners --- i2p2www/static/styles/duck.css | 1 + 1 file changed, 1 insertion(+) diff --git a/i2p2www/static/styles/duck.css b/i2p2www/static/styles/duck.css index 0905664d..5ebe585e 100644 --- a/i2p2www/static/styles/duck.css +++ b/i2p2www/static/styles/duck.css @@ -257,6 +257,7 @@ div#content .main { div#content .inner { width:auto; margin: 0 5%; padding: 4em 5%; position:relative; background: rgba(171, 204, 113, 0.6); border-top:2px solid #abcc71; + border-left: 2px solid #abcc71; border-right: 2px solid #abcc71; border-radius: 5px 5px 0 0; color:black; font-size:1.2em; line-height:1.4em; } div#content .inner h1, div#content .inner h2, div#content .inner h3 {color:white; text-shadow:1px 1px 1px rgba(0,0,0,.3); margin:1em 0 .5em; border-bottom:1px solid white; padding-bottom:.2em;} From cc292624d22586d8ac46f1a3cb397e28fe7121b7 Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 20 Dec 2012 02:07:24 +0000 Subject: [PATCH 223/317] Tweak the color of the second- and third-level menus --- i2p2www/static/styles/duck.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i2p2www/static/styles/duck.css b/i2p2www/static/styles/duck.css index 5ebe585e..1230a230 100644 --- a/i2p2www/static/styles/duck.css +++ b/i2p2www/static/styles/duck.css @@ -178,7 +178,7 @@ menu ul, } #cssmenu .has-sub ul li:hover a { /*background: #0c7fb0;*/ - background: #8bac51; + background: #8bbc51; } #cssmenu .has-sub .has-sub:hover > ul { display: block; @@ -192,7 +192,7 @@ menu ul, #cssmenu .has-sub .has-sub ul li a { /*background: #0c7fb0; border-bottom: 1px dotted #6db2d0;*/ - background: #8bac51; + background: #8bbc51; border-bottom: 1px dotted #ffffcc; } #cssmenu .has-sub .has-sub ul li a:hover { From e6e11fa905287867b6a4d87c8d80368ee91bbc89 Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 20 Dec 2012 02:08:53 +0000 Subject: [PATCH 224/317] Migrated docs index over to lastupdated and accuratefor tags --- i2p2www/pages/site/docs/index.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/i2p2www/pages/site/docs/index.html b/i2p2www/pages/site/docs/index.html index 5784fa5e..22274c62 100644 --- a/i2p2www/pages/site/docs/index.html +++ b/i2p2www/pages/site/docs/index.html @@ -1,11 +1,12 @@ {% extends "global/layout.html" %} {% block title %}Index to Technical Documentation{% endblock %} +{% block lastupdated %}May 2012{% endblock %} +{% block accuratefor %}0.9{% endblock %} {% block content %}

      How does I2P work?

      Following is an index to the technical documentation for I2P. -This page was last updated in May 2012 and is accurate for router version 0.9.

      This index is ordered from the highest to lowest layers. The higher layers are for "clients" or applications; From 9527fcd19c74c8807e965c20a02080ae2a51e42e Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 20 Dec 2012 04:41:03 +0000 Subject: [PATCH 225/317] Attempt to prevent title text overlapping with the header image (though second line sits behind the menu...) --- i2p2www/static/styles/duck.css | 1 + 1 file changed, 1 insertion(+) diff --git a/i2p2www/static/styles/duck.css b/i2p2www/static/styles/duck.css index 1230a230..c80d0dc0 100644 --- a/i2p2www/static/styles/duck.css +++ b/i2p2www/static/styles/duck.css @@ -22,6 +22,7 @@ div#branding {width:80%; /*margin:1em auto;*/ margin: 1em auto 0; position:relat font-family:"URW Gothic L", "Century Gothic", sans-serif; text-transform:uppercase; font-size:3.5em; font-weight:bold; text-shadow:1px 1px 1px rgba(0,0,0,.2); color:#333333; position:absolute; top:0; right:0; line-height:41px; vertical-align:middle; + max-width: 70%; text-align: right; } div.navigation {position:relative;} From 3c3b4ed706f571e7d24fb916edd9f49e229b7952 Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 20 Dec 2012 04:46:37 +0000 Subject: [PATCH 226/317] Moved ver() into templatevars so only need to change I2P version in one place --- i2p2www/pages/global/layout.html | 2 +- i2p2www/pages/global/macros | 6 ------ i2p2www/templatevars.py | 8 +++++++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/i2p2www/pages/global/layout.html b/i2p2www/pages/global/layout.html index b6d01ae6..3d375aa3 100644 --- a/i2p2www/pages/global/layout.html +++ b/i2p2www/pages/global/layout.html @@ -1,4 +1,4 @@ -{%- from "global/macros" import change_lang, ver with context -%} +{%- from "global/macros" import change_lang with context -%} diff --git a/i2p2www/pages/global/macros b/i2p2www/pages/global/macros index 074b2b7b..1d709ff0 100644 --- a/i2p2www/pages/global/macros +++ b/i2p2www/pages/global/macros @@ -8,12 +8,6 @@ {%- endif -%} {%- endmacro -%} -{%- macro ver(string=None) -%} -{%- if string -%}{{ string % '0.9.4' }} -{%- else -%}{{ '0.9.4' }} -{%- endif -%} -{%- endmacro -%} - {%- macro render_pagination(pagination) %}