# HG changeset patch # User Matti Picus <matti.picus@gmail.com> # Date 1577712577 -7200 # Mon Dec 30 15:29:37 2019 +0200 # Branch nikola # Node ID 6fb6953b86174826bed347dcac590ceb299109b3 # Parent 0594e0c3b2864b8a0d092d7f447ca2e6d2b5317a update content, make theme look about like other site diff --git a/conf.py b/conf.py --- a/conf.py +++ b/conf.py @@ -139,16 +139,26 @@ NAVIGATION_LINKS = { DEFAULT_LANG: ( - ('/index.html', '<image src="images/pypy-logo-nav.png" alt=PyPy/>'), - ('/features.html', 'What is PyPy?'), + ('/index.html', '<image src="images/pypy-logo.svg" width=75 alt=PyPy>'), + ( + ( + ('/features.html', 'What is PyPy?'), + ('/compat.html', 'Compatibility'), + ('/performance.html', 'Performance'), + ), + 'Features', + ), ('/download.html', 'Download'), - ('/compat.html', 'Compatibility'), - ('/performance.html', 'Performance'), ('http://doc.pypy.org', 'Dev Documentation'), ('http://morepypy.blogspot.com', 'Blog'), - ('/people.html', 'People'), - ('/contact.html', 'Contact'), - ("/rss.xml", "RSS feed"), + ( + ( + ('/people.html', 'People'), + ('/contact.html', 'Contact'), + ), + 'About', + ), + #("/rss.xml", "RSS feed"), ), } @@ -944,7 +954,11 @@ # A small copyright notice for the page footer (in HTML). # (translatable) -CONTENT_FOOTER = 'Contents © {date} <a href="mailto:{email}">{author}</a> - Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> {license}' +CONTENT_FOOTER = """ +<img src="images/pypy-logo-nav-grey.png" alt="PyPy Logo" /> Contents © +{date} <a href="mailto:{email}">{author}</a> Powered by <a +href="https://getnikola.com" rel="nofollow">Nikola</a> {license} +""" # Things that will be passed to CONTENT_FOOTER.format(). This is done # for translatability, as dicts are not formattable. Nikola will diff --git a/image/pypy-logo-nav-grey.png b/image/pypy-logo-nav-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..0ac40afe49713efe05dd296a619862e5ee7f00cb GIT binary patch literal 1672 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 Pe-%Lgff2Ms$2Rz1&gZ`z diff --git a/image/pypy-logo.svg b/image/pypy-logo.svg new file mode 100644 --- /dev/null +++ b/image/pypy-logo.svg @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 361.4 170.8" style="enable-background:new 0 0 361.4 170.8;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#90A99C;} + .st1{fill:#D1DCC0;} + .st2{opacity:0.6;fill:url(#SVGID_1_);} + .st3{opacity:0.6;fill:url(#SVGID_2_);} + .st4{opacity:0.6;fill:url(#SVGID_3_);} + .st5{opacity:0.6;fill:url(#SVGID_4_);} + .st6{opacity:0.6;fill:url(#SVGID_5_);} + .st7{fill:#193440;} + .st8{opacity:0.6;fill:url(#SVGID_6_);} + .st9{fill:#3F616E;} + .st10{opacity:0.6;fill:url(#SVGID_7_);} + .st11{fill:#FFFFFF;} +</style> +<g> + <path class="st0" d="M83.5,3.3c-6.8,0-12.2,1.5-18.6,3l5.1,32.5c1,0.6,1.9,1.4,2.8,2.3c3.5-0.8,7.2-1.3,10.9-1.3 + c2.1,0,4.1,0.1,6.1,0.4c-1.3-0.7-2.2-1.7-2.1-2.8c0.1-1.9,3.1-3.2,6.6-2.9c3.5,0.3,6.2,2,6.1,3.9c-0.1,1.6-2.2,2.7-4.9,2.9 + c19.4,5,34,22.2,35,43c0.1,0.9,0.1,1.8,0.1,2.8l0,0c0,48-47.1,83.8-47.1,83.8s0,0,0,0c46.2,0,83.7-37.5,83.7-83.8 + C167.3,40.8,129.8,3.3,83.5,3.3z M116.4,43.6c-0.7-0.7-1.3-1.3-2-1.8l3.2-0.6C117.2,42,116.8,42.8,116.4,43.6z"/> + <path class="st1" d="M83.8,3.3C37.5,3.3,0,40.8,0,87.1s37.5,83.8,83.8,83.8s83.8-37.5,83.8-83.8S130,3.3,83.8,3.3z M117.6,41.1 + c-0.4,0.9-0.8,1.7-1.2,2.5c-0.7-0.7-1.3-1.3-2-1.8L117.6,41.1z M126.3,106.3c-0.2,0.4-0.4,0.9-0.6,1.3c-2.6,5.2-6.1,9.8-10.4,13.7 + c-0.7,0.6-1.4,1.2-2.1,1.8c-1,0.8-2.1,1.6-3.2,2.4c-1.2,0.8-2.5,1.6-3.9,2.3c-6.6,3.6-14.2,5.7-22.3,5.7c-8.1,0-15.7-2-22.3-5.7 + c-1.3-0.7-2.6-1.5-3.9-2.3c-1.1-0.8-2.2-1.6-3.2-2.4c-0.7-0.6-1.4-1.2-2.1-1.8c-0.6-0.5-1.1-1-1.6-1.6c-3.5-3.5-6.5-7.6-8.8-12.1 + c-0.2-0.4-0.4-0.9-0.6-1.3c-2.8-6-4.3-12.6-4.3-19.7c0-12.9,5.2-24.6,13.7-33.1c0.5-0.5,1.1-1,1.6-1.6c1.7-1.5,3.4-2.9,5.3-4.2 + c3.4-2.3,7.2-4.2,11.2-5.5c-0.6-0.6-1.2-1.2-1.9-1.7c-1.5-1-3.3-1.6-5.2-1.9c-1.9-0.4-3.9-0.4-5.9-0.3c-2,0.1-4,0.4-6,0.9 + c1.9-0.8,3.8-1.5,5.9-1.9c2-0.5,4.1-0.8,6.3-0.8c2.1,0,4.4,0.3,6.5,1.2c1.7,0.7,3.2,1.9,4.5,3.3c3.5-0.8,7.2-1.3,11-1.3 + c2.1,0,4.1,0.2,6.2,0.4c-1.4-0.7-2.2-1.7-2.1-2.8c0.1-1.9,3.1-3.2,6.6-2.9c3.5,0.3,6.2,2,6.1,3.9c-0.1,1.6-2.2,2.7-5,2.9 + c5.2,1.3,10.1,3.5,14.4,6.5c12.5,8.4,20.7,22.7,20.7,38.8C130.6,93.6,129.1,100.3,126.3,106.3z"/> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="88.7372" y1="39.4964" x2="83.9239" y2="37.7445"> + <stop offset="0" style="stop-color:#FFFFFF"/> + <stop offset="0.1884" style="stop-color:#FCFCFC"/> + <stop offset="0.3217" style="stop-color:#F3F3F3"/> + <stop offset="0.4381" style="stop-color:#E3E3E3"/> + <stop offset="0.5447" style="stop-color:#CDCDCD"/> + <stop offset="0.6448" style="stop-color:#B1B1B1"/> + <stop offset="0.7399" style="stop-color:#8E8E8E"/> + <stop offset="0.8311" style="stop-color:#646464"/> + <stop offset="0.917" style="stop-color:#353535"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path class="st2" d="M86,38.3c-0.5,0.2-1,0.4-1.4,0.5c-0.4,0.1-0.8,0.2-1.2,0.4c1.8,0,3.6,0.1,5.4,0.2c-0.6-0.6-1-1.3-1-1.9 + c-0.1,0.1-0.2,0.1-0.3,0.2C87,37.9,86.5,38.1,86,38.3z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="176.7438" y1="61.1448" x2="73.7115" y2="23.6441"> + <stop offset="0" style="stop-color:#FFFFFF"/> + <stop offset="0.1884" style="stop-color:#FCFCFC"/> + <stop offset="0.3217" style="stop-color:#F3F3F3"/> + <stop offset="0.4381" style="stop-color:#E3E3E3"/> + <stop offset="0.5447" style="stop-color:#CDCDCD"/> + <stop offset="0.6448" style="stop-color:#B1B1B1"/> + <stop offset="0.7399" style="stop-color:#8E8E8E"/> + <stop offset="0.8311" style="stop-color:#646464"/> + <stop offset="0.917" style="stop-color:#353535"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path class="st3" d="M83.5,3.3c-0.8,0-1.6,0-2.4,0.1c0.1,0,0.3,0.1,0.5,0.1c0.2,0,0.5,0.1,0.8,0.2c0.2,0,0.3,0.1,0.5,0.1 + c0.2,0,0.3,0.1,0.5,0.2c0.4,0.1,0.8,0.2,1.2,0.4C85,4.4,85.5,4.6,86,4.8c0.5,0.2,1,0.5,1.5,0.7c0.5,0.3,1,0.6,1.6,0.9 + c0.3,0.2,0.5,0.4,0.8,0.6c0.3,0.2,0.5,0.4,0.8,0.6C91.2,8,91.7,8.4,92.2,9c1,1,1.9,2.2,2.7,3.5c0.8,1.3,1.4,2.8,1.8,4.3 + c0.1,0.4,0.2,0.8,0.3,1.2l0.1,0.3l0,0.3l0.1,0.6l0.1,0.6c0,0.2,0,0.4,0,0.6l0,0.6l0,0.3l0,0.2l0,0.1l0,0l0,0l-0.1,1.3l0,0.3 + c0,0.1,0,0.2,0,0.3L97.2,24l-0.1,0.6l0,0.3L97,25.1c-0.1,0.4-0.2,0.8-0.3,1.2c-0.5,1.5-1,3-1.8,4.3c-0.8,1.3-1.7,2.5-2.7,3.5 + c-0.2,0.2-0.3,0.3-0.5,0.5c0.8-0.1,1.7-0.2,2.7-0.1c3.5,0.3,6.2,2,6.1,3.9c-0.1,0.9-0.8,1.6-1.8,2.1c45.5,7.5,68.6,46.6,68.6,46.6 + C167.3,40.8,129.8,3.3,83.5,3.3z M116.4,43.6c-0.7-0.7-1.3-1.3-2-1.8l3.2-0.6C117.2,42,116.8,42.8,116.4,43.6z"/> + </g> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="8.7971" y1="77.1246" x2="113.9849" y2="137.8548"> + <stop offset="0" style="stop-color:#FFFFFF"/> + <stop offset="0.1884" style="stop-color:#FCFCFC"/> + <stop offset="0.3217" style="stop-color:#F3F3F3"/> + <stop offset="0.4381" style="stop-color:#E3E3E3"/> + <stop offset="0.5447" style="stop-color:#CDCDCD"/> + <stop offset="0.6448" style="stop-color:#B1B1B1"/> + <stop offset="0.7399" style="stop-color:#8E8E8E"/> + <stop offset="0.8311" style="stop-color:#646464"/> + <stop offset="0.917" style="stop-color:#353535"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path class="st4" d="M130.6,87c0-0.9,0-1.9-0.1-2.8c0-0.1,0-0.1,0-0.2c0,0.9,0.1,1.7,0.1,2.6c0,7-1.6,13.7-4.3,19.7 + c-0.2,0.4-0.4,0.9-0.6,1.3c-2.6,5.2-6.1,9.8-10.4,13.7c-0.7,0.6-1.4,1.2-2.1,1.8c-1,0.8-2.1,1.6-3.2,2.4c-1.2,0.8-2.5,1.6-3.9,2.3 + c-6.6,3.6-14.2,5.7-22.3,5.7c-0.9,0-1.9,0-2.8-0.1c0.9,0.1,1.8,0.1,2.8,0.1c0,0-77.9,9.7-83-41.5c-0.2,0-0.4,0.1-0.5,0.1 + c2.6,43.9,38.9,78.6,83.4,78.7c0,0,0,0,0,0S130.7,135.1,130.6,87L130.6,87z"/> + <path class="st1" d="M83.5,3.3c-6.8,0-12.2,1.5-18.6,3l2.8,31.3c0.2,0.1,0.3,0.1,0.5,0.2c0.5,0.2,1.1,0.5,1.6,0.8c0,0,0,0,0,0 + c0.5,0.3,1,0.6,1.4,1l12.1-0.4c1.8,0,3.6,0.1,5.4,0.2c-0.1-0.1-0.1-0.1-0.2-0.2c-0.1-0.1-0.2-0.3-0.3-0.4c-0.1-0.1-0.1-0.1-0.1-0.2 + c-0.1-0.1-0.1-0.3-0.2-0.4c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.2-0.1-0.4-0.1-0.6c0.1-1.9,3.1-3.2,6.6-2.9c3.5,0.3,6.2,2,6.1,3.9 + c0,0.2-0.1,0.4-0.2,0.6c-0.1,0.1-0.2,0.3-0.3,0.4c0,0-0.1,0.1-0.1,0.2c-0.2,0.2-0.3,0.3-0.5,0.5c0,0,0,0,0,0 + c-0.2,0.2-0.5,0.3-0.7,0.4c45.5,7.5,68.6,46.6,68.6,46.6C167.3,40.8,129.8,3.3,83.5,3.3z"/> + <g> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="85.0501" y1="41.2733" x2="86.087" y2="38.4245"> + <stop offset="0" style="stop-color:#FFFFFF"/> + <stop offset="0.1884" style="stop-color:#FCFCFC"/> + <stop offset="0.3217" style="stop-color:#F3F3F3"/> + <stop offset="0.4381" style="stop-color:#E3E3E3"/> + <stop offset="0.5447" style="stop-color:#CDCDCD"/> + <stop offset="0.6448" style="stop-color:#B1B1B1"/> + <stop offset="0.7399" style="stop-color:#8E8E8E"/> + <stop offset="0.8311" style="stop-color:#646464"/> + <stop offset="0.917" style="stop-color:#353535"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path class="st5" d="M89.9,40.2c-0.4-0.2-0.8-0.5-1.1-0.8c-1.8-0.1-3.6-0.2-5.4-0.2c0.4-0.1,0.8-0.2,1.2-0.4l-2.8,0.7l-0.7,0.3 + c0.9,0,1.7-0.1,2.6-0.1C85.8,39.8,87.9,39.9,89.9,40.2z"/> + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="93.95" y1="174.5922" x2="138.1377" y2="53.1876"> + <stop offset="0" style="stop-color:#FFFFFF"/> + <stop offset="0.1884" style="stop-color:#FCFCFC"/> + <stop offset="0.3217" style="stop-color:#F3F3F3"/> + <stop offset="0.4381" style="stop-color:#E3E3E3"/> + <stop offset="0.5447" style="stop-color:#CDCDCD"/> + <stop offset="0.6448" style="stop-color:#B1B1B1"/> + <stop offset="0.7399" style="stop-color:#8E8E8E"/> + <stop offset="0.8311" style="stop-color:#646464"/> + <stop offset="0.917" style="stop-color:#353535"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path class="st6" d="M98.7,40.5c-0.8,0.4-1.9,0.7-3.1,0.8c19.4,5,34,22.2,35,43c0.1,0.9,0.1,1.8,0.1,2.8l0,0 + c0,48-47.1,83.8-47.1,83.8s0,0,0,0c46.2,0,83.7-37.5,83.7-83.8C167.3,87.1,144.2,48,98.7,40.5z"/> + </g> + <g> + <path class="st7" d="M319.7,78.5c0-0.9,0-2.9,0.1-5.7c0-2.9,0.1-5.7,0.1-8.4c0-4.3-1.2-7.6-3.5-10.1c-2.3-2.4-5.8-3.7-10.5-3.7 + c-1,0-2.4,0-4.1,0.1c-1.7,0-3,0.1-3.9,0.1c-0.7,0-2.2,0-4.5-0.1c-2.3,0-3.8-0.1-4.5-0.1c-2.9,0-4.4,1.4-4.4,4.3 + c0,1.2,0,5.6,0.1,13c0,7.4,0.1,12.9,0.1,16.4c0,7.8,0,19.6-0.1,32.1h0c0,3.4,2.7,6.1,6.1,6.1c3.4,0,6.1-2.7,6.1-6.1v-7 + c0-0.6,0.3-0.9,0.9-0.9h8.2c4.5,0,8-1.2,10.3-3.7c2.3-2.4,3.5-6,3.5-10.6c0-2.4,0-5.3-0.1-8.5C319.7,82.5,319.7,80.1,319.7,78.5z + M307.5,93.4c0,2.7-1.3,4.1-4,4.1h-5.8c-0.5,0-0.8-0.3-0.8-0.8V62.8c0-0.5,0.3-0.8,0.8-0.8h5.7c2.7,0,4.1,1.4,4.1,4.1V93.4z"/> + </g> + <g> + <path class="st7" d="M235.7,78.5c0-0.9,0-2.9,0.1-5.7c0-2.9,0.1-5.7,0.1-8.4c0-4.3-1.2-7.6-3.5-10.1c-2.3-2.4-5.8-3.7-10.5-3.7 + c-1,0-2.4,0-4.1,0.1c-1.7,0-3,0.1-3.9,0.1c-0.7,0-2.2,0-4.5-0.1c-2.3,0-3.8-0.1-4.5-0.1c-2.9,0-4.4,1.4-4.4,4.3 + c0,1.2,0,5.6,0.1,13c0,7.4,0.1,12.9,0.1,16.4c0,7.8,0,19.6-0.1,32.1h0c0,3.4,2.7,6.1,6.1,6.1c3.4,0,6.1-2.7,6.1-6.1h0v-7 + c0-0.6,0.3-0.9,0.9-0.9h8.2c4.5,0,8-1.2,10.3-3.7c2.3-2.4,3.5-6,3.5-10.6c0-2.4,0-5.3-0.1-8.5C235.7,82.5,235.7,80.1,235.7,78.5z + M223.5,93.4c0,2.7-1.3,4.1-4,4.1h-5.8c-0.5,0-0.8-0.3-0.8-0.8V62.8c0-0.5,0.3-0.8,0.8-0.8h5.7c2.7,0,4.1,1.4,4.1,4.1V93.4z"/> + </g> + <path class="st7" d="M361.4,94.4c0-1.4,0-4.1-0.1-8.3c0-4.2-0.1-7.2-0.1-9l0.1-20.3c0-3.4-2.8-6.1-6.1-6.1c-3.4,0-6.1,2.7-6.1,6.1 + h0v36.4c0,2.7-1.5,4.1-4.5,4.1h-0.8h-0.8c-3,0-4.5-1.4-4.5-4.1V56.8h0c0-3.4-2.7-6.1-6.1-6.1c-3.4,0-6.1,2.7-6.1,6.1l0.1,20.3 + c0,1.8,0,4.8-0.1,9c0,4.2-0.1,6.9-0.1,8.3c0,4.2,1.2,7.6,3.5,10.2c2.3,2.6,5.7,3.9,10.2,3.9h3.8h0.6c-0.9,2.4-1.7,4.3-2.3,5.8 + c-1.2,3.1,0.3,6.6,3.4,7.8c3.1,1.2,6.6-0.3,7.8-3.4l0,0l7-18.3C361,98.6,361.4,96.6,361.4,94.4z"/> + <path class="st7" d="M277.4,94.4c0-1.4,0-4.1-0.1-8.3c0-4.2-0.1-7.2-0.1-9l0.1-20.3c0-3.4-2.8-6.1-6.1-6.1c-3.4,0-6.1,2.7-6.1,6.1 + h0v36.4c0,2.7-1.5,4.1-4.5,4.1h-0.8h-0.8c-3,0-4.5-1.4-4.5-4.1V56.8h0c0-3.4-2.7-6.1-6.1-6.1c-3.4,0-6.1,2.7-6.1,6.1l0.1,20.3 + c0,1.8,0,4.8-0.1,9c0,4.2-0.1,6.9-0.1,8.3c0,4.2,1.2,7.6,3.5,10.2c2.3,2.6,5.7,3.9,10.2,3.9h3.8h0.6c-0.9,2.4-1.7,4.3-2.3,5.8 + c-1.2,3.1,0.3,6.6,3.4,7.8c3.1,1.2,6.6-0.3,7.8-3.4l0,0l7-18.3C277,98.6,277.4,96.6,277.4,94.4z"/> + <path class="st0" d="M87.8,37.4c0.1-1.4,1.7-2.4,3.9-2.8c0.2-0.2,0.3-0.3,0.5-0.5c1-1,1.9-2.2,2.7-3.5c0.8-1.3,1.4-2.8,1.8-4.3 + c0.1-0.4,0.2-0.8,0.3-1.2l0.1-0.3l0-0.3l0.1-0.6l0.1-0.6c0-0.1,0-0.2,0-0.3l0-0.3l0.1-1.3l0,0l0,0l0-0.1l0-0.2l0-0.3l0-0.6 + c0-0.2,0-0.4,0-0.6l-0.1-0.6l-0.1-0.6l0-0.3L97,18c-0.1-0.4-0.2-0.8-0.3-1.2c-0.5-1.5-1-3-1.8-4.3c-0.8-1.3-1.7-2.5-2.7-3.5 + c-0.5-0.5-1-1-1.5-1.4c-0.2-0.2-0.5-0.4-0.8-0.6c-0.3-0.2-0.5-0.4-0.8-0.6c-0.5-0.3-1.1-0.7-1.6-0.9C87,5.2,86.5,5,86,4.8 + c-0.5-0.2-1-0.4-1.4-0.5c-0.4-0.1-0.8-0.2-1.2-0.4c-0.2-0.1-0.4-0.1-0.5-0.2c-0.2,0-0.3-0.1-0.5-0.1c-0.3-0.1-0.6-0.1-0.8-0.2 + c-0.3-0.1-0.6-0.1-0.6-0.1C59.8,4,39.9,12.6,24.8,27.7C9.1,43.4,0.4,64.3,0.4,86.6c0,0.5,0,0.9,0,1.4c1.3,55.7,83.3,45.5,83.3,45.5 + c-25.8,0-46.9-21-46.9-46.9c0-14.5,6.7-27.5,17-36.1c0.1-0.1,0.3-0.2,0.4-0.3c1-0.8,2.1-1.6,3.1-2.3c0.2-0.1,0.4-0.2,0.6-0.4 + c1.1-0.7,2.1-1.3,3.2-2c0.2-0.1,0.4-0.2,0.6-0.3c1.1-0.6,2.2-1.1,3.4-1.6c0.2-0.1,0.5-0.2,0.7-0.3c0.9-0.4,1.9-0.7,2.8-1 + c-0.6-0.6-1.2-1.2-1.9-1.7c-1.5-1-3.3-1.6-5.2-1.9c-1.9-0.4-3.9-0.4-5.9-0.3c-2,0.1-4,0.4-6,0.9c1.9-0.8,3.8-1.5,5.9-1.9 + c2-0.5,4.1-0.8,6.3-0.8c2.1,0,4.4,0.3,6.5,1.2c1.7,0.7,3.2,1.9,4.5,3.3c0.4-0.1,0.7-0.2,1.1-0.3c0.3-0.1,0.5-0.1,0.8-0.2 + c1.2-0.2,2.5-0.4,3.7-0.6c0.3,0,0.6-0.1,0.9-0.1c0.6-0.1,1.1-0.1,1.6-0.2c0,0,0,0,0,0s0.2,0,0.6-0.1c0.2,0,0.5-0.1,0.8-0.2 + c0.1,0,0.3-0.1,0.5-0.1c0.2,0,0.3-0.1,0.5-0.2c0.4-0.1,0.8-0.2,1.2-0.4c0.4-0.2,0.9-0.3,1.4-0.5c0.5-0.2,1-0.5,1.5-0.7 + C87.6,37.6,87.7,37.5,87.8,37.4C87.8,37.4,87.8,37.4,87.8,37.4z"/> + <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="48.9086" y1="3.3284" x2="48.9086" y2="134.1741"> + <stop offset="0" style="stop-color:#FFFFFF"/> + <stop offset="0.1884" style="stop-color:#FCFCFC"/> + <stop offset="0.3217" style="stop-color:#F3F3F3"/> + <stop offset="0.4381" style="stop-color:#E3E3E3"/> + <stop offset="0.5447" style="stop-color:#CDCDCD"/> + <stop offset="0.6448" style="stop-color:#B1B1B1"/> + <stop offset="0.7399" style="stop-color:#8E8E8E"/> + <stop offset="0.8311" style="stop-color:#646464"/> + <stop offset="0.917" style="stop-color:#353535"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path class="st8" d="M87.8,37.4c0-0.3,0.1-0.5,0.2-0.8c0,0,0,0,0,0c0,0,0,0,0,0c0.1-0.1,0.2-0.3,0.3-0.4c0,0,0,0,0,0c0,0,0,0,0,0 + c0.4-0.5,1-0.9,1.8-1.2c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0,0.2-0.1,0.3-0.1c0,0,0,0,0,0l0,0c0.4-0.1,0.8-0.3,1.3-0.3l0,0l0,0 + c0,0,0,0,0,0c0.2-0.2,0.3-0.3,0.5-0.5c1-1,1.9-2.2,2.7-3.5c0.8-1.3,1.4-2.8,1.8-4.3c0.1-0.4,0.2-0.8,0.3-1.2l0.1-0.3l0-0.3l0.1-0.6 + l0.1-0.6c0-0.1,0-0.2,0-0.3l0-0.3l0.1-1.3l0,0l0,0l0-0.1l0-0.2l0-0.3l0-0.6c0-0.2,0-0.4,0-0.6l-0.1-0.6l-0.1-0.6l0-0.3L97,18 + c-0.1-0.4-0.2-0.8-0.3-1.2c-0.5-1.5-1-3-1.8-4.3c-0.8-1.3-1.7-2.5-2.7-3.5c-0.5-0.5-1-1-1.5-1.4c-0.2-0.2-0.5-0.4-0.8-0.6 + c-0.3-0.2-0.5-0.4-0.8-0.6c-0.5-0.3-1.1-0.7-1.6-0.9C87,5.2,86.5,5,86,4.8c-0.5-0.2-1-0.4-1.4-0.5c-0.4-0.1-0.8-0.2-1.2-0.4 + c-0.2-0.1-0.4-0.1-0.5-0.2c-0.2,0-0.3-0.1-0.5-0.1c-0.3-0.1-0.6-0.1-0.8-0.2c-0.3-0.1-0.6-0.1-0.6-0.1C59.8,4,39.9,12.6,24.8,27.7 + C9.1,43.4,0.4,64.3,0.4,86.6c0,0.5,0,0.9,0,1.4c1.3,55.7,83.3,45.5,83.3,45.5c-25.8,0-46.9-21-46.9-46.9c0-14.5,6.7-27.5,17-36.1 + c0.1-0.1,0.3-0.2,0.4-0.3c1-0.8,2.1-1.6,3.1-2.3c0.2-0.1,0.4-0.2,0.6-0.4c1.1-0.7,2.1-1.3,3.2-2c0.2-0.1,0.4-0.2,0.6-0.3 + c1.1-0.6,2.2-1.1,3.4-1.6c0.2-0.1,0.5-0.2,0.7-0.3c0.9-0.4,1.9-0.7,2.8-1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0 + c-0.3-0.3-0.5-0.6-0.9-0.9c-0.3-0.3-0.7-0.5-1-0.8c-1.5-1-3.3-1.6-5.2-1.9c-1.9-0.4-3.9-0.4-5.9-0.3c-2,0.1-4,0.4-6,0.9 + c1.9-0.8,3.8-1.5,5.9-1.9c2-0.5,4.1-0.8,6.3-0.8c2.1,0,4.4,0.3,6.5,1.2c0.5,0.2,0.9,0.5,1.4,0.7c0,0,0,0,0,0c0,0,0,0,0,0 + c0.2,0.1,0.4,0.2,0.6,0.4c0,0,0,0,0,0c0,0,0,0,0,0c0.2,0.2,0.5,0.3,0.7,0.5v0c0.2,0.2,0.5,0.4,0.7,0.6c0,0,0,0,0,0v0c0,0,0,0,0,0 + c0.1,0.1,0.1,0.1,0.2,0.2c0,0,0,0,0,0c0.3,0.3,0.7,0.6,1,1c0.4-0.1,0.7-0.2,1.1-0.3c0.3-0.1,0.5-0.1,0.8-0.2 + c1.2-0.2,2.5-0.4,3.7-0.6c0.3,0,0.6-0.1,0.9-0.1c0.6-0.1,1.1-0.1,1.6-0.2c0,0,0,0,0,0s0.2,0,0.6-0.1c0.2,0,0.5-0.1,0.8-0.2 + c0.1,0,0.3-0.1,0.5-0.1c0.2,0,0.3-0.1,0.5-0.2c0.4-0.1,0.8-0.2,1.2-0.4c0.4-0.2,0.9-0.3,1.4-0.5c0.5-0.2,1-0.5,1.5-0.7 + C87.6,37.6,87.7,37.5,87.8,37.4C87.8,37.4,87.8,37.4,87.8,37.4z"/> + <path class="st9" d="M115.4,42.6c0.7-0.2,1.3-0.5,1.9-0.8c0,0,0,0,0,0c0.5-0.3,1.1-0.6,1.6-1c0.1,0,0.1-0.1,0.2-0.1 + c0.5-0.4,0.9-0.8,1.4-1.2c0.1-0.1,0.1-0.1,0.2-0.2c0,0,0,0,0.1-0.1c0.4-0.4,0.8-0.8,1.1-1.3c0,0,0,0,0,0c0.4-0.5,0.7-1,1-1.5 + c0.1-0.1,0.1-0.2,0.2-0.3c0.3-0.5,0.5-1,0.7-1.6c0-0.1,0-0.1,0.1-0.2c0.2-0.5,0.3-1,0.4-1.6c0-0.1,0-0.2,0.1-0.3 + c0.1-0.4,0.1-0.9,0.2-1.3c0-0.1,0-0.3,0.1-0.4c0-0.1,0-0.2,0-0.4c0-0.4,0-0.7,0-1.1c0-0.3,0-0.5,0-0.8l0,0c-0.3-3.4-2-6.4-4.3-8.6 + l0,0L104.6,5.9c-0.1-0.1-0.3-0.2-0.4-0.3l-0.7-0.7l0,0c-4-3.4-9.4-5.3-15.1-4.7c-3.4,0.3-6.6,1.5-9.2,3.3c-1,0.1-1.9,0.1-2.9,0.2 + c-0.4,0-0.8,0.1-1.2,0.1c-1.2,0.1-2.4,0.3-3.6,0.5c-0.3,0-0.6,0.1-0.9,0.1c-45.8,9.3-33.9,80.7-33.7,82.2c0,0,0,0,0,0c0,0,0,0,0,0 + c0,0,0,0,0,0c0,0,0,0,0,0c0-14.5,6.7-27.5,17-36.1l0.4-0.3c1-0.8,2.1-1.6,3.1-2.3c0.2-0.1,0.4-0.2,0.6-0.4c1.1-0.7,2.1-1.3,3.2-2 + c0.2-0.1,0.4-0.2,0.6-0.3c1.1-0.6,2.2-1.1,3.4-1.6c0.2-0.1,0.5-0.2,0.7-0.3c0.9-0.4,1.9-0.7,2.8-1c-0.6-0.6-1.2-1.2-1.9-1.7 + c-1.5-1-3.3-1.6-5.2-1.9c-1.9-0.4-3.9-0.4-5.9-0.3c-2,0.1-4,0.4-6,0.9c1.9-0.8,3.8-1.5,5.9-1.9c2-0.5,4.1-0.8,6.3-0.8 + c2.1,0,4.4,0.3,6.5,1.2c1.7,0.7,3.2,1.9,4.5,3.3c0,0,0,0,0,0c4.1,4.7,10.4,7.5,17.2,6.8c0.6-0.1,1.2-0.2,1.8-0.3l0,0l0.2,0 + c0,0,0,0,0.1,0l21.6-4.4C114.3,43,114.9,42.8,115.4,42.6z"/> + <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="35.2909" y1="43.2855" x2="124.4093" y2="43.2855"> + <stop offset="0" style="stop-color:#FFFFFF"/> + <stop offset="0.1884" style="stop-color:#FCFCFC"/> + <stop offset="0.3217" style="stop-color:#F3F3F3"/> + <stop offset="0.4381" style="stop-color:#E3E3E3"/> + <stop offset="0.5447" style="stop-color:#CDCDCD"/> + <stop offset="0.6448" style="stop-color:#B1B1B1"/> + <stop offset="0.7399" style="stop-color:#8E8E8E"/> + <stop offset="0.8311" style="stop-color:#646464"/> + <stop offset="0.917" style="stop-color:#353535"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path class="st10" d="M115.4,42.6c0.7-0.2,1.3-0.5,1.9-0.8c0,0,0,0,0,0c0.5-0.3,1.1-0.6,1.6-1c0.1,0,0.1-0.1,0.2-0.1 + c0.5-0.4,0.9-0.8,1.4-1.2c0.1-0.1,0.1-0.1,0.2-0.2c0,0,0,0,0.1-0.1c0.4-0.4,0.8-0.8,1.1-1.3c0,0,0,0,0,0c0.4-0.5,0.7-1,1-1.5 + c0.1-0.1,0.1-0.2,0.2-0.3c0.3-0.5,0.5-1,0.7-1.6c0-0.1,0-0.1,0.1-0.2c0.2-0.5,0.3-1,0.4-1.6c0-0.1,0-0.2,0.1-0.3 + c0.1-0.4,0.1-0.9,0.2-1.3c0-0.1,0-0.3,0.1-0.4c0-0.1,0-0.2,0-0.4c0-0.4,0-0.7,0-1.1c0-0.3,0-0.5,0-0.8l0,0c-0.3-3.4-2-6.4-4.3-8.6 + l0,0L104.6,5.9c-0.1-0.1-0.3-0.2-0.4-0.3l-0.7-0.7l0,0c-4-3.4-9.4-5.3-15.1-4.7c-3.4,0.3-6.6,1.5-9.2,3.3c-1,0.1-1.9,0.1-2.9,0.2 + c-0.4,0-0.8,0.1-1.2,0.1c-1.2,0.1-2.4,0.3-3.6,0.5c-0.3,0-0.6,0.1-0.9,0.1c-45.8,9.3-33.9,80.7-33.7,82.2c0,0,0,0,0,0c0,0,0,0,0,0 + c0,0,0,0,0,0c0,0,0,0,0,0c0-14.5,6.7-27.5,17-36.1l0.4-0.3c1-0.8,2.1-1.6,3.1-2.3c0.2-0.1,0.4-0.2,0.6-0.4c1.1-0.7,2.1-1.3,3.2-2 + c0.2-0.1,0.4-0.2,0.6-0.3c1.1-0.6,2.2-1.1,3.4-1.6c0.2-0.1,0.5-0.2,0.7-0.3c0.9-0.4,1.9-0.7,2.8-1c-0.6-0.6-1.2-1.2-1.9-1.7 + c-1.5-1-3.3-1.6-5.2-1.9c-1.9-0.4-3.9-0.4-5.9-0.3c-2,0.1-4,0.4-6,0.9c1.9-0.8,3.8-1.5,5.9-1.9c2-0.5,4.1-0.8,6.3-0.8 + c2.1,0,4.4,0.3,6.5,1.2c1.7,0.7,3.2,1.9,4.5,3.3c0,0,0,0,0,0c4.1,4.7,10.4,7.5,17.2,6.8c0.6-0.1,1.2-0.2,1.8-0.3l0,0l0.2,0 + c0,0,0,0,0.1,0l21.6-4.4C114.3,43,114.9,42.8,115.4,42.6z"/> + <path class="st11" d="M93.9,41.3c-3.5-0.3-6.2-2-6.1-3.9c0.1-1.9,3.1-3.2,6.6-2.9c3.5,0.3,6.2,2,6.1,3.9 + C100.3,40.2,97.4,41.5,93.9,41.3z"/> +</g> +</svg> diff --git a/image/pypy-logo2-white-background.png b/image/pypy-logo2-white-background.png deleted file mode 100644 index 5e4b3ed732549b0d60e655b552f31f1baadf8e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@<O00001 diff --git a/image/pypy_speed_graph.png b/image/pypy_speed_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c6643f080d62b10300b2794b8d00a3c518fb55c3 GIT binary patch literal 41506 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 D5Jg`M diff --git a/pages/compat.rst b/pages/compat.rst --- a/pages/compat.rst +++ b/pages/compat.rst @@ -14,17 +14,11 @@ PyPy3 implements the Python language version 3.6.9. It has been released, but Python is a large language and it is quite possible that a few things are missing. -.. class:: download_menu - - `List of installable top 1000 PyPI packages`_ - PyPy has support for the `CPython C API`_, however there are constructs that are `not compatible`. We strongly advise use of `CFFI`_ instead. CFFI come builtin with PyPy. Many libraries will require a bit of effort to work, but there are known success stories. Check out -PyPy blog for updates, as well as the `Compatibility Wiki`__. - -.. __: https://bitbucket.org/pypy/compatibility/wiki/Home +PyPy blog for updates C extensions need to be recompiled for PyPy in order to work. Depending on your build system, it might work out of the box or will be slightly harder. @@ -33,11 +27,11 @@ library are implemented in pure python, so they don't have to be listed there. Please just check if it imports. If it imports, it should work. -* ``__builtin__, __pypy__, _ast, _cffi_backend, _codecs, _collections, _continuation, _csv, _file, _hashlib, _io, _locale, _lsprof, _md5, _minimal_curses, _multibytecodec, _multiprocessing, _numpypy, _pickle_support, _pypyjson, _random, _rawffi, _sha, _socket, _sre, _ssl, _struct, _testing, _warnings, _weakref, array, binascii, bz2, cStringIO, cmath, cppyy, cpyext, crypt, errno, exceptions, fcntl, gc, imp, itertools, marshal, math, mmap, operator, parser, posix, pwd, pyexpat, pypyjit, select, signal, symbol, sys, termios, thread, time, token, unicodedata, zipimport, zlib`` +``__builtin__, __pypy__, _ast, _cffi_backend, _codecs, _collections, _continuation, _csv, _file, _hashlib, _io, _locale, _lsprof, _md5, _minimal_curses, _multibytecodec, _multiprocessing, _numpypy, _pickle_support, _pypyjson, _random, _rawffi, _sha, _socket, _sre, _ssl, _struct, _testing, _warnings, _weakref, array, binascii, bz2, cStringIO, cmath, cppyy, cpyext, crypt, errno, exceptions, fcntl, gc, imp, itertools, marshal, math, mmap, operator, parser, posix, pwd, pyexpat, pypyjit, select, signal, symbol, sys, termios, thread, time, token, unicodedata, zipimport, zlib`` -Supported, but written in pure Python: +Supported, and written in pure Python: -* ``cPickle, ctypes, datetime, dbm, _functools, grp, readline, resource, sqlite3, syslog`` +``cPickle, ctypes, datetime, dbm, _functools, grp, readline, resource, sqlite3, syslog`` All modules that are pure python in CPython of course work. @@ -79,14 +73,6 @@ .. code-block:: python - f = open("filename", "w") - f.write("stuff") - f.close() - -or using the ``with`` keyword - -.. code-block:: python - with open("filename", "w") as f: f.write("stuff") @@ -95,12 +81,11 @@ In that case, you can easily hit the system limit on the number of file descriptors that are allowed to be opened at the same time. -Since release 5.4, PyPy can be run with the command-line option ``-X -track-resources`` (as in, ``pypy -X track-resources myprogram.py``). -This produces a ResourceWarning when the GC closes a non-closed file or -socket. The traceback for the place where the file or socket was -allocated is given as well, which aids finding places where ``close()`` -is missing. +PyPy can be run with the command-line option ``-X track-resources`` (as in, +``pypy -X track-resources myprogram.py``). This produces a ``ResourceWarning`` +when the GC closes a non-closed file or socket. The traceback for the place +where the file or socket was allocated is given as well, which aids finding +places where ``close()`` is missing. Similarly, remember that you must ``close()`` a non-exhausted generator in order to have its pending ``finally`` or ``with`` diff --git a/pages/download.rst b/pages/download.rst --- a/pages/download.rst +++ b/pages/download.rst @@ -6,7 +6,10 @@ .. link: .. description: -.. class:: download_menu +.. contents:: + :depth: 2 + +.. note:: There are `nightly binary builds`_ available. Those builds are not always as stable as the release, but they contain numerous bugfixes and @@ -24,19 +27,6 @@ .. _what's new in PyPy 7.3.0?: http://doc.pypy.org/en/latest/release-v7.3.0.html -.. class:: download_menu - - * Download - - * `Default (with a JIT Compiler)`_ - * `Other versions`_ - - * `Installing`_ (optional) - * `Installing more modules`_ - * `Building from source`_ - * `Packaging`_ - * `Checksums`_ - .. _`Default (with a JIT Compiler)`: "JIT Compiler" version @@ -83,7 +73,7 @@ * or translate_ your own PyPy. -.. class:: download_menu +.. note:: SSL Certificates diff --git a/pages/features.rst b/pages/features.rst --- a/pages/features.rst +++ b/pages/features.rst @@ -1,12 +1,13 @@ -.. title: What is PyPy? +.. title: PyPy - Features .. slug: features .. date: 2019-12-28 16:14:02 UTC .. tags: .. category: .. link: -.. description: +.. author: The PyPy Team +.. description: What is PyPy and what are its features -PyPy is a replacement for CPython. It is built using the RPython +**PyPy** is a replacement for CPython. It is built using the RPython language that was co-developed with it. The main reason to use it instead of CPython is speed: it runs generally faster (see next section). @@ -39,16 +40,17 @@ .. _`System Z (s390x)`: https://de.wikipedia.org/wiki/System/390 .. _`howtohelp`: howtohelp.html - +.. |---| unicode:: U+2014 .. em dash, trimming surrounding whitespace + :trim: The main features of PyPy: -------------------------- Speed ------ +===== Our `main executable`_ comes with a Just-in-Time compiler. It is -`really fast`_ in running most benchmarks --- including very large and +`really fast`_ in running most benchmarks |---| including very large and complicated Python applications, not just 10-liners. There are two cases that you should be aware where PyPy will *not* be @@ -72,7 +74,7 @@ Memory usage --------------------------- +============ Memory-hungry Python programs (several hundreds of MBs or more) might end up taking less space than they do in CPython. It is not always @@ -81,7 +83,7 @@ Stackless --------------------------- +========= Support for Stackless_ and greenlets are now integrated in the normal PyPy. More detailed information is available here__. @@ -91,7 +93,7 @@ Other features ---------------------------------------- +============== PyPy has many secondary features and semi-independent projects. We will mention here: @@ -105,7 +107,7 @@ Sandboxing --------------------- +========== PyPy's *sandboxing* is a working prototype for the idea of running untrusted user programs. Unlike other sandboxing approaches for Python, PyPy's does not @@ -113,28 +115,32 @@ calls to external libraries (C or platform) with a stub that communicates with an external process handling the policy. -+-----------------------------------------------------------------------------+ -| **Please be aware that it is a prototype only.** *It needs work to become | -| more complete, and you are welcome to help. In particular, almost none | -| of the extension modules work (not even* ``time`` *), and* ``pypy_interact``| -| *is merely a demo. Also, a more complete system would include a way | -| to do the same as* ``pypy_interact`` *from other languages than Python, | -| to embed a sandboxed interpreter inside programs written in other | -| languages.* | -+-----------------------------------------------------------------------------+ +.. note:: + + **Please be aware that it is a prototype only.** It needs work to become + more complete, and you are welcome to help. In particular, almost none + of the extension modules work (not even ``time`` ), and ``pypy_interact`` + is merely a demo. Also, a more complete system would include a way + to do the same as ``pypy_interact`` from other languages than Python, + to embed a sandboxed interpreter inside programs written in other + languages. To run the sandboxed process, you need to get the full sources and build ``pypy-sandbox`` from it (see `Building from source`_). These instructions give you a ``pypy-c`` that you should rename to -``pypy-sandbox`` to avoid future confusion. Then run:: +``pypy-sandbox`` to avoid future confusion. Then run: + +.. code-block:: bash - cd pypy/sandbox - pypy_interact.py path/to/pypy-sandbox - # don't confuse it with pypy/goal/pyinteractive.py! + cd pypy/sandbox + pypy_interact.py path/to/pypy-sandbox + # don't confuse it with pypy/goal/pyinteractive.py! You get a fully sandboxed interpreter, in its own filesystem hierarchy (try ``os.listdir('/')``). For example, you would run an untrusted -script as follows:: +script as follows: + +.. code-block:: bash mkdir virtualtmp cp untrusted.py virtualtmp/ @@ -150,9 +156,6 @@ .. _`Building from source`: download.html#building-from-source .. _`our documentation site`: http://pypy.readthedocs.org/en/latest/sandbox.html - - - .. _`the cli-jit branch`: https://bitbucket.org/pypy/pypy/src/cli-jit .. _`contact us`: contact.html .. _Prolog: https://bitbucket.org/cfbolz/pyrolog/ diff --git a/pages/index.rst b/pages/index.rst --- a/pages/index.rst +++ b/pages/index.rst @@ -7,35 +7,76 @@ .. description: .. type: text -PyPy is a `fast`_, `compliant`_ alternative implementation of the `Python`_ -language (2.7.13 and 3.6.9). It has several advantages and distinct features: +.. raw:: html + + <div class="row"> + <div class="column pb-4"> + +.. image:: images/pypy-logo.svg + :alt: PyPy logo + :width: 350px + +A `fast`_, `compliant`_ alternative implementation of `Python`_ + +.. class:: button + + `Get Started`_ : Download and install + +.. class:: button + + `What is PyPy`_ : Features + +.. class:: button + + `Documentation`_ (external link) - * **Speed:** thanks to its Just-in-Time compiler, Python programs - often run `faster`_ on PyPy. `(What is a JIT compiler?)`_ +.. _`Get Started`: download.html +.. _`What is PyPy`: features.html +.. _`Documentation`: https://doc.pypy.org + +.. raw:: html + + </div> + <div class="column pb-4" "flex-basis: 400px"> + +.. class:: small + +On average, PyPy is **4.4 times faser** than CPython - "If you want your code to run faster, you should probably just use PyPy." +.. figure:: images/pypy_speed_graph.png + :alt: PyPy vs. Python speed comparison graph" + :figclass: text-sm + + PyPy trunk (with JIT) benchmark times normalized to CPython. Smaller is + better. Based on he geometric average of all benchmarks + +.. raw:: html + + </div> + </div> + +:: + + "If you want your code to run faster, + you should probably just use PyPy." -- Guido van Rossum (creator of Python) - * **Memory usage:** memory-hungry Python programs (several hundreds of - MBs or more) might end up taking `less space`_ than they do in CPython. +**Advantages and distinct Features** - * **Compatibility:** PyPy is `highly compatible`_ with existing python code. - It supports `cffi`_ and can run popular python libraries like `twisted`_ - and `django`_. +* **Speed:** thanks to its Just-in-Time compiler, Python programs + often run `faster`_ on PyPy. `(What is a JIT compiler?)`_ - * **Stackless:** PyPy comes by default with support for `stackless mode`_, - providing micro-threads for massive concurrency. +* **Memory usage:** memory-hungry Python programs (several hundreds of + MBs or more) might end up taking `less space`_ than they do in CPython. - * As well as other `features`_. - -.. class:: download +* **Compatibility:** PyPy is `highly compatible`_ with existing python code. + It supports `cffi`_, `cppyy`_, and can run popular python libraries like + `twisted`_ and `django`_. -`Download and try out PyPy`__ +* **Stackless:** PyPy comes by default with support for `stackless mode`_, + providing micro-threads for massive concurrency. -.. __: download.html - -Want to know more? A good place to start is our detailed `speed`_ and -`compatibility`_ reports! +* As well as other `features`_. .. _`stackless mode`: features.html#stackless .. _`Python`: http://python.org/ @@ -48,6 +89,7 @@ .. _`twisted`: https://twistedmatrix.com/ .. _`django`: https://www.djangoproject.com/ .. _`cffi`: https://cffi.readthedocs.org +.. _`cppyy`: https://cppyy.readthedocs.org .. _`features`: features.html .. _`less space`: http://morepypy.blogspot.com/2009/10/gc-improvements.html .. _`highly compatible`: compat.html diff --git a/themes/pypy/assets/css/styles.css b/themes/pypy/assets/css/styles.css --- a/themes/pypy/assets/css/styles.css +++ b/themes/pypy/assets/css/styles.css @@ -1,1070 +1,143 @@ -/*! sanitize.css v8.0.0 | CC0 License | github.com/csstools/sanitize.css */ -*, -::before, -::after { - background-repeat: no-repeat; - box-sizing: border-box; } - -::before, -::after { - text-decoration: inherit; - vertical-align: inherit; } - -html { - cursor: default; - font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - line-height: 1.15; - -moz-tab-size: 4; - tab-size: 4; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; - word-break: break-word; } - body { - margin: 0; } - -h1 { - font-size: 2em; - margin: 0.67em 0; } - -hr { - height: 0; - overflow: visible; } - -main { - display: block; } - -nav ol, -nav ul { - list-style: none; } - -pre { - font-family: Menlo, Consolas, Roboto Mono, Ubuntu Monospace, Noto Mono, Oxygen Mono, Liberation Mono, monospace; - font-size: 1em; } - -a { - background-color: transparent; } - -abbr[title] { - text-decoration: underline; - text-decoration: underline dotted; } - -b, -strong { - font-weight: bolder; } + color: #383939; +} -code, -kbd, -samp { - font-family: Menlo, Consolas, Roboto Mono, Ubuntu Monospace, Noto Mono, Oxygen Mono, Liberation Mono, monospace; - font-size: 1em; } - -small { - font-size: 80%; } - -::-moz-selection { - background-color: #b3d4fc; - color: #000; - text-shadow: none; } - -::selection { - background-color: #b3d4fc; - color: #000; - text-shadow: none; } - -audio, -canvas, -iframe, -img, -svg, -video { - vertical-align: middle; } - -audio, -video { - display: inline-block; } - -audio:not([controls]) { - display: none; - height: 0; } - -img { - border-style: none; } - -svg:not([fill]) { - fill: currentColor; } - -svg:not(:root) { - overflow: hidden; } - -table { - border-collapse: collapse; } - -button, -input, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; } +:visited { + color: darkolivegreen; +} -button, -input, -select { - margin: 0; } - -button { - overflow: visible; - text-transform: none; } - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; } - -fieldset { - padding: 0.35em 0.75em 0.625em; } - -input { - overflow: visible; } - -legend { - color: inherit; - display: table; - max-width: 100%; - white-space: normal; } - -progress { - display: inline-block; - vertical-align: baseline; } - -select { - text-transform: none; } - -textarea { - margin: 0; - overflow: auto; - resize: vertical; } - -[type="checkbox"], -[type="radio"] { - padding: 0; } - -[type="search"] { - -webkit-appearance: textfield; - outline-offset: -2px; } - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; } - -::-webkit-input-placeholder { - color: inherit; - opacity: 0.54; } - -::-webkit-search-decoration { - -webkit-appearance: none; } +.reference:hover { + color: white; + background-color: #d0dad5; +} -::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit; } - -::-moz-focus-inner { - border-style: none; - padding: 0; } - -:-moz-focusring { - outline: 1px dotted ButtonText; } - -details { - display: block; } - -dialog { - background-color: white; - border: solid; - color: black; - display: block; - height: -moz-fit-content; - height: -webkit-fit-content; - height: fit-content; - left: 0; - margin: auto; - padding: 1em; - position: absolute; - right: 0; - width: -moz-fit-content; - width: -webkit-fit-content; - width: fit-content; } - -dialog:not([open]) { - display: none; } - -summary { - display: list-item; } - -canvas { - display: inline-block; } - -template { - display: none; } - -a, -area, -button, -input, -label, -select, -summary, -textarea, -[tabindex] { - -ms-touch-action: manipulation; - touch-action: manipulation; } - -[hidden] { - display: none; } - -[aria-busy="true"] { - cursor: progress; } +/* Add a black background color to the top navigation */ +.topnav { + /* background-color: #333; */ + overflow: hidden; +} -[aria-controls] { - cursor: pointer; } - -[aria-disabled="true"], -[disabled] { - cursor: not-allowed; } - -[aria-hidden="false"][hidden]:not(:focus) { - clip: rect(0, 0, 0, 0); - display: inherit; - position: absolute; } - -/*! Based on https://github.com/milligram/milligram */ -*, -*:after, -*:before { - box-sizing: inherit; } - -html { - box-sizing: border-box; - font-size: 62.5%; } - -body { - font-size: 1.6em; - font-weight: 300; - letter-spacing: .01em; - line-height: 1.6; - background-color: #fcfcfc; } - -body { - color: #4B545C; - font-family: 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; } - -b, -strong { - font-weight: bold; } - -p { - margin-top: 0; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-weight: 300; - letter-spacing: -.1rem; - margin-bottom: 2.0rem; - margin-top: 0; } - -h1 { - font-size: 4.6rem; - line-height: 1.2; } - -h2 { - font-size: 3.6rem; - line-height: 1.25; } - -h3 { - font-size: 2.8rem; - line-height: 1.3; } - -h4 { - font-size: 2.2rem; - letter-spacing: -.08rem; - line-height: 1.35; } - -h5 { - font-size: 1.8rem; - letter-spacing: -.05rem; - line-height: 1.5; } - -h6 { - font-size: 1.6rem; - letter-spacing: 0; - line-height: 1.4; } - -blockquote { - border-left: 0.3rem solid #d1d1d1; - margin-left: 0; - margin-right: 0; - padding: 1rem 1.5rem; } - blockquote *:last-child { - margin-bottom: 0; } - -.button, -button, -input[type='button'], -input[type='reset'], -input[type='submit'] { - background-color: #1890ff; - border: 0.1rem solid #1890ff; - border-radius: .4rem; - color: #fcfcfc; - cursor: pointer; - display: inline-block; - font-size: 1.1rem; - font-weight: 700; - height: 3.8rem; - letter-spacing: .1rem; - line-height: 3.8rem; - padding: 0 3.0rem; +/* Style the links inside the navigation bar */ +.topnav a { + float: left; + display: block; + color: #383939; text-align: center; + padding: 14px 16px; text-decoration: none; - text-transform: uppercase; - white-space: nowrap; - -webkit-box-shadow: 0px 5px 10px 0px rgba(24, 144, 255, 0.2); - -webkit-box-shadow--moz-box-shadow: 0px 5px 10px 0px rgba(24, 144, 255, 0.2); - -webkit-box-shadow-box-shadow: 0px 5px 10px 0px rgba(24, 144, 255, 0.2); } - .button:focus, .button:hover, - button:focus, - button:hover, - input[type='button']:focus, - input[type='button']:hover, - input[type='reset']:focus, - input[type='reset']:hover, - input[type='submit']:focus, - input[type='submit']:hover { - background-color: #4B545C; - border-color: #4B545C; - color: #fcfcfc; - outline: 0; - -webkit-box-shadow: 0px 5px 10px 0px rgba(75, 84, 92, 0.2); - -webkit-box-shadow--moz-box-shadow: 0px 5px 10px 0px rgba(75, 84, 92, 0.2); - -webkit-box-shadow-box-shadow: 0px 5px 10px 0px rgba(75, 84, 92, 0.2); } - .button[disabled], - button[disabled], - input[type='button'][disabled], - input[type='reset'][disabled], - input[type='submit'][disabled] { - cursor: default; - opacity: .5; } - .button[disabled]:focus, .button[disabled]:hover, - button[disabled]:focus, - button[disabled]:hover, - input[type='button'][disabled]:focus, - input[type='button'][disabled]:hover, - input[type='reset'][disabled]:focus, - input[type='reset'][disabled]:hover, - input[type='submit'][disabled]:focus, - input[type='submit'][disabled]:hover { - background-color: #1890ff; - border-color: #1890ff; } - .button.button-outline, - button.button-outline, - input[type='button'].button-outline, - input[type='reset'].button-outline, - input[type='submit'].button-outline { - background-color: transparent; - color: #1890ff; } - .button.button-outline:focus, .button.button-outline:hover, - button.button-outline:focus, - button.button-outline:hover, - input[type='button'].button-outline:focus, - input[type='button'].button-outline:hover, - input[type='reset'].button-outline:focus, - input[type='reset'].button-outline:hover, - input[type='submit'].button-outline:focus, - input[type='submit'].button-outline:hover { - background-color: transparent; - border-color: #4B545C; - color: #4B545C; } - .button.button-outline[disabled]:focus, .button.button-outline[disabled]:hover, - button.button-outline[disabled]:focus, - button.button-outline[disabled]:hover, - input[type='button'].button-outline[disabled]:focus, - input[type='button'].button-outline[disabled]:hover, - input[type='reset'].button-outline[disabled]:focus, - input[type='reset'].button-outline[disabled]:hover, - input[type='submit'].button-outline[disabled]:focus, - input[type='submit'].button-outline[disabled]:hover { - border-color: inherit; - color: #1890ff; } - .button.button-clear, - button.button-clear, - input[type='button'].button-clear, - input[type='reset'].button-clear, - input[type='submit'].button-clear { - background-color: transparent; - border-color: transparent; - color: #1890ff; } - .button.button-clear:focus, .button.button-clear:hover, - button.button-clear:focus, - button.button-clear:hover, - input[type='button'].button-clear:focus, - input[type='button'].button-clear:hover, - input[type='reset'].button-clear:focus, - input[type='reset'].button-clear:hover, - input[type='submit'].button-clear:focus, - input[type='submit'].button-clear:hover { - background-color: transparent; - border-color: transparent; - color: #4B545C; } - .button.button-clear[disabled]:focus, .button.button-clear[disabled]:hover, - button.button-clear[disabled]:focus, - button.button-clear[disabled]:hover, - input[type='button'].button-clear[disabled]:focus, - input[type='button'].button-clear[disabled]:hover, - input[type='reset'].button-clear[disabled]:focus, - input[type='reset'].button-clear[disabled]:hover, - input[type='submit'].button-clear[disabled]:focus, - input[type='submit'].button-clear[disabled]:hover { - color: #1890ff; } + font-size: 17px; +} + +/* Add an active class to highlight the current page */ +.active { + background-color: #4CAF50; + color: white; +} + +/* Hide the link that should open and close the topnav on small screens */ +.topnav .icon { + display: none; +} -code { - background: #f4f5f6; - border-radius: .4rem; - font-size: 86%; - margin: 0 .2rem; - padding: 0.8rem 1rem; - white-space: normal; } +/* Dropdown container - needed to position the dropdown content */ +.dropdown { + float: left; + overflow: hidden; +} -pre { - border-left: 0.3rem solid #1890ff; - padding-left: 2rem; - background: #f4f5f6; - overflow-y: hidden; } - pre > code { - border-radius: 0; - display: block; - padding: 1rem 1.5rem; - white-space: pre; } - -hr { - border: 0; - border-top: 0.1rem solid #d1d1d1; - margin: 3.0rem 0; } +/* Style the dropdown button to fit inside the topnav */ +.dropdown .dropbtn { + font-size: 17px; + border: none; + outline: none; + color: #383939; + padding: 14px 16px; + background-color: inherit; + font-family: inherit; + margin: 0; +} -input[type='email'], -input[type='number'], -input[type='password'], -input[type='search'], -input[type='tel'], -input[type='text'], -input[type='url'], -input[type='color'], -input[type='date'], -input[type='month'], -input[type='week'], -input[type='datetime'], -input[type='datetime-local'], -input:not([type]), -textarea, -select { - -webkit-appearance: none; - -webkit-appearance--moz-appearance: none; - appearance: none; - background-color: transparent; - color: #4B545C; - border: 0.1rem solid #d1d1d1; - border-radius: .4rem; - box-shadow: none; - box-sizing: inherit; - height: 3.8rem; - padding: .6rem 1.0rem; - width: 100%; } - input[type='email']:focus, - input[type='number']:focus, - input[type='password']:focus, - input[type='search']:focus, - input[type='tel']:focus, - input[type='text']:focus, - input[type='url']:focus, - input[type='color']:focus, - input[type='date']:focus, - input[type='month']:focus, - input[type='week']:focus, - input[type='datetime']:focus, - input[type='datetime-local']:focus, - input:not([type]):focus, - textarea:focus, - select:focus { - border-color: #1890ff; - outline: 0; } - -select { - background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="14" viewBox="0 0 29 14" width="29"><path fill="%23d1d1d1" d="M9.37727 3.625l5.08154 6.93523L19.54036 3.625"/></svg>') center right no-repeat; - padding-right: 3.0rem; } - select:focus { - background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="14" viewBox="0 0 29 14" width="29"><path fill="%239b4dca" d="M9.37727 3.625l5.08154 6.93523L19.54036 3.625"/></svg>'); } - -textarea { - min-height: 6.5rem; } - -label, -legend { - display: block; - font-size: 1.6rem; - font-weight: 700; - margin-bottom: .5rem; } - -fieldset { - border-width: 0; - padding: 0; } - -input[type='checkbox'], -input[type='radio'] { - display: inline; } - -.label-inline { - display: inline-block; - font-weight: normal; - margin-left: .5rem; } - -a { - color: #1890ff; - text-decoration: none; } - a:focus, a:hover { - color: #4B545C; } - -dl, -ol, -ul { - list-style: none; - margin-top: 0; - padding-left: 3rem; } - dl dl, - dl ol, - dl ul, - ol dl, - ol ol, - ol ul, - ul dl, - ul ol, - ul ul { - font-size: 90%; - margin: 1.5rem 0 1.5rem 3.0rem; } - -ol { - list-style: decimal inside; - list-style-position: outside; } - -ul { - list-style: circle inside; - list-style-position: outside; } - -.button, -button, -dd, -dt, -li { - margin-bottom: 1.0rem; } - -fieldset, -input, -select, -textarea { - margin-bottom: 1.5rem; } +/* Style the dropdown content (hidden by default) */ +.dropdown-content { + display: none; + position: absolute; + background-color: #f9f9f9; + min-width: 160px; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + z-index: 1; +} -blockquote, -dl, -figure, -form, -ol, -p, -pre, -table, -ul { - margin-bottom: 2.5rem; } - -table { - border-spacing: 0; - width: 100%; } - -td, -th { - border-bottom: 0.1rem solid #e1e1e1; - padding: 1.2rem 1.5rem; - text-align: left; } - td:first-child, - th:first-child { - padding-left: 0; } - td:last-child, - th:last-child { - padding-right: 0; } - -@media screen and (max-width: 40rem) { - table { - border-spacing: 0; - display: flex; - width: 100%; } - table thead { - border-right: solid 0.1rem #e1e1e1; } - table thead td, - table thead th { - padding-left: 0; } - table thead td:first-child, - table thead th:first-child { - padding-left: 0; } - table thead td:last-child, - table thead th:last-child { - padding-right: 1.2rem; } - table tbody { - display: flex; - overflow-x: auto; - white-space: nowrap; } - table tbody tr { - border-right: solid 0.1rem #e1e1e1; } - table tbody tr:last-child { - border-right: none; } - table td, - table th { - display: block; } - table td:first-child, - table th:first-child { - padding-left: 1.2rem; } - table td:last-child, - table th:last-child { - padding-right: 1.2rem; } } - -img { - max-width: 100%; } - -.p-0 { - padding: 0; } - -.pt-0 { - padding-top: 0; } +/* Style the links inside the dropdown */ +.dropdown-content a { + float: none; + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; + text-align: left; +} -.pb-0 { - padding-bottom: 0; } - -.pl-0 { - padding-left: 0; } - -.pr-0 { - padding-right: 0; } - -.py-0 { - padding-top: 0; - padding-bottom: 0; } - -.px-0 { - padding-left: 0; - padding-right: 0; } - -.p-1 { - padding: 1rem; } - -.pt-1 { - padding-top: 1rem; } - -.pb-1 { - padding-bottom: 1rem; } - -.pl-1 { - padding-left: 1rem; } - -.pr-1 { - padding-right: 1rem; } - -.py-1 { - padding-top: 1rem; - padding-bottom: 1rem; } +/* Add a dark background on topnav links and the dropdown button on hover */ +.topnav a:hover, .dropdown:hover .dropbtn { + background-color: #555; + color: white; +} -.px-1 { - padding-left: 1rem; - padding-right: 1rem; } - -.p-2 { - padding: 2rem; } - -.pt-2 { - padding-top: 2rem; } - -.pb-2 { - padding-bottom: 2rem; } - -.pl-2 { - padding-left: 2rem; } - -.pr-2 { - padding-right: 2rem; } - -.py-2 { - padding-top: 2rem; - padding-bottom: 2rem; } - -.px-2 { - padding-left: 2rem; - padding-right: 2rem; } - -.p-3 { - padding: 3rem; } - -.pt-3 { - padding-top: 3rem; } - -.pb-3 { - padding-bottom: 3rem; } +/* Add a grey background to dropdown links on hover */ +.dropdown-content a:hover { + background-color: #ddd; + color: black; +} -.pl-3 { - padding-left: 3rem; } - -.pr-3 { - padding-right: 3rem; } - -.py-3 { - padding-top: 3rem; - padding-bottom: 3rem; } - -.px-3 { - padding-left: 3rem; - padding-right: 3rem; } - -.p-4 { - padding: 6rem; } - -.pt-4 { - padding-top: 6rem; } - -.pb-4 { - padding-bottom: 6rem; } - -.pl-4 { - padding-left: 6rem; } - -.pr-4 { - padding-right: 6rem; } - -.py-4 { - padding-top: 6rem; - padding-bottom: 6rem; } - -.px-4 { - padding-left: 6rem; - padding-right: 6rem; } - -.p-5 { - padding: 8rem; } - -.pt-5 { - padding-top: 8rem; } - -.pb-5 { - padding-bottom: 8rem; } - -.pl-5 { - padding-left: 8rem; } - -.pr-5 { - padding-right: 8rem; } - -.py-5 { - padding-top: 8rem; - padding-bottom: 8rem; } - -.px-5 { - padding-left: 8rem; - padding-right: 8rem; } - -.m-0 { - margin: 0; } - -.mt-0 { - margin-top: 0; } +/* Show the dropdown menu when the user moves the mouse over the dropdown button */ +.dropdown:hover .dropdown-content { + display: block; +} -.mb-0 { - margin-bottom: 0; } - -.ml-0 { - margin-left: 0; } - -.mr-0 { - margin-right: 0; } - -.my-0 { - margin-top: 0; - margin-bottom: 0; } - -.mx-0 { - margin-left: 0; - margin-right: 0; } - -.m-1 { - margin: 1rem; } - -.mt-1 { - margin-top: 1rem; } - -.mb-1 { - margin-bottom: 1rem; } - -.ml-1 { - margin-left: 1rem; } - -.mr-1 { - margin-right: 1rem; } - -.my-1 { - margin-top: 1rem; - margin-bottom: 1rem; } - -.mx-1 { - margin-left: 1rem; - margin-right: 1rem; } - -.m-2 { - margin: 2rem; } - -.mt-2 { - margin-top: 2rem; } - -.mb-2 { - margin-bottom: 2rem; } - -.ml-2 { - margin-left: 2rem; } - -.mr-2 { - margin-right: 2rem; } - -.my-2 { - margin-top: 2rem; - margin-bottom: 2rem; } - -.mx-2 { - margin-left: 2rem; - margin-right: 2rem; } - -.m-3 { - margin: 3rem; } +/* When the screen is less than 600 pixels wide, hide all links, except for the first one ("Home"). Show the link that contains should open and close the topnav (.icon) */ +@media screen and (max-width: 600px) { + .topnav a:not(:first-child), .dropdown .dropbtn { + display: none; + } + .topnav a.icon { + float: right; + display: block; + } +} -.mt-3 { - margin-top: 3rem; } - -.mb-3 { - margin-bottom: 3rem; } - -.ml-3 { - margin-left: 3rem; } - -.mr-3 { - margin-right: 3rem; } - -.my-3 { - margin-top: 3rem; - margin-bottom: 3rem; } - -.mx-3 { - margin-left: 3rem; - margin-right: 3rem; } - -.m-4 { - margin: 6rem; } - -.mt-4 { - margin-top: 6rem; } - -.mb-4 { - margin-bottom: 6rem; } - -.ml-4 { - margin-left: 6rem; } - -.mr-4 { - margin-right: 6rem; } - -.my-4 { - margin-top: 6rem; - margin-bottom: 6rem; } - -.mx-4 { - margin-left: 6rem; - margin-right: 6rem; } - -.m-5 { - margin: 8rem; } - -.mt-5 { - margin-top: 8rem; } - -.mb-5 { - margin-bottom: 8rem; } - -.ml-5 { - margin-left: 8rem; } - -.mr-5 { - margin-right: 8rem; } - -.my-5 { - margin-top: 8rem; - margin-bottom: 8rem; } - -.mx-5 { - margin-left: 8rem; - margin-right: 8rem; } +/* The "responsive" class is added to the topnav with JavaScript when the user clicks on the icon. This class makes the topnav look good on small screens (display the links vertically instead of horizontally) */ +@media screen and (max-width: 600px) { + .topnav.responsive {position: relative;} + .topnav.responsive a.icon { + position: absolute; + right: 0; + top: 0; + } + .topnav.responsive a { + float: none; + display: block; + text-align: left; + } + .topnav.responsive .dropdown {float: none;} + .topnav.responsive .dropdown-content {position: relative;} + .topnav.responsive .dropdown .dropbtn { + display: block; + width: 100%; + text-align: left; + } -.mx-auto { - margin-left: auto; - margin-right: auto; } -.text-justify { - text-align: justify; } - -.text-left { - text-align: left; } - -.text-center { - text-align: center; } - -.text-left { - text-align: right; } - -.text-sm { - font-size: 1rem; } - -.text-lg { - font-size: 2rem; } - -.text-xl { - font-size: 2.5rem; } - -.display-none { - display: none; } - -.display-inline { - display: inline; } - -.display-inline-block { - display: inline-block; } - -.display-block { - display: block; } - -.display-flex { - display: flex; } - -.display-inline-flex { - display: inline-flex; } - -.display-table { - display: table; } - -.clearfix:after { - clear: both; - content: ' '; - display: table; } - -.float-left { - float: left; } - -.float-right { - float: right; } - -.container { - margin: 0 auto; - max-width: 112.0rem; - padding: 0 2.0rem; - position: relative; - width: 100%; } - -.row { +} .row { display: flex; flex-direction: column; padding: 0; width: 100%; } - .row.row-no-padding { - padding: 0; } - .row.row-no-padding > .column { - padding: 0; } - .row.row-wrap { - flex-wrap: wrap; } - .row.row-top { - align-items: flex-start; } - .row.row-bottom { - align-items: flex-end; } - .row.row-center { - align-items: center; } - .row.row-stretch { - align-items: stretch; } - .row.row-baseline { - align-items: baseline; } .row .column { display: block; flex: 1 1 auto; margin-left: 0; max-width: 100%; width: 100%; } - .row .column.column-offset-10 { - margin-left: 10%; } - .row .column.column-offset-20 { - margin-left: 20%; } - .row .column.column-offset-25 { - margin-left: 25%; } - .row .column.column-offset-33, .row .column.column-offset-34 { - margin-left: 33.3333%; } - .row .column.column-offset-50 { - margin-left: 50%; } - .row .column.column-offset-66, .row .column.column-offset-67 { - margin-left: 66.6666%; } - .row .column.column-offset-75 { - margin-left: 75%; } - .row .column.column-offset-80 { - margin-left: 80%; } - .row .column.column-offset-90 { - margin-left: 90%; } - .row .column.column-10 { - flex: 0 0 10%; - max-width: 10%; } - .row .column.column-20 { - flex: 0 0 20%; - max-width: 20%; } - .row .column.column-25 { - flex: 0 0 25%; - max-width: 25%; } - .row .column.column-33, .row .column.column-34 { - flex: 0 0 33.3333%; - max-width: 33.3333%; } - .row .column.column-40 { - flex: 0 0 40%; - max-width: 40%; } - .row .column.column-50 { - flex: 0 0 50%; - max-width: 50%; } - .row .column.column-60 { - flex: 0 0 60%; - max-width: 60%; } - .row .column.column-66, .row .column.column-67 { - flex: 0 0 66.6666%; - max-width: 66.6666%; } - .row .column.column-75 { - flex: 0 0 75%; - max-width: 75%; } - .row .column.column-80 { - flex: 0 0 80%; - max-width: 80%; } - .row .column.column-90 { - flex: 0 0 90%; - max-width: 90%; } - .row .column .column-top { - align-self: flex-start; } - .row .column .column-bottom { - align-self: flex-end; } - .row .column .column-center { - align-self: center; } @media (min-width: 40rem) { .row { @@ -1075,313 +148,54 @@ margin-bottom: inherit; padding: 0 1.0rem; } } -@font-face { - font-family: 'ico'; - src: url("../font/ico.eot?13319731"); - src: url("../font/ico.eot?13319731#iefix") format("embedded-opentype"), url("../font/ico.woff2?13319731") format("woff2"), url("../font/ico.woff?13319731") format("woff"), url("../font/ico.ttf?13319731") format("truetype"), url("../font/ico.svg?13319731#ico") format("svg"); - font-weight: normal; - font-style: normal; } - -/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ -/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ -/* - @media screen and (-webkit-min-device-pixel-ratio:0) { - @font-face { - font-family: 'ico'; - src: url('../font/ico.svg?13319731#ico') format('svg'); - } - } - */ -[class^="icon-"]:before, [class*=" icon-"]:before { - font-family: "ico"; - font-style: normal; - font-weight: normal; - speak: none; - display: inline-block; - text-decoration: inherit; - width: 1em; - margin-right: .2em; - text-align: center; - /* opacity: .8; */ - /* For safety - reset parent styles, that can break glyph codes*/ - font-variant: normal; - text-transform: none; - /* fix buttons height, for twitter bootstrap */ - line-height: 1em; - /* Animation center compensation - margins should be symmetric */ - /* remove if not needed */ - margin-left: .2em; - /* you can be more comfortable with increased icons size */ - /* font-size: 120%; */ - /* Font smoothing. That was taken from TWBS */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - /* Uncomment for 3D effect */ - /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } - -/* - Animation example, for spinners - */ -.animate-spin { - -moz-animation: spin 2s infinite linear; - -o-animation: spin 2s infinite linear; - -webkit-animation: spin 2s infinite linear; - animation: spin 2s infinite linear; - display: inline-block; } - -@-moz-keyframes spin { - 0% { - -moz-transform: rotate(0deg); - -o-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -moz-transform: rotate(359deg); - -o-transform: rotate(359deg); - -webkit-transform: rotate(359deg); - transform: rotate(359deg); } } - -@-webkit-keyframes spin { - 0% { - -moz-transform: rotate(0deg); - -o-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -moz-transform: rotate(359deg); - -o-transform: rotate(359deg); - -webkit-transform: rotate(359deg); - transform: rotate(359deg); } } - -@-o-keyframes spin { - 0% { - -moz-transform: rotate(0deg); - -o-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -moz-transform: rotate(359deg); - -o-transform: rotate(359deg); - -webkit-transform: rotate(359deg); - transform: rotate(359deg); } } - -@-ms-keyframes spin { - 0% { - -moz-transform: rotate(0deg); - -o-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -moz-transform: rotate(359deg); - -o-transform: rotate(359deg); - -webkit-transform: rotate(359deg); - transform: rotate(359deg); } } - -@keyframes spin { - 0% { - -moz-transform: rotate(0deg); - -o-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -moz-transform: rotate(359deg); - -o-transform: rotate(359deg); - -webkit-transform: rotate(359deg); - transform: rotate(359deg); } } - -.icon-menu-outline:before { - content: '\e800'; } - -.icon-github-circled:before { - content: '\f09b'; } - -.icon-rss:before { - content: '\f09e'; } - -.icon-menu:before { - content: '\f0c9'; } - -.icon-spinner:before { - content: '\f110'; } - -.icon-code:before { - content: '\f121'; } - -.icon-bitbucket:before { - content: '\f171'; } - -.icon-circle-notch:before { - content: '\f1ce'; } - -.icon-github-text:before { - content: '\f307'; } - -.navbar { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - margin-top: 2rem; - padding-left: 0; - padding-inline-start: 0; } - -.navbar-item { - padding: 0.5rem 0.66rem; - margin: 0 0.2rem; } - -.nav-item-active { - border-radius: .4rem; - border: 0.1rem solid #1890ff; } - .nav-item-active:hover { - border-color: #4B545C; } - -.navbar-menu { - display: none; - position: fixed; - right: 0; - top: 0; - z-index: 100; - padding: 0.5rem 0.66rem; - margin-top: 2rem; - margin-right: 2rem; - border-radius: 50%; - background-color: #fff; } - -@media screen and (max-width: 60rem) { - .navbar { - justify-content: center; } } - -.navbar-smart { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - margin-top: 2rem; - padding-left: 0; - padding-inline-start: 0; } - -@media screen and (max-width: 60rem) { - .navbar-menu-on { - display: block; } - .navbar-smart { - display: none; - flex-direction: column; - align-items: flex-start; - position: fixed; - left: 0; - top: 0; - width: 100%; - z-index: 100; - padding: 1rem; - background-color: rgba(255, 255, 255, 0.98); } - .navbar-open { - display: flex; } } - -.shadow { - -webkit-box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.3); - box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.3); } - -.shadow-lg { - -webkit-box-shadow: 0px 10px 20px 0px rgba(0, 0, 0, 0.8); - -moz-box-shadow: 0px 10px 20px 0px rgba(0, 0, 0, 0.8); - box-shadow: 0px 10px 20px 0px rgba(0, 0, 0, 0.8); } - -.active { - -webkit-box-shadow: 0px 5px 10px 0px rgba(24, 144, 255, 0.2); - -moz-box-shadow: 0px 5px 10px 0px rgba(24, 144, 255, 0.2); - box-shadow: 0px 5px 10px 0px rgba(24, 144, 255, 0.2); } - -.shadow-secondary { - -webkit-box-shadow: 0px 5px 10px 0px rgba(75, 84, 92, 0.2); - -moz-box-shadow: 0px 5px 10px 0px rgba(75, 84, 92, 0.2); - box-shadow: 0px 5px 10px 0px rgba(75, 84, 92, 0.2); } - -.muted { - color: #8B9298; } - @media screen and (max-width: 40rem) { .row .column { text-align: center; } } -.person { - min-height: 190px; - margin-bottom: 8rem; } - .person h3 { - margin-bottom: 1rem; } - .person img { - float: left; - max-width: 150px; - margin-right: 2rem; - margin-bottom: 1rem; } - .person p { - margin-left: 150px; } +.pb-4 { + padding-bottom: 6rem; } -@media screen and (max-width: 40rem) { - .person img { - float: none; } - .person p { - margin-left: 0; } } +.text-sm { + font-size: 1rem; } -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #9006b3; - background: #f4f5f6; } - -.hljs-comment, -.hljs-quote { - color: #bbbcc2; - font-style: italic; } - -.hljs-doctag, -.hljs-keyword, -.hljs-formula { - color: #dd4600; } +.text-lg { + font-size: 2rem; } -.hljs-section, -.hljs-name, -.hljs-selector-tag, -.hljs-deletion, -.hljs-subst { - color: #e45649; } - -.hljs-literal { - color: #009c15; } - -.hljs-string, -.hljs-regexp, -.hljs-addition, -.hljs-attribute, -.hljs-meta-string { - color: #2e912c; } - -.hljs-built_in, -.hljs-class .hljs-title { - color: #c1ae01; } +/*.button, button { + background-color: transparent; + border: 0.1rem solid #1890ff; + border-radius: .4rem; + cursor: pointer; + display: inline-block; + font-weight: 700; + height: 2rem; + letter-spacing: .1rem; + line-height: 2rem; + padding: 0 2.0rem; + text-align: center; + text-decoration: none; + text-transform: uppercase; + white-space: nowrap; +} -.hljs-attr, -.hljs-variable, -.hljs-template-variable, -.hljs-type, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-number { - color: #b97f00; } +.button:focus, .button:hover, +button:focus, +button:hover + { + background-color: lightblue; + border-color: #4B545C; + color: white; +} +*/ +pre.literal-block { + border-left: 0.3rem solid #d1d1d1; + margin-left: 0; + margin-right: 0; + padding: 1rem 1.5rem; +} -.hljs-symbol, -.hljs-bullet, -.hljs-link, -.hljs-meta, -.hljs-selector-id, -.hljs-title { - color: #2263f0; } +pre.literal-block *:last-child { + margin-bottom: 0; +} -.hljs-emphasis { - font-style: italic; } -.hljs-strong { - font-weight: bold; } - -.hljs-link { - text-decoration: underline; } diff --git a/themes/pypy/assets/js/styles.js b/themes/pypy/assets/js/styles.js --- a/themes/pypy/assets/js/styles.js +++ b/themes/pypy/assets/js/styles.js @@ -1,43 +1,12 @@ 'use strict'; // Navbar -(function () { - // Swap simple navbar for smart navbar - function swapNavbars() { - var navbars = document.getElementsByClassName("js-navbar"); - [].forEach.call(navbars, function (navbar) { - if (navbar.classList.contains("navbar")) { - navbar.classList.remove("navbar"); - navbar.classList.add("navbar-smart"); - // also turn on the menu button - var menuButtons = navbar.parentNode.getElementsByClassName("js-navbar-toggler"); - [].forEach.call(menuButtons, function (menuButton) { - menuButton.classList.add("navbar-menu-on"); - }); - } - }); - } - - // Add event to show or hide the navbar menu when icon is clicked - function toggleNavbarMenu() { - var navbars = document.getElementsByClassName("js-navbar"); - - [].forEach.call(navbars, function (navbar) { - // only works with "navbar-smart" - if (navbar.classList.contains("navbar-smart")) { - var menuButtons = navbar.parentNode.getElementsByClassName("js-navbar-toggler"); - [].forEach.call(menuButtons, function (menuButton) { - menuButton.addEventListener('click', function (e) { - e.preventDefault(); - var related_navbar = navbar; - related_navbar.classList.toggle('navbar-open'); - }); - }); - } - }); - } - document.addEventListener("DOMContentLoaded", function () { - swapNavbars(); - toggleNavbarMenu(); - }); -})(); +/* Toggle between adding and removing the "responsive" class to topnav when the user clicks on the icon */ +function make_responsive() { + var x = document.getElementById("myTopNav"); + if (x.className === "topnav") { + x.className += " responsive"; + } else { + x.className = "topnav"; + } +} diff --git a/themes/pypy/templates/base_header.tml b/themes/pypy/templates/base_header.tml deleted file mode 100644 --- a/themes/pypy/templates/base_header.tml +++ /dev/null @@ -1,72 +0,0 @@ -{# -*- coding: utf-8 -*- #} -{% import 'base_helper.tmpl' as base with context %} - -{% macro html_header() %} - <header id="header"> - {{ html_site_title() }} - {{ html_translation_header() }} - {{ html_navigation_links() }} - {% if search_form %} - <div class="searchform" role="search"> - {{ search_form }} - </div> - {% endif %} - </header> - {{ template_hooks['page_header']() }} - {% block extra_header %}{% endblock %} -{% endmacro %} - -{% macro html_site_title() %} - <h1 id="brand"><a href="{{ abs_link(_link("root", None, lang)) }}" title="{{ blog_title|e }}" rel="home"> - {% if logo_url %} - <img src="{{ logo_url }}" alt="{{ blog_title|e }}" id="logo"> - {% endif %} - - {% if show_blog_title %} - <span id="blog-title">{{ blog_title|e }}</span> - {% endif %} - </a></h1> -{% endmacro %} - -{% macro html_navigation_links() %} - <nav id="menu"> - <ul class="navbar js-navbar"> - {{ html_navigation_links_entries(navigation_links) }} - {{ html_navigation_links_entries(navigation_alt_links) }} - {{ template_hooks['menu']() }} - {{ template_hooks['menu_alt']() }} - </ul> - </nav> -{% endmacro %} - -{% macro html_navigation_links_entries(navigation_links_source) %} - {% for url, text in navigation_links_source[lang] %} - {% if isinstance(url, tuple) %} - <li> {{ text }} - <ul> - {% for suburl, text in url %} - {% if rel_link(permalink, suburl) == "#" %} - <li class="navbar-item nav-item-active"><a href="{{ permalink }}">{{ text }}<span class="sr-only"> {{ messages("(active)", lang) }}</span></a></li> - {% else %} - <li class="navbar-item"><a href="{{ suburl }}">{{ text }}</a></li> - {% endif %} - {% endfor %} - </ul> - {% else %} - {% if rel_link(permalink, url) == "#" %} - <li class="navbar-item nav-item-active"><a href="{{ permalink }}">{{ text }}<span class="sr-only"> {{ messages("(active)", lang) }}</span></a></li> - {% else %} - <li class="navbar-item"><a href="{{ url }}">{{ text }}</a></li> - {% endif %} - {% endif %} - {% endfor %} -{% endmacro %} - -{% macro html_translation_header() %} - {% if translations|length > 1 %} - <div id="toptranslations"> - <h2>{{ messages("Languages:") }}</h2> - {{ base.html_translations() }} - </div> - {% endif %} -{% endmacro %} diff --git a/themes/pypy/templates/base_header.tmpl b/themes/pypy/templates/base_header.tmpl new file mode 100644 --- /dev/null +++ b/themes/pypy/templates/base_header.tmpl @@ -0,0 +1,75 @@ +{# -*- coding: utf-8 -*- #} +{% import 'base_helper.tmpl' as base with context %} + +{% macro html_header() %} + <header id="header"> + {{ html_site_title() }} + {{ html_translation_header() }} + {{ html_navigation_links() }} + {% if search_form %} + <div class="searchform" role="search"> + {{ search_form }} + </div> + {% endif %} + </header> + {{ template_hooks['page_header']() }} + {% block extra_header %}{% endblock %} +{% endmacro %} + +{% macro html_site_title() %} + <h1 id="brand"><a href="{{ abs_link(_link("root", None, lang)) }}" title="{{ blog_title|e }}" rel="home"> + {% if logo_url %} + <img src="{{ logo_url }}" alt="{{ blog_title|e }}" id="logo"> + {% endif %} + + {% if show_blog_title %} + <span id="blog-title">{{ blog_title|e }}</span> + {% endif %} + </a></h1> +{% endmacro %} + +{% macro html_navigation_links() %} + <div class="topnav" id="myTopNav"> + <div> + {{ html_navigation_links_entries(navigation_links) }} + {{ html_navigation_links_entries(navigation_alt_links) }} + {{ template_hooks['menu']() }} + {{ template_hooks['menu_alt']() }} + </div> + <a href="javascript:void(0);" class="icon" onclick="make_responsive()">☰</a> + </div> +{% endmacro %} + +{% macro html_navigation_links_entries(navigation_links_source) %} + {% for url, text in navigation_links_source[lang] %} + {% if isinstance(url, tuple) %} + <div class="dropdown"> <button class="dropbtn">{{ text }} + <i class="fa fa-caret-down"></i> + </button> + <div class="dropdown-content"> + {% for suburl, text in url %} + {% if rel_link(permalink, suburl) == "#" %} + <a class="active" href="{{ permalink }}">{{ text }}{{ messages("(active)", lang) }}</a> + {% else %} + <a href="{{ suburl }}">{{ text }}</a> + {% endif %} + {% endfor %} + </div></div> + {% else %} + {% if rel_link(permalink, url) == "#" %} + <a class="active" href="{{ permalink }}">{{ text }}<span class="sr-only"> {{ messages("(active)", lang) }}</span></a> + {% else %} + <a href="{{ url }}">{{ text }}</a> + {% endif %} + {% endif %} + {% endfor %} +{% endmacro %} + +{% macro html_translation_header() %} + {% if translations|length > 1 %} + <div id="toptranslations"> + <h2>{{ messages("Languages:") }}</h2> + {{ base.html_translations() }} + </div> + {% endif %} +{% endmacro %}