diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2009-08-05 22:49:44 -0400 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2009-08-05 22:49:44 -0400 |
commit | 026541b6a70cd183d49ffec205232cfb0b205b25 (patch) | |
tree | 53397ba83b39bbfc9d567840b68c251e6cdd8d2f /templates | |
parent | 146b90ec874a4f3eee0a31902a90e4c2d89bc729 (diff) | |
download | askbot-026541b6a70cd183d49ffec205232cfb0b205b25.tar.gz askbot-026541b6a70cd183d49ffec205232cfb0b205b25.tar.bz2 askbot-026541b6a70cd183d49ffec205232cfb0b205b25.zip |
added anonymous posting, per-question subscription and fixes by Pothers and some more, see development.log
Diffstat (limited to 'templates')
52 files changed, 678 insertions, 399 deletions
diff --git a/templates/404.html b/templates/404.html index d24edaf0..cd23a36b 100644 --- a/templates/404.html +++ b/templates/404.html @@ -1,5 +1,5 @@ -<!-- template 404.html --> {% extends "base_content.html" %} +<!-- template 404.html --> {% load i18n %} {% block title %}{% spaceless %}404 Error{% endspaceless %}{% endblock %} {% block forestyle%} diff --git a/templates/500.html b/templates/500.html index c99774b3..52dcafae 100644 --- a/templates/500.html +++ b/templates/500.html @@ -1,5 +1,5 @@ -<!-- template 500.html --> {% extends "base_content.html" %} +<!-- template 500.html --> {% load i18n %} {% block title %}{% spaceless %}500 Error{% endspaceless %}{% endblock %} {% block forejs %} @@ -19,7 +19,7 @@ </div> <div id="main-body" class="headNormal"> <div style="padding:5px 0px 10px 0;line-height:25px"> - <h3>{% trans "sorry, system error"</h3> + <h3>{% trans "sorry, system error" %}</h3> <br> {% trans "system error log is recorded, error will be fixed as soon as possible" %}<br> {% trans "please report the error to the site administrators if you wish" %} diff --git a/templates/answer_edit.html b/templates/answer_edit.html index 008d9f78..9f0f1bec 100644 --- a/templates/answer_edit.html +++ b/templates/answer_edit.html @@ -1,5 +1,5 @@ -<!-- template answer_edit.html --> {% extends "base.html" %} +<!-- template answer_edit.html --> {% load i18n %} {% block title %}{% spaceless %}{% trans "Edit answer" %}{% endspaceless %}{% endblock %} {% block forejs %} diff --git a/templates/answer_edit_tips.html b/templates/answer_edit_tips.html index 565c5298..31f71e34 100644 --- a/templates/answer_edit_tips.html +++ b/templates/answer_edit_tips.html @@ -35,7 +35,7 @@ </li> <li> - <b>{% trans "image" %}</b>:![alt {% trans "text" %}](/path/img.jpg "{% trans "title" %}") + <b>{% trans "image" %}</b>:![alt {% trans "text" %}](/path/img.jpg "{% trans "title" %}") </li> <li> diff --git a/templates/ask.html b/templates/ask.html index 1b00a701..4aa18dd5 100644 --- a/templates/ask.html +++ b/templates/ask.html @@ -1,5 +1,5 @@ -<!-- template ask.html --> {% extends "base.html" %} +<!-- template ask.html --> {% load i18n %} {% block title %}{% spaceless %}{% trans "Ask a question" %}{% endspaceless %}{% endblock %} {% block forejs %} @@ -62,6 +62,19 @@ <div id="main-body" class="ask-body"> <div id="askform"> <form id="fmask" action="" method="post" > + {% if not request.user.is_authenticated %} + <div class="message"> + <p>{% trans "login to post question info" %}</p> + </div> + {% else %} + {% ifequal settings.EMAIL_VALIDATION 'on' %} + {% if not request.user.email_isvalid %} + <div class="message"> + {% blocktrans with request.user.email as email %}must have valid {{email}} to post{% endblocktrans %} + </div> + {% endif %} + {% endifequal %} + {% endif %} <p class="form-item"> <label for="id_title" ><strong>{{ form.title.label_tag }}:</strong></label> <span class="form-error"></span><br> {{ form.title }} {{ form.title.errors }} @@ -92,40 +105,17 @@ <br> </p> <p class="form-item"> - <strong>{{ form.tags.label_tag }}:</strong> <span class="form-error"></span><br> + <strong>{{ form.tags.label_tag }}:</strong> {% trans "(required)" %} <span class="form-error"></span><br> {{ form.tags }} {{ form.tags.errors }} - <div class="title-desc"> - {{ form.tags.help_text }} - </div> </p> - <br> + <p class="title-desc"> + {{ form.tags.help_text }} + </p> {% if not request.user.is_authenticated %} - <table id="login-box"> - <tr> - <td style="vertical-align:middle;"> - <strong>{% trans "Use" %} <a href="http://openid.net/" title="{% trans "learn more about OpenID" %}">OpenID</a> {% trans "Login" %}:</strong><br> - {{ form.openid }} - <div class="title-desc"> - {% trans "Get your own "%} <a href="https://www.myopenid.com/" target=="_blank">OpenID</a>。 - </div> - </td> - <td style="vertical-align:middle; padding: 0px 40px 0px 40px"> - <div style="position: absolute; margin-top:40px; background-color:white; margin-left:-10px; padding:5px;">或</div> - <div style="width:1px; border-left:solid 1px #999; height:8em; margin:auto;"></div> - </td> - <td style="vertical-align:middle;"> - <strong>{% trans "User name" %}:</strong><br> - {{ form.user }} - <p> - <strong>{% trans "Email: (won't be shown to anyone)" %}:</strong><br> - {{ form.email }} - </p> - </td> - </tr> - </table> - {% endif %} + <input type="submit" value="{% trans "Login/signup to post your question" %}" class="submit" /> + {% else %} <input type="submit" value="{% trans "Ask your question" %}" class="submit" /> - <br><br> + {% endif %} </form> </div> </div> diff --git a/templates/authopenid/changeemail.html b/templates/authopenid/changeemail.html index 99984b3f..d5acb6c9 100644 --- a/templates/authopenid/changeemail.html +++ b/templates/authopenid/changeemail.html @@ -1,35 +1,81 @@ {% extends "base_content.html" %} {% load i18n %} {% block content %} -<div id="main-bar" class=""> - <h3> - {% trans "Account: change email" %} - </h3> -</div> -<p class="settings-descr">{% blocktrans %}This is where you can change the email address associated with your account. Please keep this email address up to date so we can send you a password-reset email if you request one.{% endblocktrans %}</p> -{% if form.errors %} -<p class="errors">{% trans "Please correct errors below:" %}<br /> - {% if form.email.errors %} - <span class="error">{{ form.email.errors|join:", " }}</span> - {% endif %} - {% if form.password.errors %} - <span class="error">{{ form.password.errors|join:", " }}</span> - {% endif %} -</p> -{% endif %} +<!-- changeemail.html action_type={{action_type}}--> +{% ifequal action_type "change" %} + <div id="main-bar" class="headNormal"> + {% trans "Change email" %} + </div> + <p class="message"> + {% blocktrans %}change {{email}} info{% endblocktrans %} + </p> + {% if form.errors %} + <p class="errors">{% trans "Please correct errors below:" %}<br /> + {% if form.email.errors %} + <span class="error">{{ form.email.errors|join:", " }}</span> + {% endif %} + {% if form.password.errors %} + <span class="error">{{ form.password.errors|join:", " }}</span> + {% endif %} + </p> + {% endif %} -{% if msg %} -<p class="errors">{{ msg }}</p> -{% endif %} + {% if msg %} + <p class="errors">{{ msg }}</p> + {% endif %} -<div class="aligned"> - <form action="." method="post" accept-charset="utf-8"> + <div class="aligned"> + <form action="." method="post" accept-charset="utf-8"> - <div id="form-row"><label for="id_email">{% trans "Email" %}</label>{{ form.email }}</div> - <div id="form-row"><label for="id_password">{% trans "Password" %}</label>{{ form.password }}</div> + <div class="form-row"><label for="id_email">{% trans "Your new Email" %}</label><br>{{ form.email }}</div> + <!--<div class="form-row"><label for="id_password">{% trans "Password" %}</label>{{ form.password }}</div>--> + <div class="submit-row"> + <input class="submit" type="submit" name="change_email" value="{% trans "Change email" %}"> + <input class="submit" type="submit" name="cancel" value="{% trans "Cancel" %}"> + </div> - <p><input type="submit" value="{% trans "Change email" %}"></p> - - </form> - </div> + </form> + </div> +{% endifequal %} +{% ifequal action_type "validate" %} + <div id="main-bar" class="headNormal"> + {% trans "Validate email" %} + </div> + <p class="message"> + {% blocktrans %}validate {{email}} info{% endblocktrans %} + </p> +{% endifequal %} +{% ifequal action_type "keep" %} + <div id="main-bar" class="headNormal"> + {% trans "Email not changed" %} + </div> + <p class="message"> + {% blocktrans %}old {{email}} kept{% endblocktrans %} + </p> +{% endifequal %} +{% ifequal action_type "done_novalidate" %} + <div id="main-bar" class="headNormal"> + {% trans "Email changed" %} + </div> + <p class="message"> + {% blocktrans %}your current {{email}} can be used for this{% endblocktrans %} + </p> +{% endifequal %} +{% ifequal action_type "validation_complete" %} + <div id="main-bar" class="headNormal"> + {% trans "Email verified" %} + </div> + <p class="message"> + {% trans "thanks for verifying email" %} + </p> +{% endifequal %} +{% ifequal action_type "key_not_sent" %} + <div id="main-bar" class="headNormal"> + {% trans "email key not sent" %} + </div> + <p class="message"> + {% blocktrans %}email key not sent {{email}} change email here {{change_link}}{% endblocktrans %} + </p> +{% endifequal %} {% endblock %} +<!-- end changeemail.html --> diff --git a/templates/authopenid/changeopenid.html b/templates/authopenid/changeopenid.html index c1f3d180..9b5a196a 100644 --- a/templates/authopenid/changeopenid.html +++ b/templates/authopenid/changeopenid.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +<!-- changeopenid.html --> {% load i18n %} {% block content %} @@ -31,3 +32,4 @@ </form> </div> {% endblock %} +<!-- end changeopenid.html --> diff --git a/templates/authopenid/changepw.html b/templates/authopenid/changepw.html index f3cf4be0..0e90b172 100644 --- a/templates/authopenid/changepw.html +++ b/templates/authopenid/changepw.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +<!-- changepw.html --> {% load i18n %} {% block head %} @@ -31,3 +32,4 @@ </form> </div> {% endblock %} +<!-- end changepw.html --> diff --git a/templates/authopenid/complete.html b/templates/authopenid/complete.html index 28c38a04..b9a14e16 100644 --- a/templates/authopenid/complete.html +++ b/templates/authopenid/complete.html @@ -1,4 +1,5 @@ -{% extends "base.html" %} +{% extends "base_content.html" %} +<!-- complete.html --> {% load i18n %} {% block head %}{% endblock %} {% block title %}{% spaceless %}{% trans "Connect your OpenID with this site" %}{% endspaceless %}{% endblock %} @@ -7,7 +8,9 @@ {% trans "Connect your OpenID with your account on this site" %} </div> <p id="completetxt" > - <h3>{% trans "Your OpenID is accepted. Please complete this to finish registration." %}</h3> + <div class="message"> + {% blocktrans %}register new {{provider}} account info{% endblocktrans %} + </div> <p style="display:none">{% trans "This account already exists, please use another." %}</p> </p> @@ -41,12 +44,9 @@ <div class="login"> <form name="fregister" action="{% url user_register %}" method="POST"> {{ form.next }} - <fieldset style="padding:10px"> - <legend class="big">{% trans "New account" %}</legend> - <div class="form-row"><label for="id_username">{% trans "User name (<i>will be shown to others, cannot be modified</i>)" %}</label><br />{{ form1.username }}</div> - <div class="form-row"><label for="id_email">{% trans "Email (<i>not shared with anyone</i>)" %}</label><br />{{ form1.email }}</div> - <div class="submit-row"><input type="submit" class="submit" name="bnewaccount" value="{% trans "create account" %}"></div> - </fieldset> + <div class="form-row"><label for="id_username">{% trans "Screen name label" %}</label><br />{{ form1.username }}</div> + <div class="form-row"><label for="id_email">{% trans "Email address label" %}</label><br />{{ form1.email }}</div> + <div class="submit-row"><input type="submit" class="submit" name="bnewaccount" value="{% trans "create account" %}"></div> </form> </div> <div class="login" style="display:none"> @@ -65,3 +65,4 @@ </form> </div> {% endblock %} +<!-- end complete.html --> diff --git a/templates/authopenid/confirm_email.txt b/templates/authopenid/confirm_email.txt index 9af177ed..202db0fc 100644 --- a/templates/authopenid/confirm_email.txt +++ b/templates/authopenid/confirm_email.txt @@ -1,12 +1,13 @@ -Thank you for registering. +{% load i18n %} +{% trans "Thank you for registering at our Q&A forum!" %} -Your account details are: +{% trans "Your account details are:" %} -Username: {{ username }} -Password: {{ password }} - - -You may sign in here: -{{ site_url }}signin/ +{% trans "Username:" %} {{ username }} +{% trans "Password:" %} {{ password }} +{% trans "Please sign in here:" %} +{{ site_url }}{% trans "signin/" %} +{% blocktrans %}Sincerely, +Forum Administrator{% endblocktrans %} diff --git a/templates/authopenid/delete.html b/templates/authopenid/delete.html index 19e0884a..d39bc962 100644 --- a/templates/authopenid/delete.html +++ b/templates/authopenid/delete.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +<!-- delete.html --> {% load i18n %} @@ -36,3 +37,4 @@ </form> </div> {% endblock %} +<!-- end delete.html --> diff --git a/templates/authopenid/failure.html b/templates/authopenid/failure.html index 87839ab2..d075d6b0 100644 --- a/templates/authopenid/failure.html +++ b/templates/authopenid/failure.html @@ -1,5 +1,6 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<!-- failure.html --> <html> <head> <title>OpenID failed</title> @@ -10,4 +11,4 @@ <p>{{ message|escape }}</p> </body> -</html>
\ No newline at end of file +</html><!-- end failure.html --> diff --git a/templates/authopenid/sendpw.html b/templates/authopenid/sendpw.html index a9488c4c..ba81dba4 100644 --- a/templates/authopenid/sendpw.html +++ b/templates/authopenid/sendpw.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +<!-- sendpw.html --> {% load i18n %} {% block title %}{% spaceless %}{% trans "Send new password" %}{% endspaceless %}{% endblock %} @@ -32,3 +33,4 @@ <span class="darkred">{% trans "Note: your new password will be activated only after you click the activation link in the email message" %}</span> </div> {% endblock %} +<!-- end sendpw.html --> diff --git a/templates/authopenid/sendpw_email.txt b/templates/authopenid/sendpw_email.txt index dec062a8..2024061c 100644 --- a/templates/authopenid/sendpw_email.txt +++ b/templates/authopenid/sendpw_email.txt @@ -1,14 +1,14 @@ -Someone has requested to reset your password on {{ site_url }}. -If this is not you, it is safe to ignore this email. +{% load i18n %} +{% blocktrans %}Someone has requested to reset your password on {{ site_url }}. +If it were not you, it is safe to ignore this email.{% endblocktrans %} -Your new account details are: +{% trans "Your new account details are:" %} -Username: {{ username }} -New password: {{ password }} +{% trans "Username:" %} {{ username }} +{% trans "New password:" %} {{ password }} -To confirm reset of your password go to this address: +{% trans "To confirm that you wanted to reset your password please visit:" %} {{ site_url }}{{ url_confirm }}?key={{ confirm_key }} -Regards, - - +{% blocktrans %}Sincerely, +Forum Administrator{% endblocktrans %} diff --git a/templates/authopenid/settings.html b/templates/authopenid/settings.html index ffd5dd8f..a373324e 100644 --- a/templates/authopenid/settings.html +++ b/templates/authopenid/settings.html @@ -1,4 +1,5 @@ {% extends "base_content.html" %} +<!-- settings.html --> {% load i18n %} {% block head %} @@ -39,3 +40,4 @@ </dl> </div> {% endblock %} +<!-- end settings.html --> diff --git a/templates/authopenid/signin.html b/templates/authopenid/signin.html index d8a98329..9a1a6780 100644 --- a/templates/authopenid/signin.html +++ b/templates/authopenid/signin.html @@ -1,42 +1,120 @@ {% extends "base.html" %} +<!-- signin.html --> {% load i18n %} {% block title %}{% spaceless %}{% trans "User login" %}{% endspaceless %}{% endblock %} {% block forejs %} - <script type="text/javascript" src="/content/js/jquery.openid.js?"></script> + <!--<script type="text/javascript" src="/content/js/jquery.openid.js?"></script>--> <script type='text/javascript' src='/content/js/jquery.validate.pack.js'></script> - <script type="text/javascript"> + + <link rel="stylesheet" type="text/css" media="screen" href="/content/jquery-openid/openid.css"/> + <script type="text/javascript" src="/content/jquery-openid/jquery.openid.js"></script> + <script type="text/javascript"> $().ready( function() { $("form.openid:eq(0)").openid(); })</script> + <!--<script type="text/javascript"> $().ready(function(){ openid.init('id_openid_url'); setupFormValidation("#openid_form", {bsignin:{required: true}}); }); - </script> + </script>--> {% endblock %} {% block content %} <div class="headNormal"> {% trans "User login" %} </div> -<div class="login"> - <form name="openid_form" action="{% url user_signin %}" method="post"> - {{ form2.next }} - <p>{% trans "we support two login modes" %}</p> {% if msg %} <p class="warning">{{ msg }}</p> {% endif %} - <fieldset class="fieldset"> - <legend ><strong>{% trans "Login with your OpenID" %}</strong></legend> - <div id="openid_choice"> - <p>{% trans "select openid provider" %}</p> - <div id="openid_btns"> - </div> - <br><br><br> - <p>{% trans "verify openid link and login" %}</p> + {% if answer %} + <div class="message"> + {% blocktrans with answer.question.title as title and answer.summary as summary %} + Your answer to {{title}} {{summary}} will be posted once you log in + {% endblocktrans %} + </div> + {% endif %} + {% if question %} + <div class="message"> + {% blocktrans with question.title as title and question.summary as summary %}Your question + {{title}} {{summary}} will be posted once you log in + {% endblocktrans %} </div> - <p> - {{ form2.openid_url }} <input id="bsignin" name="bsignin" type="submit" value="{% trans "Login" %}" class="openid-login-submit" /> - </p> - </fieldset> - </form> - <div> + {% endif %} + <div style="width:600px;float:left;margin-bottom:5px;">{% trans "Click to sign in through any of these services." %}</div> + <form id="openid_form" name="openid_form" class="openid" method="post" action="{% url user_signin %}"> + <ul class="providers"> + <li class="openid" title="OpenID"> + <div class="logo_box openid_box"> + <img src="/content/jquery-openid/images/openid.gif" alt="icon" /> + </div> + <span><strong>http://{your-openid-url}</strong></span> + </li> + <li class="direct" title="Google"> + <div class="logo_box google_box"> + <img src="/content/jquery-openid/images/google.gif" alt="icon" /><span>https://www.google.com/accounts/o8/id</span> + </div> + </li> + <li class="direct" title="Yahoo"> + <div class="logo_box yahoo_box"> + <img src="/content/jquery-openid/images/yahoo.gif" alt="icon" /><span>http://yahoo.com/</span> + </div> + </li> + <li class="username" title="AOL screen name"> + <div class="logo_box aol_box"> + <img src="/content/jquery-openid/images/aol.gif" alt="icon" /><span>http://openid.aol.com/<strong>username</strong></span> + </div> + </li> + <li class="username first_tiny_li" title="MyOpenID user name"> + <img src="/content/jquery-openid/images/myopenid.ico" alt="icon" /> + <span>http://<strong>username</strong>.myopenid.com/</span> + </li> + <li class="username" title="Flickr user name"> + <img src="/content/jquery-openid/images/flickr.ico" alt="icon" /> + <span>http://flickr.com/<strong>username</strong>/</span> + </li> + <li class="username" title="Technorati user name"> + <img src="/content/jquery-openid/images/technorati.ico" alt="icon" /> + <span>http://technorati.com/people/technorati/<strong>username</strong>/</span> + </li> + <li class="username" title="Wordpress blog name"> + <img src="/content/jquery-openid/images/wordpress.ico" alt="icon" /> + <span>http://<strong>username</strong>.wordpress.com</span> + </li> + <li class="username" title="Blogger blog name"> + <img src="/content/jquery-openid/images/blogger.ico" alt="icon" /> + <span>http://<strong>username</strong>.blogspot.com/</span> + </li> + <li class="username" title="LiveJournal blog name"> + <img src="/content/jquery-openid/images/livejournal.ico" alt="icon" /> + <span>http://<strong>username</strong>.livejournal.com</span> + </li> + <li class="username" title="ClaimID user name"> + <img src="/content/jquery-openid/images/claimid.ico" alt="icon" /> + <span>http://claimid.com/<strong>username</strong></span> + </li> + <li class="username" title="Vidoop user name"> + <img src="/content/jquery-openid/images/vidoop.ico" alt="icon" /> + <span>http://<strong>username</strong>.myvidoop.com/</span> + </li> + <li class="username" title="Verisign user name"> + <img src="/content/jquery-openid/images/verisign.ico" alt="icon" /> + <span>http://<strong>username</strong>.pip.verisignlabs.com/</span> + </li> + </ul> + {{ form2.next }} + <fieldset> + <p id="provider_name_slot">{% trans 'Enter your <span id="enter_your_what">Provider user name</span>' %}</p> + <div><p><span></span> + <input id="openid_username" type="text" name="openid_username" /><span></span> + <input type="submit" value="Login" /> + </p></div> + </fieldset> + <fieldset> + <p>{% trans 'Enter your <a class="openid_logo" href="http://openid.net">OpenID</a> web address' %}</p> + <div><p><input id="openid_url" type="text" value="http://" name="openid_url" /> + <input id="bsignin" name="bsignin" type="submit" value="{% trans "Login" %}" /></p></div> + </fieldset> + </form> +<div class="login"> + <p style="display:none">{% trans "we support two login modes" %}</p> + <div style="display:none"> <br> {% if form1.errors %} <p class="errors"> @@ -60,7 +138,7 @@ <div class="form-row"><label for="id_password">{% trans "Password" %}:</label><br />{{ form1.password }}</div> <div class="submit-row"><input type="submit" class="submit" name="blogin" value="{% trans "Login" %}"> <a href="">{% trans "Forgot your password?" %}</a> - <a href="">{% trans "Create new acccount" %}</a></div> + <a href="">{% trans "Create new account" %}</a></div> </fieldset> </form> </div> @@ -93,3 +171,5 @@ </div> {% endblock%} + <script type="text/javascript"> $( function() { $("form.openid:eq(0)").openid(); })</script> +<!-- end signin.html --> diff --git a/templates/authopenid/signup.html b/templates/authopenid/signup.html index 9ac0aab3..a65dafdc 100644 --- a/templates/authopenid/signup.html +++ b/templates/authopenid/signup.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +<!--signup.html--> {% load i18n %} {% block title %}{% spaceless %}{% trans "Signup" %}{% endspaceless %}{% endblock %} @@ -51,3 +52,4 @@ </form> </div> {% endblock %} +<!--end signup.html--> diff --git a/templates/badge.html b/templates/badge.html index d0906918..029ba0d9 100644 --- a/templates/badge.html +++ b/templates/badge.html @@ -1,5 +1,5 @@ -<!-- template badge.html --> {% extends "base_content.html" %} +<!-- template badge.html --> {% load i18n %} {% load extra_tags %} {% load humanize %} diff --git a/templates/badges.html b/templates/badges.html index 7fd1402a..69ddc39f 100644 --- a/templates/badges.html +++ b/templates/badges.html @@ -1,5 +1,5 @@ -<!-- template badges.html --> {% extends "base.html" %} +<!-- template badges.html --> {% load extra_tags %} {% load humanize %} {% load i18n %} @@ -16,9 +16,10 @@ <div class="headlineA"> <span class="headMedals">{% trans "Badges" %}</span> </div> -<div id="main-body" style="width:100%"> +<div class="badges" id="main-body" style="width:100%"> <p> - {% trans "Community gives you awards for your questions, answers and votes. Below is the list of available badges and number of times each type of badge has been awarded." %} + {% trans "Community gives you awards for your questions, answers and votes." %}<br> + {% trans "Below is the list of available badges and number of times each type of badge has been awarded." %} </p> <br> <div id="medalList"> @@ -44,14 +45,14 @@ {% endblock %} {% block sidebar %} -<div class="boxB"> +<div class="boxC"> <h3>{% trans "Community badges" %}</h3> <div class="body"> <p> <a style="cursor:default;" title="gold badge: the highest honor and is very rare" class="medal"><span class="badge1">●</span> {% trans "gold" %}</a> </p> <p> - {% trans "Gold badge is very rare. To obtain it you have to show profound knowledge and ability in addition to actively participating in the community. Gold badge is the highest award in this community." %} + {% trans "gold badge description" %} </p> <p> <a style="cursor:default;" @@ -59,14 +60,14 @@ class="medal"><span class="badge2">●</span> {% trans "silver" %}</a> </p> <p> - {% trans "Obtaining silver badge requires significant patience. If you got one, you've very significantly contributed to this community" %} + {% trans "silver badge description" %} </p> <p> <a style="cursor:default;" title="{% trans "bronze badge: often given as a special honor" %}" class="medal"> <span class="badge3">●</span> {% trans "bronze" %}</a> </p> <p> - {% trans "If you are active in this community, you will get this medal - still it is a special honor." %} + {% trans "bronze badge description" %} </p> </div> </div> diff --git a/templates/base.html b/templates/base.html index bf24c840..ae389255 100644 --- a/templates/base.html +++ b/templates/base.html @@ -4,18 +4,18 @@ {% load i18n %} <html xmlns="http://www.w3.org/1999/xhtml"> <head> - <title>{% block title %}{% endblock %} - {{ APP_TITLE }}</title> + <title>{% block title %}{% endblock %} - {{ settings.APP_TITLE }}</title> {% spaceless %} {% block meta %}{% endblock %} {% endspaceless %} <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> - <meta name="verify-v1" content="{{verify_v1_code}}" /> + <meta name="verify-v1" content="{{settings.GOOGLE_SITEMAP_CODE}}" /> <link rel="shortcut icon" href="/content/images/favicon.ico" > <link href="/content/style/style.css" rel="stylesheet" type="text/css" /> <script src="http://www.google.com/jsapi"></script> <script>google.load("jquery", "1.2.6");</script> <script type="text/javascript"> - var i18nLang = 'en'; + var i18nLang = '{{settings.LANGUAGE_CODE}}'; </script> <script type='text/javascript' src='/content/js/com.cnprog.i18n.js'></script> <script type='text/javascript' src='/content/js/jquery.i18n.js'></script> @@ -26,9 +26,8 @@ </script> <script type="text/javascript"> UserVoice.Tab.show({ - //EDIT!!! - key: 'key', - host: 'where.uservoice.com', + key: 'cnprog', + host: 'cnprog.uservoice.com', forum: 'general', alignment: 'left', /* 'left', 'right' */ background_color:'#777', @@ -38,30 +37,31 @@ }) </script>--> <!-- todo move this to settings --> - {% with request.user.get_messages as messages%} {% if messages %} <style type="text/css"> body { margin-top:2.4em; } </style> <script type="text/javascript"> $().ready(function() { + $('#validate_email_alert').click(function(){notify.close(true)}) notify.show(); }); </script> - {% endif %} - {% endwith %} {% block forejs %} {% endblock %} </head> <body> <div class="notify" style="display:none"> - <span>{% if request.user.get_messages %} - {% trans "congratulations, community gave you a badge" %}: {% for message in request.user.get_messages %} - <font class="darkred">{{ message }}</font>, {% endfor %}查看 - <a href="{{ request.user.get_profile_url }}">{% trans "profile" %}</a>{% endif %}</span> - <a class="close-notify" onclick="notify.close(true)">×</a> + {% autoescape off %} + {% if messages %} + {% for message in messages %} + <p class="darkred">{{ message }}<p> + {% endfor %} + {% endif %} + {% endautoescape %} + <a id="close-notify" onclick="notify.close(true)">×</a> </div> {% include "header.html" %} <div id="wrapper"> @@ -89,3 +89,4 @@ {% endblock %} </body> </html> +<!-- end template base.html --> diff --git a/templates/base_content.html b/templates/base_content.html index 39627a0e..4ee9675f 100644 --- a/templates/base_content.html +++ b/templates/base_content.html @@ -1,10 +1,11 @@ -{% load i18n %} <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<!-- base_content.html --> +{% load i18n %} <html> <head> - <title>{% block title %}{% endblock %} - {{ APP_TITLE }}</title> + <title>{% block title %}{% endblock %} - {{ settings.APP_TITLE }}</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> - <meta name="verify-v1" content="55uGNnQVJW8p1bbXeF/Xbh9I7nZBM/wLhRz6N/I1kkA=" /> + <meta name="verify-v1" content="{{ settings.GOOGLE_SITEMAP_CODE }}" /> <link rel="shortcut icon" href="/content/images/favicon.ico" > <link href="/content/style/style.css" rel="stylesheet" type="text/css" /> {% spaceless %} @@ -13,7 +14,7 @@ <script src="http://www.google.com/jsapi"></script> <script>google.load("jquery", "1.2.6");</script> <script type="text/javascript"> - var i18nLang = 'en'; + var i18nLang = '{{ settings.LANGUAGE_CODE }}'; </script> <script type='text/javascript' src='/content/js/com.cnprog.i18n.js'></script> <script type='text/javascript' src='/content/js/jquery.i18n.js'></script> @@ -38,29 +39,32 @@ </script>--> <!-- todo move this to settings--> - {% with request.user.get_messages as messages%} {% if messages %} <style type="text/css"> body { margin-top:2.4em; } </style> <script type="text/javascript"> $().ready(function() { + var element = $('#validate_email_alert') + element.click(function(){notify.close(true);setTimeout(function(){},1000)}) notify.show(); }); </script> {% endif %} - {% endwith %} {% block forejs %} {% endblock %} </head> <body> <div class="notify" style="display:none"> - <span>{% if request.user.get_messages %} - {% trans "congratulations, community gave you a badge" %}:{% for message in request.user.get_messages %} - <font class="darkred">{{ message }}</font>, {% endfor %}{% trans "see" %} - <a href="{{ request.user.get_profile_url }}">{% trans "profile" %}</a>{% endif %}</span> - <a class="close-notify" onclick="notify.close(true)">×</a> + {% autoescape off %} + {% if messages %} + {% for message in messages %} + <p class="darkred">{{ message }}<p> + {% endfor %} + {% endif %} + {% endautoescape %} + <a id="close-notify" onclick="notify.close(true)">×</a> </div> {% include "header.html" %} <div id="wrapper"> @@ -82,3 +86,4 @@ {% endblock %} </body> </html> +<!-- end template base_content.html --> diff --git a/templates/book.html b/templates/book.html index a58a09f2..dddd13e6 100644 --- a/templates/book.html +++ b/templates/book.html @@ -1,5 +1,5 @@ -<!-- template book.html --> {% extends "base_content.html" %} +<!-- template book.html --> {% load i18n %} {% load extra_tags %} {% load extra_filters %} diff --git a/templates/close.html b/templates/close.html index 32df3e82..d9e73507 100644 --- a/templates/close.html +++ b/templates/close.html @@ -1,5 +1,5 @@ -<!-- template close.html --> {% extends "base_content.html" %} +<!-- template close.html --> {% load i18n %} {% load extra_tags %} {% load humanize %} diff --git a/templates/content/js/com.cnprog.i18n.js b/templates/content/js/com.cnprog.i18n.js index 2d8c90a6..90166eec 100644 --- a/templates/content/js/com.cnprog.i18n.js +++ b/templates/content/js/com.cnprog.i18n.js @@ -1,5 +1,3 @@ -// Evgeny Fadeev evgeny.fadeev@gmail.com localized for english and chinese -// i18nLang variable must be set in html header to extract correct language var i18nZh = { 'insufficient privilege':'用户权限不在操作范围', 'cannot pick own answer as best':'不能设置自己的回答为最佳答案', @@ -59,6 +57,10 @@ var i18nZh = { }; var i18nEn = { + '>15 points requried to upvote':'>15 points requried to upvote ', + 'tags cannot be empty':'please enter at least one tag', + 'anonymous users cannot vote':'anonymous users cannot vote ', + 'anonymous users cannot select favorite questions':'anonymous users cannot select favorite questions ', 'to comment, need': 'to comment, need reputation ', 'please see':'please see ', 'community reputation points':' ', @@ -84,7 +86,7 @@ var i18nEn = { var i18n = { 'en':i18nEn, - 'zh':i18nZh + 'zh_CN':i18nZh }; var i18n_dict = i18n[i18nLang]; diff --git a/templates/content/js/com.cnprog.post.js b/templates/content/js/com.cnprog.post.js index 723e34ae..546cf101 100644 --- a/templates/content/js/com.cnprog.post.js +++ b/templates/content/js/com.cnprog.post.js @@ -48,10 +48,11 @@ var Vote = function(){ var questionControlsId = 'question-controls'; var removeQuestionLinkIdPrefix = 'question-delete-link-'; var removeAnswerLinkIdPrefix = 'answer-delete-link-'; + var questionSubscribeUpdates = 'question-subscribe-updates'; var acceptAnonymousMessage = $.i18n._('insufficient privilege'); var acceptOwnAnswerMessage = $.i18n._('cannot pick own answer as best'); - var favoriteAnonymousMessage = $.i18n._('anonymous user cannot select favorite questions') + var favoriteAnonymousMessage = $.i18n._('anonymous users cannot select favorite questions') + "<a href='/account/signin/?next=/questions/{{QuestionID}}'>" + $.i18n._('please login') + "</a>"; var voteAnonymousMessage = $.i18n._('anonymous users cannot vote') @@ -91,7 +92,9 @@ var Vote = function(){ offensiveQuestion : 7, offensiveAnswer:8, removeQuestion: 9, - removeAnswer:10 + removeAnswer:10, + questionSubscribeUpdates:11, + questionUnsubscribeUpdates:12, }; var getFavoriteButton = function(){ @@ -141,6 +144,10 @@ var Vote = function(){ var removeQuestionLink = 'div#question-controls a[id^='+ removeQuestionLinkIdPrefix +']'; return $(removeQuestionLink); }; + + var getquestionSubscribeUpdatesCheckbox = function(){ + return $('#' + questionSubscribeUpdates); + }; var getremoveAnswersLinks = function(){ var removeAnswerLinks = 'div.answer-controls a[id^='+ removeAnswerLinkIdPrefix +']'; @@ -216,6 +223,15 @@ var Vote = function(){ getremoveQuestionLink().unbind('click').click(function(event){ Vote.remove(this, VoteType.removeQuestion); }); + + getquestionSubscribeUpdatesCheckbox().unbind('click').click(function(event){ + if (this.checked){ + Vote.vote($(event.target), VoteType.questionSubscribeUpdates); + } + else { + Vote.vote($(event.target), VoteType.questionUnsubscribeUpdates); + } + }); getremoveAnswersLinks().unbind('click').click(function(event){ Vote.remove(this, VoteType.removeAnswer) @@ -343,7 +359,6 @@ var Vote = function(){ }; var callback_remove = function(object, voteType, data){ - alert(data.status); if(data.allowed == "0" && data.success == "0"){ showMessage(object, removeAnonymousMessage.replace("{{QuestionID}}", questionId)); } @@ -613,4 +628,4 @@ var commentsFactory = {'question' : questionComments, 'answer' : answerComments} Prettify http://www.apache.org/licenses/LICENSE-2.0 */ -var PR_SHOULD_USE_CONTINUATION = true; var PR_TAB_WIDTH = 8; var PR_normalizedHtml; var PR; var prettyPrintOne; var prettyPrint; function _pr_isIE6() { var isIE6 = navigator && navigator.userAgent && /\bMSIE 6\./.test(navigator.userAgent); _pr_isIE6 = function() { return isIE6; }; return isIE6; } (function() { function wordSet(words) { words = words.split(/ /g); var set = {}; for (var i = words.length; --i >= 0; ) { var w = words[i]; if (w) { set[w] = null; } } return set; } var FLOW_CONTROL_KEYWORDS = "break continue do else for if return while "; var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " + "double enum extern float goto int long register short signed sizeof " + "static struct switch typedef union unsigned void volatile "; var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " + "new operator private protected public this throw true try "; var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " + "concept concept_map const_cast constexpr decltype " + "dynamic_cast explicit export friend inline late_check " + "mutable namespace nullptr reinterpret_cast static_assert static_cast " + "template typeid typename typeof using virtual wchar_t where "; var JAVA_KEYWORDS = COMMON_KEYWORDS + "boolean byte extends final finally implements import instanceof null " + "native package strictfp super synchronized throws transient "; var CSHARP_KEYWORDS = JAVA_KEYWORDS + "as base by checked decimal delegate descending event " + "fixed foreach from group implicit in interface internal into is lock " + "object out override orderby params readonly ref sbyte sealed " + "stackalloc string select uint ulong unchecked unsafe ushort var "; var JSCRIPT_KEYWORDS = COMMON_KEYWORDS + "debugger eval export function get null set undefined var with " + "Infinity NaN "; var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " + "goto if import last local my next no our print package redo require " + "sub undef unless until use wantarray while BEGIN END "; var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " + "elif except exec finally from global import in is lambda " + "nonlocal not or pass print raise try with yield " + "False True None "; var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" + " defined elsif end ensure false in module next nil not or redo rescue " + "retry self super then true undef unless until when yield BEGIN END "; var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " + "function in local set then until "; var ALL_KEYWORDS = (CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS + PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS); var PR_STRING = 'str'; var PR_KEYWORD = 'kwd'; var PR_COMMENT = 'com'; var PR_TYPE = 'typ'; var PR_LITERAL = 'lit'; var PR_PUNCTUATION = 'pun'; var PR_PLAIN = 'pln'; var PR_TAG = 'tag'; var PR_DECLARATION = 'dec'; var PR_SOURCE = 'src'; var PR_ATTRIB_NAME = 'atn'; var PR_ATTRIB_VALUE = 'atv'; var PR_NOCODE = 'nocode'; function isWordChar(ch) { return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'); } function spliceArrayInto(inserted, container, containerPosition, countReplaced) { inserted.unshift(containerPosition, countReplaced || 0); try { container.splice.apply(container, inserted); } finally { inserted.splice(0, 2); } } var REGEXP_PRECEDER_PATTERN = function() { var preceders = ["!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=", "&=", "(", "*", "*=", "+=", ",", "-=", "->", "/", "/=", ":", "::", ";", "<", "<<", "<<=", "<=", "=", "==", "===", ">", ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[", "^", "^=", "^^", "^^=", "{", "|", "|=", "||", "||=", "~", "break", "case", "continue", "delete", "do", "else", "finally", "instanceof", "return", "throw", "try", "typeof"]; var pattern = '(?:' + '(?:(?:^|[^0-9.])\\.{1,3})|' + '(?:(?:^|[^\\+])\\+)|' + '(?:(?:^|[^\\-])-)'; for (var i = 0; i < preceders.length; ++i) { var preceder = preceders[i]; if (isWordChar(preceder.charAt(0))) { pattern += '|\\b' + preceder; } else { pattern += '|' + preceder.replace(/([^=<>:&])/g, '\\$1'); } } pattern += '|^)\\s*$'; return new RegExp(pattern); } (); var pr_amp = /&/g; var pr_lt = /</g; var pr_gt = />/g; var pr_quot = /\"/g; function attribToHtml(str) { return str.replace(pr_amp, '&').replace(pr_lt, '<').replace(pr_gt, '>').replace(pr_quot, '"'); } function textToHtml(str) { return str.replace(pr_amp, '&').replace(pr_lt, '<').replace(pr_gt, '>'); } var pr_ltEnt = /</g; var pr_gtEnt = />/g; var pr_aposEnt = /'/g; var pr_quotEnt = /"/g; var pr_ampEnt = /&/g; var pr_nbspEnt = / /g; function htmlToText(html) { var pos = html.indexOf('&'); if (pos < 0) { return html; } for (--pos; (pos = html.indexOf('&#', pos + 1)) >= 0; ) { var end = html.indexOf(';', pos); if (end >= 0) { var num = html.substring(pos + 3, end); var radix = 10; if (num && num.charAt(0) === 'x') { num = num.substring(1); radix = 16; } var codePoint = parseInt(num, radix); if (!isNaN(codePoint)) { html = (html.substring(0, pos) + String.fromCharCode(codePoint) + html.substring(end + 1)); } } } return html.replace(pr_ltEnt, '<').replace(pr_gtEnt, '>').replace(pr_aposEnt, "'").replace(pr_quotEnt, '"').replace(pr_ampEnt, '&').replace(pr_nbspEnt, ' '); } function isRawContent(node) { return 'XMP' === node.tagName; } function normalizedHtml(node, out) { switch (node.nodeType) { case 1: var name = node.tagName.toLowerCase(); out.push('<', name); for (var i = 0; i < node.attributes.length; ++i) { var attr = node.attributes[i]; if (!attr.specified) { continue; } out.push(' '); normalizedHtml(attr, out); } out.push('>'); for (var child = node.firstChild; child; child = child.nextSibling) { normalizedHtml(child, out); } if (node.firstChild || !/^(?:br|link|img)$/.test(name)) { out.push('<\/', name, '>'); } break; case 2: out.push(node.name.toLowerCase(), '="', attribToHtml(node.value), '"'); break; case 3: case 4: out.push(textToHtml(node.nodeValue)); break; } } var PR_innerHtmlWorks = null; function getInnerHtml(node) { if (null === PR_innerHtmlWorks) { var testNode = document.createElement('PRE'); testNode.appendChild(document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />')); PR_innerHtmlWorks = !/</.test(testNode.innerHTML); } if (PR_innerHtmlWorks) { var content = node.innerHTML; if (isRawContent(node)) { content = textToHtml(content); } return content; } var out = []; for (var child = node.firstChild; child; child = child.nextSibling) { normalizedHtml(child, out); } return out.join(''); } function makeTabExpander(tabWidth) { var SPACES = ' '; var charInLine = 0; return function(plainText) { var out = null; var pos = 0; for (var i = 0, n = plainText.length; i < n; ++i) { var ch = plainText.charAt(i); switch (ch) { case '\t': if (!out) { out = []; } out.push(plainText.substring(pos, i)); var nSpaces = tabWidth - (charInLine % tabWidth); charInLine += nSpaces; for (; nSpaces >= 0; nSpaces -= SPACES.length) { out.push(SPACES.substring(0, nSpaces)); } pos = i + 1; break; case '\n': charInLine = 0; break; default: ++charInLine; } } if (!out) { return plainText; } out.push(plainText.substring(pos)); return out.join(''); }; } var pr_chunkPattern = /(?:[^<]+|<!--[\s\S]*?-->|<!\[CDATA\[([\s\S]*?)\]\]>|<\/?[a-zA-Z][^>]*>|<)/g; var pr_commentPrefix = /^<!--/; var pr_cdataPrefix = /^<\[CDATA\[/; var pr_brPrefix = /^<br\b/i; var pr_tagNameRe = /^<(\/?)([a-zA-Z]+)/; function extractTags(s) { var matches = s.match(pr_chunkPattern); var sourceBuf = []; var sourceBufLen = 0; var extractedTags = []; if (matches) { for (var i = 0, n = matches.length; i < n; ++i) { var match = matches[i]; if (match.length > 1 && match.charAt(0) === '<') { if (pr_commentPrefix.test(match)) { continue; } if (pr_cdataPrefix.test(match)) { sourceBuf.push(match.substring(9, match.length - 3)); sourceBufLen += match.length - 12; } else if (pr_brPrefix.test(match)) { sourceBuf.push('\n'); ++sourceBufLen; } else { if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) { var name = match.match(pr_tagNameRe)[2]; var depth = 1; end_tag_loop: for (var j = i + 1; j < n; ++j) { var name2 = matches[j].match(pr_tagNameRe); if (name2 && name2[2] === name) { if (name2[1] === '/') { if (--depth === 0) { break end_tag_loop; } } else { ++depth; } } } if (j < n) { extractedTags.push(sourceBufLen, matches.slice(i, j + 1).join('')); i = j; } else { extractedTags.push(sourceBufLen, match); } } else { extractedTags.push(sourceBufLen, match); } } } else { var literalText = htmlToText(match); sourceBuf.push(literalText); sourceBufLen += literalText.length; } } } return { source: sourceBuf.join(''), tags: extractedTags }; } function isNoCodeTag(tag) { return !!tag.replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g, ' $1="$2$3$4"').match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/); } function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) { var shortcuts = {}; (function() { var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns); for (var i = allPatterns.length; --i >= 0; ) { var patternParts = allPatterns[i]; var shortcutChars = patternParts[3]; if (shortcutChars) { for (var c = shortcutChars.length; --c >= 0; ) { shortcuts[shortcutChars.charAt(c)] = patternParts; } } } })(); var nPatterns = fallthroughStylePatterns.length; var notWs = /\S/; return function(sourceCode, opt_basePos) { opt_basePos = opt_basePos || 0; var decorations = [opt_basePos, PR_PLAIN]; var lastToken = ''; var pos = 0; var tail = sourceCode; while (tail.length) { var style; var token = null; var match; var patternParts = shortcuts[tail.charAt(0)]; if (patternParts) { match = tail.match(patternParts[1]); token = match[0]; style = patternParts[0]; } else { for (var i = 0; i < nPatterns; ++i) { patternParts = fallthroughStylePatterns[i]; var contextPattern = patternParts[2]; if (contextPattern && !contextPattern.test(lastToken)) { continue; } match = tail.match(patternParts[1]); if (match) { token = match[0]; style = patternParts[0]; break; } } if (!token) { style = PR_PLAIN; token = tail.substring(0, 1); } } decorations.push(opt_basePos + pos, style); pos += token.length; tail = tail.substring(token.length); if (style !== PR_COMMENT && notWs.test(token)) { lastToken = token; } } return decorations; }; } var PR_MARKUP_LEXER = createSimpleLexer([], [[PR_PLAIN, /^[^<]+/, null], [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/, null], [PR_COMMENT, /^<!--[\s\S]*?(?:-->|$)/, null], [PR_SOURCE, /^<\?[\s\S]*?(?:\?>|$)/, null], [PR_SOURCE, /^<%[\s\S]*?(?:%>|$)/, null], [PR_SOURCE, /^<(script|style|xmp)\b[^>]*>[\s\S]*?<\/\1\b[^>]*>/i, null], [PR_TAG, /^<\/?\w[^<>]*>/, null]]); var PR_SOURCE_CHUNK_PARTS = /^(<[^>]*>)([\s\S]*)(<\/[^>]*>)$/; function tokenizeMarkup(source) { var decorations = PR_MARKUP_LEXER(source); for (var i = 0; i < decorations.length; i += 2) { if (decorations[i + 1] === PR_SOURCE) { var start, end; start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; var sourceChunk = source.substring(start, end); var match = sourceChunk.match(PR_SOURCE_CHUNK_PARTS); if (match) { decorations.splice(i, 2, start, PR_TAG, start + match[1].length, PR_SOURCE, start + match[1].length + (match[2] || '').length, PR_TAG); } } } return decorations; } var PR_TAG_LEXER = createSimpleLexer([[PR_ATTRIB_VALUE, /^\'[^\']*(?:\'|$)/, null, "'"], [PR_ATTRIB_VALUE, /^\"[^\"]*(?:\"|$)/, null, '"'], [PR_PUNCTUATION, /^[<>\/=]+/, null, '<>/=']], [[PR_TAG, /^[\w:\-]+/, /^</], [PR_ATTRIB_VALUE, /^[\w\-]+/, /^=/], [PR_ATTRIB_NAME, /^[\w:\-]+/, null], [PR_PLAIN, /^\s+/, null, ' \t\r\n']]); function splitTagAttributes(source, decorations) { for (var i = 0; i < decorations.length; i += 2) { var style = decorations[i + 1]; if (style === PR_TAG) { var start, end; start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; var chunk = source.substring(start, end); var subDecorations = PR_TAG_LEXER(chunk, start); spliceArrayInto(subDecorations, decorations, i, 2); i += subDecorations.length - 2; } } return decorations; } function sourceDecorator(options) { var shortcutStylePatterns = [], fallthroughStylePatterns = []; if (options.tripleQuotedStrings) { shortcutStylePatterns.push([PR_STRING, /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, null, '\'"']); } else if (options.multiLineStrings) { shortcutStylePatterns.push([PR_STRING, /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/, null, '\'"`']); } else { shortcutStylePatterns.push([PR_STRING, /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/, null, '"\'']); } fallthroughStylePatterns.push([PR_PLAIN, /^(?:[^\'\"\`\/\#]+)/, null, ' \r\n']); if (options.hashComments) { shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']); } if (options.cStyleComments) { fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]); fallthroughStylePatterns.push([PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]); } if (options.regexLiterals) { var REGEX_LITERAL = ('^/(?=[^/*])' + '(?:[^/\\x5B\\x5C]' + '|\\x5C[\\s\\S]' + '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+' + '(?:/|$)'); fallthroughStylePatterns.push([PR_STRING, new RegExp(REGEX_LITERAL), REGEXP_PRECEDER_PATTERN]); } var keywords = wordSet(options.keywords); options = null; var splitStringAndCommentTokens = createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns); var styleLiteralIdentifierPuncRecognizer = createSimpleLexer([], [[PR_PLAIN, /^\s+/, null, ' \r\n'], [PR_PLAIN, /^[a-z_$@][a-z_$@0-9]*/i, null], [PR_LITERAL, /^0x[a-f0-9]+[a-z]/i, null], [PR_LITERAL, /^(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d+)(?:e[+\-]?\d+)?[a-z]*/i, null, '123456789'], [PR_PUNCTUATION, /^[^\s\w\.$@]+/, null]]); function splitNonStringNonCommentTokens(source, decorations) { for (var i = 0; i < decorations.length; i += 2) { var style = decorations[i + 1]; if (style === PR_PLAIN) { var start, end, chunk, subDecs; start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; chunk = source.substring(start, end); subDecs = styleLiteralIdentifierPuncRecognizer(chunk, start); for (var j = 0, m = subDecs.length; j < m; j += 2) { var subStyle = subDecs[j + 1]; if (subStyle === PR_PLAIN) { var subStart = subDecs[j]; var subEnd = j + 2 < m ? subDecs[j + 2] : chunk.length; var token = source.substring(subStart, subEnd); if (token === '.') { subDecs[j + 1] = PR_PUNCTUATION; } else if (token in keywords) { subDecs[j + 1] = PR_KEYWORD; } else if (/^@?[A-Z][A-Z$]*[a-z][A-Za-z$]*$/.test(token)) { subDecs[j + 1] = token.charAt(0) === '@' ? PR_LITERAL : PR_TYPE; } } } spliceArrayInto(subDecs, decorations, i, 2); i += subDecs.length - 2; } } return decorations; } return function(sourceCode) { var decorations = splitStringAndCommentTokens(sourceCode); decorations = splitNonStringNonCommentTokens(sourceCode, decorations); return decorations; }; } var decorateSource = sourceDecorator({ keywords: ALL_KEYWORDS, hashComments: true, cStyleComments: true, multiLineStrings: true, regexLiterals: true }); function splitSourceNodes(source, decorations) { for (var i = 0; i < decorations.length; i += 2) { var style = decorations[i + 1]; if (style === PR_SOURCE) { var start, end; start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; var subDecorations = decorateSource(source.substring(start, end)); for (var j = 0, m = subDecorations.length; j < m; j += 2) { subDecorations[j] += start; } spliceArrayInto(subDecorations, decorations, i, 2); i += subDecorations.length - 2; } } return decorations; } function splitSourceAttributes(source, decorations) { var nextValueIsSource = false; for (var i = 0; i < decorations.length; i += 2) { var style = decorations[i + 1]; var start, end; if (style === PR_ATTRIB_NAME) { start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; nextValueIsSource = /^on|^style$/i.test(source.substring(start, end)); } else if (style === PR_ATTRIB_VALUE) { if (nextValueIsSource) { start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; var attribValue = source.substring(start, end); var attribLen = attribValue.length; var quoted = (attribLen >= 2 && /^[\"\']/.test(attribValue) && attribValue.charAt(0) === attribValue.charAt(attribLen - 1)); var attribSource; var attribSourceStart; var attribSourceEnd; if (quoted) { attribSourceStart = start + 1; attribSourceEnd = end - 1; attribSource = attribValue; } else { attribSourceStart = start + 1; attribSourceEnd = end - 1; attribSource = attribValue.substring(1, attribValue.length - 1); } var attribSourceDecorations = decorateSource(attribSource); for (var j = 0, m = attribSourceDecorations.length; j < m; j += 2) { attribSourceDecorations[j] += attribSourceStart; } if (quoted) { attribSourceDecorations.push(attribSourceEnd, PR_ATTRIB_VALUE); spliceArrayInto(attribSourceDecorations, decorations, i + 2, 0); } else { spliceArrayInto(attribSourceDecorations, decorations, i, 2); } } nextValueIsSource = false; } } return decorations; } function decorateMarkup(sourceCode) { var decorations = tokenizeMarkup(sourceCode); decorations = splitTagAttributes(sourceCode, decorations); decorations = splitSourceNodes(sourceCode, decorations); decorations = splitSourceAttributes(sourceCode, decorations); return decorations; } function recombineTagsAndDecorations(sourceText, extractedTags, decorations) { var html = []; var outputIdx = 0; var openDecoration = null; var currentDecoration = null; var tagPos = 0; var decPos = 0; var tabExpander = makeTabExpander(PR_TAB_WIDTH); var adjacentSpaceRe = /([\r\n ]) /g; var startOrSpaceRe = /(^| ) /gm; var newlineRe = /\r\n?|\n/g; var trailingSpaceRe = /[ \r\n]$/; var lastWasSpace = true; function emitTextUpTo(sourceIdx) { if (sourceIdx > outputIdx) { if (openDecoration && openDecoration !== currentDecoration) { html.push('</span>'); openDecoration = null; } if (!openDecoration && currentDecoration) { openDecoration = currentDecoration; html.push('<span class="', openDecoration, '">'); } var htmlChunk = textToHtml(tabExpander(sourceText.substring(outputIdx, sourceIdx))).replace(lastWasSpace ? startOrSpaceRe : adjacentSpaceRe, '$1 '); lastWasSpace = trailingSpaceRe.test(htmlChunk); html.push(htmlChunk.replace(newlineRe, '<br />')); outputIdx = sourceIdx; } } while (true) { var outputTag; if (tagPos < extractedTags.length) { if (decPos < decorations.length) { outputTag = extractedTags[tagPos] <= decorations[decPos]; } else { outputTag = true; } } else { outputTag = false; } if (outputTag) { emitTextUpTo(extractedTags[tagPos]); if (openDecoration) { html.push('</span>'); openDecoration = null; } html.push(extractedTags[tagPos + 1]); tagPos += 2; } else if (decPos < decorations.length) { emitTextUpTo(decorations[decPos]); currentDecoration = decorations[decPos + 1]; decPos += 2; } else { break; } } emitTextUpTo(sourceText.length); if (openDecoration) { html.push('</span>'); } return html.join(''); } var langHandlerRegistry = {}; function registerLangHandler(handler, fileExtensions) { for (var i = fileExtensions.length; --i >= 0; ) { var ext = fileExtensions[i]; if (!langHandlerRegistry.hasOwnProperty(ext)) { langHandlerRegistry[ext] = handler; } else if ('console' in window) { console.log('cannot override language handler %s', ext); } } } registerLangHandler(decorateSource, ['default-code']); registerLangHandler(decorateMarkup, ['default-markup', 'html', 'htm', 'xhtml', 'xml', 'xsl']); registerLangHandler(sourceDecorator({ keywords: CPP_KEYWORDS, hashComments: true, cStyleComments: true }), ['c', 'cc', 'cpp', 'cs', 'cxx', 'cyc']); registerLangHandler(sourceDecorator({ keywords: JAVA_KEYWORDS, cStyleComments: true }), ['java']); registerLangHandler(sourceDecorator({ keywords: SH_KEYWORDS, hashComments: true, multiLineStrings: true }), ['bsh', 'csh', 'sh']); registerLangHandler(sourceDecorator({ keywords: PYTHON_KEYWORDS, hashComments: true, multiLineStrings: true, tripleQuotedStrings: true }), ['cv', 'py']); registerLangHandler(sourceDecorator({ keywords: PERL_KEYWORDS, hashComments: true, multiLineStrings: true, regexLiterals: true }), ['perl', 'pl', 'pm']); registerLangHandler(sourceDecorator({ keywords: RUBY_KEYWORDS, hashComments: true, multiLineStrings: true, regexLiterals: true }), ['rb']); registerLangHandler(sourceDecorator({ keywords: JSCRIPT_KEYWORDS, cStyleComments: true, regexLiterals: true }), ['js']); function prettyPrintOne(sourceCodeHtml, opt_langExtension) { try { var sourceAndExtractedTags = extractTags(sourceCodeHtml); var source = sourceAndExtractedTags.source; var extractedTags = sourceAndExtractedTags.tags; if (!langHandlerRegistry.hasOwnProperty(opt_langExtension)) { opt_langExtension = /^\s*</.test(source) ? 'default-markup' : 'default-code'; } var decorations = langHandlerRegistry[opt_langExtension].call({}, source); return recombineTagsAndDecorations(source, extractedTags, decorations); } catch (e) { if ('console' in window) { console.log(e); console.trace(); } return sourceCodeHtml; } } function prettyPrint(opt_whenDone) { var isIE6 = _pr_isIE6(); var codeSegments = [document.getElementsByTagName('pre'), document.getElementsByTagName('code'), document.getElementsByTagName('xmp')]; var elements = []; for (var i = 0; i < codeSegments.length; ++i) { for (var j = 0; j < codeSegments[i].length; ++j) { elements.push(codeSegments[i][j]); } } codeSegments = null; var k = 0; function doWork() { var endTime = (PR_SHOULD_USE_CONTINUATION ? new Date().getTime() + 250 : Infinity); for (; k < elements.length && new Date().getTime() < endTime; k++) { var cs = elements[k]; if (cs.className && cs.className.indexOf('prettyprint') >= 0) { var langExtension = cs.className.match(/\blang-(\w+)\b/); if (langExtension) { langExtension = langExtension[1]; } var nested = false; for (var p = cs.parentNode; p; p = p.parentNode) { if ((p.tagName === 'pre' || p.tagName === 'code' || p.tagName === 'xmp') && p.className && p.className.indexOf('prettyprint') >= 0) { nested = true; break; } } if (!nested) { var content = getInnerHtml(cs); content = content.replace(/(?:\r\n?|\n)$/, ''); var newContent = prettyPrintOne(content, langExtension); if (!isRawContent(cs)) { cs.innerHTML = newContent; } else { var pre = document.createElement('PRE'); for (var i = 0; i < cs.attributes.length; ++i) { var a = cs.attributes[i]; if (a.specified) { var aname = a.name.toLowerCase(); if (aname === 'class') { pre.className = a.value; } else { pre.setAttribute(a.name, a.value); } } } pre.innerHTML = newContent; cs.parentNode.replaceChild(pre, cs); cs = pre; } if (isIE6 && cs.tagName === 'PRE') { var lineBreaks = cs.getElementsByTagName('br'); for (var j = lineBreaks.length; --j >= 0; ) { var lineBreak = lineBreaks[j]; lineBreak.parentNode.replaceChild(document.createTextNode('\r\n'), lineBreak); } } } } } if (k < elements.length) { setTimeout(doWork, 250); } else if (opt_whenDone) { opt_whenDone(); } } doWork(); } window['PR_normalizedHtml'] = normalizedHtml; window['prettyPrintOne'] = prettyPrintOne; window['prettyPrint'] = prettyPrint; window['PR'] = { 'createSimpleLexer': createSimpleLexer, 'registerLangHandler': registerLangHandler, 'sourceDecorator': sourceDecorator, 'PR_ATTRIB_NAME': PR_ATTRIB_NAME, 'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE, 'PR_COMMENT': PR_COMMENT, 'PR_DECLARATION': PR_DECLARATION, 'PR_KEYWORD': PR_KEYWORD, 'PR_LITERAL': PR_LITERAL, 'PR_NOCODE': PR_NOCODE, 'PR_PLAIN': PR_PLAIN, 'PR_PUNCTUATION': PR_PUNCTUATION, 'PR_SOURCE': PR_SOURCE, 'PR_STRING': PR_STRING, 'PR_TAG': PR_TAG, 'PR_TYPE': PR_TYPE }; })();
\ No newline at end of file +var PR_SHOULD_USE_CONTINUATION = true; var PR_TAB_WIDTH = 8; var PR_normalizedHtml; var PR; var prettyPrintOne; var prettyPrint; function _pr_isIE6() { var isIE6 = navigator && navigator.userAgent && /\bMSIE 6\./.test(navigator.userAgent); _pr_isIE6 = function() { return isIE6; }; return isIE6; } (function() { function wordSet(words) { words = words.split(/ /g); var set = {}; for (var i = words.length; --i >= 0; ) { var w = words[i]; if (w) { set[w] = null; } } return set; } var FLOW_CONTROL_KEYWORDS = "break continue do else for if return while "; var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " + "double enum extern float goto int long register short signed sizeof " + "static struct switch typedef union unsigned void volatile "; var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " + "new operator private protected public this throw true try "; var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " + "concept concept_map const_cast constexpr decltype " + "dynamic_cast explicit export friend inline late_check " + "mutable namespace nullptr reinterpret_cast static_assert static_cast " + "template typeid typename typeof using virtual wchar_t where "; var JAVA_KEYWORDS = COMMON_KEYWORDS + "boolean byte extends final finally implements import instanceof null " + "native package strictfp super synchronized throws transient "; var CSHARP_KEYWORDS = JAVA_KEYWORDS + "as base by checked decimal delegate descending event " + "fixed foreach from group implicit in interface internal into is lock " + "object out override orderby params readonly ref sbyte sealed " + "stackalloc string select uint ulong unchecked unsafe ushort var "; var JSCRIPT_KEYWORDS = COMMON_KEYWORDS + "debugger eval export function get null set undefined var with " + "Infinity NaN "; var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " + "goto if import last local my next no our print package redo require " + "sub undef unless until use wantarray while BEGIN END "; var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " + "elif except exec finally from global import in is lambda " + "nonlocal not or pass print raise try with yield " + "False True None "; var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" + " defined elsif end ensure false in module next nil not or redo rescue " + "retry self super then true undef unless until when yield BEGIN END "; var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " + "function in local set then until "; var ALL_KEYWORDS = (CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS + PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS); var PR_STRING = 'str'; var PR_KEYWORD = 'kwd'; var PR_COMMENT = 'com'; var PR_TYPE = 'typ'; var PR_LITERAL = 'lit'; var PR_PUNCTUATION = 'pun'; var PR_PLAIN = 'pln'; var PR_TAG = 'tag'; var PR_DECLARATION = 'dec'; var PR_SOURCE = 'src'; var PR_ATTRIB_NAME = 'atn'; var PR_ATTRIB_VALUE = 'atv'; var PR_NOCODE = 'nocode'; function isWordChar(ch) { return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'); } function spliceArrayInto(inserted, container, containerPosition, countReplaced) { inserted.unshift(containerPosition, countReplaced || 0); try { container.splice.apply(container, inserted); } finally { inserted.splice(0, 2); } } var REGEXP_PRECEDER_PATTERN = function() { var preceders = ["!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=", "&=", "(", "*", "*=", "+=", ",", "-=", "->", "/", "/=", ":", "::", ";", "<", "<<", "<<=", "<=", "=", "==", "===", ">", ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[", "^", "^=", "^^", "^^=", "{", "|", "|=", "||", "||=", "~", "break", "case", "continue", "delete", "do", "else", "finally", "instanceof", "return", "throw", "try", "typeof"]; var pattern = '(?:' + '(?:(?:^|[^0-9.])\\.{1,3})|' + '(?:(?:^|[^\\+])\\+)|' + '(?:(?:^|[^\\-])-)'; for (var i = 0; i < preceders.length; ++i) { var preceder = preceders[i]; if (isWordChar(preceder.charAt(0))) { pattern += '|\\b' + preceder; } else { pattern += '|' + preceder.replace(/([^=<>:&])/g, '\\$1'); } } pattern += '|^)\\s*$'; return new RegExp(pattern); } (); var pr_amp = /&/g; var pr_lt = /</g; var pr_gt = />/g; var pr_quot = /\"/g; function attribToHtml(str) { return str.replace(pr_amp, '&').replace(pr_lt, '<').replace(pr_gt, '>').replace(pr_quot, '"'); } function textToHtml(str) { return str.replace(pr_amp, '&').replace(pr_lt, '<').replace(pr_gt, '>'); } var pr_ltEnt = /</g; var pr_gtEnt = />/g; var pr_aposEnt = /'/g; var pr_quotEnt = /"/g; var pr_ampEnt = /&/g; var pr_nbspEnt = / /g; function htmlToText(html) { var pos = html.indexOf('&'); if (pos < 0) { return html; } for (--pos; (pos = html.indexOf('&#', pos + 1)) >= 0; ) { var end = html.indexOf(';', pos); if (end >= 0) { var num = html.substring(pos + 3, end); var radix = 10; if (num && num.charAt(0) === 'x') { num = num.substring(1); radix = 16; } var codePoint = parseInt(num, radix); if (!isNaN(codePoint)) { html = (html.substring(0, pos) + String.fromCharCode(codePoint) + html.substring(end + 1)); } } } return html.replace(pr_ltEnt, '<').replace(pr_gtEnt, '>').replace(pr_aposEnt, "'").replace(pr_quotEnt, '"').replace(pr_ampEnt, '&').replace(pr_nbspEnt, ' '); } function isRawContent(node) { return 'XMP' === node.tagName; } function normalizedHtml(node, out) { switch (node.nodeType) { case 1: var name = node.tagName.toLowerCase(); out.push('<', name); for (var i = 0; i < node.attributes.length; ++i) { var attr = node.attributes[i]; if (!attr.specified) { continue; } out.push(' '); normalizedHtml(attr, out); } out.push('>'); for (var child = node.firstChild; child; child = child.nextSibling) { normalizedHtml(child, out); } if (node.firstChild || !/^(?:br|link|img)$/.test(name)) { out.push('<\/', name, '>'); } break; case 2: out.push(node.name.toLowerCase(), '="', attribToHtml(node.value), '"'); break; case 3: case 4: out.push(textToHtml(node.nodeValue)); break; } } var PR_innerHtmlWorks = null; function getInnerHtml(node) { if (null === PR_innerHtmlWorks) { var testNode = document.createElement('PRE'); testNode.appendChild(document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />')); PR_innerHtmlWorks = !/</.test(testNode.innerHTML); } if (PR_innerHtmlWorks) { var content = node.innerHTML; if (isRawContent(node)) { content = textToHtml(content); } return content; } var out = []; for (var child = node.firstChild; child; child = child.nextSibling) { normalizedHtml(child, out); } return out.join(''); } function makeTabExpander(tabWidth) { var SPACES = ' '; var charInLine = 0; return function(plainText) { var out = null; var pos = 0; for (var i = 0, n = plainText.length; i < n; ++i) { var ch = plainText.charAt(i); switch (ch) { case '\t': if (!out) { out = []; } out.push(plainText.substring(pos, i)); var nSpaces = tabWidth - (charInLine % tabWidth); charInLine += nSpaces; for (; nSpaces >= 0; nSpaces -= SPACES.length) { out.push(SPACES.substring(0, nSpaces)); } pos = i + 1; break; case '\n': charInLine = 0; break; default: ++charInLine; } } if (!out) { return plainText; } out.push(plainText.substring(pos)); return out.join(''); }; } var pr_chunkPattern = /(?:[^<]+|<!--[\s\S]*?-->|<!\[CDATA\[([\s\S]*?)\]\]>|<\/?[a-zA-Z][^>]*>|<)/g; var pr_commentPrefix = /^<!--/; var pr_cdataPrefix = /^<\[CDATA\[/; var pr_brPrefix = /^<br\b/i; var pr_tagNameRe = /^<(\/?)([a-zA-Z]+)/; function extractTags(s) { var matches = s.match(pr_chunkPattern); var sourceBuf = []; var sourceBufLen = 0; var extractedTags = []; if (matches) { for (var i = 0, n = matches.length; i < n; ++i) { var match = matches[i]; if (match.length > 1 && match.charAt(0) === '<') { if (pr_commentPrefix.test(match)) { continue; } if (pr_cdataPrefix.test(match)) { sourceBuf.push(match.substring(9, match.length - 3)); sourceBufLen += match.length - 12; } else if (pr_brPrefix.test(match)) { sourceBuf.push('\n'); ++sourceBufLen; } else { if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) { var name = match.match(pr_tagNameRe)[2]; var depth = 1; end_tag_loop: for (var j = i + 1; j < n; ++j) { var name2 = matches[j].match(pr_tagNameRe); if (name2 && name2[2] === name) { if (name2[1] === '/') { if (--depth === 0) { break end_tag_loop; } } else { ++depth; } } } if (j < n) { extractedTags.push(sourceBufLen, matches.slice(i, j + 1).join('')); i = j; } else { extractedTags.push(sourceBufLen, match); } } else { extractedTags.push(sourceBufLen, match); } } } else { var literalText = htmlToText(match); sourceBuf.push(literalText); sourceBufLen += literalText.length; } } } return { source: sourceBuf.join(''), tags: extractedTags }; } function isNoCodeTag(tag) { return !!tag.replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g, ' $1="$2$3$4"').match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/); } function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) { var shortcuts = {}; (function() { var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns); for (var i = allPatterns.length; --i >= 0; ) { var patternParts = allPatterns[i]; var shortcutChars = patternParts[3]; if (shortcutChars) { for (var c = shortcutChars.length; --c >= 0; ) { shortcuts[shortcutChars.charAt(c)] = patternParts; } } } })(); var nPatterns = fallthroughStylePatterns.length; var notWs = /\S/; return function(sourceCode, opt_basePos) { opt_basePos = opt_basePos || 0; var decorations = [opt_basePos, PR_PLAIN]; var lastToken = ''; var pos = 0; var tail = sourceCode; while (tail.length) { var style; var token = null; var match; var patternParts = shortcuts[tail.charAt(0)]; if (patternParts) { match = tail.match(patternParts[1]); token = match[0]; style = patternParts[0]; } else { for (var i = 0; i < nPatterns; ++i) { patternParts = fallthroughStylePatterns[i]; var contextPattern = patternParts[2]; if (contextPattern && !contextPattern.test(lastToken)) { continue; } match = tail.match(patternParts[1]); if (match) { token = match[0]; style = patternParts[0]; break; } } if (!token) { style = PR_PLAIN; token = tail.substring(0, 1); } } decorations.push(opt_basePos + pos, style); pos += token.length; tail = tail.substring(token.length); if (style !== PR_COMMENT && notWs.test(token)) { lastToken = token; } } return decorations; }; } var PR_MARKUP_LEXER = createSimpleLexer([], [[PR_PLAIN, /^[^<]+/, null], [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/, null], [PR_COMMENT, /^<!--[\s\S]*?(?:-->|$)/, null], [PR_SOURCE, /^<\?[\s\S]*?(?:\?>|$)/, null], [PR_SOURCE, /^<%[\s\S]*?(?:%>|$)/, null], [PR_SOURCE, /^<(script|style|xmp)\b[^>]*>[\s\S]*?<\/\1\b[^>]*>/i, null], [PR_TAG, /^<\/?\w[^<>]*>/, null]]); var PR_SOURCE_CHUNK_PARTS = /^(<[^>]*>)([\s\S]*)(<\/[^>]*>)$/; function tokenizeMarkup(source) { var decorations = PR_MARKUP_LEXER(source); for (var i = 0; i < decorations.length; i += 2) { if (decorations[i + 1] === PR_SOURCE) { var start, end; start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; var sourceChunk = source.substring(start, end); var match = sourceChunk.match(PR_SOURCE_CHUNK_PARTS); if (match) { decorations.splice(i, 2, start, PR_TAG, start + match[1].length, PR_SOURCE, start + match[1].length + (match[2] || '').length, PR_TAG); } } } return decorations; } var PR_TAG_LEXER = createSimpleLexer([[PR_ATTRIB_VALUE, /^\'[^\']*(?:\'|$)/, null, "'"], [PR_ATTRIB_VALUE, /^\"[^\"]*(?:\"|$)/, null, '"'], [PR_PUNCTUATION, /^[<>\/=]+/, null, '<>/=']], [[PR_TAG, /^[\w:\-]+/, /^</], [PR_ATTRIB_VALUE, /^[\w\-]+/, /^=/], [PR_ATTRIB_NAME, /^[\w:\-]+/, null], [PR_PLAIN, /^\s+/, null, ' \t\r\n']]); function splitTagAttributes(source, decorations) { for (var i = 0; i < decorations.length; i += 2) { var style = decorations[i + 1]; if (style === PR_TAG) { var start, end; start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; var chunk = source.substring(start, end); var subDecorations = PR_TAG_LEXER(chunk, start); spliceArrayInto(subDecorations, decorations, i, 2); i += subDecorations.length - 2; } } return decorations; } function sourceDecorator(options) { var shortcutStylePatterns = [], fallthroughStylePatterns = []; if (options.tripleQuotedStrings) { shortcutStylePatterns.push([PR_STRING, /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, null, '\'"']); } else if (options.multiLineStrings) { shortcutStylePatterns.push([PR_STRING, /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/, null, '\'"`']); } else { shortcutStylePatterns.push([PR_STRING, /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/, null, '"\'']); } fallthroughStylePatterns.push([PR_PLAIN, /^(?:[^\'\"\`\/\#]+)/, null, ' \r\n']); if (options.hashComments) { shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']); } if (options.cStyleComments) { fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]); fallthroughStylePatterns.push([PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]); } if (options.regexLiterals) { var REGEX_LITERAL = ('^/(?=[^/*])' + '(?:[^/\\x5B\\x5C]' + '|\\x5C[\\s\\S]' + '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+' + '(?:/|$)'); fallthroughStylePatterns.push([PR_STRING, new RegExp(REGEX_LITERAL), REGEXP_PRECEDER_PATTERN]); } var keywords = wordSet(options.keywords); options = null; var splitStringAndCommentTokens = createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns); var styleLiteralIdentifierPuncRecognizer = createSimpleLexer([], [[PR_PLAIN, /^\s+/, null, ' \r\n'], [PR_PLAIN, /^[a-z_$@][a-z_$@0-9]*/i, null], [PR_LITERAL, /^0x[a-f0-9]+[a-z]/i, null], [PR_LITERAL, /^(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d+)(?:e[+\-]?\d+)?[a-z]*/i, null, '123456789'], [PR_PUNCTUATION, /^[^\s\w\.$@]+/, null]]); function splitNonStringNonCommentTokens(source, decorations) { for (var i = 0; i < decorations.length; i += 2) { var style = decorations[i + 1]; if (style === PR_PLAIN) { var start, end, chunk, subDecs; start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; chunk = source.substring(start, end); subDecs = styleLiteralIdentifierPuncRecognizer(chunk, start); for (var j = 0, m = subDecs.length; j < m; j += 2) { var subStyle = subDecs[j + 1]; if (subStyle === PR_PLAIN) { var subStart = subDecs[j]; var subEnd = j + 2 < m ? subDecs[j + 2] : chunk.length; var token = source.substring(subStart, subEnd); if (token === '.') { subDecs[j + 1] = PR_PUNCTUATION; } else if (token in keywords) { subDecs[j + 1] = PR_KEYWORD; } else if (/^@?[A-Z][A-Z$]*[a-z][A-Za-z$]*$/.test(token)) { subDecs[j + 1] = token.charAt(0) === '@' ? PR_LITERAL : PR_TYPE; } } } spliceArrayInto(subDecs, decorations, i, 2); i += subDecs.length - 2; } } return decorations; } return function(sourceCode) { var decorations = splitStringAndCommentTokens(sourceCode); decorations = splitNonStringNonCommentTokens(sourceCode, decorations); return decorations; }; } var decorateSource = sourceDecorator({ keywords: ALL_KEYWORDS, hashComments: true, cStyleComments: true, multiLineStrings: true, regexLiterals: true }); function splitSourceNodes(source, decorations) { for (var i = 0; i < decorations.length; i += 2) { var style = decorations[i + 1]; if (style === PR_SOURCE) { var start, end; start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; var subDecorations = decorateSource(source.substring(start, end)); for (var j = 0, m = subDecorations.length; j < m; j += 2) { subDecorations[j] += start; } spliceArrayInto(subDecorations, decorations, i, 2); i += subDecorations.length - 2; } } return decorations; } function splitSourceAttributes(source, decorations) { var nextValueIsSource = false; for (var i = 0; i < decorations.length; i += 2) { var style = decorations[i + 1]; var start, end; if (style === PR_ATTRIB_NAME) { start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; nextValueIsSource = /^on|^style$/i.test(source.substring(start, end)); } else if (style === PR_ATTRIB_VALUE) { if (nextValueIsSource) { start = decorations[i]; end = i + 2 < decorations.length ? decorations[i + 2] : source.length; var attribValue = source.substring(start, end); var attribLen = attribValue.length; var quoted = (attribLen >= 2 && /^[\"\']/.test(attribValue) && attribValue.charAt(0) === attribValue.charAt(attribLen - 1)); var attribSource; var attribSourceStart; var attribSourceEnd; if (quoted) { attribSourceStart = start + 1; attribSourceEnd = end - 1; attribSource = attribValue; } else { attribSourceStart = start + 1; attribSourceEnd = end - 1; attribSource = attribValue.substring(1, attribValue.length - 1); } var attribSourceDecorations = decorateSource(attribSource); for (var j = 0, m = attribSourceDecorations.length; j < m; j += 2) { attribSourceDecorations[j] += attribSourceStart; } if (quoted) { attribSourceDecorations.push(attribSourceEnd, PR_ATTRIB_VALUE); spliceArrayInto(attribSourceDecorations, decorations, i + 2, 0); } else { spliceArrayInto(attribSourceDecorations, decorations, i, 2); } } nextValueIsSource = false; } } return decorations; } function decorateMarkup(sourceCode) { var decorations = tokenizeMarkup(sourceCode); decorations = splitTagAttributes(sourceCode, decorations); decorations = splitSourceNodes(sourceCode, decorations); decorations = splitSourceAttributes(sourceCode, decorations); return decorations; } function recombineTagsAndDecorations(sourceText, extractedTags, decorations) { var html = []; var outputIdx = 0; var openDecoration = null; var currentDecoration = null; var tagPos = 0; var decPos = 0; var tabExpander = makeTabExpander(PR_TAB_WIDTH); var adjacentSpaceRe = /([\r\n ]) /g; var startOrSpaceRe = /(^| ) /gm; var newlineRe = /\r\n?|\n/g; var trailingSpaceRe = /[ \r\n]$/; var lastWasSpace = true; function emitTextUpTo(sourceIdx) { if (sourceIdx > outputIdx) { if (openDecoration && openDecoration !== currentDecoration) { html.push('</span>'); openDecoration = null; } if (!openDecoration && currentDecoration) { openDecoration = currentDecoration; html.push('<span class="', openDecoration, '">'); } var htmlChunk = textToHtml(tabExpander(sourceText.substring(outputIdx, sourceIdx))).replace(lastWasSpace ? startOrSpaceRe : adjacentSpaceRe, '$1 '); lastWasSpace = trailingSpaceRe.test(htmlChunk); html.push(htmlChunk.replace(newlineRe, '<br />')); outputIdx = sourceIdx; } } while (true) { var outputTag; if (tagPos < extractedTags.length) { if (decPos < decorations.length) { outputTag = extractedTags[tagPos] <= decorations[decPos]; } else { outputTag = true; } } else { outputTag = false; } if (outputTag) { emitTextUpTo(extractedTags[tagPos]); if (openDecoration) { html.push('</span>'); openDecoration = null; } html.push(extractedTags[tagPos + 1]); tagPos += 2; } else if (decPos < decorations.length) { emitTextUpTo(decorations[decPos]); currentDecoration = decorations[decPos + 1]; decPos += 2; } else { break; } } emitTextUpTo(sourceText.length); if (openDecoration) { html.push('</span>'); } return html.join(''); } var langHandlerRegistry = {}; function registerLangHandler(handler, fileExtensions) { for (var i = fileExtensions.length; --i >= 0; ) { var ext = fileExtensions[i]; if (!langHandlerRegistry.hasOwnProperty(ext)) { langHandlerRegistry[ext] = handler; } else if ('console' in window) { console.log('cannot override language handler %s', ext); } } } registerLangHandler(decorateSource, ['default-code']); registerLangHandler(decorateMarkup, ['default-markup', 'html', 'htm', 'xhtml', 'xml', 'xsl']); registerLangHandler(sourceDecorator({ keywords: CPP_KEYWORDS, hashComments: true, cStyleComments: true }), ['c', 'cc', 'cpp', 'cs', 'cxx', 'cyc']); registerLangHandler(sourceDecorator({ keywords: JAVA_KEYWORDS, cStyleComments: true }), ['java']); registerLangHandler(sourceDecorator({ keywords: SH_KEYWORDS, hashComments: true, multiLineStrings: true }), ['bsh', 'csh', 'sh']); registerLangHandler(sourceDecorator({ keywords: PYTHON_KEYWORDS, hashComments: true, multiLineStrings: true, tripleQuotedStrings: true }), ['cv', 'py']); registerLangHandler(sourceDecorator({ keywords: PERL_KEYWORDS, hashComments: true, multiLineStrings: true, regexLiterals: true }), ['perl', 'pl', 'pm']); registerLangHandler(sourceDecorator({ keywords: RUBY_KEYWORDS, hashComments: true, multiLineStrings: true, regexLiterals: true }), ['rb']); registerLangHandler(sourceDecorator({ keywords: JSCRIPT_KEYWORDS, cStyleComments: true, regexLiterals: true }), ['js']); function prettyPrintOne(sourceCodeHtml, opt_langExtension) { try { var sourceAndExtractedTags = extractTags(sourceCodeHtml); var source = sourceAndExtractedTags.source; var extractedTags = sourceAndExtractedTags.tags; if (!langHandlerRegistry.hasOwnProperty(opt_langExtension)) { opt_langExtension = /^\s*</.test(source) ? 'default-markup' : 'default-code'; } var decorations = langHandlerRegistry[opt_langExtension].call({}, source); return recombineTagsAndDecorations(source, extractedTags, decorations); } catch (e) { if ('console' in window) { console.log(e); console.trace(); } return sourceCodeHtml; } } function prettyPrint(opt_whenDone) { var isIE6 = _pr_isIE6(); var codeSegments = [document.getElementsByTagName('pre'), document.getElementsByTagName('code'), document.getElementsByTagName('xmp')]; var elements = []; for (var i = 0; i < codeSegments.length; ++i) { for (var j = 0; j < codeSegments[i].length; ++j) { elements.push(codeSegments[i][j]); } } codeSegments = null; var k = 0; function doWork() { var endTime = (PR_SHOULD_USE_CONTINUATION ? new Date().getTime() + 250 : Infinity); for (; k < elements.length && new Date().getTime() < endTime; k++) { var cs = elements[k]; if (cs.className && cs.className.indexOf('prettyprint') >= 0) { var langExtension = cs.className.match(/\blang-(\w+)\b/); if (langExtension) { langExtension = langExtension[1]; } var nested = false; for (var p = cs.parentNode; p; p = p.parentNode) { if ((p.tagName === 'pre' || p.tagName === 'code' || p.tagName === 'xmp') && p.className && p.className.indexOf('prettyprint') >= 0) { nested = true; break; } } if (!nested) { var content = getInnerHtml(cs); content = content.replace(/(?:\r\n?|\n)$/, ''); var newContent = prettyPrintOne(content, langExtension); if (!isRawContent(cs)) { cs.innerHTML = newContent; } else { var pre = document.createElement('PRE'); for (var i = 0; i < cs.attributes.length; ++i) { var a = cs.attributes[i]; if (a.specified) { var aname = a.name.toLowerCase(); if (aname === 'class') { pre.className = a.value; } else { pre.setAttribute(a.name, a.value); } } } pre.innerHTML = newContent; cs.parentNode.replaceChild(pre, cs); cs = pre; } if (isIE6 && cs.tagName === 'PRE') { var lineBreaks = cs.getElementsByTagName('br'); for (var j = lineBreaks.length; --j >= 0; ) { var lineBreak = lineBreaks[j]; lineBreak.parentNode.replaceChild(document.createTextNode('\r\n'), lineBreak); } } } } } if (k < elements.length) { setTimeout(doWork, 250); } else if (opt_whenDone) { opt_whenDone(); } } doWork(); } window['PR_normalizedHtml'] = normalizedHtml; window['prettyPrintOne'] = prettyPrintOne; window['prettyPrint'] = prettyPrint; window['PR'] = { 'createSimpleLexer': createSimpleLexer, 'registerLangHandler': registerLangHandler, 'sourceDecorator': sourceDecorator, 'PR_ATTRIB_NAME': PR_ATTRIB_NAME, 'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE, 'PR_COMMENT': PR_COMMENT, 'PR_DECLARATION': PR_DECLARATION, 'PR_KEYWORD': PR_KEYWORD, 'PR_LITERAL': PR_LITERAL, 'PR_NOCODE': PR_NOCODE, 'PR_PLAIN': PR_PLAIN, 'PR_PUNCTUATION': PR_PUNCTUATION, 'PR_SOURCE': PR_SOURCE, 'PR_STRING': PR_STRING, 'PR_TAG': PR_TAG, 'PR_TYPE': PR_TYPE }; })(); diff --git a/templates/content/js/com.cnprog.utils.js b/templates/content/js/com.cnprog.utils.js index 683b7a3f..e271ed78 100644 --- a/templates/content/js/com.cnprog.utils.js +++ b/templates/content/js/com.cnprog.utils.js @@ -119,4 +119,4 @@ var CPValidator = function(){ }(); //Search Engine Keyword Highlight with Javascript //http://scott.yang.id.au/code/se-hilite/ -Hilite={elementid:"content",exact:true,max_nodes:1000,onload:true,style_name:"hilite",style_name_suffix:true,debug_referrer:""};Hilite.search_engines=[["local","q"],["cnprog\\.","q"],["google\\.","q"],["search\\.yahoo\\.","p"],["search\\.msn\\.","q"],["search\\.live\\.","query"],["search\\.aol\\.","userQuery"],["ask\\.com","q"],["altavista\\.","q"],["feedster\\.","q"],["search\\.lycos\\.","q"],["alltheweb\\.","q"],["technorati\\.com/search/([^\\?/]+)",1],["dogpile\\.com/info\\.dogpl/search/web/([^\\?/]+)",1,true]];Hilite.decodeReferrer=function(d){var g=null;var e=new RegExp("");for(var c=0;c<Hilite.search_engines.length;c++){var f=Hilite.search_engines[c];e.compile("^http://(www\\.)?"+f[0],"i");var b=d.match(e);if(b){var a;if(isNaN(f[1])){a=Hilite.decodeReferrerQS(d,f[1])}else{a=b[f[1]+1]}if(a){a=decodeURIComponent(a);if(f.length>2&&f[2]){a=decodeURIComponent(a)}a=a.replace(/\'|"/g,"");a=a.split(/[\s,\+\.]+/);return a}break}}return null};Hilite.decodeReferrerQS=function(f,d){var b=f.indexOf("?");var c;if(b>=0){var a=new String(f.substring(b+1));b=0;c=0;while((b>=0)&&((c=a.indexOf("=",b))>=0)){var e,g;e=a.substring(b,c);b=a.indexOf("&",c)+1;if(e==d){if(b<=0){return a.substring(c+1)}else{return a.substring(c+1,b-1)}}else{if(b<=0){return null}}}}return null};Hilite.hiliteElement=function(f,e){if(!e||f.childNodes.length==0){return}var c=new Array();for(var b=0;b<e.length;b++){e[b]=e[b].toLowerCase();if(Hilite.exact){c.push("\\b"+e[b]+"\\b")}else{c.push(e[b])}}c=new RegExp(c.join("|"),"i");var a={};for(var b=0;b<e.length;b++){if(Hilite.style_name_suffix){a[e[b]]=Hilite.style_name+(b+1)}else{a[e[b]]=Hilite.style_name}}var d=function(m){var j=c.exec(m.data);if(j){var n=j[0];var i="";var h=m.splitText(j.index);var g=h.splitText(n.length);var l=m.ownerDocument.createElement("SPAN");m.parentNode.replaceChild(l,h);l.className=a[n.toLowerCase()];l.appendChild(h);return l}else{return m}};Hilite.walkElements(f.childNodes[0],1,d)};Hilite.hilite=function(){var a=Hilite.debug_referrer?Hilite.debug_referrer:document.referrer;var b=null;a=Hilite.decodeReferrer(a);if(a&&((Hilite.elementid&&(b=document.getElementById(Hilite.elementid)))||(b=document.body))){Hilite.hiliteElement(b,a)}};Hilite.walkElements=function(d,f,e){var a=/^(script|style|textarea)/i;var c=0;while(d&&f>0){c++;if(c>=Hilite.max_nodes){var b=function(){Hilite.walkElements(d,f,e)};setTimeout(b,50);return}if(d.nodeType==1){if(!a.test(d.tagName)&&d.childNodes.length>0){d=d.childNodes[0];f++;continue}}else{if(d.nodeType==3){d=e(d)}}if(d.nextSibling){d=d.nextSibling}else{while(f>0){d=d.parentNode;f--;if(d.nextSibling){d=d.nextSibling;break}}}}};if(Hilite.onload){if(window.attachEvent){window.attachEvent("onload",Hilite.hilite)}else{if(window.addEventListener){window.addEventListener("load",Hilite.hilite,false)}else{var __onload=window.onload;window.onload=function(){Hilite.hilite();__onload()}}}};
\ No newline at end of file +Hilite={elementid:"content",exact:true,max_nodes:1000,onload:true,style_name:"hilite",style_name_suffix:true,debug_referrer:""};Hilite.search_engines=[["local","q"],["cnprog\\.","q"],["google\\.","q"],["search\\.yahoo\\.","p"],["search\\.msn\\.","q"],["search\\.live\\.","query"],["search\\.aol\\.","userQuery"],["ask\\.com","q"],["altavista\\.","q"],["feedster\\.","q"],["search\\.lycos\\.","q"],["alltheweb\\.","q"],["technorati\\.com/search/([^\\?/]+)",1],["dogpile\\.com/info\\.dogpl/search/web/([^\\?/]+)",1,true]];Hilite.decodeReferrer=function(d){var g=null;var e=new RegExp("");for(var c=0;c<Hilite.search_engines.length;c++){var f=Hilite.search_engines[c];e.compile("^http://(www\\.)?"+f[0],"i");var b=d.match(e);if(b){var a;if(isNaN(f[1])){a=Hilite.decodeReferrerQS(d,f[1])}else{a=b[f[1]+1]}if(a){a=decodeURIComponent(a);if(f.length>2&&f[2]){a=decodeURIComponent(a)}a=a.replace(/\'|"/g,"");a=a.split(/[\s,\+\.]+/);return a}break}}return null};Hilite.decodeReferrerQS=function(f,d){var b=f.indexOf("?");var c;if(b>=0){var a=new String(f.substring(b+1));b=0;c=0;while((b>=0)&&((c=a.indexOf("=",b))>=0)){var e,g;e=a.substring(b,c);b=a.indexOf("&",c)+1;if(e==d){if(b<=0){return a.substring(c+1)}else{return a.substring(c+1,b-1)}}else{if(b<=0){return null}}}}return null};Hilite.hiliteElement=function(f,e){if(!e||f.childNodes.length==0){return}var c=new Array();for(var b=0;b<e.length;b++){e[b]=e[b].toLowerCase();if(Hilite.exact){c.push("\\b"+e[b]+"\\b")}else{c.push(e[b])}}c=new RegExp(c.join("|"),"i");var a={};for(var b=0;b<e.length;b++){if(Hilite.style_name_suffix){a[e[b]]=Hilite.style_name+(b+1)}else{a[e[b]]=Hilite.style_name}}var d=function(m){var j=c.exec(m.data);if(j){var n=j[0];var i="";var h=m.splitText(j.index);var g=h.splitText(n.length);var l=m.ownerDocument.createElement("SPAN");m.parentNode.replaceChild(l,h);l.className=a[n.toLowerCase()];l.appendChild(h);return l}else{return m}};Hilite.walkElements(f.childNodes[0],1,d)};Hilite.hilite=function(){var a=Hilite.debug_referrer?Hilite.debug_referrer:document.referrer;var b=null;a=Hilite.decodeReferrer(a);if(a&&((Hilite.elementid&&(b=document.getElementById(Hilite.elementid)))||(b=document.body))){Hilite.hiliteElement(b,a)}};Hilite.walkElements=function(d,f,e){var a=/^(script|style|textarea)/i;var c=0;while(d&&f>0){c++;if(c>=Hilite.max_nodes){var b=function(){Hilite.walkElements(d,f,e)};setTimeout(b,50);return}if(d.nodeType==1){if(!a.test(d.tagName)&&d.childNodes.length>0){d=d.childNodes[0];f++;continue}}else{if(d.nodeType==3){d=e(d)}}if(d.nextSibling){d=d.nextSibling}else{while(f>0){d=d.parentNode;f--;if(d.nextSibling){d=d.nextSibling;break}}}}};if(Hilite.onload){if(window.attachEvent){window.attachEvent("onload",Hilite.hilite)}else{if(window.addEventListener){window.addEventListener("load",Hilite.hilite,false)}else{var __onload=window.onload;window.onload=function(){Hilite.hilite();__onload()}}}}; diff --git a/templates/content/style/openid.css b/templates/content/style/openid.css index 7a892840..0d201df2 100644 --- a/templates/content/style/openid.css +++ b/templates/content/style/openid.css @@ -42,4 +42,4 @@ } .openid_selected { border: 4px solid #DDD; - }
\ No newline at end of file + } diff --git a/templates/content/style/style.css b/templates/content/style/style.css index 1cd5d438..fa20b014 100644 --- a/templates/content/style/style.css +++ b/templates/content/style/style.css @@ -2,13 +2,15 @@ @import url(/content/style/openid.css); @import url(/content/style/prettify.css); /* 公用 */ -body{background:#FFF; font-size:12px; line-height:150%; margin:0; padding:0; color:#000; font-family: "segoe ui",Helvetica,微软雅黑,宋体,Tahoma,Verdana,MingLiu,PMingLiu,Arial,sans-serif; +body{background:#FFF; font-size:12px; line-height:150%; margin:0; padding:0; color:#000; font-family: sans-serif; } div{margin:0 auto; padding:0;} h1,h2,h3,h4,h5,h6,ul,li,dl,dt,dd,form,img,p{margin:0; padding:0; border:none; } input, select {font-family:Trebuchet MS,"segoe ui",Helvetica,"Microsoft YaHei",宋体,Tahoma,Verdana,MingLiu,PMingLiu,Arial,sans-serif;} -p{margin-bottom:4px; font-size:13px; line-height:160%;} +p{margin-bottom:13px; font-size:13px; line-height:140%;} a {color:#333333; text-decoration:none;} + +.badges a {color:#763333;text-decoration:underline;} a:hover {text-decoration:underline;} .block{width:960px; height:auto;} .fleft{float:left;} @@ -76,45 +78,55 @@ blockquote /*页面布局*/ #wrapper {width:960px;margin:auto;padding:0;} -#roof {margin-top:0px;background:#FFF;} -#room {padding-top:10px;background-color:#FFF;border-bottom:1px solid #777;} -#CALeft{width:700px; float:left; position:relative;padding-left:5px} -#CARight{width:240px; float:right; padding-right:5px} +#roof { + position:relative; + margin-top:0px; + background:#FFF; +} +#room {padding:10px 0 10px 0;background-color:#FFF;border-bottom:1px solid #777;} +#CALeft{width:710px; float:left; position:relative;} +#CARight{width:240px; float:right;} #CAFull{float:left;padding:0 5px 0 5px;width:950px;} -#ground {width:100%;border-top:1px solid #000; padding-top:6px; padding-bottom:10px; text-align:center;background:#777;} -/*#licenseLogo {top:10px;right:10px;}*/ +#ground {width:100%;border-top:1px solid #000; padding-top:6px; padding-bottom:0px; text-align:center;background:#777;} +/*#licenseLogo {position:absolute;top:10px;right:10px;}*/ /*顶部及导航栏*/ -#top {height:20px; text-align:right; padding:3px;background-color:#ffffff;} -#header {width:960px;} +#top { + position:absolute; + top:0px; + right:0px; + height:20px; + text-align:right; + color:black; + padding:3px; + background-color:#ffffff; + width:500px; +} +/*#header {width:960px;}*/ #top a {height:35px; text-align:right; /*letter-spacing:1px; */ margin-left:20px;text-decoration:underline; font-size:12px; color:#333333;} -#logo {padding:5px;} +#logo { + padding: 5px 0px 0px 0px; + margin-bottom:-3px; +} #navBar {float:clear;position:relative;display:block;width:960px;} #navBar .nav {margin:20px 0px 0px 16px; /*letter-spacing:1px; */ } -#navBar .nav a {color:#333; background-color:#F9F7ED; - border-bottom: none; - border-left: 1px solid #aaaaaa; - border-right: 1px solid #aaaaaa; - border-top: 1px solid #aaaaaa; - padding:0px 12px 3px 12px; height:25px; line-height:30px;margin-left:10px; font-size:15px; font-weight:400; text-decoration:none;display: block;float: left;} +#navBar .nav a {color:#333333; background-color:#F9F7ED; + border: 1px solid #aaaaaa; + border-bottom: none; + padding:0px 12px 3px 12px; height:25px; line-height:30px;margin-left:10px; font-size:14px; font-weight:400; text-decoration:none;display: block;float: left;} #navBar .nav a:hover {text-decoration:underline} -#navBar .nav a.on {height:24px;line-height:28px; - border-top:1px solid #e66222; - border-bottom: 1px solid #d64000; - border-right:1px solid #e66222; - border-left:1px solid #e66222; - /*background:#A31E39; */ - background:#d64000; - color:#FFF; font-weight:600; text-decoration:none} +#navBar .nav a.on {height:24px;line-height:28px;border:1px solid #d64000; background:#B02B2C; color:#FFF; font-weight:600; text-decoration:none} #navBar .nav a.special {font-size:15px; color:#B02B2C; font-weight:bold; text-decoration:none; } #navBar .nav a.special:hover {text-decoration:underline;} #navBar .nav div.focus {float:right; padding-right:0px;} /*搜索栏*/ -#searchBar {background-color:#9db2b1;padding:5px;} /* #B02B2C */ +#searchBar { + background-color:#9db2b1;/*#e9b96e;*/ + padding:5px 0 0 0;} /* #B02B2C */ #searchBar .content { } #searchBar .searchInput {font-size:13px; height:18px; width:400px;} #searchBar .searchBtn {font-size:14px; height:26px; width:80px;} @@ -130,9 +142,7 @@ blockquote #listA .qstA thumb {float:left; } #listA .qstA H2 {font-size:15px; font-weight:800; margin:8px auto;padding:0px;} #listA .qstA H2 a {color:#663333; } -#listA .qstA .stat {font-size:13px; - /*letter-spacing:1px;*/ - float:right;} +#listA .qstA .stat {font-size:13px;letter-spacing:1px;float:right;} #listA .qstA .stat span {margin-right:5px;} #listA .qstA .stat td {min-width:40px;text-align:center;} #listA .qstA .stat .num {font-family:arial;color:#905213; font-size:20px; font-weight:800;} @@ -146,8 +156,9 @@ blockquote #listA .qstA .author {font-weight:400; } #listA .qstA .author a{ } #listA .qstA .summary{margin-right:5px;} + .evenMore {font-size:14px; font-weight:800;} -.questions-count{font-size:32px;font-family:arial;font-weight:600;padding:5px;color:#777;} +.questions-count{font-size:32px;font-family:sans-serif;font-weight:600;padding:0 0 5px 7px;color:#a40000;} /*内容块*/ .boxA {background:#777; padding:6px; margin-bottom:8px;} @@ -166,13 +177,13 @@ blockquote /** PAGINATOR **/ .paginator { padding:5px 0 10px 0; - font:normal 12px arial; + font:normal 12px sans-serif; } .paginator .prev-na, .paginator .next-na { padding:.3em; - font:bold .875em arial; + font:bold .875em sans-serif; } .paginator .prev-na, @@ -189,7 +200,7 @@ blockquote background-color:#fff; color:#777; padding:.3em; - font:bold 100% arial; + font:bold 100% sans-serif; } .paginator .prev, .paginator .prev-na { margin-right:.5em; } @@ -224,7 +235,7 @@ blockquote .paginator .text{ color:#777; padding:.3em; - font:bold 100% arial; + font:bold 100% sans-serif; } .paginator-container{ @@ -237,11 +248,14 @@ blockquote } /*标签*/ -.tag {font-size:100%; font-weight:normal; color:#333; text-decoration:none;background-color:#EEE; border-left:3px solid #777; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:1px 8px 1px 8px;} -.tags {font-family:arial; line-height:200%; display:block; margin-top:5px;} -.tags a {font-size:100%; font-weight:normal; color:#333; text-decoration:none;background-color:#EEE; border-left:3px solid #777; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:1px 8px 1px 8px;} +.tag {font-size:13px; font-weight:normal; color:#333; text-decoration:none;background-color:#EEE; border-left:3px solid #777; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:1px 8px 1px 8px;} +.tags {font-family:sans-serif; line-height:200%; display:block; margin-top:5px;} +.tags a {font-size:13px; font-weight:normal; color:#333; text-decoration:none;background-color:#EEE; border-left:3px solid #777; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:1px 8px 1px 8px;} .tags a:hover {background-color:#fFF;color:#333;} -.tag-number {font-weight:700;font-family:arial;} +.tagsbox {line-height:200%;} +.tagsbox a {font-size:13px; font-weight:normal; color:#333; text-decoration:none;background-color:#EEE; border-left:3px solid #777; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:1px 8px 1px 8px;} +.tagsbox a:hover {background-color:#fFF;color:#333;} +.tag-number {font-weight:700;font-family:sans-serif;} /*奖牌*/ a.medal { font-size:14px; line-height:250%; font-weight:800; color:#333; text-decoration:none; background:url(/content/images/medala.gif) no-repeat; border-left:1px solid #EEE; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:4px 12px 4px 6px;} @@ -291,9 +305,7 @@ a:hover.medal {color:#333; text-decoration:none; background:url(/content/images .headMedals {float:left; height:23px; line-height:23px; margin:5px 0 0 5px;padding:0px 6px 0px 15px; font-size:15px; font-weight:700; border-bottom:0px solid #777; border-left:0px solid #darkred; background-color:#FFF;background:url(/content/images/dot-list.gif) no-repeat left center;} .headLogin {float:left; padding:3px; font-size:15px; font-weight:800; background:url(/content/images/ico_login.gif) no-repeat; padding-left:24px;} .headNormal {text-align:left;padding:3px; font-size:15px; margin-bottom:12px; font-weight:800;border-bottom:1px solid #777;} -.headUser {text-align:left;padding:5px; font-size:20px; - /*letter-spacing:1px;*/ - margin-bottom:12px; font-weight:800;border-bottom:1px solid #777;} +.headUser {text-align:left;padding:5px; font-size:20px; letter-spacing:1px;margin-bottom:12px; font-weight:800;border-bottom:1px solid #777;} /*RSS订阅*/ #feeds {margin:10px 0; } #feeds a {background:url(/content/images/feed-icon-small.png) no-repeat 0; padding-left:18px; font-weight:700; font-size:13px; } @@ -322,7 +334,11 @@ a:hover.medal {color:#333; text-decoration:none; background:url(/content/images max-width:600px; } .question-mark{ - background-color:#E9E9FF; + /*background-color:#fff5e0; + border-top: 1px solid #eeeeec; + border-right: 1px solid #babdb6; + border-bottom: 1px solid #babdb6; + border-left: 1px solid #eeeeec;*/ text-align:left; padding:5px; overflow:hidden; @@ -411,6 +427,7 @@ div.comments { div.post-comments{ width:100%; + margin-bottom:10px; } form.post-comments textarea { @@ -433,6 +450,9 @@ span.form-error { font-weight:normal; margin-left:5px; } +p.form-item { + margin:0px; +} div.comments-container, div.comments-container-accepted, div.comments-container-owner, div.comments-container-deleted { display:none; @@ -473,11 +493,8 @@ a.comment-user:hover { /*回答*/ #answers {} .answer{ - border-bottom:1px dotted #666666; - padding-bottom:20px; - padding-top:20px; + padding-top:10px; width: 100%; - margin-bottom:10px; } .answer-body{ min-height:80px; @@ -511,7 +528,7 @@ a.comment-user:hover { .answered-accepted { background: #CCC; - color: #663333; + color: #763333; } .unanswered @@ -547,10 +564,11 @@ a.comment-user:hover { } /*标签列表*/ +/* .tagsbox {} -.tagsbox a {color:#000;line-height:30px;margin-right:10px;font-size:100%;background-color:#F9F7ED;padding:3px;} -.tagsbox a:hover {text-decoration:none;background-color:#F9F7CD;color:#B02B2C;} -.tagsList {margin:0; list-style-type:none;padding:0px;min-height:360px;} +.tagsbox a {color:#000;line-height:30px;margin-right:10px;font-size:100%;background-color:#F9F7ED;padding:3px;border:1px solid #aaaaaa;} +.tagsbox a:hover {text-decoration:none;background-color:#F9F7ED;color:#B02B2C;} */ +.tagsList {margin:0; list-style-type:none;padding:0px;min-height:360px;} .tagsList li {width:235px; float:left;} .badge-list{margin:0; list-style-type:none;} /*登录*/ @@ -563,7 +581,12 @@ a.comment-user:hover { .error{color:red;} .error-list li{padding:5px;} .login{margin-bottom:10px;} -.fieldset{border:solid 1px #777;margin-top:10px;padding:10px;} +.fieldset{ +/* border:solid 1px #777;*/ + border: none; + margin-top:10px; + padding:10px; +} .openid-input{background:url(/content/images/openid.gif) no-repeat;padding-left:15px;cursor:pointer;} .openid-login-input{ background-position:center left; @@ -701,7 +724,7 @@ span.form-error { .revision-number{ font-size:300%; font-weight:bold; - font-family:arial; + font-family:sans-serif; } .revision .body{ @@ -913,7 +936,7 @@ div.started .reputation-score { padding:3px; font-weight:bold; background-color:#CCC; - color:#663333; + color:#763333; } .revision-summary{ @@ -992,8 +1015,21 @@ ul.bulleta li {background:url(/content/images/bullet_green.gif) no-repeat 0px 2p .user ul {margin:0; list-style-type:none;} .user .thumb{clear:both;float:left; margin-right:4px; display:inline;} .yellowbg{background:yellow;} -.subtitle{line-height:30px;font-size:15px; font-weight:700;} -.message{padding:5px;font-weight:bold;background-color:#eee;margin:10px 0 10px 0;} + +.message{ + padding:5px; + margin:10px 0 10px 0; + background-color:#eee; + border: 1px solid #aaaaaa; +} +.message h1 { + padding-top:0px; + font-size:15px; +} +.message p { + margin-bottom:0px; +} + .warning{color:red;} .darkred{color:darkred;} .submit{ @@ -1015,30 +1051,68 @@ ul.bulleta li {background:url(/content/images/bullet_green.gif) no-repeat 0px 2p left: 0px; width: 100%; z-index: 100; - padding: 7px 0 5px 0; + padding: 0; text-align: center; - font-size: 130%; font-weight: Bold; color: #444; background-color: #F4A83D; } - -.notify span -{ - float: left; - width: 95%; - text-align: center; +.notify p { + margin-top:5px; + margin-bottom:5px; + font-size:16px; } - -.close-notify +#close-notify { - float: right; - margin-right: 20px; + position:absolute; + right:5px; + top:5px; + padding:0 3px 0 3px; color: #735005; text-decoration: none; + font-size:14px; + line-height:18px; background-color: #FAD163; border: 2px #735005 solid; - padding-left: 3px; - padding-right: 3px; cursor:pointer; } +#close-notify:hover { + text-decoration:none; +} + +.big { + font-size:15px; +} +.bigger { + font-size:14px; +} +.strong { + font-weight:bold; +} +.orange +{ + color:#d64000; + font-weight:bold; +} + +.about div { + padding:10px 5px 10px 5px; + border-top:1px dashed #aaaaaa; +} +.about div.first { + padding-top:0; + border-top:none; +} +.about p { + margin-bottom:10px; +} +.about a {color:#d64000;text-decoration:underline;} +.about h3{ + line-height:30px; + font-size:15px; + font-weight:700; + padding-top: 0px; +} +.highlight { + background-color:#FFF8C6; +} diff --git a/templates/faq.html b/templates/faq.html index 253d3590..78c433ae 100644 --- a/templates/faq.html +++ b/templates/faq.html @@ -10,104 +10,139 @@ <div class="headNormal"> {% trans "Frequently Asked Questions " %}(FAQ) </div> -<div id="main-body" style="width:100%"> - - <h3 class="subtitle">{% trans "What kinds of questions can I ask here?" %}</h3> - <p>{% trans "Most importanly - questions should be <strong>relevant</strong> to this community." %}<br> - {% trans "Before asking the question - please make sure to use search to see whether your question has alredy been answered."%}<br> - </p><br> - - <h3 class="subtitle">{% trans "What questions should I avoid asking?" %}</h3> - <p>{% trans "Please avoid asking questions that are not relevant to this community, too subjective and argumentative." %}</p> - </p><br> - - <h3 class="subtitle">{% trans "What should I avoid in my answers?" %}</h3> - <p>{% trans "site title" %} {% trans "is a Q&A site, not a discussion group. Therefore - please avoid having discussions in your answers, comment facility allows some space for brief discussions." %} - </p><br> +<div id="main-body" class="about" style="width:100%"> + + <div class="first"> + <h3 class="subtitle">{% trans "What kinds of questions can I ask here?" %}</h3> + <p>{% trans "Most importanly - questions should be <strong>relevant</strong> to this community." %} + {% trans "Before asking the question - please make sure to use search to see whether your question has alredy been answered."%} + </p> + + <h3 class="subtitle">{% trans "What questions should I avoid asking?" %}</h3> + <p>{% trans "Please avoid asking questions that are not relevant to this community, too subjective and argumentative." %}</p> + </p> + </div> - <h3 class="subtitle">{% trans "Who moderates this community?" %}</h3> - <p>{% trans "The short answer is: <strong>you</strong>." %}<br> - {% trans "This website is moderated by the users." %} - {% trans "The reputation system allows users earn the authorization to perform a variety of moderation tasks." %} - </p><br> + <div> + <h3 class="subtitle">{% trans "What should I avoid in my answers?" %}</h3> + <p>{% trans "site title" %} {% trans "is a Q&A site, not a discussion group. Therefore - please avoid having discussions in your answers, comment facility allows some space for brief discussions." %}</p> + </div> - <h3 class="subtitle">{% trans "How does reputation system work?" %}</h3> - <p>{% trans "Anyone can ask questions and give answers, points are not necessary for that." %}<br> - {% trans "As we've said before, users help running this site. Point system helps select users who can administer this community."%} - {% trans "Reputation points roughly measure how community trusts you. These points are given to you directly by other members of the community." %} - </p> - <p> - {% trans "For example, if you ask an interesting question or give a helpful answer, your input will be upvoted and you will gain more trust in the community." %} - {% trans "If on the other hand someone gives a misleading answer, the answer will be voted down and he/she loses some points." %} - {% trans "Each vote in favor will generate <strong>10</strong> points, each vote against will subtract <strong>2</strong> points." %} - {% trans "Through the votes of other people you can accumulate a maximum of <strong>200</strong> points." %} - {% trans "After accumulating certain number of points, you can do more:" %} - <table style="font-family:arial;" cellspacing="3" cellpadding="3"> - <tr> - <th width="40px" style="text-align:right"></th> - <th width="300px"></th> - </tr> - <tr> - <td style="text-align:right;padding-right:5px"><strong>15</strong></td> - <td>{% trans "upvote" %}</td> - </tr> - <tr> - <td style="text-align:right;padding-right:5px"><strong>15</strong></td> - <td>{% trans "use tags" %}</td> - </tr> - <tr> - <td style="text-align:right;padding-right:5px"><strong>50</strong></td> - <td>{% trans "add comments" %}</td> - </tr> - <tr> - <td style="text-align:right;padding-right:5px"><strong>100</strong></td> - <td>{% trans "downvote" %}</td> - </tr><tr> - <td style="text-align:right;padding-right:5px"><strong>250</strong></td> - <td>打开关闭自己的问题</td> - </tr> - <tr> - <td style="text-align:right;padding-right:5px"><strong>500</strong></td> - <td>{% trans "retag questions" %}</td> - </tr> - <tr> - <td style="text-align:right;padding-right:5px"><strong>750</strong></td> - <td>{% trans "edit community wiki questions" %}</td> - </tr> - <tr> - <td style="text-align:right;padding-right:5px"><strong>2000</strong></td> - <td>{% trans "edit any answer" %}</td> - </tr> - <tr> - <td style="text-align:right;padding-right:5px"><strong>3000</strong></td> - <td>{% trans "open any closed question" %}</td> - </tr> - <tr> - <td style="text-align:right;padding-right:5px"><strong>5000</strong></td> - <td>{% trans "delete any comment" %}</td> - </tr> - <tr> - <td style="text-align:right;padding-right:5px"><strong>10000</strong></td> - <td>{% trans "delete any questions and answers and perform other moderation tasks" %}</td> - </tr> + <div> + <h3 class="subtitle">{% trans "Who moderates this community?" %}</h3> + <p>{% trans "The short answer is: <strong>you</strong>." %} + {% trans "This website is moderated by the users." %} + {% trans "The reputation system allows users earn the authorization to perform a variety of moderation tasks." %} + </p> + </div> + + <div> + <h3 class="subtitle">{% trans "How does reputation system work?" %}</h3> + <p>{% trans "Rep system summary" %}</p> + <p> + For example, if you ask an interesting question or give a helpful answer, your input will be upvoted. + On the other hand if the answer is misleading - it will be downvoted. + Each vote in favor will generate <strong>10</strong> points, each vote against will subtract <strong>2</strong> points. + There is a limit of <strong>200</strong> points that can be accumulated per question or answer. + + The table below explains reputation point requirements for each type of moderation task. + </p> + + <table style="font-family:arial;" cellspacing="3" cellpadding="3"> + <tr> + <th width="40px" style="text-align:right"></th> + <th width="300px"></th> + </tr> + <!-- + <tr> + <td style="text-align:right;padding-right:5px"><strong>15</strong></td> + <td>{% trans "upvote" %}</td> + </tr> + <tr> + <td style="text-align:right;padding-right:5px"><strong>15</strong></td> + <td>{% trans "use tags" %}</td> + </tr> + --> + <tr> + <td style="text-align:right;padding-right:5px"><strong>50</strong></td> + <td>{% trans "add comments" %}</td> + </tr> + <tr> + <td style="text-align:right;padding-right:5px"><strong>100</strong></td> + <td>{% trans "downvote" %}</td> + </tr><tr> + <td style="text-align:right;padding-right:5px"><strong>250</strong></td> + <td>{% trans "open and close own questions" %}</td> + </tr> + <tr> + <td style="text-align:right;padding-right:5px"><strong>500</strong></td> + <td>{% trans "retag questions" %}</td> + </tr> + <tr> + <td style="text-align:right;padding-right:5px"><strong>750</strong></td> + <td>{% trans "edit community wiki questions" %}</td> + </tr> + <tr> + <td style="text-align:right;padding-right:5px"><strong>2000</strong></td> + <td>{% trans "edit any answer" %}</td> + </tr> + <tr> + <td style="text-align:right;padding-right:5px"><strong>3000</strong></td> + <td>{% trans "open any closed question" %}</td> + </tr> + <tr> + <td style="text-align:right;padding-right:5px"><strong>5000</strong></td> + <td>{% trans "delete any comment" %}</td> + </tr> + <tr> + <td style="text-align:right;padding-right:5px"><strong>10000</strong></td> + <td>{% trans "delete any questions and answers and perform other moderation tasks" %}</td> + </tr> - </table> - - </p><br> - - <h3 class="subtitle">{% trans "To register, do I need to create new password?" %}</h3> - <p>{% trans "No, you don't have to. You can login through any service that supports OpenID, e.g. Google, Yahoo, AOL, etc." %} - <strong><a href="/account/signin">{% trans "Login now!" %}</a> »</strong> - </p><br> + </table> + </div> + {% ifequal settings.EMAIL_VALIDATION 'on' %} + <div> + <a id='validate'></a><h3 class="subtitle">{% trans "how to validate email title" %}</h3> + <!--special case here message must contain paragraphs--> + {% trans "how to validate email info" %} + </div> + {% endifequal %} + <div> + <a id='gravatar'></a><h3 class="subtitle">{% trans "what is gravatar" %}</h3> + <p>{% trans "gravatar faq info" %}</p> + </div> + <div> + <h3 class="subtitle">{% trans "To register, do I need to create new password?" %}</h3> + <p>{% trans "No, you don't have to. You can login through any service that supports OpenID, e.g. Google, Yahoo, AOL, etc." %} + <strong><a href="/account/signin">{% trans "Login now!" %}</a> »</strong> + </p> + </div> - <h3 class="subtitle">{% trans "Why other people can edit my questions/answers?" %}</h3> - <p> {% trans "Goal of this site is..." %} {% trans "So questions and answers can be edited like wiki pages by experienced users of this site and this improves the overall quality of the knowledge base content." %} - {% trans "If this approach is not for you, we respect your choice." %} - </p><br> - <h3 class="subtitle">{% trans "Still have questions?" %}</h3> - <p>{% trans "Please ask your question, help make our community better!" %} <a href="/tags/faq" class="big">{% trans "site title" %} {% trans "questions" %}</a>{% trans "." %} - </p> - <br><br> + <div> + <h3 class="subtitle">{% trans "Why other people can edit my questions/answers?" %}</h3> + <p> {% trans "Goal of this site is..." %} {% trans "So questions and answers can be edited like wiki pages by experienced users of this site and this improves the overall quality of the knowledge base content." %} + {% trans "If this approach is not for you, we respect your choice." %} + </p> + </div> + <div> + <h3 class="subtitle">{% trans "Still have questions?" %}</h3> + <p>{% trans "Please ask your question, help make our community better!" %} + <!-- + <a href="/tags/faq" class="big">{% trans "site title" %} {% trans "questions" %}</a>{% trans "." %} + --> + </p> + </div> </div> +<script type="text/javascript"> + //highlihts section if url has matching #anchor_name + $(document).ready(function (){ + var hash = window.location.hash; + if (hash.length > 1){ + $(hash).parent().addClass('highlight'); + window.location.hash = hash; + } + }) +</script> {% endblock %} <!-- end template faq.html --> diff --git a/templates/footer.html b/templates/footer.html index 207104ce..637ca0d8 100644 --- a/templates/footer.html +++ b/templates/footer.html @@ -26,7 +26,7 @@ </script> <script type="text/javascript"> try { - var pageTracker = _gat._getTracker({{ google_analytics_key }}); + var pageTracker = _gat._getTracker({{ settings.GOOGLE_ANALYTICS_KEY }}); pageTracker._trackPageview(); } catch(err) {} </script> diff --git a/templates/header.html b/templates/header.html index 64cf2bf0..db08a39a 100644 --- a/templates/header.html +++ b/templates/header.html @@ -1,30 +1,29 @@ <!-- template header.html --> {% load extra_tags %} {% load i18n %} - <div id="top"> - <div id="header"> - {% if request.user.is_authenticated %} - <a href="/users/{{ request.user.id }}/{{ request.user.username }}/">{{ request.user.username }}</a> {% get_score_badge request.user %} - <a href="{% url user_signout %}">{% trans "logout" %}</a> - {% else %} - <a href="{% url user_signin %}">{% trans "login" %}</a> - <a href="{% url user_signup %}">{% trans "signup" %}</a> - {% endif %} - <a href="/about">{% trans "about" %}</a> - <a href="/faq">{% trans "faq" %}</a> - </div> - </div> <div id="roof"> <div id="navBar"> + <div id="top"> + <!--<div id="header">--> + {% if request.user.is_authenticated %} + <a href="/users/{{ request.user.id }}/{{ request.user.username }}/">{{ request.user.username }}</a> {% get_score_badge request.user %} + <a href="/logout/">{% trans "logout" %}</a> + {% else %} + <a href="/account/signin">{% trans "login" %}</a> + {% endif %} + <a href="/about">{% trans "about" %}</a> + <a href="/faq">{% trans "faq" %}</a> + <!--</div>--> + </div> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="23%"> - <div id="logo"> - <a href="/"> - <img src="/content/images/logo.png" title="{% trans "back to home page" %}" /> - </a> - </div> - </td> + <div id="logo"> + <a href="/"> + <img src="/content/images/logo.png" title="{% trans "back to home page" %}" /> + </a> + </div> + </td> <td width="77%" valign="bottom"> <div class="nav"> <a id="nav_questions" href="/questions/" >{% trans "questions" %}</a> diff --git a/templates/index.html b/templates/index.html index db2bb12e..a1ab06a4 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,11 +1,12 @@ {% extends "base.html" %} +<!-- index.html --> {% load i18n %} {% load extra_tags %} {% load humanize %} {% load extra_filters %} {% block title %}{% spaceless %}{% trans "Home" %}{% endspaceless %}{% endblock %} -{% block meta %}<meta name="keywords" content="{{ APP_KEYWORDS }}" /> - <meta name="description" content="{{ APP_DESCRIPTION }}" />{% endblock %} +{% block meta %}<meta name="keywords" content="{{ settings.APP_KEYWORDS }}" /> + <meta name="description" content="{{ settings.APP_DESCRIPTION }}" />{% endblock %} {% block forejs %} <script type="text/javascript"> $().ready(function(){ @@ -78,7 +79,7 @@ <div class="boxA"> <h3>{% trans "welcome to website" %}</h3> <div class="body"> - {{ APP_INTRO|safe }} + {{ settings.APP_INTRO|safe }} <div class="more"><a href="/about">{% trans "about" %} »</a></div> <div class="more"><a href="/faq">{% trans "faq" %} »</a></div> </div> @@ -117,6 +118,7 @@ {% endblock %} {% block tail %} <div style="padding:5px 0 5px 5px;"> -<span class="evenMore">{% trans "Still looking for more? See" %} <a href="/questions/">{% trans "complete list of quesionts" %}</a>, {% trans "or" %} <a href="/tags/">{% trans "popular tags" %}</a>{% trans "." %} {% trans "Please help us answer" %} <a href="/questions/unanswered">{% trans "unanswered questions" %}</a>{% trans "." %}</span> +<span class="evenMore">{% trans "Still looking for more? See" %} <a href="/questions/">{% trans "complete list of questions" %}</a> {% trans "or" %} <a href="/tags/">{% trans "popular tags" %}</a>{% trans "." %} {% trans "Please help us answer" %} <a href="/questions/unanswered">{% trans "list of unanswered questions" %}</a>{% trans "." %}</span> </div> {% endblock %} +<!-- index.html --> diff --git a/templates/logout.html b/templates/logout.html index 6270924a..e05a4328 100644 --- a/templates/logout.html +++ b/templates/logout.html @@ -1,5 +1,5 @@ -<!-- template logout.html --> {% extends "base_content.html" %} +<!-- template logout.html --> {% load extra_tags %} {% load humanize %} {% load i18n %} @@ -22,4 +22,4 @@ <br><br> </div> {% endblock %} -<!-- ent template logout.html --> +<!-- end logout.html --> diff --git a/templates/pagesize.html b/templates/pagesize.html index 90003749..5037f1f6 100644 --- a/templates/pagesize.html +++ b/templates/pagesize.html @@ -1,3 +1,4 @@ +<!-- template pagesize.html --> {% spaceless %} {% load i18n %} {% if is_paginated %} @@ -23,3 +24,4 @@ </div> {% endif %} {% endspaceless %} +<!-- end template pagesize.html --> diff --git a/templates/question.html b/templates/question.html index 5ba08b63..eaff9da3 100644 --- a/templates/question.html +++ b/templates/question.html @@ -1,5 +1,8 @@ +{% extends "base.html" %} <!-- question.html --> -{% extends "base.html" %}{% load extra_tags %}{% load extra_filters %}{% load humanize %} +{% load extra_tags %} +{% load extra_filters %} +{% load humanize %} {% load i18n %} {% block title %}{% spaceless %}{{ question.get_question_title }}{% endspaceless %}{% endblock %} {% block forejs %} @@ -250,10 +253,10 @@ </div> {% endif %} - {% ifnotequal question.answer_count 0 %} + {% ifnotequal answers.length 0 %} <div class="tabBar"> <a name="sort-top"></a> - <div class="headQuestions">{{ question.answer_count }}{% trans "Answers" %}:</div> + <div class="headQuestions">{{ answers|length }}{% trans "Answers" %}:</div> <div class="tabsA"> <a id="oldest" href="?sort=oldest#sort-top" title="{% trans "oldest answers will be shown first" %}">{% trans "oldest answers" %}</a> <a id="latest" href="?sort=latest#sort-top" title="{% trans "newest answers will be shown first" %}">{% trans "newest answers" %}</a> @@ -431,10 +434,12 @@ </div> {% if not question.closed %} - {% if request.user.is_authenticated %} <div style="padding:10px 0 0 0;"> <div class="headNormal">{% trans "Your answer" %}:</div> </div> + {% if not request.user.is_authenticated %} + <div class="message">{% trans "you can answer anonymously and then login" %}</div> + {% endif %} <div id="description" class="" > <div id="wmd-button-bar" class="wmd-panel"></div> @@ -458,9 +463,11 @@ </div> <br> <input type="submit" value="{% trans "Answer the question" %}" class="submit"><span class="form-error"></span> - {% else %} - <input id="btLogin" type="button" class="submit" style="width:200px" value="{% trans "Login to answer" %}"> - {% endif %} + {% if request.user.is_authenticated %} + {{ answer.email_notify }} <label for="question-subscribe-updates">{% trans "Notify me daily if there are any new answers." %}</label> + {% else %} + <input type="checkbox" disabled><label>{% trans "once you sign in you will be able to subscribe for any updates here" %}</label> + {% endif %} {% endif %} <br><br> </form> diff --git a/templates/question_edit.html b/templates/question_edit.html index 6fe8bb41..9ad60a88 100644 --- a/templates/question_edit.html +++ b/templates/question_edit.html @@ -1,5 +1,5 @@ -<!-- question_edit.html --> {% extends "base.html" %} +<!-- question_edit.html --> {% load i18n %} {% block title %}{% spaceless %}{% trans "Edit question" %}{% endspaceless %}{% endblock %} {% block forejs %} diff --git a/templates/question_retag.html b/templates/question_retag.html index aebf93a5..c7062e30 100644 --- a/templates/question_retag.html +++ b/templates/question_retag.html @@ -1,5 +1,6 @@ {% extends "base.html" %} -{% block title %}{% spaceless %}修改问题标签{% endspaceless %}{% endblock %} +<!-- question_retag.html --> +{% block title %}{% spaceless %}{% trans "Change tags" %}{% endspaceless %}{% endblock %} {% block forejs %} <script type='text/javascript' src='/content/js/com.cnprog.editor.js'></script> <script type='text/javascript' src='/content/js/com.cnprog.post.js'></script> @@ -34,8 +35,8 @@ }, messages: { tags: { - required: " 标签不能为空。", - maxlength: " 最多5个标签,每个标签长度小于20个字符。" + required: "{% trans "tags are required" %}", + maxlength: "{% trans "up to 5 tags, less than 20 characters each" %} } } @@ -48,7 +49,7 @@ {% block content %} <div id="main-bar" class="headNormal"> - 修改标签 [<a href="{{ question.get_absolute_url }}">返回</a>] + {% trans "Change tags" %} [<a href="{{ question.get_absolute_url }}">{% trans "back" %}</a>] </div> <div id="main-body" class="ask-body"> <div id="askform"> @@ -71,8 +72,8 @@ <br> <div class="error" ></div> - <input type="submit" value="现在修改" class="submit" /> - <input type="button" value="取消" class="submit" onclick="history.back(-1);" /> + <input type="submit" value="{% trans "Save edit" %}" class="submit" /> + <input type="button" value="{% trans "Cancel" %}" class="submit" onclick="history.back(-1);" /> <br> <br> </form> @@ -82,20 +83,16 @@ {% block sidebar %} <div class="boxC"> - <p class="subtitle">为什么我只能修改问题标签?</p> + <p class="subtitle">{% trans "Why use and modify tags?" %}</p> <ul class="list-item"> - <li> - CNProg用标签来分类系统的信息 - + {% trans "tags help us keep Questions organized" %} </li> <li> 修改完整问题需要用户的积分达到一定条件(比如:积分 >= 3000分,自己发布的问题除外),而用户积分达到比较低的时候,就可以修改问题的标签(比如:积分 >= 500, 这里指所有问题的标签)。 - </li> <li> - 修改标签的用户将授予特殊的社区奖牌 - + {% trans "tag editors receive special awards from the community" %} </li> </ul> <a href="{% url faq %}" style="float:right;position:relative">faq »</a> @@ -106,4 +103,4 @@ {% block endjs %} {% endblock %} - +<!-- end question_retag.html --> diff --git a/templates/questions.html b/templates/questions.html index a531d954..5dac0156 100644 --- a/templates/questions.html +++ b/templates/questions.html @@ -1,6 +1,5 @@ -<!-- questions.html --> {% extends "base.html" %} -{% load i18n %} +<!-- questions.html --> {% load extra_tags %} {% load i18n %} {% load humanize %} @@ -112,13 +111,20 @@ {% plural %} have total {{q_num}} questions tagged {{tagname}} {% endblocktrans %} - {% endif %} - {% if searchtitle %} - {% blocktrans count questions_count as cnt with questions_count|intcomma as q_num %} - have total {{q_num}} questions containing {{searchtitle}} - {% plural %} - have total {{q_num}} questions containing {{searchtitle}} - {% endblocktrans %} + {% else %} + {% if searchtitle %} + {% blocktrans count questions_count as cnt with questions_count|intcomma as q_num %} + have total {{q_num}} questions containing {{searchtitle}} + {% plural %} + have total {{q_num}} questions containing {{searchtitle}} + {% endblocktrans %} + {% else %} + {% blocktrans count questions as cnt with questions_count|intcomma as q_num %} + have total {{q_num}} questions + {% plural %} + have total {{q_num}} questions + {% endblocktrans %} + {% endif %} {% endif %} {% ifequal tab_id "latest" %} @@ -139,13 +145,15 @@ <p>{% trans "Questions are sorted by the <strong>number of votes</strong>." %} {% trans "Most voted questions are shown first." %}</p> {% endifequal %} + + </p> </div> <div class="boxC"> <h3 class="subtitle">{% trans "Related tags" %}</h3> <div class="tags"> {% for tag in tags %} - <a rel="tag" title="{% blocktrans with tag.name as tagname %}see questions tagged '{{ tagname }}'{% endblocktrans %}" href="{% url forum.views.tag tag.name|urlencode %}">{{ tag.name }}</a> + <a rel="tag" title="{% trans "see questions tagged" %}'{{ tag.name }}'{% trans "using tags" %}" href="{% url forum.views.tag tag.name|urlencode %}">{{ tag.name }}</a> <span class="tag-number">× {{ tag.used_count|intcomma }}</span> <br> {% endfor %} diff --git a/templates/revisions_answer.html b/templates/revisions_answer.html index 5ab12fbf..9c2e53eb 100644 --- a/templates/revisions_answer.html +++ b/templates/revisions_answer.html @@ -1,5 +1,5 @@ -<!-- revisions_answer.html --> {% extends "base_content.html" %} +<!-- revisions_answer.html --> {% load i18n %} {% load extra_tags %} {% load extra_filters %} diff --git a/templates/revisions_question.html b/templates/revisions_question.html index 77a421bb..7ada3e74 100644 --- a/templates/revisions_question.html +++ b/templates/revisions_question.html @@ -1,5 +1,5 @@ -<!-- revisions_question.html --> {% extends "base_content.html" %} +<!-- revisions_question.html --> <!--somehow very similar to revisions_answer.html--> {% load extra_tags %} {% load i18n %} @@ -99,5 +99,4 @@ {% block endjs %} {% endblock %} - <!-- end revisions_question.html --> diff --git a/templates/unanswered.html b/templates/unanswered.html index 926f2ffd..13b3a3b2 100644 --- a/templates/unanswered.html +++ b/templates/unanswered.html @@ -1,5 +1,5 @@ -<!-- unanswered.html --> {% extends "base.html" %} +<!-- unanswered.html --> {% load extra_tags %} {% load i18n %} {% load humanize %} diff --git a/templates/user.html b/templates/user.html index 8db15902..efca80e6 100644 --- a/templates/user.html +++ b/templates/user.html @@ -1,5 +1,5 @@ -<!-- user.html --> {% extends "base_content.html" %} +<!-- user.html --> {% load extra_tags %} {% load humanize %} {% block title %}{% spaceless %}{{ page_title }}{% endspaceless %}{% endblock %} @@ -16,14 +16,12 @@ $("#nav_profile").attr('className',"on"); {% else %} $("#nav_users").attr('className',"on"); - {% endifequal %} - }); + }); </script> {% block userjs %} {% endblock %} {% endblock %} - {% block content %} <div id="mainbar-full"> {% include "user_info.html" %} diff --git a/templates/user_edit.html b/templates/user_edit.html index 0f927374..b49cea31 100644 --- a/templates/user_edit.html +++ b/templates/user_edit.html @@ -1,5 +1,5 @@ -<!-- user_edit.html --> {% extends "base_content.html" %} +<!-- user_edit.html --> {% load extra_tags %} {% load humanize %} {% load i18n %} diff --git a/templates/user_favorites.html b/templates/user_favorites.html index d47670bd..185423c6 100644 --- a/templates/user_favorites.html +++ b/templates/user_favorites.html @@ -1,5 +1,5 @@ -<!-- user_favorites.html --> {% extends "user.html" %} +<!-- user_favorites.html --> {% load extra_tags %} {% load humanize %} diff --git a/templates/user_info.html b/templates/user_info.html index 8e6dca84..8d35015c 100644 --- a/templates/user_info.html +++ b/templates/user_info.html @@ -70,12 +70,14 @@ <td>{% get_age view_user.date_of_birth %} {% trans "age unit" %}</td> </tr> {% endif %} + <!-- {% if votes_today_left %} <tr> <td>{% trans "todays unused votes" %}</td> <td><strong class="darkred">{{ votes_today_left }}</strong> {% trans "votes left" %}</td> </tr> {% endif %} + --> </table> </td> <td width="380"> diff --git a/templates/user_preferences.html b/templates/user_preferences.html index 3a760a25..eb7c4761 100644 --- a/templates/user_preferences.html +++ b/templates/user_preferences.html @@ -1,20 +1,23 @@ {% extends "user.html" %} +<!-- user_preferences.html --> +{% load i18n %} {% load extra_tags %} {% load humanize %} {% block usercontent %} <div style="padding:5px;"> <fieldset> - <legend><b>同步Twitter消息</b></legend> + <legend><b>{% trans "Connect with Twitter" %}</b></legend> <form> - <label for="name">账号:</label> + <label for="name">{% trans "Twitter account name:" %}</label> <input id="name" /><br> - <label for="password">密码:</label> + <label for="password">{% trans "Twitter password:" %}</label> <input id="password" type="password"/><br> - <input id="cbMessage" type="checkbox" />发布我的提问到我的Twitter<br> - <input id="cbReply" type="checkbox" />发布我的回答到我的Twitter<br> - <input type="submit" value="保存" /> + <input id="cbMessage" type="checkbox" />{% trans "Send my Questions to Twitter" %}<br> + <input id="cbReply" type="checkbox" />{% trans "Send my Answers to Twitter" %}<br> + <input type="submit" value="{% trans "Save" %}" /> </form> </fieldset> </div> {% endblock %} +<!-- end user_preferences.html --> diff --git a/templates/user_recent.html b/templates/user_recent.html index 70c074ad..7f6c9c8c 100644 --- a/templates/user_recent.html +++ b/templates/user_recent.html @@ -1,5 +1,5 @@ -<!-- user_recent.html --> {% extends "user.html" %} +<!-- user_recent.html --> {% load extra_tags %} {% load humanize %} diff --git a/templates/user_reputation.html b/templates/user_reputation.html index 7a1c7366..bb7200de 100644 --- a/templates/user_reputation.html +++ b/templates/user_reputation.html @@ -1,5 +1,5 @@ -<!-- user_reputation.html --> {% extends "user.html" %} +<!-- user_reputation.html --> {% load extra_tags %} {% load humanize %} {% block userjs %} diff --git a/templates/user_responses.html b/templates/user_responses.html index 45aab21b..d739395b 100644 --- a/templates/user_responses.html +++ b/templates/user_responses.html @@ -1,5 +1,5 @@ -<!-- user_responses.html --> {% extends "user.html" %} +<!-- user_responses.html --> {% load extra_tags %} {% load humanize %} diff --git a/templates/user_stats.html b/templates/user_stats.html index a5be1a77..432a5b34 100644 --- a/templates/user_stats.html +++ b/templates/user_stats.html @@ -1,5 +1,5 @@ -<!-- user_stats.html --> {% extends "user.html" %} +<!-- user_stats.html --> {% load i18n %} {% load extra_tags %} {% load humanize %} diff --git a/templates/user_tabs.html b/templates/user_tabs.html index 03a9d111..bcc12b8f 100644 --- a/templates/user_tabs.html +++ b/templates/user_tabs.html @@ -22,13 +22,11 @@ <a id="favorites" {% ifequal tab_name "favorites" %}class="on"{% endifequal %} title="{% trans "questions that user selected as his/her favorite" href="/users/{{view_user.id}}/{{view_user.username}}?sort=favorites">{% trans "favorites" %}</a> - <!-- {% if request.user|can_view_user_preferences:view_user %} <a id="preferences" {% ifequal tab_name "preferences" %}class="on"{% endifequal %} title="{% trans "user preference settings" %}" href="/users/{{view_user.id}}/{{view_user.username}}?sort=preferences">{% trans "settings" %}</a> {% endif %} - --> </div> </div> <!-- end user_tabs.html --> diff --git a/templates/user_votes.html b/templates/user_votes.html index ec967704..80fa27ee 100644 --- a/templates/user_votes.html +++ b/templates/user_votes.html @@ -1,5 +1,5 @@ -<!-- user_votes.html --> {% extends "user.html" %} +<!-- user_votes.html --> {% load extra_tags %} {% load humanize %} {% load i18n %} |