diff --git a/.gitignore b/.gitignore index 2c309b0..19148f1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ Gemfile.lock .Rhistory *.Rproj **.DS_Store + +/.quarto/ diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 187096c..0000000 --- a/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -source 'https://rubygems.org' -gem 'github-pages', group: :jekyll_plugins - -gem "webrick", "~> 1.7" diff --git a/README.html b/README.html deleted file mode 100644 index 5d0b3e4..0000000 --- a/README.html +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - - - -README - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - -
-

Source for R Contributor Site

-
-

Website structure

-

The top-level pages linked in the menu are in correspondingly named markdown files, e.g. 

- - - - - - - - - - - - - - - - - - - - -
Menu itemMarkdown fileRelative URL
Homeindex.md/
Slack Groupslack.md/slack
-

You can create sub-pages by creating a folder with an index.md file. Any further markdown pages within that folder will be sub-pages under that, e.g.

- ---- - - - - - - - - - - - - - - - - -
Markdown fileRelative URL
translating-r-to-your-language/index.md/translating-r-to-your-language
translating-r-to-your-language/prep.md/translating-r-to-your-language/prep
-
-
-

Basic editing

-

You can edit the markdown files on the gh-pages branch and the changes will be automatically deployed to the live site once the changes are committed. If you edit the files directly on GitHub using the browser editor, then you can use the Preview tab to check the formatting before committing.

-
-
-

Substantial editing

-

If you are making substantial changes, e.g. adding a new page, or making changes that require collaborating editing/review before being pushed, create a branch and make the changes there.

-

Any changes pushed to a different branch will not be automatically deployed to preview. so if the GitHub editor preview is not sufficient (i.e. you are doing more than editing a single page) it is best to clone the repo and make your changes locally.

-
-

Previewing locally

-

To preview the site locally, you will need to install Jekyll, see https://jekyllrb.com/docs/ for installation instructions for common operating systems.

-

To build the site and make it available on a local server, run the following command in a terminal from the top level directory of the locally cloned repository.

-
bundle exec jekyll serve
-

If you use RStudio, you can open this README.md file and use Ctrl/Cmd + Alt + Enter to send the above line to the terminal.

-

Open http://localhost:4000 in your browser to preview the site. The site is repeatedly rebuilt, so if you make changes to the markdown files and save them, you should see the changes straight-away. Use Ctrl/Cmd + C to stop locally serving the site.

-

You will need to restart the server if you add/remove items from the menu.

-
-
-

Creating pages

-

Please use the following YAML fields when creating new pages:

-
---
-title: Title in Title Case
-description: Short description, less than 160 characters.
-image: image-file.jpg
-layout: custom
----
-

These are used to create cards when sharing links on social media. The image file should be in the same directory as the markdown file. JPG, PNG, WEBP and GIF formats are supported. Only the first frame of an animated GIF will be used. The layout should always be custom. The title will be added to the post as a level 1 header. You can check how the card will look using the following validators:

- -

The Facebook debugger requires log in; you can ignore the following warning

-
The following required properties are missing: fb:app_id
-

as that property is not required.

-
-
-

Editing the menu

-

To edit the menu you need to edit the navigation field of _config.yml.

-

To add a new page, add a new element with the title and URL of the page. Use the relative URL for pages in this repo, e.g.

-
  - title: Slack Group
-    url: slack
-

Use the full URL for external pages, e.g. 

-
  - title: R Developer Page
-    url: https://developer.r-project.org/
-
-
-
-

Website theme

-

This is a GitHub pages site, using the modified minimal Jekyll theme by kbsezginel. The theme documentation provides instructions for initial setup and customization, which are probably not required for day-to-day editing.

-
-

Jekyll/Liquid notes

-
    -
  • | relative.url filter will make path relative (add / at beginning if necessary)
  • -
  • | absolute.url filter will add the site domain at the start
  • -
-
-
-
-

Icons

-

Some icons obtained from https://uxwing.com.

