Skip to content

Commit 6029414

Browse files
committed
[bibliographie] UX improvements and new external resource view for pdfs that allows to import
SQUASHED: bibliographie-UX-improvements-and-new-external-resource-view-for-pdfs-that-allows-to-import,
1 parent 57ab579 commit 6029414

File tree

9 files changed

+163
-11
lines changed

9 files changed

+163
-11
lines changed

[object Object]

213 KB
Binary file not shown.

src/client/bibliography.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ Bibliography.cleanTitle("{{This is my Title}}")
104104
MD*/
105105

106106
static cleanTitle(titleString="") {
107-
return titleString.replace(/[{}:\[\]]/g,"").replace(/[]/g," ")
107+
return titleString.replace(/[{}\[\]]/g,"").replace(/['`,.;:"] ?/g," ")
108108
}
109109

110110
// #TODO this method obviously will need a lot of tweaking...

src/client/files.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,15 @@ export default class Files {
119119

120120

121121
static async copyURLtoURL(fromURL, toURL) {
122-
var blob = await fetch(fromURL, {method: 'GET'}).then(r => r.blob())
122+
try {
123+
var getResp = await fetch(fromURL, {method: 'GET'})
124+
} catch(e) {
125+
console.log("[files] copyURLtoURL... falling back to server side download for: " + fromURL)
126+
var lively4serverurl = lively4url.replace(/[^/]*$/,"")
127+
getResp = await fetch(lively4serverurl = "/_curl/?target=" + fromURL)
128+
// Error maybe due to CORS?
129+
}
130+
var blob = await getResp.blob()
123131
return fetch(toURL, {method: 'PUT', body: blob})
124132
}
125133

src/client/literature.js

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -446,9 +446,6 @@ export class Paper {
446446
}
447447

448448
async toHTML() {
449-
await this.resolveReferences() // .then(() => lively.notify("resolved references for " + this.key))
450-
await this.findReferencedBy()
451-
452449
var bibtexEntries = await this.findBibtexFileEntries()
453450
var pdfs = this.value.S && this.value.S.filter(ea => ea.Ty == 3).map(ea => ea.U);
454451

@@ -490,8 +487,18 @@ export class Paper {
490487
491488
</div>
492489
${
493-
pdfs && pdfs.length > 0 ?
494-
"<h3>Online PDFs</h3>" + pdfs.map(url => `<a href="${url}">${url.replace(/.*\//,"")}</a>`) : ""
490+
pdfs && pdfs.length > 0 ? "<h3>Import PDFs</h3>" +
491+
`<lively-script><script>
492+
var pdfs = ${JSON.stringify(pdfs)}
493+
var container = lively.query(this, "lively-container")
494+
var result = <span>{...pdfs.map(ea => <a click={async () => {
495+
var comp = await lively.openComponentInWindow("external-resource")
496+
comp.importURL = ${JSON.stringify(await this.toImportURL())}
497+
comp.src = ea
498+
}}>{ea.replace(/.*\\//,"")} </a>)}</span>
499+
result
500+
</script></lively-script>`: ""
501+
// + pdfs.map(url => `<a href="${url}" onclick="${}">${url.replace(/.*\//,"")}</a>`)
495502
}
496503
<h3>Bibliographies</h3>
497504
<div>${
@@ -520,10 +527,49 @@ export class Paper {
520527
<h3>Abstract</h3>
521528
<div class="abstract">${this.abstract}</div>
522529
<h3>References</h3>
523-
${this.papersToBibtex(this.references)}
530+
${`
531+
<lively-script><script>
532+
var paper = Paper.byId(${this.microsoftid})
533+
paper.resolveReferences().then(() => paper.papersToBibtex(paper.references))
534+
</script></lively-script>`}
535+
524536
<h3>Referenced By</h3>
525-
${this.papersToBibtex(this.referencedBy)}
537+
${`
538+
<lively-script><script>
539+
var paper = Paper.byId(${this.microsoftid})
540+
paper.findReferencedBy().then(() => paper.papersToBibtex(paper.referencedBy))
541+
</script></lively-script>`}
542+
526543
</div>`
544+
545+
546+
/*
547+
548+
await this.resolveReferences() // .then(() => lively.notify("resolved references for " + this.key))
549+
await this.findReferencedBy()
550+
551+
${this.papersToBibtex(this.references)}
552+
553+
${this.papersToBibtex(this.referencedBy)}
554+
*/
555+
556+
}
557+
558+
async generateFilename() {
559+
var entry = this.toBibtexEntry()
560+
var bibentry = await (<lively-bibtex-entry></lively-bibtex-entry>)
561+
bibentry.value = entry
562+
var filename = bibentry.generateFilename(entry)
563+
return filename + ".pdf"
564+
}
565+
566+
async toImportURL() {
567+
var filename = await this.generateFilename()
568+
var baseURL = await Paper.importBaseURL()
569+
if (!baseURL) {
570+
throw new Error("[Paper] toImportURL error: could not find baseURL " + Paper.importBaseURLDirName())
571+
}
572+
return baseURL + filename
527573
}
528574

529575
toBibtex() {
@@ -536,6 +582,17 @@ export class Paper {
536582
contentNode.appendChild(inspector.display(this.toBibtex(), false, "#bibtex", this))
537583
}
538584

585+
static importBaseURLDirName() {
586+
return "_incoming" // #TODO add to preferences....
587+
}
588+
589+
static async importBaseURL() {
590+
// #TODO make this also more customizeable
591+
var files = await FileIndex.current().db.files.toArray()
592+
var file = files.find(ea => ea.url.match(`/${this.importBaseURLDirName()}/`))
593+
return file && file.url.replace(/[^/]*$/,"")
594+
}
595+
539596
}
540597

541598

src/client/protocols/academic.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ export default class AcademicScheme extends Scheme {
9696
return focalStorage.setItem(academicSubscriptionKeyId, key);
9797
}
9898

99-
10099
static async getSubscriptionKey() {
101100
var key = await focalStorage.getItem(academicSubscriptionKeyId);
102101
if (!key) {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<template id="external-resource" >
2+
<style data-src="/src/external/font-awesome/css/font-awesome.css"></style>
3+
<style data-src="/templates/livelystyle.css"></style>
4+
<style>
5+
:host {
6+
7+
}
8+
</style>
9+
<button id="import">import</button>
10+
<button id="open">open</button>
11+
<lively-iframe src=""></lively-iframe>
12+
</template>
13+
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
2+
import Morph from 'src/components/widgets/lively-morph.js';
3+
4+
export default class ExternalResource extends Morph {
5+
async initialize() {
6+
7+
this.updateView()
8+
this.registerButtons()
9+
}
10+
11+
12+
get src() {
13+
return this.getAttribute("src")
14+
}
15+
16+
set src(url) {
17+
this.setAttribute("src", url)
18+
this.updateView()
19+
}
20+
21+
get importURL() {
22+
return this.getAttribute("import-url")
23+
}
24+
25+
set importURL(url) {
26+
this.setAttribute("import-url", url)
27+
this.updateView()
28+
}
29+
30+
async onImport() {
31+
if (!this.src) throw new Error('src url missing')
32+
if(!this.importURL) throw new Error('import url missing')
33+
await lively.files.copyURLtoURL(this.src, this.importURL)
34+
lively.notify("imported", this.importURL, undefined, () => {
35+
lively.openBrowser(this.importURL)
36+
})
37+
this.get("#open").hidden = false
38+
}
39+
40+
async onOpen() {
41+
lively.openBrowser(this.importURL)
42+
}
43+
44+
async updateView() {
45+
var frame = this.get('lively-iframe')
46+
frame.setURL(this.src)
47+
frame.hideMenubar()
48+
if (this.importURL == null) {
49+
this.get("#import").hidden = true
50+
} else {
51+
this.get("#import").hidden = false
52+
}
53+
this.get("#open").hidden = true
54+
if (this.importURL && await lively.files.existFile(this.importURL)) {
55+
this.get("#open").hidden = false
56+
}
57+
58+
}
59+
60+
61+
async livelyExample() {
62+
this.importURL = "http://localhost:9005/Dropbox/Thesis/Literature/_misc/LatozaTest.pdf"
63+
this.src = "https://www.st.cs.uni-saarland.de/edu/empirical-se/2006/PDFs/latoza06.pdf"
64+
}
65+
66+
67+
}

src/components/tools/literature-listing.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,6 @@ export default class LiteratureListing extends Morph {
172172
}
173173

174174
renderLiteratureFile(literatureFile) {
175-
debugger
176175
var entryDetails = literatureFile.entry ?
177176
<span>
178177
<span class="authors">{literatureFile.entry.authors.join(", ")}</span>.

test/bibliography-test.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ describe('Bibliography', () => {
1111
expect(Bibliography.threeSignificantInitialsFromTitle(title)).to.equal("OSU")
1212
});
1313
})
14+
15+
describe('cleanTitle', () => {
16+
it('it strips special chars', async function() {
17+
expect(Bibliography.cleanTitle(`Hello:World`)).to.equal("Hello World")
18+
});
19+
it('it does not insert extra whitespace', async function() {
20+
expect(Bibliography.cleanTitle(`Hello: World`)).to.equal("Hello World")
21+
});
22+
})
1423

1524
describe('filenameToKey', () => {
1625
it('converts normal filename', async function() {

0 commit comments

Comments
 (0)