From 7174dfb8c9f9d9e522f063893f70dea50f1e525d Mon Sep 17 00:00:00 2001 From: DanyLE Date: Sat, 8 Jul 2023 13:34:27 +0200 Subject: [PATCH] Blogger: fix blog saving bug --- Blogger/README.md | 1 + Blogger/build/debug/README.md | 1 + Blogger/build/debug/main.js | 2 +- Blogger/build/debug/package.json | 2 +- Blogger/build/release/Blogger.zip | Bin 15889 -> 16025 bytes Blogger/main.ts | 4 +++- Blogger/package.json | 2 +- packages.json | 2 +- release/Blogger.md | 1 + release/Blogger.zip | Bin 15889 -> 16025 bytes release/packages.json | 2 +- 11 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Blogger/README.md b/Blogger/README.md index a0f637b..d39795f 100644 --- a/Blogger/README.md +++ b/Blogger/README.md @@ -6,6 +6,7 @@ Blackend for my blog at https://blog.iohub.dev ## Change logs ### v0.2.x-a +* Patch 13: fix bug on blog save * Patch 12: support send mail via SSL * Patch 11: Add TFIDF analyse functionality * Patch 10: Migrate code to typescript, use SQLiteDB lib for database access diff --git a/Blogger/build/debug/README.md b/Blogger/build/debug/README.md index a0f637b..d39795f 100644 --- a/Blogger/build/debug/README.md +++ b/Blogger/build/debug/README.md @@ -6,6 +6,7 @@ Blackend for my blog at https://blog.iohub.dev ## Change logs ### v0.2.x-a +* Patch 13: fix bug on blog save * Patch 12: support send mail via SSL * Patch 11: Add TFIDF analyse functionality * Patch 10: Migrate code to typescript, use SQLiteDB lib for database access diff --git a/Blogger/build/debug/main.js b/Blogger/build/debug/main.js index 0d4b35d..01501bc 100644 --- a/Blogger/build/debug/main.js +++ b/Blogger/build/debug/main.js @@ -1 +1 @@ -var OS;!function(t){let e;!function(t){class e extends t.BaseApplication{constructor(t){super("Blogger",t),this.previewOn=!1}async init_db(){try{const e=await this.openDialog("FileDialog",{title:__("Open/create new database"),file:"Untitled.db"});var t=e.file.path.asFileHandle();"file"===e.file.type&&(t=t.parent());const i=`${t.path}/${e.name}`.asFileHandle();this.dbhandle=("sqlite://"+i.genealogy.join("/")).asFileHandle();const a=await this.dbhandle.read();if(!a.user){this.dbhandle.cache={address:"TEXT",Phone:"TEXT",shortbiblio:"TEXT",fullname:"TEXT",email:"TEXT",url:"TEXT",photo:"TEXT"};const t=await this.dbhandle.write("user");if(t.error)throw new Error(t.error)}if(!a.cv_cat){this.dbhandle.cache={publish:"NUMERIC",name:"TEXT",pid:"NUMERIC"};const t=await this.dbhandle.write("cv_cat");if(t.error)throw new Error(t.error)}if(!a.cv_sections){this.dbhandle.cache={title:"TEXT",start:"NUMERIC",location:"TEXT",end:"NUMERIC",content:"TEXT",subtitle:"TEXT",publish:"NUMERIC",cid:"NUMERIC"};const t=await this.dbhandle.write("cv_sections");if(t.error)throw new Error(t.error)}if(!a.blogs){this.dbhandle.cache={tags:"TEXT",content:"TEXT",utime:"NUMERIC",rendered:"TEXT",title:"TEXT",utimestr:"TEXT",ctime:"NUMERIC",ctimestr:"TEXT",publish:"INTEGER DEFAULT 0"};const t=await this.dbhandle.write("blogs");if(t.error)throw new Error(t.error)}if(!a.st_similarity){this.dbhandle.cache={pid:"NUMERIC",sid:"NUMERIC",score:"NUMERIC"};const t=await this.dbhandle.write("st_similarity");if(t.error)throw new Error(t.error)}if(!a.subscribers){this.dbhandle.cache={name:"TEXT",email:"TEXT"};const t=await this.dbhandle.write("subscribers");if(t.error)throw new Error(t.error)}this.userdb=(this.dbhandle.path+"@user").asFileHandle(),this.cvcatdb=(this.dbhandle.path+"@cv_cat").asFileHandle(),this.cvsecdb=(this.dbhandle.path+"@cv_sections").asFileHandle(),this.blogdb=(this.dbhandle.path+"@blogs").asFileHandle(),this.subdb=(this.dbhandle.path+"@subscribers").asFileHandle(),this.last_ctime=0,this.bloglist.data=[],this.loadBlogs()}catch(t){this.error(__("Unable to init database file: {0}",t.toString()),t),this.dbhandle=void 0}}menu(){return[{text:"__(Open/Create database)",onmenuselect:t=>{this.init_db()}}]}main(){this.user={},this.cvlist=this.find("cv-list"),this.cvlist.ontreeselect=t=>{if(!t)return;const{data:e}=t.data.item;return this.CVSectionByCID(Number(e.id))},this.inputtags=this.find("input-tags"),this.bloglist=this.find("blog-list"),this.seclist=this.find("cv-sec-list");let e=this.find("photo");return $(e).on("click",async t=>{try{const t=await this.openDialog("FileDialog",{title:__("Select image file"),mimes:["image/.*"]});return e.value=t.file.path}catch(t){return this.error(__("Unable to get file"),t)}}),this.tabcontainer=this.find("tabcontainer"),this.tabcontainer.ontabselect=t=>this.fetchData(t.data.container.aid),this.find("bt-user-save").onbtclick=t=>this.saveUser(),this.find("blog-load-more").onbtclick=t=>{this.loadBlogs()},this.find("cv-cat-add").onbtclick=async e=>{try{const e=await this.fetchCVCat(),i=await this.openDialog(new t.blogger.BloggerCategoryDialog,{title:__("Add category"),tree:e});this.cvcatdb.cache={name:i.value,pid:i.p.id,publish:1};const a=await this.cvcatdb.write(void 0);if(a.error)throw new Error(a.error);await this.refreshCVCat()}catch(e){this.error(__("cv-cat-add: {0}",e.toString()),e)}},this.find("cv-cat-edit").onbtclick=async e=>{try{const e=this.cvlist.selectedItem;if(!e)return;const i=e.data;if(!i)return;const a=await this.fetchCVCat(),s=await this.openDialog(new t.blogger.BloggerCategoryDialog,{title:__("Edit category"),tree:a,cat:i}),n=i.$vfs;n.cache={id:i.id,publish:i.publish,pid:s.p.id,name:s.value};const r=await n.write(void 0);if(r.error)throw new Error(r.error);await this.refreshCVCat()}catch(e){this.error(__("cv-cat-edit: {0}",e.toString()),e)}},this.find("cv-cat-del").onbtclick=async t=>{try{const t=this.cvlist.selectedItem;if(!t)return;const e=t.data;if(!e)return;if(!await this.openDialog("YesNoDialog",{title:__("Delete category"),iconclass:"fa fa-question-circle",text:__("Do you really want to delete: {0}?",e.name)}))return;await this.deleteCVCat(e)}catch(t){this.error(__("cv-cat-del: {0}",t.toString()),t)}},this.find("cv-sec-add").onbtclick=async e=>{try{const e=this.cvlist.selectedItem;if(!e)return;const i=e.data;if(!i||"0"===i.id)return this.toast(__("Please select a category"));const a=await this.openDialog(new t.blogger.BloggerCVSectionDiaglog,{title:__("New section entry for {0}",i.name)});a.cid=Number(i.id),a.start=Number(a.start),a.end=Number(a.end),this.cvsecdb.cache=a;const s=await this.cvsecdb.write(void 0);if(s.error)throw new Error(s.error);await this.CVSectionByCID(Number(i.id))}catch(e){this.error(__("cv-sec-add: {0}",e.toString()),e)}},this.find("cv-sec-move").onbtclick=async e=>{try{const e=this.seclist.selectedItem;if(!e)return this.toast(__("Please select a section to move"));const i=e.data,a=i.$vfs;console.log(a);const s=await this.fetchCVCat(),n=await this.openDialog(new t.blogger.BloggerCategoryDialog,{title:__("Move to"),tree:s,selonly:!0});a.cache={id:i.id,cid:n.p.id};const r=await a.write(void 0);if(r.error)throw new Error(r.error);await this.CVSectionByCID(i.cid),this.seclist.unselect()}catch(e){this.error(__("cv-sec-move: {0}",e.toString()),e)}},this.find("cv-sec-edit").onbtclick=async e=>{try{const e=this.seclist.selectedItem;if(!e)return this.toast(__("Please select a section to edit"));const i=e.data,a=await this.openDialog(new t.blogger.BloggerCVSectionDiaglog,{title:__("Modify section entry"),section:i});a.cid=Number(i.cid),a.start=Number(a.start),a.end=Number(a.end);const s=i.$vfs;s.cache=a;const n=await s.write(void 0);if(n.error)throw new Error(n.error);await this.CVSectionByCID(Number(i.cid))}catch(e){this.error(__("cv-sec-edit: {0}",e.toString()),e)}},this.seclist.onitemclose=t=>{if(!t)return;const e=t.data.item.data;return this.openDialog("YesNoDialog",{iconclass:"fa fa-question-circle",text:__("Do you really want to delete: {0}?",e.title)}).then(async i=>{if(i)try{const i=await this.cvsecdb.remove({where:{id:e.id}});if(i.error)throw new Error(i.error);return this.seclist.delete(t.data.item)}catch(t){return this.error(__("Cannot delete the section: {0}",t.toString()),t)}}),!1},this.editor=new EasyMDE({element:this.find("markarea"),autoDownloadFontAwesome:!1,autofocus:!0,tabSize:4,indentWithTabs:!0,toolbar:[{name:__("New"),className:"fa fa-file",action:t=>(this.bloglist.unselect(),this.clearEditor())},{name:__("Save"),className:"fa fa-save",action:t=>this.saveBlog()},"|","bold","italic","heading","|","quote","code","unordered-list","ordered-list","|","link","image","table","horizontal-rule",{name:"image",className:"fa fa-file-image-o",action:t=>this.openDialog("FileDialog",{title:__("Select image file"),mimes:["image/.*"]}).then(t=>t.file.path.asFileHandle().publish().then(t=>this.editor.codemirror.getDoc().replaceSelection(`![](${this._api.handle.shared}/${t.result})`)).catch(t=>this.error(__("Cannot export file for embedding to text"),t)))},{name:"Youtube",className:"fa fa-youtube",action:t=>this.editor.codemirror.getDoc().replaceSelection("[[youtube:]]")},"|",{name:__("Preview"),className:"fa fa-eye no-disable",action:t=>{this.previewOn=!this.previewOn,EasyMDE.togglePreview(t),renderMathInElement(this.find("editor-container"))}},"|",{name:__("Send mail"),className:"fa fa-paper-plane",action:async e=>{try{const e=await this.subdb.read(),i=this.bloglist.selectedItem;if(!i)return this.error(__("No post selected"));const a=i.data;await this.openDialog(new t.blogger.BloggerSendmailDiaglog,{title:__("Send mail"),content:this.editor.value(),mails:e,id:a.id}),this.toast(__("Emails sent"))}catch(e){this.error(__("Error sending mails: {0}",e.toString()),e)}}},"|",{name:__("TFIDF analyse"),className:"fa fa-area-chart",action:async t=>{try{const t=await this.openDialog("PromptDialog",{title:__("TFIDF Analyse"),text:__("Max number of related posts to keep per post?"),value:"5"}),e={path:this.meta().path+"/api/ai/analyse.lua",parameters:{dbpath:this.dbhandle.info.file.path,top:parseInt(t)}},i=await this._api.apigateway(e,!1);if(i.error)throw new Error(i.error);this.toast(i.result)}catch(t){this.error(__("Error analysing posts: {0}",t.toString()),t)}}}]}),this.bloglist.onlistselect=async t=>{const e=this.bloglist.selectedItem;if(!e)return;const i=e.data;if(i)try{const t=await this.blogdb.read({where:{id:Number(i.id)}});if(!t||0==t.length)throw new Error(__("No record found for ID {}",i.id).__());const e=t[0];return this.editor.value(e.content),this.inputtags.value=e.tags,this.find("blog-publish").swon=!!Number(e.publish)}catch(t){return this.error(__("Cannot fetch the entry content"),t)}},this.bloglist.onitemclose=t=>{if(!t)return;const e=t.data.item,i=e.data;return this.openDialog("YesNoDialog",{title:__("Delete a post"),iconclass:"fa fa-question-circle",text:__("Do you really want to delete this post ?")}).then(async t=>{if(!t)return;const a=await this.blogdb.remove({where:{id:Number(i.id)}});if(a.error)throw new Error(a.error);return this.bloglist.delete(e),this.bloglist.unselect(),this.clearEditor()}),!1},this.bindKey("CTRL-S",()=>{const t=this.tabcontainer.selectedTab;if(t&&"blog-container"===t.container.aid)return this.saveBlog()}),this.on("resize",()=>this.resizeContent()),this.resizeContent(),this.init_db()}fetchData(t){switch(t){case"user-container":return this.userdb.read().then(t=>{if(t&&0!=t.length)return this.user=t[0],this.select("[input-class='user-input']").map((t,e)=>$(e).val(this.user[e.name]))}).catch(t=>this.error(__("Cannot fetch user data"),t));case"cv-container":return this.refreshCVCat();default:return this.last_ctime=0,this.bloglist.data=[],this.loadBlogs()}}async saveUser(){try{const t=this.select("[input-class='user-input']");for(let e of t)this.user[e.name]=$(e).val();if(!this.user.fullname||""===this.user.fullname)return this.toast(__("Full name must be entered"));let e=this.userdb;this.user&&this.user.id&&(e=`${this.userdb.path}@${this.user.id}`.asFileHandle()),e.cache=this.user;const i=await e.write(void 0);if(i.error)throw new Error(i.error);this.user.id||(this.user.id=i.result),this.toast(__("User data updated"))}catch(t){this.error(__("Cannot save user data: {0}",t.toString()),t)}}refreshCVCat(){return this.fetchCVCat().then(t=>(this.cvlist.data=t,this.cvlist.expandAll())).catch(t=>this.error(__("Unable to load categories"),t))}fetchCVCat(){return new Promise(async(t,e)=>{try{const e={text:"Porfolio",id:0,nodes:[]},i={order:["name$asc"]},a=await this.cvcatdb.read(i);this.catListToTree(a,e,0),t(e)}catch(t){e(__e(t))}})}catListToTree(t,e,i){const a=t.filter(t=>t.pid==i);if(0===a.length)return e.nodes=null;for(let i of a)i.nodes=[],i.text=i.name,this.catListToTree(t,i,i.id),e.nodes.push(i)}deleteCVCat(t){return new Promise(async(e,i)=>{try{const e=[];var a=function(t){e.push(t.id),t.nodes&&t.nodes.map(t=>a(t))};a(t);let i=await this.cvsecdb.remove({where:{$or:{cid:e}}});if(i.error)throw new Error(i.error);if(i=await this.cvcatdb.remove({where:{$or:{id:e}}}),i.error)throw new Error(i.error);await this.refreshCVCat(),this.seclist.data=[]}catch(t){i(__e(t))}})}CVSectionByCID(t){return new Promise(async(e,i)=>{try{const e=await this.cvsecdb.read({where:{cid:t},order:["start$desc"]}),i=[];this.find("cv-sec-status").text=__("Found {0} sections",e.length);for(let t of e)t.closable=!0,t.tag="afx-blogger-cvsection-item",t.start=Number(t.start),t.end=Number(t.end),t.start<1e3&&(t.start=void 0),t.end<1e3&&(t.end=void 0),i.push(t);this.seclist.data=i}catch(t){i(__e(t))}})}async saveBlog(){try{let t=void 0;const e=this.bloglist.selectedItem;e&&(t=e.data);const i=this.inputtags.value,a=this.editor.value(),s=new RegExp("^#+(.*)\n","g").exec(a);if(!s||2!==s.length)return this.toast(__("Please insert a title in the text: beginning with heading"));if(""===i)return this.toast(__("Please enter tags"));const n=new Date,r={content:a,title:s[1].trim(),tags:i,ctime:t?t.ctime:n.timestamp(),ctimestr:t?t.ctimestr:n.toString(),utime:n.timestamp(),utimestr:n.toString(),rendered:this.process(this.editor.options.previewRender(a)),publish:this.find("blog-publish").swon?1:0};let o=this.blogdb;t&&(r.id=t.id,o=t.$vfs),o.cache=r;const l=await o.write(void 0);if(l.error)throw new Error(l.error);t?e.data=r:(this.last_ctime=0,this.bloglist.data=[],await this.loadBlogs())}catch(t){this.error(__("Cannot save blog: {0}",t.toString()),t)}}process(t){let e;const i=/\[\[youtube:([^\]]*)\]\]/g,a=[];for(;null!==(e=i.exec(t));)a.push(e);if(!(a.length>0))return t;let s="",n=0;for(let e of a)s+=t.substring(n,e.index),s+=``,n=e.index+e[0].length;return s+=t.substring(n,t.length),s}clearEditor(){return this.editor.value(""),this.inputtags.value="",this.find("blog-publish").swon=!1}loadBlogs(){return new Promise(async(t,e)=>{try{const t={order:["ctime$desc"],fields:["id","title","ctimestr","ctime","utime","utimestr"],limit:10};this.last_ctime&&(t.where={ctime$lt:this.last_ctime});const e=await this.blogdb.read(t);if(0==e.length)return void this.toast(__("No more record to load"));this.last_ctime=e[e.length-1].ctime;for(let t of e)t.tag="afx-blogger-post-item",this.bloglist.push(t);return this.clearEditor(),this.bloglist.selected=-1}catch(t){e(__e(t))}})}resizeContent(){const t=this.find("editor-container"),e=$(".EasyMDEContainer",t).children(),i=$(this.scheme).find(".afx-window-top")[0],a=e[0],s=e[3],n=$(this.scheme).height()-$(i).height()-$(a).height()-$(s).height()-90;return $(e[1]).css("height",n+"px")}}t.Blogger=e,e.singleton=!0,e.dependencies=["pkg://SimpleMDE/main.js","pkg://SimpleMDE/main.css","pkg://Katex/main.js","pkg://Katex/main.css","pkg://SQLiteDB/libsqlite.js"]}(e=t.application||(t.application={}))}(OS||(OS={})),function(t){let e;!function(e){let i;!function(e){class i extends t.GUI.BasicDialog{constructor(){super("BloggerCategoryDialog",i.scheme)}main(){if(super.main(),this.tree=this.find("tree"),this.txtinput=this.find("txtinput"),this.find("bt-ok").onbtclick=t=>{const e=this.tree.selectedItem;if(!e)return this.notify(__("Please select a parent category"));const i=e.data,a=this.txtinput.value;return""!==a||this.data.selonly?this.data.cat&&this.data.cat.id===i.id?this.notify(__("Parent can not be the category itself")):(this.handle&&this.handle({p:i,value:a}),this.quit()):this.notify(__("Please enter category name"))},this.find("bt-cancel").onbtclick=t=>this.quit(),this.data&&this.data.tree){if(this.data&&this.data.cat){let t;this.txtinput.value=this.data.cat.name,t="0"===this.data.cat.pid?this.data.tree:this.findDataByID(this.data.cat.pid,this.data.tree.nodes),t&&(t.selected=!0)}return this.tree.data=this.data.tree,this.tree.expandAll()}}findDataByID(t,e){for(let i of e){if(i.id===t)return i;i.nodes&&this.findDataByID(t,i.nodes)}}}e.BloggerCategoryDialog=i,i.scheme='\n \n \n \n \n \n \n
\n \n \n
\n
\n
\n
';class a extends t.GUI.BasicDialog{constructor(){super("BloggerCVSectionDiaglog")}main(){super.main(),this.editor=new EasyMDE({autoDownloadFontAwesome:!1,element:this.find("contentarea"),status:!1,toolbar:!1}),$(this.select('[class = "CodeMirror-scroll"]')[0]).css("min-height","50px"),$(this.select('[class="CodeMirror cm-s-paper CodeMirror-wrap"]')[0]).css("min-height","50px");const t=this.select("[input-class='user-input']");if(this.data&&this.data.section)for(let e of t)$(e).val(this.data.section[e.name]);return this.data&&this.data.section&&this.editor.value(this.data.section.content),this.find("section-publish").swon=!!(this.data&&this.data.section&&Number(this.data.section.publish)),this.find("bt-cv-sec-save").onbtclick=e=>{const i={};for(let e of t)i[e.name]=$(e).val();if(i.content=this.editor.value(),""===i.title&&""===i.content)return this.notify(__("Title or content must not be blank"));this.data&&this.data.section&&(i.id=this.data.section.id);const a=this.find("section-publish").swon;return i.publish=!0===a?1:0,this.handle&&this.handle(i),this.quit()},this.on("resize",()=>this.resizeContent()),this.resizeContent()}resizeContent(){const t=this.find("editor-container"),e=$(".EasyMDEContainer",t).children(),i=$(t).height()-30;return $(e[0]).css("height",i+"px")}}e.BloggerCVSectionDiaglog=a,a.scheme='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n
\n
\n
';class s extends t.GUI.BasicDialog{constructor(){super("BloggerSendmailDiaglog")}main(){super.main(),this.maillinglist=this.find("email-list");const t=new RegExp("^#+(.*)\n","g").exec(this.data.content);this.find("mail-title").value=t[1];const e=this.data.content.substring(0,500)+"...";this.find("contentarea").value=s.template.format(this.data.id,e);const i=this.data.mails.map(t=>({text:t.name,email:t.email,switch:!0,checked:!0}));return console.log(i),this.maillinglist.items=i,this.find("bt-sendmail").onbtclick=t=>{const e=this.maillinglist.items,i=[];for(let t of e)!0===t.checked&&i.push(t);if(0===i.length)return this.notify(__("No email selected"));const a={path:this.meta().path+"/api/sendmail.lua",parameters:{to:i,title:this.find("mail-title").value,content:this.find("contentarea").value,user:this.find("mail-user").value,password:this.find("mail-password").value}};return this._api.apigateway(a,!1).then(t=>{if(t.error){const e=t.result.join(",");return this.notify(__("Unable to send mail to: {0}",e))}return this.quit()}).catch(t=>this.error(__("Error sending mail: {0}",t.toString()),t))}}}e.BloggerSendmailDiaglog=s,s.scheme='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
\n
\n
',s.template="Hello,\n\nDany LE has just published a new post on his blog: https://blog.iohub.dev/post/id/{0}\n\n==========\n{1}\n==========\n\n\nRead the full article via:\nhttps://blog.iohub.dev/post/id/{0}\n\nYou receive this email because you have been subscribed to his blog.\n\nHave a nice day,\n\nSent from Blogger, an AntOS application"}(i=e.blogger||(e.blogger={}))}(e=t.application||(t.application={}))}(OS||(OS={})),function(t){let e;!function(e){let i;!function(e){class i extends t.GUI.tag.ListViewItemTag{constructor(){super()}ondatachange(){if(!this.data)return;const t=this.data,e=["content","start","end"];return this.closable=t.closable,(()=>{const i=[];for(let a in this.refs){const s=this.refs[a];t[a]&&""!==t[a]?e.includes(a)?i.push($(s).text(t[a])):i.push(s.text=t[a]):i.push(void 0)}return i})()}reload(){}init(){}itemlayout(){return{el:"div",children:[{el:"afx-label",ref:"title",class:"afx-cv-sec-title"},{el:"afx-label",ref:"subtitle",class:"afx-cv-sec-subtitle"},{el:"p",ref:"content",class:"afx-cv-sec-content"},{el:"p",class:"afx-cv-sec-period",children:[{el:"i",ref:"start"},{el:"i",ref:"end",class:"period-end"}]},{el:"afx-label",ref:"location",class:"afx-cv-sec-loc"}]}}}t.GUI.tag.define("afx-blogger-cvsection-item",i);class a extends t.GUI.tag.ListViewItemTag{constructor(){super()}ondatachange(){if(!this.data)return;const t=this.data;t.closable=!0,this.closable=t.closable,this.refs.title.text=t.title,this.refs.ctimestr.text=__("Created: {0}",t.ctimestr),this.refs.utimestr.text=__("Updated: {0}",t.utimestr)}reload(){}init(){}itemlayout(){return{el:"div",children:[{el:"afx-label",ref:"title",class:"afx-blogpost-title"},{el:"afx-label",ref:"ctimestr",class:"blog-dates"},{el:"afx-label",ref:"utimestr",class:"blog-dates"}]}}}t.GUI.tag.define("afx-blogger-post-item",a)}(i=e.blogger||(e.blogger={}))}(e=t.application||(t.application={}))}(OS||(OS={})); \ No newline at end of file +var OS;!function(t){let e;!function(t){class e extends t.BaseApplication{constructor(t){super("Blogger",t),this.previewOn=!1}async init_db(){try{const e=await this.openDialog("FileDialog",{title:__("Open/create new database"),file:"Untitled.db"});var t=e.file.path.asFileHandle();"file"===e.file.type&&(t=t.parent());const i=`${t.path}/${e.name}`.asFileHandle();this.dbhandle=("sqlite://"+i.genealogy.join("/")).asFileHandle();const a=await this.dbhandle.read();if(!a.user){this.dbhandle.cache={address:"TEXT",Phone:"TEXT",shortbiblio:"TEXT",fullname:"TEXT",email:"TEXT",url:"TEXT",photo:"TEXT"};const t=await this.dbhandle.write("user");if(t.error)throw new Error(t.error)}if(!a.cv_cat){this.dbhandle.cache={publish:"NUMERIC",name:"TEXT",pid:"NUMERIC"};const t=await this.dbhandle.write("cv_cat");if(t.error)throw new Error(t.error)}if(!a.cv_sections){this.dbhandle.cache={title:"TEXT",start:"NUMERIC",location:"TEXT",end:"NUMERIC",content:"TEXT",subtitle:"TEXT",publish:"NUMERIC",cid:"NUMERIC"};const t=await this.dbhandle.write("cv_sections");if(t.error)throw new Error(t.error)}if(!a.blogs){this.dbhandle.cache={tags:"TEXT",content:"TEXT",utime:"NUMERIC",rendered:"TEXT",title:"TEXT",utimestr:"TEXT",ctime:"NUMERIC",ctimestr:"TEXT",publish:"INTEGER DEFAULT 0"};const t=await this.dbhandle.write("blogs");if(t.error)throw new Error(t.error)}if(!a.st_similarity){this.dbhandle.cache={pid:"NUMERIC",sid:"NUMERIC",score:"NUMERIC"};const t=await this.dbhandle.write("st_similarity");if(t.error)throw new Error(t.error)}if(!a.subscribers){this.dbhandle.cache={name:"TEXT",email:"TEXT"};const t=await this.dbhandle.write("subscribers");if(t.error)throw new Error(t.error)}this.userdb=(this.dbhandle.path+"@user").asFileHandle(),this.cvcatdb=(this.dbhandle.path+"@cv_cat").asFileHandle(),this.cvsecdb=(this.dbhandle.path+"@cv_sections").asFileHandle(),this.blogdb=(this.dbhandle.path+"@blogs").asFileHandle(),this.subdb=(this.dbhandle.path+"@subscribers").asFileHandle(),this.last_ctime=0,this.bloglist.data=[],this.loadBlogs()}catch(t){this.error(__("Unable to init database file: {0}",t.toString()),t),this.dbhandle=void 0}}menu(){return[{text:"__(Open/Create database)",onmenuselect:t=>{this.init_db()}}]}main(){this.user={},this.cvlist=this.find("cv-list"),this.cvlist.ontreeselect=t=>{if(!t)return;const{data:e}=t.data.item;return this.CVSectionByCID(Number(e.id))},this.inputtags=this.find("input-tags"),this.bloglist=this.find("blog-list"),this.seclist=this.find("cv-sec-list");let e=this.find("photo");return $(e).on("click",async t=>{try{const t=await this.openDialog("FileDialog",{title:__("Select image file"),mimes:["image/.*"]});return e.value=t.file.path}catch(t){return this.error(__("Unable to get file"),t)}}),this.tabcontainer=this.find("tabcontainer"),this.tabcontainer.ontabselect=t=>this.fetchData(t.data.container.aid),this.find("bt-user-save").onbtclick=t=>this.saveUser(),this.find("blog-load-more").onbtclick=t=>{this.loadBlogs()},this.find("cv-cat-add").onbtclick=async e=>{try{const e=await this.fetchCVCat(),i=await this.openDialog(new t.blogger.BloggerCategoryDialog,{title:__("Add category"),tree:e});this.cvcatdb.cache={name:i.value,pid:i.p.id,publish:1};const a=await this.cvcatdb.write(void 0);if(a.error)throw new Error(a.error);await this.refreshCVCat()}catch(e){this.error(__("cv-cat-add: {0}",e.toString()),e)}},this.find("cv-cat-edit").onbtclick=async e=>{try{const e=this.cvlist.selectedItem;if(!e)return;const i=e.data;if(!i)return;const a=await this.fetchCVCat(),s=await this.openDialog(new t.blogger.BloggerCategoryDialog,{title:__("Edit category"),tree:a,cat:i}),n=i.$vfs;n.cache={id:i.id,publish:i.publish,pid:s.p.id,name:s.value};const r=await n.write(void 0);if(r.error)throw new Error(r.error);await this.refreshCVCat()}catch(e){this.error(__("cv-cat-edit: {0}",e.toString()),e)}},this.find("cv-cat-del").onbtclick=async t=>{try{const t=this.cvlist.selectedItem;if(!t)return;const e=t.data;if(!e)return;if(!await this.openDialog("YesNoDialog",{title:__("Delete category"),iconclass:"fa fa-question-circle",text:__("Do you really want to delete: {0}?",e.name)}))return;await this.deleteCVCat(e)}catch(t){this.error(__("cv-cat-del: {0}",t.toString()),t)}},this.find("cv-sec-add").onbtclick=async e=>{try{const e=this.cvlist.selectedItem;if(!e)return;const i=e.data;if(!i||"0"===i.id)return this.toast(__("Please select a category"));const a=await this.openDialog(new t.blogger.BloggerCVSectionDiaglog,{title:__("New section entry for {0}",i.name)});a.cid=Number(i.id),a.start=Number(a.start),a.end=Number(a.end),this.cvsecdb.cache=a;const s=await this.cvsecdb.write(void 0);if(s.error)throw new Error(s.error);await this.CVSectionByCID(Number(i.id))}catch(e){this.error(__("cv-sec-add: {0}",e.toString()),e)}},this.find("cv-sec-move").onbtclick=async e=>{try{const e=this.seclist.selectedItem;if(!e)return this.toast(__("Please select a section to move"));const i=e.data,a=i.$vfs;console.log(a);const s=await this.fetchCVCat(),n=await this.openDialog(new t.blogger.BloggerCategoryDialog,{title:__("Move to"),tree:s,selonly:!0});a.cache={id:i.id,cid:n.p.id};const r=await a.write(void 0);if(r.error)throw new Error(r.error);await this.CVSectionByCID(i.cid),this.seclist.unselect()}catch(e){this.error(__("cv-sec-move: {0}",e.toString()),e)}},this.find("cv-sec-edit").onbtclick=async e=>{try{const e=this.seclist.selectedItem;if(!e)return this.toast(__("Please select a section to edit"));const i=e.data,a=await this.openDialog(new t.blogger.BloggerCVSectionDiaglog,{title:__("Modify section entry"),section:i});a.cid=Number(i.cid),a.start=Number(a.start),a.end=Number(a.end);const s=i.$vfs;s.cache=a;const n=await s.write(void 0);if(n.error)throw new Error(n.error);await this.CVSectionByCID(Number(i.cid))}catch(e){this.error(__("cv-sec-edit: {0}",e.toString()),e)}},this.seclist.onitemclose=t=>{if(!t)return;const e=t.data.item.data;return this.openDialog("YesNoDialog",{iconclass:"fa fa-question-circle",text:__("Do you really want to delete: {0}?",e.title)}).then(async i=>{if(i)try{const i=await this.cvsecdb.remove({where:{id:e.id}});if(i.error)throw new Error(i.error);return this.seclist.delete(t.data.item)}catch(t){return this.error(__("Cannot delete the section: {0}",t.toString()),t)}}),!1},this.editor=new EasyMDE({element:this.find("markarea"),autoDownloadFontAwesome:!1,autofocus:!0,tabSize:4,indentWithTabs:!0,toolbar:[{name:__("New"),className:"fa fa-file",action:t=>(this.bloglist.unselect(),this.clearEditor())},{name:__("Save"),className:"fa fa-save",action:t=>this.saveBlog()},"|","bold","italic","heading","|","quote","code","unordered-list","ordered-list","|","link","image","table","horizontal-rule",{name:"image",className:"fa fa-file-image-o",action:t=>this.openDialog("FileDialog",{title:__("Select image file"),mimes:["image/.*"]}).then(t=>t.file.path.asFileHandle().publish().then(t=>this.editor.codemirror.getDoc().replaceSelection(`![](${this._api.handle.shared}/${t.result})`)).catch(t=>this.error(__("Cannot export file for embedding to text"),t)))},{name:"Youtube",className:"fa fa-youtube",action:t=>this.editor.codemirror.getDoc().replaceSelection("[[youtube:]]")},"|",{name:__("Preview"),className:"fa fa-eye no-disable",action:t=>{this.previewOn=!this.previewOn,EasyMDE.togglePreview(t),renderMathInElement(this.find("editor-container"))}},"|",{name:__("Send mail"),className:"fa fa-paper-plane",action:async e=>{try{const e=await this.subdb.read(),i=this.bloglist.selectedItem;if(!i)return this.error(__("No post selected"));const a=i.data;await this.openDialog(new t.blogger.BloggerSendmailDiaglog,{title:__("Send mail"),content:this.editor.value(),mails:e,id:a.id}),this.toast(__("Emails sent"))}catch(e){this.error(__("Error sending mails: {0}",e.toString()),e)}}},"|",{name:__("TFIDF analyse"),className:"fa fa-area-chart",action:async t=>{try{const t=await this.openDialog("PromptDialog",{title:__("TFIDF Analyse"),text:__("Max number of related posts to keep per post?"),value:"5"}),e={path:this.meta().path+"/api/ai/analyse.lua",parameters:{dbpath:this.dbhandle.info.file.path,top:parseInt(t)}},i=await this._api.apigateway(e,!1);if(i.error)throw new Error(i.error);this.toast(i.result)}catch(t){this.error(__("Error analysing posts: {0}",t.toString()),t)}}}]}),this.bloglist.onlistselect=async t=>{const e=this.bloglist.selectedItem;if(!e)return;const i=e.data;if(i)try{const t=await this.blogdb.read({where:{id:Number(i.id)}});if(!t||0==t.length)throw new Error(__("No record found for ID {}",i.id).__());const e=t[0];return this.editor.value(e.content),this.inputtags.value=e.tags,this.find("blog-publish").swon=!!Number(e.publish)}catch(t){return this.error(__("Cannot fetch the entry content"),t)}},this.bloglist.onitemclose=t=>{if(!t)return;const e=t.data.item,i=e.data;return this.openDialog("YesNoDialog",{title:__("Delete a post"),iconclass:"fa fa-question-circle",text:__("Do you really want to delete this post ?")}).then(async t=>{if(!t)return;const a=await this.blogdb.remove({where:{id:Number(i.id)}});if(a.error)throw new Error(a.error);return this.bloglist.delete(e),this.bloglist.unselect(),this.clearEditor()}),!1},this.bindKey("CTRL-S",()=>{const t=this.tabcontainer.selectedTab;if(t&&"blog-container"===t.container.aid)return this.saveBlog()}),this.on("resize",()=>this.resizeContent()),this.resizeContent(),this.init_db()}fetchData(t){switch(t){case"user-container":return this.userdb.read().then(t=>{if(t&&0!=t.length)return this.user=t[0],this.select("[input-class='user-input']").map((t,e)=>$(e).val(this.user[e.name]))}).catch(t=>this.error(__("Cannot fetch user data"),t));case"cv-container":return this.refreshCVCat();default:return this.last_ctime=0,this.bloglist.data=[],this.loadBlogs()}}async saveUser(){try{const t=this.select("[input-class='user-input']");for(let e of t)this.user[e.name]=$(e).val();if(!this.user.fullname||""===this.user.fullname)return this.toast(__("Full name must be entered"));let e=this.userdb;this.user&&this.user.id&&(e=`${this.userdb.path}@${this.user.id}`.asFileHandle()),e.cache=this.user;const i=await e.write(void 0);if(i.error)throw new Error(i.error);this.user.id||(this.user.id=i.result),this.toast(__("User data updated"))}catch(t){this.error(__("Cannot save user data: {0}",t.toString()),t)}}refreshCVCat(){return this.fetchCVCat().then(t=>(this.cvlist.data=t,this.cvlist.expandAll())).catch(t=>this.error(__("Unable to load categories"),t))}fetchCVCat(){return new Promise(async(t,e)=>{try{const e={text:"Porfolio",id:0,nodes:[]},i={order:["name$asc"]},a=await this.cvcatdb.read(i);this.catListToTree(a,e,0),t(e)}catch(t){e(__e(t))}})}catListToTree(t,e,i){const a=t.filter(t=>t.pid==i);if(0===a.length)return e.nodes=null;for(let i of a)i.nodes=[],i.text=i.name,this.catListToTree(t,i,i.id),e.nodes.push(i)}deleteCVCat(t){return new Promise(async(e,i)=>{try{const e=[];var a=function(t){e.push(t.id),t.nodes&&t.nodes.map(t=>a(t))};a(t);let i=await this.cvsecdb.remove({where:{$or:{cid:e}}});if(i.error)throw new Error(i.error);if(i=await this.cvcatdb.remove({where:{$or:{id:e}}}),i.error)throw new Error(i.error);await this.refreshCVCat(),this.seclist.data=[]}catch(t){i(__e(t))}})}CVSectionByCID(t){return new Promise(async(e,i)=>{try{const e=await this.cvsecdb.read({where:{cid:t},order:["start$desc"]}),i=[];this.find("cv-sec-status").text=__("Found {0} sections",e.length);for(let t of e)t.closable=!0,t.tag="afx-blogger-cvsection-item",t.start=Number(t.start),t.end=Number(t.end),t.start<1e3&&(t.start=void 0),t.end<1e3&&(t.end=void 0),i.push(t);this.seclist.data=i}catch(t){i(__e(t))}})}async saveBlog(){try{let t=void 0;const e=this.bloglist.selectedItem;e&&(t=e.data);const i=this.inputtags.value,a=this.editor.value(),s=new RegExp("^#+(.*)\n","g").exec(a);if(!s||2!==s.length)return this.toast(__("Please insert a title in the text: beginning with heading"));if(""===i)return this.toast(__("Please enter tags"));const n=new Date,r={content:a,title:s[1].trim(),tags:i,ctime:t?t.ctime:n.timestamp(),ctimestr:t?t.ctimestr:n.toString(),utime:n.timestamp(),utimestr:n.toString(),rendered:this.process(this.editor.options.previewRender(a)),publish:this.find("blog-publish").swon?1:0};let o=this.blogdb;t&&(r.id=t.id,o=t.$vfs),o.cache=r;const l=await o.write(void 0);if(l.error)throw new Error(l.error);t?(e.data.utime=r.utime,e.data.utimestr=r.utimestr,e.data=e.data):(this.last_ctime=0,this.bloglist.data=[],await this.loadBlogs())}catch(t){this.error(__("Cannot save blog: {0}",t.toString()),t)}}process(t){let e;const i=/\[\[youtube:([^\]]*)\]\]/g,a=[];for(;null!==(e=i.exec(t));)a.push(e);if(!(a.length>0))return t;let s="",n=0;for(let e of a)s+=t.substring(n,e.index),s+=``,n=e.index+e[0].length;return s+=t.substring(n,t.length),s}clearEditor(){return this.editor.value(""),this.inputtags.value="",this.find("blog-publish").swon=!1}loadBlogs(){return new Promise(async(t,e)=>{try{const t={order:["ctime$desc"],fields:["id","title","ctimestr","ctime","utime","utimestr"],limit:10};this.last_ctime&&(t.where={ctime$lt:this.last_ctime});const e=await this.blogdb.read(t);if(0==e.length)return void this.toast(__("No more record to load"));this.last_ctime=e[e.length-1].ctime;for(let t of e)t.tag="afx-blogger-post-item",this.bloglist.push(t);return this.clearEditor(),this.bloglist.selected=-1}catch(t){e(__e(t))}})}resizeContent(){const t=this.find("editor-container"),e=$(".EasyMDEContainer",t).children(),i=$(this.scheme).find(".afx-window-top")[0],a=e[0],s=e[3],n=$(this.scheme).height()-$(i).height()-$(a).height()-$(s).height()-90;return $(e[1]).css("height",n+"px")}}t.Blogger=e,e.singleton=!0,e.dependencies=["pkg://SimpleMDE/main.js","pkg://SimpleMDE/main.css","pkg://Katex/main.js","pkg://Katex/main.css","pkg://SQLiteDB/libsqlite.js"]}(e=t.application||(t.application={}))}(OS||(OS={})),function(t){let e;!function(e){let i;!function(e){class i extends t.GUI.BasicDialog{constructor(){super("BloggerCategoryDialog",i.scheme)}main(){if(super.main(),this.tree=this.find("tree"),this.txtinput=this.find("txtinput"),this.find("bt-ok").onbtclick=t=>{const e=this.tree.selectedItem;if(!e)return this.notify(__("Please select a parent category"));const i=e.data,a=this.txtinput.value;return""!==a||this.data.selonly?this.data.cat&&this.data.cat.id===i.id?this.notify(__("Parent can not be the category itself")):(this.handle&&this.handle({p:i,value:a}),this.quit()):this.notify(__("Please enter category name"))},this.find("bt-cancel").onbtclick=t=>this.quit(),this.data&&this.data.tree){if(this.data&&this.data.cat){let t;this.txtinput.value=this.data.cat.name,t="0"===this.data.cat.pid?this.data.tree:this.findDataByID(this.data.cat.pid,this.data.tree.nodes),t&&(t.selected=!0)}return this.tree.data=this.data.tree,this.tree.expandAll()}}findDataByID(t,e){for(let i of e){if(i.id===t)return i;i.nodes&&this.findDataByID(t,i.nodes)}}}e.BloggerCategoryDialog=i,i.scheme='\n \n \n \n \n \n \n
\n \n \n
\n
\n
\n
';class a extends t.GUI.BasicDialog{constructor(){super("BloggerCVSectionDiaglog")}main(){super.main(),this.editor=new EasyMDE({autoDownloadFontAwesome:!1,element:this.find("contentarea"),status:!1,toolbar:!1}),$(this.select('[class = "CodeMirror-scroll"]')[0]).css("min-height","50px"),$(this.select('[class="CodeMirror cm-s-paper CodeMirror-wrap"]')[0]).css("min-height","50px");const t=this.select("[input-class='user-input']");if(this.data&&this.data.section)for(let e of t)$(e).val(this.data.section[e.name]);return this.data&&this.data.section&&this.editor.value(this.data.section.content),this.find("section-publish").swon=!!(this.data&&this.data.section&&Number(this.data.section.publish)),this.find("bt-cv-sec-save").onbtclick=e=>{const i={};for(let e of t)i[e.name]=$(e).val();if(i.content=this.editor.value(),""===i.title&&""===i.content)return this.notify(__("Title or content must not be blank"));this.data&&this.data.section&&(i.id=this.data.section.id);const a=this.find("section-publish").swon;return i.publish=!0===a?1:0,this.handle&&this.handle(i),this.quit()},this.on("resize",()=>this.resizeContent()),this.resizeContent()}resizeContent(){const t=this.find("editor-container"),e=$(".EasyMDEContainer",t).children(),i=$(t).height()-30;return $(e[0]).css("height",i+"px")}}e.BloggerCVSectionDiaglog=a,a.scheme='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n
\n
\n
';class s extends t.GUI.BasicDialog{constructor(){super("BloggerSendmailDiaglog")}main(){super.main(),this.maillinglist=this.find("email-list");const t=new RegExp("^#+(.*)\n","g").exec(this.data.content);this.find("mail-title").value=t[1];const e=this.data.content.substring(0,500)+"...";this.find("contentarea").value=s.template.format(this.data.id,e);const i=this.data.mails.map(t=>({text:t.name,email:t.email,switch:!0,checked:!0}));return console.log(i),this.maillinglist.items=i,this.find("bt-sendmail").onbtclick=t=>{const e=this.maillinglist.items,i=[];for(let t of e)!0===t.checked&&i.push(t);if(0===i.length)return this.notify(__("No email selected"));const a={path:this.meta().path+"/api/sendmail.lua",parameters:{to:i,title:this.find("mail-title").value,content:this.find("contentarea").value,user:this.find("mail-user").value,password:this.find("mail-password").value}};return this._api.apigateway(a,!1).then(t=>{if(t.error){const e=t.result.join(",");return this.notify(__("Unable to send mail to: {0}",e))}return this.quit()}).catch(t=>this.error(__("Error sending mail: {0}",t.toString()),t))}}}e.BloggerSendmailDiaglog=s,s.scheme='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
\n
\n
',s.template="Hello,\n\nDany LE has just published a new post on his blog: https://blog.iohub.dev/post/id/{0}\n\n==========\n{1}\n==========\n\n\nRead the full article via:\nhttps://blog.iohub.dev/post/id/{0}\n\nYou receive this email because you have been subscribed to his blog.\n\nHave a nice day,\n\nSent from Blogger, an AntOS application"}(i=e.blogger||(e.blogger={}))}(e=t.application||(t.application={}))}(OS||(OS={})),function(t){let e;!function(e){let i;!function(e){class i extends t.GUI.tag.ListViewItemTag{constructor(){super()}ondatachange(){if(!this.data)return;const t=this.data,e=["content","start","end"];return this.closable=t.closable,(()=>{const i=[];for(let a in this.refs){const s=this.refs[a];t[a]&&""!==t[a]?e.includes(a)?i.push($(s).text(t[a])):i.push(s.text=t[a]):i.push(void 0)}return i})()}reload(){}init(){}itemlayout(){return{el:"div",children:[{el:"afx-label",ref:"title",class:"afx-cv-sec-title"},{el:"afx-label",ref:"subtitle",class:"afx-cv-sec-subtitle"},{el:"p",ref:"content",class:"afx-cv-sec-content"},{el:"p",class:"afx-cv-sec-period",children:[{el:"i",ref:"start"},{el:"i",ref:"end",class:"period-end"}]},{el:"afx-label",ref:"location",class:"afx-cv-sec-loc"}]}}}t.GUI.tag.define("afx-blogger-cvsection-item",i);class a extends t.GUI.tag.ListViewItemTag{constructor(){super()}ondatachange(){if(!this.data)return;const t=this.data;t.closable=!0,this.closable=t.closable,this.refs.title.text=t.title,this.refs.ctimestr.text=__("Created: {0}",t.ctimestr),this.refs.utimestr.text=__("Updated: {0}",t.utimestr)}reload(){}init(){}itemlayout(){return{el:"div",children:[{el:"afx-label",ref:"title",class:"afx-blogpost-title"},{el:"afx-label",ref:"ctimestr",class:"blog-dates"},{el:"afx-label",ref:"utimestr",class:"blog-dates"}]}}}t.GUI.tag.define("afx-blogger-post-item",a)}(i=e.blogger||(e.blogger={}))}(e=t.application||(t.application={}))}(OS||(OS={})); \ No newline at end of file diff --git a/Blogger/build/debug/package.json b/Blogger/build/debug/package.json index bd0f367..f03e29a 100644 --- a/Blogger/build/debug/package.json +++ b/Blogger/build/debug/package.json @@ -6,7 +6,7 @@ "author": "Xuan Sang LE", "email": "xsang.le@gmail.com" }, - "version": "0.2.12-a", + "version": "0.2.13-a", "category": "Internet", "iconclass": "fa fa-book", "dependencies": [ diff --git a/Blogger/build/release/Blogger.zip b/Blogger/build/release/Blogger.zip index 564d0b7e500d9839a9767e3547d370d9d7322deb..dccbd2f1286986a10439e6e3277b76e2b0fa85aa 100644 GIT binary patch delta 8883 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 delta 8668 zcmZviWl&wu((X6zuE91zgIjR-5Ii^pcP9aYvv3c=U6bH$A?U^-xZB1dKyWthFX#W> zd(O?NyS}WhS^Z3}>6+@9s$Zx3#rpzkiU^44AP@)@v|!V(oz=qB?STja?cjkxn9rjw zrsnph)|TvcuFg)`x{A(Ae7Nm9I=DWgP6t_0ZPORuD%2TO)(Ky!5yH`r9N{a*2gy`8 zlHRQf(_L&tBqZF{ZVmI}U|WaLLfXu)8#iQY7Hel3rtd_P%C2%sJ+UeEfMQYUG(skR zsWRe3$>fx;E_4{b|KMr%eXJC)GZQwf{f_4>8?tEI)83TLZ=4y-UU9$5t8)dYdVlA5b!Uo0{j} z8#%E{k51*{bafmySbinED!Oj0NsZ1Td#5jnnjrLhvJ*KU@#3&?KVWOXSjO8Ti>MXR z^5BJZ*B!3kluT5^3tW8E+f$pDU;1l^lY`DToMf+!L*rFijB$@NvVk<>@d~tUN&a6y zDa+Be=kPTwp!e^{@3$_X#(Qmjgr_xjsfZt*2K=iCtj^+Qhzbe%wxt6F&&!8~=@(c7 zZiCRaeQO{gSF-R`0b0~Ad6z3{Ora7Sh7ON4{1SL3VFoo(} znIRaYL%3mVbQk;`Frb;c!k4B==+hsbFErlb_SC-{Ahgj$VE2)Ybq<%l3CinHFupVqszFU2cmNVCCDD+4f|OP5Eh@ZH z+>5@^dH1KIvb?72xj-;04$P6WaN^=bh9^&wp?~c&!`r=|3`-VuEhmam-44l$%*{@) z)LiljQQHxol#rW9)p+8kc zuS{Mu2w`DFeCT`K#AS+Rgl>52v<^dpA#%?}a?uD3rU#B#vbKG}SLyN@XQ$->*)uNt z^Z2)+f99a@YLy~8l+#wXTqW`dS^sqESZYO8#7t%Vd6^dIeTjmgQ8pa9^O(|>O|HY3 zb}GCOsDN{1=SNu--047tcbvK;Yd6kD-i34iww|6De9{~H!emFqhEe89E>>mMb=Sc_ z@lPMOIE-#&U|Yj1Lt%AHTeJ-0{&dpZZ0QPJerH8eKb7lfYoCqxn9AfSo45OWyh};Q z9`x2@1J4dtux07M5 z#|pS2T#^fu-RE#sPP|VYpEV=cD3mbIDp|t#$i{7+yap+S(u>}8`p-K-Wy_u2DeaSl z3pN*WYqXzoZjlb_P@qi&@o&~8I>jE@mgu%dERX@QdBlbfXW(y#Vg3`ZQ}1{`M+NCU`C-WlEeGB%&7s>oqYE%D%_6zMfD0V@Eb;a#N}!RlQolO2{$D!MZ0tR=$K6v zvftxTP@cB>D~(8omcbe^TRd1IH3a<^Ou4d^RS~xA!#;~%sQ7%tsWR}|<%>Yraufs| z*AW^GR+7{Z(#u+|1;<;yS2G^188CrU{++1t<+a4R{XWY4@{3tu0G^;AU+(;uttlmE zBh9Wf^~iON&kb530meK0`Xiwf2m6JTS3S~iC?um2YRx~21Xv{s{i*NYZ}g6$O}yOUvH0>Pu-4vv&RZv!6d>mV-&x%D4)e>CHIRy z>cK=RL|yUqA`qa<1uNQaJ5>QZwl6Q zj$szZE<>gJzDJSo2fqAaMdhz;)!z3MG1XCe^JSZmB?m$XV5Xqo>(FfOIg2m8dC4Po zbIo6zia(K!Qm4bT}W^SY^&bL zD_CQAtH48U0XBjJRc!2gd7Ab$!G3AOeh4uQ&OL%SCKRK%kt>tis)rY^-)&f4Y3tz7aWzEz1~x z4ne`GP4twn2$exD7&2)b@a7VcM{q);ID(m$ONmHL>x<6bTfA)}o*2!fLmRp&G!Rg( zjxcO7(U6$tq7QnQuw#F+PM^BZExzz30G$AABw2YA`fV;Q#;ZF`f0GF+bH9!X7N8~x6#^Bn3jQ? zm1^ZpGwWRAe&*CkmQnH2yI6T79)|+hZGTYUaMss2vGNue#ov)eqrU&f;-%{5u0(j= zlVJGjSHLp+#I}lxuboK5(?+i2zUawyf~EbuWpEW4Tzw>zF`UFj;sG1YEbkBe$6$6u zI{2*)p|<6ts~FiACUtU%)0)^mUT6o{ujew?F|WxMFcWAA+thp6P35Z>mGDi0{f6pI zgc#H%+a8^9$OJyCkIzQox19JPXX;thybK;yt_0y2HxuscyWX_*c#We>PBT;d^@>CCH!-3Z;aF!)rhgI8h*QHg{hS@j?-@t6)POZ;xzi<&a!^Z z3g>3n;++qe<2=-`k59-&DCZ3a=4$(d`zrIx`5c$H94UG#!tq3iVAxsJSYHzObK2$X zgXF@6~QMJn1cRllr>P!`sr>NCJkv#HA5ufbX~w!>T-8TAZREB*Y(K6WlGx)=IHwr; z=&+{R7;5Mz?4Dtwg*ad|<}ZB5+PC>mBLqgq#UesklM3J69X_&J@`t=#Ub;4qSy6YA zhHehPcMv$pbTT)DqiBh;0 zDwAR3D|r{oSsfrS@p@0*A>5_JHWY1azToci+eROKFrh-%DpYCblXChj9={* z89p`xAFV;KG@>bh?glSyO<(HPGCwY)PlJ;4zTnF)@|0+NIv7SUv{HWLJY0&G);%C=r50BcX`zOe4jL6tgNVzZ-(D{-n(`9K6)4^A zP3t|1^}^n>4TgL|u?EgyujV_X6o=9D$=WS`Ga`o|)>zvEdabOLA2Ab+Bz-UMqjZo= zhTEj~ggCbM(T9x?*OzOqNpgKDJJG9`o=}@SabAKih-CT9e{abkF)osHZ}coQCjEZ5 zR1m>qwkJZZ7?`PJ8@Xp?emt!9Mrs zclQ{q&aTOInSCF5mp9%=^1hvQ zo3nDOEM}x>5pl)lq1NLgv4|S-F0DbNZqZsP5~^_&&?tbRPE5);Gl%%|v8&M2mJA1vpzv9P4KMy} zaC6W;!8`wvwpP-DukSuiI+#thx4GuhR!p0~v$Jzo8pHjNvA$ddfsJ?M->xGluFo{d zX=9^Q0Ie8>MsA_>mMiDNX;6e zov{=lFy1Q(WY4!E7C4+PsCgXk97^)?$W?-*OVPe`h;yFfFo3m#Gik}-$Vc%8Ful!S zV1XzL-3pPR~*Hiy@nrXP*u-Fc#fc9~i8!Y@*U@{7pY^SNJj4f#7~s z2be3uh=Oqv)BECZ;YacWGIiL~E~|aFGD;-Q{#@*v z6*;+Bnc}iUesosBlqgfRiY1qv#MAWPQVP+nn%RkJchS7MjXdd-@n6LDjmUw@?pgtX z%Vkw$ZexaUWWCuTW15wc$B9|!q-2W$wcU9w?5$J+xcfxk`MQqq3Jf$R`IIw+6Gzcs z0yppAud6kWvDA@t@j4dv4uv?Pu{e@EsXVyI6#Nrt|~`9Qqv!;C3V5NtMC|CHub z>5~C-MJ|NCfcaDc?j>5TdNayStDyoKoH20A5?>jUO~ct0l(`*!Mgr!O@Slq>oqu+0 zpzkot?q&6=L8WOOPpuv4Z|cQbcIjkarG3cNRi;ja8z8=>S!fxFZ>abE~-n&i_e@Yx13h=Ah2zQYH;GBVPhv0g;rt3JDEF_AH}daMbg5PHYk{VIa#Q` zZC-C!{}5i7M^%b3JK6&^BEWx)2RE2D42GZWx?37k||+&lpgd=J(vsrn&rS*H`3@a60n};zx_#v z4@17OQpi*Gj}=pcx|58|Jk8`_@=7ACZMv44D?!1Dmi92|g+J(A-m8CrL||^Ds{2(_ z-v(_0J$F|~RHtWJl5uE0ke4#9PeC6=ivy+4Q6r{q=$v&={U2SZA z71g>Yob|x)#Fp?EVNU$4V9sf{r>eLVU|XV z?ZaKi8B{8hq&H6ivu(8dFpcaP=Iz!}_)PNNsGb#zR{!s464%w0QS+2zqQY4*jTReG za{9Pc0iJPCdEpn5V8h`M^?dbkN%C~k{eh#srTY?QA5Dy=1GwdwQ|4o!=Metb;aa8v|~_@H=+cDx%^ex&E$s zd^hJL0=X*>wAk@q7(&sMg&8Y03yT+p@OG^@JJ;_J(y^$I9Q8hTSJ10mf!u2Y9q4{8 zM#}C4Su-uuthJ#n;I~pw=sP|34B_7y9|%Qr*AN09KcadsOrpc6wj?{%CZOEeE{=T; znQr3}`ftfN`wfuO-5M-%! z_y=;zu+D>tF4axhnAo^PMwWk9XM)LFqO{;i@v#1+s&TI^*TA@CW4~rlw+m}ZSxomY zoa$Y{N1_ug0H?M3=oaOAax5E7yG-=@8Ug`OE+O}q)C4>ifACa9{RBVr|G_{wIXRVCES~2x<8xJqMG}dQ!A!h-5{&x^Q zJ1XYLkw~EJqwD3*Zh^;cFLo zK3?Z!`;7V^eeqINTQKPh8L3IA;wq3Ff01<=C-~t{;l`ef7D=-qi}dhqHWouq$WG%N z>1sof%n>0GRkxs~n|aLP3h7~K=+6(uZ(9YX$bU7uazZOwP+Tg>8N>66X_GY590Yf( zi@Pt6Bx#l-`K4MRAKCC4N*QnOQ>i z{bzWj2 zT%+xskJtC#s4pSkg2PeWE8YQ+itoso#a>7* zsavE2m$>mMVUmjRUoZ(_xiNU?7gfo+EM8~7i{HsoP8iZ4L_1^rcE2)@h}<% zQ^L(x`90AhANhp{Dmepkik5Mjl3S1M{@g`ikn%B;VkqouUkQ{NOU>%VkoZi^B(-`{ z@cyLCcje{LihBP0O7S4L)tDP^r4yOph&KYSZ0_Vaw4UxshoZcxgw@A>QeL1ET%6>S z?SzgcEWlWN=t?jHZ%!tS(*h4q`AkM zKM)`w7wh&v_*wHn^iGaHv>soKvH8|)rms3*UkR*~)#~~Sj;>=3iH`ABH(d4h%)Ody z%g8TumRs$P-1=5&CnGE6@R|4GY8T}|=gu_>Ny5)ABB0e0BW41iRkws`< ztu8A{0{snX!lLyp&ks>My4Z8fd-E&>(5rvdkROo883PY0ajVRS%b}+qbi>fPXTN~P zt6b7nL7Xd(v(b_)(7g3zzhy;5<}!*5i~e8h={{w)V?Wrj`z8`k1$?*qKO6|_415a7 zC#f*|mC91y{JArjBfb8Telnu5Qnn;JDpomJA`e~2?NauEIx^KimX{{uLX`D0|! zIn#Trp+jKoTn6WJNpa0v84PTl4D%KOU^#R;*_(w@6{Ozh4cy(07}m32;`;IbAinl9 z@N}DBd3%<9@oSr6dCx*mDWu(JnF-&i^M*Q+_H}i3^7+`0-CRTvQ8V*kJ>6ITLXYC)`Avp*5MOs z8+=#JveY1Dm9v(%4eQ$h)6w37$8t%phZng#xH`AUW|ByJSvy7#!ls&RCMpD*fY9nX zwLnGMrmB-6fnh9{?I-NO{Gv9Mt(qmDoFR|?9QWmYXN1;I)9t^v8H%4~Njjgt%=IQ1 z_UI1YCa&ptj@;&4bRW4GY`rQzLmJ}v*-W)kmS1qk7U95Y-IJK8UrbARB}b^7(=bTu z=4Gz&hZJd+{{=R(MQOdtOoTS_S70|6y}OX$6JPSl6DL74iU8iDZy1uunL{>=*<_vP zGf4?CoI6_wm#M(SVRGrzce$y;p>9lXJZM}(n5QD>e12nx^qfPD%Um~JlVsDulkc=M z;yPXdO+}@+f^Xs4{__rjhW$73^-d$o@RC@^Y2mU_gbSteyYr>w9F4Q@!a%PZFHf_% z1f5L$r%~GB*oZN2xTy#we#Md-T8G6PEQ+$xr}I|utqV;`C@GVQV23f)L3tF>ddJLU zZaMOl_QO$J&m4R?{*6BBOz@2D+nNkBvuFNf`#EMLVmzbaX!tg--K*F-9S>;Nr426j zwJS2=r?>WIPKK=Kl;tz+Qy6MEk&u>sj}A3naZr8w8+z4IQAxuyg8m`(&&ccF&oi(G znY!3={7pZS8ITYVo}qqXHWSUi-gSXIhI{dfr-|$8sWDG+2OPT*Xy`!nE({qQyf2$BTz8=uPgFxudE~tNrCTahV z$lUe+QT>zG#3K=M5;BJWo6o-%kVq{`4kwZ*A`1Q|twy5c{4z}c>uLJ0-iP)VLA2dTf>c<(X#E(Stzve`)SH5+|4l gpSQzbK@!!T^(}&lj$%~Un9mIxP0#V9g#RV{AGJ+9;s5{u diff --git a/Blogger/main.ts b/Blogger/main.ts index daae524..dda6ea8 100644 --- a/Blogger/main.ts +++ b/Blogger/main.ts @@ -815,7 +815,9 @@ namespace OS { else { //data.text = data.title; - selel.data = data; + selel.data.utime = data.utime; + selel.data.utimestr = data.utimestr; + selel.data = selel.data; } } catch(e) diff --git a/Blogger/package.json b/Blogger/package.json index bd0f367..f03e29a 100644 --- a/Blogger/package.json +++ b/Blogger/package.json @@ -6,7 +6,7 @@ "author": "Xuan Sang LE", "email": "xsang.le@gmail.com" }, - "version": "0.2.12-a", + "version": "0.2.13-a", "category": "Internet", "iconclass": "fa fa-book", "dependencies": [ diff --git a/packages.json b/packages.json index 9b8722c..ced71e0 100644 --- a/packages.json +++ b/packages.json @@ -95,7 +95,7 @@ "description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/2.0.x/Blogger/README.md", "category": "Internet", "author": "Xuan Sang LE", - "version": "0.2.12-a", + "version": "0.2.13-a", "dependencies": ["SimpleMDE@2.18.0-r","Katex@0.11.1-r","SQLiteDB@0.1.0-a"],"mimes":["none"], "download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/2.0.x/Blogger/build/release/Blogger.zip" }, diff --git a/release/Blogger.md b/release/Blogger.md index a0f637b..d39795f 100644 --- a/release/Blogger.md +++ b/release/Blogger.md @@ -6,6 +6,7 @@ Blackend for my blog at https://blog.iohub.dev ## Change logs ### v0.2.x-a +* Patch 13: fix bug on blog save * Patch 12: support send mail via SSL * Patch 11: Add TFIDF analyse functionality * Patch 10: Migrate code to typescript, use SQLiteDB lib for database access diff --git a/release/Blogger.zip b/release/Blogger.zip index 564d0b7e500d9839a9767e3547d370d9d7322deb..dccbd2f1286986a10439e6e3277b76e2b0fa85aa 100644 GIT binary patch delta 8883 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 delta 8668 zcmZviWl&wu((X6zuE91zgIjR-5Ii^pcP9aYvv3c=U6bH$A?U^-xZB1dKyWthFX#W> zd(O?NyS}WhS^Z3}>6+@9s$Zx3#rpzkiU^44AP@)@v|!V(oz=qB?STja?cjkxn9rjw zrsnph)|TvcuFg)`x{A(Ae7Nm9I=DWgP6t_0ZPORuD%2TO)(Ky!5yH`r9N{a*2gy`8 zlHRQf(_L&tBqZF{ZVmI}U|WaLLfXu)8#iQY7Hel3rtd_P%C2%sJ+UeEfMQYUG(skR zsWRe3$>fx;E_4{b|KMr%eXJC)GZQwf{f_4>8?tEI)83TLZ=4y-UU9$5t8)dYdVlA5b!Uo0{j} z8#%E{k51*{bafmySbinED!Oj0NsZ1Td#5jnnjrLhvJ*KU@#3&?KVWOXSjO8Ti>MXR z^5BJZ*B!3kluT5^3tW8E+f$pDU;1l^lY`DToMf+!L*rFijB$@NvVk<>@d~tUN&a6y zDa+Be=kPTwp!e^{@3$_X#(Qmjgr_xjsfZt*2K=iCtj^+Qhzbe%wxt6F&&!8~=@(c7 zZiCRaeQO{gSF-R`0b0~Ad6z3{Ora7Sh7ON4{1SL3VFoo(} znIRaYL%3mVbQk;`Frb;c!k4B==+hsbFErlb_SC-{Ahgj$VE2)Ybq<%l3CinHFupVqszFU2cmNVCCDD+4f|OP5Eh@ZH z+>5@^dH1KIvb?72xj-;04$P6WaN^=bh9^&wp?~c&!`r=|3`-VuEhmam-44l$%*{@) z)LiljQQHxol#rW9)p+8kc zuS{Mu2w`DFeCT`K#AS+Rgl>52v<^dpA#%?}a?uD3rU#B#vbKG}SLyN@XQ$->*)uNt z^Z2)+f99a@YLy~8l+#wXTqW`dS^sqESZYO8#7t%Vd6^dIeTjmgQ8pa9^O(|>O|HY3 zb}GCOsDN{1=SNu--047tcbvK;Yd6kD-i34iww|6De9{~H!emFqhEe89E>>mMb=Sc_ z@lPMOIE-#&U|Yj1Lt%AHTeJ-0{&dpZZ0QPJerH8eKb7lfYoCqxn9AfSo45OWyh};Q z9`x2@1J4dtux07M5 z#|pS2T#^fu-RE#sPP|VYpEV=cD3mbIDp|t#$i{7+yap+S(u>}8`p-K-Wy_u2DeaSl z3pN*WYqXzoZjlb_P@qi&@o&~8I>jE@mgu%dERX@QdBlbfXW(y#Vg3`ZQ}1{`M+NCU`C-WlEeGB%&7s>oqYE%D%_6zMfD0V@Eb;a#N}!RlQolO2{$D!MZ0tR=$K6v zvftxTP@cB>D~(8omcbe^TRd1IH3a<^Ou4d^RS~xA!#;~%sQ7%tsWR}|<%>Yraufs| z*AW^GR+7{Z(#u+|1;<;yS2G^188CrU{++1t<+a4R{XWY4@{3tu0G^;AU+(;uttlmE zBh9Wf^~iON&kb530meK0`Xiwf2m6JTS3S~iC?um2YRx~21Xv{s{i*NYZ}g6$O}yOUvH0>Pu-4vv&RZv!6d>mV-&x%D4)e>CHIRy z>cK=RL|yUqA`qa<1uNQaJ5>QZwl6Q zj$szZE<>gJzDJSo2fqAaMdhz;)!z3MG1XCe^JSZmB?m$XV5Xqo>(FfOIg2m8dC4Po zbIo6zia(K!Qm4bT}W^SY^&bL zD_CQAtH48U0XBjJRc!2gd7Ab$!G3AOeh4uQ&OL%SCKRK%kt>tis)rY^-)&f4Y3tz7aWzEz1~x z4ne`GP4twn2$exD7&2)b@a7VcM{q);ID(m$ONmHL>x<6bTfA)}o*2!fLmRp&G!Rg( zjxcO7(U6$tq7QnQuw#F+PM^BZExzz30G$AABw2YA`fV;Q#;ZF`f0GF+bH9!X7N8~x6#^Bn3jQ? zm1^ZpGwWRAe&*CkmQnH2yI6T79)|+hZGTYUaMss2vGNue#ov)eqrU&f;-%{5u0(j= zlVJGjSHLp+#I}lxuboK5(?+i2zUawyf~EbuWpEW4Tzw>zF`UFj;sG1YEbkBe$6$6u zI{2*)p|<6ts~FiACUtU%)0)^mUT6o{ujew?F|WxMFcWAA+thp6P35Z>mGDi0{f6pI zgc#H%+a8^9$OJyCkIzQox19JPXX;thybK;yt_0y2HxuscyWX_*c#We>PBT;d^@>CCH!-3Z;aF!)rhgI8h*QHg{hS@j?-@t6)POZ;xzi<&a!^Z z3g>3n;++qe<2=-`k59-&DCZ3a=4$(d`zrIx`5c$H94UG#!tq3iVAxsJSYHzObK2$X zgXF@6~QMJn1cRllr>P!`sr>NCJkv#HA5ufbX~w!>T-8TAZREB*Y(K6WlGx)=IHwr; z=&+{R7;5Mz?4Dtwg*ad|<}ZB5+PC>mBLqgq#UesklM3J69X_&J@`t=#Ub;4qSy6YA zhHehPcMv$pbTT)DqiBh;0 zDwAR3D|r{oSsfrS@p@0*A>5_JHWY1azToci+eROKFrh-%DpYCblXChj9={* z89p`xAFV;KG@>bh?glSyO<(HPGCwY)PlJ;4zTnF)@|0+NIv7SUv{HWLJY0&G);%C=r50BcX`zOe4jL6tgNVzZ-(D{-n(`9K6)4^A zP3t|1^}^n>4TgL|u?EgyujV_X6o=9D$=WS`Ga`o|)>zvEdabOLA2Ab+Bz-UMqjZo= zhTEj~ggCbM(T9x?*OzOqNpgKDJJG9`o=}@SabAKih-CT9e{abkF)osHZ}coQCjEZ5 zR1m>qwkJZZ7?`PJ8@Xp?emt!9Mrs zclQ{q&aTOInSCF5mp9%=^1hvQ zo3nDOEM}x>5pl)lq1NLgv4|S-F0DbNZqZsP5~^_&&?tbRPE5);Gl%%|v8&M2mJA1vpzv9P4KMy} zaC6W;!8`wvwpP-DukSuiI+#thx4GuhR!p0~v$Jzo8pHjNvA$ddfsJ?M->xGluFo{d zX=9^Q0Ie8>MsA_>mMiDNX;6e zov{=lFy1Q(WY4!E7C4+PsCgXk97^)?$W?-*OVPe`h;yFfFo3m#Gik}-$Vc%8Ful!S zV1XzL-3pPR~*Hiy@nrXP*u-Fc#fc9~i8!Y@*U@{7pY^SNJj4f#7~s z2be3uh=Oqv)BECZ;YacWGIiL~E~|aFGD;-Q{#@*v z6*;+Bnc}iUesosBlqgfRiY1qv#MAWPQVP+nn%RkJchS7MjXdd-@n6LDjmUw@?pgtX z%Vkw$ZexaUWWCuTW15wc$B9|!q-2W$wcU9w?5$J+xcfxk`MQqq3Jf$R`IIw+6Gzcs z0yppAud6kWvDA@t@j4dv4uv?Pu{e@EsXVyI6#Nrt|~`9Qqv!;C3V5NtMC|CHub z>5~C-MJ|NCfcaDc?j>5TdNayStDyoKoH20A5?>jUO~ct0l(`*!Mgr!O@Slq>oqu+0 zpzkot?q&6=L8WOOPpuv4Z|cQbcIjkarG3cNRi;ja8z8=>S!fxFZ>abE~-n&i_e@Yx13h=Ah2zQYH;GBVPhv0g;rt3JDEF_AH}daMbg5PHYk{VIa#Q` zZC-C!{}5i7M^%b3JK6&^BEWx)2RE2D42GZWx?37k||+&lpgd=J(vsrn&rS*H`3@a60n};zx_#v z4@17OQpi*Gj}=pcx|58|Jk8`_@=7ACZMv44D?!1Dmi92|g+J(A-m8CrL||^Ds{2(_ z-v(_0J$F|~RHtWJl5uE0ke4#9PeC6=ivy+4Q6r{q=$v&={U2SZA z71g>Yob|x)#Fp?EVNU$4V9sf{r>eLVU|XV z?ZaKi8B{8hq&H6ivu(8dFpcaP=Iz!}_)PNNsGb#zR{!s464%w0QS+2zqQY4*jTReG za{9Pc0iJPCdEpn5V8h`M^?dbkN%C~k{eh#srTY?QA5Dy=1GwdwQ|4o!=Metb;aa8v|~_@H=+cDx%^ex&E$s zd^hJL0=X*>wAk@q7(&sMg&8Y03yT+p@OG^@JJ;_J(y^$I9Q8hTSJ10mf!u2Y9q4{8 zM#}C4Su-uuthJ#n;I~pw=sP|34B_7y9|%Qr*AN09KcadsOrpc6wj?{%CZOEeE{=T; znQr3}`ftfN`wfuO-5M-%! z_y=;zu+D>tF4axhnAo^PMwWk9XM)LFqO{;i@v#1+s&TI^*TA@CW4~rlw+m}ZSxomY zoa$Y{N1_ug0H?M3=oaOAax5E7yG-=@8Ug`OE+O}q)C4>ifACa9{RBVr|G_{wIXRVCES~2x<8xJqMG}dQ!A!h-5{&x^Q zJ1XYLkw~EJqwD3*Zh^;cFLo zK3?Z!`;7V^eeqINTQKPh8L3IA;wq3Ff01<=C-~t{;l`ef7D=-qi}dhqHWouq$WG%N z>1sof%n>0GRkxs~n|aLP3h7~K=+6(uZ(9YX$bU7uazZOwP+Tg>8N>66X_GY590Yf( zi@Pt6Bx#l-`K4MRAKCC4N*QnOQ>i z{bzWj2 zT%+xskJtC#s4pSkg2PeWE8YQ+itoso#a>7* zsavE2m$>mMVUmjRUoZ(_xiNU?7gfo+EM8~7i{HsoP8iZ4L_1^rcE2)@h}<% zQ^L(x`90AhANhp{Dmepkik5Mjl3S1M{@g`ikn%B;VkqouUkQ{NOU>%VkoZi^B(-`{ z@cyLCcje{LihBP0O7S4L)tDP^r4yOph&KYSZ0_Vaw4UxshoZcxgw@A>QeL1ET%6>S z?SzgcEWlWN=t?jHZ%!tS(*h4q`AkM zKM)`w7wh&v_*wHn^iGaHv>soKvH8|)rms3*UkR*~)#~~Sj;>=3iH`ABH(d4h%)Ody z%g8TumRs$P-1=5&CnGE6@R|4GY8T}|=gu_>Ny5)ABB0e0BW41iRkws`< ztu8A{0{snX!lLyp&ks>My4Z8fd-E&>(5rvdkROo883PY0ajVRS%b}+qbi>fPXTN~P zt6b7nL7Xd(v(b_)(7g3zzhy;5<}!*5i~e8h={{w)V?Wrj`z8`k1$?*qKO6|_415a7 zC#f*|mC91y{JArjBfb8Telnu5Qnn;JDpomJA`e~2?NauEIx^KimX{{uLX`D0|! zIn#Trp+jKoTn6WJNpa0v84PTl4D%KOU^#R;*_(w@6{Ozh4cy(07}m32;`;IbAinl9 z@N}DBd3%<9@oSr6dCx*mDWu(JnF-&i^M*Q+_H}i3^7+`0-CRTvQ8V*kJ>6ITLXYC)`Avp*5MOs z8+=#JveY1Dm9v(%4eQ$h)6w37$8t%phZng#xH`AUW|ByJSvy7#!ls&RCMpD*fY9nX zwLnGMrmB-6fnh9{?I-NO{Gv9Mt(qmDoFR|?9QWmYXN1;I)9t^v8H%4~Njjgt%=IQ1 z_UI1YCa&ptj@;&4bRW4GY`rQzLmJ}v*-W)kmS1qk7U95Y-IJK8UrbARB}b^7(=bTu z=4Gz&hZJd+{{=R(MQOdtOoTS_S70|6y}OX$6JPSl6DL74iU8iDZy1uunL{>=*<_vP zGf4?CoI6_wm#M(SVRGrzce$y;p>9lXJZM}(n5QD>e12nx^qfPD%Um~JlVsDulkc=M z;yPXdO+}@+f^Xs4{__rjhW$73^-d$o@RC@^Y2mU_gbSteyYr>w9F4Q@!a%PZFHf_% z1f5L$r%~GB*oZN2xTy#we#Md-T8G6PEQ+$xr}I|utqV;`C@GVQV23f)L3tF>ddJLU zZaMOl_QO$J&m4R?{*6BBOz@2D+nNkBvuFNf`#EMLVmzbaX!tg--K*F-9S>;Nr426j zwJS2=r?>WIPKK=Kl;tz+Qy6MEk&u>sj}A3naZr8w8+z4IQAxuyg8m`(&&ccF&oi(G znY!3={7pZS8ITYVo}qqXHWSUi-gSXIhI{dfr-|$8sWDG+2OPT*Xy`!nE({qQyf2$BTz8=uPgFxudE~tNrCTahV z$lUe+QT>zG#3K=M5;BJWo6o-%kVq{`4kwZ*A`1Q|twy5c{4z}c>uLJ0-iP)VLA2dTf>c<(X#E(Stzve`)SH5+|4l gpSQzbK@!!T^(}&lj$%~Un9mIxP0#V9g#RV{AGJ+9;s5{u diff --git a/release/packages.json b/release/packages.json index 9cf6de5..bbc5e77 100644 --- a/release/packages.json +++ b/release/packages.json @@ -1 +1 @@ -[{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Archive.zip","category":"Utility","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Archive.md","dependencies":[],"name":"Archive","pkgname":"Archive","version":"0.0.4-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libwvnc.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libwvnc.md","dependencies":["libjpeg@0.1.1-a"],"name":"libwvnc","pkgname":"libwvnc","version":"0.1.2-a","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/About.zip","category":"Utility","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/About.md","dependencies":[],"name":"About AntOS","pkgname":"About","version":"0.1.2-b","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Blogger.zip","category":"Internet","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Blogger.md","dependencies":["SimpleMDE@2.18.0-r","Katex@0.11.1-r","SQLiteDB@0.1.0-a"],"name":"Blogging application","pkgname":"Blogger","version":"0.2.12-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GitGraph.zip","category":"Development","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GitGraph.md","dependencies":[],"name":"GIT Visualization","pkgname":"GitGraph","version":"0.1.5-b","author":"Dany LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LibreOffice.zip","category":"Office","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LibreOffice.md","dependencies":[],"name":"Libre Office Online","pkgname":"LibreOffice","version":"0.1.4-a","author":"Dany LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AceDiff.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AceDiff.md","dependencies":["ACECore@1.4.12-r"],"name":"AceDiff addon library","pkgname":"AceDiff","version":"3.0.3-r","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/OnlyOffice.zip","category":"Office","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/OnlyOffice.md","dependencies":[],"name":"Office Suite","pkgname":"OnlyOffice","version":"0.1.8-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vfsx.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vfsx.md","dependencies":[],"name":"AntOS VFS handles","pkgname":"vfsx","version":"0.1.1-b","author":"Dany LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/PDFLib.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/PDFLib.md","dependencies":[],"name":"PDFLib","pkgname":"PDFLib","version":"1.17.1","author":"pdf-lib.js.org"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antedit.zip","category":"Development","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antedit.md","dependencies":["MonacoCore@0.33.0-r"],"name":"Antos Editor","pkgname":"Antedit","version":"0.2.5-b","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Booklet.zip","category":"Office","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Booklet.md","dependencies":["SimpleMDE@2.18.0-r","Katex@0.11.1-r"],"name":"Booklet","pkgname":"Booklet","version":"0.2.5-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Docify.zip","category":"Office","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Docify.md","dependencies":["SQLiteDB@0.1.0-a","libpdfjs@2.6.347-r","PDFLib@1.17.1"],"name":"Docify","pkgname":"Docify","version":"0.1.1-b","author":"Dany LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelPlugins.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelPlugins.md","dependencies":["Antunnel@0.2.0-b"],"name":"Antunnel Plugins","pkgname":"AntunnelPlugins","version":"0.1.2-a","author":"Dany LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShowCase.zip","category":"Utility","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShowCase.md","dependencies":[],"name":"ShowCase","pkgname":"ShowCase","version":"0.0.7-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteDesktop.zip","category":"Internet","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteDesktop.md","dependencies":[],"name":"WVNC remote desktop","pkgname":"RemoteDesktop","version":"0.1.16-b","author":"Dany LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Clipper.zip","category":"Utility","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Clipper.md","dependencies":[],"name":"Clipper","pkgname":"Clipper","version":"0.1.4-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antunnel.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antunnel.md","dependencies":[],"name":"Antunnel","pkgname":"Antunnel","version":"0.2.1-b","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteCamera.zip","category":"Graphics","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteCamera.md","dependencies":["libjpeg@0.1.1-a","Antunnel@0.1.8-a"],"name":"Remote Camera","pkgname":"RemoteCamera","version":"0.1.5-a","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DiffEditor.zip","category":"Development","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DiffEditor.md","dependencies":["AceDiff@3.0.3-r"],"name":"Diff Editor","pkgname":"DiffEditor","version":"0.1.6-a","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libthreejs.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libthreejs.md","dependencies":[],"name":"libthreejs","pkgname":"libthreejs","version":"0.0.129-r","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SimpleMDE.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SimpleMDE.md","dependencies":[],"name":"EasyMDE","pkgname":"SimpleMDE","version":"2.18.0-r","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SQLiteDB.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SQLiteDB.md","dependencies":[],"name":"SQLite3 Browser","pkgname":"SQLiteDB","version":"0.1.0-a","author":"Dany LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GPClient.zip","category":"Internet","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GPClient.md","dependencies":[],"name":"Generic Purpose client","pkgname":"GPClient","version":"0.1.4-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vTerm.zip","category":"System","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vTerm.md","dependencies":["Antunnel@0.2.1-b","xTerm@5.1.0-r"],"name":"Virtual Terminal","pkgname":"vTerm","version":"0.1.20-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ActivityMonitor.zip","category":"System","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ActivityMonitor.md","dependencies":[],"name":"Activity monitor","pkgname":"ActivityMonitor","version":"0.0.8-b","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShaderPlayground.zip","category":"Development","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShaderPlayground.md","dependencies":["libthreejs@0.0.129-r"],"name":"OpenGL Shader Playground","pkgname":"ShaderPlayground","version":"0.0.4-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/MonacoCore.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/MonacoCore.md","dependencies":[],"name":"Monaco editor core","pkgname":"MonacoCore","version":"0.33.0-r","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LuaPlayground.zip","category":"Development","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LuaPlayground.md","dependencies":["ACECore@1.4.12-r"],"name":"LuaPlayground","pkgname":"LuaPlayground","version":"0.1.1-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/VizApp.zip","category":"Graphics","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/VizApp.md","dependencies":["ACECore@1.4.12-r"],"name":"Viz editor","pkgname":"VizApp","version":"0.1.0-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ServerLogClient.zip","category":"System","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ServerLogClient.md","dependencies":["Antunnel@0.2.1-b"],"name":"Server log monitor","pkgname":"ServerLogClient","version":"0.1.3-b","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Dockman.zip","category":"Development","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Dockman.md","dependencies":[],"name":"Remote Docker Manager","pkgname":"Dockman","version":"0.1.1-b","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SystemControl.zip","category":"System","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SystemControl.md","dependencies":["Antunnel@0.2.1-b"],"name":"System monitoring","pkgname":"SystemControl","version":"0.1.12-a","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libpdfjs.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libpdfjs.md","dependencies":[],"name":"PDF JS library","pkgname":"libpdfjs","version":"2.6.347-r","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ImageEditor.zip","category":"Graphics","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ImageEditor.md","dependencies":["libfabric@4.4.0-r"],"name":"Image editor","pkgname":"ImageEditor","version":"0.1.0-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DBDecoder.zip","category":"Other","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DBDecoder.md","dependencies":[],"name":"DBDecoder","pkgname":"DBDecoder","version":"0.0.2-a","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Katex.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Katex.md","dependencies":[],"name":"Katex","pkgname":"Katex","version":"0.11.1-r","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libplotly.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libplotly.md","dependencies":[],"name":"Plotly","pkgname":"libplotly","version":"2.6.2-r","author":"Dany LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/CodePad.zip","category":"Development","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/CodePad.md","dependencies":["ACECore@1.4.12-r"],"name":"Code","pkgname":"CodePad","version":"0.1.7-b","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelTestClient.zip","category":"Development","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelTestClient.md","dependencies":["Antunnel@0.2.1-b"],"name":"AntunnelTestClient","pkgname":"AntunnelTestClient","version":"0.1.0-a","author":"Dany LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libjpeg.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libjpeg.md","dependencies":[],"name":"libjpeg","pkgname":"libjpeg","version":"0.1.1-a","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libfabric.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libfabric.md","dependencies":[],"name":"Fabric.js library","pkgname":"libfabric","version":"4.4.0-r","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libantosdk.zip","category":"Development","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libantosdk.md","dependencies":[],"name":"AntOS SDK builder","pkgname":"libantosdk","version":"0.1.2-b","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/xTerm.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/xTerm.md","dependencies":[],"name":"xTerm Library","pkgname":"xTerm","version":"5.1.0-r","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/TinyEditor.zip","category":"Other","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/TinyEditor.md","dependencies":[],"name":"Tiny editor","pkgname":"TinyEditor","version":"0.0.4-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ACECore.zip","category":"Library","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ACECore.md","dependencies":[],"name":"ACE Editor core","pkgname":"ACECore","version":"1.4.12-r","author":""},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Preview.zip","category":"Graphics","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Preview.md","dependencies":["libpdfjs@2.6.347-r"],"name":"Preview","pkgname":"Preview","version":"0.1.3-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GraphEditor.zip","category":"Graphics","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GraphEditor.md","dependencies":["ACECore@1.4.12-r"],"name":"Graph Editor","pkgname":"GraphEditor","version":"0.1.2-a","author":"Xuan Sang LE"},{"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/MarkOn.zip","category":"Office","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/MarkOn.md","dependencies":["SimpleMDE@2.18.0-r"],"name":"Markdown editor","pkgname":"MarkOn","version":"0.1.1-a","author":"Xuan Sang LE"}] \ No newline at end of file +[{"name":"Archive","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Archive.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Archive.zip","pkgname":"Archive","dependencies":[],"category":"Utility","version":"0.0.4-a"},{"name":"libwvnc","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libwvnc.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libwvnc.zip","pkgname":"libwvnc","dependencies":["libjpeg@0.1.1-a"],"category":"Library","version":"0.1.2-a"},{"name":"About AntOS","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/About.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/About.zip","pkgname":"About","dependencies":[],"category":"Utility","version":"0.1.2-b"},{"name":"Blogging application","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Blogger.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Blogger.zip","pkgname":"Blogger","dependencies":["SimpleMDE@2.18.0-r","Katex@0.11.1-r","SQLiteDB@0.1.0-a"],"category":"Internet","version":"0.2.13-a"},{"name":"GIT Visualization","author":"Dany LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GitGraph.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GitGraph.zip","pkgname":"GitGraph","dependencies":[],"category":"Development","version":"0.1.5-b"},{"name":"Libre Office Online","author":"Dany LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LibreOffice.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LibreOffice.zip","pkgname":"LibreOffice","dependencies":[],"category":"Office","version":"0.1.4-a"},{"name":"AceDiff addon library","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AceDiff.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AceDiff.zip","pkgname":"AceDiff","dependencies":["ACECore@1.4.12-r"],"category":"Library","version":"3.0.3-r"},{"name":"Office Suite","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/OnlyOffice.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/OnlyOffice.zip","pkgname":"OnlyOffice","dependencies":[],"category":"Office","version":"0.1.8-a"},{"name":"AntOS VFS handles","author":"Dany LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vfsx.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vfsx.zip","pkgname":"vfsx","dependencies":[],"category":"Library","version":"0.1.1-b"},{"name":"PDFLib","author":"pdf-lib.js.org","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/PDFLib.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/PDFLib.zip","pkgname":"PDFLib","dependencies":[],"category":"Library","version":"1.17.1"},{"name":"Antos Editor","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antedit.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antedit.zip","pkgname":"Antedit","dependencies":["MonacoCore@0.33.0-r"],"category":"Development","version":"0.2.5-b"},{"name":"Booklet","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Booklet.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Booklet.zip","pkgname":"Booklet","dependencies":["SimpleMDE@2.18.0-r","Katex@0.11.1-r"],"category":"Office","version":"0.2.5-a"},{"name":"Docify","author":"Dany LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Docify.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Docify.zip","pkgname":"Docify","dependencies":["SQLiteDB@0.1.0-a","libpdfjs@2.6.347-r","PDFLib@1.17.1"],"category":"Office","version":"0.1.1-b"},{"name":"Antunnel Plugins","author":"Dany LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelPlugins.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelPlugins.zip","pkgname":"AntunnelPlugins","dependencies":["Antunnel@0.2.0-b"],"category":"Library","version":"0.1.2-a"},{"name":"ShowCase","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShowCase.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShowCase.zip","pkgname":"ShowCase","dependencies":[],"category":"Utility","version":"0.0.7-a"},{"name":"WVNC remote desktop","author":"Dany LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteDesktop.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteDesktop.zip","pkgname":"RemoteDesktop","dependencies":[],"category":"Internet","version":"0.1.16-b"},{"name":"Clipper","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Clipper.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Clipper.zip","pkgname":"Clipper","dependencies":[],"category":"Utility","version":"0.1.4-a"},{"name":"Antunnel","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antunnel.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antunnel.zip","pkgname":"Antunnel","dependencies":[],"category":"Library","version":"0.2.1-b"},{"name":"Remote Camera","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteCamera.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteCamera.zip","pkgname":"RemoteCamera","dependencies":["libjpeg@0.1.1-a","Antunnel@0.1.8-a"],"category":"Graphics","version":"0.1.5-a"},{"name":"Diff Editor","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DiffEditor.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DiffEditor.zip","pkgname":"DiffEditor","dependencies":["AceDiff@3.0.3-r"],"category":"Development","version":"0.1.6-a"},{"name":"libthreejs","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libthreejs.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libthreejs.zip","pkgname":"libthreejs","dependencies":[],"category":"Library","version":"0.0.129-r"},{"name":"EasyMDE","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SimpleMDE.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SimpleMDE.zip","pkgname":"SimpleMDE","dependencies":[],"category":"Library","version":"2.18.0-r"},{"name":"SQLite3 Browser","author":"Dany LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SQLiteDB.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SQLiteDB.zip","pkgname":"SQLiteDB","dependencies":[],"category":"Library","version":"0.1.0-a"},{"name":"Generic Purpose client","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GPClient.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GPClient.zip","pkgname":"GPClient","dependencies":[],"category":"Internet","version":"0.1.4-a"},{"name":"Virtual Terminal","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vTerm.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vTerm.zip","pkgname":"vTerm","dependencies":["Antunnel@0.2.1-b","xTerm@5.1.0-r"],"category":"System","version":"0.1.20-a"},{"name":"Activity monitor","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ActivityMonitor.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ActivityMonitor.zip","pkgname":"ActivityMonitor","dependencies":[],"category":"System","version":"0.0.8-b"},{"name":"OpenGL Shader Playground","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShaderPlayground.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShaderPlayground.zip","pkgname":"ShaderPlayground","dependencies":["libthreejs@0.0.129-r"],"category":"Development","version":"0.0.4-a"},{"name":"Monaco editor core","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/MonacoCore.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/MonacoCore.zip","pkgname":"MonacoCore","dependencies":[],"category":"Library","version":"0.33.0-r"},{"name":"LuaPlayground","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LuaPlayground.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LuaPlayground.zip","pkgname":"LuaPlayground","dependencies":["ACECore@1.4.12-r"],"category":"Development","version":"0.1.1-a"},{"name":"Viz editor","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/VizApp.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/VizApp.zip","pkgname":"VizApp","dependencies":["ACECore@1.4.12-r"],"category":"Graphics","version":"0.1.0-a"},{"name":"Server log monitor","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ServerLogClient.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ServerLogClient.zip","pkgname":"ServerLogClient","dependencies":["Antunnel@0.2.1-b"],"category":"System","version":"0.1.3-b"},{"name":"Remote Docker Manager","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Dockman.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Dockman.zip","pkgname":"Dockman","dependencies":[],"category":"Development","version":"0.1.1-b"},{"name":"System monitoring","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SystemControl.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SystemControl.zip","pkgname":"SystemControl","dependencies":["Antunnel@0.2.1-b"],"category":"System","version":"0.1.12-a"},{"name":"PDF JS library","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libpdfjs.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libpdfjs.zip","pkgname":"libpdfjs","dependencies":[],"category":"Library","version":"2.6.347-r"},{"name":"Image editor","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ImageEditor.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ImageEditor.zip","pkgname":"ImageEditor","dependencies":["libfabric@4.4.0-r"],"category":"Graphics","version":"0.1.0-a"},{"name":"DBDecoder","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DBDecoder.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DBDecoder.zip","pkgname":"DBDecoder","dependencies":[],"category":"Other","version":"0.0.2-a"},{"name":"Katex","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Katex.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Katex.zip","pkgname":"Katex","dependencies":[],"category":"Library","version":"0.11.1-r"},{"name":"Plotly","author":"Dany LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libplotly.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libplotly.zip","pkgname":"libplotly","dependencies":[],"category":"Library","version":"2.6.2-r"},{"name":"Code","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/CodePad.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/CodePad.zip","pkgname":"CodePad","dependencies":["ACECore@1.4.12-r"],"category":"Development","version":"0.1.7-b"},{"name":"AntunnelTestClient","author":"Dany LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelTestClient.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelTestClient.zip","pkgname":"AntunnelTestClient","dependencies":["Antunnel@0.2.1-b"],"category":"Development","version":"0.1.0-a"},{"name":"libjpeg","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libjpeg.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libjpeg.zip","pkgname":"libjpeg","dependencies":[],"category":"Library","version":"0.1.1-a"},{"name":"Fabric.js library","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libfabric.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libfabric.zip","pkgname":"libfabric","dependencies":[],"category":"Library","version":"4.4.0-r"},{"name":"AntOS SDK builder","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libantosdk.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libantosdk.zip","pkgname":"libantosdk","dependencies":[],"category":"Development","version":"0.1.2-b"},{"name":"xTerm Library","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/xTerm.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/xTerm.zip","pkgname":"xTerm","dependencies":[],"category":"Library","version":"5.1.0-r"},{"name":"Tiny editor","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/TinyEditor.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/TinyEditor.zip","pkgname":"TinyEditor","dependencies":[],"category":"Other","version":"0.0.4-a"},{"name":"ACE Editor core","author":"","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ACECore.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ACECore.zip","pkgname":"ACECore","dependencies":[],"category":"Library","version":"1.4.12-r"},{"name":"Preview","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Preview.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Preview.zip","pkgname":"Preview","dependencies":["libpdfjs@2.6.347-r"],"category":"Graphics","version":"0.1.3-a"},{"name":"Graph Editor","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GraphEditor.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GraphEditor.zip","pkgname":"GraphEditor","dependencies":["ACECore@1.4.12-r"],"category":"Graphics","version":"0.1.2-a"},{"name":"Markdown editor","author":"Xuan Sang LE","description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/MarkOn.md","download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/MarkOn.zip","pkgname":"MarkOn","dependencies":["SimpleMDE@2.18.0-r"],"category":"Office","version":"0.1.1-a"}] \ No newline at end of file