From 6e3280ffd29f20046238581510d8fe4e5fac0db1 Mon Sep 17 00:00:00 2001 From: Alexandr Shurigin Date: Sun, 1 Jun 2014 02:41:51 +0700 Subject: [PATCH 01/15] Create gh-pages branch via GitHub --- index.html | 147 ++++++++++++++++++++ javascripts/scale.fix.js | 17 +++ params.json | 1 + stylesheets/pygment_trac.css | 69 ++++++++++ stylesheets/styles.css | 255 +++++++++++++++++++++++++++++++++++ 5 files changed, 489 insertions(+) create mode 100644 index.html create mode 100644 javascripts/scale.fix.js create mode 100644 params.json create mode 100644 stylesheets/pygment_trac.css create mode 100644 stylesheets/styles.css diff --git a/index.html b/index.html new file mode 100644 index 0000000..45869ed --- /dev/null +++ b/index.html @@ -0,0 +1,147 @@ + + + + + + Django-macros-url by phpdude + + + + + + + +
+
+

Django-macros-url

+

Django Macros Url v0.1.0 - Routing must be simple as possible

+ +

View the Project on GitHub phpdude/django-macros-url

+ + + +
+
+

+ +Django Macros Url v0.1.0 - Routing must be simple as possible

+ +

Django Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.

+ +

You can combine your prefixes with macro names with underscope, for example you can use macro :slug and :product_slug. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.

+ +

+Supported macros by default

+ +
slug - [\w-]+
+year - \d{4}
+month - (0?([1-9])|10|11|12)
+day - ((0|1|2)?([1-9])|[1-3]0|31)
+id - \d+
+uuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}
+
+ +

If you want to offer more macros by default, you can fork and make pull request.

+ +

+Usage

+ +

Django Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.

+ +

Also you can register new macro (or maybe you want to replace default macro with your like regex pattern) with macrosurl.register(macro, pattern) method.

+ +

Example of registration.

+ +
import macrosurl
+
+macrosurl.register('myhash', '[a-f0-9]{9}')
+
+urlpatterns = patterns(
+    'yourapp.views',
+    url('^:myhash/$', 'myhash_main'),
+    url('^news/:news_myhash/$', 'myhash_news'),
+)
+
+ +

You free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.

+ +

+Urls normalization

+ +

Once Macros Url finished compile regex pattern, it makes normalization of it by rules:

+ +
    +
  • Strip from left side all whitespace and ^
  • +
  • Strip from right side of pattern all whitespace and $
  • +
  • Add to left side ^
  • +
  • Add to right side $
  • +

This makes your urls always very strong to adding any unexpected params into path.

+ +

+Examples

+ +

Macro Url example urls.py file

+ +
from django.conf.urls import patterns
+from project.apps.portal import views
+from project.apps.macrosurl import url
+
+
+urlpatterns = patterns(
+    'yourapp.views',
+    url('^:category_slug/$', 'category'),
+    url('^:category_slug/:product_slug/$', 'category_product'),
+    url('^:category_slug/:product_slug/:variant_id$', 'category_product_variant'),
+    url('^news/$', 'news'),
+    url('^news/:year/:month/:day$', 'news_date'),
+    url('^news/:slug$', 'news_entry'),
+    url('^order/:id$', 'order'),
+)
+
+ +

Django way urls example

+ +
from django.conf.urls import patterns
+from project.apps.portal import views
+from project.apps.macrosurl import url
+
+
+urlpatterns = patterns(
+    'yourapp.views',
+    url('^(?P<category_slug>[\w-]+>)/$', 'category'),
+    url('^(?P<category_slug>[\w-]+>)/(?P<product_slug>[\w-]+>)/$', 'category_product'),
+    url('^(?P<category_slug>[\w-]+>)/(?P<product_slug>[\w-]+>)/(?P<variant_id>\d+>)$', 'category_product_variant'),
+    url('^news/$', 'news'),
+    url('^news/(?P<year>\d{4}>)/(?P<month>(0?([1-9])|10|11|12)>)/(?P<day>((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),
+    url('^news/(?P<slug>[\w-]+>)$', 'news_entry'),
+    url('^order/(?P<id>\d+>)$', 'order'),
+)
+
+ +

I think you simple understand the difference of ways :)

+ +

+Routing must be simple! ;-)

+ +

I think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.

+ +

+Contributor

+ +

Alexandr Shurigin (aka phpdude)

+
+
+

This project is maintained by phpdude

+

Hosted on GitHub Pages — Theme by orderedlist

+
+
+ + + + \ No newline at end of file diff --git a/javascripts/scale.fix.js b/javascripts/scale.fix.js new file mode 100644 index 0000000..87a40ca --- /dev/null +++ b/javascripts/scale.fix.js @@ -0,0 +1,17 @@ +var metas = document.getElementsByTagName('meta'); +var i; +if (navigator.userAgent.match(/iPhone/i)) { + for (i=0; i[\\w-]+>)/$', 'category'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you simple understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file diff --git a/stylesheets/pygment_trac.css b/stylesheets/pygment_trac.css new file mode 100644 index 0000000..c6a6452 --- /dev/null +++ b/stylesheets/pygment_trac.css @@ -0,0 +1,69 @@ +.highlight { background: #ffffff; } +.highlight .c { color: #999988; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .k { font-weight: bold } /* Keyword */ +.highlight .o { font-weight: bold } /* Operator */ +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #999999 } /* Generic.Heading */ +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold; } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { font-weight: bold } /* Keyword.Constant */ +.highlight .kd { font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #009999 } /* Literal.Number */ +.highlight .s { color: #d14 } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #0086B3 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ +.highlight .ni { color: #800080 } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ +.highlight .nn { color: #555555 } /* Name.Namespace */ +.highlight .nt { color: #000080 } /* Name.Tag */ +.highlight .nv { color: #008080 } /* Name.Variable */ +.highlight .ow { font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sb { color: #d14 } /* Literal.String.Backtick */ +.highlight .sc { color: #d14 } /* Literal.String.Char */ +.highlight .sd { color: #d14 } /* Literal.String.Doc */ +.highlight .s2 { color: #d14 } /* Literal.String.Double */ +.highlight .se { color: #d14 } /* Literal.String.Escape */ +.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ +.highlight .si { color: #d14 } /* Literal.String.Interpol */ +.highlight .sx { color: #d14 } /* Literal.String.Other */ +.highlight .sr { color: #009926 } /* Literal.String.Regex */ +.highlight .s1 { color: #d14 } /* Literal.String.Single */ +.highlight .ss { color: #990073 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #008080 } /* Name.Variable.Class */ +.highlight .vg { color: #008080 } /* Name.Variable.Global */ +.highlight .vi { color: #008080 } /* Name.Variable.Instance */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ + +.type-csharp .highlight .k { color: #0000FF } +.type-csharp .highlight .kt { color: #0000FF } +.type-csharp .highlight .nf { color: #000000; font-weight: normal } +.type-csharp .highlight .nc { color: #2B91AF } +.type-csharp .highlight .nn { color: #000000 } +.type-csharp .highlight .s { color: #A31515 } +.type-csharp .highlight .sc { color: #A31515 } diff --git a/stylesheets/styles.css b/stylesheets/styles.css new file mode 100644 index 0000000..dacf2e1 --- /dev/null +++ b/stylesheets/styles.css @@ -0,0 +1,255 @@ +@import url(https://fonts.googleapis.com/css?family=Lato:300italic,700italic,300,700); + +body { + padding:50px; + font:14px/1.5 Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; + color:#777; + font-weight:300; +} + +h1, h2, h3, h4, h5, h6 { + color:#222; + margin:0 0 20px; +} + +p, ul, ol, table, pre, dl { + margin:0 0 20px; +} + +h1, h2, h3 { + line-height:1.1; +} + +h1 { + font-size:28px; +} + +h2 { + color:#393939; +} + +h3, h4, h5, h6 { + color:#494949; +} + +a { + color:#39c; + font-weight:400; + text-decoration:none; +} + +a small { + font-size:11px; + color:#777; + margin-top:-0.6em; + display:block; +} + +.wrapper { + width:860px; + margin:0 auto; +} + +blockquote { + border-left:1px solid #e5e5e5; + margin:0; + padding:0 0 0 20px; + font-style:italic; +} + +code, pre { + font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal; + color:#333; + font-size:12px; +} + +pre { + padding:8px 15px; + background: #f8f8f8; + border-radius:5px; + border:1px solid #e5e5e5; + overflow-x: auto; +} + +table { + width:100%; + border-collapse:collapse; +} + +th, td { + text-align:left; + padding:5px 10px; + border-bottom:1px solid #e5e5e5; +} + +dt { + color:#444; + font-weight:700; +} + +th { + color:#444; +} + +img { + max-width:100%; +} + +header { + width:270px; + float:left; + position:fixed; +} + +header ul { + list-style:none; + height:40px; + + padding:0; + + background: #eee; + background: -moz-linear-gradient(top, #f8f8f8 0%, #dddddd 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd)); + background: -webkit-linear-gradient(top, #f8f8f8 0%,#dddddd 100%); + background: -o-linear-gradient(top, #f8f8f8 0%,#dddddd 100%); + background: -ms-linear-gradient(top, #f8f8f8 0%,#dddddd 100%); + background: linear-gradient(top, #f8f8f8 0%,#dddddd 100%); + + border-radius:5px; + border:1px solid #d2d2d2; + box-shadow:inset #fff 0 1px 0, inset rgba(0,0,0,0.03) 0 -1px 0; + width:270px; +} + +header li { + width:89px; + float:left; + border-right:1px solid #d2d2d2; + height:40px; +} + +header ul a { + line-height:1; + font-size:11px; + color:#999; + display:block; + text-align:center; + padding-top:6px; + height:40px; +} + +strong { + color:#222; + font-weight:700; +} + +header ul li + li { + width:88px; + border-left:1px solid #fff; +} + +header ul li + li + li { + border-right:none; + width:89px; +} + +header ul a strong { + font-size:14px; + display:block; + color:#222; +} + +section { + width:500px; + float:right; + padding-bottom:50px; +} + +small { + font-size:11px; +} + +hr { + border:0; + background:#e5e5e5; + height:1px; + margin:0 0 20px; +} + +footer { + width:270px; + float:left; + position:fixed; + bottom:50px; +} + +@media print, screen and (max-width: 960px) { + + div.wrapper { + width:auto; + margin:0; + } + + header, section, footer { + float:none; + position:static; + width:auto; + } + + header { + padding-right:320px; + } + + section { + border:1px solid #e5e5e5; + border-width:1px 0; + padding:20px 0; + margin:0 0 20px; + } + + header a small { + display:inline; + } + + header ul { + position:absolute; + right:50px; + top:52px; + } +} + +@media print, screen and (max-width: 720px) { + body { + word-wrap:break-word; + } + + header { + padding:0; + } + + header ul, header p.view { + position:static; + } + + pre, code { + word-wrap:normal; + } +} + +@media print, screen and (max-width: 480px) { + body { + padding:15px; + } + + header ul { + display:none; + } +} + +@media print { + body { + padding:0.4in; + font-size:12pt; + color:#444; + } +} From a269c592f9fd6eb0dd7b2157e744b9c4efbf24a0 Mon Sep 17 00:00:00 2001 From: Alexandr Shurigin Date: Sun, 1 Jun 2014 02:46:30 +0700 Subject: [PATCH 02/15] Create gh-pages branch via GitHub From cc8237c3b9f90d35017786470d486e1c15d7884b Mon Sep 17 00:00:00 2001 From: Alexandr Shurigin Date: Sun, 1 Jun 2014 02:48:07 +0700 Subject: [PATCH 03/15] Create gh-pages branch via GitHub --- index.html | 20 ++++++++++++++------ params.json | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/index.html b/index.html index 45869ed..7408c1a 100644 --- a/index.html +++ b/index.html @@ -49,6 +49,14 @@

If you want to offer more macros by default, you can fork and make pull request.

+

+Installation

+ +

You can install library with pipy like a charm.

+ +
pip install django-macros-url
+
+

Usage

@@ -96,11 +104,11 @@

urlpatterns = patterns( 'yourapp.views', url('^:category_slug/$', 'category'), - url('^:category_slug/:product_slug/$', 'category_product'), - url('^:category_slug/:product_slug/:variant_id$', 'category_product_variant'), - url('^news/$', 'news'), - url('^news/:year/:month/:day$', 'news_date'), - url('^news/:slug$', 'news_entry'), + url(':category_slug/:product_slug/', 'category_product'), + url(':category_slug/:product_slug/:variant_id', 'category_product_variant'), + url('news/', 'news'), + url('news/:year/:month/:day$', 'news_date'), + url('news/:slug$', 'news_entry'), url('^order/:id$', 'order'), ) @@ -124,7 +132,7 @@

) -

