diff --git a/404.html b/404.html index afa22357..f45b7931 100644 --- a/404.html +++ b/404.html @@ -3,7 +3,7 @@ - + MarkBind - Page not found diff --git a/about.page-vue-render.js b/about.page-vue-render.js index 3d9539e6..afb0b4a9 100644 --- a/about.page-vue-render.js +++ b/about.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h1',{staticClass:"display-3",attrs:{"id":"about-us"}},[_c('span',[_c('strong',[_v("About Us")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#about-us","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('span',{staticClass:"lead"},[_v("MarkBind is a project "),_c('strong',[_v("based in "),_c('a',{attrs:{"href":"http://www.comp.nus.edu.sg/"}},[_v("National University of Singapore, School of Computing")])]),_v(", and is funded by an education grant from "),_c('a',{attrs:{"href":"https://nus.edu.sg/cdtl"}},[_v("NUS Center for Development of Teaching and Learning")]),_v(".")])]),_v(" "),_c('p',[_c('span',{staticClass:"glyphicon glyphicon-send",attrs:{"aria-hidden":"true"}}),_v(" You can "),_c('strong',[_v("email us")]),_v(" at "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("markbind")]),_v(" at "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("comp.nus.edu.sg")])]),_v(" "),_c('p',[_c('span',{staticClass:"glyphicon glyphicon-console",attrs:{"aria-hidden":"true"}}),_v(" Interested in "),_c('strong',[_v("contributing to MarkBind")]),_v("? Visit the "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind"}},[_v("MarkBind project on GitHub")]),_v(".")]),_v(" "),_c('h2',{attrs:{"id":"contributors"}},[_v("Contributors โœจ"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#contributors","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Mentors")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.comp.nus.edu.sg/~damithch/"}},[_c('strong',[_v("Damith C. Rajapakse")])]),_v(": "),_c('em',[_v("Project Mentor")]),_v(" since Aug 2016")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/ang-zeyu"}},[_c('strong',[_v("Ang Ze Yu")])]),_v(": "),_c('em',[_v("Project Mentor")]),_v(" since Jun 2022, "),_c('em',[_v("Team Lead")]),_v(" for Sep 2020 - May 2022")])]),_v(" "),_c('p',[_c('strong',[_v("Dev Team")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.github.com/jonahtanjz"}},[_c('strong',[_v("Jonah Tan Jun Zi")])]),_v(": "),_c('strong',[_c('em',[_v("Team Lead")])]),_v(" since Jun 2022, "),_c('em',[_v("Member")]),_v(" for Jan 2021 - May 2022")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/ryoarmanda"}},[_c('strong',[_v("Ryo Chandra Putra Aramanda")])]),_v(": "),_c('strong',[_c('em',[_v("Team Lead")])]),_v(" since Jun 2022, "),_c('em',[_v("Member")]),_v(" for Aug 2020 - May 2022")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/raysonkoh"}},[_c('strong',[_v("Koh Rayson")])]),_v(": "),_c('em',[_v("Senior Dev")]),_v(" since Apr 2021, "),_c('em',[_v("Member")]),_v(" since Jan 2021")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/wxwxwxwx9"}},[_c('strong',[_v("Ong Wei Xiang")])]),_v(": "),_c('em',[_v("Senior Dev")]),_v(" since Apr 2021, "),_c('em',[_v("Member")]),_v(" since Aug 2020")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/kaixin-hc"}},[_c('strong',[_v("Hannah Chia Kai Xin")])]),_v(": "),_c('em',[_v("Senior Dev")]),_v(" since Apr 2022, "),_c('em',[_v("Member")]),_v(" since Jan 2022")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/jovyntls"}},[_c('strong',[_v("Jovyn Tan Li Shyan")])]),_v(": "),_c('em',[_v("Senior Dev")]),_v(" since Apr 2022, "),_c('em',[_v("Member")]),_v(" since Jan 2022")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/tlylt"}},[_c('strong',[_v("Liu Yongliang")])]),_v(": "),_c('em',[_v("Senior Dev")]),_v(" since Apr 2022, "),_c('em',[_v("Member")]),_v(" since Aug 2021")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/ong6"}},[_c('strong',[_v("Ong Jun Xiong")])]),_v(": "),_c('em',[_v("Senior Dev")]),_v(" since Apr 2022, "),_c('em',[_v("Member")]),_v(" since Aug 2021")])]),_v(" "),_c('p',[_v("Thanks goes to these wonderful people ("),_c('a',{attrs:{"href":"https://allcontributors.org/docs/en/emoji-key"}},[_v("emoji key")]),_v("):")]),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',[_c('tbody',[_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://www.yamgent.com/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/3168908?v=4?s=100","width":"100px;","alt":"Tan Wang Leng"}}),_c('br'),_c('sub',[_c('b',[_v("Tan Wang Leng")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=yamgent","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/ang-zeyu"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/3306138?v=4?s=100","width":"100px;","alt":"Ang Ze Yu"}}),_c('br'),_c('sub',[_c('b',[_v("Ang Ze Yu")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=ang-zeyu","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"#projectManagement-ang-zeyu","title":"Project Management"}},[_v("๐Ÿ“†")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/Gisonrg"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/4332224?v=4?s=100","width":"100px;","alt":"Jason Jiang"}}),_c('br'),_c('sub',[_c('b',[_v("Jason Jiang")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=Gisonrg","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/Chng-Zhi-Xuan"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/31084833?v=4?s=100","width":"100px;","alt":"Chng Zhi Xuan"}}),_c('br'),_c('sub',[_c('b',[_v("Chng Zhi Xuan")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=Chng-Zhi-Xuan","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://linkedin.com/in/aaronlah/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/14091939?v=4?s=100","width":"100px;","alt":"Aaron Chong"}}),_c('br'),_c('sub',[_c('b',[_v("Aaron Chong")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=acjh","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/jamos-tay"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/19278089?v=4?s=100","width":"100px;","alt":"Jamos Tay"}}),_c('br'),_c('sub',[_c('b',[_v("Jamos Tay")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=jamos-tay","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://nicholaschuayunzhi.github.io/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/22221132?v=4?s=100","width":"100px;","alt":"Nicholas Chua"}}),_c('br'),_c('sub',[_c('b',[_v("Nicholas Chua")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=nicholaschuayunzhi","title":"Code"}},[_v("๐Ÿ’ป")])])]),_v(" "),_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://www.beyondthesprawl.com/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/1782590?v=4?s=100","width":"100px;","alt":"Tan Zhen Yong"}}),_c('br'),_c('sub',[_c('b',[_v("Tan Zhen Yong")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=Xenonym","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/rachx"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/16644412?v=4?s=100","width":"100px;","alt":"Rachael Sim"}}),_c('br'),_c('sub',[_c('b',[_v("Rachael Sim")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=rachx","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/wxwxwxwx9"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/37920115?v=4?s=100","width":"100px;","alt":"Ong Wei Xiang"}}),_c('br'),_c('sub',[_c('b',[_v("Ong Wei Xiang")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=wxwxwxwx9","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/danielbrzn"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/251231?v=4?s=100","width":"100px;","alt":"Daniel Berzin Chua"}}),_c('br'),_c('sub',[_c('b',[_v("Daniel Berzin Chua")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=danielbrzn","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/openorclose"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/3646725?v=4?s=100","width":"100px;","alt":"Daryl Tan"}}),_c('br'),_c('sub',[_c('b',[_v("Daryl Tan")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=openorclose","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"http://www.comp.nus.edu.sg/~damithch"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/1673303?v=4?s=100","width":"100px;","alt":"Damith C. Rajapakse"}}),_c('br'),_c('sub',[_c('b',[_v("Damith C. Rajapakse")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=damithc","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"#mentoring-damithc","title":"Mentoring"}},[_v("๐Ÿง‘โ€๐Ÿซ")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/jonahtanjz"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/47470981?v=4?s=100","width":"100px;","alt":"Jonah Tan"}}),_c('br'),_c('sub',[_c('b',[_v("Jonah Tan")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=jonahtanjz","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pulls?q=is%3Apr+reviewed-by%3Ajonahtanjz","title":"Reviewed Pull Requests"}},[_v("๐Ÿ‘€")])])]),_v(" "),_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/nusjzx"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/24241939?v=4?s=100","width":"100px;","alt":"nusjzx"}}),_c('br'),_c('sub',[_c('b',[_v("nusjzx")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=nusjzx","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/alyip98"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/2277141?v=4?s=100","width":"100px;","alt":"Alfred Yip"}}),_c('br'),_c('sub',[_c('b',[_v("Alfred Yip")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=alyip98","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/ryoarmanda"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/24468110?v=4?s=100","width":"100px;","alt":"Ryo Armanda"}}),_c('br'),_c('sub',[_c('b',[_v("Ryo Armanda")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=ryoarmanda","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pulls?q=is%3Apr+reviewed-by%3Aryoarmanda","title":"Reviewed Pull Requests"}},[_v("๐Ÿ‘€")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/le0tan"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/28982486?v=4?s=100","width":"100px;","alt":"Tan Yuanhong"}}),_c('br'),_c('sub',[_c('b',[_v("Tan Yuanhong")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=le0tan","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://sijie123.com/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/631938?v=4?s=100","width":"100px;","alt":"Si Jie"}}),_c('br'),_c('sub',[_c('b',[_v("Si Jie")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=sijie123","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/yash-chowdhary"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/21968718?v=4?s=100","width":"100px;","alt":"Yash Chowdhary"}}),_c('br'),_c('sub',[_c('b',[_v("Yash Chowdhary")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=yash-chowdhary","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://www.linkedin.com/in/luyangkenneth/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/9073504?v=4?s=100","width":"100px;","alt":"Kenneth Lu"}}),_c('br'),_c('sub',[_c('b',[_v("Kenneth Lu")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=luyangkenneth","title":"Code"}},[_v("๐Ÿ’ป")])])]),_v(" "),_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://raysonkoh.com/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/16506539?v=4?s=100","width":"100px;","alt":"Rayson Koh"}}),_c('br'),_c('sub',[_c('b',[_v("Rayson Koh")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=raysonkoh","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/crphang"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/4986717?v=4?s=100","width":"100px;","alt":"Phang Chun Rong"}}),_c('br'),_c('sub',[_c('b',[_v("Phang Chun Rong")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=crphang","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/nbriannl"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/27397021?v=4?s=100","width":"100px;","alt":"nbriannl"}}),_c('br'),_c('sub',[_c('b',[_v("nbriannl")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=nbriannl","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/Tejas2805"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/35946746?v=4?s=100","width":"100px;","alt":"Tejas Bhuwania"}}),_c('br'),_c('sub',[_c('b',[_v("Tejas Bhuwania")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=Tejas2805","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/marvinchin"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/17447681?v=4?s=100","width":"100px;","alt":"Marvin Chin"}}),_c('br'),_c('sub',[_c('b',[_v("Marvin Chin")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=marvinchin","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/amad-person"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/22164211?v=4?s=100","width":"100px;","alt":"Aadyaa Maddi"}}),_c('br'),_c('sub',[_c('b',[_v("Aadyaa Maddi")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=amad-person","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://kendrickang.github.io/me/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/38814428?v=4?s=100","width":"100px;","alt":"Kendrick Ang"}}),_c('br'),_c('sub',[_c('b',[_v("Kendrick Ang")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=KendrickAng","title":"Code"}},[_v("๐Ÿ’ป")])])]),_v(" "),_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/dvrylc"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/6095637?v=4?s=100","width":"100px;","alt":"Daryl Chan"}}),_c('br'),_c('sub',[_c('b',[_v("Daryl Chan")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=dvrylc","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://tlylt.github.io/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/41845017?v=4?s=100","width":"100px;","alt":"Liu YongLiang"}}),_c('br'),_c('sub',[_c('b',[_v("Liu YongLiang")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=tlylt","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=tlylt","title":"Documentation"}},[_v("๐Ÿ“–")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pulls?q=is%3Apr+reviewed-by%3Atlylt","title":"Reviewed Pull Requests"}},[_v("๐Ÿ‘€")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://madanalogy.dev/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/42177597?v=4?s=100","width":"100px;","alt":"Ahmed Bahajjaj"}}),_c('br'),_c('sub',[_c('b',[_v("Ahmed Bahajjaj")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=madanalogy","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://www.zhongjun.me/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/27919917?v=4?s=100","width":"100px;","alt":"Hsu Zhong Jun"}}),_c('br'),_c('sub',[_c('b',[_v("Hsu Zhong Jun")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=dcshzj","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/kimberlyohq"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/60393696?v=4?s=100","width":"100px;","alt":"Kimberly"}}),_c('br'),_c('sub',[_c('b',[_v("Kimberly")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=kimberlyohq","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/hcwong"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/28432397?v=4?s=100","width":"100px;","alt":"Joshua Wong"}}),_c('br'),_c('sub',[_c('b',[_v("Joshua Wong")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=hcwong","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://weasyl.com/~parclytaxel"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/54175463?v=4?s=100","width":"100px;","alt":"Jeremy Tan Jie Rui"}}),_c('br'),_c('sub',[_c('b',[_v("Jeremy Tan Jie Rui")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=Parcly-Taxel","title":"Code"}},[_v("๐Ÿ’ป")])])]),_v(" "),_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/anubh-v"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/35621759?v=4?s=100","width":"100px;","alt":"Anubhav"}}),_c('br'),_c('sub',[_c('b',[_v("Anubhav")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=anubh-v","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/bchenghi"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/57175876?v=4?s=100","width":"100px;","alt":"Boh Cheng Hin"}}),_c('br'),_c('sub',[_c('b',[_v("Boh Cheng Hin")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=bchenghi","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://www.tawatawashi.com/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/7100187?v=4?s=100","width":"100px;","alt":"Hiroki Nishino"}}),_c('br'),_c('sub',[_c('b',[_v("Hiroki Nishino")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=tawAsh1","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/ong6"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/19247856?v=4?s=100","width":"100px;","alt":"Junx"}}),_c('br'),_c('sub',[_c('b',[_v("Junx")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=ong6","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=ong6","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://jyl123.github.io/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/24690889?v=4?s=100","width":"100px;","alt":"Li JiaYao"}}),_c('br'),_c('sub',[_c('b',[_v("Li JiaYao")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=JYL123","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://morninglit.github.io/Portfolio2/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/57279935?v=4?s=100","width":"100px;","alt":"Ambrose Liew"}}),_c('br'),_c('sub',[_c('b',[_v("Ambrose Liew")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=MorningLit","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/pr4aveen"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/2839596?v=4?s=100","width":"100px;","alt":"Praveen"}}),_c('br'),_c('sub',[_c('b',[_v("Praveen")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=pr4aveen","title":"Code"}},[_v("๐Ÿ’ป")])])]),_v(" "),_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/riyadh-h"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/69278589?v=4?s=100","width":"100px;","alt":"Riyadh H. Alzahrani"}}),_c('br'),_c('sub',[_c('b',[_v("Riyadh H. Alzahrani")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=riyadh-h","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/samuelfangjw"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/60355570?v=4?s=100","width":"100px;","alt":"Samuel Fang"}}),_c('br'),_c('sub',[_c('b',[_v("Samuel Fang")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=samuelfangjw","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/thomastanck"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/829070?v=4?s=100","width":"100px;","alt":"Thomas Tan"}}),_c('br'),_c('sub',[_c('b',[_v("Thomas Tan")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=thomastanck","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/vig42"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/42461145?v=4?s=100","width":"100px;","alt":"Vighnesh Iyer"}}),_c('br'),_c('sub',[_c('b',[_v("Vighnesh Iyer")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=vig42","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://resumednh.netlify.app/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/53283766?v=4?s=100","width":"100px;","alt":"dao ngoc hieu"}}),_c('br'),_c('sub',[_c('b',[_v("dao ngoc hieu")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=daongochieu2810","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://bandism.net/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/22633385?v=4?s=100","width":"100px;","alt":"Ikko Ashimine"}}),_c('br'),_c('sub',[_c('b',[_v("Ikko Ashimine")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=eltociear","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"http://www.jovyntan.com"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/61113575?v=4?s=100","width":"100px;","alt":"Jovyn Tan"}}),_c('br'),_c('sub',[_c('b',[_v("Jovyn Tan")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=jovyntls","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=jovyntls","title":"Documentation"}},[_v("๐Ÿ“–")])])]),_v(" "),_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/kaixin-hc"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/59471320?v=4?s=100","width":"100px;","alt":"Hannah"}}),_c('br'),_c('sub',[_c('b',[_v("Hannah")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=kaixin-hc","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=kaixin-hc","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/NaincyKumariKnoldus"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/87004609?v=4?s=100","width":"100px;","alt":"NaincyKumariKnoldus"}}),_c('br'),_c('sub',[_c('b',[_v("NaincyKumariKnoldus")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=NaincyKumariKnoldus","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/elroygohjy"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/77185324?v=4?s=100","width":"100px;","alt":"Elroy Goh"}}),_c('br'),_c('sub',[_c('b',[_v("Elroy Goh")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=elroygohjy","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/EltonGohJH"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/75515229?v=4?s=100","width":"100px;","alt":"Elton Goh"}}),_c('br'),_c('sub',[_c('b',[_v("Elton Goh")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=EltonGohJH","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/benluiwj"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/67570985?v=4?s=100","width":"100px;","alt":"benluiwj"}}),_c('br'),_c('sub',[_c('b',[_v("benluiwj")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=benluiwj","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=benluiwj","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/weiquu"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/48304907?v=4?s=100","width":"100px;","alt":"weiquu"}}),_c('br'),_c('sub',[_c('b',[_v("weiquu")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=weiquu","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=weiquu","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/eeliana"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/62977276?v=4?s=100","width":"100px;","alt":"eeliana"}}),_c('br'),_c('sub',[_c('b',[_v("eeliana")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=eeliana","title":"Documentation"}},[_v("๐Ÿ“–")])])]),_v(" "),_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://www.linkedin.com/in/dominiclimkj/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/46486515?v=4?s=100","width":"100px;","alt":"Dominic Lim"}}),_c('br'),_c('sub',[_c('b',[_v("Dominic Lim")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=domlimm","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=domlimm","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/petermonky"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/39848410?v=4?s=100","width":"100px;","alt":"peter"}}),_c('br'),_c('sub',[_c('b',[_v("peter")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=petermonky","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/calvintanwj"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/61271749?v=4?s=100","width":"100px;","alt":"Calvin Tan"}}),_c('br'),_c('sub',[_c('b',[_v("Calvin Tan")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=calvintanwj","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/itsyme"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/71922282?v=4?s=100","width":"100px;","alt":"david"}}),_c('br'),_c('sub',[_c('b',[_v("david")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=itsyme","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=itsyme","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://www.linkedin.com/in/david-limantara/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/67327422?v=4?s=100","width":"100px;","alt":"David"}}),_c('br'),_c('sub',[_c('b',[_v("David")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=xSaints19x","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/charandeepsinghb"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/110289710?v=4?s=100","width":"100px;","alt":"charandeepsinghb"}}),_c('br'),_c('sub',[_c('b',[_v("charandeepsinghb")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=charandeepsinghb","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=charandeepsinghb","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/c00kie123"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/112937454?v=4?s=100","width":"100px;","alt":"Jia Yu"}}),_c('br'),_c('sub',[_c('b',[_v("Jia Yu")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=c00kie123","title":"Documentation"}},[_v("๐Ÿ“–")])])]),_v(" "),_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/lhw-1"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/25716529?v=4?s=100","width":"100px;","alt":"Lee Hyung Woon / ์ดํ˜•์šด"}}),_c('br'),_c('sub',[_c('b',[_v("Lee Hyung Woon / ์ดํ˜•์šด")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=lhw-1","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/yucheng11122017"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/77204346?v=4?s=100","width":"100px;","alt":"Chan Yu Cheng"}}),_c('br'),_c('sub',[_c('b',[_v("Chan Yu Cheng")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=yucheng11122017","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/Yvad60"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/54445417?v=4?s=100","width":"100px;","alt":"Ivad Yves HABIMANA"}}),_c('br'),_c('sub',[_c('b',[_v("Ivad Yves HABIMANA")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=Yvad60","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/bibhu107"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/23478853?v=4?s=100","width":"100px;","alt":"Bibhu"}}),_c('br'),_c('sub',[_c('b',[_v("Bibhu")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=bibhu107","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/WillCWX"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/55905659?v=4?s=100","width":"100px;","alt":"WillCWX"}}),_c('br'),_c('sub',[_c('b',[_v("WillCWX")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=WillCWX","title":"Documentation"}},[_v("๐Ÿ“–")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=WillCWX","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"http://esswhyy.github.io"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/39799639?v=4?s=100","width":"100px;","alt":"Sven Tang"}}),_c('br'),_c('sub',[_c('b',[_v("Sven Tang")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=EssWhyy","title":"Documentation"}},[_v("๐Ÿ“–")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=EssWhyy","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"http://www.lesterong.com"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/84223259?v=4?s=100","width":"100px;","alt":"lesterong"}}),_c('br'),_c('sub',[_c('b',[_v("lesterong")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=lesterong","title":"Code"}},[_v("๐Ÿ’ป")])])]),_v(" "),_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/SPWwj"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/30100720?v=4?s=100","width":"100px;","alt":"SPWwj"}}),_c('br'),_c('sub',[_c('b',[_v("SPWwj")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=SPWwj","title":"Documentation"}},[_v("๐Ÿ“–")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=SPWwj","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://jmestxr.github.io/my-portfolio/"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/87931905?v=4?s=100","width":"100px;","alt":"James"}}),_c('br'),_c('sub',[_c('b',[_v("James")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=jmestxr","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=jmestxr","title":"Documentation"}},[_v("๐Ÿ“–")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/zlimez"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/39835365?v=4?s=100","width":"100px;","alt":"Nisemono"}}),_c('br'),_c('sub',[_c('b',[_v("Nisemono")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=zlimez","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/jingting1412"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/105090139?v=4?s=100","width":"100px;","alt":"jingting1412"}}),_c('br'),_c('sub',[_c('b',[_v("jingting1412")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=jingting1412","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"http://tim-siu.github.io"}},[_v("\" Xu\">"),_c('br'),_c('sub',[_c('b',[_v("Shuyao \"Tim\" Xu")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=Tim-Siu","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/KevinEyo1"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/105847348?v=4?s=100","width":"100px;","alt":"Kevin Eyo"}}),_c('br'),_c('sub',[_c('b',[_v("Kevin Eyo")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=KevinEyo1","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/luminousleek"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/68138671?v=4?s=100","width":"100px;","alt":"Lee Xiong Jie, Isaac"}}),_c('br'),_c('sub',[_c('b',[_v("Lee Xiong Jie, Isaac")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=luminousleek","title":"Code"}},[_v("๐Ÿ’ป")])])]),_v(" "),_c('tr',[_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/LamJiuFong"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/122192553?v=4?s=100","width":"100px;","alt":"Lam Jiu Fong"}}),_c('br'),_c('sub',[_c('b',[_v("Lam Jiu Fong")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=LamJiuFong","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/yiwen101"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/121547057?v=4?s=100","width":"100px;","alt":"Wang Yiwen"}}),_c('br'),_c('sub',[_c('b',[_v("Wang Yiwen")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=yiwen101","title":"Documentation"}},[_v("๐Ÿ“–")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=yiwen101","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"https://github.com/Ashleeey1224"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/105656080?v=4?s=100","width":"100px;","alt":"Ashleeey1224"}}),_c('br'),_c('sub',[_c('b',[_v("Ashleeey1224")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=Ashleeey1224","title":"Code"}},[_v("๐Ÿ’ป")])]),_v(" "),_c('td',{attrs:{"align":"center","valign":"top","width":"14.28%"}},[_c('a',{attrs:{"href":"http://www.linkedin.com/in/gerteck"}},[_c('img',{attrs:{"src":"https://avatars.githubusercontent.com/u/111064611?v=4?s=100","width":"100px;","alt":"Ger Teck"}}),_c('br'),_c('sub',[_c('b',[_v("Ger Teck")])])]),_c('br'),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=gerteck","title":"Code"}},[_v("๐Ÿ’ป")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/commits?author=gerteck","title":"Documentation"}},[_v("๐Ÿ“–")])])])])])]),_v(" "),_c('hr'),_v(" "),_c('p',[_c('strong',[_c('span',{staticClass:"dimmed"},[_v("Past Members:")])])]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://github.com/acjh"}},[_c('strong',[_v("Aaron Chong Jun Hao")])]),_v(": "),_c('em',[_v("Project Mentor")]),_v(" for Jul 2018 - Dec 2020, "),_c('em',[_v("Team Lead")]),_v(" for Aug 2017 - Jun 2018")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/madanalogy"}},[_c('strong',[_v("Ahmed Bahajjaj")])]),_v(": "),_c('em',[_v("Contributor")]),_v(" for Jan-April 2020")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/Chng-Zhi-Xuan"}},[_c('strong',[_v("Chng Zhi Xuan")])]),_v(": "),_c('em',[_v("Member")]),_v(" for May 2018 - Jul 2019")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/nicholaschuayunzhi"}},[_c('strong',[_v("Chua Yun Zhi Nicholas")])]),_v(": "),_c('em',[_v("Member")]),_v(" for Jan 2018 - May 2019")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/danielbrzn"}},[_c('strong',[_v("Daniel Berzin Chua Yuan Siang")])]),_v(": "),_c('em',[_v("Member")]),_v(" for Jan 2018 - Aug 2018")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/dvrylc"}},[_c('strong',[_v("Daryl Chan")])]),_v(": "),_c('em',[_v("Contributor")]),_v(" for Jan-April 2020")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/openorclose"}},[_c('strong',[_v("Daryl Tan")])]),_v(": "),_c('em',[_v("Member")]),_v(" for May 2019 - May 2020")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/jamos-tay"}},[_c('strong',[_v("Jamos Tay")])]),_v(": "),_c('em',[_v("Member")]),_v(" for Aug 2018 - Apr 2019")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/Parcly-Taxel"}},[_c('strong',[_v("Jeremy Tan Jie Rui")])]),_v(": "),_c('em',[_v("Contributor")]),_v(" for Jan-April 2020")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/nusjzx"}},[_c('strong',[_v("Jia Zhixin")])]),_v(": "),_c('em',[_v("Member")]),_v(" for May 2018 - Aug 2018")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/Gisonrg"}},[_c('strong',[_v("Jiang Sheng")])]),_v(": "),_c('em',[_v("Founding Member")]),_v(" and "),_c('em',[_v("Team Lead")]),_v(" for Aug 2016 - Jul 2017")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/hcwong"}},[_c('strong',[_v("Joshua Wong")])]),_v(": "),_c('em',[_v("Contributor")]),_v(" for Jan-April 2020")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/kimberlyohq"}},[_c('strong',[_v("Kimberly Ong Ong Hui Qin")])]),_v(": "),_c('em',[_v("Contributor")]),_v(" for Jun-Jul 2021")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/nbriannl"}},[_c('strong',[_v("Labayna Neil Brian Narido")])]),_v(": "),_c('em',[_v("Member")]),_v(" for Jan - Apr 2020")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/marvinchin"}},[_c('strong',[_v("Marvin Chin Kun Song")])]),_v(": "),_c('em',[_v("Project Lead")]),_v(" for Jan - Aug 2020, "),_c('em',[_v("Member")]),_v(" for Jan 2019 - Aug 2019")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/sijie123"}},[_c('strong',[_v("Lin Si Jie")])]),_v(": "),_c('em',[_v("Member")]),_v(" for Jan - Aug 2019")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/luyangkenneth"}},[_c('strong',[_v("Lu Yang Kenneth")])]),_v(": "),_c('em',[_v("Member")]),_v(" for Jan - Aug 2019")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/amad-person"}},[_c('strong',[_v("Maddi Aadyaa")])]),_v(": "),_c('em',[_v("Member")]),_v(" for Jan - Aug 2019")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/crphang"}},[_c('strong',[_v("Phang Chun Rong")])]),_v(": "),_c('em',[_v("Member")]),_v(" for Aug 2019 - Jun 2020")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/rachx"}},[_c('strong',[_v("Rachael Sim Hwee Ling")])]),_v(": "),_c('em',[_v("Member")]),_v(" for Jan - Dec 2018")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/Xenonym"}},[_c('strong',[_v("Tan Zhen Yong")])]),_v(": "),_c('em',[_v("Member")]),_v(" for Jan - Aug 2019")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/yamgent"}},[_c('strong',[_v("Tan Wang Leng")])]),_v(": "),_c('em',[_v("Team Lead")]),_v(" for Jul 2018 - Apr 2019, "),_c('em',[_v("Member")]),_v(" for May 2018 - Jun 2018")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/Tejas2805"}},[_c('strong',[_v("Tejas Bhuwania")])]),_v(": "),_c('em',[_v("Contributor")]),_v(" for Jan - April 2020")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/le0tan"}},[_c('strong',[_v("Tan Yuanhong")])]),_v(": "),_c('em',[_v("Member")]),_v(": Jan 2020 - Apr 2021")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/yash-chowdhary"}},[_c('strong',[_v("Yash Chowdhary")])]),_v(": "),_c('em',[_v("Member")]),_v(" Jan - Apr 2020")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.github.com/alyip98"}},[_c('strong',[_v("Yip Seng Yeun")])]),_v(": "),_c('em',[_v("Member")]),_v(" May 2019 - Apr 2020")])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/bootcamp/contributeToDocs.html b/devGuide/bootcamp/contributeToDocs.html index 0cf97697..c3daffab 100644 --- a/devGuide/bootcamp/contributeToDocs.html +++ b/devGuide/bootcamp/contributeToDocs.html @@ -3,7 +3,7 @@ - + MarkBind - Contribute to Documentation @@ -33,7 +33,7 @@ Now, you can make a pull request targeting the master branch of the MarkBind repository.

  1. Fill in the pull request template.
  2. Wait for the CI checks to pass.
    1. For first-time contributors, you may need to wait for the MarkBind team to approve your PR before the CI checks can run.
  3. Verify that the PR preview is working.
    1. The PR preview is generated by netlify/markbind-master/deploy-preview.
    2. You can find the link to the PR preview in the checks section of the PR. PR Checks Section
    3. Open the link to the PR preview and ensure that your changes are reflected in the rendered site
  4. Follow up with PR reviews and make changes as requested.

Since this is a hypothetical change, you do not need to raise a PR. You can refer to PR #1924 for an example.

Checkpoint

For actual documentation changes, check that the following are true:

  • The PR template has been filled in
  • The PR preview is working

Summary

In this task, you have learned how to make documentation changes to MarkBind!

While documentation changes are not as exciting as code changes, they are still important. In particular, our documentation is generated by MarkBind itself, utilizing the same features that we are documenting. This means that our documentation is a great place to discover and analyze how MarkBind is used!

Here are some additional tasks for you to try out:

When you are ready, move on to learn how to squash some bugs!

Explore MarkBind as a User

Fix a Bug


+

When you are ready, move on to learn how to squash some bugs!

Explore MarkBind as a User

Fix a Bug


diff --git a/devGuide/bootcamp/contributeToDocs.page-vue-render.js b/devGuide/bootcamp/contributeToDocs.page-vue-render.js index 5dd194f0..7bd2b52e 100644 --- a/devGuide/bootcamp/contributeToDocs.page-vue-render.js +++ b/devGuide/bootcamp/contributeToDocs.page-vue-render.js @@ -65,6 +65,6 @@ with(this){return _c('ul',{staticClass:"contains-task-list"},[_c('li',{staticCla with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/bootcamp/exploreMarkBind.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Explore MarkBind as a User")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/bootcamp/fixABug.html"}},[_c('span',[_c('span',[_v("Fix a Bug")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/bootcamp/exploreMarkBind.html b/devGuide/bootcamp/exploreMarkBind.html index e8653ac5..a5de3d66 100644 --- a/devGuide/bootcamp/exploreMarkBind.html +++ b/devGuide/bootcamp/exploreMarkBind.html @@ -3,7 +3,7 @@ - + MarkBind - Explore MarkBind as a User @@ -95,7 +95,7 @@
  • Update your GitHub repository setting for deploying to GitHub Pages. -
    1. Navigate to the Settings > Pages section on GitHub for that repository and set the source to Deploy from a branch and the branch to gh-pages and /(root).
  • Checkpoint

    Check that the following are true:

    • The triggered GitHub action runs are successful
    • The site is deployed and available at https://<username>.github.io/mb-dev-xxx/ (after a few seconds to a few minutes)

    Congratulations! ๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰ You have deployed your MarkBind site!

    Summary

    In the first part of this bootcamp, we experimented with MarkBind as a user. We have set up the master branch of MarkBind and created a new MarkBind site. We have also created content with MarkBind components/syntax and deployed our site.

    Here are some additional tasks for you to try out:

    Take a break now โ˜•๏ธ and we will continue with the second part of the bootcamp!

    Onboarding Bootcamp

    Contribute to Documentation


    +
    1. Navigate to the Settings > Pages section on GitHub for that repository and set the source to Deploy from a branch and the branch to gh-pages and /(root).

    Checkpoint

    Check that the following are true:

    • The triggered GitHub action runs are successful
    • The site is deployed and available at https://<username>.github.io/mb-dev-xxx/ (after a few seconds to a few minutes)

    Congratulations! ๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰ You have deployed your MarkBind site!

    Summary

    In the first part of this bootcamp, we experimented with MarkBind as a user. We have set up the master branch of MarkBind and created a new MarkBind site. We have also created content with MarkBind components/syntax and deployed our site.

    Here are some additional tasks for you to try out:

    Take a break now โ˜•๏ธ and we will continue with the second part of the bootcamp!

    Onboarding Bootcamp

    Contribute to Documentation


    diff --git a/devGuide/bootcamp/exploreMarkBind.page-vue-render.js b/devGuide/bootcamp/exploreMarkBind.page-vue-render.js index e763ae66..a278bd97 100644 --- a/devGuide/bootcamp/exploreMarkBind.page-vue-render.js +++ b/devGuide/bootcamp/exploreMarkBind.page-vue-render.js @@ -98,6 +98,6 @@ with(this){return _c('ul',{staticClass:"contains-task-list"},[_c('li',{staticCla with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/bootcamp/intro.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Onboarding Bootcamp")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/bootcamp/contributeToDocs.html"}},[_c('span',[_c('span',[_v("Contribute to Documentation")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/bootcamp/fixABug.html b/devGuide/bootcamp/fixABug.html index dadb7ee2..243a9e23 100644 --- a/devGuide/bootcamp/fixABug.html +++ b/devGuide/bootcamp/fixABug.html @@ -3,7 +3,7 @@ - + MarkBind - Fix a Bug @@ -101,7 +101,7 @@

    Checkpoint

    Check that the following are true:

    • Run npm run test in the root directory to run the entire test suite.
    • See that the test passes

    Update Documentation

    If the bug is related to a feature that is documented, we should update the documentation to reflect the changes. This is especially important if the bug fix changes the behavior of the feature.

    In this case, we will not need to update the documentation.

    Create PR & Follow up with the Reviews

    Now that we have completed our changes, we can create a PR to merge the changes into the master branch.

    Similar to Contribute to Documentation, we will need to:

    1. Fill in the pull request template.
    2. Wait for the CI checks to pass.
      1. For first-time contributors, you may need to wait for the MarkBind team to approve your PR before the CI checks can run.
    3. Verify that the PR preview is working. -
      1. The PR preview is generated by netlify/markbind-master/deploy-preview.
      2. You can find the link to the PR preview in the checks section of the PR. PR Checks Section
      3. Open the link to the PR preview and ensure that your changes are reflected in the rendered site
    4. Follow up with PR reviews and make changes as requested.

    For changes that involve code logic, some discussion may be required to determine the best way to fix the bug. Hence, it may be helpful to get feedback early either by creating a draft PR or by discussing the approach in the issue thread.

    Summary

    In this task, you have learned how to deal with a bug report. While the example bug report is simple, the steps are generally the same for more complex bug reports.

    Here are some additional tasks for you to try out:

    When you are ready, move on to learn how to implement a new feature!

    Contribute to Documentation

    Implement a New Feature


    +
    1. The PR preview is generated by netlify/markbind-master/deploy-preview.
    2. You can find the link to the PR preview in the checks section of the PR. PR Checks Section
    3. Open the link to the PR preview and ensure that your changes are reflected in the rendered site
  • Follow up with PR reviews and make changes as requested.
  • For changes that involve code logic, some discussion may be required to determine the best way to fix the bug. Hence, it may be helpful to get feedback early either by creating a draft PR or by discussing the approach in the issue thread.

    Summary

    In this task, you have learned how to deal with a bug report. While the example bug report is simple, the steps are generally the same for more complex bug reports.

    Here are some additional tasks for you to try out:

    When you are ready, move on to learn how to implement a new feature!

    Contribute to Documentation

    Implement a New Feature


    diff --git a/devGuide/bootcamp/fixABug.page-vue-render.js b/devGuide/bootcamp/fixABug.page-vue-render.js index 695466c9..fc78ba97 100644 --- a/devGuide/bootcamp/fixABug.page-vue-render.js +++ b/devGuide/bootcamp/fixABug.page-vue-render.js @@ -89,6 +89,6 @@ with(this){return _c('ul',{staticClass:"contains-task-list"},[_c('li',{staticCla with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/bootcamp/contributeToDocs.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Contribute to Documentation")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/bootcamp/implementAFeature.html"}},[_c('span',[_c('span',[_v("Implement a New Feature")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/bootcamp/implementAFeature.html b/devGuide/bootcamp/implementAFeature.html index 6278485e..f445000f 100644 --- a/devGuide/bootcamp/implementAFeature.html +++ b/devGuide/bootcamp/implementAFeature.html @@ -3,7 +3,7 @@ - + MarkBind - Implement a New Feature @@ -32,7 +32,7 @@
  • And more!
  • Add Tests & Update Documentation

    (Same as what we mentioned in the previous task)

    By this time, you should have a good idea about how tests and documentation are written. Where possible, unit tests should also be added to ensure that the feature works as expected. Utilizing the new feature in our documentation is also encouraged so that we can get a better idea of how the feature can be used.

    When adding intra-site links, use tags to differentiate between the deployment environment when appropriate, as mentioned in Adding Intra-Site Links to Documentation!

    Create PR & Follow up with the Reviews

    (Same as what we mentioned in the previous task)

    1. Fill in the pull request template.
    2. Wait for the CI checks to pass.
      1. For first-time contributors, you may need to wait for the MarkBind team to approve your PR before the CI checks can run.
    3. Verify that the PR preview is working. -
      1. The PR preview is generated by netlify/markbind-master/deploy-preview.
      2. You can find the link to the PR preview in the checks section of the PR. PR Checks Section
      3. Open the link to the PR preview and ensure that your changes are reflected in the rendered site
    4. Follow up with PR reviews and make changes as requested.

    For features, it is also crucial to get early feedback on implementation details. This is because some considerations may need to be exercised when introducing new user-facing syntax. Another problem is that the implementation may not be the most appropriate or straightforward one, sometimes due to how existing code is structured.

    Issue #1475 is an example where the work in PR #1988 involved changing the implementation midway.

    Summary

    In this part, we have reviewed the steps to implement a new feature. Working on a new feature can be a daunting task, but it is also very rewarding to own a feature from start to finish.

    Here are some additional tasks for you to try out:

    And...that's it!๐Ÿš€๐Ÿš€๐Ÿš€

    You have completed the bootcamp! Take a well-deserved rest and we look forward to your contributions!

    Fix a Bug

    Setting up


    +
    1. The PR preview is generated by netlify/markbind-master/deploy-preview.
    2. You can find the link to the PR preview in the checks section of the PR. PR Checks Section
    3. Open the link to the PR preview and ensure that your changes are reflected in the rendered site
  • Follow up with PR reviews and make changes as requested.
  • For features, it is also crucial to get early feedback on implementation details. This is because some considerations may need to be exercised when introducing new user-facing syntax. Another problem is that the implementation may not be the most appropriate or straightforward one, sometimes due to how existing code is structured.

    Issue #1475 is an example where the work in PR #1988 involved changing the implementation midway.

    Summary

    In this part, we have reviewed the steps to implement a new feature. Working on a new feature can be a daunting task, but it is also very rewarding to own a feature from start to finish.

    Here are some additional tasks for you to try out:

    And...that's it!๐Ÿš€๐Ÿš€๐Ÿš€

    You have completed the bootcamp! Take a well-deserved rest and we look forward to your contributions!

    Fix a Bug

    Setting up


    diff --git a/devGuide/bootcamp/implementAFeature.page-vue-render.js b/devGuide/bootcamp/implementAFeature.page-vue-render.js index db257451..e305f441 100644 --- a/devGuide/bootcamp/implementAFeature.page-vue-render.js +++ b/devGuide/bootcamp/implementAFeature.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('ul',{staticClass:"contains-task-list"},[_c('li',{staticCla with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/bootcamp/fixABug.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Fix a Bug")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/development/settingUp.html"}},[_c('span',[_c('span',[_v("Setting up")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/bootcamp/intro.html b/devGuide/bootcamp/intro.html index 85ebfdb2..2ba2bca1 100644 --- a/devGuide/bootcamp/intro.html +++ b/devGuide/bootcamp/intro.html @@ -3,7 +3,7 @@ - + MarkBind - Onboarding Bootcamp @@ -27,7 +27,7 @@

    Onboarding Bootcamp

    Onboarding Bootcamp

    New developers are often confused about how to get started in brown-field projects. This onboarding bootcamp is created to ramp up developer familiarity with the MarkBind codebase and get you started with contributing (in a variety of ways) to MarkBind.

    In the following pages, we will go through a series of tasks and you are encouraged to follow along to walk through some of the typical development workflows. When in doubt, you can always refer to the rest of the developer guide for more information.

    Structure

    Each Task will include a "TLDR" section that summarizes the key objectives. This is intended for developers who wish to attempt the task on their own. The rest of the page will include a step-by-step guide and checkpoints -to help you complete the task.

    Summary of Tasks

    1. Explore MarkBind as a user
    2. Contribute to our documentation
    3. Fix a bug
    4. Implement a new feature

    Maintainers' Note

    This onboarding bootcamp is intended for developers who are keen to make more than just one contribution to the project. It is particularly well-suited for onboarding NUS Independent Work Module (CP3108A and CP3108B) and Thematic Systems Project (CS3281 aka Software Engineering in Live Projects) students, but may also be useful to any external developers who wish to dive deeper into the codebase. While we encourage all new developers to go through this process, it is optional and developers are welcome to jump straight into making contributions if they prefer.

    The maintenance of this onboarding bootcamp document does require effort. If you encounter any issues as the materials become outdated or have suggestions, we highly encourage you to submit an issue or make a pull request to update the materials. This will help us keep the onboarding process up-to-date and effective for future developers.

    Contributing

    Explore MarkBind as a User


    +to help you complete the task.

    Summary of Tasks

    1. Explore MarkBind as a user
    2. Contribute to our documentation
    3. Fix a bug
    4. Implement a new feature

    Maintainers' Note

    This onboarding bootcamp is intended for developers who are keen to make more than just one contribution to the project. It is particularly well-suited for onboarding NUS Independent Work Module (CP3108A and CP3108B) and Thematic Systems Project (CS3281 aka Software Engineering in Live Projects) students, but may also be useful to any external developers who wish to dive deeper into the codebase. While we encourage all new developers to go through this process, it is optional and developers are welcome to jump straight into making contributions if they prefer.

    The maintenance of this onboarding bootcamp document does require effort. If you encounter any issues as the materials become outdated or have suggestions, we highly encourage you to submit an issue or make a pull request to update the materials. This will help us keep the onboarding process up-to-date and effective for future developers.

    Contributing

    Explore MarkBind as a User


    diff --git a/devGuide/bootcamp/intro.page-vue-render.js b/devGuide/bootcamp/intro.page-vue-render.js index 824520b6..bdbe719a 100644 --- a/devGuide/bootcamp/intro.page-vue-render.js +++ b/devGuide/bootcamp/intro.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('p',[_v("The maintenance of this onboarding bootcamp docume with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/devGuide.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Contributing")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/bootcamp/exploreMarkBind.html"}},[_c('span',[_c('span',[_v("Explore MarkBind as a User")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/design/architecture.html b/devGuide/design/architecture.html index 99a18cc1..96930436 100644 --- a/devGuide/design/architecture.html +++ b/devGuide/design/architecture.html @@ -3,7 +3,7 @@ - + MarkBind - Architecture @@ -28,7 +28,7 @@ โ€บโ€บย ย 

    Architecture

    Architecture

    This page provides an overview of the MarkBind's architecture.

    MarkBind Architecture Diagram

    The above diagram shows the key classes and in MarkBind. You may note the following from these:

    Key classes

    The 3 key classes representing different types of content are as follows:

    1. Page โ€” a page, as specified by the user in their various site configuration glob or src properties. These are directly managed by the Site instance.
    2. Layout โ€” a single layout file, as contained in the _markbind/layouts folder, collectively managed by LayoutManager.

    Note that Layout instances do not generate any output files directly, but rather, they store intermediate processing results to be used in a Page.

    1. External โ€” source files referenced in a Page, Layout or even another External that result in a output file. These output files are loaded dynamically and on-demand in the browser. These instances are managed by a single ExternalManager instance.

    For example, the file referenced by a <panel src="xx.md"> generates a separate xx._include_.html, which is requested and loaded only when the panel is expanded.

    Content processing flow

    Every Page, Layout and External follows the same overall content processing flow, that is:

    Nunjucks Markdown Html

    Note that generation of Externals (e.g. <panel src="...">) do not fall within the content processing flow where they are referenced. These are only flagged for generation, and then processed by ExternalManager after, in another similar content processing flow within an External instance.

    Rationale

    This simple three stage flow provides a simple, predictable content processing flow for the user, and removes several other development concerns:

    1. As the templating language of choice, Nunjucks is always processed first, allowing its templating capabilities to be used to the full extent. -Its syntax is also the most compatible and independent of the other stages.

    2. Secondly, Markdown is rendered before HTML, which produces more HTML. This also allows core Markdown features (e.g. code blocks) and Markdown plugins with eccentric syntaxes to be used without having to patch the HTML parser.

    3. Having processed possibly conflicting Nunjucks and Markdown syntax, HTML is then processed last.

    Project Structure

    Server Side Rendering


    +Its syntax is also the most compatible and independent of the other stages.

  • Secondly, Markdown is rendered before HTML, which produces more HTML. This also allows core Markdown features (e.g. code blocks) and Markdown plugins with eccentric syntaxes to be used without having to patch the HTML parser.

  • Having processed possibly conflicting Nunjucks and Markdown syntax, HTML is then processed last.

  • Project Structure

    Server Side Rendering


    diff --git a/devGuide/design/architecture.page-vue-render.js b/devGuide/design/architecture.page-vue-render.js index 4be2a545..1eb78e60 100644 --- a/devGuide/design/architecture.page-vue-render.js +++ b/devGuide/design/architecture.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('ol',[_c('li',[_c('p',[_v("As the templating language of ch with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/design/projectStructure.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Project Structure")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/design/serverSideRendering.html"}},[_c('span',[_c('span',[_v("Server Side Rendering")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/design/projectStructure.html b/devGuide/design/projectStructure.html index 3d7d7229..bbd27c3a 100644 --- a/devGuide/design/projectStructure.html +++ b/devGuide/design/projectStructure.html @@ -3,7 +3,7 @@ - + MarkBind - Project Structure @@ -26,7 +26,7 @@

    Project Structure

    Project Structure

    This page gives you an overview of the MarkBind's internal project structure.

    Packages

    The MarkBind project is developed in a (MarkBind/markbind) of 4 packages:

    MarkBind core library

    The core library mainly houses:

    The key external libraries used are:

    MarkBind CLI

    The CLI application uses and further builds on the interface exposed by the core library's Site model to provide functionalities for the author, such as markbind serve which initiates a live reload workflow.

    The key external libraries used are:

    MarkBind core-web library

    This package houses the various frontend assets used in the core package.

    Some external assets included are Vue.js, Bootstrap bundles, and FontAwesome bundles.

    Internal bundles are also present, generated from setup scripts, custom stylesheets and the UI components library.

    UI components library

    This package consists of a mix of Bootstrap and proprietary components rewritten in Vue.js based on our needs for educational websites.

    We forked it from the original yuche/vue-strap repo into the MarkBind/vue-strap repo, and then later merged it into the main MarkBind/markbind repo.

    The key dependencies used are:

    Some custom components and directives are also added for MarkBind's use.


    Migrating to TypeScript

    Architecture


    +

    Project Structure

    Project Structure

    This page gives you an overview of the MarkBind's internal project structure.

    Packages

    The MarkBind project is developed in a (MarkBind/markbind) of 4 packages:

    MarkBind core library

    The core library mainly houses:

    The key external libraries used are:

    MarkBind CLI

    The CLI application uses and further builds on the interface exposed by the core library's Site model to provide functionalities for the author, such as markbind serve which initiates a live reload workflow.

    The key external libraries used are:

    MarkBind core-web library

    This package houses the various frontend assets used in the core package.

    Some external assets included are Vue.js, Bootstrap bundles, and FontAwesome bundles.

    Internal bundles are also present, generated from setup scripts, custom stylesheets and the UI components library.

    UI components library

    This package consists of a mix of Bootstrap and proprietary components rewritten in Vue.js based on our needs for educational websites.

    We forked it from the original yuche/vue-strap repo into the MarkBind/vue-strap repo, and then later merged it into the main MarkBind/markbind repo.

    The key dependencies used are:

    Some custom components and directives are also added for MarkBind's use.


    Migrating to TypeScript

    Architecture


    diff --git a/devGuide/design/projectStructure.page-vue-render.js b/devGuide/design/projectStructure.page-vue-render.js index 8afe1fee..c76bf88e 100644 --- a/devGuide/design/projectStructure.page-vue-render.js +++ b/devGuide/design/projectStructure.page-vue-render.js @@ -71,6 +71,6 @@ with(this){return _c('ul',[_c('li',[_c('p',[_c('strong',[_v("MarkBind components with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/development/migratingToTypeScript.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Migrating to TypeScript")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/design/architecture.html"}},[_c('span',[_c('span',[_v("Architecture")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/design/serverSideRendering.html b/devGuide/design/serverSideRendering.html index ee82a694..38b48556 100644 --- a/devGuide/design/serverSideRendering.html +++ b/devGuide/design/serverSideRendering.html @@ -3,7 +3,7 @@ - + MarkBind - Server Side Rendering @@ -28,7 +28,7 @@ โ€บโ€บย ย 

    Server Side Rendering

    Server Side Rendering

    MarkBind uses Server-side Rendering (SSR) for its pages.

    To ensure SSR works properly, there are certain rules that developers should adhere to.

    This page will describe SSR in general and elaborate on the caveats that developers should take note of when contributing to MarkBind.

    Pre-requisite Knowledge

    To deal with SSR, it is important to first have a good understanding of two things:

    1. Vue
    2. MarkBind's Packages

    Understanding Vue

    Here is a short list of questions to check your understanding of Vue:

    Useful Resources to understand Vue better

    If there are any doubts regarding the questions above, here are some good resources to refer to:

    Understanding MarkBind's Packages

    There are four packages in MarkBind's codebase:

    1. cli
    2. core
    3. core-web
    4. vue-components

    You may refer to MarkBind's project structure to get a better understanding of how the packages work together.

    What is Server-side Rendering and Why?

    In MarkBind's context, SSR refers to the generation of proper HTML strings from Vue components on the server (core library) instead of shifting that responsibility to the client-side (browser).

    The main motivation that we had for introducing SSR into MarkBind is to enhance user experience by resolving the unsightly issue of Flash-of-Unstyled-Content (FOUC), which occurs due to our reliance on Client-side Rendering (CSR).

    Client-side Hydration

    SSR and Client-side Hydration are 2 concepts that go hand-in-hand. Essentially, once we produce the static HTML via SSR and send it over to the client-side, Vue on the client-side will execute what is known as Client-side Hydration on the static HTML.

    During the hydration process, Vue essentially compares your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

    This is known as "Hydration Issue" and it is one of the main challenges you will face with SSR in MarkBind.

    Using production build

    In production build, Vue does not perform hydration check. Any errors resulting from hydration will trigger full CSR without warning. MarkBind uses the development build by default when you serve it in development mode (-d option).

    Penalties of Hydration Issue

    When hydration fails, on top of the wasted time and effort in executing SSR, we will also incur the additional time penalty of executing Client-side Hydration (where CSR will follow afterwards).

    Fortunately, even if we face hydration issues and execute full CSR, the FOUC problem will still be resolved nonetheless. The reason for this is because the SSR HTML markup should resemble the CSR HTML markup to a large extent.

    Supposedly, hydration issues typically occurs due to minor differences between client-side rendered virtual DOM tree and the server-rendered content. Of course, this is assuming that we are adhering to the concept of "universal application" as much as possible, which will be explained in the following section.

    Avoiding Hydration Issue

    Conceptually, to prevent hydration issue, what we should always strive to achieve is a "universal application".

    It is not difficult to achieve a "universal application" per-se because we merely have to ensure two things:

    1. the initial state is the same between client-side and server-side.
    2. after compiling and rendering the Vue page application, the SSR HTML mark-up is not modified.

    Beyond achieving a "universal application", note that the HTML specifications should also be adhered to.

    Some common mistakes are as such:

    If you are unsure what elements are allowed within other elements, or what constitutes invalid HTML in general, a good resource to reference would be the MDN Web Docs.

    Modern browsers have robust inbuilt mechanisms to auto-correct common causes of hydration. Therefore, to avoid high false positive rate, Markbind has a minimalist rule-based validation against violations. The code for this is located in `core/src/utils/htmlValidationUtils.ts`. -

    Please help extend it when violations that cause hydration on browsers are spotted.

    Note that the list only included the common causes of hydration issue that MarkBind developers have ran into. There may be other causes of hydration issue that are not listed here (although unlikely).

    Architecture

    GitHub Actions: Overview


    +

    Please help extend it when violations that cause hydration on browsers are spotted.

    Note that the list only included the common causes of hydration issue that MarkBind developers have ran into. There may be other causes of hydration issue that are not listed here (although unlikely).

    Architecture

    GitHub Actions: Overview


    diff --git a/devGuide/design/serverSideRendering.page-vue-render.js b/devGuide/design/serverSideRendering.page-vue-render.js index fd995f17..6c6cc27c 100644 --- a/devGuide/design/serverSideRendering.page-vue-render.js +++ b/devGuide/design/serverSideRendering.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('ul',[_c('li',[_v("Having block-level elements within "),_c with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/design/architecture.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Architecture")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/githubActions/overview.html"}},[_c('span',[_c('span',[_v("GitHub Actions: Overview")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/devGuide.html b/devGuide/devGuide.html index b0ade768..ed8b2193 100644 --- a/devGuide/devGuide.html +++ b/devGuide/devGuide.html @@ -3,7 +3,7 @@ - + MarkBind - Contributing @@ -26,7 +26,7 @@

    Contributing

    Developer guide

    Contributing

    Thank you for your interest in contributing! We're glad you want to help. We welcome PRs, especially from students.

    First, do take note of our code of conduct (from SE-EDU). Reporting bugs or submitting feature suggestions in our issue tracker can help too.

    Second, ensure you have a basic knowledge of the following:

    Third, ensure you have spent time with MarkBind and familiar with the content of the user guide. It's important to know the product well before you start contributing code.

    Now, follow these steps to get started on contributing:

    1. Set up the project in your computer (see the Setting up page)
    2. Learn our workflow (see the Workflow page)
    3. (Optional) Go through our onboarding bootcamp (see the Onboarding Bootcamp page)
    4. Submit PRs as per the workflow. If you encounter any problems, post in our issue tracker.
    5. (Optional) Add yourself to the contributors list! (Bug reported? PR merged? If you haven't done so already, add yourself to our list of contributors!)

    We look forward to your PR. Happy coding!

    Onboarding Bootcamp


    +

    Contributing

    Developer guide

    Contributing

    Thank you for your interest in contributing! We're glad you want to help. We welcome PRs, especially from students.

    First, do take note of our code of conduct (from SE-EDU). Reporting bugs or submitting feature suggestions in our issue tracker can help too.

    Second, ensure you have a basic knowledge of the following:

    Third, ensure you have spent time with MarkBind and familiar with the content of the user guide. It's important to know the product well before you start contributing code.

    Now, follow these steps to get started on contributing:

    1. Set up the project in your computer (see the Setting up page)
    2. Learn our workflow (see the Workflow page)
    3. (Optional) Go through our onboarding bootcamp (see the Onboarding Bootcamp page)
    4. Submit PRs as per the workflow. If you encounter any problems, post in our issue tracker.
    5. (Optional) Add yourself to the contributors list! (Bug reported? PR merged? If you haven't done so already, add yourself to our list of contributors!)

    We look forward to your PR. Happy coding!

    Onboarding Bootcamp


    diff --git a/devGuide/devGuide.page-vue-render.js b/devGuide/devGuide.page-vue-render.js index b62054d1..9b0a3f49 100644 --- a/devGuide/devGuide.page-vue-render.js +++ b/devGuide/devGuide.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('p',[_c('strong',[_v("We look forward to your PR. Happy cod with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/bootcamp/intro.html"}},[_c('span',[_c('span',[_v("Onboarding Bootcamp")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/development/migratingNodeJs.html b/devGuide/development/migratingNodeJs.html index bf4bda2e..1fd89758 100644 --- a/devGuide/development/migratingNodeJs.html +++ b/devGuide/development/migratingNodeJs.html @@ -3,7 +3,7 @@ - + MarkBind - Migrating Node.js @@ -44,7 +44,7 @@
  • Update documentation
  • Update neftlify.toml
  • Writing Plugins

    Project Structure


    +Don't forget to update the version numbers in the example config files in Deploying the Site!
  • Update neftlify.toml
  • Writing Plugins

    Project Structure


    diff --git a/devGuide/development/migratingNodeJs.page-vue-render.js b/devGuide/development/migratingNodeJs.page-vue-render.js index 8d36cbd1..5677734e 100644 --- a/devGuide/development/migratingNodeJs.page-vue-render.js +++ b/devGuide/development/migratingNodeJs.page-vue-render.js @@ -59,6 +59,6 @@ with(this){return _c('li',[_v("Update "),_c('code',{pre:true,attrs:{"class":"hlj with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/development/writingPlugins.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Writing Plugins")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/design/projectStructure.html"}},[_c('span',[_c('span',[_v("Project Structure")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/development/migratingToTypeScript.html b/devGuide/development/migratingToTypeScript.html index 9eba5773..5cfb7f94 100644 --- a/devGuide/development/migratingToTypeScript.html +++ b/devGuide/development/migratingToTypeScript.html @@ -3,7 +3,7 @@ - + MarkBind - Migrating to TypeScript @@ -38,7 +38,7 @@ For example: git commit --no-verify -m "Rename core/src/html to TypeScript".

    Step 3: "Adapt" Commit

    1. Start automatic compilation on change/save. More on this at Editing backend features section in the Workflow page.

    2. Change the CommonJS module import/export syntax to TypeScript's equivalent syntax (use ES6 syntax only if possible).

      A common error in newly renamed files comes from the way modules are imported/exported. Those statements can be converted according to the Import/Export Syntax Reference section below. The steps are as follows:

      1. Start by changing the import/export statements into TypeScript equivalent syntax. Be careful with imports as you have to match them with the export syntax that the modules use, be it TypeScript equivalent or ES6.

      2. Check whether it is possible to change the export to use ES6 syntax. As mentioned in the syntax reference, ES6 should not be used if the module only exports a single thing. Change to ES6 syntax only if possible, otherwise keep with TypeScript equivalent syntax.

      3. You might have to adjust how the files are imported by other TypeScript (.ts) files. If you are changing the export to the TypeScript equivalent syntax, then it must be imported the same way as well. The same goes for the ES6 syntax.

    3. Adapt the files fully to TypeScript.

      The errors from TypeScript and typescript-eslint can guide you on what to fix. Only fix what is necessary and be careful with accidentally modifying any code functionality. Avoid using any as best as you can.

      If you happen to encounter type errors related to using names (of constant, properties, members, etc.) from another MarkBind import that is still in JavaScript (.js), you can try to infer simple types in your file first as a "stand-in" of the more robust types when that internal dependency is eventually migrated.

      On the flip side of the above situation, once you have developed a robust type for your own file, adjust how other TypeScript (.ts) files type names referenced from your files as applicable. Some type declarations might need to be made stricter, or can be removed if it's not necessary anymore, and so on. This will ensure that the files will be incrementally stricter.

    4. Make sure everything is in order by running npm run test in the root directory.

      The core package tests can directly run on the .ts files (powered by ts-jest), and the cli package tests uses the compiled files from core. Therefore, passing the cli tests means that it is very likely the compiled files work as expected.

    5. Stage the adapted files and the typings from Step 1 for commit. Verify the changes before committing.

    6. Commit the changes with the message Adapt <file-or-folder> to TypeScript.
      For example, Adapt core/src/html to TypeScript.

    You are now ready to create a pull request for the changes to the repository.

    (Optional) Step 4: Changing the commit

    While refactoring you may encounter scenarios where you might have to amend your code after a commit. There are 2 common scenarios which we will cover.

    Scenario 1: You have 2 commits and want to add on to the second commit.


    Scenario 2: You have more than 2 commits and want to make it into 2 commits.



    Example of Migrated Works

    You can see these pull requests to observe the finished migration works:

    Import/Export Syntax Reference

    Here is the reference on changing the import/export statements from CommonJS syntax into those that TypeScript support: TypeScript equivalent syntax, and ES6 syntax.

    The TypeScript equivalent syntax is designed to compile to the exact same code as CommonJS. You can read more about this syntax in the official documentation.

    The ES6 syntax is the newer JavaScript syntax that TypeScript recommends, but in certain cases it does not compile to the exact same code as CommonJS. We simplify the concepts here for illustration, refer to the StackOverflow post here for more details.

    In the tables below, a "thing" is defined as a JavaScript construct that can be exported, such as constants, functions, classes, etc. In ES6 syntax, a "thing" can also be TypeScript constructs like types, interfaces, enums, etc.

    Exports

    What to Export CommonJS TypeScript equivalent ES6
    One thing only module.exports = x export = x export default x ย ^
    Object of one/more things module.exports = { x, y, z } export = { x, y, z } export { x, y, z }

    ^: For compatibility, do not use export default during migration. It is compiled differently and does not play well with dependants that are still in .js, unless some clunky modifications are made in the .js files (refer to the StackOverflow post previously linked).

    Imports from a module that exports one thing only

    What to Import CommonJS TypeScript equivalent ES6
    Exported thing const x = require(a) import x = require(a) ย ^ import x from a ย ^

    ^: You can only use TypeScript equivalent syntax when the exported module is also in the TypeScript equivalent syntax. The same goes for the ES6 syntax.

    Imports from a module that exports an object of one/more things

    What to Import CommonJS TypeScript equivalent ES6
    Entire object const w = require(a) import w = require(a) import * as w from a
    Selected things const { x } = require(a) N/A ย ^ import { x } from a

    ^: While not equivalent on the compile-level, this can be achieved by importing the entire object then destructuring the object.

    Explanation Notes

    Why do we need to separate "Rename" and "Adapt" commits

    We want to keep the file history intact throughout this migration, meaning that we should still be able to see the change history of the .ts files even from the time when they were still in .js.

    When we rename files, we have to keep the Git similarity index between the old file and the new file above a certain threshold (50%) to keep the history, or else it will be regarded as a different file with its own history.

    Combining the two steps into one - that is, adapting files immediately after renaming - will lower the similarity index, therefore making it possible for the files, especially small ones or those that need a lot of changes when adapting, to hit below the similarity threshold and lose their history.

    The solution to this is to make the rename and adapt commits separate, in order for Git to recognize first that the file has changed into .ts, and so the changes are compared not against the old .js file, but to the renamed .ts file instead.

    Why do we need a rebase and merge commit

    Even if the migration developer has kept the history intact through the separate "Rename" and "Adapt" commits, this is only intact at their working branch. At the end of the day, the totality of the changes in the working branch is compared against the target branch, in which the same consideration would apply.

    If we do the usual squash commit, the changes from the two commits are combined into a new commit and only that commit will be pushed into the target branch. The original two commits are omitted, therefore the history of the working branch that we have tried to keep intact is stripped away. This results in a linear history, as if the changes in the working branch were made -after the latest changes in the target branch.

    Writing Plugins

    Project Structure


    +after the latest changes in the target branch.

    Writing Plugins

    Project Structure


    diff --git a/devGuide/development/migratingToTypeScript.page-vue-render.js b/devGuide/development/migratingToTypeScript.page-vue-render.js index 6dad85e3..0182e809 100644 --- a/devGuide/development/migratingToTypeScript.page-vue-render.js +++ b/devGuide/development/migratingToTypeScript.page-vue-render.js @@ -131,6 +131,6 @@ with(this){return _c('h3',{attrs:{"id":"why-do-we-need-a-rebase-and-merge-commit with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/development/writingPlugins.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Writing Plugins")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/design/projectStructure.html"}},[_c('span',[_c('span',[_v("Project Structure")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/development/settingUp.html b/devGuide/development/settingUp.html index 0f20019b..bd73b354 100644 --- a/devGuide/development/settingUp.html +++ b/devGuide/development/settingUp.html @@ -3,7 +3,7 @@ - + MarkBind - Setting up @@ -31,7 +31,7 @@ in the root folder of your cloned repo.

  • Congratulations! Now you are ready to start modifying MarkBind code.

  • There are a few Git hooks implemented using the pre-commit tool that runs common tasks like linting, automated tests and compiling typescript files.

    Install the hooks by running python3 ./pre-commit/pre-commit-2.20.0.pyz install in the root folder of your cloned repo.

    If you ever need to uninstall the hooks, simply run uninstall instead of install.

    Common setup questions

    1. Does MarkBind work with all operating systems?

      Yes! We support all operating systems.

    2. How does MarkBind manage dependencies?

      MarkBind uses lerna, a popular multi-package development tool, to manage its dependencies. It is essentially a high level wrapper over node and npm's functionalities.

    3. How do I move back to the released version of MarkBind?

      To go back to the released version of MarkBind, run -npm un -g markbind-cli, followed by npm i -g markbind-cli.

    4. Some of my front-end components are not working as expected when running markbind serve.

      Try running either markbind serve -d or npm run build:web to view frontend changes (especially after pulling a frontend update that someone else may have pushed). You can see more details here.

    Implement a New Feature

    Workflow


    +npm un -g markbind-cli, followed by npm i -g markbind-cli.

  • Some of my front-end components are not working as expected when running markbind serve.

    Try running either markbind serve -d or npm run build:web to view frontend changes (especially after pulling a frontend update that someone else may have pushed). You can see more details here.

  • Implement a New Feature

    Workflow


    diff --git a/devGuide/development/settingUp.page-vue-render.js b/devGuide/development/settingUp.page-vue-render.js index 2396e92a..72603a78 100644 --- a/devGuide/development/settingUp.page-vue-render.js +++ b/devGuide/development/settingUp.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('ol',[_c('li',[_c('p',[_v("Does MarkBind work with all oper with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/bootcamp/implementAFeature.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Implement a New Feature")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/development/workflow.html"}},[_c('span',[_c('span',[_v("Workflow")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/development/workflow.html b/devGuide/development/workflow.html index ff70aac5..9cbfe31f 100644 --- a/devGuide/development/workflow.html +++ b/devGuide/development/workflow.html @@ -3,7 +3,7 @@ - + MarkBind - Workflow @@ -143,7 +143,7 @@

    Linting

    We follow our style guides. Using a linter will help check and fix some of the code style errors in your code. It will save time for both you and your code reviewer. The linting tool we use is ESLint and StyleLint. Here is a gist with an explanation of the ESLint rules chosen in markbind-cli.

    Before making a commit or pull request, you should lint your code by running the following commands from the root of your project:

    It is also possible to auto-fix some (not all) style errors, using npm run lintfix.

    ESLint has integrations with popular editors. They offer features such as "fix errors on save", which will make development smoother.

    Git hooks

    We have three git hooks in our project. We use pre-commit to manage our git hooks.
    -The pre-commit scripts are located in ./pre-commit/pre-commit-scripts and the config is found in ./pre-commit-config.yaml.

    To skip running the pre-commit hook or pre-push hook, you can use the --no-verify flag (e.g. git push --no-verify origin fork_branch).

    Dependency management

    As mentioned in the setting up page, MarkBind uses lerna to manage the dependencies of its various packages.

    To add a dependency

    Add your dependency into the appropriate package.json file inside packages/*. If this is a development dependency to be used across all packages (e.g. ESLint), add it the the root package.json.

    Then, simply rerun the npm run setup command to update the package-lock.json files.

    To delete a dependency

    The safest way is to first remove the particular dependency entry from the package.json file of the respective directory. Then, run npm run setup in the root directory to clean up the local dependencies and update the package-lock.json file.

    To update a dependency

    First, follow the instruction to delete the dependency. Then, follow the instruction to add the latest dependency back. Also, when updating dependencies, ensure that it is updated in all packages using that dependency.

    Dependency updates are not trivial, and can be the source of subtle bugs. You should always check the respective dependency changelogs before doing so!

    Points for consideration

    There are a few ways to incorporate external packages into MarkBind, each with its pros and cons. The following table shows some of the common trade-offs:

    Approach Pros Cons
    Installing
    • Ease of upgrade
    • Traceable in package.json
    • May not satisfy custom behavior
    • Become vulnerable if the source repo is no longer actively maintained
    Forking
    • Relatively easy to upgrade
    • Leverage upstream testing procedures
    • Benefit others who share the same use cases
    • May become out-of-sync with the latest version
    • Difficult to maintain it externally in the long run
    Patching
    • Quick - no need to maintain / publish more npm packages or setup release procedures etc
    • Ensure the changes propagate to other dependencies
    • Enjoy the benefits of monorepo
    • Difficult to upgrade

    As the choice is highly dependent on context and details of the implementation, below are some additional questions to ask before proceeding:

    Find out more about the key external libraries used in MarkBind from the project structure section. Also, the rationales behind most existing patches are documented in their respective files, read them (and their respective PRs/issues) for more context!

    Updating PlantUML

    PlantUML is a third-party library used by MarkBind to create UML diagrams. MarkBind runs the PlantUML JAR file found in packages/core/src/plugins/default when building the site to generate the diagrams.

    To update PlantUML to a newer version:

    1. Download the JAR file from PlantUML's website.
    2. Rename the file to plantuml.jar (if required), and replace the existing JAR file located in packages/core/src/plugins/default.
    3. Check the HTML pages that contain PlantUML diagrams, i.e. /userGuide/components/imagesAndDiagrams.html.

    Updating Bootstrap and Bootswatch

    As Bootswatch is built on Bootstrap, ensure that the versions of both are in sync to avoid unexpected differences in styling behavior between default and other themes. Both are currently using version 5.1.3.

    Setting up

    Writing Components


    +The pre-commit scripts are located in ./pre-commit/pre-commit-scripts and the config is found in ./pre-commit-config.yaml.

    To skip running the pre-commit hook or pre-push hook, you can use the --no-verify flag (e.g. git push --no-verify origin fork_branch).

    Dependency management

    As mentioned in the setting up page, MarkBind uses lerna to manage the dependencies of its various packages.

    To add a dependency

    Add your dependency into the appropriate package.json file inside packages/*. If this is a development dependency to be used across all packages (e.g. ESLint), add it the the root package.json.

    Then, simply rerun the npm run setup command to update the package-lock.json files.

    To delete a dependency

    The safest way is to first remove the particular dependency entry from the package.json file of the respective directory. Then, run npm run setup in the root directory to clean up the local dependencies and update the package-lock.json file.

    To update a dependency

    First, follow the instruction to delete the dependency. Then, follow the instruction to add the latest dependency back. Also, when updating dependencies, ensure that it is updated in all packages using that dependency.

    Dependency updates are not trivial, and can be the source of subtle bugs. You should always check the respective dependency changelogs before doing so!

    Points for consideration

    There are a few ways to incorporate external packages into MarkBind, each with its pros and cons. The following table shows some of the common trade-offs:

    Approach Pros Cons
    Installing
    • Ease of upgrade
    • Traceable in package.json
    • May not satisfy custom behavior
    • Become vulnerable if the source repo is no longer actively maintained
    Forking
    • Relatively easy to upgrade
    • Leverage upstream testing procedures
    • Benefit others who share the same use cases
    • May become out-of-sync with the latest version
    • Difficult to maintain it externally in the long run
    Patching
    • Quick - no need to maintain / publish more npm packages or setup release procedures etc
    • Ensure the changes propagate to other dependencies
    • Enjoy the benefits of monorepo
    • Difficult to upgrade

    As the choice is highly dependent on context and details of the implementation, below are some additional questions to ask before proceeding:

    Find out more about the key external libraries used in MarkBind from the project structure section. Also, the rationales behind most existing patches are documented in their respective files, read them (and their respective PRs/issues) for more context!

    Updating PlantUML

    PlantUML is a third-party library used by MarkBind to create UML diagrams. MarkBind runs the PlantUML JAR file found in packages/core/src/plugins/default when building the site to generate the diagrams.

    To update PlantUML to a newer version:

    1. Download the JAR file from PlantUML's website.
    2. Rename the file to plantuml.jar (if required), and replace the existing JAR file located in packages/core/src/plugins/default.
    3. Check the HTML pages that contain PlantUML diagrams, i.e. /userGuide/components/imagesAndDiagrams.html.

    Updating Bootstrap and Bootswatch

    As Bootswatch is built on Bootstrap, ensure that the versions of both are in sync to avoid unexpected differences in styling behavior between default and other themes. Both are currently using version 5.1.3.

    Setting up

    Writing Components


    diff --git a/devGuide/development/workflow.page-vue-render.js b/devGuide/development/workflow.page-vue-render.js index fbd10ba5..95cc895d 100644 --- a/devGuide/development/workflow.page-vue-render.js +++ b/devGuide/development/workflow.page-vue-render.js @@ -236,6 +236,6 @@ with(this){return _c('h3',{attrs:{"id":"updating-bootstrap-and-bootswatch"}},[_v with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/development/settingUp.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Setting up")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/development/writingComponents.html"}},[_c('span',[_c('span',[_v("Writing Components")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/development/writingComponents.html b/devGuide/development/writingComponents.html index aa068b10..8b7e8e7c 100644 --- a/devGuide/development/writingComponents.html +++ b/devGuide/development/writingComponents.html @@ -3,7 +3,7 @@ - + MarkBind - Writing Components @@ -40,7 +40,7 @@ Bundlephobia may be useful to quickly look up the size of a package!

    Dependencies

    When choosing to use a third-party library or package, it should ideally be well-maintained and not have too many dependencies. While dependencies may be inevitable, a package with dependencies on large libraries may lag behind the most recent releases of these libraries, which may become a blocker for MarkBind to migrate to these recent releases as well.

    For instance, if bootstrap-vue depends on Bootstrap and Vue, we will need to wait for bootstrap-vue to migrate to the newest versions of both Bootstrap and Vue before MarkBind can migrate to these versions of Bootstrap and Vue as well.

    Feel free to raise any concerns during the initial discussion phase for other devs to weigh in on the tradeoffs!

    Attributes and Slots

    MarkBind components may support , or both. Some components allow users to supply the same content as either a slot or an attribute. -If an author provides the same content as both a slot and an attribute, in most cases, the slot should override the attribute.

    MarkBind should also log a warning to inform the author of this conflict!

    Workflow

    Writing Plugins


    +If an author provides the same content as both a slot and an attribute, in most cases, the slot should override the attribute.

    MarkBind should also log a warning to inform the author of this conflict!

    Workflow

    Writing Plugins


    diff --git a/devGuide/development/writingComponents.page-vue-render.js b/devGuide/development/writingComponents.page-vue-render.js index e223d056..25dd0add 100644 --- a/devGuide/development/writingComponents.page-vue-render.js +++ b/devGuide/development/writingComponents.page-vue-render.js @@ -104,6 +104,6 @@ with(this){return _c('h4',{attrs:{"id":"attributes-and-slots"}},[_v("Attributes with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/development/workflow.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Workflow")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/development/writingPlugins.html"}},[_c('span',[_c('span',[_v("Writing Plugins")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/development/writingPlugins.html b/devGuide/development/writingPlugins.html index 79afc726..074d1b52 100644 --- a/devGuide/development/writingPlugins.html +++ b/devGuide/development/writingPlugins.html @@ -3,7 +3,7 @@ - + MarkBind - Writing Plugins @@ -174,7 +174,7 @@

    Tag Properties

    Tag properties are top-level properties of the tag configuration object. The following table lists what these properties are used for:

    Property Values Default Remarks
    isSpecial true or false false Allows configuring whether any tag is to be parsed "specially" like a <script> or <style> tag. This allows configuring custom tags that may contain conflicting syntax, such as the <puml> tag used for UML diagram generation.
    attributes Array of attribute configurations [] Contains the attribute configurations of the tags.

    Attribute Properties

    The following table lists what the possible properties for configuring the attributes of a tag, and what they are used for:

    Property Values Default Remarks
    name attribute name none The string name of the attribute.
    isRelative true or false false Should be true if this attribute may contain a relative link. This tells MarkBind to properly resolve such relative links when used in <include>s, by converting the link into a baseUrl preceded absolute link.
    isSourceFile true or false false Should be true if the attribute points to a source file. This allows flagging other source files to trigger page regeneration during live reload.

    Lifecycle hooks

    You may also need to maintain some plugin state during site generation, then reset this when the site or pages are regenerated.

    To do this, you may implement the beforeSiteGenerate method.

    Writing Components

    Migrating to TypeScript


    +

    Writing Components

    Migrating to TypeScript


    diff --git a/devGuide/development/writingPlugins.page-vue-render.js b/devGuide/development/writingPlugins.page-vue-render.js index 8d23e3b1..3543a5a7 100644 --- a/devGuide/development/writingPlugins.page-vue-render.js +++ b/devGuide/development/writingPlugins.page-vue-render.js @@ -95,6 +95,6 @@ with(this){return _c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inl with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/development/writingComponents.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Writing Components")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/development/migratingToTypeScript.html"}},[_c('span',[_c('span',[_v("Migrating to TypeScript")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/githubActions/markbindAction.html b/devGuide/githubActions/markbindAction.html index a172ffa6..111e11d6 100644 --- a/devGuide/githubActions/markbindAction.html +++ b/devGuide/githubActions/markbindAction.html @@ -3,7 +3,7 @@ - + MarkBind - GitHub Actions: markbind-action @@ -30,7 +30,7 @@
    1. Create a repository.
    2. Set up MarkBind and run markbind init to populate with default content.
    3. Push your repository to GitHub.

    Modifying the action

    1. Create a new branch from master to work on your changes.
    2. Make necessary modifications to the workflow files.
    3. Update the repository's README.md to reflect the changes.

    Testing the action

    1. Include a workflow file in your to test your modified version of the action.
    2. Trigger the action as needed, check and validate the results in the action logs.

    You can now submit PRs to improve MarkBind's GitHub actions! ๐ŸŽ‰

    Release Management

    Based on the GitHub Actions documentation, we are using tags for release management.

    GitHub Actions: Overview

    GitHub Actions: markbind-reusable-workflows


    +
  • Trigger the action as needed, check and validate the results in the action logs.
  • You can now submit PRs to improve MarkBind's GitHub actions! ๐ŸŽ‰

    Release Management

    Based on the GitHub Actions documentation, we are using tags for release management.

    GitHub Actions: Overview

    GitHub Actions: markbind-reusable-workflows


    diff --git a/devGuide/githubActions/markbindAction.page-vue-render.js b/devGuide/githubActions/markbindAction.page-vue-render.js index eb3a00c8..ab134af5 100644 --- a/devGuide/githubActions/markbindAction.page-vue-render.js +++ b/devGuide/githubActions/markbindAction.page-vue-render.js @@ -47,6 +47,6 @@ with(this){return _c('blockquote',[_c('ul',[_c('li',[_v("Create and validate a r with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/githubActions/overview.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("GitHub Actions: Overview")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/githubActions/markbindReusableWorkflows.html"}},[_c('span',[_c('span',[_v("GitHub Actions: markbind-reusable-workflows")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/githubActions/markbindReusableWorkflows.html b/devGuide/githubActions/markbindReusableWorkflows.html index a701791c..076eda42 100644 --- a/devGuide/githubActions/markbindReusableWorkflows.html +++ b/devGuide/githubActions/markbindReusableWorkflows.html @@ -3,7 +3,7 @@ - + MarkBind - GitHub Actions: markbind-reusable-workflows @@ -26,7 +26,7 @@

    GitHub Actions: markbind-reusable-workflows

    GitHub Actions: markbind-reusable-workflows

    A list of reusable workflows that help to improve the CI/CD pipelines of MarkBind sites. It helps users to streamline their workflow by:

    The source code is hosted alongside MarkBind/markbind-action.

    Development guide

    Refer to the development guide of markbind-action for the general approach. Take note of the following differences:

    GitHub Actions: markbind-action

    GitHub Actions: Workflow Security


    +

    GitHub Actions: markbind-reusable-workflows

    GitHub Actions: markbind-reusable-workflows

    A list of reusable workflows that help to improve the CI/CD pipelines of MarkBind sites. It helps users to streamline their workflow by:

    The source code is hosted alongside MarkBind/markbind-action.

    Development guide

    Refer to the development guide of markbind-action for the general approach. Take note of the following differences:

    GitHub Actions: markbind-action

    GitHub Actions: Workflow Security


    diff --git a/devGuide/githubActions/markbindReusableWorkflows.page-vue-render.js b/devGuide/githubActions/markbindReusableWorkflows.page-vue-render.js index a8c95bf6..2c902856 100644 --- a/devGuide/githubActions/markbindReusableWorkflows.page-vue-render.js +++ b/devGuide/githubActions/markbindReusableWorkflows.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('ul',[_c('li',[_v("Understand the strength and limitations with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/githubActions/markbindAction.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("GitHub Actions: markbind-action")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/githubActions/workflowSecurity.html"}},[_c('span',[_c('span',[_v("GitHub Actions: Workflow Security")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/githubActions/overview.html b/devGuide/githubActions/overview.html index 12506d26..25c57e42 100644 --- a/devGuide/githubActions/overview.html +++ b/devGuide/githubActions/overview.html @@ -3,7 +3,7 @@ - + MarkBind - GitHub Actions: Overview @@ -26,7 +26,7 @@

    GitHub Actions: Overview

    GitHub Actions: Overview

    A GitHub Action can perform a variety of tasks, including automating the build and deployment of a MarkBind site.

    Before any development, ensure you have a basic knowledge of GitHub Actions

    Server Side Rendering

    GitHub Actions: markbind-action


    +

    GitHub Actions: Overview

    GitHub Actions: Overview

    A GitHub Action can perform a variety of tasks, including automating the build and deployment of a MarkBind site.

    Before any development, ensure you have a basic knowledge of GitHub Actions

    Server Side Rendering

    GitHub Actions: markbind-action


    diff --git a/devGuide/githubActions/overview.page-vue-render.js b/devGuide/githubActions/overview.page-vue-render.js index c8451b10..ab24dd85 100644 --- a/devGuide/githubActions/overview.page-vue-render.js +++ b/devGuide/githubActions/overview.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('ul',[_c('li',[_c('a',{attrs:{"href":"https://docs.github.c with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/design/serverSideRendering.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Server Side Rendering")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/githubActions/markbindAction.html"}},[_c('span',[_c('span',[_v("GitHub Actions: markbind-action")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/githubActions/workflowSecurity.html b/devGuide/githubActions/workflowSecurity.html index 8679275e..3ac0b19d 100644 --- a/devGuide/githubActions/workflowSecurity.html +++ b/devGuide/githubActions/workflowSecurity.html @@ -3,7 +3,7 @@ - + MarkBind - GitHub Actions: Workflow Security @@ -108,7 +108,7 @@ -

    GitHub Actions: markbind-reusable-workflows

    Project management


    +

    GitHub Actions: markbind-reusable-workflows

    Project management


    diff --git a/devGuide/githubActions/workflowSecurity.page-vue-render.js b/devGuide/githubActions/workflowSecurity.page-vue-render.js index e720cab2..27150fe6 100644 --- a/devGuide/githubActions/workflowSecurity.page-vue-render.js +++ b/devGuide/githubActions/workflowSecurity.page-vue-render.js @@ -62,6 +62,6 @@ with(this){return _c('code',{pre:true,attrs:{"class":"hljs yaml"}},[_c('span',[_ with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/githubActions/markbindReusableWorkflows.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("GitHub Actions: markbind-reusable-workflows")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/projectManagement.html"}},[_c('span',[_c('span',[_v("Project management")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/index.html b/devGuide/index.html index e116d425..ae818a71 100644 --- a/devGuide/index.html +++ b/devGuide/index.html @@ -3,7 +3,7 @@ - + MarkBind @@ -14,7 +14,7 @@
    +
    diff --git a/devGuide/index.page-vue-render.js b/devGuide/index.page-vue-render.js index 0323e74c..ccf02ee4 100644 --- a/devGuide/index.page-vue-render.js +++ b/devGuide/index.page-vue-render.js @@ -5,6 +5,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" }; var pageVueStaticRenderFns = [function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/projectManagement.html b/devGuide/projectManagement.html index 7026d663..4e4af056 100644 --- a/devGuide/projectManagement.html +++ b/devGuide/projectManagement.html @@ -3,7 +3,7 @@ - + MarkBind - Project management @@ -262,7 +262,7 @@
  • Multiple contribution types can be included at once or updated later on.
  • Contribution types can be updated later on.
  • Managing the repository

    Projects

    As the number of issues increases, prioritising and triaging work may become more tricky even with labels. We may want to prioritise certain issues for particular version releases, or to work towards an overall vision of MarkBind. For this purpose, it may be useful to use GitHub Projects.

    Instructions:

    1. Read through the issues in the repository to understand what's in the backlog.
    2. Decide what goals the team is working towards. Examples: "Better Logging", "Necessary Updates", "User Demand", "Bugfix", and "Developer Experience".
    3. Create the GitHub project (keeping in mind how long it should take) and update the project details.
    4. Add relevant issues to the project and use it to track progress.

    Some tips / principles from current use:

    Other Notes

    About Milestones

    Previously, we used milestones to help manage versions, adding a milestone to an issue once related PRs had been merged. However, there was confusion over the use of milestones and labels and adding a milestone was often forgotten. Hence, ultimately it was not sufficiently useful to the team.

    GitHub Actions: Workflow Security

    Appendix: Style guides


    +

    Other Notes

    About Milestones

    Previously, we used milestones to help manage versions, adding a milestone to an issue once related PRs had been merged. However, there was confusion over the use of milestones and labels and adding a milestone was often forgotten. Hence, ultimately it was not sufficiently useful to the team.

    GitHub Actions: Workflow Security

    Appendix: Style guides


    diff --git a/devGuide/projectManagement.page-vue-render.js b/devGuide/projectManagement.page-vue-render.js index 4ce8b040..24338212 100644 --- a/devGuide/projectManagement.page-vue-render.js +++ b/devGuide/projectManagement.page-vue-render.js @@ -179,6 +179,6 @@ with(this){return _c('h2',{attrs:{"id":"other-notes"}},[_v("Other Notes"),_c('a' with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/githubActions/workflowSecurity.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("GitHub Actions: Workflow Security")])])])])]),_v(" "),_c('p',[_c('span',{staticClass:"float-end"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/styleGuides.html"}},[_c('span',[_c('span',[_v("Appendix: Style guides")]),_v(" "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/devGuide/styleGuides.html b/devGuide/styleGuides.html index 8b15ebaa..ab36b590 100644 --- a/devGuide/styleGuides.html +++ b/devGuide/styleGuides.html @@ -3,7 +3,7 @@ - + MarkBind - Appendix: Style guides @@ -26,7 +26,7 @@

    Appendix: Style guides

    Appendix: Style guides

    Our coding standards are mostly based on those at se-education.org/guides.

    Project management


    +

    Appendix: Style guides

    Appendix: Style guides

    Our coding standards are mostly based on those at se-education.org/guides.

    Project management


    diff --git a/devGuide/styleGuides.page-vue-render.js b/devGuide/styleGuides.page-vue-render.js index cde5b78f..037568a8 100644 --- a/devGuide/styleGuides.page-vue-render.js +++ b/devGuide/styleGuides.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('ul',[_c('li',[_c('a',{attrs:{"href":"https://se-education. with(this){return _c('div',{staticClass:"clearfix"},[_c('p',[_c('span',{staticClass:"float-start"},[_c('a',{staticClass:"btn btn-light",attrs:{"href":"/devdocs/devGuide/projectManagement.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('span',[_v("Project management")])])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/index.html b/index.html index d4a12739..1f30f41e 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ - + MarkBind - Generate More Dynamic Websites from Markdown Text @@ -16,7 +16,7 @@ Search

    Developer Guide

    If you are a user, please visit MarkBind.org instead. -

    This is the latest Developer Guide for MarkBind.

    For contributors: please access the Developer Guide here

    +

    This is the latest Developer Guide for MarkBind.

    For contributors: please access the Developer Guide here

    diff --git a/index.page-vue-render.js b/index.page-vue-render.js index 6d47c22a..fd878de2 100644 --- a/index.page-vue-render.js +++ b/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('h2',{attrs:{"id":"developer-guide"}},[_v("Developer Guide" with(this){return _c('p',[_v("For contributors: please access the Developer Guide "),_c('a',{attrs:{"href":"/devdocs/devGuide/index.html"}},[_v("here")])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file diff --git a/showcase.html b/showcase.html index bfa42bde..b4161f4d 100644 --- a/showcase.html +++ b/showcase.html @@ -3,7 +3,7 @@ - + MarkBind - Showcase @@ -14,7 +14,7 @@
    +

    Examples of MarkBind Websites

    Course Websites

    Online Books

    Product/Project Websites

    diff --git a/showcase.page-vue-render.js b/showcase.page-vue-render.js index 730b25a4..116f1870 100644 --- a/showcase.page-vue-render.js +++ b/showcase.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h1',{attrs:{"id":"examples-of-markbind-websites"}},[_v("Examples of MarkBind Websites"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#examples-of-markbind-websites","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h2',{attrs:{"id":"course-websites"}},[_v("Course Websites"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#course-websites","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.comp.nus.edu.sg/~cs2103"}},[_c('strong',[_v("CS2103/T Software Engineering")])])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.comp.nus.edu.sg/~cs2113"}},[_c('strong',[_v("CS2113/T Software Engineering and OOP")])])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://nus-cs3281.github.io/website/"}},[_c('strong',[_v("CS3281&2 Thematic Systems Project")])])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://nus-tic2002-2019.github.io/website/"}},[_c('strong',[_v("TIC2002 Introduction to Software Engineering")])])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://nus-te3201.github.io/2020/"}},[_c('strong',[_v("TE3201 Software Engineering")])])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://nus-cs3203.github.io/course-website/"}},[_c('strong',[_v("CS3203 Software Engineering Project")])])])]),_v(" "),_c('h2',{attrs:{"id":"online-books"}},[_v("Online Books"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#online-books","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://se-education.org/se-book/"}},[_c('strong',[_v("Software Engineering for Self-Directed Learners")])])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://se-education.org/learningresources/"}},[_c('strong',[_v("A Student's Guide to Software Engineering Tools & Techniques")])])])]),_v(" "),_c('h2',{attrs:{"id":"product-project-websites"}},[_v("Product/Project Websites"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#product-project-websites","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("This website "),_c('span',{staticClass:"dimmed"},[_v("(i.e., MarkBind website)")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://reposense.org"}},[_c('strong',[_v("reposense.org")])])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://se-education.org"}},[_c('strong',[_v("se-education.org")])])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://damithc.github.io/ab3-markbind/index.html"}},[_c('strong',[_v("AddressBook Level-3")])])])])])} },function anonymous( ) { -with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(" on Sun, 11 Aug 2024, 3:57:37 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} +with(this){return _c('div',[_c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("[Generated by "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(" on Sat, 7 Sept 2024, 6:43:25 UTC]")]),_c('br'),_v(" "),_c('small',[_v("This site is powered by "),_c('a',{attrs:{"href":"https://www.netlify.com/"}},[_v("Netlify")]),_v(".")])])])])} }]; \ No newline at end of file