-
-
- - - - -
- - - - - - - - - - - - - - - diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 8d91c8a..0000000 --- a/_config.yml +++ /dev/null @@ -1,41 +0,0 @@ -theme: jekyll-theme-minimal -title: R Contributor Site -description: A site for people interested in contributing to R core - - the code and documentation that gets distributed as base R. -logo: assets/img/Rlogo.png -description: -show_downloads: false -github: - is_project_page: false -owner_url: working-group -owner_name: the R Contribution Working Group -image: assets/img/Rlogo-white.png -mastodon: https://hachyderm.io/@R_Contributors -mastodon_alt: R Contributors Mastodon profile -bluesky: https://bsky.app/profile/R-Contributors.hachyderm.io.ap.brid.gy -bluesky_alt: R Contributors Bluesky profile -github: r-devel -github_alt: R-devel GitHub organization -navigation: - - title: Home - url: / - - title: Slack Group - url: slack - - title: Events - url: events - - title: Tutorials & demos - url: tutorials - - title: R Development Guide - url: https://contributor.r-project.org/rdevguide/ - - title: Translations Community Page - url: https://contributor.r-project.org/translations/ - - title: R Contribution Working Group - url: working-group - - title: R Core Developer Page - url: https://developer.r-project.org/ - - title: R Project Blog - url: https://blog.r-project.org/ - - title: R SVN CI Dashboard - url: https://contributor.r-project.org/svn-dashboard - - title: R Universe - url: https://r-universe.dev \ No newline at end of file diff --git a/_extensions/mcanouil/iconify/LICENSE b/_extensions/mcanouil/iconify/LICENSE new file mode 100644 index 0000000..43fb0c2 --- /dev/null +++ b/_extensions/mcanouil/iconify/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Mickaël Canouil + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/_extensions/mcanouil/iconify/_extension.yml b/_extensions/mcanouil/iconify/_extension.yml new file mode 100644 index 0000000..07da98a --- /dev/null +++ b/_extensions/mcanouil/iconify/_extension.yml @@ -0,0 +1,7 @@ +title: Iconify +author: Mickaël Canouil +version: 3.0.0 +quarto-required: ">=1.5.57" +contributes: + shortcodes: + - iconify.lua diff --git a/_extensions/mcanouil/iconify/iconify-icon.min.js b/_extensions/mcanouil/iconify/iconify-icon.min.js new file mode 100644 index 0000000..00cee26 --- /dev/null +++ b/_extensions/mcanouil/iconify/iconify-icon.min.js @@ -0,0 +1,13 @@ +/** +* (c) Iconify +* +* For the full copyright and license information, please view the license.txt +* files at https://github.com/iconify/iconify +* +* Licensed under MIT. +* Source: https://github.com/iconify/code/tree/gh-pages/iconify-icon +* +* @license MIT +* @version 3.0.0 +*/ +!function(){"use strict";const t=Object.freeze({left:0,top:0,width:16,height:16}),e=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),n=Object.freeze({...t,...e}),i=Object.freeze({...n,body:"",hidden:!1}),r=Object.freeze({width:null,height:null}),o=Object.freeze({...r,...e});const s=/[\s,]+/;const c={...o,preserveAspectRatio:""};function a(t){const e={...c},n=(e,n)=>t.getAttribute(e)||n;var i;return e.width=n("width",null),e.height=n("height",null),e.rotate=function(t,e=0){const n=t.replace(/^-?[0-9.]*/,"");function i(t){for(;t<0;)t+=4;return t%4}if(""===n){const e=parseInt(t);return isNaN(e)?0:i(e)}if(n!==t){let e=0;switch(n){case"%":e=25;break;case"deg":e=90}if(e){let r=parseFloat(t.slice(0,t.length-n.length));return isNaN(r)?0:(r/=e,r%1==0?i(r):0)}}return e}(n("rotate","")),i=e,n("flip","").split(s).forEach((t=>{switch(t.trim()){case"horizontal":i.hFlip=!0;break;case"vertical":i.vFlip=!0}})),e.preserveAspectRatio=n("preserveAspectRatio",n("preserveaspectratio","")),e}const u=/^[a-z0-9]+(-[a-z0-9]+)*$/,l=(t,e,n,i="")=>{const r=t.split(":");if("@"===t.slice(0,1)){if(r.length<2||r.length>3)return null;i=r.shift().slice(1)}if(r.length>3||!r.length)return null;if(r.length>1){const t=r.pop(),n=r.pop(),o={provider:r.length>0?r[0]:i,prefix:n,name:t};return e&&!f(o)?null:o}const o=r[0],s=o.split("-");if(s.length>1){const t={provider:i,prefix:s.shift(),name:s.join("-")};return e&&!f(t)?null:t}if(n&&""===i){const t={provider:i,prefix:"",name:o};return e&&!f(t,n)?null:t}return null},f=(t,e)=>!!t&&!(!(e&&""===t.prefix||t.prefix)||!t.name);function d(t,n){const r=function(t,e){const n={};!t.hFlip!=!e.hFlip&&(n.hFlip=!0),!t.vFlip!=!e.vFlip&&(n.vFlip=!0);const i=((t.rotate||0)+(e.rotate||0))%4;return i&&(n.rotate=i),n}(t,n);for(const o in i)o in e?o in t&&!(o in r)&&(r[o]=e[o]):o in n?r[o]=n[o]:o in t&&(r[o]=t[o]);return r}function h(t,e,n){const i=t.icons,r=t.aliases||Object.create(null);let o={};function s(t){o=d(i[t]||r[t],o)}return s(e),n.forEach(s),d(t,o)}function p(t,e){const n=[];if("object"!=typeof t||"object"!=typeof t.icons)return n;t.not_found instanceof Array&&t.not_found.forEach((t=>{e(t,null),n.push(t)}));const i=function(t,e){const n=t.icons,i=t.aliases||Object.create(null),r=Object.create(null);return Object.keys(n).concat(Object.keys(i)).forEach((function t(e){if(n[e])return r[e]=[];if(!(e in r)){r[e]=null;const n=i[e]&&i[e].parent,o=n&&t(n);o&&(r[e]=[n].concat(o))}return r[e]})),r}(t);for(const r in i){const o=i[r];o&&(e(r,h(t,r,o)),n.push(r))}return n}const g={provider:"",aliases:{},not_found:{},...t};function b(t,e){for(const n in e)if(n in t&&typeof t[n]!=typeof e[n])return!1;return!0}function v(t){if("object"!=typeof t||null===t)return null;const e=t;if("string"!=typeof e.prefix||!t.icons||"object"!=typeof t.icons)return null;if(!b(t,g))return null;const n=e.icons;for(const t in n){const e=n[t];if(!t||"string"!=typeof e.body||!b(e,i))return null}const r=e.aliases||Object.create(null);for(const t in r){const e=r[t],o=e.parent;if(!t||"string"!=typeof o||!n[o]&&!r[o]||!b(e,i))return null}return e}const m=Object.create(null);function y(t,e){const n=m[t]||(m[t]=Object.create(null));return n[e]||(n[e]=function(t,e){return{provider:t,prefix:e,icons:Object.create(null),missing:new Set}}(t,e))}function x(t,e){return v(e)?p(e,((e,n)=>{n?t.icons[e]=n:t.missing.add(e)})):[]}function _(t,e){let n=[];return("string"==typeof t?[t]:Object.keys(m)).forEach((t=>{("string"==typeof t&&"string"==typeof e?[e]:Object.keys(m[t]||{})).forEach((e=>{const i=y(t,e);n=n.concat(Object.keys(i.icons).map((n=>(""!==t?"@"+t+":":"")+e+":"+n)))}))})),n}let w=!1;function k(t){return"boolean"==typeof t&&(w=t),w}function A(t){const e="string"==typeof t?l(t,!0,w):t;if(e){const t=y(e.provider,e.prefix),n=e.name;return t.icons[n]||(t.missing.has(n)?null:void 0)}}function j(t,e){const n=l(t,!0,w);if(!n)return!1;const i=y(n.provider,n.prefix);return e?function(t,e,n){try{if("string"==typeof n.body)return t.icons[e]={...n},!0}catch(t){}return!1}(i,n.name,e):(i.missing.add(n.name),!0)}function O(t,e){if("object"!=typeof t)return!1;if("string"!=typeof e&&(e=t.provider||""),w&&!e&&!t.prefix){let e=!1;return v(t)&&(t.prefix="",p(t,((t,n)=>{j(t,n)&&(e=!0)}))),e}const n=t.prefix;if(!f({prefix:n,name:"a"}))return!1;return!!x(y(e,n),t)}function C(t){return!!A(t)}function I(t){const e=A(t);return e?{...n,...e}:e}function E(t,e){t.forEach((t=>{const n=t.loaderCallbacks;n&&(t.loaderCallbacks=n.filter((t=>t.id!==e)))}))}let T=0;const F=Object.create(null);function R(t,e){F[t]=e}function S(t){return F[t]||F[""]}var L={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function P(t,e,n,i){const r=t.resources.length,o=t.random?Math.floor(Math.random()*r):t.index;let s;if(t.random){let e=t.resources.slice(0);for(s=[];e.length>1;){const t=Math.floor(Math.random()*e.length);s.push(e[t]),e=e.slice(0,t).concat(e.slice(t+1))}s=s.concat(e)}else s=t.resources.slice(o).concat(t.resources.slice(0,o));const c=Date.now();let a,u="pending",l=0,f=null,d=[],h=[];function p(){f&&(clearTimeout(f),f=null)}function g(){"pending"===u&&(u="aborted"),p(),d.forEach((t=>{"pending"===t.status&&(t.status="aborted")})),d=[]}function b(t,e){e&&(h=[]),"function"==typeof t&&h.push(t)}function v(){u="failed",h.forEach((t=>{t(void 0,a)}))}function m(){d.forEach((t=>{"pending"===t.status&&(t.status="aborted")})),d=[]}function y(){if("pending"!==u)return;p();const i=s.shift();if(void 0===i)return d.length?void(f=setTimeout((()=>{p(),"pending"===u&&(m(),v())}),t.timeout)):void v();const r={status:"pending",resource:i,callback:(e,n)=>{!function(e,n,i){const r="success"!==n;switch(d=d.filter((t=>t!==e)),u){case"pending":break;case"failed":if(r||!t.dataAfterTimeout)return;break;default:return}if("abort"===n)return a=i,void v();if(r)return a=i,void(d.length||(s.length?y():v()));if(p(),m(),!t.random){const n=t.resources.indexOf(e.resource);-1!==n&&n!==t.index&&(t.index=n)}u="completed",h.forEach((t=>{t(i)}))}(r,e,n)}};d.push(r),l++,f=setTimeout(y,t.rotate),n(i,e,r.callback)}return"function"==typeof i&&h.push(i),setTimeout(y),function(){return{startTime:c,payload:e,status:u,queriesSent:l,queriesPending:d.length,subscribe:b,abort:g}}}function M(t){const e={...L,...t};let n=[];function i(){n=n.filter((t=>"pending"===t().status))}return{query:function(t,r,o){const s=P(e,t,r,((t,e)=>{i(),o&&o(t,e)}));return n.push(s),s},find:function(t){return n.find((e=>t(e)))||null},setIndex:t=>{e.index=t},getIndex:()=>e.index,cleanup:i}}function N(t){let e;if("string"==typeof t.resources)e=[t.resources];else if(e=t.resources,!(e instanceof Array&&e.length))return null;return{resources:e,path:t.path||"/",maxURL:t.maxURL||500,rotate:t.rotate||750,timeout:t.timeout||5e3,random:!0===t.random,index:t.index||0,dataAfterTimeout:!1!==t.dataAfterTimeout}}const z=Object.create(null),Q=["https://api.simplesvg.com","https://api.unisvg.com"],q=[];for(;Q.length>0;)1===Q.length||Math.random()>.5?q.push(Q.shift()):q.push(Q.pop());function U(t,e){const n=N(e);return null!==n&&(z[t]=n,!0)}function D(t){return z[t]}function H(){return Object.keys(z)}function J(){}z[""]=N({resources:["https://api.iconify.design"].concat(q)});const $=Object.create(null);function B(t,e,n){let i,r;if("string"==typeof t){const e=S(t);if(!e)return n(void 0,424),J;r=e.send;const o=function(t){if(!$[t]){const e=D(t);if(!e)return;const n={config:e,redundancy:M(e)};$[t]=n}return $[t]}(t);o&&(i=o.redundancy)}else{const e=N(t);if(e){i=M(e);const n=S(t.resources?t.resources[0]:"");n&&(r=n.send)}}return i&&r?i.query(e,r,n)().abort:(n(void 0,424),J)}function G(){}function V(t){t.iconsLoaderFlag||(t.iconsLoaderFlag=!0,setTimeout((()=>{t.iconsLoaderFlag=!1,function(t){t.pendingCallbacksFlag||(t.pendingCallbacksFlag=!0,setTimeout((()=>{t.pendingCallbacksFlag=!1;const e=t.loaderCallbacks?t.loaderCallbacks.slice(0):[];if(!e.length)return;let n=!1;const i=t.provider,r=t.prefix;e.forEach((e=>{const o=e.icons,s=o.pending.length;o.pending=o.pending.filter((e=>{if(e.prefix!==r)return!0;const s=e.name;if(t.icons[s])o.loaded.push({provider:i,prefix:r,name:s});else{if(!t.missing.has(s))return n=!0,!0;o.missing.push({provider:i,prefix:r,name:s})}return!1})),o.pending.length!==s&&(n||E([t],e.id),e.callback(o.loaded.slice(0),o.missing.slice(0),o.pending.slice(0),e.abort))}))})))}(t)})))}function K(t,e,n){function i(){const n=t.pendingIcons;e.forEach((e=>{n&&n.delete(e),t.icons[e]||t.missing.add(e)}))}if(n&&"object"==typeof n)try{if(!x(t,n).length)return void i()}catch(t){console.error(t)}i(),V(t)}function W(t,e){t instanceof Promise?t.then((t=>{e(t)})).catch((()=>{e(null)})):e(t)}function X(t,e){t.iconsToLoad?t.iconsToLoad=t.iconsToLoad.concat(e).sort():t.iconsToLoad=e,t.iconsQueueFlag||(t.iconsQueueFlag=!0,setTimeout((()=>{t.iconsQueueFlag=!1;const{provider:e,prefix:n}=t,i=t.iconsToLoad;if(delete t.iconsToLoad,!i||!i.length)return;const r=t.loadIcon;if(t.loadIcons&&(i.length>1||!r))return void W(t.loadIcons(i,n,e),(e=>{K(t,i,e)}));if(r)return void i.forEach((i=>{W(r(i,n,e),(e=>{K(t,[i],e?{prefix:n,icons:{[i]:e}}:null)}))}));const{valid:o,invalid:s}=function(t){const e=[],n=[];return t.forEach((t=>{(t.match(u)?e:n).push(t)})),{valid:e,invalid:n}}(i);if(s.length&&K(t,s,null),!o.length)return;const c=n.match(u)?S(e):null;if(!c)return void K(t,o,null);c.prepare(e,n,o).forEach((n=>{B(e,n,(e=>{K(t,n.icons,e)}))}))})))}const Y=(t,e)=>{const n=function(t,e=!0,n=!1){const i=[];return t.forEach((t=>{const r="string"==typeof t?l(t,e,n):t;r&&i.push(r)})),i}(t,!0,k()),i=function(t){const e={loaded:[],missing:[],pending:[]},n=Object.create(null);t.sort(((t,e)=>t.provider!==e.provider?t.provider.localeCompare(e.provider):t.prefix!==e.prefix?t.prefix.localeCompare(e.prefix):t.name.localeCompare(e.name)));let i={provider:"",prefix:"",name:""};return t.forEach((t=>{if(i.name===t.name&&i.prefix===t.prefix&&i.provider===t.provider)return;i=t;const r=t.provider,o=t.prefix,s=t.name,c=n[r]||(n[r]=Object.create(null)),a=c[o]||(c[o]=y(r,o));let u;u=s in a.icons?e.loaded:""===o||a.missing.has(s)?e.missing:e.pending;const l={provider:r,prefix:o,name:s};u.push(l)})),e}(n);if(!i.pending.length){let t=!0;return e&&setTimeout((()=>{t&&e(i.loaded,i.missing,i.pending,G)})),()=>{t=!1}}const r=Object.create(null),o=[];let s,c;return i.pending.forEach((t=>{const{provider:e,prefix:n}=t;if(n===c&&e===s)return;s=e,c=n,o.push(y(e,n));const i=r[e]||(r[e]=Object.create(null));i[n]||(i[n]=[])})),i.pending.forEach((t=>{const{provider:e,prefix:n,name:i}=t,o=y(e,n),s=o.pendingIcons||(o.pendingIcons=new Set);s.has(i)||(s.add(i),r[e][n].push(i))})),o.forEach((t=>{const e=r[t.provider][t.prefix];e.length&&X(t,e)})),e?function(t,e,n){const i=T++,r=E.bind(null,n,i);if(!e.pending.length)return r;const o={id:i,icons:e,callback:t,abort:r};return n.forEach((t=>{(t.loaderCallbacks||(t.loaderCallbacks=[])).push(o)})),r}(e,i,o):G},Z=t=>new Promise(((e,i)=>{const r="string"==typeof t?l(t,!0):t;r?Y([r||t],(o=>{if(o.length&&r){const t=A(r);if(t)return void e({...n,...t})}i(t)})):i(t)}));function tt(t){try{const e="string"==typeof t?JSON.parse(t):t;if("string"==typeof e.body)return{...e}}catch(t){}}let et=!1;try{et=0===navigator.vendor.indexOf("Apple")}catch(t){}const nt=/(-?[0-9.]*[0-9]+[0-9.]*)/g,it=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function rt(t,e,n){if(1===e)return t;if(n=n||100,"number"==typeof t)return Math.ceil(t*e*n)/n;if("string"!=typeof t)return t;const i=t.split(nt);if(null===i||!i.length)return t;const r=[];let o=i.shift(),s=it.test(o);for(;;){if(s){const t=parseFloat(o);isNaN(t)?r.push(o):r.push(Math.ceil(t*e*n)/n)}else r.push(o);if(o=i.shift(),void 0===o)return r.join("");s=!s}}const ot=t=>"unset"===t||"undefined"===t||"none"===t;function st(t,e){const i={...n,...t},r={...o,...e},s={left:i.left,top:i.top,width:i.width,height:i.height};let c=i.body;[i,r].forEach((t=>{const e=[],n=t.hFlip,i=t.vFlip;let r,o=t.rotate;switch(n?i?o+=2:(e.push("translate("+(s.width+s.left).toString()+" "+(0-s.top).toString()+")"),e.push("scale(-1 1)"),s.top=s.left=0):i&&(e.push("translate("+(0-s.left).toString()+" "+(s.height+s.top).toString()+")"),e.push("scale(1 -1)"),s.top=s.left=0),o<0&&(o-=4*Math.floor(o/4)),o%=4,o){case 1:r=s.height/2+s.top,e.unshift("rotate(90 "+r.toString()+" "+r.toString()+")");break;case 2:e.unshift("rotate(180 "+(s.width/2+s.left).toString()+" "+(s.height/2+s.top).toString()+")");break;case 3:r=s.width/2+s.left,e.unshift("rotate(-90 "+r.toString()+" "+r.toString()+")")}o%2==1&&(s.left!==s.top&&(r=s.left,s.left=s.top,s.top=r),s.width!==s.height&&(r=s.width,s.width=s.height,s.height=r)),e.length&&(c=function(t,e,n){const i=function(t,e="defs"){let n="";const i=t.indexOf("<"+e);for(;i>=0;){const r=t.indexOf(">",i),o=t.indexOf("",o);if(-1===s)break;n+=t.slice(r+1,o).trim(),t=t.slice(0,i).trim()+t.slice(s+1)}return{defs:n,content:t}}(t);return r=i.defs,o=e+i.content+n,r?""+r+""+o:o;var r,o}(c,'',""))}));const a=r.width,u=r.height,l=s.width,f=s.height;let d,h;null===a?(h=null===u?"1em":"auto"===u?f:u,d=rt(h,l/f)):(d="auto"===a?l:a,h=null===u?rt(d,f/l):"auto"===u?f:u);const p={},g=(t,e)=>{ot(e)||(p[t]=e.toString())};g("width",d),g("height",h);const b=[s.left,s.top,l,f];return p.viewBox=b.join(" "),{attributes:p,viewBox:b,body:c}}function ct(t,e){let n=-1===t.indexOf("xlink:")?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const t in e)n+=" "+t+'="'+e[t]+'"';return'"+t+""}function at(t){return'url("'+function(t){return"data:image/svg+xml,"+function(t){return t.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}(t)}(t)+'")'}let ut=(()=>{let t;try{if(t=fetch,"function"==typeof t)return t}catch(t){}})();function lt(t){ut=t}function ft(){return ut}const dt={prepare:(t,e,n)=>{const i=[],r=function(t,e){const n=D(t);if(!n)return 0;let i;if(n.maxURL){let t=0;n.resources.forEach((e=>{const n=e;t=Math.max(t,n.length)}));const r=e+".json?icons=";i=n.maxURL-t-n.path.length-r.length}else i=0;return i}(t,e),o="icons";let s={type:o,provider:t,prefix:e,icons:[]},c=0;return n.forEach(((n,a)=>{c+=n.length+1,c>=r&&a>0&&(i.push(s),s={type:o,provider:t,prefix:e,icons:[]},c=n.length),s.icons.push(n)})),i.push(s),i},send:(t,e,n)=>{if(!ut)return void n("abort",424);let i=function(t){if("string"==typeof t){const e=D(t);if(e)return e.path}return"/"}(e.provider);switch(e.type){case"icons":{const t=e.prefix,n=e.icons.join(",");i+=t+".json?"+new URLSearchParams({icons:n}).toString();break}case"custom":{const t=e.uri;i+="/"===t.slice(0,1)?t.slice(1):t;break}default:return void n("abort",400)}let r=503;ut(t+i).then((t=>{const e=t.status;if(200===e)return r=501,t.json();setTimeout((()=>{n(function(t){return 404===t}(e)?"abort":"next",e)}))})).then((t=>{"object"==typeof t&&null!==t?setTimeout((()=>{n("success",t)})):setTimeout((()=>{404===t?n("abort",t):n("next",r)}))})).catch((()=>{n("next",r)}))}};function ht(t,e,n){y(n||"",e).loadIcons=t}function pt(t,e,n){y(n||"",e).loadIcon=t}const gt="data-style";let bt="";function vt(t){bt=t}function mt(t,e){let n=Array.from(t.childNodes).find((t=>t.hasAttribute&&t.hasAttribute(gt)));n||(n=document.createElement("style"),n.setAttribute(gt,gt),t.appendChild(n)),n.textContent=":host{display:inline-block;vertical-align:"+(e?"-0.125em":"0")+"}span,svg{display:block;margin:auto}"+bt}const yt={"background-color":"currentColor"},xt={"background-color":"transparent"},_t={image:"var(--svg)",repeat:"no-repeat",size:"100% 100%"},wt={"-webkit-mask":yt,mask:yt,background:xt};for(const t in wt){const e=wt[t];for(const n in _t)e[t+"-"+n]=_t[n]}function kt(t){return t?t+(t.match(/^[-0-9.]+$/)?"px":""):"inherit"}let At;function jt(t){return void 0===At&&function(){try{At=window.trustedTypes.createPolicy("iconify",{createHTML:t=>t})}catch(t){At=null}}(),At?At.createHTML(t):t}function Ot(t){return Array.from(t.childNodes).find((t=>{const e=t.tagName&&t.tagName.toUpperCase();return"SPAN"===e||"SVG"===e}))}function Ct(t,e){const i=e.icon.data,r=e.customisations,o=st(i,r);r.preserveAspectRatio&&(o.attributes.preserveAspectRatio=r.preserveAspectRatio);const s=e.renderedMode;let c;if("svg"===s)c=function(t){const e=document.createElement("span"),n=t.attributes;let i="";n.width||(i="width: inherit;"),n.height||(i+="height: inherit;"),i&&(n.style=i);const r=ct(t.body,n);return e.innerHTML=jt(r),e.firstChild}(o);else c=function(t,e,n){const i=document.createElement("span");let r=t.body;-1!==r.indexOf("{this._check()})))}_check(){if(!this._checkQueued)return;this._checkQueued=!1;const t=this._state,e=this.getAttribute("icon");if(e!==t.icon.value)return void this._iconChanged(e);if(!t.rendered||!this._visible)return;const n=this.getAttribute("mode"),i=a(this);t.attrMode===n&&!function(t,e){for(const n in c)if(t[n]!==e[n])return!0;return!1}(t.customisations,i)&&Ot(this._shadowRoot)||this._renderIcon(t.icon,i,n)}_iconChanged(t){const e=function(t,e){if("object"==typeof t)return{data:tt(t),value:t};if("string"!=typeof t)return{value:t};if(t.includes("{")){const e=tt(t);if(e)return{data:e,value:t}}const n=l(t,!0,!0);if(!n)return{value:t};const i=A(n);if(void 0!==i||!n.prefix)return{value:t,name:n,data:i};const r=Y([n],(()=>e(t,n,A(n))));return{value:t,name:n,loading:r}}(t,((t,e,n)=>{const i=this._state;if(i.rendered||this.getAttribute("icon")!==t)return;const r={value:t,name:e,data:n};r.data?this._gotIconData(r):i.icon=r}));e.data?this._gotIconData(e):this._state=It(e,this._state.inline,this._state)}_forceRender(){if(this._visible)this._queueCheck();else{const t=Ot(this._shadowRoot);t&&this._shadowRoot.removeChild(t)}}_gotIconData(t){this._checkQueued=!1,this._renderIcon(t,a(this),this.getAttribute("mode"))}_renderIcon(t,e,n){const i=function(t,e){switch(e){case"svg":case"bg":case"mask":return e}return"style"===e||!et&&-1!==t.indexOf("{const e=t.some((t=>t.isIntersecting));e!==this._visible&&(this._visible=e,this._forceRender())})),this._observer.observe(this)}catch(t){if(this._observer){try{this._observer.disconnect()}catch(t){}this._observer=null}}}stopObserver(){this._observer&&(this._observer.disconnect(),this._observer=null,this._visible=!0,this._connected&&this._forceRender())}};r.forEach((t=>{t in o.prototype||Object.defineProperty(o.prototype,t,{get:function(){return this.getAttribute(t)},set:function(e){null!==e?this.setAttribute(t,e):this.removeAttribute(t)}})}));const s=function(){let t;R("",dt),k(!0);try{t=window}catch(t){}if(t){if(void 0!==t.IconifyPreload){const e=t.IconifyPreload,n="Invalid IconifyPreload syntax.";"object"==typeof e&&null!==e&&(e instanceof Array?e:[e]).forEach((t=>{try{("object"!=typeof t||null===t||t instanceof Array||"object"!=typeof t.icons||"string"!=typeof t.prefix||!O(t))&&console.error(n)}catch(t){console.error(n)}}))}if(void 0!==t.IconifyProviders){const e=t.IconifyProviders;if("object"==typeof e&&null!==e)for(const t in e){const n="IconifyProviders["+t+"] is invalid.";try{const i=e[t];if("object"!=typeof i||!i||void 0===i.resources)continue;U(t,i)||console.error(n)}catch(t){console.error(n)}}}}return{iconLoaded:C,getIcon:I,listIcons:_,addIcon:j,addCollection:O,calculateSize:rt,buildIcon:st,iconToHTML:ct,svgToURL:at,loadIcons:Y,loadIcon:Z,addAPIProvider:U,setCustomIconLoader:pt,setCustomIconsLoader:ht,appendCustomStyle:vt,_api:{getAPIConfig:D,setAPIModule:R,sendAPIQuery:B,setFetch:lt,getFetch:ft,listAPIProviders:H}}}();for(const t in s)o[t]=o.prototype[t]=s[t];e.define(t,o)}()}(); diff --git a/_extensions/mcanouil/iconify/iconify.lua b/_extensions/mcanouil/iconify/iconify.lua new file mode 100644 index 0000000..af58e4d --- /dev/null +++ b/_extensions/mcanouil/iconify/iconify.lua @@ -0,0 +1,203 @@ +--[[ +# MIT License +# +# Copyright (c) 2025 Mickaël Canouil +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +]] + +local stringify = pandoc.utils.stringify + +--- Ensure Iconify HTML dependencies are included. +--- @return nil +local function ensure_html_deps() + quarto.doc.add_html_dependency({ + name = 'iconify', + version = '3.0.0', + scripts = { 'iconify-icon.min.js' } + }) +end + +--- Check if a string is empty or nil. +--- @param s string|nil +--- @return boolean +local function is_empty(s) + return s == nil or s == '' +end + +--- Validate and convert size keyword to CSS font-size. +--- @param size string|nil +--- @return string +local function is_valid_size(size) + if is_empty(size) then + return '' + end + local size_table = { + ["tiny"] = "0.5em", + ["scriptsize"] = "0.7em", + ["footnotesize"] = "0.8em", + ["small"] = "0.9em", + ["normalsize"] = "1em", + ["large"] = "1.2em", + ["Large"] = "1.5em", + ["LARGE"] = "1.75em", + ["huge"] = "2em", + ["Huge"] = "2.5em", + ["1x"] = "1em", + ["2x"] = "2em", + ["3x"] = "3em", + ["4x"] = "4em", + ["5x"] = "5em", + ["6x"] = "6em", + ["7x"] = "7em", + ["8x"] = "8em", + ["9x"] = "9em", + ["10x"] = "10em", + ["2xs"] = "0.625em", + ["xs"] = "0.75em", + ["sm"] = "0.875em", + ["lg"] = "1.25em", + ["xl"] = "1.5em", + ["2xl"] = "2em" + } + for key, value in pairs(size_table) do + if key == size then + return 'font-size: ' .. value .. ';' + end + end + return 'font-size: ' .. size .. ';' +end + +--- Get iconify option from arguments or metadata. +--- @param x string +--- @param arg table +--- @param meta table +--- @return string +local function get_iconify_options(x, arg, meta) + local arg_value = stringify(arg[x]) + if is_empty(meta['iconify']) or not is_empty(arg_value) then + return arg_value + end + if not is_empty(meta['iconify'][x]) then + return stringify(meta['iconify'][x]) + end + return arg_value +end + +--- Render an Iconify icon as a Pandoc RawInline for HTML output. +--- @param args table Icon arguments (icon set and name). +--- @param kwargs table Key-value options for the icon. +--- @param meta table Document metadata. +--- @return pandoc.Inline|pandoc.Null +function iconify(args, kwargs, meta) + -- detect html (excluding epub which won't handle fa) + if quarto.doc.is_format("html:js") then + ensure_html_deps() + local icon = stringify(args[1]) + local set = 'octicon' + if not is_empty(meta['iconify']) and not is_empty(meta['iconify']['set']) then + set = stringify(meta['iconify']['set']) + end + + if #args > 1 and string.find(stringify(args[2]), ':') then + quarto.log.warning( + 'Use "set:icon" or "set icon" syntax, not both! ' .. + 'Using "set:icon" syntax and discarding first argument!' + ) + icon = stringify(args[2]) + end + + if string.find(icon, ":") then + set = string.sub(icon, 1, string.find(icon, ":") - 1) + icon = string.sub(icon, string.find(icon, ":") + 1) + elseif #args > 1 then + set = icon + icon = stringify(args[2]) + end + + local attributes = ' icon="' .. set .. ':' .. icon .. '"' + local default_label = 'Icon ' .. icon .. ' from ' .. set .. ' Iconify.design set.' + + local size = is_valid_size(get_iconify_options("size", kwargs, meta)) + local style = get_iconify_options("style", kwargs, meta) + + if is_empty(style) and not is_empty(size) then + attributes = attributes .. ' style="' .. size .. '"' + elseif not is_empty(style) and not is_empty(size) then + attributes = attributes .. ' style="' .. style .. ';' .. size .. '"' + elseif not is_empty(style) then + attributes = attributes .. ' style="' .. style .. '"' + end + + local aria_label = stringify(kwargs["label"]) + if is_empty(aria_label) then + aria_label = ' aria-label="' .. default_label .. '"' + else + aria_label = ' aria-label="' .. aria_label .. '"' + end + + local title = stringify(kwargs["title"]) + if is_empty(title) then + title = ' title="' .. default_label .. '"' + else + title = ' title="' .. title .. '"' + end + + attributes = attributes .. aria_label .. title + + local width = get_iconify_options("width", kwargs, meta) + if not is_empty(width) and is_empty(size) then + attributes = attributes .. ' width="' .. width .. '"' + end + local height = get_iconify_options("height", kwargs, meta) + if not is_empty(height) and is_empty(size) then + attributes = attributes .. ' height="' .. height .. '"' + end + local flip = get_iconify_options("flip", kwargs, meta) + if not is_empty(flip) then + attributes = attributes .. ' flip="' .. flip.. '"' + end + local rotate = get_iconify_options("rotate", kwargs, meta) + if not is_empty(rotate) then + attributes = attributes .. ' rotate="' .. rotate .. '"' + end + + local inline = get_iconify_options("inline", kwargs, meta) + if is_empty(inline) or inline ~= "false" then + attributes = ' inline ' .. attributes + end + + local mode = get_iconify_options("mode", kwargs, meta) + local valid_modes = { svg = true, style = true, bg = true, mask = true } + if not is_empty(mode) and valid_modes[mode] then + attributes = attributes .. ' mode="' .. mode .. '"' + end + + return pandoc.RawInline( + 'html', + '' + ) + else + return pandoc.Null() + end +end + +return { + ["iconify"] = iconify +} diff --git a/_freeze/events/bug-bbq/welcome/execute-results/html.json b/_freeze/events/bug-bbq/welcome/execute-results/html.json new file mode 100644 index 0000000..c572dd7 --- /dev/null +++ b/_freeze/events/bug-bbq/welcome/execute-results/html.json @@ -0,0 +1,17 @@ +{ + "hash": "d0b99d0797a095c1f4726d6475332bfb", + "result": { + "engine": "knitr", + "markdown": "---\ntitle: \"Welcome to the Bug BBQ\"\ndate: '23/24 June 2022

