From 0c88e4ac3af7e4f089d9757ab5585a0c918c0c5b Mon Sep 17 00:00:00 2001 From: <> Date: Sun, 12 Nov 2023 13:14:19 +0000 Subject: [PATCH] Deployed 60d02ad with MkDocs version: 1.5.3 --- .nojekyll | 0 404.html | 408 + algorithms/index.html | 527 ++ assets/favicon.ico | Bin 0 -> 6354 bytes assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.c2be25ad.min.js | 29 + assets/javascripts/bundle.c2be25ad.min.js.map | 8 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.208ed371.min.js | 42 + .../workers/search.208ed371.min.js.map | 8 + assets/stylesheets/main.85bb2934.min.css | 1 + assets/stylesheets/main.85bb2934.min.css.map | 1 + assets/stylesheets/palette.a6bdf11c.min.css | 1 + .../stylesheets/palette.a6bdf11c.min.css.map | 1 + changelog/index.html | 1785 +++++ contributing/index.html | 845 +++ en/algorithms/index.html | 527 ++ en/assets/favicon.ico | Bin 0 -> 6354 bytes en/changelog/index.html | 1785 +++++ en/contributing/index.html | 845 +++ en/flashcards/index.html | 941 +++ en/index.html | 683 ++ en/license/index.html | 446 ++ en/notes/index.html | 670 ++ flashcards/index.html | 941 +++ index.html | 683 ++ license/index.html | 446 ++ notes/index.html | 670 ++ search/search_index.json | 1 + sitemap.xml | 52 + sitemap.xml.gz | Bin 0 -> 361 bytes 62 files changed, 19545 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 algorithms/index.html create mode 100644 assets/favicon.ico create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.c2be25ad.min.js create mode 100644 assets/javascripts/bundle.c2be25ad.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.208ed371.min.js create mode 100644 assets/javascripts/workers/search.208ed371.min.js.map create mode 100644 assets/stylesheets/main.85bb2934.min.css create mode 100644 assets/stylesheets/main.85bb2934.min.css.map create mode 100644 assets/stylesheets/palette.a6bdf11c.min.css create mode 100644 assets/stylesheets/palette.a6bdf11c.min.css.map create mode 100644 changelog/index.html create mode 100644 contributing/index.html create mode 100644 en/algorithms/index.html create mode 100644 en/assets/favicon.ico create mode 100644 en/changelog/index.html create mode 100644 en/contributing/index.html create mode 100644 en/flashcards/index.html create mode 100644 en/index.html create mode 100644 en/license/index.html create mode 100644 en/notes/index.html create mode 100644 flashcards/index.html create mode 100644 index.html create mode 100644 license/index.html create mode 100644 notes/index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..06b40ea9 --- /dev/null +++ b/404.html @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + + + + + + + + Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/algorithms/index.html b/algorithms/index.html new file mode 100644 index 00000000..517df6b0 --- /dev/null +++ b/algorithms/index.html @@ -0,0 +1,527 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Algorithms - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Algorithms

+

SM-2

+
+

Warning

+

Note that this hasn't been updated in a while, +please see the code.

+
+

