Skip to content

Commit 3ff1261

Browse files
committed
added writing of .meta file
1 parent e9fc6e4 commit 3ff1261

1 file changed

Lines changed: 109 additions & 17 deletions

File tree

www/index.html

Lines changed: 109 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@
4242
}
4343

4444
/*.......( Item Type File )...............................................*/
45-
.target-pod .pod-data .file {
45+
.target-pod .pod-data .file,
46+
.pod-data .unknown {
4647
display: none;
4748
}
4849

@@ -283,9 +284,7 @@ <h2>Target</h2>
283284
<script src="https://cdn.simplyedit.io/1/simply-edit.js" data-simply-storage="none"></script>
284285
<script src="https://unpkg.com/simplyview/dist/simply.everything.js"></script>
285286
<script src="https://zettelkasten.dev.muze.nl/assets/js/bundle.js"></script>
286-
<script type="module">
287-
// import { getDefaultSession } from 'https://cdn.skypack.dev/@inrupt/solid-client-authn-browser@v1.11.2'
288-
// import { Parser } from 'https://cdn.skypack.dev/n3'
287+
<script xtype="module">
289288
const getDefaultSession = solidAuthn.getDefaultSession;
290289
const Parser = n3.Parser;
291290

@@ -476,10 +475,78 @@ <h2>Target</h2>
476475
})
477476
)
478477
},
479-
writeToPod: (url, content) => solidSession.fetch(url, {
480-
body: content,
481-
method: 'PUT'
482-
}),
478+
writeMeta: (pods, sources, target) => {
479+
// do nothing
480+
var sourceUrl = pods.source.url;
481+
if (sourceUrl[sourceUrl.length-1]!=='/') {
482+
sourceUrl+='/';
483+
}
484+
if (target[target.length-1]!=='/') {
485+
target+='/';
486+
}
487+
var redirects = {};
488+
sources.forEach(source => {
489+
let filenames = source.split('/');
490+
let filename = filenames.pop();
491+
redirects[filename] = target+filename;
492+
});
493+
const parser = new Parser({blankNodePrefix: '', baseIRI: sourceUrl+'.meta'})
494+
var prefixes = {};
495+
solidApi.fetchFromPod(sourceUrl+'.meta')
496+
.then(text => parser.parse(text, null, (prefix, url) => { prefixes[prefix] = url.id }))
497+
.then(data => {
498+
return {
499+
data: data,
500+
prefixes: prefixes
501+
};
502+
})
503+
.then(meta => {
504+
var lm = 'https://purl.org/pdsinterop/link-metadata#';
505+
var lmPrefix = '';
506+
var preferredPrefix = 'lm';
507+
Object.keys(meta.prefixes).forEach(prefix => {
508+
if (meta.prefixes[prefix]==lm) {
509+
lmPrefix = prefix;
510+
}
511+
});
512+
if (!lmPrefix) {
513+
count = 0;
514+
do {
515+
lmPrefix = preferredPrefix + (count ? count : '');
516+
count++;
517+
} while (meta.prefixes[lmPrefix]);
518+
meta.prefixes[lmPrefix] = lm;
519+
}
520+
var newMeta = new n3.Writer({
521+
format: 'text/turtle'
522+
});
523+
newMeta.addPrefixes(meta.prefixes);
524+
newMeta.addQuads(meta.data);
525+
Object.keys(redirects).forEach(redirect => {
526+
newMeta.addQuad(
527+
new n3.NamedNode(redirect),
528+
new n3.NamedNode(lm+'redirectPermanent'),
529+
new n3.NamedNode(redirects[redirect])
530+
);
531+
});
532+
newMeta.end((error,result) => {
533+
console.log(result);
534+
solidApi.writeToPod(sourceUrl+'.meta', result, 'text/turtle')
535+
})
536+
})
537+
},
538+
writeToPod: (url, content, contentType=false) => {
539+
var fetchParams = {
540+
body: content,
541+
method: 'PUT'
542+
};
543+
if (contentType){
544+
fetchParams.headers = {
545+
'Content-Type': contentType
546+
};
547+
}
548+
solidSession.fetch(url, fetchParams)
549+
},
483550
}
484551

485552
const solidApp = simply.app({
@@ -508,7 +575,9 @@ <h2>Target</h2>
508575
if (! values.url) {
509576
return solidApp.actions.log(`Please provide an URL as ${values.pod} pod!`, 0, 'error')
510577
}
511-
578+
if (values.url[values.url.length-1]!='/') {
579+
values.url+='/';
580+
}
512581
solidApp.view.pods[values.pod].url = values.url
513582

514583
return solidApi.listPodContent(values.url)
@@ -536,27 +605,40 @@ <h2>Target</h2>
536605

537606
const sourcePromises = selectedSources.map(
538607
selectedSource => {
539-
solidApp.actions.log(`[START] Copying <code>${selectedSource}</code> to ${selectedTarget}`, 0, 'info')
608+
// solidApp.actions.log(`[START] Copying <code>${selectedSource}</code> to ${selectedTarget}`, 0, 'info')
540609

541610
return solidApi.copy(selectedSource, selectedTarget)
542611
.then(responses => Array.isArray(responses) ? responses : [responses])
543612
}
544613
)
545614

546615
Promise.allSettled(sourcePromises)
547-
.then(promises => promises.forEach(promise => {
616+
.then(promises => {
617+
promises.forEach((promise,index) => {
618+
if (!promise.value) {
619+
solidApp.actions.log(`Failed copying "${selectedSources[index]}"`, 0, 'error')
620+
} else {
621+
548622
promise.value.forEach(response => {
549623
response = response.value ? response.value : response
550624
if (response === undefined) {
551625
solidApp.actions.log(`[FAILED]`, 0, 'error')
552-
} else {
553-
solidApp.actions.log(`[DONE] Copying "${response.url}" (from "${response.sourceUrl}")`, 0, 'debug')
554626
}
555627
})
556-
})
557-
)
558-
.then(() => solidApp.actions.log(`[DONE] Copying selected ${JSON.stringify(selectedSources)} to "${selectedTarget}"`, 0, 'success'))
559-
.catch(error => console.error('!!! ADRIAaaaaaaaaN !!!', error))
628+
}
629+
})
630+
return promises;
631+
})
632+
.then(() => {
633+
solidApp.actions.log(`Copied selected files to "${selectedTarget}"`, 0, 'success');
634+
return solidApi.writeMeta(solidApp.view.pods, selectedSources, selectedTarget);
635+
636+
//todo update source and target views
637+
})
638+
.catch(error => {
639+
solidApp.actions.log(`Failed Copying selected files to "${selectedTarget}"`, 0, 'error');
640+
console.error(error)
641+
})
560642
},
561643
},
562644
view: {
@@ -586,5 +668,15 @@ <h2>Target</h2>
586668
})
587669
}
588670
})
671+
672+
function dereferencePrefixes(predicate, prefixes) {
673+
if (predicate.indexOf(':')!==false) {
674+
var prefix = predicate.split(':')[0];
675+
if (prefixes[prefix]) {
676+
predicate = prefixes[prefix]+predicate.split(':')[1];
677+
}
678+
}
679+
return predicate;
680+
}
589681
</script>
590682
</body>

0 commit comments

Comments
 (0)