I think you simple understand the difference of ways :)

+

I think you understand the difference of ways :)

Routing must be simple! ;-)

diff --git a/params.json b/params.json index dd264e4..caaf4f0 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Django-macros-url","tagline":"Django Macros Url v0.1.0 - Routing must be simple as possible","body":"# [Django Macros Url](https://github.com/phpdude/django-macros-url/) v0.1.0 - Routing must be simple as possible\r\n\r\nDjango Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.\r\n\r\nYou can combine your prefixes with macro names with underscope, for example you can use macro `:slug` and `:product_slug`. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.\r\n\r\n### Supported macros by default\r\n\r\n```\r\nslug - [\\w-]+\r\nyear - \\d{4}\r\nmonth - (0?([1-9])|10|11|12)\r\nday - ((0|1|2)?([1-9])|[1-3]0|31)\r\nid - \\d+\r\nuuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}\r\n```\r\n\r\nIf you want to offer more macros by default, you can fork and make pull request.\r\n\r\n### Usage\r\n\r\nDjango Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.\r\n\r\nAlso you can register new macro (or maybe you want to replace default macro with your like regex pattern) with `macrosurl.register(macro, pattern)` method.\r\n\r\nExample of registration.\r\n\r\n```python\r\nimport macrosurl\r\n\r\nmacrosurl.register('myhash', '[a-f0-9]{9}')\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:myhash/$', 'myhash_main'),\r\n url('^news/:news_myhash/$', 'myhash_news'),\r\n)\r\n```\r\n\r\nYou free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.\r\n\r\n### Urls normalization\r\n\r\nOnce Macros Url finished compile regex pattern, it makes normalization of it by rules:\r\n\r\n- Strip from left side all whitespace and ^\r\n- Strip from right side of pattern all whitespace and $\r\n- Add to left side ^\r\n- Add to right side $\r\n\r\nThis makes your urls always very strong to adding any unexpected params into path.\r\n\r\n### Examples\r\n\r\nMacro Url example urls.py file\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom project.apps.portal import views\r\nfrom project.apps.macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:category_slug/$', 'category'),\r\n url('^:category_slug/:product_slug/$', 'category_product'),\r\n url('^:category_slug/:product_slug/:variant_id$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/:year/:month/:day$', 'news_date'),\r\n url('^news/:slug$', 'news_entry'),\r\n url('^order/:id$', 'order'),\r\n)\r\n```\r\n\r\nDjango way urls example\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom project.apps.portal import views\r\nfrom project.apps.macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^(?P[\\w-]+>)/$', 'category'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you simple understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Django-macros-url","tagline":"Django Macros Url v0.1.0 - Routing must be simple as possible","body":"# [Django Macros Url](https://github.com/phpdude/django-macros-url/) v0.1.0 - Routing must be simple as possible\r\n\r\nDjango Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.\r\n\r\nYou can combine your prefixes with macro names with underscope, for example you can use macro `:slug` and `:product_slug`. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.\r\n\r\n### Supported macros by default\r\n\r\n```\r\nslug - [\\w-]+\r\nyear - \\d{4}\r\nmonth - (0?([1-9])|10|11|12)\r\nday - ((0|1|2)?([1-9])|[1-3]0|31)\r\nid - \\d+\r\nuuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}\r\n```\r\n\r\nIf you want to offer more macros by default, you can fork and make pull request.\r\n\r\n### Installation\r\n\r\nYou can install library with pipy like a charm.\r\n\r\n```\r\npip install django-macros-url\r\n```\r\n\r\n### Usage\r\n\r\nDjango Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.\r\n\r\nAlso you can register new macro (or maybe you want to replace default macro with your like regex pattern) with `macrosurl.register(macro, pattern)` method.\r\n\r\nExample of registration.\r\n\r\n```python\r\nimport macrosurl\r\n\r\nmacrosurl.register('myhash', '[a-f0-9]{9}')\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:myhash/$', 'myhash_main'),\r\n url('^news/:news_myhash/$', 'myhash_news'),\r\n)\r\n```\r\n\r\nYou free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.\r\n\r\n### Urls normalization\r\n\r\nOnce Macros Url finished compile regex pattern, it makes normalization of it by rules:\r\n\r\n- Strip from left side all whitespace and ^\r\n- Strip from right side of pattern all whitespace and $\r\n- Add to left side ^\r\n- Add to right side $\r\n\r\nThis makes your urls always very strong to adding any unexpected params into path.\r\n\r\n### Examples\r\n\r\nMacro Url example urls.py file\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom project.apps.portal import views\r\nfrom project.apps.macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:category_slug/$', 'category'),\r\n url(':category_slug/:product_slug/', 'category_product'),\r\n url(':category_slug/:product_slug/:variant_id', 'category_product_variant'),\r\n url('news/', 'news'),\r\n url('news/:year/:month/:day$', 'news_date'),\r\n url('news/:slug$', 'news_entry'),\r\n url('^order/:id$', 'order'),\r\n)\r\n```\r\n\r\nDjango way urls example\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom project.apps.portal import views\r\nfrom project.apps.macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^(?P[\\w-]+>)/$', 'category'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 8f9e0ef8d43a27c4f0cedb578a24d37bed73ece3 Mon Sep 17 00:00:00 2001 From: Alexandr Shurigin Date: Sun, 1 Jun 2014 02:49:14 +0700 Subject: [PATCH 04/15] Create gh-pages branch via GitHub --- images/body-bg.png | Bin 0 -> 8859 bytes images/highlight-bg.jpg | Bin 0 -> 34222 bytes images/hr.png | Bin 0 -> 1037 bytes images/octocat-icon.png | Bin 0 -> 1651 bytes images/tar-gz-icon.png | Bin 0 -> 1671 bytes images/zip-icon.png | Bin 0 -> 1661 bytes index.html | 65 ++++--- javascripts/main.js | 1 + stylesheets/print.css | 226 ++++++++++++++++++++++ stylesheets/stylesheet.css | 371 +++++++++++++++++++++++++++++++++++++ 10 files changed, 633 insertions(+), 30 deletions(-) create mode 100644 images/body-bg.png create mode 100644 images/highlight-bg.jpg create mode 100644 images/hr.png create mode 100644 images/octocat-icon.png create mode 100644 images/tar-gz-icon.png create mode 100644 images/zip-icon.png create mode 100644 javascripts/main.js create mode 100644 stylesheets/print.css create mode 100644 stylesheets/stylesheet.css diff --git a/images/body-bg.png b/images/body-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..d0618fe749178e814554f19fd158dea90020252d GIT binary patch literal 8859 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 DGStm7 literal 0 HcmV?d00001 diff --git a/images/hr.png b/images/hr.png new file mode 100644 index 0000000000000000000000000000000000000000..6c723a5602e14caa5c1527f3226d383dc83db6bd GIT binary patch literal 1037 zcmaJ=O=#3W6ppP(DfA#BSfMzksBP)ycawF8u4S8S+eOos-GGZH(`4F>Z89;Lx@kQW zdXeJMs}{wJ7kd-LA_{_7ym;tIym;!NSV8EeAUN6XZauh$A$c>r?|a{Td2fAYYNDt6 zd^f`|J;h1A#4sICXndmU6n#J5Kg-ikFDX<=8PAcL6(T0@;8_HUo;8n3$a0qNZle)~ z>6~`W3aJ=3pp8AwN^-c^3n-dlMn>bnvKJ5mvuNJ+bL`KpcPwz79D7qS1S8N;)ty`k zQF&#`v{x4Ftiz6810yk{1Rf$5h`mKWf^m+m^FkUY$2<$_DP$qX9*L?LGeE;30tzRm zY(W%(s&ZmlQB`pmNP;Nw0$plKOhZM5QU)|0mR1X$Iat!i8@1>z$5sgmAkWuoHLfOe zIGpFjY&M&4NK%Ssq@rb?SaHga`kM?oitNx0h>LxYFj}*CiR4(S^yms+(4zIDhE3Ek zKDGj0o(%|yfaf2!xTvLjML$9n%s9GS}j;!7yPOQB7F++2TBDu7yuEP_K584fa+@981e_uIs?OtVl{m%4Q@jEs6zkOwY@OLYf|Fijp4Jnphp%OCIt`6YCsf^KG$7 z-*^G7tfSDqhn(>cd!X(QblYpmwB>7Ho%UL;w#D*P44-ttUtQ5WqOF#MtsbYF)|4Qh zjz&mlVDsTNN9V^Z>UlH%x?^tlFhbYb?*||IhKCM5Kf8Fk0~~&sex2TTgpC(J4*mO= zclX|($v%4f<@?sbt)0D3^7`}qYTq~YRe7TK%AHKGyE^n#+j#TxU#ywo|pap6}o NpvA(JzBzV#?GKcZMQ8v3 literal 0 HcmV?d00001 diff --git a/images/octocat-icon.png b/images/octocat-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ba137d268da4921d9f4b5905bed9e724c45770 GIT binary patch literal 1651 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 S7rUr~Dg;kgKbLh*2~7YV%7O|2 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 7408c1a..9dfc1b1 100644 --- a/index.html +++ b/index.html @@ -1,34 +1,37 @@ - + - + - Django-macros-url by phpdude - - - - + + + + + Django-macros-url by phpdude + -
-
-