(It's the same as that used for flashcards - apart from the PageRanks)

+
    +
  • The algorithm is a variant of Anki's algorithm which is based on the SM-2 algorithm.
  • +
  • It supports ternary reviews i.e. a concept is either hard, good, or easy at the time of review.
  • +
  • initial ease is weighted (using max_link_factor) depending on the average ease of linked notes, note importance, and the base ease.
      +
    • if link_count > 0: initial_ease = (1 - link_contribution) * base_ease + link_contribution * average_ease
        +
      • link_contribution = max_link_factor * min(1.0, log(link_count + 0.5) / log(64)) (cater for uncertainty)
      • +
      +
    • +
    • The importance of the different concepts/notes is determined using the PageRank algorithm (not all notes are created equal xD)
        +
      • On most occasions, the most fundamental concepts/notes have higher importance
      • +
      +
    • +
    +
  • +
  • If the user reviews a concept/note as:
      +
    • easy, the ease increases by 20 and the interval changes to old_interval * new_ease / 100 * 1.3 (the 1.3 is the easy bonus)
    • +
    • good, the ease remains unchanged and the interval changes to old_interval * old_ease / 100
    • +
    • hard, the ease decreases by 20 and the interval changes to old_interval * 0.5
        +
      • The 0.5 can be modified in settings
      • +
      • minimum ease = 130
      • +
      +
    • +
    • For 8 or more days:
        +
      • interval += random_choice({-fuzz, 0, +fuzz})
          +
        • where fuzz = ceil(0.05 * interval)
        • +
        • Anki docs: + > "[...] Anki also applies a small amount of random “fuzz” to prevent cards that were introduced at the same time and given the same ratings from sticking together and always coming up for review on the same day."
        • +
        +
      • +
      +
    • +
    +
  • +
  • The scheduling information is stored in the YAML front matter
  • +
+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1493154e7edc46173d46d3c410da5c989edd75e4 GIT binary patch literal 6354 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 literal 0 HcmV?d00001 diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf13b9f9d978896599290a74f77d5dbe7d1655c GIT binary patch literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US5Cx_Ju;!O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ+HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+FkTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/javascripts/bundle.c2be25ad.min.js b/assets/javascripts/bundle.c2be25ad.min.js new file mode 100644 index 00000000..f32333ee --- /dev/null +++ b/assets/javascripts/bundle.c2be25ad.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Ci=Object.create;var gr=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var ki=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Hi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,nn=Object.prototype.propertyIsEnumerable;var rn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&rn(e,r,t[r]);if(Ht)for(var r of Ht(t))nn.call(t,r)&&rn(e,r,t[r]);return e};var on=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ht)for(var n of Ht(e))t.indexOf(n)<0&&nn.call(e,n)&&(r[n]=e[n]);return r};var Pt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ki(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=Ri(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ci(Hi(e)):{},Pi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var sn=Pt((xr,an)=>{(function(e,t){typeof xr=="object"&&typeof an!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function f(O){var Qe=O.type,De=O.tagName;return!!(De==="INPUT"&&s[Qe]&&!O.readOnly||De==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function c(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function u(O){O.hasAttribute("data-focus-visible-added")&&(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(a(r.activeElement)&&c(r.activeElement),n=!0)}function m(O){n=!1}function d(O){a(O.target)&&(n||f(O.target))&&c(O.target)}function h(O){a(O.target)&&(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(O.target))}function v(O){document.visibilityState==="hidden"&&(o&&(n=!0),Y())}function Y(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function B(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,B())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),Y(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var cn=Pt(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},s=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(B,N){d.append(N,B)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(O){throw new Error("URL unable to set base "+c+" due to "+O)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,Y=!0,B=this;["append","delete","set"].forEach(function(O){var Qe=h[O];h[O]=function(){Qe.apply(h,arguments),v&&(Y=!1,B.search=h.toString(),Y=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,Y&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(f){Object.defineProperty(s,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){a(f)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var qr=Pt((Mt,Nr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Mt=="object"&&typeof Nr=="object"?Nr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ai}});var s=i(279),a=i.n(s),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var E=p()(T);return m("cut"),E},h=d;function v(j){var T=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[T?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var Y=function(T,E){var H=v(T);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},B=function(T){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof T=="string"?H=Y(T,E):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?H=Y(T.value,E):(H=p()(T),m("copy")),H},N=B;function O(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(E){return typeof E}:O=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},O(j)}var Qe=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.action,H=E===void 0?"copy":E,I=T.container,q=T.target,Me=T.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&O(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function Ei(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function tn(j,T){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=c()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",kt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),E}(a()),Ai=Li},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,f){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(f))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return c(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return a(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),s=f.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var f=this;function c(){f.off(i,c),s.apply(a,arguments)}return c._=s,this.on(i,c,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=a.length;for(f;f{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var rs=/["'&<>]/;Yo.exports=ns;function ns(e){var t=""+e,r=rs.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||a(m,d)})})}function a(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof et?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function pn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Ee=="function"?Ee(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(s){return new Promise(function(a,f){s=e[i](s),o(a,f,s.done,s.value)})}}function o(i,s,a,f){Promise.resolve(f).then(function(c){i({value:c,done:a})},s)}}function C(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var It=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(C(u))try{u()}catch(v){i=v instanceof It?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{ln(h)}catch(v){i=i!=null?i:[],v instanceof It?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ln(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function jt(e){return e instanceof Ie||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function ln(e){C(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new xn(r,n)},t}(F);var xn=function(e){ie(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,f=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Wt);var Sn=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Dt);var Oe=new Sn(wn);var _=new F(function(e){return e.complete()});function Vt(e){return e&&C(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return C(Cr(e))?e.pop():void 0}function Te(e){return Vt(Cr(e))?e.pop():void 0}function zt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Nt(e){return C(e==null?void 0:e.then)}function qt(e){return C(e[ft])}function Kt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Yt=zi();function Gt(e){return C(e==null?void 0:e[Yt])}function Bt(e){return un(this,arguments,function(){var r,n,o,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Jt(e){return C(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(qt(e))return Ni(e);if(pt(e))return qi(e);if(Nt(e))return Ki(e);if(Kt(e))return On(e);if(Gt(e))return Qi(e);if(Jt(e))return Yi(e)}throw Qt(e)}function Ni(e){return new F(function(t){var r=e[ft]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function qi(e){return new F(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?A(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Dn(function(){return new Zt}))}}function Vn(){for(var e=[],t=0;t=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,f=a===void 0?!0:a;return function(c){var u,p,m,d=0,h=!1,v=!1,Y=function(){p==null||p.unsubscribe(),p=void 0},B=function(){Y(),u=m=void 0,h=v=!1},N=function(){var O=u;B(),O==null||O.unsubscribe()};return y(function(O,Qe){d++,!v&&!h&&Y();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,f))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,Y(),p=$r(B,o,$e),De.error($e)},complete:function(){h=!0,Y(),p=$r(B,s),De.complete()}}),U(O).subscribe(u))})(c)}}function $r(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),V(e===_e()),J())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Kn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>Xe(e)),V(Xe(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>rr(e)),V(rr(e)))}var Yn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Wr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),va?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Wr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ba.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Gn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Jn=typeof WeakMap!="undefined"?new WeakMap:new Yn,Xn=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=ga.getInstance(),n=new La(t,r,this);Jn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Xn.prototype[e]=function(){var t;return(t=Jn.get(this))[e].apply(t,arguments)}});var Aa=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:Xn}(),Zn=Aa;var eo=new x,Ca=$(()=>k(new Zn(e=>{for(let t of e)eo.next(t)}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ca.pipe(S(t=>t.observe(e)),g(t=>eo.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var to=new x,Ra=$(()=>k(new IntersectionObserver(e=>{for(let t of e)to.next(t)},{threshold:0}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function sr(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function ro(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),J())}var cr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function no(e){return cr[e].checked}function Ke(e,t){cr[e].checked!==t&&cr[e].click()}function Ue(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function ka(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ha(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function oo(){let e=b(window,"keydown").pipe(A(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:no("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),A(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!ka(n,r)}return!0}),pe());return Ha().pipe(g(t=>t?_:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function io(){return new x}function ao(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)ao(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)ao(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function so(){return location.hash.substring(1)}function Dr(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Pa(e){return L(b(window,"hashchange"),e).pipe(l(so),V(so()),A(t=>t.length>0),X(1))}function co(e){return Pa(e).pipe(l(t=>ce(`[id="${t}"]`)),A(t=>typeof t!="undefined"))}function Vr(e){let t=matchMedia(e);return er(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function fo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function zr(e,t){return e.pipe(g(r=>r?t():_))}function ur(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>_),g(r=>r.status!==200?Ot(()=>new Error(r.statusText)):k(r)))}function We(e,t){return ur(e,t).pipe(g(r=>r.json()),X(1))}function uo(e,t){let r=new DOMParser;return ur(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),X(1))}function pr(e){let t=M("script",{src:e});return $(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(g(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function po(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function lo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(po),V(po()))}function mo(){return{width:innerWidth,height:innerHeight}}function ho(){return b(window,"resize",{passive:!0}).pipe(l(mo),V(mo()))}function bo(){return G([lo(),ho()]).pipe(l(([e,t])=>({offset:e,size:t})),X(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(ee("size")),o=G([n,r]).pipe(l(()=>Xe(e)));return G([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:f,y:c}])=>({offset:{x:s.x-f,y:s.y-c+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,f,c)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:f,error:c});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(` + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Changelog

+ +

Changelog

+

All notable changes to this project will be documented in this file. Dates are displayed in UTC.

+

Generated by auto-changelog.

+

1.10.5

+
    +
  • Bug edit flashcard sometimes corrupts question text in file #784
  • +
  • Bug note review invalid metadata 764 #782
  • +
+

1.10.4

+
+

30 October 2023

+
+
    +
  • Bump version to v1.10.4 #780
  • +
  • Bug fix: questions now removed from postponement list; etc #775
  • +
  • fix: multi-line tag ('$$') converted to single-line ('$') after card reviewed b9c354d
  • +
+

1.10.3

+
+

23 October 2023

+
+
    +
  • Bump version to v1.10.3 #772
  • +
  • doc: update note about the reversed card #699
  • +
  • Fix bugs regarding bury sibling cards #763
  • +
+

1.10.2

+
+

9 October 2023

+
+
    +
  • Bump version to 1.10.2 #756
  • +
  • refactor: Separate business logic from user interface code #751
  • +
  • Remove the spaces before and after the question marks in the multi-line basic flashcards #719
  • +
  • chore: Update dependencies 44e9bb6
  • +
  • chore: Update dependencies 1f69f96
  • +
  • feat: Add E2E testing 1ef0663
  • +
+

1.10.1

+
+

5 May 2023

+
+
    +
  • Bump version to v1.10.1 #679
  • +
  • style: Fix formatting #678
  • +
  • remove skip after modifying card text #671
  • +
  • Add translations to the Spanish language. #667
  • +
  • Update translations zh-cn.ts and zh-tw.ts #676
  • +
  • Close very old issues (>= 1 year) #665
  • +
  • Update changelog #664
  • +
  • show MAX_INTERVAL unit in title #643
  • +
  • Fix issue requiring collapseIcon to be clicked twice to expand/collapsed deck tree #656
  • +
  • Update ru.ts #657
  • +
  • Consume keyboard event in flashcard modal #637
  • +
+

1.10.0

+
+

6 February 2023

+
+
    +
  • Remove custom dir mkdocs setting #622
  • +
  • Bump version to v1.10.0 #621
  • +
  • Add a skip button to the flashcards menu #620
  • +
  • Get rid of Giscus comments #619
  • +
  • Fix ar.ts formatting #618
  • +
  • update ar.ts for Arabic translation #616
  • +
  • Fixed some terms. #611
  • +
  • Fix card info #593
  • +
  • Add note title to card context #592
  • +
  • Update Changelog #591
  • +
  • Add per-deck cramming command #515
  • +
  • Add flashcards menu #589
  • +
  • Add flashcard editing modal #587
  • +
  • Update esbuild dep e33ec93
  • +
  • Update plugin version 2bf13a9
  • +
  • Add skip card logic fef51b6
  • +
+

1.9.4

+
+

8 January 2023

+
+
    +
  • Bump version to v1.9.4 #588
  • +
  • Minor UI fixes on flashcards #586
  • +
+

1.9.3

+
+

2 January 2023

+
+
    +
  • Bump version to v1.9.3 #576
  • +
  • Minor UI and docs fixes #575
  • +
+

1.9.2

+
+

2 January 2023

+
+
    +
  • Fix changelog path #574
  • +
  • Bump version to v1.9.2 #573
  • +
  • Update contribution docs #572
  • +
  • Add root CONTRIBUTING.md #566
  • +
  • Fix release gh-action 2 #565
  • +
  • Fix release gh-action #564
  • +
  • Update docs #563
  • +
  • Add upload docs GitHub action #562
  • +
  • Move wiki to GitHub pages #561
  • +
  • Update flashcards image formats #560
  • +
  • Make flashcard text selectable #559
  • +
  • Prevent regex from matching to last --- in file #532
  • +
+

1.9.1

+
+

12 December 2022

+
+
    +
  • Fix README formatting and bump version #546
  • +
  • Fix extra note review panes being added #545
  • +
  • Add list of translations into README #544
  • +
+

1.9.0

+
+

12 December 2022

+
+
    +
  • Fix back button #543
  • +
  • Revert to npm over yarn #542
  • +
  • Fix zh-TW formatting #541
  • +
  • Update dependencies #539
  • +
  • Add REVIEW_PANE_ON_STARTUP #540
  • +
  • Traditional Chinese strings. (zh-TW) #536
  • +
  • Update zh-cn.ts #535
  • +
  • Make the note review pane optional #531
  • +
  • Add Brazilian Portuguese Translation 🇧🇷 #518
  • +
  • Replace crlf to lf on card parse #523
  • +
  • style: set the flashcard's font size as user editor, with var(--font-text-size) #480
  • +
  • Added new setting to collapse/expand subdecks #510
  • +
  • Add curly brackets as option for cloze fields d8c0e9e
  • +
  • [feat] add modal history feature c6bb8f0
  • +
+

1.8.0

+
+

24 July 2022

+
+
    +
  • Regenerate yarn.lock file #474
  • +
  • Fix breakage with Obsidian v15.4 and add customizable review buttons #469
  • +
  • Bump minimist from 1.2.5 to 1.2.6 #473
  • +
  • Bump moment from 2.29.1 to 2.29.4 #472
  • +
  • Fixed mistakes in ru.ts #464
  • +
  • Add "ogg" as supported audio file format #425
  • +
  • Update jest config #419
  • +
  • fix: handle code fences better #402
  • +
  • Add and run prettier #413
  • +
  • Translate Korean #417
  • +
  • Update zh-cn.ts #416
  • +
  • Fix breakage with Obsidian v15.4 and add customizable review buttons (#469) #273
  • +
  • add lockfile c386dc3
  • +
  • Add localization check bce5c22
  • +
  • Upgrade dependencies 9d34c56
  • +
+

1.7.2

+
+

21 February 2022

+
+
    +
  • Ive done the translation to Russian. [#403`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/403)
  • +
  • Add czech translations #391
  • +
  • Update zh-cn.ts #364
  • +
  • Промежуточное сохранение 1f0f46c
  • +
  • Intermediate result saving) e35c012
  • +
  • Intermediate result saving))) 8ac56ae
  • +
+

1.7.1

+
+

2 January 2022

+
+
    +
  • Fix textInterval - more accurate calculations 3b0446a
  • +
  • Remove dependabot 2236396
  • +
  • Fix tag override 07e1de4
  • +
+

1.7.0

+
+

1 January 2022

+
+
    +
  • Stats & transclusion improvements #358
  • +
  • Bump typescript from 4.4.4 to 4.5.4 #355
  • +
  • Bump obsidian from 0.12.17 to 0.13.11 #356
  • +
  • Bump @types/node from 16.11.17 to 17.0.5 #357
  • +
  • Fix first time random card selection #353
  • +
  • [Bug fix] for HTML Comment parsing #350
  • +
  • Scheduling fixes & tests #352
  • +
  • Remove dependence on Obsidian Charts plugin #351
  • +
  • Scheduling unit tests #316
  • +
  • Changing interpolate to an optional arg of t #315
  • +
  • Bump @typescript-eslint/parser from 4.33.0 to 5.8.0 #345
  • +
  • Bump @types/node from 16.11.14 to 17.0.1 #344
  • +
  • Bump esbuild from 0.13.15 to 0.14.5 #341
  • +
  • Bump @typescript-eslint/eslint-plugin from 4.33.0 to 5.7.0 #340
  • +
  • Correct notes(s) to note(s) in en.ts lang file #323
  • +
  • ja: added Japanese translation #318
  • +
  • Bump eslint from 7.32.0 to 8.3.0 #326
  • +
  • Overwrite deck on card #299
  • +
  • Open file was changed to "Edit Later" #300
  • +
  • Bump esbuild from 0.12.29 to 0.13.2 #302
  • +
  • Updated to display mp3 and webm audio on flashcards #297
  • +
  • Added translations DE #298
  • +
  • Cram Flashcards #291
  • +
  • Fix collapsed/expanded states when redrawing the sidebar #290
  • +
  • Using tags from User Preferences and not their full name that includes the sibling #292
  • +
  • Change Eases x-axis from DAYS to EASES #285
  • +
  • Fix dependencies & esbuild workflow 66766a8
  • +
  • Change some innerHTML text to JSX 3623efc
  • +
  • transclusions initial implementation 0e12388
  • +
+

1.6.2

+
+

29 August 2021

+
+
    +
  • Returned cursor position on "open file" or "Edit later" #281
  • +
  • Change "Open file" to "Edit later" #280
  • +
  • Add bolded to cloze cards conversion #277
  • +
  • Develop #276
  • +
  • Update (see PR notes) #271
  • +
  • New Icon for app #275
  • +
  • Move to ESBUILD from rollup #268
  • +
  • Added for those working with VSCODE #265
  • +
  • Roll back caching & more stats #264
  • +
  • Fixes #263
  • +
  • Switch to esbuild 177bc78
  • +
  • Delete main.js 76b94d1
  • +
  • Refactor 26d9dbd
  • +
+

1.6.1

+
+

19 August 2021

+
+
    +
  • Multiple review queues fixes #258
  • +
  • Add multiple note review queues & curly braces consistency in blocks #252
  • +
  • Fixes #251
  • +
  • Bump @types/jest from 26.0.24 to 27.0.1 #245
  • +
  • Refactor & change code's line max length #236
  • +
  • Merge WIP for multiple review queues #234
  • +
  • Add option to ignore folders in note review #232
  • +
  • Prettier 1d4bcdc
  • +
  • block curly brace consistency d9181f5
  • +
  • First pass at implementing "review decks". 069619c
  • +
+

1.6.0

+
+

8 August 2021

+
+
    +
  • Parser tests #230
  • +
  • Single & multiline cards #229
  • +
  • Fix logger & legacy scheduling #228
  • +
  • Generalize flashcards processing & logging #227
  • +
  • Caching & settings debounce fix #226
  • +
  • Bump @rollup/plugin-commonjs from 19.0.2 to 20.0.0 #225
  • +
  • Add single & multiline reversed cards c3e6c0d
  • +
  • Fix settings - debounce 17d7496
  • +
  • Add caching 3808ce0
  • +
+

1.5.8

+
+

4 August 2021

+
+
    +
  • Add multilingual support #223
  • +
  • Fix bugs with cloze cards & newlines #222
  • +
  • Refactor #220
  • +
  • Fixes #219
  • +
  • Fix statistics view - accumulate overdue cards, linearity #217
  • +
  • Go to flashcard position after clicking open file #215
  • +
  • Code refactor #214
  • +
  • Allow flashcard height and width to be customizable #210
  • +
  • Bump @types/node from 15.14.1 to 16.3.0 #188
  • +
  • Refactor code 05d3217
  • +
  • Create CODE_OF_CONDUCT.md 9798c69
  • +
  • rename related to siblings 82651b4
  • +
+

1.5.7

+
+

20 June 2021

+
+
    +
  • Randomize card order option #170
  • +
  • resize image, large screen mode #169
  • +
  • per deck totals #168
  • +
  • fix bug when parsing nonexistent images #166
  • +
  • Parse card only once #165
  • +
  • bump version to 1.5.7 856d423
  • +
  • randomize card order option 3f2d97e
  • +
  • fix bug when parsing nonexistent files c906afe
  • +
+

1.5.6

+
+

13 June 2021

+
+ +

1.5.5

+
+

12 June 2021

+
+ +

1.5.4

+
+

11 June 2021

+
+ +

1.5.3

+
+

10 June 2021

+
+ +

1.5.2

+
+

7 June 2021

+
+
    +
  • save buryList data fix #143
  • +
  • fix deck transition behavior #142
  • +
  • better burying of cards #141
  • +
  • fix CSS on light themes #140
  • +
  • show folders based on the presence of flashcards instead of files #137
  • +
  • show folders based on the presence of flashcards inside of them instead of files a65ca7f
  • +
  • bump version to 1.5.2 3ffe4f0
  • +
  • make async 0541e77
  • +
+

1.5.1

+
+

6 June 2021

+
+
    +
  • fix deck counts going into negatives #132
  • +
  • bump version to 1.5.1 b309a27
  • +
+

1.5.0

+
+

6 June 2021

+
+
    +
  • load balancing #131
  • +
  • Boost cards after delay. #130
  • +
  • fix parsing of http(s) image links #128
  • +
  • Bump @rollup/plugin-node-resolve from 9.0.0 to 13.0.0 #126
  • +
  • Bump @rollup/plugin-commonjs from 15.1.0 to 19.0.0 #127
  • +
  • Bump @rollup/plugin-typescript from 6.1.0 to 8.2.1 #125
  • +
  • Bump @types/node from 14.17.2 to 15.12.1 #124
  • +
  • Nested decks feature #123
  • +
  • showFileNameInFileLink option #116
  • +
  • nested decks feature 3214175
  • +
  • types 0af6c12
  • +
  • Create codeql-analysis.yml 492f9a8
  • +
+

1.4.9

+
+

31 May 2021

+
+
    +
  • Settings: split tags with newlines and spaces #107
  • +
  • Fix dollar signs replacement #106
  • +
  • Fix reset progress NaN bug #105
  • +
  • bump version to 1.4.9 fe9b37f
  • +
  • Remove redundant \n 83ef968
  • +
+

1.4.8

+
+

21 May 2021

+
+ +

1.4.7

+
+

21 May 2021

+
+
    +
  • disable cloze cards option #97
  • +
  • regexes & fix #95
  • +
  • store original front and back text to put back after review #94
  • +
  • show card context setting #89
  • +
  • fix review flashcards command #85
  • +
  • bump version to 1.4.7 8b84184
  • +
  • addContextToCard option a4197c3
  • +
  • remove these console.logs 4098f10
  • +
+

1.4.6

+
+

16 May 2021

+
+
    +
  • Rewrite cards with the correct separator 0cde960
  • +
  • bump version to 1.4.6 2e46d77
  • +
+

1.4.5

+
+

16 May 2021

+
+
    +
  • Make flashcard separators configurable #77
  • +
  • Indentation to be preserved while making flashcard #75
  • +
  • Limit on number of days to display on right panel #74
  • +
  • Image support #73
  • +
  • Update plugin settings #72
  • +
  • Maximum interval option #71
  • +
  • Use month(s) & year(s) when intervals get too big #69
  • +
  • Shortcut for review flashcards #68
  • +
  • maximumInterval option d793c42
  • +
  • applyDebounceTimer 3b3ca00
  • +
  • Settings sliders ead217d
  • +
+

1.4.4

+
+

8 May 2021

+
+
    +
  • Fixes for better mobile UI/UX #57
  • +
  • fix versions b7cb3cd
  • +
  • bump version to 1.4.4 0a59d8f
  • +
  • More mobile UI/UX fixes accbf0c
  • +
+

1.4.3

+
+

8 May 2021

+
+
    +
  • bump version to 1.4.3 #55
  • +
  • Change date format to YYYY-MM-DD #54
  • +
  • Fix issue with horizontal rules during notes review #51
  • +
  • Decks, make flashcards view scrollable #50
  • +
  • Refactor #47
  • +
  • refactor f633e72
  • +
  • started on decks 0c1944e
  • +
  • moved some enums & interfaces to types.ts 503ec0f
  • +
+

1.4.2

+
+

2 May 2021

+
+
    +
  • Setting to remove review options from file menu 953147e
  • +
  • bump version to 1.4.2 aafd4ef
  • +
  • Update README.md 335bb6f
  • +
+

1.4.1

+
+

1 May 2021

+
+
    +
  • Fix Broken Link in README #42
  • +
  • bump version to 1.4.1 c389a2f
  • +
  • Fix broken link in settings 65fe74b
  • +
  • Fix Broken Link 3da32ac
  • +
+

1.4.0

+
+

1 May 2021

+
+
    +
  • Add flashcards count to statusbar, bugs fix #41
  • +
  • Reset card's progress #40
  • +
  • Cleaned up settings #39
  • +
  • Support for cloze deletion cards #38
  • +
  • change to ISO8601 dates #37
  • +
  • Added support for cloze deletions ef29e14
  • +
  • docs d12cb0e
  • +
  • Burying of related cards 12344cc
  • +
+

1.3.2

+
+

20 April 2021

+
+ +

1.3.1

+
+

19 April 2021

+
+
    +
  • allow for both kinds of review in the same file 06cda88
  • +
  • bump version to 1.3.1 3f52456
  • +
  • Update README.md d6686c7
  • +
+

1.3.0

+
+

19 April 2021

+
+
    +
  • Functional flashcards support (I hope) #23
  • +
  • Some work on flashcard support #22
  • +
  • Split plugin into separate 'modules' #21
  • +
  • split plugin into separate 'modules' df30fb8
  • +
  • Flashcard UI/UX efb8d78
  • +
  • Flashcards seem to be working ad8b22c
  • +
+

1.2.3

+
+

15 April 2021

+
+
    +
  • Add a third review state: good #18
  • +
  • add a third review state: good 51ea4ec
  • +
  • Update README.md 78b83ad
  • +
  • Bump version to 1.2.3 0ac4cb1
  • +
+

1.2.2

+
+

14 April 2021

+
+ +

1.2.1

+
+

14 April 2021

+
+ +

1.2.0

+
+

13 April 2021

+
+
    +
  • Mechanism to only review certain tags #11
  • +
  • Notice on YAML attributes change 852479f
  • +
  • bump version to 1.2.0 327f5cd
  • +
  • fix 43fb6ce
  • +
+

1.1.2

+
+

13 April 2021

+
+ +

1.1.1

+
+

12 April 2021

+
+ +

1.1.0

+
+

11 April 2021

+
+
    +
  • added file context menu 6c19778
  • +
+

1.0.1

+
+

11 April 2021

+
+ +

1.0.0

+
+

9 April 2021

+
+
    +
  • prettier tab width fix 6bf72b1
  • +
  • better handling of new notes 57ca3a9
  • +
  • settings input sanitization & prettify 5e68d8b
  • +
+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/contributing/index.html b/contributing/index.html new file mode 100644 index 00000000..fb98a113 --- /dev/null +++ b/contributing/index.html @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contributing - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Contributing

+

First off, thanks for wanting to contribute to the Spaced Repetition plugin!

+

Bug Reports & Feature Requests

+
    +
  • Check the roadmap for upcoming features & fixes.
  • +
  • Raise an issue here if you have a feature request or a bug report.
  • +
  • Visit the discussions section for Q&A help, feedback, and general discussion.
  • +
+

Translating

+

Steps

+

To help translate the plugin to your language:

+
    +
  1. Fork the repository.
  2. +
  3. Copy the entries from src/lang/locale/en.ts to the proper file in src/lang/locale/ (i.e. fr.ts for French, or sw.ts for Swahili). The locale codes are IETF language tags.
  4. +
  5. Translate,
  6. +
  7. Then open a pull request,
  8. +
+

Example

+

Sample en.ts file:

+
// English
+
+export default {
+    EASY: "Easy",
+    SHOW_ANSWER: "Show Answer",
+    DAYS_STR_IVL: "${interval} days",
+    CHECK_ALGORITHM_WIKI:
+        'For more information, check the <a href="${algo_url}">algorithm implementation</a>.',
+};
+
+

Equivalent sw.ts file:

+
// Swahili
+
+export default {
+    EASY: "Rahisi",
+    SHOW_ANSWER: "Onyesha Jibu",
+    DAYS_STR_IVL: "Siku ${interval}",
+    CHECK_ALGORITHM_WIKI:
+        'Kwa habari zaidi, angalia <a href="${algo_url}">utekelezaji wa algorithm</a>.',
+};
+
+

A part of that last one is uhh, Google translated, I have a working understanding of Swahili but not enough to write computerese lol.

+

Please note that:

+
    +
  1. Only the strings(templates) on the right of the key should be translated.
  2. +
  3. Text inside ${} isn't translated. This is used to replace variables in code. For instance, if interval = 4, it becomes 4 days in English & Siku 4 in Swahili. Quite nifty if you ask me.
  4. +
+

Code

+
    +
  1. Make your changes.
  2. +
  3. Run pnpm dev to test the changes inside Obsidian.
  4. +
  5. +

    You could create symbolic links between the build files and the Obsidian vault, example:

    +
    # remove existing files in the Obsidian vault
    +rm ~/notes/.obsidian/plugins/obsidian-spaced-repetition/main.js ~/notes/.obsidian/plugins/obsidian-spaced-repetition/manifest.json ~/notes/.obsidian/plugins/obsidian-spaced-repetition/styles.css
    +# use absolute paths
    +ln -s /home/stephen/obsidian-spaced-repetition/build/main.js /home/stephen/notes/.obsidian/plugins/obsidian-spaced-repetition
    +ln -s /home/stephen/obsidian-spaced-repetition/manifest.json /home/stephen/notes/.obsidian/plugins/obsidian-spaced-repetition
    +ln -s /home/stephen/obsidian-spaced-repetition/styles.css /home/stephen/notes/.obsidian/plugins/obsidian-spaced-repetition
    +
    + +
  6. +
  7. +

    Document the "user-facing" changes e.g. new feature, UI change, etc.

    +
  8. +
  9. If your "business logic" is properly decoupled from Obsidian APIs, write some unit tests.
      +
    • This project uses jest, tests are stored in tests/.
    • +
    • pnpm test
    • +
    +
  10. +
  11. Add your change to the [Unreleased] section of the changelog (docs/changelog.md).
      +
    • The format is based on Keep a Changelog, TL;DR:
        +
      • Added for new features.
      • +
      • Changed for changes in existing functionality.
      • +
      • Deprecated for soon-to-be removed features.
      • +
      • Removed for now removed features.
      • +
      • Fixed for any bug fixes.
      • +
      • Security in case of vulnerabilities.
      • +
      +
    • +
    • You can also append a link to your GitHub profile, example:
        +
      • Make flashcard text selectable [@st3v3nmw](https://github.com/st3v3nmw)
      • +
      +
    • +
    +
  12. +
  13. Before pushing your changes, run the linter: pnpm lint
      +
    • Format the code in case any warnings are raised: pnpm format
    • +
    +
  14. +
  15. Open the pull request.
  16. +
+

Documentation

+

The documentation consists of Markdown files which MkDocs converts to static web pages. +Specifically, this project uses MkDocs Material.

+

These files reside in docs/ in the respective language's folder. For instance, English docs are located in docs/en/.

+

The docs are served on https://www.stephenmwangi.com/obsidian-spaced-repetition/.

+

For small changes, you can simply open an pull request for merging (against the master branch). +The changes will be live once a new release is made.

+

For larger diffs, it's important that you check how your docs look like as explained below.

+

Viewing Docs Locally

+

Initial Setup

+
    +
  1. Create a virtual environment: python3 -m venv venv
  2. +
  3. Activate it: . venv/bin/activate
  4. +
  5. Install the required dependencies: pip install -r requirements.txt
  6. +
+

Viewing

+
    +
  1. Activate the virtual environment: . venv/bin/activate
  2. +
  3. Serve the docs: mkdocs serve
  4. +
  5. View your documentation locally on http://127.0.0.1:8000/obsidian-spaced-repetition/, any changes you make will reflect on the browser instantly.
  6. +
+

Translating Documentation

+
    +
  1. Create a folder for your language in docs/ if it doesn't exist. Use the language codes provided here.
  2. +
  3. Add the code from (1) to the MkDocs configuration (mkdocs.yml - plugins.i18n.languages).
  4. +
  5. Copy the files from the English (en) folder into the new folder.
  6. +
  7. Translate then open a pull request.
  8. +
+

Maintenance

+

Releases

+

Example using v1.9.2:

+
    +
  1. Create a new branch: git switch -c release-v1.9.2
  2. +
  3. Bump the plugin version in manifest.json and package.json (following Semantic Versioning).
      +
    • Semantic Versioning TL;DR, given a version number MAJOR.MINOR.PATCH, increment the:
        +
      • MAJOR version when you make incompatible API changes
      • +
      • MINOR version when you add functionality in a backwards compatible manner
      • +
      • PATCH version when you make backwards compatible bug fixes
      • +
      +
    • +
    • If the new version uses new Obsidian APIs, update minAppVersion and versions.json to reflect this.
    • +
    +
  4. +
  5. Run pnpm changelog to update the CHANGELOG.
  6. +
  7. +

    Commit and push the changes:

    +
    git add .
    +git commit -m "Bump version to v1.9.2"
    +git push --set-upstream origin release-v1.9.2
    +
    +
  8. +
  9. +

    Open and merge the PR into master.

    +
  10. +
  11. Locally, switch back to master and pull the changes: git switch master && git pull
  12. +
  13. Create a git tag with the version: git tag 1.9.2
  14. +
  15. Push the tag: git push --tags.
    You're all set! This GitHub action should pick it up, create a release, publish it, and update the live documentation.
  16. +
+
+
+
    +
  1. +

    Check the Obsidian Tasks project which has excellent contribution guidelines

    +
  2. +
+
+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/en/algorithms/index.html b/en/algorithms/index.html new file mode 100644 index 00000000..331f12d4 --- /dev/null +++ b/en/algorithms/index.html @@ -0,0 +1,527 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Algorithms - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Algorithms

+

SM-2

+
+

Warning

+

Note that this hasn't been updated in a while, +please see the code.

+
+

(It's the same as that used for flashcards - apart from the PageRanks)

+
    +
  • The algorithm is a variant of Anki's algorithm which is based on the SM-2 algorithm.
  • +
  • It supports ternary reviews i.e. a concept is either hard, good, or easy at the time of review.
  • +
  • initial ease is weighted (using max_link_factor) depending on the average ease of linked notes, note importance, and the base ease.
      +
    • if link_count > 0: initial_ease = (1 - link_contribution) * base_ease + link_contribution * average_ease
        +
      • link_contribution = max_link_factor * min(1.0, log(link_count + 0.5) / log(64)) (cater for uncertainty)
      • +
      +
    • +
    • The importance of the different concepts/notes is determined using the PageRank algorithm (not all notes are created equal xD)
        +
      • On most occasions, the most fundamental concepts/notes have higher importance
      • +
      +
    • +
    +
  • +
  • If the user reviews a concept/note as:
      +
    • easy, the ease increases by 20 and the interval changes to old_interval * new_ease / 100 * 1.3 (the 1.3 is the easy bonus)
    • +
    • good, the ease remains unchanged and the interval changes to old_interval * old_ease / 100
    • +
    • hard, the ease decreases by 20 and the interval changes to old_interval * 0.5
        +
      • The 0.5 can be modified in settings
      • +
      • minimum ease = 130
      • +
      +
    • +
    • For 8 or more days:
        +
      • interval += random_choice({-fuzz, 0, +fuzz})
          +
        • where fuzz = ceil(0.05 * interval)
        • +
        • Anki docs: + > "[...] Anki also applies a small amount of random “fuzz” to prevent cards that were introduced at the same time and given the same ratings from sticking together and always coming up for review on the same day."
        • +
        +
      • +
      +
    • +
    +
  • +
  • The scheduling information is stored in the YAML front matter
  • +
+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/en/assets/favicon.ico b/en/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1493154e7edc46173d46d3c410da5c989edd75e4 GIT binary patch literal 6354 zcmXY$1ymH@7suZ&EV*<@Nl5q79n#>^AR$PnfFMXoth9nGAPP$;C80>S#L^)O2uLa* z5&{BCNQ!^>o&U_4GxyDV=lkxxGk4~5<^ce?+^;qWUPEEY=#HT>xo1}4o2BUaJx}LaZ{vBiIB={3b%!piEH)bcadF7|= zh=S5cL~+~HY1p}+;`rItPVJHPy~;M}JdG#R+GEXJGywXqEeywYM_I%+xaEy+7?HnsH?vDxNTqk~ zUYlITH+*;~pUb(#_be_rz5Uz!1K1i`ro1;3x}YxMT)CElU`YdH}4a5sI@(pGH>GFsH(V*0;^2)-bVdgXRBaT zUocz(NAnrxJ!AKNWr3`WEa8tO|s&~C5k0xWWVo$8gIZ& zJ4JLzz{LW+@L_h4mGh`~r?cmuQ~Zg^IA_MXo_ohLgm>3= ziLRIQ6n$=opX{mQ#QrR`Zi}5mrM3tI>J^N-N=&caY*LDD%bGeNYb-0K5_E9BKc%fQ zoPXcELo|}A!(;&mwJsFjgKe38<+iK~dpgp3O3qDivIjGY)%q!ev&)(A{{DtWkvS#C zr&O0!osYg>r^x+)JKWrfQP8+FA&^1SZi9o#HwaYk)3wS+=k|r`r z+z#9QnJ)5~B$`C|AKSF7RmZTD!*f5qQs>+^XpO&UdZBfK<$jqo+!Zq7`0H}o8i+CzYPoFPHmwjMLdt|)E*_EgV&$}^c?16SToh=_r<=Ey?%mc87;Ps z@^n_hXVrPDW3VXXRm?je>CiGjo~8bIXT;g;Nc(q6j-9&J$y0ZS4+Y46PA%MW#IN9c65)Hgc5P32W8eN?N zcZoF8WK{4!mW>^Revy+^D?Gm=Ikez@92QC&{?`qUgzJroTX0uw7K@Ri7yTjhX6u>z ze6sFz$%m!q)z`-d4c&!=92dF`MPB!R4knBqB@P-(@h{n|W1L;QyHU7+oswOxMSsTL zdfYN8h2yyxWo-JUUwFRnezU@=TvfX+6^&nE^FWX{PfAaxx=%C>-WD31>^t=*CJl%B zM@q+@75Izj$9bH&#_YGB9}`FNg=1Z^3?JY-8QtoN{Z5A~LjReI%?^Kk7bCw_moofe z{PwNf8N%~c z(}cj-E$0CTN`$J3pM`#+9;= zZu!-jyuXks8)`3cp3geUljS-gV&CEndJFmC{inO7s&j!$g|x$Q02-LxH@35PXmycz zoj_|%si-!tZM~YIBrlolnueCsjSmkh8(b}>v*MC8j|nzyN){X#F>Se$8Sm1$3en60 ziFb)v&hy639}T`k*SqxJre2U3Q84Z%YlFSUm%Ov+tY0GYMR)l~WvBEGCshg8av5`~Ifn2{ddM~KdX zRO;1>us&pjOxF(5E53d2*Dx%3i9A~-lIyR|eZi)-DZdlMEj1vGxR-HHeB5;nb#Ksj zuN^BiS7O-X!2djc@j9MR59&w6x5olWY*pEV)Eb0+82QA&28#QuPG3|-#9i-k2)TO2 z?(6tHd*IQc;MX>lT{;X>NZ~FQP2VA!#(0E_{>978adV>+bhG%j?p#w4tk)`f`FC}z zB?I7Z`lxBDM7NvG3ciXPXxt|}_X-Df52*m%A!JvO2I*A>QV7A092T$i-G7#veg}eA z5ZI7nVKCG@$Z;?c@VN~J@K8sCyrVV{b_#G0Bl-9)2?znlsFP(&LZMONVaNqhqkl&DjrT$6M5 z&XdBcMwey(`4r#PWEzev`*yE4D@EP|Ujp!IkMeu{AMzP_F%5`4ACM7y*FWypai#oY z25PKJ0;~YgI;-F)1ilKu8?%A!D13a?Dt#g2jbC(FZiyVtLD_&y^^-IhK6^I_4p!O|=OhGGFgiBZu0nyI%IWYGjr zV?34;rQa9l14^LkSMEq2Vhmv?1=!%#lotmzbRZ3kVu*=$)P?`cTIbExdgZ*Ud_*Cw zdTo+w9cE-u4K&0+)PcIMfX#>Y9LGSe>eNRf>-6DU_ZF!t*0{4j}G*0g`gdMtrAQY*YVZHGOpB-)}am!0&r_*GV z9|Q+xt&j}dEdjfNG9ErgA@tXC@v!=`!k_~q<4!7r!pjv~hf4IqXw5h>8I6zO@+*nOPo%JyQl{G7zq< zPD4$qO6*y%l!+>fct}DoVY+s4Fb66W>7MUG<$qWULP`f{Q$P1~R}ipACDpxvAAfZx zkS<{R@gB;~$|lC!<{iD4S^yF>L_5Y?T<_@Fe5oizGAgq@{!hULi8 z0*dG<{}QkQ&_G2g>sxL)4e0G3Qsv?K9bYxcX_Qu_S zKe!5gz@CIu_OWhiy5)vf+3lQDtql6It|LyyAbK-f^O#OK0$!K=F!e+J# zV`YBbi}6kigYTb_W`7>~sp&8bR+I7k806DG|5JNnuuJ=iX;?$8XPuD?)*L#@1q#Gs<-#AkjCZXT z$7<&hw~ObW9Hkslc_n<~0;dOK8zl@jd@Z@kMMhKbYywsMKEyT4rv)Yu zpx7ydp_7`rF9=Y{!#4)HOF8HO?$`(mc4>wbASfoJ@D?($IQBg>PYYYG8g)lF_%#g} z7;*h%SaVqy=HP$|0fGaf{(1v+E7qB)vc4#xP6}w$-daf-_2!^}7DGp$V(68l?i4}t z;#T7*Lk|^aFLn0ajTtBr}Rx`w#OU^{)YLOzmSA}HR+eve_LM`@N;|X zM7a*N@poP)ZztG_U`bf}Gd%20+TZB170yqv#cDv-VwU7YDo3jtSv>Xgp<@bL8aJqO zq%L|sHd+th#C!x*%oLukhw--7Rw*=C^I}-DL^e0zs#@VBY^F!~M7Tl3cgq$8HeS7e z@kc;{#RlwCxPiuEctg5F`YlKkRmYiE-7*8C(d|fh=rJ*039Rj1CN~Hsc^g6)(>U7Q zM1!(??X##=M*;n-5w_~2Y87qr8RRJ&NHo8HZ^KOVHugP}-Bx+t<{P?xQY7*AMIU6Q%{R4Cd`0gLyBfJIkL2M+u!T_L>G^KQPUR9gsOt))RpUi%#z17wEbh97U|F zUt~hLooi8w7o&o2Y|*+QLWvTVj{})j^1Lr=ijro2I$l780Q;O~20uDAhM3{$YKzRs zQ!TujH+|37{=t=ut0^lT8G%%00kPZI%p^FUdCdIlw+0nasH=%E9{Vd{45F{d!{LKB z+x=Wi0#(_IZX4ehx+|P?;3XcI|J2i;T-b0$ByYv6#4+n{u5f@MtgC{C#1srb03zw~ zyG9|OSq6NCfPUs)Dz9(+)##xbs=a7&!MW+piAsk^OoZ?TM;@?fd|%mEFm4lqHJZLiVR3$l8%t`l~?nt zS$5e3w=Q03N&`?hqnR8_dpXr;GBMFVk>K1EC|2w80Xvka#orMq1yxkwL=4@0V3vOs zlr$7D^lU$}vc3YJpw+>Qj=ijGzAOHtt$k-tAIE=bvctzQiIGC1Bu3z}G7UKng^Cjb z%&(Ye!l4{Rdi-C6diHewC)Z+NF_)Tn?C?s7jDIGUCps|HCjjJYS2*weCn~Vd?y;VK z<#gCqov(?GCIu}ZzoeFK40D*E`<1JK0C;D5ER9FJTjK{dc&gm4xkmJ-f>&-(?_=(? zmK3I>L9xalxHz^AuPZy{KOl=k3eVHlnO%{VN1%U9$yNB2u}_Be=}r9kLD41I3Wufg zvsvk0MOp7Ry2;}<`XB1yEW5W8E^!+l<=fgd?+UA^rUTwK_^Kg~ARs`sWy(95;jXd? z1z1Bc9FAh?vJxI;<`N6T^5p#sg%sTxL1J6-M-Kcn+rlzrner{jK>xOYZ13XFDp?^H z;64a;F~r%*bNbBz^Kaom&Qa?P)#W{QjQh@+^=r0SX?Wk^Weo7LzwI*FQ#owUr;%ma z7;yML`A4Ao4pkfsY4wy4v#g~@guUUq)2TK5*-g6_7`>da$~^| zvs9Q3tNNOQ8u~=UK#v2#zNJ5$oCxjsXDRIUOh7dlw`jW4Si^h-cSyG38IlQ4uSb4l z3`K7vM?*M2`0of$3mWg2{NU(Y{2YIj>BO4=UA(<_ewp09ZGp^zExVkqm!z)pfHu4?KF>9{WAJ)j2nSbZ( zJ~S{@2A=9OV#Z%2TFc(6tY^lzmXB}z8D%&~2s!{=U;R6JB*V=dGL z-b!du{+)&h<8XXXYs$^kJrgK<|M(y$gRAO#fb=uPvAA!XY2^_W6ayM*?(Nq(j2Q-G zKeGOvU2JA-h-U2#RN`OX9JeQ4T{Fkh^oSqfNg(tGLh*TZ9g?sfe}3m^T1c?w$=6o@ zT;WfMf9T!8qWLl`Trs)Xc|He6MP(PO0DG?=7&U=q;gMP!nY6~OD)#vDaBYn}KbB$S z&Ch&UKX(28k4HI34@v30p3mZSx{;q!$fkD9 z$CAtAE353Dd*1c0$_|Sy<`X6+m@-->?+#^qtxcj}!H%3YimyE6`+%UGI<=8!dX_fv zjG|k6BI%cWR1yC%{e36IwmRwjww`w!`8rx=Hx_*qE+@BRuI?lTnf}!sE@{itV9NWA zCDw^=ol zCn8T$J&@7`Up}^NC4SY?uIwcoKF{-$Sc)IqWPA3fNDy;_u4XeZKn!ugR6yI!&}}OI zAO-ogYi>O@i*GklyHe;?KgZ;Hi0j{C{3Tz~7qSQJ^v_PM=1L7ilEPxe?c83zltmtjJ z#0JYeG3}LiwJK4S2=b%C2Urz>r^&ygo2NHUy|5jkDRWN@aa<42PVDdSqi$z1jUHj5 zm!~!Qm19~s;t&OcgdS0mOLS@ujP0ESUd4hfx-w3je=Alp(Nkluzk5k3$b^4SZDC^V zlMFp~hH{*}#k2;TdN!K!N;3o*bu$}#Aab@D^#2+P&D_`?x9l-OuVGJ;Eo){s^O@t8 zgolgsmz+Ego&=Lq6mSfY&Uvf;e-)rW!}EkKrSoNWE3V~gRRZX08fa9g*+=~k+CN3* literal 0 HcmV?d00001 diff --git a/en/changelog/index.html b/en/changelog/index.html new file mode 100644 index 00000000..64a4672e --- /dev/null +++ b/en/changelog/index.html @@ -0,0 +1,1785 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelog - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Changelog

+ +

Changelog

+

All notable changes to this project will be documented in this file. Dates are displayed in UTC.

+

Generated by auto-changelog.

+

1.10.5

+
    +
  • Bug edit flashcard sometimes corrupts question text in file #784
  • +
  • Bug note review invalid metadata 764 #782
  • +
+

1.10.4

+
+

30 October 2023

+
+
    +
  • Bump version to v1.10.4 #780
  • +
  • Bug fix: questions now removed from postponement list; etc #775
  • +
  • fix: multi-line tag ('$$') converted to single-line ('$') after card reviewed b9c354d
  • +
+

1.10.3

+
+

23 October 2023

+
+
    +
  • Bump version to v1.10.3 #772
  • +
  • doc: update note about the reversed card #699
  • +
  • Fix bugs regarding bury sibling cards #763
  • +
+

1.10.2

+
+

9 October 2023

+
+
    +
  • Bump version to 1.10.2 #756
  • +
  • refactor: Separate business logic from user interface code #751
  • +
  • Remove the spaces before and after the question marks in the multi-line basic flashcards #719
  • +
  • chore: Update dependencies 44e9bb6
  • +
  • chore: Update dependencies 1f69f96
  • +
  • feat: Add E2E testing 1ef0663
  • +
+

1.10.1

+
+

5 May 2023

+
+
    +
  • Bump version to v1.10.1 #679
  • +
  • style: Fix formatting #678
  • +
  • remove skip after modifying card text #671
  • +
  • Add translations to the Spanish language. #667
  • +
  • Update translations zh-cn.ts and zh-tw.ts #676
  • +
  • Close very old issues (>= 1 year) #665
  • +
  • Update changelog #664
  • +
  • show MAX_INTERVAL unit in title #643
  • +
  • Fix issue requiring collapseIcon to be clicked twice to expand/collapsed deck tree #656
  • +
  • Update ru.ts #657
  • +
  • Consume keyboard event in flashcard modal #637
  • +
+

1.10.0

+
+

6 February 2023

+
+
    +
  • Remove custom dir mkdocs setting #622
  • +
  • Bump version to v1.10.0 #621
  • +
  • Add a skip button to the flashcards menu #620
  • +
  • Get rid of Giscus comments #619
  • +
  • Fix ar.ts formatting #618
  • +
  • update ar.ts for Arabic translation #616
  • +
  • Fixed some terms. #611
  • +
  • Fix card info #593
  • +
  • Add note title to card context #592
  • +
  • Update Changelog #591
  • +
  • Add per-deck cramming command #515
  • +
  • Add flashcards menu #589
  • +
  • Add flashcard editing modal #587
  • +
  • Update esbuild dep e33ec93
  • +
  • Update plugin version 2bf13a9
  • +
  • Add skip card logic fef51b6
  • +
+

1.9.4

+
+

8 January 2023

+
+
    +
  • Bump version to v1.9.4 #588
  • +
  • Minor UI fixes on flashcards #586
  • +
+

1.9.3

+
+

2 January 2023

+
+
    +
  • Bump version to v1.9.3 #576
  • +
  • Minor UI and docs fixes #575
  • +
+

1.9.2

+
+

2 January 2023

+
+
    +
  • Fix changelog path #574
  • +
  • Bump version to v1.9.2 #573
  • +
  • Update contribution docs #572
  • +
  • Add root CONTRIBUTING.md #566
  • +
  • Fix release gh-action 2 #565
  • +
  • Fix release gh-action #564
  • +
  • Update docs #563
  • +
  • Add upload docs GitHub action #562
  • +
  • Move wiki to GitHub pages #561
  • +
  • Update flashcards image formats #560
  • +
  • Make flashcard text selectable #559
  • +
  • Prevent regex from matching to last --- in file #532
  • +
+

1.9.1

+
+

12 December 2022

+
+
    +
  • Fix README formatting and bump version #546
  • +
  • Fix extra note review panes being added #545
  • +
  • Add list of translations into README #544
  • +
+

1.9.0

+
+

12 December 2022

+
+
    +
  • Fix back button #543
  • +
  • Revert to npm over yarn #542
  • +
  • Fix zh-TW formatting #541
  • +
  • Update dependencies #539
  • +
  • Add REVIEW_PANE_ON_STARTUP #540
  • +
  • Traditional Chinese strings. (zh-TW) #536
  • +
  • Update zh-cn.ts #535
  • +
  • Make the note review pane optional #531
  • +
  • Add Brazilian Portuguese Translation 🇧🇷 #518
  • +
  • Replace crlf to lf on card parse #523
  • +
  • style: set the flashcard's font size as user editor, with var(--font-text-size) #480
  • +
  • Added new setting to collapse/expand subdecks #510
  • +
  • Add curly brackets as option for cloze fields d8c0e9e
  • +
  • [feat] add modal history feature c6bb8f0
  • +
+

1.8.0

+
+

24 July 2022

+
+
    +
  • Regenerate yarn.lock file #474
  • +
  • Fix breakage with Obsidian v15.4 and add customizable review buttons #469
  • +
  • Bump minimist from 1.2.5 to 1.2.6 #473
  • +
  • Bump moment from 2.29.1 to 2.29.4 #472
  • +
  • Fixed mistakes in ru.ts #464
  • +
  • Add "ogg" as supported audio file format #425
  • +
  • Update jest config #419
  • +
  • fix: handle code fences better #402
  • +
  • Add and run prettier #413
  • +
  • Translate Korean #417
  • +
  • Update zh-cn.ts #416
  • +
  • Fix breakage with Obsidian v15.4 and add customizable review buttons (#469) #273
  • +
  • add lockfile c386dc3
  • +
  • Add localization check bce5c22
  • +
  • Upgrade dependencies 9d34c56
  • +
+

1.7.2

+
+

21 February 2022

+
+
    +
  • Ive done the translation to Russian. [#403`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/403)
  • +
  • Add czech translations #391
  • +
  • Update zh-cn.ts #364
  • +
  • Промежуточное сохранение 1f0f46c
  • +
  • Intermediate result saving) e35c012
  • +
  • Intermediate result saving))) 8ac56ae
  • +
+

1.7.1

+
+

2 January 2022

+
+
    +
  • Fix textInterval - more accurate calculations 3b0446a
  • +
  • Remove dependabot 2236396
  • +
  • Fix tag override 07e1de4
  • +
+

1.7.0

+
+

1 January 2022

+
+
    +
  • Stats & transclusion improvements #358
  • +
  • Bump typescript from 4.4.4 to 4.5.4 #355
  • +
  • Bump obsidian from 0.12.17 to 0.13.11 #356
  • +
  • Bump @types/node from 16.11.17 to 17.0.5 #357
  • +
  • Fix first time random card selection #353
  • +
  • [Bug fix] for HTML Comment parsing #350
  • +
  • Scheduling fixes & tests #352
  • +
  • Remove dependence on Obsidian Charts plugin #351
  • +
  • Scheduling unit tests #316
  • +
  • Changing interpolate to an optional arg of t #315
  • +
  • Bump @typescript-eslint/parser from 4.33.0 to 5.8.0 #345
  • +
  • Bump @types/node from 16.11.14 to 17.0.1 #344
  • +
  • Bump esbuild from 0.13.15 to 0.14.5 #341
  • +
  • Bump @typescript-eslint/eslint-plugin from 4.33.0 to 5.7.0 #340
  • +
  • Correct notes(s) to note(s) in en.ts lang file #323
  • +
  • ja: added Japanese translation #318
  • +
  • Bump eslint from 7.32.0 to 8.3.0 #326
  • +
  • Overwrite deck on card #299
  • +
  • Open file was changed to "Edit Later" #300
  • +
  • Bump esbuild from 0.12.29 to 0.13.2 #302
  • +
  • Updated to display mp3 and webm audio on flashcards #297
  • +
  • Added translations DE #298
  • +
  • Cram Flashcards #291
  • +
  • Fix collapsed/expanded states when redrawing the sidebar #290
  • +
  • Using tags from User Preferences and not their full name that includes the sibling #292
  • +
  • Change Eases x-axis from DAYS to EASES #285
  • +
  • Fix dependencies & esbuild workflow 66766a8
  • +
  • Change some innerHTML text to JSX 3623efc
  • +
  • transclusions initial implementation 0e12388
  • +
+

1.6.2

+
+

29 August 2021

+
+
    +
  • Returned cursor position on "open file" or "Edit later" #281
  • +
  • Change "Open file" to "Edit later" #280
  • +
  • Add bolded to cloze cards conversion #277
  • +
  • Develop #276
  • +
  • Update (see PR notes) #271
  • +
  • New Icon for app #275
  • +
  • Move to ESBUILD from rollup #268
  • +
  • Added for those working with VSCODE #265
  • +
  • Roll back caching & more stats #264
  • +
  • Fixes #263
  • +
  • Switch to esbuild 177bc78
  • +
  • Delete main.js 76b94d1
  • +
  • Refactor 26d9dbd
  • +
+

1.6.1

+
+

19 August 2021

+
+
    +
  • Multiple review queues fixes #258
  • +
  • Add multiple note review queues & curly braces consistency in blocks #252
  • +
  • Fixes #251
  • +
  • Bump @types/jest from 26.0.24 to 27.0.1 #245
  • +
  • Refactor & change code's line max length #236
  • +
  • Merge WIP for multiple review queues #234
  • +
  • Add option to ignore folders in note review #232
  • +
  • Prettier 1d4bcdc
  • +
  • block curly brace consistency d9181f5
  • +
  • First pass at implementing "review decks". 069619c
  • +
+

1.6.0

+
+

8 August 2021

+
+
    +
  • Parser tests #230
  • +
  • Single & multiline cards #229
  • +
  • Fix logger & legacy scheduling #228
  • +
  • Generalize flashcards processing & logging #227
  • +
  • Caching & settings debounce fix #226
  • +
  • Bump @rollup/plugin-commonjs from 19.0.2 to 20.0.0 #225
  • +
  • Add single & multiline reversed cards c3e6c0d
  • +
  • Fix settings - debounce 17d7496
  • +
  • Add caching 3808ce0
  • +
+

1.5.8

+
+

4 August 2021

+
+
    +
  • Add multilingual support #223
  • +
  • Fix bugs with cloze cards & newlines #222
  • +
  • Refactor #220
  • +
  • Fixes #219
  • +
  • Fix statistics view - accumulate overdue cards, linearity #217
  • +
  • Go to flashcard position after clicking open file #215
  • +
  • Code refactor #214
  • +
  • Allow flashcard height and width to be customizable #210
  • +
  • Bump @types/node from 15.14.1 to 16.3.0 #188
  • +
  • Refactor code 05d3217
  • +
  • Create CODE_OF_CONDUCT.md 9798c69
  • +
  • rename related to siblings 82651b4
  • +
+

1.5.7

+
+

20 June 2021

+
+
    +
  • Randomize card order option #170
  • +
  • resize image, large screen mode #169
  • +
  • per deck totals #168
  • +
  • fix bug when parsing nonexistent images #166
  • +
  • Parse card only once #165
  • +
  • bump version to 1.5.7 856d423
  • +
  • randomize card order option 3f2d97e
  • +
  • fix bug when parsing nonexistent files c906afe
  • +
+

1.5.6

+
+

13 June 2021

+
+ +

1.5.5

+
+

12 June 2021

+
+ +

1.5.4

+
+

11 June 2021

+
+ +

1.5.3

+
+

10 June 2021

+
+ +

1.5.2

+
+

7 June 2021

+
+
    +
  • save buryList data fix #143
  • +
  • fix deck transition behavior #142
  • +
  • better burying of cards #141
  • +
  • fix CSS on light themes #140
  • +
  • show folders based on the presence of flashcards instead of files #137
  • +
  • show folders based on the presence of flashcards inside of them instead of files a65ca7f
  • +
  • bump version to 1.5.2 3ffe4f0
  • +
  • make async 0541e77
  • +
+

1.5.1

+
+

6 June 2021

+
+
    +
  • fix deck counts going into negatives #132
  • +
  • bump version to 1.5.1 b309a27
  • +
+

1.5.0

+
+

6 June 2021

+
+
    +
  • load balancing #131
  • +
  • Boost cards after delay. #130
  • +
  • fix parsing of http(s) image links #128
  • +
  • Bump @rollup/plugin-node-resolve from 9.0.0 to 13.0.0 #126
  • +
  • Bump @rollup/plugin-commonjs from 15.1.0 to 19.0.0 #127
  • +
  • Bump @rollup/plugin-typescript from 6.1.0 to 8.2.1 #125
  • +
  • Bump @types/node from 14.17.2 to 15.12.1 #124
  • +
  • Nested decks feature #123
  • +
  • showFileNameInFileLink option #116
  • +
  • nested decks feature 3214175
  • +
  • types 0af6c12
  • +
  • Create codeql-analysis.yml 492f9a8
  • +
+

1.4.9

+
+

31 May 2021

+
+
    +
  • Settings: split tags with newlines and spaces #107
  • +
  • Fix dollar signs replacement #106
  • +
  • Fix reset progress NaN bug #105
  • +
  • bump version to 1.4.9 fe9b37f
  • +
  • Remove redundant \n 83ef968
  • +
+

1.4.8

+
+

21 May 2021

+
+ +

1.4.7

+
+

21 May 2021

+
+
    +
  • disable cloze cards option #97
  • +
  • regexes & fix #95
  • +
  • store original front and back text to put back after review #94
  • +
  • show card context setting #89
  • +
  • fix review flashcards command #85
  • +
  • bump version to 1.4.7 8b84184
  • +
  • addContextToCard option a4197c3
  • +
  • remove these console.logs 4098f10
  • +
+

1.4.6

+
+

16 May 2021

+
+
    +
  • Rewrite cards with the correct separator 0cde960
  • +
  • bump version to 1.4.6 2e46d77
  • +
+

1.4.5

+
+

16 May 2021

+
+
    +
  • Make flashcard separators configurable #77
  • +
  • Indentation to be preserved while making flashcard #75
  • +
  • Limit on number of days to display on right panel #74
  • +
  • Image support #73
  • +
  • Update plugin settings #72
  • +
  • Maximum interval option #71
  • +
  • Use month(s) & year(s) when intervals get too big #69
  • +
  • Shortcut for review flashcards #68
  • +
  • maximumInterval option d793c42
  • +
  • applyDebounceTimer 3b3ca00
  • +
  • Settings sliders ead217d
  • +
+

1.4.4

+
+

8 May 2021

+
+
    +
  • Fixes for better mobile UI/UX #57
  • +
  • fix versions b7cb3cd
  • +
  • bump version to 1.4.4 0a59d8f
  • +
  • More mobile UI/UX fixes accbf0c
  • +
+

1.4.3

+
+

8 May 2021

+
+
    +
  • bump version to 1.4.3 #55
  • +
  • Change date format to YYYY-MM-DD #54
  • +
  • Fix issue with horizontal rules during notes review #51
  • +
  • Decks, make flashcards view scrollable #50
  • +
  • Refactor #47
  • +
  • refactor f633e72
  • +
  • started on decks 0c1944e
  • +
  • moved some enums & interfaces to types.ts 503ec0f
  • +
+

1.4.2

+
+

2 May 2021

+
+
    +
  • Setting to remove review options from file menu 953147e
  • +
  • bump version to 1.4.2 aafd4ef
  • +
  • Update README.md 335bb6f
  • +
+

1.4.1

+
+

1 May 2021

+
+
    +
  • Fix Broken Link in README #42
  • +
  • bump version to 1.4.1 c389a2f
  • +
  • Fix broken link in settings 65fe74b
  • +
  • Fix Broken Link 3da32ac
  • +
+

1.4.0

+
+

1 May 2021

+
+
    +
  • Add flashcards count to statusbar, bugs fix #41
  • +
  • Reset card's progress #40
  • +
  • Cleaned up settings #39
  • +
  • Support for cloze deletion cards #38
  • +
  • change to ISO8601 dates #37
  • +
  • Added support for cloze deletions ef29e14
  • +
  • docs d12cb0e
  • +
  • Burying of related cards 12344cc
  • +
+

1.3.2

+
+

20 April 2021

+
+ +

1.3.1

+
+

19 April 2021

+
+
    +
  • allow for both kinds of review in the same file 06cda88
  • +
  • bump version to 1.3.1 3f52456
  • +
  • Update README.md d6686c7
  • +
+

1.3.0

+
+

19 April 2021

+
+
    +
  • Functional flashcards support (I hope) #23
  • +
  • Some work on flashcard support #22
  • +
  • Split plugin into separate 'modules' #21
  • +
  • split plugin into separate 'modules' df30fb8
  • +
  • Flashcard UI/UX efb8d78
  • +
  • Flashcards seem to be working ad8b22c
  • +
+

1.2.3

+
+

15 April 2021

+
+
    +
  • Add a third review state: good #18
  • +
  • add a third review state: good 51ea4ec
  • +
  • Update README.md 78b83ad
  • +
  • Bump version to 1.2.3 0ac4cb1
  • +
+

1.2.2

+
+

14 April 2021

+
+ +

1.2.1

+
+

14 April 2021

+
+ +

1.2.0

+
+

13 April 2021

+
+
    +
  • Mechanism to only review certain tags #11
  • +
  • Notice on YAML attributes change 852479f
  • +
  • bump version to 1.2.0 327f5cd
  • +
  • fix 43fb6ce
  • +
+

1.1.2

+
+

13 April 2021

+
+ +

1.1.1

+
+

12 April 2021

+
+ +

1.1.0

+
+

11 April 2021

+
+
    +
  • added file context menu 6c19778
  • +
+

1.0.1

+
+

11 April 2021

+
+ +

1.0.0

+
+

9 April 2021

+
+
    +
  • prettier tab width fix 6bf72b1
  • +
  • better handling of new notes 57ca3a9
  • +
  • settings input sanitization & prettify 5e68d8b
  • +
+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/en/contributing/index.html b/en/contributing/index.html new file mode 100644 index 00000000..d6f0fa42 --- /dev/null +++ b/en/contributing/index.html @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contributing - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Contributing

+

First off, thanks for wanting to contribute to the Spaced Repetition plugin!

+

Bug Reports & Feature Requests

+
    +
  • Check the roadmap for upcoming features & fixes.
  • +
  • Raise an issue here if you have a feature request or a bug report.
  • +
  • Visit the discussions section for Q&A help, feedback, and general discussion.
  • +
+

Translating

+

Steps

+

To help translate the plugin to your language:

+
    +
  1. Fork the repository.
  2. +
  3. Copy the entries from src/lang/locale/en.ts to the proper file in src/lang/locale/ (i.e. fr.ts for French, or sw.ts for Swahili). The locale codes are IETF language tags.
  4. +
  5. Translate,
  6. +
  7. Then open a pull request,
  8. +
+

Example

+

Sample en.ts file:

+
// English
+
+export default {
+    EASY: "Easy",
+    SHOW_ANSWER: "Show Answer",
+    DAYS_STR_IVL: "${interval} days",
+    CHECK_ALGORITHM_WIKI:
+        'For more information, check the <a href="${algo_url}">algorithm implementation</a>.',
+};
+
+

Equivalent sw.ts file:

+
// Swahili
+
+export default {
+    EASY: "Rahisi",
+    SHOW_ANSWER: "Onyesha Jibu",
+    DAYS_STR_IVL: "Siku ${interval}",
+    CHECK_ALGORITHM_WIKI:
+        'Kwa habari zaidi, angalia <a href="${algo_url}">utekelezaji wa algorithm</a>.',
+};
+
+

A part of that last one is uhh, Google translated, I have a working understanding of Swahili but not enough to write computerese lol.

+

Please note that:

+
    +
  1. Only the strings(templates) on the right of the key should be translated.
  2. +
  3. Text inside ${} isn't translated. This is used to replace variables in code. For instance, if interval = 4, it becomes 4 days in English & Siku 4 in Swahili. Quite nifty if you ask me.
  4. +
+

Code

+
    +
  1. Make your changes.
  2. +
  3. Run pnpm dev to test the changes inside Obsidian.
  4. +
  5. +

    You could create symbolic links between the build files and the Obsidian vault, example:

    +
    # remove existing files in the Obsidian vault
    +rm ~/notes/.obsidian/plugins/obsidian-spaced-repetition/main.js ~/notes/.obsidian/plugins/obsidian-spaced-repetition/manifest.json ~/notes/.obsidian/plugins/obsidian-spaced-repetition/styles.css
    +# use absolute paths
    +ln -s /home/stephen/obsidian-spaced-repetition/build/main.js /home/stephen/notes/.obsidian/plugins/obsidian-spaced-repetition
    +ln -s /home/stephen/obsidian-spaced-repetition/manifest.json /home/stephen/notes/.obsidian/plugins/obsidian-spaced-repetition
    +ln -s /home/stephen/obsidian-spaced-repetition/styles.css /home/stephen/notes/.obsidian/plugins/obsidian-spaced-repetition
    +
    + +
  6. +
  7. +

    Document the "user-facing" changes e.g. new feature, UI change, etc.

    +
  8. +
  9. If your "business logic" is properly decoupled from Obsidian APIs, write some unit tests.
      +
    • This project uses jest, tests are stored in tests/.
    • +
    • pnpm test
    • +
    +
  10. +
  11. Add your change to the [Unreleased] section of the changelog (docs/changelog.md).
      +
    • The format is based on Keep a Changelog, TL;DR:
        +
      • Added for new features.
      • +
      • Changed for changes in existing functionality.
      • +
      • Deprecated for soon-to-be removed features.
      • +
      • Removed for now removed features.
      • +
      • Fixed for any bug fixes.
      • +
      • Security in case of vulnerabilities.
      • +
      +
    • +
    • You can also append a link to your GitHub profile, example:
        +
      • Make flashcard text selectable [@st3v3nmw](https://github.com/st3v3nmw)
      • +
      +
    • +
    +
  12. +
  13. Before pushing your changes, run the linter: pnpm lint
      +
    • Format the code in case any warnings are raised: pnpm format
    • +
    +
  14. +
  15. Open the pull request.
  16. +
+

Documentation

+

The documentation consists of Markdown files which MkDocs converts to static web pages. +Specifically, this project uses MkDocs Material.

+

These files reside in docs/ in the respective language's folder. For instance, English docs are located in docs/en/.

+

The docs are served on https://www.stephenmwangi.com/obsidian-spaced-repetition/.

+

For small changes, you can simply open an pull request for merging (against the master branch). +The changes will be live once a new release is made.

+

For larger diffs, it's important that you check how your docs look like as explained below.

+

Viewing Docs Locally

+

Initial Setup

+
    +
  1. Create a virtual environment: python3 -m venv venv
  2. +
  3. Activate it: . venv/bin/activate
  4. +
  5. Install the required dependencies: pip install -r requirements.txt
  6. +
+

Viewing

+
    +
  1. Activate the virtual environment: . venv/bin/activate
  2. +
  3. Serve the docs: mkdocs serve
  4. +
  5. View your documentation locally on http://127.0.0.1:8000/obsidian-spaced-repetition/, any changes you make will reflect on the browser instantly.
  6. +
+

Translating Documentation

+
    +
  1. Create a folder for your language in docs/ if it doesn't exist. Use the language codes provided here.
  2. +
  3. Add the code from (1) to the MkDocs configuration (mkdocs.yml - plugins.i18n.languages).
  4. +
  5. Copy the files from the English (en) folder into the new folder.
  6. +
  7. Translate then open a pull request.
  8. +
+

Maintenance

+

Releases

+

Example using v1.9.2:

+
    +
  1. Create a new branch: git switch -c release-v1.9.2
  2. +
  3. Bump the plugin version in manifest.json and package.json (following Semantic Versioning).
      +
    • Semantic Versioning TL;DR, given a version number MAJOR.MINOR.PATCH, increment the:
        +
      • MAJOR version when you make incompatible API changes
      • +
      • MINOR version when you add functionality in a backwards compatible manner
      • +
      • PATCH version when you make backwards compatible bug fixes
      • +
      +
    • +
    • If the new version uses new Obsidian APIs, update minAppVersion and versions.json to reflect this.
    • +
    +
  4. +
  5. Run pnpm changelog to update the CHANGELOG.
  6. +
  7. +

    Commit and push the changes:

    +
    git add .
    +git commit -m "Bump version to v1.9.2"
    +git push --set-upstream origin release-v1.9.2
    +
    +
  8. +
  9. +

    Open and merge the PR into master.

    +
  10. +
  11. Locally, switch back to master and pull the changes: git switch master && git pull
  12. +
  13. Create a git tag with the version: git tag 1.9.2
  14. +
  15. Push the tag: git push --tags.
    You're all set! This GitHub action should pick it up, create a release, publish it, and update the live documentation.
  16. +
+
+
+
    +
  1. +

    Check the Obsidian Tasks project which has excellent contribution guidelines

    +
  2. +
+
+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/en/flashcards/index.html b/en/flashcards/index.html new file mode 100644 index 00000000..216ba377 --- /dev/null +++ b/en/flashcards/index.html @@ -0,0 +1,941 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Flashcards - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Flashcards

+

Creating

+

Piotr Wozniak's 20 rules of knowledge formulation is a great introduction on proper flashcard creation.

+

Single-line Basic (Remnote style)

+

The prompt and the answer are separated by :: (this can be configured in settings).

+
the question goes on this side::answer goes here!
+
+

Single-line Reversed

+

Creates two cards side1:::side2 & the reversed version side2:::side1.

+

The prompt and the answer are separated by ::: (this can be configured in settings).

+
the question goes on this side:::answer goes here!
+
+

Note: In the first review, the plugin will show non-reversed card and reversed card. +If Bury sibling cards until the next day? turn on, only non-reversed card will appear.

+

Multi-line Basic

+

The front and the back of the card are separated by ? (this can be configured in settings).

+
Front of multiline
+?
+Backside of multiline card
+
+

These can also span over multiple lines as long as both sides "touch" the ?:

+
As per the definition
+of "multiline" the prompt
+can be on multiple lines
+?
+same goes for
+the answer
+
+

Multi-line Reversed

+

Creates two cards side1??side2 & the reversed version side2??side1.

+

The front and the back of the card are separated by ?? (this can be configured in settings).

+
Front of multiline
+??
+Backside of multiline card
+
+

These can also span over multiple lines as long as both sides "touch" the ??:

+
As per the definition
+of "multiline" the prompt
+can be on multiple lines
+??
+same goes for
+the answer
+
+

Note: The behaviour is same as single line reversed.

+

Cloze cards

+

You can easily add cloze deletion cards using ==highlights==, **bolded text**, or {{text in curly braces}}.

+

These can be turned on or off in settings.

+

Anki style {{c1:This text}} would {{c2:generate}} {{c1:2 cards}} cloze deletions are not currently supported. This feature is being tracked here.

+

Decks

+

Screenshot from 2021-06-05 19-28-24

+

The green and blue counts on the right of each deck name represent due and new cards respectively.

+

Using Obsidian Tags

+
    +
  1. Specify flashcard tags in settings (#flashcards is the default).
  2. +
  3. Tag any notes that you'd like to put flashcards using said tags.
  4. +
+

Hierarchical Tags

+

Note that #flashcards will match nested tags like #flashcards/subdeck/subdeck.

+

Using Folder Structure

+

The plugin will automatically search for folders that contain flashcards & use their paths to create decks & sub-decks i.e. Folder/sub-folder/sub-sub-folderDeck/sub-deck/sub-sub-deck.

+

This is an alternative to the tagging option and can be enabled in settings.

+

Reviewing

+

Once done creating cards, click on the flashcards button on the left ribbon to start reviewing the flashcards. After a card is reviewed, a HTML comment is added containing the next review day, the interval, and the card's ease.

+
<!--SR:!2021-08-20,13,290-->
+
+

Wrapping in a HTML comment makes the scheduling information not visible in the notes preview. For single-line cards, you can choose whether you want the HTML comment on the same line or on a separate line in the settings. Putting them on the same line prevents breaking of list structures in the preview or after auto-formatting.

+

Note that you can skip a card by simply pressing S (case doesn't matter).

+
+

Tip

+

If you're experiencing issues with the size of the modal on mobile devices, +go to settings and set the Flashcard Height Percentage and Flashcard Width Percentage +to 100% to maximize it.

+
+

Faster Review

+

To review faster, use the following keyboard shortcuts:

+
    +
  • Space/Enter => Show answer
  • +
  • 0 => Reset card's progress (Sorta like Again in Anki)
  • +
  • 1 => Review as Hard
  • +
  • 2 or Space => Review as Good
  • +
  • 3 => Review as Easy
  • +
+

Context

+

If the parent note has heading(s), the flashcard will have a title containing the context.

+

Taking the following note:

+
#flashcards
+
+# Trivia
+
+## Capitals
+
+### Africa
+
+Kenya::Nairobi
+
+### North America
+
+Canada::Ottawa
+
+

The flashcard for Kenya::Nairobi will have Trivia > Capitals > Africa as the context/title whereas the flashcard for Canada::Ottawa will have Trivia > Capitals > North America as the context/title.

+

Deleting cards

+

To delete a card, simply delete the scheduling information & the card text.

+

Ignoring cards

+

You can wrap flashcards in HTML comments e.g. <!--Card text <!--SR:2021-08-20,13,290--> --> to prevent it from showing up in your review queues. You can always remove the wrapping comment later.

+

Cramming

+

Currently, the only supported method is "cramming" all cards in a note using the Cram flashcards in this note command. Will work on a per-deck across-all-notes method.

+

Statistics

+

The statistics section can be accessed using the View Statistics command.

+

Forecast

+

Stats on the number of cards due in the future.

+

+

Intervals

+

Stats on delays until cards are shown again.

+

Eases

+

Stats on card eases.

+

Card Types

+

Stats on card types: New, Young, Mature (Have intervals more than 1 month).

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/en/index.html b/en/index.html new file mode 100644 index 00000000..97db3904 --- /dev/null +++ b/en/index.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Index - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Obsidian Spaced Repetition

+

+

Fight the forgetting curve & note aging by reviewing flashcards & notes using spaced repetition on Obsidian.md

+
    +
  • Check the documentation here.
  • +
  • Check the roadmap for upcoming features & fixes.
  • +
  • Raise an issue here if you have a feature request or a bug-report.
  • +
  • Visit the discussions section for Q&A help, feedback, and general discussion.
  • +
  • The plugin has been translated into Arabic / العربية, Chinese (Simplified) / 简体中文, Chinese (Traditional) / 繁體中文, Czech / čeština, German / Deutsch, Korean / 한국어, Japanese / 日本語, Portuguese (Brazil) / Português do Brasil and Russian / русский by the Obsidian community 😄. +
  • +
+

Quick Demo

+ + +

Installation

+

You can easily install the plugin from Obsidian's community plugin section in the Obsidian app (Search for Spaced Repetition).

+

Manual Installation

+

Create an obsidian-spaced-repetition folder under .obsidian/plugins in your vault. Add the main.js, manifest.json, and the styles.css files from the latest release to the folder.

+

Resources

+

YouTube Tutorials

+

Flashcards

+ +

Notes

+
Incremental Writing
+ +

On Spaced Repetition

+ +

Buy Me a Coffee at ko-fi.com

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/en/license/index.html b/en/license/index.html new file mode 100644 index 00000000..65283b59 --- /dev/null +++ b/en/license/index.html @@ -0,0 +1,446 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + License - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

License

+ +

MIT License

+

Copyright (c) 2021 - 2023 Stephen Mwangi

+

Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:

+

The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/en/notes/index.html b/en/notes/index.html new file mode 100644 index 00000000..519c9c7b --- /dev/null +++ b/en/notes/index.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Notes - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Notes

+
    +
  • Notes should be atomic i.e. focus on a single concept.
  • +
  • Notes should be highly linked.
  • +
  • Reviews should start only after properly understanding a concept.
  • +
  • Reviews should be Feynman-technique-esque.
  • +
+

Getting started

+

Tag any notes that you'd like to review as #review. This default tag can be changed in the settings. (You can also use multiple tags)

+

New Notes

+

All "new" notes are listed under New on the right pane (Review Queue). Like so:

+

+

Reviewing

+

Open the file & review it. Once done, choose either the Review: Easy, Review: Good, or the Review: Hard option on the file menu (the three dots). The Easy, Good, or Hard depend on how well you comprehend the material being reviewed.

+

+

Alternatively, you can right click on the file and access the same options:

+

+

The note will then be scheduled appropriately:

+

+

Faster Review

+

Commands to open a note for review, and making review responses are provided. You can create custom hotkeys for them in Settings -> HotKeys. This allows for much faster review.

+

Review Settings

+

Available settings are:

+
    +
  • Choosing whether to open a note at random or the most important note
  • +
  • Choosing whether to open the next note automatically after reviewing another
  • +
+

Scheduled notes

+

Review: N due on the status bar at the bottom of the screen shows how many notes one has to review today (Today's notes + overdue notes). Clicking on that opens one of the notes for review.

+

Alternatively, one can use the Open a note for review command.

+

Review Queue

+
    +
  • Daily review entries are sorted by importance (PageRank)
  • +
+

Incremental Writing

+

This was introduced here by @aviskase.

+

Here are the YouTube videos:

+ +

Brief summary

+

Andy Matuschak uses spaced repetition system for working on writing inbox.

+

In short, there are four possible actions (where x < y):

+
    +
  • skip note (increase interval for x) == mark as good
  • +
  • work on it, mark as fruitful work (decrease interval) == mark as hard
  • +
  • work on it, mark as unfruitful work (increase interval for y) == mark as easy
  • +
  • convert to evergreen note (stop using the space-repetition prompts)
  • +
+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/flashcards/index.html b/flashcards/index.html new file mode 100644 index 00000000..aff548d3 --- /dev/null +++ b/flashcards/index.html @@ -0,0 +1,941 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Flashcards - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Flashcards

+

Creating

+

Piotr Wozniak's 20 rules of knowledge formulation is a great introduction on proper flashcard creation.

+

Single-line Basic (Remnote style)

+

The prompt and the answer are separated by :: (this can be configured in settings).

+
the question goes on this side::answer goes here!
+
+

Single-line Reversed

+

Creates two cards side1:::side2 & the reversed version side2:::side1.

+

The prompt and the answer are separated by ::: (this can be configured in settings).

+
the question goes on this side:::answer goes here!
+
+

Note: In the first review, the plugin will show non-reversed card and reversed card. +If Bury sibling cards until the next day? turn on, only non-reversed card will appear.

+

Multi-line Basic

+

The front and the back of the card are separated by ? (this can be configured in settings).

+
Front of multiline
+?
+Backside of multiline card
+
+

These can also span over multiple lines as long as both sides "touch" the ?:

+
As per the definition
+of "multiline" the prompt
+can be on multiple lines
+?
+same goes for
+the answer
+
+

Multi-line Reversed

+

Creates two cards side1??side2 & the reversed version side2??side1.

+

The front and the back of the card are separated by ?? (this can be configured in settings).

+
Front of multiline
+??
+Backside of multiline card
+
+

These can also span over multiple lines as long as both sides "touch" the ??:

+
As per the definition
+of "multiline" the prompt
+can be on multiple lines
+??
+same goes for
+the answer
+
+

Note: The behaviour is same as single line reversed.

+

Cloze cards

+

You can easily add cloze deletion cards using ==highlights==, **bolded text**, or {{text in curly braces}}.

+

These can be turned on or off in settings.

+

Anki style {{c1:This text}} would {{c2:generate}} {{c1:2 cards}} cloze deletions are not currently supported. This feature is being tracked here.

+

Decks

+

Screenshot from 2021-06-05 19-28-24

+

The green and blue counts on the right of each deck name represent due and new cards respectively.

+

Using Obsidian Tags

+
    +
  1. Specify flashcard tags in settings (#flashcards is the default).
  2. +
  3. Tag any notes that you'd like to put flashcards using said tags.
  4. +
+

Hierarchical Tags

+

Note that #flashcards will match nested tags like #flashcards/subdeck/subdeck.

+

Using Folder Structure

+

The plugin will automatically search for folders that contain flashcards & use their paths to create decks & sub-decks i.e. Folder/sub-folder/sub-sub-folderDeck/sub-deck/sub-sub-deck.

+

This is an alternative to the tagging option and can be enabled in settings.

+

Reviewing

+

Once done creating cards, click on the flashcards button on the left ribbon to start reviewing the flashcards. After a card is reviewed, a HTML comment is added containing the next review day, the interval, and the card's ease.

+
<!--SR:!2021-08-20,13,290-->
+
+

Wrapping in a HTML comment makes the scheduling information not visible in the notes preview. For single-line cards, you can choose whether you want the HTML comment on the same line or on a separate line in the settings. Putting them on the same line prevents breaking of list structures in the preview or after auto-formatting.

+

Note that you can skip a card by simply pressing S (case doesn't matter).

+
+

Tip

+

If you're experiencing issues with the size of the modal on mobile devices, +go to settings and set the Flashcard Height Percentage and Flashcard Width Percentage +to 100% to maximize it.

+
+

Faster Review

+

To review faster, use the following keyboard shortcuts:

+
    +
  • Space/Enter => Show answer
  • +
  • 0 => Reset card's progress (Sorta like Again in Anki)
  • +
  • 1 => Review as Hard
  • +
  • 2 or Space => Review as Good
  • +
  • 3 => Review as Easy
  • +
+

Context

+

If the parent note has heading(s), the flashcard will have a title containing the context.

+

Taking the following note:

+
#flashcards
+
+# Trivia
+
+## Capitals
+
+### Africa
+
+Kenya::Nairobi
+
+### North America
+
+Canada::Ottawa
+
+

The flashcard for Kenya::Nairobi will have Trivia > Capitals > Africa as the context/title whereas the flashcard for Canada::Ottawa will have Trivia > Capitals > North America as the context/title.

+

Deleting cards

+

To delete a card, simply delete the scheduling information & the card text.

+

Ignoring cards

+

You can wrap flashcards in HTML comments e.g. <!--Card text <!--SR:2021-08-20,13,290--> --> to prevent it from showing up in your review queues. You can always remove the wrapping comment later.

+

Cramming

+

Currently, the only supported method is "cramming" all cards in a note using the Cram flashcards in this note command. Will work on a per-deck across-all-notes method.

+

Statistics

+

The statistics section can be accessed using the View Statistics command.

+

Forecast

+

Stats on the number of cards due in the future.

+

+

Intervals

+

Stats on delays until cards are shown again.

+

Eases

+

Stats on card eases.

+

Card Types

+

Stats on card types: New, Young, Mature (Have intervals more than 1 month).

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..c1effa0b --- /dev/null +++ b/index.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Index - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Obsidian Spaced Repetition

+

+

Fight the forgetting curve & note aging by reviewing flashcards & notes using spaced repetition on Obsidian.md

+
    +
  • Check the documentation here.
  • +
  • Check the roadmap for upcoming features & fixes.
  • +
  • Raise an issue here if you have a feature request or a bug-report.
  • +
  • Visit the discussions section for Q&A help, feedback, and general discussion.
  • +
  • The plugin has been translated into Arabic / العربية, Chinese (Simplified) / 简体中文, Chinese (Traditional) / 繁體中文, Czech / čeština, German / Deutsch, Korean / 한국어, Japanese / 日本語, Portuguese (Brazil) / Português do Brasil and Russian / русский by the Obsidian community 😄. +
  • +
+

Quick Demo

+ + +

Installation

+

You can easily install the plugin from Obsidian's community plugin section in the Obsidian app (Search for Spaced Repetition).

+

Manual Installation

+

Create an obsidian-spaced-repetition folder under .obsidian/plugins in your vault. Add the main.js, manifest.json, and the styles.css files from the latest release to the folder.

+

Resources

+

YouTube Tutorials

+

Flashcards

+ +

Notes

+
Incremental Writing
+ +

On Spaced Repetition

+ +

Buy Me a Coffee at ko-fi.com

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/license/index.html b/license/index.html new file mode 100644 index 00000000..d7a70732 --- /dev/null +++ b/license/index.html @@ -0,0 +1,446 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + License - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

License

+ +

MIT License

+

Copyright (c) 2021 - 2023 Stephen Mwangi

+

Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:

+

The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/notes/index.html b/notes/index.html new file mode 100644 index 00000000..79118942 --- /dev/null +++ b/notes/index.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Notes - Obsidian Spaced Repetition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Notes

+
    +
  • Notes should be atomic i.e. focus on a single concept.
  • +
  • Notes should be highly linked.
  • +
  • Reviews should start only after properly understanding a concept.
  • +
  • Reviews should be Feynman-technique-esque.
  • +
+

Getting started

+

Tag any notes that you'd like to review as #review. This default tag can be changed in the settings. (You can also use multiple tags)

+

New Notes

+

All "new" notes are listed under New on the right pane (Review Queue). Like so:

+

+

Reviewing

+

Open the file & review it. Once done, choose either the Review: Easy, Review: Good, or the Review: Hard option on the file menu (the three dots). The Easy, Good, or Hard depend on how well you comprehend the material being reviewed.

+

+

Alternatively, you can right click on the file and access the same options:

+

+

The note will then be scheduled appropriately:

+

+

Faster Review

+

Commands to open a note for review, and making review responses are provided. You can create custom hotkeys for them in Settings -> HotKeys. This allows for much faster review.

+

Review Settings

+

Available settings are:

+
    +
  • Choosing whether to open a note at random or the most important note
  • +
  • Choosing whether to open the next note automatically after reviewing another
  • +
+

Scheduled notes

+

Review: N due on the status bar at the bottom of the screen shows how many notes one has to review today (Today's notes + overdue notes). Clicking on that opens one of the notes for review.

+

Alternatively, one can use the Open a note for review command.

+

Review Queue

+
    +
  • Daily review entries are sorted by importance (PageRank)
  • +
+

Incremental Writing

+

This was introduced here by @aviskase.

+

Here are the YouTube videos:

+ +

Brief summary

+

Andy Matuschak uses spaced repetition system for working on writing inbox.

+

In short, there are four possible actions (where x < y):

+
    +
  • skip note (increase interval for x) == mark as good
  • +
  • work on it, mark as fruitful work (decrease interval) == mark as hard
  • +
  • work on it, mark as unfruitful work (increase interval for y) == mark as easy
  • +
  • convert to evergreen note (stop using the space-repetition prompts)
  • +
+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..fa9c9077 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"changelog/","title":"Changelog","text":""},{"location":"changelog/#changelog","title":"Changelog","text":"

All notable changes to this project will be documented in this file. Dates are displayed in UTC.

Generated by auto-changelog.

"},{"location":"changelog/#1105","title":"1.10.5","text":"
  • Bug edit flashcard sometimes corrupts question text in file #784
  • Bug note review invalid metadata 764 #782
"},{"location":"changelog/#1104","title":"1.10.4","text":"

30 October 2023

  • Bump version to v1.10.4 #780
  • Bug fix: questions now removed from postponement list; etc #775
  • fix: multi-line tag ('$$') converted to single-line ('$') after card reviewed b9c354d
"},{"location":"changelog/#1103","title":"1.10.3","text":"

23 October 2023

  • Bump version to v1.10.3 #772
  • doc: update note about the reversed card #699
  • Fix bugs regarding bury sibling cards #763
"},{"location":"changelog/#1102","title":"1.10.2","text":"

9 October 2023

  • Bump version to 1.10.2 #756
  • refactor: Separate business logic from user interface code #751
  • Remove the spaces before and after the question marks in the multi-line basic flashcards #719
  • chore: Update dependencies 44e9bb6
  • chore: Update dependencies 1f69f96
  • feat: Add E2E testing 1ef0663
"},{"location":"changelog/#1101","title":"1.10.1","text":"

5 May 2023

  • Bump version to v1.10.1 #679
  • style: Fix formatting #678
  • remove skip after modifying card text #671
  • Add translations to the Spanish language. #667
  • Update translations zh-cn.ts and zh-tw.ts #676
  • Close very old issues (>= 1 year) #665
  • Update changelog #664
  • show MAX_INTERVAL unit in title #643
  • Fix issue requiring collapseIcon to be clicked twice to expand/collapsed deck tree #656
  • Update ru.ts #657
  • Consume keyboard event in flashcard modal #637
"},{"location":"changelog/#1100","title":"1.10.0","text":"

6 February 2023

  • Remove custom dir mkdocs setting #622
  • Bump version to v1.10.0 #621
  • Add a skip button to the flashcards menu #620
  • Get rid of Giscus comments #619
  • Fix ar.ts formatting #618
  • update ar.ts for Arabic translation #616
  • Fixed some terms. #611
  • Fix card info #593
  • Add note title to card context #592
  • Update Changelog #591
  • Add per-deck cramming command #515
  • Add flashcards menu #589
  • Add flashcard editing modal #587
  • Update esbuild dep e33ec93
  • Update plugin version 2bf13a9
  • Add skip card logic fef51b6
"},{"location":"changelog/#194","title":"1.9.4","text":"

8 January 2023

  • Bump version to v1.9.4 #588
  • Minor UI fixes on flashcards #586
"},{"location":"changelog/#193","title":"1.9.3","text":"

2 January 2023

  • Bump version to v1.9.3 #576
  • Minor UI and docs fixes #575
"},{"location":"changelog/#192","title":"1.9.2","text":"

2 January 2023

  • Fix changelog path #574
  • Bump version to v1.9.2 #573
  • Update contribution docs #572
  • Add root CONTRIBUTING.md #566
  • Fix release gh-action 2 #565
  • Fix release gh-action #564
  • Update docs #563
  • Add upload docs GitHub action #562
  • Move wiki to GitHub pages #561
  • Update flashcards image formats #560
  • Make flashcard text selectable #559
  • Prevent regex from matching to last --- in file #532
"},{"location":"changelog/#191","title":"1.9.1","text":"

12 December 2022

  • Fix README formatting and bump version #546
  • Fix extra note review panes being added #545
  • Add list of translations into README #544
"},{"location":"changelog/#190","title":"1.9.0","text":"

12 December 2022

  • Fix back button #543
  • Revert to npm over yarn #542
  • Fix zh-TW formatting #541
  • Update dependencies #539
  • Add REVIEW_PANE_ON_STARTUP #540
  • Traditional Chinese strings. (zh-TW) #536
  • Update zh-cn.ts #535
  • Make the note review pane optional #531
  • Add Brazilian Portuguese Translation \ud83c\udde7\ud83c\uddf7 #518
  • Replace crlf to lf on card parse #523
  • style: set the flashcard's font size as user editor, with var(--font-text-size) #480
  • Added new setting to collapse/expand subdecks #510
  • Add curly brackets as option for cloze fields d8c0e9e
  • [feat] add modal history feature c6bb8f0
"},{"location":"changelog/#180","title":"1.8.0","text":"

24 July 2022

  • Regenerate yarn.lock file #474
  • Fix breakage with Obsidian v15.4 and add customizable review buttons #469
  • Bump minimist from 1.2.5 to 1.2.6 #473
  • Bump moment from 2.29.1 to 2.29.4 #472
  • Fixed mistakes in ru.ts #464
  • Add \"ogg\" as supported audio file format #425
  • Update jest config #419
  • fix: handle code fences better #402
  • Add and run prettier #413
  • Translate Korean #417
  • Update zh-cn.ts #416
  • Fix breakage with Obsidian v15.4 and add customizable review buttons (#469) #273
  • add lockfile c386dc3
  • Add localization check bce5c22
  • Upgrade dependencies 9d34c56
"},{"location":"changelog/#172","title":"1.7.2","text":"

21 February 2022

  • Ive done the translation to Russian. [#403`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/403)
  • Add czech translations #391
  • Update zh-cn.ts #364
  • \u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 1f0f46c
  • Intermediate result saving) e35c012
  • Intermediate result saving))) 8ac56ae
"},{"location":"changelog/#171","title":"1.7.1","text":"

2 January 2022

  • Fix textInterval - more accurate calculations 3b0446a
  • Remove dependabot 2236396
  • Fix tag override 07e1de4
"},{"location":"changelog/#170","title":"1.7.0","text":"

1 January 2022

  • Stats & transclusion improvements #358
  • Bump typescript from 4.4.4 to 4.5.4 #355
  • Bump obsidian from 0.12.17 to 0.13.11 #356
  • Bump @types/node from 16.11.17 to 17.0.5 #357
  • Fix first time random card selection #353
  • [Bug fix] for HTML Comment parsing #350
  • Scheduling fixes & tests #352
  • Remove dependence on Obsidian Charts plugin #351
  • Scheduling unit tests #316
  • Changing interpolate to an optional arg of t #315
  • Bump @typescript-eslint/parser from 4.33.0 to 5.8.0 #345
  • Bump @types/node from 16.11.14 to 17.0.1 #344
  • Bump esbuild from 0.13.15 to 0.14.5 #341
  • Bump @typescript-eslint/eslint-plugin from 4.33.0 to 5.7.0 #340
  • Correct notes(s) to note(s) in en.ts lang file #323
  • ja: added Japanese translation #318
  • Bump eslint from 7.32.0 to 8.3.0 #326
  • Overwrite deck on card #299
  • Open file was changed to \"Edit Later\" #300
  • Bump esbuild from 0.12.29 to 0.13.2 #302
  • Updated to display mp3 and webm audio on flashcards #297
  • Added translations DE #298
  • Cram Flashcards #291
  • Fix collapsed/expanded states when redrawing the sidebar #290
  • Using tags from User Preferences and not their full name that includes the sibling #292
  • Change Eases x-axis from DAYS to EASES #285
  • Fix dependencies & esbuild workflow 66766a8
  • Change some innerHTML text to JSX 3623efc
  • transclusions initial implementation 0e12388
"},{"location":"changelog/#162","title":"1.6.2","text":"

29 August 2021

  • Returned cursor position on \"open file\" or \"Edit later\" #281
  • Change \"Open file\" to \"Edit later\" #280
  • Add bolded to cloze cards conversion #277
  • Develop #276
  • Update (see PR notes) #271
  • New Icon for app #275
  • Move to ESBUILD from rollup #268
  • Added for those working with VSCODE #265
  • Roll back caching & more stats #264
  • Fixes #263
  • Switch to esbuild 177bc78
  • Delete main.js 76b94d1
  • Refactor 26d9dbd
"},{"location":"changelog/#161","title":"1.6.1","text":"

19 August 2021

  • Multiple review queues fixes #258
  • Add multiple note review queues & curly braces consistency in blocks #252
  • Fixes #251
  • Bump @types/jest from 26.0.24 to 27.0.1 #245
  • Refactor & change code's line max length #236
  • Merge WIP for multiple review queues #234
  • Add option to ignore folders in note review #232
  • Prettier 1d4bcdc
  • block curly brace consistency d9181f5
  • First pass at implementing \"review decks\". 069619c
"},{"location":"changelog/#160","title":"1.6.0","text":"

8 August 2021

  • Parser tests #230
  • Single & multiline cards #229
  • Fix logger & legacy scheduling #228
  • Generalize flashcards processing & logging #227
  • Caching & settings debounce fix #226
  • Bump @rollup/plugin-commonjs from 19.0.2 to 20.0.0 #225
  • Add single & multiline reversed cards c3e6c0d
  • Fix settings - debounce 17d7496
  • Add caching 3808ce0
"},{"location":"changelog/#158","title":"1.5.8","text":"

4 August 2021

  • Add multilingual support #223
  • Fix bugs with cloze cards & newlines #222
  • Refactor #220
  • Fixes #219
  • Fix statistics view - accumulate overdue cards, linearity #217
  • Go to flashcard position after clicking open file #215
  • Code refactor #214
  • Allow flashcard height and width to be customizable #210
  • Bump @types/node from 15.14.1 to 16.3.0 #188
  • Refactor code 05d3217
  • Create CODE_OF_CONDUCT.md 9798c69
  • rename related to siblings 82651b4
"},{"location":"changelog/#157","title":"1.5.7","text":"

20 June 2021

  • Randomize card order option #170
  • resize image, large screen mode #169
  • per deck totals #168
  • fix bug when parsing nonexistent images #166
  • Parse card only once #165
  • bump version to 1.5.7 856d423
  • randomize card order option 3f2d97e
  • fix bug when parsing nonexistent files c906afe
"},{"location":"changelog/#156","title":"1.5.6","text":"

13 June 2021

  • bump version to 1.5.6 b47915a
  • bug fix ad2f3ec
"},{"location":"changelog/#155","title":"1.5.5","text":"

12 June 2021

  • Cards forecast stats #155
  • started on 'forecast' cdb57d4
  • forecast cee6503
  • refactor ab52d36
"},{"location":"changelog/#154","title":"1.5.4","text":"

11 June 2021

  • bump version to 1.5.4 356fd31
  • fix load balancer bug 317f716
"},{"location":"changelog/#153","title":"1.5.3","text":"

10 June 2021

  • fixes #150
  • Overall deck counts and sync locks #149
  • sync locks 4d4f3d4
  • overall deck counts c7eb5cf
  • bump version to 1.5.3 e4a897c
"},{"location":"changelog/#152","title":"1.5.2","text":"

7 June 2021

  • save buryList data fix #143
  • fix deck transition behavior #142
  • better burying of cards #141
  • fix CSS on light themes #140
  • show folders based on the presence of flashcards instead of files #137
  • show folders based on the presence of flashcards inside of them instead of files a65ca7f
  • bump version to 1.5.2 3ffe4f0
  • make async 0541e77
"},{"location":"changelog/#151","title":"1.5.1","text":"

6 June 2021

  • fix deck counts going into negatives #132
  • bump version to 1.5.1 b309a27
"},{"location":"changelog/#150","title":"1.5.0","text":"

6 June 2021

  • load balancing #131
  • Boost cards after delay. #130
  • fix parsing of http(s) image links #128
  • Bump @rollup/plugin-node-resolve from 9.0.0 to 13.0.0 #126
  • Bump @rollup/plugin-commonjs from 15.1.0 to 19.0.0 #127
  • Bump @rollup/plugin-typescript from 6.1.0 to 8.2.1 #125
  • Bump @types/node from 14.17.2 to 15.12.1 #124
  • Nested decks feature #123
  • showFileNameInFileLink option #116
  • nested decks feature 3214175
  • types 0af6c12
  • Create codeql-analysis.yml 492f9a8
"},{"location":"changelog/#149","title":"1.4.9","text":"

31 May 2021

  • Settings: split tags with newlines and spaces #107
  • Fix dollar signs replacement #106
  • Fix reset progress NaN bug #105
  • bump version to 1.4.9 fe9b37f
  • Remove redundant \\n 83ef968
"},{"location":"changelog/#148","title":"1.4.8","text":"

21 May 2021

  • Ignore codeblocks #98
  • ignore codeblocks 390aa72
  • bump version to 1.4.8 f5d635c
"},{"location":"changelog/#147","title":"1.4.7","text":"

21 May 2021

  • disable cloze cards option #97
  • regexes & fix #95
  • store original front and back text to put back after review #94
  • show card context setting #89
  • fix review flashcards command #85
  • bump version to 1.4.7 8b84184
  • addContextToCard option a4197c3
  • remove these console.logs 4098f10
"},{"location":"changelog/#146","title":"1.4.6","text":"

16 May 2021

  • Rewrite cards with the correct separator 0cde960
  • bump version to 1.4.6 2e46d77
"},{"location":"changelog/#145","title":"1.4.5","text":"

16 May 2021

  • Make flashcard separators configurable #77
  • Indentation to be preserved while making flashcard #75
  • Limit on number of days to display on right panel #74
  • Image support #73
  • Update plugin settings #72
  • Maximum interval option #71
  • Use month(s) & year(s) when intervals get too big #69
  • Shortcut for review flashcards #68
  • maximumInterval option d793c42
  • applyDebounceTimer 3b3ca00
  • Settings sliders ead217d
"},{"location":"changelog/#144","title":"1.4.4","text":"

8 May 2021

  • Fixes for better mobile UI/UX #57
  • fix versions b7cb3cd
  • bump version to 1.4.4 0a59d8f
  • More mobile UI/UX fixes accbf0c
"},{"location":"changelog/#143","title":"1.4.3","text":"

8 May 2021

  • bump version to 1.4.3 #55
  • Change date format to YYYY-MM-DD #54
  • Fix issue with horizontal rules during notes review #51
  • Decks, make flashcards view scrollable #50
  • Refactor #47
  • refactor f633e72
  • started on decks 0c1944e
  • moved some enums & interfaces to types.ts 503ec0f
"},{"location":"changelog/#142","title":"1.4.2","text":"

2 May 2021

  • Setting to remove review options from file menu 953147e
  • bump version to 1.4.2 aafd4ef
  • Update README.md 335bb6f
"},{"location":"changelog/#141","title":"1.4.1","text":"

1 May 2021

  • Fix Broken Link in README #42
  • bump version to 1.4.1 c389a2f
  • Fix broken link in settings 65fe74b
  • Fix Broken Link 3da32ac
"},{"location":"changelog/#140","title":"1.4.0","text":"

1 May 2021

  • Add flashcards count to statusbar, bugs fix #41
  • Reset card's progress #40
  • Cleaned up settings #39
  • Support for cloze deletion cards #38
  • change to ISO8601 dates #37
  • Added support for cloze deletions ef29e14
  • docs d12cb0e
  • Burying of related cards 12344cc
"},{"location":"changelog/#132","title":"1.3.2","text":"

20 April 2021

  • fixes a5edede
  • update plugin description cb779fe
  • bump version to 1.3.2 b6c5317
"},{"location":"changelog/#131","title":"1.3.1","text":"

19 April 2021

  • allow for both kinds of review in the same file 06cda88
  • bump version to 1.3.1 3f52456
  • Update README.md d6686c7
"},{"location":"changelog/#130","title":"1.3.0","text":"

19 April 2021

  • Functional flashcards support (I hope) #23
  • Some work on flashcard support #22
  • Split plugin into separate 'modules' #21
  • split plugin into separate 'modules' df30fb8
  • Flashcard UI/UX efb8d78
  • Flashcards seem to be working ad8b22c
"},{"location":"changelog/#123","title":"1.2.3","text":"

15 April 2021

  • Add a third review state: good #18
  • add a third review state: good 51ea4ec
  • Update README.md 78b83ad
  • Bump version to 1.2.3 0ac4cb1
"},{"location":"changelog/#122","title":"1.2.2","text":"

14 April 2021

  • add EASY and HARD review commands 3be20ce
  • Bump version to 1.2.2 e1bb32f
  • Update README.md 3609e72
"},{"location":"changelog/#121","title":"1.2.1","text":"

14 April 2021

  • make SRS opt-in not opt-out ee0eb3f
  • Update README.md 5217c27
  • Update README.md 3725527
"},{"location":"changelog/#120","title":"1.2.0","text":"

13 April 2021

  • Mechanism to only review certain tags #11
  • Notice on YAML attributes change 852479f
  • bump version to 1.2.0 327f5cd
  • fix 43fb6ce
"},{"location":"changelog/#112","title":"1.1.2","text":"

13 April 2021

  • Update docs #9
  • refactor 9364374
  • Bump version to 1.1.2 c4632c1
  • Update README.md 65c4e4b
"},{"location":"changelog/#111","title":"1.1.1","text":"

12 April 2021

  • Refactor #6
  • refactor #5
  • Added file context menu #3
  • fix 348bdff
  • Update README.md df01880
  • fix initial ease calculation 12f1622
"},{"location":"changelog/#110","title":"1.1.0","text":"

11 April 2021

  • added file context menu 6c19778
"},{"location":"changelog/#101","title":"1.0.1","text":"

11 April 2021

  • refactor f67301e
  • refactor types 3a4c5e0
  • changed plugin name acb5d4a
"},{"location":"changelog/#100","title":"1.0.0","text":"

9 April 2021

  • prettier tab width fix 6bf72b1
  • better handling of new notes 57ca3a9
  • settings input sanitization & prettify 5e68d8b
"},{"location":"license/","title":"License","text":"

MIT License

Copyright (c) 2021 - 2023 Stephen Mwangi

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

"},{"location":"","title":"Obsidian Spaced Repetition","text":"

Fight the forgetting curve & note aging by reviewing flashcards & notes using spaced repetition on Obsidian.md

  • Check the documentation here.
  • Check the roadmap for upcoming features & fixes.
  • Raise an issue here if you have a feature request or a bug-report.
  • Visit the discussions section for Q&A help, feedback, and general discussion.
  • The plugin has been translated into Arabic / \u0627\u0644\u0639\u0631\u0628\u064a\u0629, Chinese (Simplified) / \u7b80\u4f53\u4e2d\u6587, Chinese (Traditional) / \u7e41\u9ad4\u4e2d\u6587, Czech / \u010de\u0161tina, German / Deutsch, Korean / \ud55c\uad6d\uc5b4, Japanese / \u65e5\u672c\u8a9e, Portuguese (Brazil) / Portugu\u00eas do Brasil and Russian / \u0440\u0443\u0441\u0441\u043a\u0438\u0439 by the Obsidian community \ud83d\ude04.
    • To help translate this plugin to your language, check the translation guide here.
"},{"location":"#quick-demo","title":"Quick Demo","text":""},{"location":"#installation","title":"Installation","text":"

You can easily install the plugin from Obsidian's community plugin section in the Obsidian app (Search for Spaced Repetition).

"},{"location":"#manual-installation","title":"Manual Installation","text":"

Create an obsidian-spaced-repetition folder under .obsidian/plugins in your vault. Add the main.js, manifest.json, and the styles.css files from the latest release to the folder.

"},{"location":"#resources","title":"Resources","text":""},{"location":"#youtube-tutorials","title":"YouTube Tutorials","text":""},{"location":"#flashcards","title":"Flashcards","text":"
  • PRODUCTIVELY Learning New Things Using Obsidian by @FromSergio
"},{"location":"#notes","title":"Notes","text":""},{"location":"#incremental-writing","title":"Incremental Writing","text":"
  • Obsidian: inbox review with spaced repetition by @aviskase
  • \u0420\u0430\u0437\u0433\u0440\u0435\u0431\u0430\u0442\u0435\u043b\u044c \u0438\u043d\u0431\u043e\u043a\u0441\u0430 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043a\u0430\u043a \u0443 Andy Matuschak \u0432 Obsidian by @YuliyaBagriy_ru
"},{"location":"#on-spaced-repetition","title":"On Spaced Repetition","text":"
  • How to Remember Anything Forever-Ish by Nicky Case
  • Spaced Repetition for Efficient Learning by Gwern
  • 20 rules of knowledge formulation by Dr. Piotr Wozniak
"},{"location":"algorithms/","title":"Algorithms","text":""},{"location":"algorithms/#sm-2","title":"SM-2","text":"

Warning

Note that this hasn't been updated in a while, please see the code.

(It's the same as that used for flashcards - apart from the PageRanks)

  • The algorithm is a variant of Anki's algorithm which is based on the SM-2 algorithm.
  • It supports ternary reviews i.e. a concept is either hard, good, or easy at the time of review.
  • initial ease is weighted (using max_link_factor) depending on the average ease of linked notes, note importance, and the base ease.
    • if link_count > 0: initial_ease = (1 - link_contribution) * base_ease + link_contribution * average_ease
      • link_contribution = max_link_factor * min(1.0, log(link_count + 0.5) / log(64)) (cater for uncertainty)
    • The importance of the different concepts/notes is determined using the PageRank algorithm (not all notes are created equal xD)
      • On most occasions, the most fundamental concepts/notes have higher importance
  • If the user reviews a concept/note as:
    • easy, the ease increases by 20 and the interval changes to old_interval * new_ease / 100 * 1.3 (the 1.3 is the easy bonus)
    • good, the ease remains unchanged and the interval changes to old_interval * old_ease / 100
    • hard, the ease decreases by 20 and the interval changes to old_interval * 0.5
      • The 0.5 can be modified in settings
      • minimum ease = 130
    • For 8 or more days:
      • interval += random_choice({-fuzz, 0, +fuzz})
        • where fuzz = ceil(0.05 * interval)
        • Anki docs: > \"[...] Anki also applies a small amount of random \u201cfuzz\u201d to prevent cards that were introduced at the same time and given the same ratings from sticking together and always coming up for review on the same day.\"
  • The scheduling information is stored in the YAML front matter
"},{"location":"contributing/","title":"Contributing","text":"

First off, thanks for wanting to contribute to the Spaced Repetition plugin!

"},{"location":"contributing/#bug-reports-feature-requests","title":"Bug Reports & Feature Requests","text":"
  • Check the roadmap for upcoming features & fixes.
  • Raise an issue here if you have a feature request or a bug report.
  • Visit the discussions section for Q&A help, feedback, and general discussion.
"},{"location":"contributing/#translating","title":"Translating","text":""},{"location":"contributing/#steps","title":"Steps","text":"

To help translate the plugin to your language:

  1. Fork the repository.
  2. Copy the entries from src/lang/locale/en.ts to the proper file in src/lang/locale/ (i.e. fr.ts for French, or sw.ts for Swahili). The locale codes are IETF language tags.
  3. Translate,
  4. Then open a pull request,
"},{"location":"contributing/#example","title":"Example","text":"

Sample en.ts file:

// English\nexport default {\nEASY: \"Easy\",\nSHOW_ANSWER: \"Show Answer\",\nDAYS_STR_IVL: \"${interval} days\",\nCHECK_ALGORITHM_WIKI:\n'For more information, check the <a href=\"${algo_url}\">algorithm implementation</a>.',\n};\n

Equivalent sw.ts file:

// Swahili\nexport default {\nEASY: \"Rahisi\",\nSHOW_ANSWER: \"Onyesha Jibu\",\nDAYS_STR_IVL: \"Siku ${interval}\",\nCHECK_ALGORITHM_WIKI:\n'Kwa habari zaidi, angalia <a href=\"${algo_url}\">utekelezaji wa algorithm</a>.',\n};\n

A part of that last one is uhh, Google translated, I have a working understanding of Swahili but not enough to write computerese lol.

Please note that:

  1. Only the strings(templates) on the right of the key should be translated.
  2. Text inside ${} isn't translated. This is used to replace variables in code. For instance, if interval = 4, it becomes 4 days in English & Siku 4 in Swahili. Quite nifty if you ask me.
"},{"location":"contributing/#code","title":"Code","text":"
  1. Make your changes.
  2. Run pnpm dev to test the changes inside Obsidian.
  3. You could create symbolic links between the build files and the Obsidian vault, example:

    # remove existing files in the Obsidian vault\nrm ~/notes/.obsidian/plugins/obsidian-spaced-repetition/main.js ~/notes/.obsidian/plugins/obsidian-spaced-repetition/manifest.json ~/notes/.obsidian/plugins/obsidian-spaced-repetition/styles.css\n# use absolute paths\nln -s /home/stephen/obsidian-spaced-repetition/build/main.js /home/stephen/notes/.obsidian/plugins/obsidian-spaced-repetition\nln -s /home/stephen/obsidian-spaced-repetition/manifest.json /home/stephen/notes/.obsidian/plugins/obsidian-spaced-repetition\nln -s /home/stephen/obsidian-spaced-repetition/styles.css /home/stephen/notes/.obsidian/plugins/obsidian-spaced-repetition\n
    • This can be coupled with the Hot Reload plugin
  4. Document the \"user-facing\" changes e.g. new feature, UI change, etc.

  5. If your \"business logic\" is properly decoupled from Obsidian APIs, write some unit tests.
    • This project uses jest, tests are stored in tests/.
    • pnpm test
  6. Add your change to the [Unreleased] section of the changelog (docs/changelog.md).
    • The format is based on Keep a Changelog, TL;DR:
      • Added for new features.
      • Changed for changes in existing functionality.
      • Deprecated for soon-to-be removed features.
      • Removed for now removed features.
      • Fixed for any bug fixes.
      • Security in case of vulnerabilities.
    • You can also append a link to your GitHub profile, example:
      • Make flashcard text selectable [@st3v3nmw](https://github.com/st3v3nmw)
  7. Before pushing your changes, run the linter: pnpm lint
    • Format the code in case any warnings are raised: pnpm format
  8. Open the pull request.
"},{"location":"contributing/#documentation","title":"Documentation","text":"

The documentation consists of Markdown files which MkDocs converts to static web pages. Specifically, this project uses MkDocs Material.

These files reside in docs/ in the respective language's folder. For instance, English docs are located in docs/en/.

The docs are served on https://www.stephenmwangi.com/obsidian-spaced-repetition/.

For small changes, you can simply open an pull request for merging (against the master branch). The changes will be live once a new release is made.

For larger diffs, it's important that you check how your docs look like as explained below.

"},{"location":"contributing/#viewing-docs-locally","title":"Viewing Docs Locally","text":""},{"location":"contributing/#initial-setup","title":"Initial Setup","text":"
  1. Create a virtual environment: python3 -m venv venv
  2. Activate it: . venv/bin/activate
  3. Install the required dependencies: pip install -r requirements.txt
"},{"location":"contributing/#viewing","title":"Viewing","text":"
  1. Activate the virtual environment: . venv/bin/activate
  2. Serve the docs: mkdocs serve
  3. View your documentation locally on http://127.0.0.1:8000/obsidian-spaced-repetition/, any changes you make will reflect on the browser instantly.
"},{"location":"contributing/#translating-documentation","title":"Translating Documentation","text":"
  1. Create a folder for your language in docs/ if it doesn't exist. Use the language codes provided here.
  2. Add the code from (1) to the MkDocs configuration (mkdocs.yml - plugins.i18n.languages).
  3. Copy the files from the English (en) folder into the new folder.
  4. Translate then open a pull request.
"},{"location":"contributing/#maintenance","title":"Maintenance","text":""},{"location":"contributing/#releases","title":"Releases","text":"

Example using v1.9.2:

  1. Create a new branch: git switch -c release-v1.9.2
  2. Bump the plugin version in manifest.json and package.json (following Semantic Versioning).
    • Semantic Versioning TL;DR, given a version number MAJOR.MINOR.PATCH, increment the:
      • MAJOR version when you make incompatible API changes
      • MINOR version when you add functionality in a backwards compatible manner
      • PATCH version when you make backwards compatible bug fixes
    • If the new version uses new Obsidian APIs, update minAppVersion and versions.json to reflect this.
  3. Run pnpm changelog to update the CHANGELOG.
  4. Commit and push the changes:

    git add .\ngit commit -m \"Bump version to v1.9.2\"\ngit push --set-upstream origin release-v1.9.2\n
  5. Open and merge the PR into master.

  6. Locally, switch back to master and pull the changes: git switch master && git pull
  7. Create a git tag with the version: git tag 1.9.2
  8. Push the tag: git push --tags. You're all set! This GitHub action should pick it up, create a release, publish it, and update the live documentation.
  1. Check the Obsidian Tasks project which has excellent contribution guidelines.\u00a0\u21a9

"},{"location":"flashcards/","title":"Flashcards","text":""},{"location":"flashcards/#creating","title":"Creating","text":"

Piotr Wozniak's 20 rules of knowledge formulation is a great introduction on proper flashcard creation.

"},{"location":"flashcards/#single-line-basic-remnote-style","title":"Single-line Basic (Remnote style)","text":"

The prompt and the answer are separated by :: (this can be configured in settings).

the question goes on this side::answer goes here!\n
"},{"location":"flashcards/#single-line-reversed","title":"Single-line Reversed","text":"

Creates two cards side1:::side2 & the reversed version side2:::side1.

The prompt and the answer are separated by ::: (this can be configured in settings).

the question goes on this side:::answer goes here!\n

Note: In the first review, the plugin will show non-reversed card and reversed card. If Bury sibling cards until the next day? turn on, only non-reversed card will appear.

"},{"location":"flashcards/#multi-line-basic","title":"Multi-line Basic","text":"

The front and the back of the card are separated by ? (this can be configured in settings).

Front of multiline\n?\nBackside of multiline card\n

These can also span over multiple lines as long as both sides \"touch\" the ?:

As per the definition\nof \"multiline\" the prompt\ncan be on multiple lines\n?\nsame goes for\nthe answer\n
"},{"location":"flashcards/#multi-line-reversed","title":"Multi-line Reversed","text":"

Creates two cards side1??side2 & the reversed version side2??side1.

The front and the back of the card are separated by ?? (this can be configured in settings).

Front of multiline\n??\nBackside of multiline card\n

These can also span over multiple lines as long as both sides \"touch\" the ??:

As per the definition\nof \"multiline\" the prompt\ncan be on multiple lines\n??\nsame goes for\nthe answer\n

Note: The behaviour is same as single line reversed.

"},{"location":"flashcards/#cloze-cards","title":"Cloze cards","text":"

You can easily add cloze deletion cards using ==highlights==, **bolded text**, or {{text in curly braces}}.

These can be turned on or off in settings.

Anki style {{c1:This text}} would {{c2:generate}} {{c1:2 cards}} cloze deletions are not currently supported. This feature is being tracked here.

"},{"location":"flashcards/#decks","title":"Decks","text":"

The green and blue counts on the right of each deck name represent due and new cards respectively.

"},{"location":"flashcards/#using-obsidian-tags","title":"Using Obsidian Tags","text":"
  1. Specify flashcard tags in settings (#flashcards is the default).
  2. Tag any notes that you'd like to put flashcards using said tags.
"},{"location":"flashcards/#hierarchical-tags","title":"Hierarchical Tags","text":"

Note that #flashcards will match nested tags like #flashcards/subdeck/subdeck.

"},{"location":"flashcards/#using-folder-structure","title":"Using Folder Structure","text":"

The plugin will automatically search for folders that contain flashcards & use their paths to create decks & sub-decks i.e. Folder/sub-folder/sub-sub-folder \u21d4 Deck/sub-deck/sub-sub-deck.

This is an alternative to the tagging option and can be enabled in settings.

"},{"location":"flashcards/#reviewing","title":"Reviewing","text":"

Once done creating cards, click on the flashcards button on the left ribbon to start reviewing the flashcards. After a card is reviewed, a HTML comment is added containing the next review day, the interval, and the card's ease.

<!--SR:!2021-08-20,13,290-->\n

Wrapping in a HTML comment makes the scheduling information not visible in the notes preview. For single-line cards, you can choose whether you want the HTML comment on the same line or on a separate line in the settings. Putting them on the same line prevents breaking of list structures in the preview or after auto-formatting.

Note that you can skip a card by simply pressing S (case doesn't matter).

Tip

If you're experiencing issues with the size of the modal on mobile devices, go to settings and set the Flashcard Height Percentage and Flashcard Width Percentage to 100% to maximize it.

"},{"location":"flashcards/#faster-review","title":"Faster Review","text":"

To review faster, use the following keyboard shortcuts:

  • Space/Enter => Show answer
  • 0 => Reset card's progress (Sorta like Again in Anki)
  • 1 => Review as Hard
  • 2 or Space => Review as Good
  • 3 => Review as Easy
"},{"location":"flashcards/#context","title":"Context","text":"

If the parent note has heading(s), the flashcard will have a title containing the context.

Taking the following note:

#flashcards\n# Trivia\n## Capitals\n### Africa\nKenya::Nairobi\n\n### North America\nCanada::Ottawa\n

The flashcard for Kenya::Nairobi will have Trivia > Capitals > Africa as the context/title whereas the flashcard for Canada::Ottawa will have Trivia > Capitals > North America as the context/title.

"},{"location":"flashcards/#deleting-cards","title":"Deleting cards","text":"

To delete a card, simply delete the scheduling information & the card text.

"},{"location":"flashcards/#ignoring-cards","title":"Ignoring cards","text":"

You can wrap flashcards in HTML comments e.g. <!--Card text <!--SR:2021-08-20,13,290--> --> to prevent it from showing up in your review queues. You can always remove the wrapping comment later.

"},{"location":"flashcards/#cramming","title":"Cramming","text":"

Currently, the only supported method is \"cramming\" all cards in a note using the Cram flashcards in this note command. Will work on a per-deck across-all-notes method.

"},{"location":"flashcards/#statistics","title":"Statistics","text":"

The statistics section can be accessed using the View Statistics command.

"},{"location":"flashcards/#forecast","title":"Forecast","text":"

Stats on the number of cards due in the future.

"},{"location":"flashcards/#intervals","title":"Intervals","text":"

Stats on delays until cards are shown again.

"},{"location":"flashcards/#eases","title":"Eases","text":"

Stats on card eases.

"},{"location":"flashcards/#card-types","title":"Card Types","text":"

Stats on card types: New, Young, Mature (Have intervals more than 1 month).

"},{"location":"notes/","title":"Notes","text":"
  • Notes should be atomic i.e. focus on a single concept.
  • Notes should be highly linked.
  • Reviews should start only after properly understanding a concept.
  • Reviews should be Feynman-technique-esque.
"},{"location":"notes/#getting-started","title":"Getting started","text":"

Tag any notes that you'd like to review as #review. This default tag can be changed in the settings. (You can also use multiple tags)

"},{"location":"notes/#new-notes","title":"New Notes","text":"

All \"new\" notes are listed under New on the right pane (Review Queue). Like so:

"},{"location":"notes/#reviewing","title":"Reviewing","text":"

Open the file & review it. Once done, choose either the Review: Easy, Review: Good, or the Review: Hard option on the file menu (the three dots). The Easy, Good, or Hard depend on how well you comprehend the material being reviewed.

Alternatively, you can right click on the file and access the same options:

The note will then be scheduled appropriately:

"},{"location":"notes/#faster-review","title":"Faster Review","text":"

Commands to open a note for review, and making review responses are provided. You can create custom hotkeys for them in Settings -> HotKeys. This allows for much faster review.

"},{"location":"notes/#review-settings","title":"Review Settings","text":"

Available settings are:

  • Choosing whether to open a note at random or the most important note
  • Choosing whether to open the next note automatically after reviewing another
"},{"location":"notes/#scheduled-notes","title":"Scheduled notes","text":"

Review: N due on the status bar at the bottom of the screen shows how many notes one has to review today (Today's notes + overdue notes). Clicking on that opens one of the notes for review.

Alternatively, one can use the Open a note for review command.

"},{"location":"notes/#review-queue","title":"Review Queue","text":"
  • Daily review entries are sorted by importance (PageRank)
"},{"location":"notes/#incremental-writing","title":"Incremental Writing","text":"

This was introduced here by @aviskase.

Here are the YouTube videos:

  • English: Obsidian: inbox review with spaced repetition
  • Russian / \u0440\u0443\u0441\u0441\u043a\u0438\u0439: Yuliya Bagriy - \u0420\u0430\u0437\u0433\u0440\u0435\u0431\u0430\u0442\u0435\u043b\u044c \u0438\u043d\u0431\u043e\u043a\u0441\u0430 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043a\u0430\u043a \u0443 Andy Matuschak \u0432 Obsidian
"},{"location":"notes/#brief-summary","title":"Brief summary","text":"

Andy Matuschak uses spaced repetition system for working on writing inbox.

In short, there are four possible actions (where x < y):

  • skip note (increase interval for x) == mark as good
  • work on it, mark as fruitful work (decrease interval) == mark as hard
  • work on it, mark as unfruitful work (increase interval for y) == mark as easy
  • convert to evergreen note (stop using the space-repetition prompts)
"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..1d1f0ae8 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,52 @@ + + + + https://www.stephenmwangi.com/obsidian-spaced-repetition/changelog/ + 2023-11-12 + daily + + + + + https://www.stephenmwangi.com/obsidian-spaced-repetition/license/ + 2023-11-12 + daily + + + + + https://www.stephenmwangi.com/obsidian-spaced-repetition/ + 2023-11-12 + daily + + + + + https://www.stephenmwangi.com/obsidian-spaced-repetition/algorithms/ + 2023-11-12 + daily + + + + + https://www.stephenmwangi.com/obsidian-spaced-repetition/contributing/ + 2023-11-12 + daily + + + + + https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/ + 2023-11-12 + daily + + + + + https://www.stephenmwangi.com/obsidian-spaced-repetition/notes/ + 2023-11-12 + daily + + + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..b25e31acdb5b368f30d88bea04f6912b309e8186 GIT binary patch literal 361 zcmV-v0hazBiwFp+&roFo|8r?{Wo=<_E_iKh0Ns|oZi6rofcHEF@(vEkQX)dOK0*5c zj=5l~{-M50N#DK(lFA*rR22hWjL&yxzE8-aKHaRzJ|Lj>?#Rkw%QA4%x7u|__WJUi zKe1D@sjtBxP!^LN9+@KQ51bFfP@pETqQ}CAj-ym@f&3oi+oED~&EclVnje+JeyS;} zs^ZfwYc^RN<5~05G-~5zGnV1wM1o#{vx9J*E~K~IpHa73xEy;Sq0IyIK$;>Emnvp~ z@g1-E*eLBQkgRW;-FCOn%Q7!_G36dh(&i4A0PjsJwE3)g5=rtVgoDxUEejAyg&_z| z5U@-IxEL`C1vjr|5q~0r6pHcW6=r+