\"Cartoon'\noutput:\n xaringan::moon_reader:\n css: xaringan-themer.css\n nature:\n countIncrementalSlides: false\n ratio: \"16:9\"\nalways_allow_html: yes \n---\n\n\n\n# Overview\n\nAim: 24 hours for the community to help with R bugs\n\n - Learn more about R's development process\n - Chat with experienced contributors including R Core members\n - Take a look at some bugs\n - See if you can contribute!\n\n???\n\nThe Bug BBQ is an opportunity for the community to get together and help out with bugs in R.\n\nFor new contributors, it will be a chance to learn more about R's development process.\n\nFor all participants, it will be a chance to chat with experienced contributors, including R Core developers, and to take a look at some R bugs and see if you can contribute\n\n---\n\n# bugs.r-project.org\n\n![Screenshot of R's Bugzilla showing an HTML table with the results of a search for open bugs, in order of the most recent change, with the newest at the top.](bug_list.png)\n\n???\n\nBugs in R are tracked in R's Bugzilla, which can be found at bugs.r-project.org. This screen shot shows the results of a search for open bugs, in order of the most recent change, with the newest at the top.\n\n---\n\n# Bug report\n\n![Screenshot of a bug report. We just see the start of the report here, with the metadata. In this case the bug was reported by Martin Maechler.](bug_report.png)\n???\n\nHere is an example bug report on Bugzilla. We just see the start of the report here, with the metadata. In this case the bug was reported by Martin Maechler.\n\n---\n\n# Bug report comments\n\n![Screenshot of a bug report comments. The first comment is the bug report itself, from Martin Maechler. This is followed by a further comment in reply, from Colin Fay.](bug_report_comments.png)\n???\n\nIf we scroll down, we can see the comments. The first comment is the bug report itself. There maybe be further comments in reply, discussing the bug and potentially how to fix it.\n\n---\n\n# Proposed patch\n\n![Screenshot of a bug report with the attachments section circled in red.](bug_report_patch.png)\n???\n\nSometimes there will be a proposed patch attached to the bug report. This can be found in the attachments section under the metadata.\n\nThe patch is a diff between the proposed changes and the current source code. Click on the `Diff` link next to the attached patch to view the diff in the browser. \n\n---\n\n# Patch contents\n\n![Screenshot of the diff for an attached patch displayed in the browser. On the left is the original source code from an R file. On the right is the proposed update to that code. The lines of code that have been modified are coloured to highlight where changes have been made. ](bug_report_diff.png)\n???\n\nIn this Diff viewer, the original source code is on the left and the proposed update is on the right. The lines of code that have been modified are highlighted.\n\n---\n\n# github.com/r-devel/bug-bbq\n\n![Screenshot of the r-devel/bug-bbq GitHub repository. The repository contains a few code files and a README.md](bug-bbq_GitHub.png)\n\n???\n\nFor the Bug BBQ, we will be treating R's Bugzilla as read only. We have set up a GitHub repo for this event, to allow informal discussion of bugs and to track any contributions. This screenshot shows the homepage for that repo, which you can find at github.com/r-devel/bug-bbq. Scroll down to see the README which contains instructions on how to participate. The rest of this presentation will give an overview of these instructions.\n\n---\n\n# Work on issues \n\n![Screenshot of the Issues page of the bug-bbq repo. ](issues.png)\n???\n\nOn the issues page of the bug-bbq repo, issues have been created that correspond to one or more bugs on Bugzilla. The issues have been labelled to help you find bugs to work on. The labels that start with capital letters, e.g. Models or Documentation, describe the general topic of the bug. The labels in lower case describe required actions. We'll go through these action labels in more detail.\n\n---\n\n# needs reprex\n\nThese bug reports require a minimal reproducible example that demonstrates the bug, using *only* core R packages.\n\n* You may need a specific version of R to reproduce the bug\n* Post your reprex on the GitHub issue, adding `@r-devel/triagers` \n\n???\n\nBugs labelled \"needs reprex\" require a minimal reproducible example to reproduce the bug, using *only* core R packages.\n\nYou may need a specific version of R to reproduce the bug. We'll come back to accessing different versions of R later.\n\nIf you create a reprex, post it as a comment on the GitHub issue corresponding to the bug and add `@r-devel/triagers` to notify the Triage team of the update.\n\n---\n\n# check in r-devel\n\nFor these bugs, we need to check if they are still an issue in the current R development version.\n\n* Run the reproducible example in R-devel\n* On the corresponding GitHub issue:\n * Report if the bug is still an issue in R-devel\n * Note the exact version of R-devel that you checked\n * Tag `@r-devel/triagers`\n\n???\n\nBugs labelled \"check in r-devel\", need checking if the bug is still an issue in R-devel, the development version of R.\n\nUsing R-Devel, run the reproducible example that you can find in the original bug report, or on the GitHub issue.\n\nReport back on the GitHub issue, stating if the bug is still present or not. Add the exact version of R-devel that you used and tag @r-devel/triagers.\n\n---\n\n# needs diagnosis\n\nOnce the bug is reproducible in the development version of R, the cause of the bug should be diagnosed. \n\n* Explore the reprex interactively\n* Categorise as `not a bug`, `wishlist`, or `confirmed bug`\n* Report back on the GitHub issue:\n - Where and why the bug happens\n - The bug category (`not a bug`, `wishlist`, or `confirmed`)\n - Tag `@r-devel/triagers`\n\n???\n\nFor bugs labelled \"needs diagnosis\" we need to diagnose where and why the buggy behaviour occurs.\n\nExplore the reprex interactively in a version of R where the bug can be reproduced.\n\nYou may discover the reported bug reflects a misunderstanding or a wish about how R should work and is not a real bug.\n\nReport back your findings on the GitHub issue tagging @r-devel/triagers.\n \n---\n\n# discuss fix\n\nOnce the cause of the bug is known, there should be a discussion about how to fix it.\n\n* Add a comment to the GitHub issue corresponding to the bug.\n* Follow the repo to be notified of any responses and respond if you have further comment, or react with emoji.\n\n???\n\nFor bugs labelled \"discuss fix\", we need help deciding how to fix the bug. \n\nYou can share your opinions about any proposed approach or propose your own approach in a comment on the GitHub issue.\n\nFollow the repo to be notified of any responses and respond if you have further comment, or react with emoji.\n\n---\n\n# needs patch\n\nOnce there is agreement from a member of R Core on how to fix a bug, you can implement the fix.\n\n - Check out the latest version of the source code for R\n - Make changes to the code to implement your fix\n - Prepare a patch\n - Test your patch\n - Add a comment to the GitHub issue with your patch\n - Tag @r-devel/triagers\n\n\n???\n\nFor bugs labelled \"needs patch\" an R Core member has agreed how the bug should be fixed and you can implement the fix.\n\nThere are some tips on the bug-bbq repo README of how to go about the process of making changes to a copy of the source code and preparing a patch.\n\nOnce you have a patch you may add it as a comment on the GitHub issue, tagging @r-devel/triagers.\n\n---\n\n# needs review\n\nOnce a patch is proposed, it can be helpful for others to review the patch.\n\n* Review the bug report and any comments\n* Review the proposed patch\n* Report back on the GitHub issue:\n * Does the patch resolve the bug?\n * Do you have any feedback that could improve the patch?\n\n???\n\nBugs labelled \"needs review\" have a code or documentation patch that is ready for review.\n\nStart by reviewing the bug report and any comments, before looking at the proposed patch.\n\nReport back on the GitHub issue, stating if the patch resolves the bug, and adding any feedback you have from your review.\n\n---\n\n# Add new issues\n\nYou are welcome to review the open bugs on Bugzilla and add corresponding issues on the bug-bbq GitHub repo.\n\n* Follow the standard format for the title\n* Ask a member of the [Triage team](https://github.com/orgs/r-devel/teams/triagers/members) to add labels\n\n???\n\nYou are welcome to review the open bugs on Bugzilla and add corresponding issues on the bug-bbq GitHub repo for bugs that you would like to work on.\n\nFollow the standard format for the title.\n\nOnly members of the triage team can add labels. If you want to help out by labelling bugs ask to be added to the team!\n\n---\n\n# Choose how to work\n\nYou can work on bugs anytime during the 24 hour event\n\nThe #bug-bbq channel on the R-Devel Slack is available to \n - Discuss bugs in threads\n - Get help in main channel\n \nThere are 3 Zoom sessions of 4 hours\n - Join a breakout room & work together\n - Get help in the main room\n \n???\n\nYou can work on bugs anytime during the 24 hour event \n\nThe #bug-bbq channel on the R-Devel Slack is available all the time for you to discuss bugs in threads, or get help in main channel.\n \nIn the scheduled Zoom sessions you can join a breakout room to work with others, or you can join the main room to get help from facilitators or chat with experienced contributors.\n \n---\n\n# Further help\n\nThe bug-bbq README contains help on:\n - Accessing different versions of R, including R-devel\n - Getting a copy of the R sources\n - Modifying an R function\n - Making and testing a patch\n - Applying a patch to your copy of the R sources\n \nFor further help, please ask on Zoom or in the Slack!\n\n???\n\nThe bug-bbq README contains help on:\n - Accessing different versions of R, including R-devel\n - Getting a copy of the R sources\n - Modifying an R function\n - Making and testing a patch\n - Applying a patch to your copy of the R sources\n \nFor further help, please ask on Zoom or in the Slack!\n\n---\n\n.center[# Let's go!\n\n::: {.cell}\n::: {.cell-output-display}\n![](reshot-icon-rocket-ZQTKM9NG32.svg){fig-alt='Cartoon of a rocket launching' width=40%}\n:::\n:::\n\n]\n\n???\n\nSo, let's go! We look forward to meeting you during the organized sessions and hope that together we are able to make progress on open bugs in R.\n", + "supporting": [ + "welcome_files" + ], + "filters": [ + "rmarkdown/pagebreak.lua" + ], + "includes": {}, + "engineDependencies": {}, + "preserve": {}, + "postProcess": true + } +} \ No newline at end of file diff --git a/events/bug-bbq/welcome_files/header-attrs-2.14/header-attrs.js b/_freeze/events/bug-bbq/welcome/header-attrs-2.14/header-attrs.js similarity index 100% rename from events/bug-bbq/welcome_files/header-attrs-2.14/header-attrs.js rename to _freeze/events/bug-bbq/welcome/header-attrs-2.14/header-attrs.js diff --git a/_freeze/site_libs/clipboard/clipboard.min.js b/_freeze/site_libs/clipboard/clipboard.min.js new file mode 100644 index 0000000..1103f81 --- /dev/null +++ b/_freeze/site_libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1 - - - - - - - - {% if page.url == "/" %} - {{ site.title }} - {% else %} - {{ page.title }} - {{ site.title }} - {% endif %} - - - {% include metadata.html %} - - - - - - - - - -
-
- - {% if site.logo %} - R logo -
- {% else %} -