Django-macros-url

-

Django Macros Url v0.1.0 - Routing must be simple as possible

- -

View the Project on GitHub phpdude/django-macros-url

- - - -
-
-

+
+
+ +
+

Django-macros-url

+

Django Macros Url v0.1.0 - Routing must be simple as possible

+
+ +
+ Download .zip + Download .tar.gz + View on GitHub +
+ +
+ +
+

Django Macros Url v0.1.0 - Routing must be simple as possible

@@ -143,13 +146,15 @@

Contributor

Alexandr Shurigin (aka phpdude)

-
-
-

This project is maintained by phpdude

-

Hosted on GitHub Pages — Theme by orderedlist

-
+

+ + + + +
- - \ No newline at end of file diff --git a/javascripts/main.js b/javascripts/main.js new file mode 100644 index 0000000..d8135d3 --- /dev/null +++ b/javascripts/main.js @@ -0,0 +1 @@ +console.log('This would be the main JS file.'); diff --git a/stylesheets/print.css b/stylesheets/print.css new file mode 100644 index 0000000..541695b --- /dev/null +++ b/stylesheets/print.css @@ -0,0 +1,226 @@ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +body { + font-size: 13px; + line-height: 1.5; + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + color: #000; +} + +a { + color: #d5000d; + font-weight: bold; +} + +header { + padding-top: 35px; + padding-bottom: 10px; +} + +header h1 { + font-weight: bold; + letter-spacing: -1px; + font-size: 48px; + color: #303030; + line-height: 1.2; +} + +header h2 { + letter-spacing: -1px; + font-size: 24px; + color: #aaa; + font-weight: normal; + line-height: 1.3; +} +#downloads { + display: none; +} +#main_content { + padding-top: 20px; +} + +code, pre { + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; + color: #222; + margin-bottom: 30px; + font-size: 12px; +} + +code { + padding: 0 3px; +} + +pre { + border: solid 1px #ddd; + padding: 20px; + overflow: auto; +} +pre code { + padding: 0; +} + +ul, ol, dl { + margin-bottom: 20px; +} + + +/* COMMON STYLES */ + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + border: 1px solid #ebebeb; + text-align: center; + font-weight: 300; +} + +form { + background: #f2f2f2; + padding: 20px; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +h1 { + font-size: 2.8em; +} + +h2 { + font-size: 22px; + font-weight: bold; + color: #303030; + margin-bottom: 8px; +} + +h3 { + color: #d5000d; + font-size: 18px; + font-weight: bold; + margin-bottom: 8px; +} + +h4 { + font-size: 16px; + color: #303030; + font-weight: bold; +} + +h5 { + font-size: 1em; + color: #303030; +} + +h6 { + font-size: .8em; + color: #303030; +} + +p { + font-weight: 300; + margin-bottom: 20px; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + font-size: 1.6em; + border-left: 10px solid #e9e9e9; + margin-bottom: 20px; + padding: 0 0 0 30px; +} + +ul li { + list-style: disc inside; + padding-left: 20px; +} + +ol li { + list-style: decimal inside; + padding-left: 3px; +} + +dl dd { + font-style: italic; + font-weight: 100; +} + +footer { + margin-top: 40px; + padding-top: 20px; + padding-bottom: 30px; + font-size: 13px; + color: #aaa; +} + +footer a { + color: #666; +} + +/* MISC */ +.clearfix:after { + clear: both; + content: '.'; + display: block; + visibility: hidden; + height: 0; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} \ No newline at end of file diff --git a/stylesheets/stylesheet.css b/stylesheets/stylesheet.css new file mode 100644 index 0000000..020ad6d --- /dev/null +++ b/stylesheets/stylesheet.css @@ -0,0 +1,371 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* LAYOUT STYLES */ +body { + font-size: 1em; + line-height: 1.5; + background: #e7e7e7 url(../images/body-bg.png) 0 0 repeat; + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); + color: #6d6d6d; +} + +a { + color: #d5000d; +} +a:hover { + color: #c5000c; +} + +header { + padding-top: 35px; + padding-bottom: 25px; +} + +header h1 { + font-family: 'Chivo', 'Helvetica Neue', Helvetica, Arial, serif; font-weight: 900; + letter-spacing: -1px; + font-size: 48px; + color: #303030; + line-height: 1.2; +} + +header h2 { + letter-spacing: -1px; + font-size: 24px; + color: #aaa; + font-weight: normal; + line-height: 1.3; +} + +#container { + background: transparent url(../images/highlight-bg.jpg) 50% 0 no-repeat; + min-height: 595px; +} + +.inner { + width: 620px; + margin: 0 auto; +} + +#container .inner img { + max-width: 100%; +} + +#downloads { + margin-bottom: 40px; +} + +a.button { + -moz-border-radius: 30px; + -webkit-border-radius: 30px; + border-radius: 30px; + border-top: solid 1px #cbcbcb; + border-left: solid 1px #b7b7b7; + border-right: solid 1px #b7b7b7; + border-bottom: solid 1px #b3b3b3; + color: #303030; + line-height: 25px; + font-weight: bold; + font-size: 15px; + padding: 12px 8px 12px 8px; + display: block; + float: left; + width: 179px; + margin-right: 14px; + background: #fdfdfd; /* Old browsers */ + background: -moz-linear-gradient(top, #fdfdfd 0%, #f2f2f2 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fdfdfd), color-stop(100%,#f2f2f2)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* IE10+ */ + background: linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdfdfd', endColorstr='#f2f2f2',GradientType=0 ); /* IE6-9 */ + -webkit-box-shadow: 10px 10px 5px #888; + -moz-box-shadow: 10px 10px 5px #888; + box-shadow: 0px 1px 5px #e8e8e8; +} +a.button:hover { + border-top: solid 1px #b7b7b7; + border-left: solid 1px #b3b3b3; + border-right: solid 1px #b3b3b3; + border-bottom: solid 1px #b3b3b3; + background: #fafafa; /* Old browsers */ + background: -moz-linear-gradient(top, #fdfdfd 0%, #f6f6f6 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fdfdfd), color-stop(100%,#f6f6f6)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* IE10+ */ + background: linear-gradient(top, #fdfdfd 0%,#f6f6f6, 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdfdfd', endColorstr='#f6f6f6',GradientType=0 ); /* IE6-9 */ +} + +a.button span { + padding-left: 50px; + display: block; + height: 23px; +} + +#download-zip span { + background: transparent url(../images/zip-icon.png) 12px 50% no-repeat; +} +#download-tar-gz span { + background: transparent url(../images/tar-gz-icon.png) 12px 50% no-repeat; +} +#view-on-github span { + background: transparent url(../images/octocat-icon.png) 12px 50% no-repeat; +} +#view-on-github { + margin-right: 0; +} + +code, pre { + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; + color: #222; + margin-bottom: 30px; + font-size: 14px; +} + +code { + background-color: #f2f2f2; + border: solid 1px #ddd; + padding: 0 3px; +} + +pre { + padding: 20px; + background: #303030; + color: #f2f2f2; + text-shadow: none; + overflow: auto; +} +pre code { + color: #f2f2f2; + background-color: #303030; + border: none; + padding: 0; +} + +ul, ol, dl { + margin-bottom: 20px; +} + + +/* COMMON STYLES */ + +hr { + height: 1px; + line-height: 1px; + margin-top: 1em; + padding-bottom: 1em; + border: none; + background: transparent url('../images/hr.png') 50% 0 no-repeat; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + border: 1px solid #ebebeb; + text-align: center; + font-weight: 300; +} + +form { + background: #f2f2f2; + padding: 20px; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +h1 { + font-size: 32px; +} + +h2 { + font-size: 22px; + font-weight: bold; + color: #303030; + margin-bottom: 8px; +} + +h3 { + color: #d5000d; + font-size: 18px; + font-weight: bold; + margin-bottom: 8px; +} + +h4 { + font-size: 16px; + color: #303030; + font-weight: bold; +} + +h5 { + font-size: 1em; + color: #303030; +} + +h6 { + font-size: .8em; + color: #303030; +} + +p { + font-weight: 300; + margin-bottom: 20px; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + font-size: 1.6em; + border-left: 10px solid #e9e9e9; + margin-bottom: 20px; + padding: 0 0 0 30px; +} + +ul li { + list-style: disc inside; + padding-left: 20px; +} + +ol li { + list-style: decimal inside; + padding-left: 3px; +} + +dl dt { + color: #303030; +} + +footer { + background: transparent url('../images/hr.png') 0 0 no-repeat; + margin-top: 40px; + padding-top: 20px; + padding-bottom: 30px; + font-size: 13px; + color: #aaa; +} + +footer a { + color: #666; +} +footer a:hover { + color: #444; +} + +/* MISC */ +.clearfix:after { + clear: both; + content: '.'; + display: block; + visibility: hidden; + height: 0; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} + +/* #Media Queries +================================================== */ + +/* Smaller than standard 960 (devices and browsers) */ +@media only screen and (max-width: 959px) {} + +/* Tablet Portrait size to standard 960 (devices and browsers) */ +@media only screen and (min-width: 768px) and (max-width: 959px) {} + +/* All Mobile Sizes (devices and browser) */ +@media only screen and (max-width: 767px) { + header { + padding-top: 10px; + padding-bottom: 10px; + } + #downloads { + margin-bottom: 25px; + } + #download-zip, #download-tar-gz { + display: none; + } + .inner { + width: 94%; + margin: 0 auto; + } +} + +/* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ +@media only screen and (min-width: 480px) and (max-width: 767px) {} + +/* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ +@media only screen and (max-width: 479px) {} From 9a06cf73aa3b672463837fe9fe0ed752780b41ed Mon Sep 17 00:00:00 2001 From: Alexandr Shurigin Date: Sun, 1 Jun 2014 14:36:33 +0700 Subject: [PATCH 05/15] Create gh-pages branch via GitHub --- images/arrow-down.png | Bin 0 -> 423 bytes images/octocat-small.png | Bin 0 -> 570 bytes index.html | 62 +++--- javascripts/scale.fix.js | 37 ++-- params.json | 2 +- stylesheets/styles.css | 422 +++++++++++++++++++++++++++------------ 6 files changed, 344 insertions(+), 179 deletions(-) create mode 100644 images/arrow-down.png create mode 100644 images/octocat-small.png diff --git a/images/arrow-down.png b/images/arrow-down.png new file mode 100644 index 0000000000000000000000000000000000000000..585b0bddba878b95acc961fc5c0c55c3ea2e75db GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eW!3HFke0{SLNU;<^miKrK zR4D>d>0FeWSdy8arx22vo62CJZ=!E#Q zuUEhHFKq}eVcf!fOXk2252o^`A0Pfx?pl-`?tS^o=dZa}n)o-rOj#-_e`l7jy7u+r zhj0Hd|L1+)z+f_A|GJISy4qrPpME*#k;S{#M4)d)HS2xXctpM~nN-ejV$=G%1)}zh z6_&;B=NTB*Rz&o)EN^QNw)=Nauj9or^J@~D*Th}TXM8@bL&NZxPHmc!SKl9%dr^gl zqh@m|zG6sNdzVY`kauM4^m$&|dG9N?-~61nSXA6TxH5R=Pxc4Kow9qMI-LOq1%s!n KpUXO@geCw=gQOS$ literal 0 HcmV?d00001 diff --git a/images/octocat-small.png b/images/octocat-small.png new file mode 100644 index 0000000000000000000000000000000000000000..66c25398dd9090905e37aa2d48bb2d77a0ac6255 GIT binary patch literal 570 zcmV-A0>%A_P)V>IRB3Hx05~r+FEKJgdgKHE00ELo zL_t(Ijg^xed`v89bwq|>- zBcAI>wNjQ~{V)H%tlWtR3ZPgl_WI*s7zQut?CiWv)3hNC$Q&OX?xs?y7lFshPE4M* zWwYbCv9ZzqmMOqA&6xTyFpvlX0a(^MlwlaPupofy>3N$E3)SoOTg`Kw1aKY(ER{+J z8i40IIbbma`(6R7dL#-k0u){W3czrO-f82x&g$~grz@IyWqNvQc6)p4Nm@33tb3m8 zqya>Phsa&m{#?w>&fMT<@_Edvm9hja12DK_rqO6@Dy6#qH=`bjY5@o|v#Lj;wod}b>JrdoE#olbS0=7RdB$LTJ@R`4#*!KNI_tZAjO+JC<^Z)<=07*qo IM6N<$f|}m$2LJ#7 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 9dfc1b1..4619d22 100644 --- a/index.html +++ b/index.html @@ -1,37 +1,36 @@ - + - + - - - - + Django-macros-url by phpdude + + + + + - Django-macros-url by phpdude - -
-
+
+
+

Django-macros-url

+

Django Macros Url v0.1.0 - Routing must be simple as possible

-
-

Django-macros-url

-

Django Macros Url v0.1.0 - Routing must be simple as possible

-
+ -
- Download .zip - Download .tar.gz - View on GitHub -
+

This project is maintained by phpdude

-
-
-

+

+
+

Django Macros Url v0.1.0 - Routing must be simple as possible

@@ -55,7 +54,7 @@

Installation

-

You can install library with pipy like a charm.

+

You can install library with pypi like a charm.

pip install django-macros-url
 
@@ -146,15 +145,12 @@

Contributor

Alexandr Shurigin (aka phpdude)

-
- - - - -
+ +
+ + - \ No newline at end of file + diff --git a/javascripts/scale.fix.js b/javascripts/scale.fix.js index 87a40ca..08716c0 100644 --- a/javascripts/scale.fix.js +++ b/javascripts/scale.fix.js @@ -1,17 +1,20 @@ -var metas = document.getElementsByTagName('meta'); -var i; -if (navigator.userAgent.match(/iPhone/i)) { - for (i=0; i[\\w-]+>)/$', 'category'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Django-macros-url","tagline":"Django Macros Url v0.1.0 - Routing must be simple as possible","body":"# [Django Macros Url](https://github.com/phpdude/django-macros-url/) v0.1.0 - Routing must be simple as possible\r\n\r\nDjango Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.\r\n\r\nYou can combine your prefixes with macro names with underscope, for example you can use macro `:slug` and `:product_slug`. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.\r\n\r\n### Supported macros by default\r\n\r\n```\r\nslug - [\\w-]+\r\nyear - \\d{4}\r\nmonth - (0?([1-9])|10|11|12)\r\nday - ((0|1|2)?([1-9])|[1-3]0|31)\r\nid - \\d+\r\nuuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}\r\n```\r\n\r\nIf you want to offer more macros by default, you can fork and make pull request.\r\n\r\n### Installation\r\n\r\nYou can install library with pypi like a charm.\r\n\r\n```\r\npip install django-macros-url\r\n```\r\n\r\n### Usage\r\n\r\nDjango Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.\r\n\r\nAlso you can register new macro (or maybe you want to replace default macro with your like regex pattern) with `macrosurl.register(macro, pattern)` method.\r\n\r\nExample of registration.\r\n\r\n```python\r\nimport macrosurl\r\n\r\nmacrosurl.register('myhash', '[a-f0-9]{9}')\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:myhash/$', 'myhash_main'),\r\n url('^news/:news_myhash/$', 'myhash_news'),\r\n)\r\n```\r\n\r\nYou free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.\r\n\r\n### Urls normalization\r\n\r\nOnce Macros Url finished compile regex pattern, it makes normalization of it by rules:\r\n\r\n- Strip from left side all whitespace and ^\r\n- Strip from right side of pattern all whitespace and $\r\n- Add to left side ^\r\n- Add to right side $\r\n\r\nThis makes your urls always very strong to adding any unexpected params into path.\r\n\r\n### Examples\r\n\r\nMacro Url example urls.py file\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom project.apps.portal import views\r\nfrom project.apps.macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:category_slug/$', 'category'),\r\n url(':category_slug/:product_slug/', 'category_product'),\r\n url(':category_slug/:product_slug/:variant_id', 'category_product_variant'),\r\n url('news/', 'news'),\r\n url('news/:year/:month/:day$', 'news_date'),\r\n url('news/:slug$', 'news_entry'),\r\n url('^order/:id$', 'order'),\r\n)\r\n```\r\n\r\nDjango way urls example\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom project.apps.portal import views\r\nfrom project.apps.macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^(?P[\\w-]+>)/$', 'category'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file diff --git a/stylesheets/styles.css b/stylesheets/styles.css index dacf2e1..c2c94b4 100644 --- a/stylesheets/styles.css +++ b/stylesheets/styles.css @@ -1,220 +1,374 @@ -@import url(https://fonts.googleapis.com/css?family=Lato:300italic,700italic,300,700); +@import url(https://fonts.googleapis.com/css?family=Arvo:400,700,400italic); + +/* MeyerWeb Reset */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; +} + + +/* Base text styles */ body { - padding:50px; - font:14px/1.5 Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; - color:#777; - font-weight:300; + padding:10px 50px 0 0; + font-family:"Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + color: #232323; + background-color: #FBFAF7; + margin: 0; + line-height: 1.8em; + -webkit-font-smoothing: antialiased; + } h1, h2, h3, h4, h5, h6 { - color:#222; - margin:0 0 20px; + color:#232323; + margin:36px 0 10px; } -p, ul, ol, table, pre, dl { - margin:0 0 20px; +p, ul, ol, table, dl { + margin:0 0 22px; } h1, h2, h3 { - line-height:1.1; + font-family: Arvo, Monaco, serif; + line-height:1.3; + font-weight: normal; +} + +h1,h2, h3 { + display: block; + border-bottom: 1px solid #ccc; + padding-bottom: 5px; } h1 { - font-size:28px; + font-size: 30px; } h2 { - color:#393939; + font-size: 24px; +} + +h3 { + font-size: 18px; } -h3, h4, h5, h6 { - color:#494949; +h4, h5, h6 { + font-family: Arvo, Monaco, serif; + font-weight: 700; } a { - color:#39c; - font-weight:400; + color:#C30000; + font-weight:200; text-decoration:none; } +a:hover { + text-decoration: underline; +} + a small { - font-size:11px; - color:#777; - margin-top:-0.6em; - display:block; + font-size: 12px; } -.wrapper { - width:860px; - margin:0 auto; +em { + font-style: italic; +} + +strong { + font-weight:700; +} + +ul { + list-style: inside; + padding-left: 25px; +} + +ol { + list-style: decimal inside; + padding-left: 20px; } blockquote { - border-left:1px solid #e5e5e5; - margin:0; - padding:0 0 0 20px; - font-style:italic; + margin: 0; + padding: 0 0 0 20px; + font-style: italic; +} + +dl, dt, dd, dl p { + font-color: #444; +} + +dl dt { + font-weight: bold; +} + +dl dd { + padding-left: 20px; + font-style: italic; } +dl p { + padding-left: 20px; + font-style: italic; +} + +hr { + border:0; + background:#ccc; + height:1px; + margin:0 0 24px; +} + +/* Images */ + +img { + position: relative; + margin: 0 auto; + max-width: 650px; + padding: 5px; + margin: 10px 0 32px 0; + border: 1px solid #ccc; +} + +p img { + display: inline; + margin: 0; + padding: 0; + vertical-align: middle; + text-align: center; + border: none; +} + +/* Code blocks */ + code, pre { - font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal; - color:#333; - font-size:12px; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + color:#000; + font-size:14px; } pre { - padding:8px 15px; - background: #f8f8f8; - border-radius:5px; - border:1px solid #e5e5e5; - overflow-x: auto; + padding: 4px 12px; + background: #FDFEFB; + border-radius:4px; + border:1px solid #D7D8C8; + overflow: auto; + overflow-y: hidden; + margin-bottom: 32px; } + +/* Tables */ + table { width:100%; - border-collapse:collapse; } -th, td { - text-align:left; - padding:5px 10px; - border-bottom:1px solid #e5e5e5; -} - -dt { - color:#444; - font-weight:700; -} +table { + border: 1px solid #ccc; + margin-bottom: 32px; + text-align: left; + } th { - color:#444; -} + font-family: 'Arvo', Helvetica, Arial, sans-serif; + font-size: 18px; + font-weight: normal; + padding: 10px; + background: #232323; + color: #FDFEFB; + } -img { - max-width:100%; +td { + padding: 10px; + background: #ccc; + } + + +/* Wrapper */ +.wrapper { + width:960px; } + +/* Header */ + header { - width:270px; + background-color: #171717; + color: #FDFDFB; + width:170px; float:left; position:fixed; + border: 1px solid #000; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + padding: 34px 25px 22px 50px; + margin: 30px 25px 0 0; + -webkit-font-smoothing: antialiased; +} + +p.header { + font-size: 16px; +} + +h1.header { + font-family: Arvo, sans-serif; + font-size: 30px; + font-weight: 300; + line-height: 1.3em; + border-bottom: none; + margin-top: 0; +} + + +h1.header, a.header, a.name, header a{ + color: #fff; +} + +a.header { + text-decoration: underline; +} + +a.name { + white-space: nowrap; } header ul { list-style:none; - height:40px; - padding:0; - - background: #eee; - background: -moz-linear-gradient(top, #f8f8f8 0%, #dddddd 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd)); - background: -webkit-linear-gradient(top, #f8f8f8 0%,#dddddd 100%); - background: -o-linear-gradient(top, #f8f8f8 0%,#dddddd 100%); - background: -ms-linear-gradient(top, #f8f8f8 0%,#dddddd 100%); - background: linear-gradient(top, #f8f8f8 0%,#dddddd 100%); - - border-radius:5px; - border:1px solid #d2d2d2; - box-shadow:inset #fff 0 1px 0, inset rgba(0,0,0,0.03) 0 -1px 0; - width:270px; } header li { - width:89px; - float:left; - border-right:1px solid #d2d2d2; - height:40px; -} + list-style-type: none; + width:132px; + height:15px; + margin-bottom: 12px; + line-height: 1em; + padding: 6px 6px 6px 7px; + + background: #AF0011; + background: -moz-linear-gradient(top, #AF0011 0%, #820011 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd)); + background: -webkit-linear-gradient(top, #AF0011 0%,#820011 100%); + background: -o-linear-gradient(top, #AF0011 0%,#820011 100%); + background: -ms-linear-gradient(top, #AF0011 0%,#820011 100%); + background: linear-gradient(top, #AF0011 0%,#820011 100%); + + border-radius:4px; + border:1px solid #0D0D0D; + + -webkit-box-shadow: inset 0px 1px 1px 0 rgba(233,2,38, 1); + box-shadow: inset 0px 1px 1px 0 rgba(233,2,38, 1); -header ul a { - line-height:1; - font-size:11px; - color:#999; - display:block; - text-align:center; - padding-top:6px; - height:40px; } -strong { - color:#222; - font-weight:700; +header li:hover { + background: #C3001D; + background: -moz-linear-gradient(top, #C3001D 0%, #950119 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd)); + background: -webkit-linear-gradient(top, #C3001D 0%,#950119 100%); + background: -o-linear-gradient(top, #C3001D 0%,#950119 100%); + background: -ms-linear-gradient(top, #C3001D 0%,#950119 100%); + background: linear-gradient(top, #C3001D 0%,#950119 100%); } -header ul li + li { - width:88px; - border-left:1px solid #fff; +a.buttons { + -webkit-font-smoothing: antialiased; + background: url(../images/arrow-down.png) no-repeat; + font-weight: normal; + text-shadow: rgba(0, 0, 0, 0.4) 0 -1px 0; + padding: 2px 2px 2px 22px; + height: 30px; } -header ul li + li + li { - border-right:none; - width:89px; +a.github { + background: url(../images/octocat-small.png) no-repeat 1px; } -header ul a strong { - font-size:14px; - display:block; - color:#222; +a.buttons:hover { + color: #fff; + text-decoration: none; } + +/* Section - for main page content */ + section { - width:500px; + width:650px; float:right; padding-bottom:50px; } -small { - font-size:11px; -} -hr { - border:0; - background:#e5e5e5; - height:1px; - margin:0 0 20px; -} +/* Footer */ footer { - width:270px; + width:170px; float:left; position:fixed; - bottom:50px; + bottom:10px; + padding-left: 50px; } @media print, screen and (max-width: 960px) { - + div.wrapper { width:auto; margin:0; } - + header, section, footer { float:none; position:static; width:auto; } - + + footer { + border-top: 1px solid #ccc; + margin:0 84px 0 50px; + padding:0; + } + header { padding-right:320px; } - + section { - border:1px solid #e5e5e5; - border-width:1px 0; - padding:20px 0; + padding:20px 84px 20px 50px; margin:0 0 20px; } - + header a small { display:inline; } - + header ul { position:absolute; - right:50px; - top:52px; + right:130px; + top:84px; } } @@ -222,28 +376,40 @@ footer { body { word-wrap:break-word; } - + header { - padding:0; + padding:10px 20px 0; + margin-right: 0; } - + + section { + padding:10px 0 10px 20px; + margin:0 0 30px; + } + + footer { + margin: 0 0 0 30px; + } + header ul, header p.view { position:static; } - - pre, code { - word-wrap:normal; - } } @media print, screen and (max-width: 480px) { - body { - padding:15px; - } - - header ul { + + header ul li.download { display:none; } + + footer { + margin: 0 0 0 20px; + } + + footer a{ + display:block; + } + } @media print { @@ -252,4 +418,4 @@ footer { font-size:12pt; color:#444; } -} +} \ No newline at end of file From ea0e3d7bdfe3f56873e007acff7f3020a9a5af7a Mon Sep 17 00:00:00 2001 From: Alexandr Shurigin Date: Sun, 1 Jun 2014 16:18:49 +0700 Subject: [PATCH 06/15] Create gh-pages branch via GitHub --- index.html | 10 ++++------ params.json | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/index.html b/index.html index 4619d22..47c250d 100644 --- a/index.html +++ b/index.html @@ -74,8 +74,8 @@

