|
42 | 42 | } |
43 | 43 |
|
44 | 44 | /*.......( Item Type File )...............................................*/ |
45 | | - .target-pod .pod-data .file { |
| 45 | + .target-pod .pod-data .file, |
| 46 | + .pod-data .unknown { |
46 | 47 | display: none; |
47 | 48 | } |
48 | 49 |
|
@@ -283,9 +284,7 @@ <h2>Target</h2> |
283 | 284 | <script src="https://cdn.simplyedit.io/1/simply-edit.js" data-simply-storage="none"></script> |
284 | 285 | <script src="https://unpkg.com/simplyview/dist/simply.everything.js"></script> |
285 | 286 | <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"> |
289 | 288 | const getDefaultSession = solidAuthn.getDefaultSession; |
290 | 289 | const Parser = n3.Parser; |
291 | 290 |
|
@@ -476,10 +475,78 @@ <h2>Target</h2> |
476 | 475 | }) |
477 | 476 | ) |
478 | 477 | }, |
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 | + }, |
483 | 550 | } |
484 | 551 |
|
485 | 552 | const solidApp = simply.app({ |
@@ -508,7 +575,9 @@ <h2>Target</h2> |
508 | 575 | if (! values.url) { |
509 | 576 | return solidApp.actions.log(`Please provide an URL as ${values.pod} pod!`, 0, 'error') |
510 | 577 | } |
511 | | - |
| 578 | + if (values.url[values.url.length-1]!='/') { |
| 579 | + values.url+='/'; |
| 580 | + } |
512 | 581 | solidApp.view.pods[values.pod].url = values.url |
513 | 582 |
|
514 | 583 | return solidApi.listPodContent(values.url) |
@@ -536,27 +605,40 @@ <h2>Target</h2> |
536 | 605 |
|
537 | 606 | const sourcePromises = selectedSources.map( |
538 | 607 | 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') |
540 | 609 |
|
541 | 610 | return solidApi.copy(selectedSource, selectedTarget) |
542 | 611 | .then(responses => Array.isArray(responses) ? responses : [responses]) |
543 | 612 | } |
544 | 613 | ) |
545 | 614 |
|
546 | 615 | 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 | + |
548 | 622 | promise.value.forEach(response => { |
549 | 623 | response = response.value ? response.value : response |
550 | 624 | if (response === undefined) { |
551 | 625 | solidApp.actions.log(`[FAILED]`, 0, 'error') |
552 | | - } else { |
553 | | - solidApp.actions.log(`[DONE] Copying "${response.url}" (from "${response.sourceUrl}")`, 0, 'debug') |
554 | 626 | } |
555 | 627 | }) |
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 | + }) |
560 | 642 | }, |
561 | 643 | }, |
562 | 644 | view: { |
@@ -586,5 +668,15 @@ <h2>Target</h2> |
586 | 668 | }) |
587 | 669 | } |
588 | 670 | }) |
| 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 | + } |
589 | 681 | </script> |
590 | 682 | </body> |
0 commit comments