{{ site.title | default: site.github.repository_name }}

- {% endif %} - - - - - {% for nav in site.navigation %} - {% if nav.url contains "://" %} - - - - {% else %} - - {% endif %} - {% endfor %} -
{{ nav.title }}external link symbol
{{ nav.title }}
- - {% if site.show_downloads %} - - {% endif %} -
-
- - {{ content }} - -
- -
- - - - {% if site.google_analytics %} - - {% endif %} - - {% include buttons.html %} - - diff --git a/_layouts/default.html b/_layouts/default.html deleted file mode 100644 index 5f45bdf..0000000 --- a/_layouts/default.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - {{ site.title | default: site.github.repository_name }} by {{ site.github.owner_name }} - - - - - -
-
-

{{ site.title | default: site.github.repository_name }}

-

{{ site.description | default: site.github.project_tagline }}

- - - {% for nav in site.navigation %} - {% if nav.url contains "://" %} - - {% else %} - - {% endif %} - {% endfor %} -
{{ nav.title }}
{{ nav.title }}
- - {% if site.show_downloads %} - - {% endif %} -
-
- - {{ content }} - -
- -
- - - - {% if site.google_analytics %} - - {% endif %} - - diff --git a/_layouts/full.html b/_layouts/full.html deleted file mode 100644 index 5f52aff..0000000 --- a/_layouts/full.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -layout: full ---- - - - - - - - {{ site.title | default: site.github.repository_name }} by {{ site.github.owner_name }} - - - - -
- - {{ content }} - -
- - - {% if site.google_analytics %} - - {% endif %} - - diff --git a/_quarto.yml b/_quarto.yml new file mode 100644 index 0000000..042fb0c --- /dev/null +++ b/_quarto.yml @@ -0,0 +1,87 @@ +project: + type: website + +execute: + freeze: auto + +website: + title: "R Contributor" + site-url: https://contributor.r-project.org + favicon: /assets/img/favicon.png + open-graph: + image: /assets/img/Rlogo.png + page-navigation: true + reader-mode: true + page-footer: | + © 2025 R Contributor, under [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/) license.
+ + navbar: + left: + # - menu: + - text: "Slack Group" + file: slack.qmd + - text: "Events" + file: events.qmd + - text: "Tutorials & demos" + file: tutorials.qmd + - text: Working Group + file: working-group.qmd + - text: Resources + menu: + - text: R Development Guide + href: https://contributor.r-project.org/rdevguide/ + target: _blank + - text: Translations Community Page + href: https://contributor.r-project.org/translations/ + target: _blank + - text: R Core Developer Page + href: https://developer.r-project.org/ + target: _blank + - text: R Project Blog + href: https://blog.r-project.org/ + target: _blank + - text: R SVN CI Dashboard + href: https://contributor.r-project.org/svn-dashboard + target: _blank + - text: R Universe + href: https://r-universe.dev + target: _blank + + right: + - icon: mastodon + aria-label: mastodon + href: https://hachyderm.io/@R_Contributors + rel: me + - text: "{{< iconify simple-icons:bluesky >}}" + aria-label: bluesky + href: https://bsky.app/profile/R-Forwards.hachyderm.io.ap.brid.gy + - text: "{{< iconify cib:meetup >}}" + aria-label: meetup + href: https://www.meetup.com/r-contributors/ + - icon: rss + href: blog/index.xml + tools: + - icon: github + menu: + - text: Source Code + url: https://github.com/r-devel/r-devel.github.io + - text: Report a Bug + url: https://github.com/r-devel/r-devel.github.io/issues + search: true + +brand: + light: brand-light.yml + dark: brand-dark.yml + +format: + html: + # theme: cosmo + #light: forwards-light.scss + #dark: forwards-dark.scss + #highlight-style: forwards.theme + #css: styles.css + link-external-newwindow: true + toc: true + email-obfuscation: references + #include-in-header: analytics.html + description: "A site for people interested in contributing to R core - the code and documentation that gets distributed as base R." diff --git a/assets/img/Rlogo-hex.png b/assets/img/Rlogo-hex.png new file mode 100644 index 0000000..5e97866 Binary files /dev/null and b/assets/img/Rlogo-hex.png differ diff --git a/assets/img/Rlogo.svg b/assets/img/Rlogo.svg new file mode 100644 index 0000000..78281f7 --- /dev/null +++ b/assets/img/Rlogo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/brand-dark.yml b/brand-dark.yml new file mode 100644 index 0000000..dfc2dba --- /dev/null +++ b/brand-dark.yml @@ -0,0 +1,54 @@ +meta: + name: R Contributor + links: + home: https://contributor.r-project.org + github: https://github.com/r-devel + +logo: + medium: assets/img/Rlogo-hex.png + +color: + palette: + blue: "#246BC0" + pink: "#C024B9" + green: "#24C02B" + orange: "#C07924" + dark: "#030911" + light-blue: "#96B8E1" + dark-blue: "#08182A" + primary: blue + background: dark + foreground: white + + +typography: + fonts: + - family: Inter + source: google + - family: Fira Mono + source: google + - family: Outfit + source: google + base: + family: Inter + headings: + family: Outfit + weight: normal + link: + color: light-blue + monospace: + family: Fira Mono + size: 1em + +defaults: + bootstrap: + rules: | + .navbar-nav .dropdown-menu .dropdown-item:hover, + .dropdown-item.quarto-navbar-tools-item:hover + { + background-color: $brand-dark-blue; + } + + .navbar-logo { + max-height: 50px; + } \ No newline at end of file diff --git a/brand-light.yml b/brand-light.yml new file mode 100644 index 0000000..0947f8c --- /dev/null +++ b/brand-light.yml @@ -0,0 +1,43 @@ +meta: + name: R Contributor + links: + home: https://contributor.r-project.org + github: https://github.com/r-devel + +logo: + medium: assets/img/Rlogo-hex.png + +color: + palette: + blue: "#246BC0" + pink: "#C024B9" + green: "#24C02B" + orange: "#C07924" + primary: blue + + +typography: + fonts: + - family: Inter + source: google + - family: Fira Mono + source: google + - family: Outfit + source: google + base: + family: Inter + headings: + family: Outfit + weight: normal + link: + color: blue + monospace: + family: Fira Mono + size: 1em + +defaults: + bootstrap: + rules: | + .navbar-logo { + max-height: 50px; + } \ No newline at end of file diff --git a/demos/how-to-make-a-contribution-to-base-r/index.md b/demos/how-to-make-a-contribution-to-base-r/index.qmd similarity index 100% rename from demos/how-to-make-a-contribution-to-base-r/index.md rename to demos/how-to-make-a-contribution-to-base-r/index.qmd diff --git a/demos/latinr-hackathon/index.md b/demos/latinr-hackathon/index.qmd similarity index 100% rename from demos/latinr-hackathon/index.md rename to demos/latinr-hackathon/index.qmd diff --git a/events/index.md b/events.qmd similarity index 91% rename from events/index.md rename to events.qmd index 7670e42..82e93b8 100644 --- a/events/index.md +++ b/events.qmd @@ -35,5 +35,5 @@ Note: you can set the calendar below to show your time zone by clicking the time * [Bug BBQ](bug-bbq): a global, online event over 24 hours for both new and experienced contributors to address open bugs on R's bug tracker. -* [R Project Sprint 2023](https://contributor.r-project.org/r-project-sprint-2023){:target="_blank"} and translatathons. +* [R Project Sprint 2023](https://contributor.r-project.org/r-project-sprint-2023){target="_blank"} and translatathons. diff --git a/events/bug-bbq/index.md b/events/bug-bbq/index.qmd similarity index 100% rename from events/bug-bbq/index.md rename to events/bug-bbq/index.qmd diff --git a/events/bug-bbq/welcome.html b/events/bug-bbq/welcome.html deleted file mode 100644 index 5d08e90..0000000 --- a/events/bug-bbq/welcome.html +++ /dev/null @@ -1,417 +0,0 @@ - - - - Welcome to the Bug BBQ - - - - - - - - - - - - - - - diff --git a/events/bug-bbq/xaringan-themer.css b/events/bug-bbq/xaringan-themer.css index 71c9c78..c768790 100644 --- a/events/bug-bbq/xaringan-themer.css +++ b/events/bug-bbq/xaringan-themer.css @@ -15,7 +15,7 @@ * - xaringan wiki: https://github.com/yihui/xaringan/wiki * - remarkjs wiki: https://github.com/gnab/remark/wiki * - * Version: 0.4.1 + * Version: 0.4.3 * * ------------------------------------------------------- */ @import url(https://fonts.googleapis.com/css?family=Noto+Sans:400,400i,700,700i&display=swap); @@ -190,7 +190,9 @@ blockquote { th, td { padding: 5px; } -.remark-slide thead, .remark-slide tfoot, .remark-slide tr:nth-child(even) { +.remark-slide table:not(.table-unshaded) thead, +.remark-slide table:not(.table-unshaded) tfoot, +.remark-slide table:not(.table-unshaded) tr:nth-child(even) { background: #D3D7DE; } table.dataTable tbody { diff --git a/events/c-book-club-2023/index.md b/events/c-book-club-2023/index.qmd similarity index 100% rename from events/c-book-club-2023/index.md rename to events/c-book-club-2023/index.qmd diff --git a/events/c-study-group-2024/index.md b/events/c-study-group-2024/index.qmd similarity index 100% rename from events/c-study-group-2024/index.md rename to events/c-study-group-2024/index.qmd diff --git a/events/c-study-group-2025/index.md b/events/c-study-group-2025/index.qmd similarity index 100% rename from events/c-study-group-2025/index.md rename to events/c-study-group-2025/index.qmd diff --git a/events/collaboration-campfires/index.md b/events/collaboration-campfires/index.qmd similarity index 100% rename from events/collaboration-campfires/index.md rename to events/collaboration-campfires/index.qmd diff --git a/events/office-hours/index.md b/events/office-hours/index.qmd similarity index 100% rename from events/office-hours/index.md rename to events/office-hours/index.qmd diff --git a/events/r-dev-days/index.md b/events/r-dev-days/index.qmd similarity index 100% rename from events/r-dev-days/index.md rename to events/r-dev-days/index.qmd diff --git a/index.md b/index.qmd similarity index 62% rename from index.md rename to index.qmd index 2211ba9..678662b 100644 --- a/index.md +++ b/index.qmd @@ -4,11 +4,11 @@ layout: custom # R Contributor Site -This is a site for people interested in contributing to R core - the code and documentation that gets distributed as base R. +This is a community-maintained site for people interested in contributing to core R codebase - the code and documentation that gets [distributed as base R](https://cloud.r-project.org). -Join our [Slack Group](slack) to chat with current and aspiring R contributors. Everyone interested is welcome! +Join our [Slack Group](slack.qmd) to chat with current and aspiring R contributors. Everyone interested is welcome! -Read the [R Development Guide](https://contributor.r-project.org/rdevguide){:target="_blank"}, follow a [Tutorial](tutorials), or attend an [Event](events) to learn more about contributing to R. +Read the [R Development Guide](https://contributor.r-project.org/rdevguide){target="_blank"}, follow a [Tutorial](tutorials.qmd), or attend an [Event](events.qmd) to learn more about contributing to R. ## Quick Start @@ -23,4 +23,4 @@ The demo introduces a basic workflow for simple fixes. For more complex work on ## About -This site is maintained by the [R Contribution Working Group](working-group), which is working on initiatives to encourage wider contribution to R core. The working group is open to new members ([more information](working-group)). You can report issues about this website on the [r-devel.github.io](https://github.com/r-devel/r-devel.github.io) repository. +This site is maintained by the [R Contribution Working Group](working-group.qmd), which is working on initiatives to encourage wider contribution to R core. The working group is open to new members ([more information](working-group.qmd)). You can report issues about this website on the [r-devel.github.io](https://github.com/r-devel/r-devel.github.io) repository. diff --git a/r-help.md b/r-help.qmd similarity index 100% rename from r-help.md rename to r-help.qmd diff --git a/setup.md b/setup.md deleted file mode 100644 index 06b84d9..0000000 --- a/setup.md +++ /dev/null @@ -1,62 +0,0 @@ -# Setup -------------------------- - -## Personal page (`.github.io`) - -### 1. Fork the repository -Fork the repository from [here](https://github.com/kbsezginel/gh-pages-template) by clicking the fork button on the top right corner. - -### 2. Rename the repository -Go to `Settings -> Repository name` and write down `.github.io`. - -## Project page (`.github.io/`) - -### 1. Fork the repository -Fork the repository from [here](https://github.com/kbsezginel/gh-pages-template) by clicking the fork button on the top right corner. - -### 2. Enable GitHub Pages -Go to `Settings -> GitHub Pages` in your fork of the repository. -Under `source` select `master branch`. - -# Customization -------------------------- - -## Configuring the site -Edit the `_config.yml` file and change the site title and description. -Remove the `setup.md` file (optional). - -## Adding pages -To add a new page you need to create a new markdown file with the name of your choice. -For example here `setup.md` file is used to generate content for the `setup` page. - -### Layouts -There are currently two layouts: `default` and `full`. -In the `default` layout a sidebar containing navigation is present whereas in `full` layout the full page is reserved for page content. -The `full` layout can be selected by adding a yaml front matter to the markdown/html file: -``` ---- -layout: full ---- -``` - -## Adding links to the navigation bar -The navigation bar can be controlled by modifying the `_config.yml` file. -Under navigation enter the title you would like to see on the sidebar and enter the relative link to that page. - -## More customization -Take a look at minimal theme page to see all the theme options: [click here](https://pages-themes.github.io/minimal/). - -**Serving from the `docs` folder** -> You can also serve the website from the `docs` folder. This is especially useful for project pages to keep the website files and project files separate. You basically need to keep all the files for the webpage in a folder named `docs` and in step 2 under `source` select `master branch/docs folder`. More info [here](https://help.github.com/articles/configuring-a-publishing-source-for-github-pages/). - -# Resources and Tutorials -------------------------- - -- [Minimal theme GitHub repository](https://github.com/pages-themes/minimal) - -More tutorials on github pages, markdown and Jekyll can be found here: -- [GitHub pages basics](https://help.github.com/categories/github-pages-basics/) -- [GitHub basic writing and formatting syntax](https://help.github.com/articles/basic-writing-and-formatting-syntax/) -- [Markdown cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) -- [Setting up your GitHub Pages site locally with Jekyll](https://help.github.com/articles/setting-up-your-github-pages-site-locally-with-jekyll/) -- [Jekyll front matter](https://jekyllrb.com/docs/frontmatter/) diff --git a/slack.md b/slack.qmd similarity index 100% rename from slack.md rename to slack.qmd diff --git a/tutorials/index.md b/tutorials.qmd similarity index 94% rename from tutorials/index.md rename to tutorials.qmd index 6cc6cd7..3aea090 100644 --- a/tutorials/index.md +++ b/tutorials.qmd @@ -12,7 +12,7 @@ Video tutorials with integrated/additional exercises.
  • -Contributing to R, +Contributing to R, Gabriel Becker and Martin Maechler, useR! 2021. 2h15 video (or 1h30 abridged version), with accompanying slides and exercises.
    Abstract @@ -24,7 +24,7 @@ A selection of past bug reports are provided for you to practice debugging. For
  • -Translating R to your Language, +Translating R to your Language, Michael Chirico and Michael Lawrence, useR! 2021. 1h30 video with accompanying slides.
    Abstract diff --git a/tutorials/contributing-to-r/index.md b/tutorials/contributing-to-r/index.qmd similarity index 100% rename from tutorials/contributing-to-r/index.md rename to tutorials/contributing-to-r/index.qmd diff --git a/tutorials/translating-r-to-your-language/index.md b/tutorials/translating-r-to-your-language/index.qmd similarity index 100% rename from tutorials/translating-r-to-your-language/index.md rename to tutorials/translating-r-to-your-language/index.qmd diff --git a/working-group.md b/working-group.qmd similarity index 100% rename from working-group.md rename to working-group.qmd