urlpatterns = patterns( 'yourapp.views', - url('^:myhash/$', 'myhash_main'), - url('^news/:news_myhash/$', 'myhash_news'), + macrosurl.url('^:myhash/$', 'myhash_main'), + macrosurl.url('^news/:news_myhash/$', 'myhash_news'), )

@@ -99,8 +99,7 @@

Macro Url example urls.py file

from django.conf.urls import patterns
-from project.apps.portal import views
-from project.apps.macrosurl import url
+from macrosurl import url
 
 
 urlpatterns = patterns(
@@ -118,8 +117,7 @@ 

Django way urls example

from django.conf.urls import patterns
-from project.apps.portal import views
-from project.apps.macrosurl import url
+from macrosurl import url
 
 
 urlpatterns = patterns(
diff --git a/params.json b/params.json
index 7e58151..56e9db4 100644
--- a/params.json
+++ b/params.json
@@ -1 +1 @@
-{"name":"Django-macros-url","tagline":"Django Macros Url v0.1.0 - Routing must be simple as possible","body":"# [Django Macros Url](https://github.com/phpdude/django-macros-url/) v0.1.0 - Routing must be simple as possible\r\n\r\nDjango Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.\r\n\r\nYou can combine your prefixes with macro names with underscope, for example you can use macro `:slug` and `:product_slug`. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.\r\n\r\n### Supported macros by default\r\n\r\n```\r\nslug - [\\w-]+\r\nyear - \\d{4}\r\nmonth - (0?([1-9])|10|11|12)\r\nday - ((0|1|2)?([1-9])|[1-3]0|31)\r\nid - \\d+\r\nuuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}\r\n```\r\n\r\nIf you want to offer more macros by default, you can fork and make pull request.\r\n\r\n### Installation\r\n\r\nYou can install library with pypi like a charm.\r\n\r\n```\r\npip install django-macros-url\r\n```\r\n\r\n### Usage\r\n\r\nDjango Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.\r\n\r\nAlso you can register new macro (or maybe you want to replace default macro with your like regex pattern) with `macrosurl.register(macro, pattern)` method.\r\n\r\nExample of registration.\r\n\r\n```python\r\nimport macrosurl\r\n\r\nmacrosurl.register('myhash', '[a-f0-9]{9}')\r\n\r\nurlpatterns = patterns(\r\n    'yourapp.views',\r\n    url('^:myhash/$', 'myhash_main'),\r\n    url('^news/:news_myhash/$', 'myhash_news'),\r\n)\r\n```\r\n\r\nYou free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.\r\n\r\n### Urls normalization\r\n\r\nOnce Macros Url finished compile regex pattern, it makes normalization of it by rules:\r\n\r\n- Strip from left side all whitespace and ^\r\n- Strip from right side of pattern all whitespace and $\r\n- Add to left side ^\r\n- Add to right side $\r\n\r\nThis makes your urls always very strong to adding any unexpected params into path.\r\n\r\n### Examples\r\n\r\nMacro Url example urls.py file\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom project.apps.portal import views\r\nfrom project.apps.macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n    'yourapp.views',\r\n    url('^:category_slug/$', 'category'),\r\n    url(':category_slug/:product_slug/', 'category_product'),\r\n    url(':category_slug/:product_slug/:variant_id', 'category_product_variant'),\r\n    url('news/', 'news'),\r\n    url('news/:year/:month/:day$', 'news_date'),\r\n    url('news/:slug$', 'news_entry'),\r\n    url('^order/:id$', 'order'),\r\n)\r\n```\r\n\r\nDjango way urls example\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom project.apps.portal import views\r\nfrom project.apps.macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n    'yourapp.views',\r\n    url('^(?P[\\w-]+>)/$', 'category'),\r\n    url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n    url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n    url('^news/$', 'news'),\r\n    url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n    url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n    url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."}
\ No newline at end of file
+{"name":"Django-macros-url","tagline":"Django Macros Url v0.1.0 - Routing must be simple as possible","body":"# [Django Macros Url](https://github.com/phpdude/django-macros-url/) v0.1.0 - Routing must be simple as possible\r\n\r\nDjango Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.\r\n\r\nYou can combine your prefixes with macro names with underscope, for example you can use macro `:slug` and `:product_slug`. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.\r\n\r\n### Supported macros by default\r\n\r\n```\r\nslug - [\\w-]+\r\nyear - \\d{4}\r\nmonth - (0?([1-9])|10|11|12)\r\nday - ((0|1|2)?([1-9])|[1-3]0|31)\r\nid - \\d+\r\nuuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}\r\n```\r\n\r\nIf you want to offer more macros by default, you can fork and make pull request.\r\n\r\n### Installation\r\n\r\nYou can install library with pypi like a charm.\r\n\r\n```\r\npip install django-macros-url\r\n```\r\n\r\n### Usage\r\n\r\nDjango Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.\r\n\r\nAlso you can register new macro (or maybe you want to replace default macro with your like regex pattern) with `macrosurl.register(macro, pattern)` method.\r\n\r\nExample of registration.\r\n\r\n```python\r\nimport macrosurl\r\n\r\nmacrosurl.register('myhash', '[a-f0-9]{9}')\r\n\r\nurlpatterns = patterns(\r\n    'yourapp.views',\r\n    macrosurl.url('^:myhash/$', 'myhash_main'),\r\n    macrosurl.url('^news/:news_myhash/$', 'myhash_news'),\r\n)\r\n```\r\n\r\nYou free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.\r\n\r\n### Urls normalization\r\n\r\nOnce Macros Url finished compile regex pattern, it makes normalization of it by rules:\r\n\r\n- Strip from left side all whitespace and ^\r\n- Strip from right side of pattern all whitespace and $\r\n- Add to left side ^\r\n- Add to right side $\r\n\r\nThis makes your urls always very strong to adding any unexpected params into path.\r\n\r\n### Examples\r\n\r\nMacro Url example urls.py file\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n    'yourapp.views',\r\n    url('^:category_slug/$', 'category'),\r\n    url(':category_slug/:product_slug/', 'category_product'),\r\n    url(':category_slug/:product_slug/:variant_id', 'category_product_variant'),\r\n    url('news/', 'news'),\r\n    url('news/:year/:month/:day$', 'news_date'),\r\n    url('news/:slug$', 'news_entry'),\r\n    url('^order/:id$', 'order'),\r\n)\r\n```\r\n\r\nDjango way urls example\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n    'yourapp.views',\r\n    url('^(?P[\\w-]+>)/$', 'category'),\r\n    url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n    url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n    url('^news/$', 'news'),\r\n    url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n    url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n    url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."}
\ No newline at end of file

From 1a0e6b133c3b0f77c4bef1b5d4dfad6f01afa340 Mon Sep 17 00:00:00 2001
From: Alexandr Shurigin 
Date: Tue, 3 Jun 2014 20:43:50 +0700
Subject: [PATCH 07/15] Create gh-pages branch via GitHub

---
 index.html  | 4 ++--
 params.json | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/index.html b/index.html
index 47c250d..fe98c55 100644
--- a/index.html
+++ b/index.html
@@ -31,8 +31,8 @@ 

Django-macros-url

- -Django Macros Url v0.1.0 - Routing must be simple as possible

+ +Django Macros Url v0.1.1 - Routing must be simple as possible

Django Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.

diff --git a/params.json b/params.json index 56e9db4..cf34f40 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Django-macros-url","tagline":"Django Macros Url v0.1.0 - Routing must be simple as possible","body":"# [Django Macros Url](https://github.com/phpdude/django-macros-url/) v0.1.0 - Routing must be simple as possible\r\n\r\nDjango Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.\r\n\r\nYou can combine your prefixes with macro names with underscope, for example you can use macro `:slug` and `:product_slug`. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.\r\n\r\n### Supported macros by default\r\n\r\n```\r\nslug - [\\w-]+\r\nyear - \\d{4}\r\nmonth - (0?([1-9])|10|11|12)\r\nday - ((0|1|2)?([1-9])|[1-3]0|31)\r\nid - \\d+\r\nuuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}\r\n```\r\n\r\nIf you want to offer more macros by default, you can fork and make pull request.\r\n\r\n### Installation\r\n\r\nYou can install library with pypi like a charm.\r\n\r\n```\r\npip install django-macros-url\r\n```\r\n\r\n### Usage\r\n\r\nDjango Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.\r\n\r\nAlso you can register new macro (or maybe you want to replace default macro with your like regex pattern) with `macrosurl.register(macro, pattern)` method.\r\n\r\nExample of registration.\r\n\r\n```python\r\nimport macrosurl\r\n\r\nmacrosurl.register('myhash', '[a-f0-9]{9}')\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n macrosurl.url('^:myhash/$', 'myhash_main'),\r\n macrosurl.url('^news/:news_myhash/$', 'myhash_news'),\r\n)\r\n```\r\n\r\nYou free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.\r\n\r\n### Urls normalization\r\n\r\nOnce Macros Url finished compile regex pattern, it makes normalization of it by rules:\r\n\r\n- Strip from left side all whitespace and ^\r\n- Strip from right side of pattern all whitespace and $\r\n- Add to left side ^\r\n- Add to right side $\r\n\r\nThis makes your urls always very strong to adding any unexpected params into path.\r\n\r\n### Examples\r\n\r\nMacro Url example urls.py file\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:category_slug/$', 'category'),\r\n url(':category_slug/:product_slug/', 'category_product'),\r\n url(':category_slug/:product_slug/:variant_id', 'category_product_variant'),\r\n url('news/', 'news'),\r\n url('news/:year/:month/:day$', 'news_date'),\r\n url('news/:slug$', 'news_entry'),\r\n url('^order/:id$', 'order'),\r\n)\r\n```\r\n\r\nDjango way urls example\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^(?P[\\w-]+>)/$', 'category'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Django-macros-url","tagline":"Django Macros Url v0.1.0 - Routing must be simple as possible","body":"# [Django Macros Url](https://github.com/phpdude/django-macros-url/) v0.1.1 - Routing must be simple as possible\r\n\r\nDjango Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.\r\n\r\nYou can combine your prefixes with macro names with underscope, for example you can use macro `:slug` and `:product_slug`. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.\r\n\r\n### Supported macros by default\r\n\r\n```\r\nslug - [\\w-]+\r\nyear - \\d{4}\r\nmonth - (0?([1-9])|10|11|12)\r\nday - ((0|1|2)?([1-9])|[1-3]0|31)\r\nid - \\d+\r\nuuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}\r\n```\r\n\r\nIf you want to offer more macros by default, you can fork and make pull request.\r\n\r\n### Installation\r\n\r\nYou can install library with pypi like a charm.\r\n\r\n```\r\npip install django-macros-url\r\n```\r\n\r\n### Usage\r\n\r\nDjango Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.\r\n\r\nAlso you can register new macro (or maybe you want to replace default macro with your like regex pattern) with `macrosurl.register(macro, pattern)` method.\r\n\r\nExample of registration.\r\n\r\n```python\r\nimport macrosurl\r\n\r\nmacrosurl.register('myhash', '[a-f0-9]{9}')\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n macrosurl.url('^:myhash/$', 'myhash_main'),\r\n macrosurl.url('^news/:news_myhash/$', 'myhash_news'),\r\n)\r\n```\r\n\r\nYou free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.\r\n\r\n### Urls normalization\r\n\r\nOnce Macros Url finished compile regex pattern, it makes normalization of it by rules:\r\n\r\n- Strip from left side all whitespace and ^\r\n- Strip from right side of pattern all whitespace and $\r\n- Add to left side ^\r\n- Add to right side $\r\n\r\nThis makes your urls always very strong to adding any unexpected params into path.\r\n\r\n### Examples\r\n\r\nMacro Url example urls.py file\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:category_slug/$', 'category'),\r\n url(':category_slug/:product_slug/', 'category_product'),\r\n url(':category_slug/:product_slug/:variant_id', 'category_product_variant'),\r\n url('news/', 'news'),\r\n url('news/:year/:month/:day$', 'news_date'),\r\n url('news/:slug$', 'news_entry'),\r\n url('^order/:id$', 'order'),\r\n)\r\n```\r\n\r\nDjango way urls example\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^(?P[\\w-]+>)/$', 'category'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 9097565aa4da4eb668208f827605a7bfc5189946 Mon Sep 17 00:00:00 2001 From: Alexandr Shurigin Date: Tue, 3 Jun 2014 20:52:56 +0700 Subject: [PATCH 08/15] Create gh-pages branch via GitHub From 4f9e0fa2b80bbd44cffd6c379670201a43147506 Mon Sep 17 00:00:00 2001 From: Alexandr Shurigin Date: Tue, 3 Jun 2014 20:53:54 +0700 Subject: [PATCH 09/15] Create gh-pages branch via GitHub --- index.html | 2 +- params.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index fe98c55..941824d 100644 --- a/index.html +++ b/index.html @@ -17,7 +17,7 @@

Django-macros-url

-

Django Macros Url v0.1.0 - Routing must be simple as possible

+

Django Macros Url. Routing must be simple as possible

  • Download ZIP
  • diff --git a/params.json b/params.json index cf34f40..a119054 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Django-macros-url","tagline":"Django Macros Url v0.1.0 - Routing must be simple as possible","body":"# [Django Macros Url](https://github.com/phpdude/django-macros-url/) v0.1.1 - Routing must be simple as possible\r\n\r\nDjango Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.\r\n\r\nYou can combine your prefixes with macro names with underscope, for example you can use macro `:slug` and `:product_slug`. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.\r\n\r\n### Supported macros by default\r\n\r\n```\r\nslug - [\\w-]+\r\nyear - \\d{4}\r\nmonth - (0?([1-9])|10|11|12)\r\nday - ((0|1|2)?([1-9])|[1-3]0|31)\r\nid - \\d+\r\nuuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}\r\n```\r\n\r\nIf you want to offer more macros by default, you can fork and make pull request.\r\n\r\n### Installation\r\n\r\nYou can install library with pypi like a charm.\r\n\r\n```\r\npip install django-macros-url\r\n```\r\n\r\n### Usage\r\n\r\nDjango Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.\r\n\r\nAlso you can register new macro (or maybe you want to replace default macro with your like regex pattern) with `macrosurl.register(macro, pattern)` method.\r\n\r\nExample of registration.\r\n\r\n```python\r\nimport macrosurl\r\n\r\nmacrosurl.register('myhash', '[a-f0-9]{9}')\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n macrosurl.url('^:myhash/$', 'myhash_main'),\r\n macrosurl.url('^news/:news_myhash/$', 'myhash_news'),\r\n)\r\n```\r\n\r\nYou free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.\r\n\r\n### Urls normalization\r\n\r\nOnce Macros Url finished compile regex pattern, it makes normalization of it by rules:\r\n\r\n- Strip from left side all whitespace and ^\r\n- Strip from right side of pattern all whitespace and $\r\n- Add to left side ^\r\n- Add to right side $\r\n\r\nThis makes your urls always very strong to adding any unexpected params into path.\r\n\r\n### Examples\r\n\r\nMacro Url example urls.py file\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:category_slug/$', 'category'),\r\n url(':category_slug/:product_slug/', 'category_product'),\r\n url(':category_slug/:product_slug/:variant_id', 'category_product_variant'),\r\n url('news/', 'news'),\r\n url('news/:year/:month/:day$', 'news_date'),\r\n url('news/:slug$', 'news_entry'),\r\n url('^order/:id$', 'order'),\r\n)\r\n```\r\n\r\nDjango way urls example\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^(?P[\\w-]+>)/$', 'category'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Django-macros-url","tagline":"Django Macros Url. Routing must be simple as possible","body":"# [Django Macros Url](https://github.com/phpdude/django-macros-url/) v0.1.1 - Routing must be simple as possible\r\n\r\nDjango Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.\r\n\r\nYou can combine your prefixes with macro names with underscope, for example you can use macro `:slug` and `:product_slug`. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.\r\n\r\n### Supported macros by default\r\n\r\n```\r\nslug - [\\w-]+\r\nyear - \\d{4}\r\nmonth - (0?([1-9])|10|11|12)\r\nday - ((0|1|2)?([1-9])|[1-3]0|31)\r\nid - \\d+\r\nuuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}\r\n```\r\n\r\nIf you want to offer more macros by default, you can fork and make pull request.\r\n\r\n### Installation\r\n\r\nYou can install library with pypi like a charm.\r\n\r\n```\r\npip install django-macros-url\r\n```\r\n\r\n### Usage\r\n\r\nDjango Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.\r\n\r\nAlso you can register new macro (or maybe you want to replace default macro with your like regex pattern) with `macrosurl.register(macro, pattern)` method.\r\n\r\nExample of registration.\r\n\r\n```python\r\nimport macrosurl\r\n\r\nmacrosurl.register('myhash', '[a-f0-9]{9}')\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n macrosurl.url('^:myhash/$', 'myhash_main'),\r\n macrosurl.url('^news/:news_myhash/$', 'myhash_news'),\r\n)\r\n```\r\n\r\nYou free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.\r\n\r\n### Urls normalization\r\n\r\nOnce Macros Url finished compile regex pattern, it makes normalization of it by rules:\r\n\r\n- Strip from left side all whitespace and ^\r\n- Strip from right side of pattern all whitespace and $\r\n- Add to left side ^\r\n- Add to right side $\r\n\r\nThis makes your urls always very strong to adding any unexpected params into path.\r\n\r\n### Examples\r\n\r\nMacro Url example urls.py file\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:category_slug/$', 'category'),\r\n url(':category_slug/:product_slug/', 'category_product'),\r\n url(':category_slug/:product_slug/:variant_id', 'category_product_variant'),\r\n url('news/', 'news'),\r\n url('news/:year/:month/:day$', 'news_date'),\r\n url('news/:slug$', 'news_entry'),\r\n url('^order/:id$', 'order'),\r\n)\r\n```\r\n\r\nDjango way urls example\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^(?P[\\w-]+>)/$', 'category'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From dabb31cc9d44516b0997d12ccd3c018ba4782932 Mon Sep 17 00:00:00 2001 From: Alexandr Shurigin Date: Sun, 29 Jun 2014 23:24:54 +0700 Subject: [PATCH 10/15] Create gh-pages branch via GitHub --- index.html | 7 +++++-- params.json | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index 941824d..4aceeeb 100644 --- a/index.html +++ b/index.html @@ -31,13 +31,15 @@

    Django-macros-url

- -Django Macros Url v0.1.1 - Routing must be simple as possible

+ +Django Macros Url v0.1.3 - Routing must be simple as possible

Django Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.

You can combine your prefixes with macro names with underscope, for example you can use macro :slug and :product_slug. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.

+

Build Status

+

Supported macros by default

@@ -46,6 +48,7 @@

month - (0?([1-9])|10|11|12) day - ((0|1|2)?([1-9])|[1-3]0|31) id - \d+ +pk - \d+ uuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12} diff --git a/params.json b/params.json index a119054..1d90423 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Django-macros-url","tagline":"Django Macros Url. Routing must be simple as possible","body":"# [Django Macros Url](https://github.com/phpdude/django-macros-url/) v0.1.1 - Routing must be simple as possible\r\n\r\nDjango Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.\r\n\r\nYou can combine your prefixes with macro names with underscope, for example you can use macro `:slug` and `:product_slug`. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.\r\n\r\n### Supported macros by default\r\n\r\n```\r\nslug - [\\w-]+\r\nyear - \\d{4}\r\nmonth - (0?([1-9])|10|11|12)\r\nday - ((0|1|2)?([1-9])|[1-3]0|31)\r\nid - \\d+\r\nuuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}\r\n```\r\n\r\nIf you want to offer more macros by default, you can fork and make pull request.\r\n\r\n### Installation\r\n\r\nYou can install library with pypi like a charm.\r\n\r\n```\r\npip install django-macros-url\r\n```\r\n\r\n### Usage\r\n\r\nDjango Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.\r\n\r\nAlso you can register new macro (or maybe you want to replace default macro with your like regex pattern) with `macrosurl.register(macro, pattern)` method.\r\n\r\nExample of registration.\r\n\r\n```python\r\nimport macrosurl\r\n\r\nmacrosurl.register('myhash', '[a-f0-9]{9}')\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n macrosurl.url('^:myhash/$', 'myhash_main'),\r\n macrosurl.url('^news/:news_myhash/$', 'myhash_news'),\r\n)\r\n```\r\n\r\nYou free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.\r\n\r\n### Urls normalization\r\n\r\nOnce Macros Url finished compile regex pattern, it makes normalization of it by rules:\r\n\r\n- Strip from left side all whitespace and ^\r\n- Strip from right side of pattern all whitespace and $\r\n- Add to left side ^\r\n- Add to right side $\r\n\r\nThis makes your urls always very strong to adding any unexpected params into path.\r\n\r\n### Examples\r\n\r\nMacro Url example urls.py file\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:category_slug/$', 'category'),\r\n url(':category_slug/:product_slug/', 'category_product'),\r\n url(':category_slug/:product_slug/:variant_id', 'category_product_variant'),\r\n url('news/', 'news'),\r\n url('news/:year/:month/:day$', 'news_date'),\r\n url('news/:slug$', 'news_entry'),\r\n url('^order/:id$', 'order'),\r\n)\r\n```\r\n\r\nDjango way urls example\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^(?P[\\w-]+>)/$', 'category'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Django-macros-url","tagline":"Django Macros Url. Routing must be simple as possible","body":"# [Django Macros Url](https://github.com/phpdude/django-macros-url/) v0.1.3 - Routing must be simple as possible\r\n\r\nDjango Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.\r\n\r\nYou can combine your prefixes with macro names with underscope, for example you can use macro `:slug` and `:product_slug`. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.\r\n\r\n[![Build Status](https://travis-ci.org/phpdude/django-macros-url.svg?branch=master)](https://travis-ci.org/phpdude/django-macros-url)\r\n\r\n### Supported macros by default\r\n\r\n```\r\nslug - [\\w-]+\r\nyear - \\d{4}\r\nmonth - (0?([1-9])|10|11|12)\r\nday - ((0|1|2)?([1-9])|[1-3]0|31)\r\nid - \\d+\r\npk - \\d+\r\nuuid - [a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}\r\n```\r\n\r\nIf you want to offer more macros by default, you can fork and make pull request.\r\n\r\n### Installation\r\n\r\nYou can install library with pypi like a charm.\r\n\r\n```\r\npip install django-macros-url\r\n```\r\n\r\n### Usage\r\n\r\nDjango Macros Urls used same way as django standart urls. You just import this and declare your patterns with macros.\r\n\r\nAlso you can register new macro (or maybe you want to replace default macro with your like regex pattern) with `macrosurl.register(macro, pattern)` method.\r\n\r\nExample of registration.\r\n\r\n```python\r\nimport macrosurl\r\n\r\nmacrosurl.register('myhash', '[a-f0-9]{9}')\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n macrosurl.url('^:myhash/$', 'myhash_main'),\r\n macrosurl.url('^news/:news_myhash/$', 'myhash_news'),\r\n)\r\n```\r\n\r\nYou free to register custom macro anywhere (i do it in main urls.py file). Macros Urls uses lazy initiazation. Macros will be compiled only on first request.\r\n\r\n### Urls normalization\r\n\r\nOnce Macros Url finished compile regex pattern, it makes normalization of it by rules:\r\n\r\n- Strip from left side all whitespace and ^\r\n- Strip from right side of pattern all whitespace and $\r\n- Add to left side ^\r\n- Add to right side $\r\n\r\nThis makes your urls always very strong to adding any unexpected params into path.\r\n\r\n### Examples\r\n\r\nMacro Url example urls.py file\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^:category_slug/$', 'category'),\r\n url(':category_slug/:product_slug/', 'category_product'),\r\n url(':category_slug/:product_slug/:variant_id', 'category_product_variant'),\r\n url('news/', 'news'),\r\n url('news/:year/:month/:day$', 'news_date'),\r\n url('news/:slug$', 'news_entry'),\r\n url('^order/:id$', 'order'),\r\n)\r\n```\r\n\r\nDjango way urls example\r\n\r\n```python\r\nfrom django.conf.urls import patterns\r\nfrom macrosurl import url\r\n\r\n\r\nurlpatterns = patterns(\r\n 'yourapp.views',\r\n url('^(?P[\\w-]+>)/$', 'category'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/$', 'category_product'),\r\n url('^(?P[\\w-]+>)/(?P[\\w-]+>)/(?P\\d+>)$', 'category_product_variant'),\r\n url('^news/$', 'news'),\r\n url('^news/(?P\\d{4}>)/(?P(0?([1-9])|10|11|12)>)/(?P((0|1|2)?([1-9])|[1-3]0|31)>)$', 'news_date'),\r\n url('^news/(?P[\\w-]+>)$', 'news_entry'),\r\n url('^order/(?P\\d+>)$', 'order'),\r\n)\r\n```\r\n\r\nI think you understand the difference of ways :)\r\n\r\n#### Routing must be simple! ;-)\r\n\r\nI think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.\r\n\r\n### Contributor\r\n\r\nAlexandr Shurigin (aka [phpdude](https://github.com/phpdude/))\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file From 3f2b06c6134b8feed0ff623bcc3be881004b10f7 Mon Sep 17 00:00:00 2001 From: Alexandr Shurigin Date: Sun, 29 Jun 2014 23:54:33 +0700 Subject: [PATCH 11/15] Create gh-pages branch via GitHub --- index.html | 19 +++++++++++++------ params.json | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/index.html b/index.html index 4aceeeb..43cfb5f 100644 --- a/index.html +++ b/index.html @@ -31,12 +31,12 @@

Django-macros-url

- -Django Macros Url v0.1.3 - Routing must be simple as possible

+ +Django Macros Url v0.1.4 - Routing must be simple as possible

Django Macros Url makes it easy to write (and read) url patterns in your django applications by using macros.

-

You can combine your prefixes with macro names with underscope, for example you can use macro :slug and :product_slug. They both will be compiled to same regex pattern with their group names of course. Multiple underscopes accepted too.

+

You can combine your prefixes with macro names with underscore, for example you can use macro :slug and :product_slug. They both will be compiled to same regex pattern with their group names of course. Multiple underscores accepted too.

Build Status

@@ -111,8 +111,8 @@

url(':category_slug/:product_slug/', 'category_product'), url(':category_slug/:product_slug/:variant_id', 'category_product_variant'), url('news/', 'news'), - url('news/:year/:month/:day$', 'news_date'), - url('news/:slug$', 'news_entry'), + url('news/:year/:month/:day', 'news_date'), + url('news/:slug', 'news_entry'), url('^order/:id$', 'order'), ) @@ -140,12 +140,19 @@

Routing must be simple! ;-)

-

I think real raw url regexp patterns need in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.

+

I think real raw url regexp patterns needed in 1% case only. Prefer simple way to write (and read, this is important) fancy clean urls.

Contributor

Alexandr Shurigin (aka phpdude)

+ +

+Additionals

+ +

Sorry for my english level :(

+ +

You are welcome fix readme to good english by pull request! Thank you.