diff options
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | data_store/tags.csv | 102 | ||||
| -rw-r--r-- | db.json | 711 | ||||
| -rw-r--r-- | index.js | 9 | ||||
| -rw-r--r-- | load_spreadsheet.js | 193 | ||||
| -rw-r--r-- | package.json | 3 | ||||
| -rw-r--r-- | public/assets/css/css.css | 19 | ||||
| -rw-r--r-- | src/graph.js | 120 | ||||
| -rw-r--r-- | src/index.js | 150 | ||||
| -rw-r--r-- | src/views/Detail.js | 31 | ||||
| -rw-r--r-- | templates/_header.liquid | 1 | ||||
| -rw-r--r-- | templates/home.liquid | 2 | ||||
| -rw-r--r-- | templates/review.liquid | 15 | ||||
| -rw-r--r-- | yarn.lock | 61 |
15 files changed, 1073 insertions, 348 deletions
@@ -17,3 +17,5 @@ public/swimmer/ public/assets/js/bundle.js.map public/assets/js/bundle.js +data_store + @@ -51,7 +51,7 @@ The site runs in production using `pm2`. If the server ever restarts, you can restart the KM site this way: ```bash -pm2 start index.js --name km +pm2 start index.js --name no6092 ``` ### Synchronizing diff --git a/data_store/tags.csv b/data_store/tags.csv index 5237f4f..d6a3716 100644 --- a/data_store/tags.csv +++ b/data_store/tags.csv @@ -1,51 +1,51 @@ -Title,Index,No6092,1620s,painting,blunt,National Gallery of Canada,AGO,courtauld,intervensions,connosieurship,double agent,forensics,black box,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-No6092: Augustus and Cleopatra,1,x,x,x,x,x,,,,x,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-No6092: Xray,2,x,,,,x,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-BLUNT: Apollo,3,x,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Note on Mr. McCurry's Visit ,4,x,,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Telegram ,5,x,,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Record of Work Done ,6,x,,,,x,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Index Card: Receiving ,7,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Letter to Robert H. Hubbard 3.2 ,8,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Letter to Denis Mahon ,9,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Close Up of no6092 Label ,10,x,,,,x,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Letter to Robert H. Hubbbard 27.3,11,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Note on Two Paintings ,12,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Letter to Konrad Oberhuber ,13,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Letter to William H. Gerdts ,14,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Letter to Louise d'Argencourt ,15,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Letter to Myron Laskin ,16,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Letter to Marilyn Lavin ,17,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-"Memo: Italian School 17th Century, ",18,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Letter to Konrad Oberhuber ,19,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Notes on Radiographs of Five Paintings,20,x,,,,,,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Radiograph of landscape,21,,,x,,x,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-COURBET: Woman Painted at Palavas ,22,,,x,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-MOORE:Group of Shelterers During an Air Raid,23,,,x,x,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-MOORE: Two Women on a Bench,24,,,x,x,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Email RE: Toronto Courbet ,25,,,,,,x,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-"""Courbet Signatures"" ",26,,,,,,x,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-COURBET: Woman Painted at Palavas (detail) ,27,,,,,,x,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Invitation to Blunt Lecture ,28,,,,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-BLUNT: Letter from Sir Anthony Blunt to William J. Withrow ,29,,,,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-STANKIEVECH: An Apology for Poussin’s Augustus ,30,,,,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-STANKIEVECH: Courtauld Cocktail ,31,,,,,,,x,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-BURGESS:Letter to Anthony Blunt,32,,,,x,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Stankievech: The Secret Agent ,33,,,,,,,,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-BLUNT: The Criminal-King in the 19th Century Novel,34,,,,x,,,x,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Connoisseurs and Secret Agents ,35,,,,x,,,x,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-BBC Panorama: The Queen's Gallery ,36,,,,x,,,,,x,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-RUIZ: L'Hypothèse du tableau volé ,37,,,x,,,,,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-BENJAMINL Mondrian 63-96 ,38,,,x,,,,,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-"BROODTHAERS:The conquest of space, ",39,,,,,,,,,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-WARBURG: Der Bildatlas Mnemosyne ,40,,,,,,,x,,x,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-MANCINI: Considerazioni sulla pittura,41,,x,x,,,,,,x,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-STANKIEVECH: Mancini's Caratteri / Warburg’s Atlas,42,,x,,,,,,x,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-RUBENS: Letter to Nicolas-Claude ,43,,x,x,,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-POE: The Purloined Letter,44,,,,,,,,,,x,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-LACAN: Seminar on The Purloined Letter,45,x,,,x,,,,,,x,x,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-MI6: Zinoviev Letter,46,,,,,,,,,,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-UN: Vienna Convention On Diplomatic Relations,47,,x,,x,,,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Key to Wittgensteinhaus,48,,,,,,,,,,x,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-STANKIEVECH: no6092: The Purloined Letter,49,x,,,,,,,x,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-The Luxembourg Freeport: ,50,,,,,,,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
\ No newline at end of file +Title,Index,IDK,No6092,1620s,painting,blunt,National Gallery of Canada,AGO,courtauld,intervensions,connsoeurship,double agent,forensics,black box,Stankievech
+01 Poussin: No6092,1,x,x,x,x,x,x,,,,x,,x,x,
+02 No6092: Xray,2,x,x,,,,x,,,,,,x,,
+03 Blunt: Apollo,3,,x,,,x,,,,,,,,,
+04 Blunt: McCurry's Visit ,4,,x,,,x,x,,,,,,,,
+05 Blunt: Telegram ,5,,x,,,x,x,,,,,,,,
+06 NGC: Record ,6,,x,,,,x,,,,,,x,,
+07 NGC: Receiving ,7,,x,,,,x,,,,,,,,
+08 Mahon to Hubbard,8,,x,,,,x,,,,,,,,
+09 Hubbard to Mahon ,9,,x,,,,x,,,,,,,,
+10 No6092: Label ,10,,x,,,,x,,,,,,x,,
+11 Mahon to Hubbard,11,,x,,,,x,,,,,,,,
+12 Laskin: Note,12,,x,,,,x,,,,,,,,
+13 Laskin to Oberhuber ,13,,x,,,,x,,,,,,,,
+14 Laskin to Gerdts ,14,,x,,,,x,,,,,,,,
+15 Miles to d'Argencourt ,15,,x,,,,x,,,,,,,,
+16 Lavin to Laskin ,16,,x,,,,x,,,,,,,,
+17 Laskin to Lavin ,17,,x,,,,x,,,,,,,,
+18 NGC: Italian Memo,18,,x,,,,x,,,,,,,,
+19 Laskin to Oberhuber ,19,,x,,,,x,,,,,,,,
+20 Rees: Xrays,20,,x,,,,,,x,,,,x,,
+21 Poussin: Xray,21,,,,x,,x,,,,,,x,,
+22 Courbet: Painting,22,,,,x,x,,x,,,,,,,
+23 Moore: Painting I,23,,,,x,x,,x,x,,,,,,
+24 Moore: Painting II,24,,,,x,x,,x,x,,,,,,
+25 Chu: Courbet Signature,25,,,,,,,x,,,,,x,,
+26 Fernier: Courbet Signatures,26,,,,,,,x,,,,,x,,
+27 Courbet: Signature,27,,,,,,,x,,,,,x,,
+28 AGO: Blunt Lecture ,28,,,,,x,,x,,,,,,,
+29 Blunt: AGO Opening,29,,,,,x,,x,,,,,,,
+30 Stankievech: An Apology ,30,,,,,x,,,,x,,,,,x
+31 Stankievech: Courtauld Cocktail ,31,,,,,,,,x,x,,x,,,x
+32 Burgess to Blunt,32,,,,,x,,,,,,x,,,
+33 Stankievech: Secret Agent ,33,,,,,,,,,x,,x,,,x
+34 Blunt: Warburg Journal,34,,,,,x,,,x,,,x,,,
+35 Lewis: Secret Agents ,35,,,,,x,,,x,,x,x,,,
+36 Blunt: BBC ,36,,,,,x,,,,,x,x,,x,
+37 Ruiz: L'Hypothèse du tableau volé ,37,,,,x,,,,,,x,x,,,
+38 Benjamin: Mondrian,38,,,,x,,,,,,x,x,,,
+39 Broodthaers: Atlas,39,,,,,,,,,,x,x,,,
+40 Warburg: Mnemosyne Atlas ,40,,,,,,,,x,,x,x,x,,
+41 Mancini: Pittura,41,,,x,x,,,,,,x,x,x,,
+42 Stankievech: Mancini / Warburg,42,,,x,,,,,,x,x,,x,,x
+43 Ruebens to Nicolas-Claude ,43,,,x,x,,,,,,,x,,,
+44 Poe: Purloined Letter,44,,,,,,,,,,,x,x,x,
+45 Lacan: Purloined Letter,45,,x,,,x,,,,,,x,x,x,
+46 MI6: Zinoviev Letter,46,,,,,,,,,,,x,,x,
+47 UN: Vienna Convention,47,,,x,,x,,,,,,,,x,
+48 Wittgenstein Key,48,,,,,,,,,,,x,,x,
+49 Stankievech: Purloined Letter,49,,x,,,,,,,x,,,,x,x
+50 Arendt: Freeport ,50,,,,,,,,,,,,,x,
@@ -2,8 +2,8 @@ "page": [ { "__index": 0, - "id": "post_0", - "title": "No6092: Augustus and Cleopatra", + "id": "page_0", + "title": "Augustus and Cleopatra ", "tag_0": 1, "tag_1": 2, "tag_2": 3, @@ -12,12 +12,31 @@ "tag_5": 9, "tag_6": 11, "tag_7": 12, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/01-No6092/01-No6092.jpg", + "caption": "", + "height": 1457, + "width": 2000, + "type": "jpg" + } + ], + "author": "UNKNOWN ", + "description": "<p>\nDuring World War II, Cambridge University art historian Sir Anthony Blunt (1907-83) worked as a spy for the British counterintelligence Security Service, popularly known as MI5. After the war he was knighted and held several prestigious positions including Surveyor of the King’s Pictures, Director of the Courtauld Institute of Art and paid consultant for many international museums including the National Gallery of Canada. For the latter he acquired, in 1953, the painting <i>Augustus and Cleopatra</i> (c.1630), which Blunt had himself attributed to Nicolas Poussin, in 1938. Before Blunt, Poussin held considerably less stature in the canon of art history, but starting with his earliest writings, Blunt brought Poussin into the foreground of contemporary scholarship with a completed catalogue raisonné and a major survey at the Louvre in 1960. Pieced together from factual fragments and furtive fictions, not unlike Blunt’s own secret personality, the function of a ‘Poussin’ was authored during the twentieth century in a cloud of controversy and entwined with the persona of Blunt. At the nexus of this controversy one could investigate a double Anthony: one in the narrative of the painting and one in the narrative surrounding the painting. \n</p>\n\n<p>\nSerendipitously, the classical iconography in the painting foreshadowed the modern double agent, or inversely as Carlos Ginzburg said: \"When causes cannot be repeated, there is no alternative but to infer them from their effects.\" Two key clues. First, if we believe Blunt and take this image to represent a meeting between the conquered Cleopatra and Emperor Augustus, then we notice immediately that the third person in the triangle of power is absent: Marc Antony, the queer lover of Cleopatra and adversary of Augustus. It is the absence and yet ghost of Antony that complicates love and creates a political body. Perhaps one can draw a parallel to another queer Anthony: Sir Anthony Blunt, who was publicly outed as a homosexual by the magazine Private Eye in 1979 as part of a case for his treachery and proof of duplicity. Second, the key to the painting is yet another element in between Augustus and Cleopatra, this time, however, it is not a lack but rather the present object of exchange. What is it that Cleopatra delivers to her conqueror Augustus—what is the motivation for the event and also the secret to the tableau? \n</p>\n\n<p>\n In 1938, Blunt posited the theory, based on the narrative told by Cassius Dio, that the object is a pouch of love letters between Cleopatra and Julius Caesar that bear witness to Augustus’s uncle formerly holding Cleopatra in good graces. Of course, the contents of the pouch remain a mystery. (Even forensic X-rays of the painting cannot tell us more about its contents.) A year after discovering the painting and starting his career at the Warburg Institute, the war interrupted Blunt’s academic life. Among Blunt’s portfolio of tasks as a spy at the Ministry was the development and management of operation <i>XXX</i>, or TripleX. It would seem Blunt shifted his analysis of pouches in paintings to an analysis of pouches in reality. Blunt’s <i>XXX</i> programme devised a way to secretly intercept diplomatic pouches in transit which were supposed to have immunity from police and custom officers’ search and seizure rights. Furthermore, one of the first tasks conducted by Anthony Blunt as Surveyor to the King’s Pictures (the title for curator of the royal family’s art collection) was a discrete mission in 1945 to recover the private letters of the British monarch in fractured post-War Germany. The clandestine recovery of information was not a new practice for Blunt and, while it might seem odd for an art curator, it is illustrative of his double identity. \n</p>\n\n<p>\nBy the 1970s, cracks started surfacing publicly in the dual identities of Poussin’s painting and Blunt himself. In 1971, the National Gallery of Canada revoked Blunt’s attribution of the painting to Poussin, demoting it to an unknown Italian painter. (Blunt would hold firm to his 1938 conjecture to the end.) This crisis of identity paled in comparison to Prime Minister Margaret Thatcher’s parliamentary pronouncement, in 1979, that revealed Sir Anthony Blunt was a double agent for the Soviets since the very start of his career as an art historian at Cambridge—casting a blow to the legitimacy of both his ‘intelligences’. The British intelligence community already knew for decades that Blunt was part of the Cambridge Spy Ring, but Blunt had strategically negotiated immunity and secrecy in exchange for revealing information (a gambit that ultimately proved politically useless for the Ministry). In a 1979 BBC press conference a few days after Thatcher’s announcement, he tried to contextualise his actions as motivated by 1930s anti-Fascist impulses and a deep loyalty to his friends. Without remorse he read from a prepared statement: \"This was a case of political conscience against loyalty to country, I chose conscience.\" In the end, Blunt has remained an enigma, posing more questions than answers. Specifically, the question remains of whether he was such an ambitious curator because of his passion for art, or because his superlative professionalism was the perfect cover for his intelligence career. More generally, his narrative questions straightforward notions of agency, authorship and attribution that resonate beyond his particular circumstances.\n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/01-No6092/01-No6092-thumb.jpg", + "caption": "", + "height": 222, + "width": 312, + "type": "jpg" + }, + "citation": "c. 1630-1650 <br>\nOil on canvas <br>\n145 x 195.2 cm <br>\nNational Gallery of Canada (nº6092) <br>\n" }, { "__index": 1, - "id": "post_1", - "title": "No6092: Xray", + "id": "page_1", + "title": "<i>Augustus and Cleopatra </i>", "tag_0": 1, "tag_1": 5, "tag_2": 11, @@ -26,12 +45,31 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/02-6092Xray/No6092-Xray.jpg", + "caption": "", + "height": 1456, + "width": 2000, + "type": "jpg" + } + ], + "author": "UNKNOWN ", + "description": "<p>\nRadiograph produced by the National Gallery of Canada (NGC) in 1976 to forensically analyze the underpainting — <i>pentimenti</i> — of acquisition <i>No6092</i>. At this point in the painting’s story, the work had already been stripped of its Poussin attribution, but after several decades of suspicion, NGC curator Myron Laskin was starting to doubt his doubt. As his correspondence with peers reveal in the curatorial file at the NGC, he had started to reconsider Blunt’s attribution and possibly restore the painting’s authorship to Poussin. This radiograph was part of reopening of this analysis after a first wave of contestation by competing critics had ran afoul and subsided, and opinions were mounting in support of Blunt’s original claim. Three’s years later, with Blunt’s public outing as a double agent and homosexual, the case of <i>No6092</i> become collateral damage.\n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/02-6092Xray/No6092-Xray-thumb.png", + "caption": "", + "height": 212, + "width": 303, + "type": "png" + }, + "citation": "1976<br>\nRadiograph in Lightbox<br>\n145 x 195.2 cm<br>\nRestoration and Conservation Lab File no6092 National Gallery of Canada <br>\n" }, { "__index": 2, - "id": "post_2", - "title": "BLUNT: Apollo", + "id": "page_2", + "title": "A Newly Discovered Poussin", "tag_0": 1, "tag_1": 4, "tag_2": 0, @@ -40,12 +78,59 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/03-Apollo/Apollo-P01.jpg", + "caption": "", + "height": 2087, + "width": 1500, + "type": "jpg" + }, + { + "uri": "assets/data_store/03-Apollo/Apollo-P02.jpg", + "caption": "", + "height": 2087, + "width": 1500, + "type": "jpg" + }, + { + "uri": "assets/data_store/03-Apollo/Apollo-P03.jpg", + "caption": "", + "height": 2087, + "width": 1500, + "type": "jpg" + }, + { + "uri": "assets/data_store/03-Apollo/Apollo-P04.jpg", + "caption": "", + "height": 2087, + "width": 1500, + "type": "jpg" + }, + { + "uri": "assets/data_store/03-Apollo/Apollo-P05.jpg", + "caption": "", + "height": 2087, + "width": 1500, + "type": "jpg" + } + ], + "author": "ANTHONY BLUNT ", + "description": "<p>\nBlunt’s first declared attribution was the <i>Cleopatra</i> <i>and Augustus</i> painting in an early article he published in <i>Apollo</i> in 1938. This journal article is also the first image reproduction of the painting. \n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/03-Apollo/Apollo-Thumb.jpg", + "caption": "", + "height": 278, + "width": 203, + "type": "jpg" + }, + "citation": "<i>Apollo</i><br>\nVol. XXVII, No.160.<br>\nApril, 1938<br>\n" }, { "__index": 3, - "id": "post_3", - "title": "Note on Mr. McCurry's Visit ", + "id": "page_3", + "title": "04 Blunt: McCurry's Visit ", "tag_0": 1, "tag_1": 4, "tag_2": 5, @@ -58,8 +143,8 @@ }, { "__index": 4, - "id": "post_4", - "title": "Telegram ", + "id": "page_4", + "title": "05 Blunt: Telegram ", "tag_0": 1, "tag_1": 4, "tag_2": 5, @@ -72,8 +157,8 @@ }, { "__index": 5, - "id": "post_5", - "title": "Record of Work Done ", + "id": "page_5", + "title": "06 NGC: Record ", "tag_0": 1, "tag_1": 5, "tag_2": 11, @@ -86,8 +171,8 @@ }, { "__index": 6, - "id": "post_6", - "title": "Index Card: Receiving ", + "id": "page_6", + "title": "07 NGC: Receiving ", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -100,8 +185,8 @@ }, { "__index": 7, - "id": "post_7", - "title": "Letter to Robert H. Hubbard 3.2 ", + "id": "page_7", + "title": "08 Mahon to Hubbard", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -114,8 +199,8 @@ }, { "__index": 8, - "id": "post_8", - "title": "Letter to Denis Mahon ", + "id": "page_8", + "title": "09 Hubbard to Mahon ", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -128,8 +213,8 @@ }, { "__index": 9, - "id": "post_9", - "title": "Close Up of no6092 Label ", + "id": "page_9", + "title": "10 No6092: Label ", "tag_0": 1, "tag_1": 5, "tag_2": 11, @@ -142,8 +227,8 @@ }, { "__index": 10, - "id": "post_10", - "title": "Letter to Robert H. Hubbbard 27.3", + "id": "page_10", + "title": "11 Mahon to Hubbard", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -156,8 +241,8 @@ }, { "__index": 11, - "id": "post_11", - "title": "Note on Two Paintings ", + "id": "page_11", + "title": "12 Laskin: Note", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -170,8 +255,8 @@ }, { "__index": 12, - "id": "post_12", - "title": "Letter to Konrad Oberhuber ", + "id": "page_12", + "title": "13 Laskin to Oberhuber ", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -184,8 +269,8 @@ }, { "__index": 13, - "id": "post_13", - "title": "Letter to William H. Gerdts ", + "id": "page_13", + "title": "14 Laskin to Gerdts ", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -198,8 +283,8 @@ }, { "__index": 14, - "id": "post_14", - "title": "Letter to Louise d'Argencourt ", + "id": "page_14", + "title": "15 Miles to d'Argencourt ", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -212,8 +297,8 @@ }, { "__index": 15, - "id": "post_15", - "title": "Letter to Myron Laskin ", + "id": "page_15", + "title": "16 Lavin to Laskin ", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -226,8 +311,8 @@ }, { "__index": 16, - "id": "post_16", - "title": "Letter to Marilyn Lavin ", + "id": "page_16", + "title": "17 Laskin to Lavin ", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -240,8 +325,8 @@ }, { "__index": 17, - "id": "post_17", - "title": "Memo: Italian School 17th Century, ", + "id": "page_17", + "title": "18 NGC: Italian Memo", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -254,8 +339,8 @@ }, { "__index": 18, - "id": "post_18", - "title": "Letter to Konrad Oberhuber ", + "id": "page_18", + "title": "19 Laskin to Oberhuber ", "tag_0": 1, "tag_1": 5, "tag_2": 0, @@ -268,8 +353,8 @@ }, { "__index": 19, - "id": "post_19", - "title": "Notes on Radiographs of Five Paintings", + "id": "page_19", + "title": "Notes on Radiographs of Five Paintings by Poussin", "tag_0": 1, "tag_1": 7, "tag_2": 11, @@ -278,12 +363,52 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/20-Jones/20-Jones-P01.jpg", + "caption": "", + "height": 2016, + "width": 1500, + "type": "jpg" + }, + { + "uri": "assets/data_store/20-Jones/20-Jones-P02.jpg", + "caption": "", + "height": 2016, + "width": 1500, + "type": "jpg" + }, + { + "uri": "assets/data_store/20-Jones/20-Jones-P03.jpg", + "caption": "", + "height": 2016, + "width": 1500, + "type": "jpg" + }, + { + "uri": "assets/data_store/20-Jones/20-Jones-P04.jpg", + "caption": "", + "height": 2016, + "width": 1500, + "type": "jpg" + } + ], + "author": "S. REES JONES ", + "description": "", + "thumbnail": { + "uri": "assets/data_store/20-Jones/20-Jones-thumb.jpg", + "caption": "", + "height": 300, + "width": 223, + "type": "jpg" + }, + "citation": "
<i>The Burlington Magazine</i>, Vol. 102, no 688, July Book
1960
24x31cm
Library and Archives
National Gallery of Canada <br>\nThe establishment of the Chemical Laboratory of the Royal Museums in Berlin in 1888 was a milestone moment in the analysis of cultural artefacts for authenticity and attribution. Wilhelm Röntgen invented radiography in 1895 and within a year his former student, Walter König, used the technology to x-ray an oil painting. Documentation of the forensic analysis of artworks began in 1914 when Alexander Faber registered a German patent for the application of radiographic analysis to the examination of paintings. Eventually the method spread to Amsterdam and Paris. By the 1930s, it was being integrated into museum infrastructure and then academic institutions, including at the newly minted Courtauld Institute of Art under the technical eye of Stephen Rees Jones, the long-time director of the institute’s laboratory under Sir Anthony Blunt. X-rays were first employed to look under the skin of the paint to see traces of earlier versions of a painting (also known as <i>pentimenti</i>, Italian for repent) or of a different painting altogether. Originally called ‘shadowgraphs,’ radiographs however are not the only invisible wavelengths that can peek behind Parrhasius’s curtain. Researchers also analyze works of art using infrared rays, which penetrate the surface layer of paint and reflect off the underdrawing—paint being more translucent than graphite to the long waveforms of infrared. Under such analysis, a work’s authenticity can often be determined, since corrections and underdrawings usually signify the working processes of an original. Such a theory, however, does not easily apply to Poussin as his rational approach dictated carefully planned compositions that were not resolved at the layer of the paint. <br>\n" }, { "__index": 20, - "id": "post_20", - "title": "Radiograph of landscape", + "id": "page_20", + "title": "21 Poussin: Xray", "tag_0": 3, "tag_1": 5, "tag_2": 11, @@ -296,8 +421,8 @@ }, { "__index": 21, - "id": "post_21", - "title": "COURBET: Woman Painted at Palavas ", + "id": "page_21", + "title": "<i>Woman Painted at Palavas </i>", "tag_0": 3, "tag_1": 4, "tag_2": 6, @@ -306,12 +431,31 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/22-Courbet/22-Courbet.jpg", + "caption": "", + "height": 1814, + "width": 1501, + "type": "jpg" + } + ], + "author": "GUSTAV COURBET ", + "description": "<p>\nGustav Courbet is most famous as the 19th-century painter who rebelled against the Academy and proselytized the Realist moment that painted everyday people and everyday scenes contra the mythological and heroic tableaus of History painting and Romanticism. As a militant Marxist his actions extended beyond the canvas; in 1870 Courbet recommended the Vendome Column in Paris be taken down as a symbol of Bonapartist Imperialism. As part of the Paris Commune, he followed through on the declaration but was imprisoned as a result and later lived out his life in exile. Whether he was a mischievous Marxist who flooded the art world with counterfeits during his life time, or he was duped by his studio assistants remains part of the puzzle in attempting to determine which paintings are authentically his. The painting <i>Woman Painted at Palavas</i>,<i> </i>acquired by Sir Anthony Blunt in 1956 for the AGO’s collection, is a special case: research has revealed three layers of signatures in the work. Courbet scholar Petra Chu has suggested the figure in the painting is not by Courbet, but that the signature might be authentic. This distinction, of course, follows 19th-century artist theories of authorship, later demonstrated by French artist Marcel Duchamp’s conceptualization of the Readymade, which challenged exactly the necessity of matching the signature and the production of the work—the former determining authorship exclusively as best exemplified in the <i>Urinal</i> signed by R. Mutt. Later French theorists Jacques Lacan and Jacques Derrida further explore the semiotic slippage of the signature and subjectivity. In 1955 Lacan purchased Courbet’s most famous painting <i>Origin of the World</i> (1866) and displayed it hidden in his private home until his death when it was transferred to the State as payment for inheritance tax. \n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/22-Courbet/22-Courbet-thumb.jpg", + "caption": "", + "height": 301, + "width": 241, + "type": "jpg" + }, + "citation": "1956 <br>\noil on canvas <br>\n59.1 x 48.3 cm <br>\nArt Gallery of Ontario, Toronto <br>\nGift of Reuben Wells Leonard Estate (56/13)<br>\n" }, { "__index": 22, - "id": "post_22", - "title": "MOORE:Group of Shelterers During an Air Raid", + "id": "page_22", + "title": "23 Moore: Painting I", "tag_0": 3, "tag_1": 4, "tag_2": 6, @@ -324,8 +468,8 @@ }, { "__index": 23, - "id": "post_23", - "title": "MOORE: Two Women on a Bench", + "id": "page_23", + "title": "24 Moore: Painting II", "tag_0": 3, "tag_1": 4, "tag_2": 6, @@ -338,8 +482,8 @@ }, { "__index": 24, - "id": "post_24", - "title": "Email RE: Toronto Courbet ", + "id": "page_24", + "title": "<i>Email RE: Toronto Courbet question (4.5.2015) </i>", "tag_0": 6, "tag_1": 11, "tag_2": 0, @@ -348,12 +492,31 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/25-Chu/25-Chu.jpg", + "caption": "", + "height": 1941, + "width": 1500, + "type": "jpg" + } + ], + "author": "PETRA CHU ", + "description": "<p>\nGustav Courbet is most famous as the 19th-century painter who rebelled against the Academy and proselytized the Realist moment that painted everyday people and everyday scenes contra the mythological and heroic tableaus of History painting and Romanticism. As a militant Marxist his actions extended beyond the canvas; in 1870 Courbet recommended the Vendome Column in Paris be taken down as a symbol of Bonapartist Imperialism. As part of the Paris Commune, he followed through on the declaration but was imprisoned as a result and later lived out his life in exile. Whether he was a mischievous Marxist who flooded the art world with counterfeits during his life time, or he was duped by his studio assistants remains part of the puzzle in attempting to determine which paintings are authentically his. The painting <i>Woman Painted at Palavas</i>,<i> </i>acquired by Sir Anthony Blunt in 1956 for the AGO’s collection, is a special case: research has revealed three layers of signatures in the work. Courbet scholar Petra Chu has suggested the figure in the painting is not by Courbet, but that the signature might be authentic. This distinction, of course, follows 19th-century artist theories of authorship, later demonstrated by French artist Marcel Duchamp’s conceptualization of the Readymade, which challenged exactly the necessity of matching the signature and the production of the work—the former determining authorship exclusively as best exemplified in the <i>Urinal</i> signed by R. Mutt. Later French theorists Jacques Lacan and Jacques Derrida further explore the semiotic slippage of the signature and subjectivity. In 1955 Lacan purchased Courbet’s most famous painting <i>Origin of the World</i> (1866) and displayed it hidden in his private home until his death when it was transferred to the State as payment for inheritance tax. \n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/25-Chu/25-Chu-thumb.jpg", + "caption": "", + "height": 259, + "width": 200, + "type": "jpg" + }, + "citation": "2015 <br>\nDocument <br>\n21.5 x 27.9 cm <br>\nE.P. Taylor Research Library & Archives Collection of Art Gallery of Ontario <br>\nCourtesy the Author<br>\n" }, { "__index": 25, - "id": "post_25", - "title": "\"Courbet Signatures\" ", + "id": "page_25", + "title": "<i>Courbet Signatures</i>", "tag_0": 6, "tag_1": 11, "tag_2": 0, @@ -362,12 +525,31 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/26-Fernier/26-Fernier.jpg", + "caption": "", + "height": 2253, + "width": 1501, + "type": "jpg" + } + ], + "author": "ROBERT FERNIER ", + "description": "<p>\nGustav Courbet is most famous as the 19th-century painter who rebelled against the Academy and proselytized the Realist moment that painted everyday people and everyday scenes contra the mythological and heroic tableaus of History painting and Romanticism. As a militant Marxist his actions extended beyond the canvas; in 1870 Courbet recommended the Vendome Column in Paris be taken down as a symbol of Bonapartist Imperialism. As part of the Paris Commune, he followed through on the declaration but was imprisoned as a result and later lived out his life in exile. Whether he was a mischievous Marxist who flooded the art world with counterfeits during his life time, or he was duped by his studio assistants remains part of the puzzle in attempting to determine which paintings are authentically his. The painting <i>Woman Painted at Palavas</i>,<i> </i>acquired by Sir Anthony Blunt in 1956 for the AGO’s collection, is a special case: research has revealed three layers of signatures in the work. Courbet scholar Petra Chu has suggested the figure in the painting is not by Courbet, but that the signature might be authentic. This distinction, of course, follows 19th-century artist theories of authorship, later demonstrated by French artist Marcel Duchamp’s conceptualization of the Readymade, which challenged exactly the necessity of matching the signature and the production of the work—the former determining authorship exclusively as best exemplified in the <i>Urinal</i> signed by R. Mutt. Later French theorists Jacques Lacan and Jacques Derrida further explore the semiotic slippage of the signature and subjectivity. In 1955 Lacan purchased Courbet’s most famous painting <i>Origin of the World</i> (1866) and displayed it hidden in his private home until his death when it was transferred to the State as payment for inheritance tax. \n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/26-Fernier/26-Fernier-thumb.jpg", + "caption": "", + "height": 453, + "width": 301, + "type": "jpg" + }, + "citation": "<i>La Vie et l'oeuvre de Gustave Courbet : catalogue raisonn</i><i>é</i><i> </i><br>\n1978 <br>\nDocument <br>\n21.5 x 27.9 cm <br>\nFoundation Wildenstein<br>\n" }, { "__index": 26, - "id": "post_26", - "title": "COURBET: Woman Painted at Palavas (detail) ", + "id": "page_26", + "title": "<i>Woman Painted at Palavas (detail) </i>", "tag_0": 6, "tag_1": 11, "tag_2": 0, @@ -376,12 +558,31 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/27-Signature/27-Signature.jpg", + "caption": "", + "height": 1500, + "width": 1500, + "type": "jpg" + } + ], + "author": "GUSTAV COURBET ", + "description": "<p>\nGustav Courbet is most famous as the 19th-century painter who rebelled against the Academy and proselytized the Realist moment that painted everyday people and everyday scenes contra the mythological and heroic tableaus of History painting and Romanticism. As a militant Marxist his actions extended beyond the canvas; in 1870 Courbet recommended the Vendome Column in Paris be taken down as a symbol of Bonapartist Imperialism. As part of the Paris Commune, he followed through on the declaration but was imprisoned as a result and later lived out his life in exile. Whether he was a mischievous Marxist who flooded the art world with counterfeits during his life time, or he was duped by his studio assistants remains part of the puzzle in attempting to determine which paintings are authentically his. The painting <i>Woman Painted at Palavas</i>,<i> </i>acquired by Sir Anthony Blunt in 1956 for the AGO’s collection, is a special case: research has revealed three layers of signatures in the work. Courbet scholar Petra Chu has suggested the figure in the painting is not by Courbet, but that the signature might be authentic. This distinction, of course, follows 19th-century artist theories of authorship, later demonstrated by French artist Marcel Duchamp’s conceptualization of the Readymade, which challenged exactly the necessity of matching the signature and the production of the work—the former determining authorship exclusively as best exemplified in the <i>Urinal</i> signed by R. Mutt. Later French theorists Jacques Lacan and Jacques Derrida further explore the semiotic slippage of the signature and subjectivity. In 1955 Lacan purchased Courbet’s most famous painting <i>Origin of the World</i> (1866) and displayed it hidden in his private home until his death when it was transferred to the State as payment for inheritance tax. \n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/27-Signature/27-Signature-thumb.jpg", + "caption": "", + "height": 300, + "width": 300, + "type": "jpg" + }, + "citation": "1854/2016 <br>\nPhotograph <br>\nArt Gallery of Ontario, Toronto<br>\n" }, { "__index": 27, - "id": "post_27", - "title": "Invitation to Blunt Lecture ", + "id": "page_27", + "title": "Invitation to Blunt Lecture (16.12.1965)", "tag_0": 4, "tag_1": 6, "tag_2": 0, @@ -390,12 +591,31 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/28-B-Lecture/28-Blunt-Lecture.png", + "caption": "", + "height": 1941, + "width": 1500, + "type": "png" + } + ], + "author": "WILLIAM J. WITHROW ", + "description": "<p>\nCollection of Art Gallery of Ontario\n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/28-B-Lecture/28-Blunt-Lecture-Thumb.png", + "caption": "", + "height": 259, + "width": 200, + "type": "png" + }, + "citation": "1965 <br>\nTypewritten copy letter on yellow newsprint paper <br>\n21.5 x 27.9 cm <br>\nE.P. Taylor Research Library & Archives <br>\n" }, { "__index": 28, - "id": "post_28", - "title": "BLUNT: Letter from Sir Anthony Blunt to William J. Withrow ", + "id": "page_28", + "title": "Letter from Sir Anthony Blunt to William J. Withrow re: Stage I opening ceremonies (8.4.1974) ", "tag_0": 4, "tag_1": 6, "tag_2": 0, @@ -404,15 +624,34 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/29-B-Letter/29-Blunt-Retire.png", + "caption": "", + "height": 1817, + "width": 1500, + "type": "png" + } + ], + "author": "ANTHONY BLUNT ", + "description": "<p>\nCollection of Art Gallery of Ontario\n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/29-B-Letter/29-Blunt-Retire-thumb.png", + "caption": "", + "height": 242, + "width": 200, + "type": "png" + }, + "citation": "1974 <br>\nTypewritten letter on blue Air Letter paper <br>\n21.5 x 25.4 cm <br>\nE.P. Taylor Research Library & Archives <br>\n" }, { "__index": 29, - "id": "post_29", - "title": "STANKIEVECH: An Apology for Poussin’s Augustus ", + "id": "page_29", + "title": "30 Stankievech: An Apology ", "tag_0": 4, "tag_1": 8, - "tag_2": 0, + "tag_2": 13, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -422,22 +661,34 @@ }, { "__index": 30, - "id": "post_30", - "title": "STANKIEVECH: Courtauld Cocktail ", + "id": "page_30", + "title": "<i>Courtauld Cocktail </i>", "tag_0": 7, "tag_1": 8, "tag_2": 10, - "tag_3": 0, + "tag_3": 13, "tag_4": 0, "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "type": "video", + "caption": "", + "uri": "https://vimeo.com/590342273", + "token": "590342273" + } + ], + "type": "video", + "author": "CHARLES STANKIEVECH ", + "description": "<p>\nIn 1937 at the Courtauld Institute of Art, Stephen Rees Jones discovered that chemicals in the laboratory were being stolen to create improvised explosives to throw at fascist marches. The term ‘Molotov Cocktail’ comes from the Finnish resistance a few years later but, stemming from their use in the Spanish Civil War earlier in the decade, the British Home Guard disseminated information on how to make such guerilla weapons in case of an invasion in the impending war. One strategy utilized film strips as the fuse because, at the time, the nitrate base of film stock made it highly flammable. \n</p>\n\n", + "citation": "2016 <br>\nMixed Media <br>\n5 x 5 x 30cm <br>\nCourtesy the Artist <br>\n" }, { "__index": 31, - "id": "post_31", - "title": "BURGESS:Letter to Anthony Blunt", + "id": "page_31", + "title": "<i>Letter to Anthony Blunt about BBC Broadcast (22.7.1938) </i>", "tag_0": 4, "tag_1": 10, "tag_2": 0, @@ -446,15 +697,34 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/32-Burgess/32-Burgess.jpg", + "caption": "", + "height": 1092, + "width": 1500, + "type": "jpg" + } + ], + "author": "GUY BURGESS ", + "description": "<p>\nIn 1938, Anthony Blunt makes his first public attribution—Poussin’s <i>Augustus and Cleopatra</i>—and his longtime friend, Soviet comrade, and Cambridge colleague, Guy Burgess, invites him to give a talk on the BBC. The letter includes specific instructions on the arrangement of Blunt’s position in the room to ensure the clock is always in view, allowing Blunt to manipulate the programme according to the time. In connoisseurship, the key element of investigation is the analysis of temporality—if elements of a work are from different periods of time (e.g. the canvas is from one century but the chemical paint pigment is from another) then the work must be considered a forgery. Time must align. \n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/32-Burgess/32-Burgess-Thumb.jpg", + "caption": "", + "height": 221, + "width": 300, + "type": "jpg" + }, + "citation": "1938 <br>\nDocument <br>\n16 x 23 cm <br>\nBBC Archives<br>\n" }, { "__index": 32, - "id": "post_32", - "title": "Stankievech: The Secret Agent ", + "id": "page_32", + "title": "33 Stankievech: Secret Agent ", "tag_0": 8, "tag_1": 10, - "tag_2": 0, + "tag_2": 13, "tag_3": 0, "tag_4": 0, "tag_5": 0, @@ -464,8 +734,8 @@ }, { "__index": 33, - "id": "post_33", - "title": "BLUNT: The Criminal-King in the 19th Century Novel", + "id": "page_33", + "title": "<i>The Criminal-King in the 19th Century Novel</i>", "tag_0": 4, "tag_1": 7, "tag_2": 10, @@ -474,12 +744,45 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/34-B-King/34-B-King-P01.jpg", + "caption": "", + "height": 2079, + "width": 1500, + "type": "jpg" + }, + { + "uri": "assets/data_store/34-B-King/34-B-King-P02.jpg", + "caption": "", + "height": 2079, + "width": 1500, + "type": "jpg" + }, + { + "uri": "assets/data_store/34-B-King/34-B-King-P03.jpg", + "caption": "", + "height": 2079, + "width": 1500, + "type": "jpg" + } + ], + "thumbnail": { + "uri": "assets/data_store/34-B-King/34-B-King-Thumb.jpg", + "caption": "", + "height": 277, + "width": 200, + "type": "jpg" + }, + "citation": "1938<br>\n<i>Journal of the Warburg Institute</i>, vol. 1, no 3.<br>\nBook <br>\n19 x 27 cm <br>\nLibrary and Archives National Gallery of Canada <br>\n", + "description": "<p>\nWhile Anthony Blunt is most famously associated with the Courtauld Institute, as its longest standing Director, his first academic job in London was for the Warburg Institute. With the rise of the Nazi party in Germany, the Warburg Institute sought refuge in London and the Courtauld Institute provided the Jewish émigrés with a home. It was here that Fritz Saxl fabricated a job for Anthony Blunt: head of publications. One of Blunt’s first texts for the Warburg journal was a marginal note, far outside his typical research interests which were in the French and Italian Baroque. To understand the strangeness of the text, we could read the peculiarity of “The Criminal-King in a 19th Century Novel” as a personal examination of his political dilemmas. In his analysis, he marvels at Balzac’s audacity and genius to create a hero that is beyond good and evil, and in a topsy-turvy world where society is corrupt, the “evil” hero ascends to become the “highest agent of the secret police.” It is at this time, with the war imminent in Europe, that Blunt begins to think strategically about his political allegiances beyond intellectual Marxism and starts the navigation towards a significant position as an agent for the Security Service MI5—all the while working as a double agent for the Soviets. \n</p>\n\n", + "author": "ANTHONY BLUNT " }, { "__index": 34, - "id": "post_34", - "title": "Connoisseurs and Secret Agents ", + "id": "page_34", + "title": "<i>Connoisseurs and Secret Agents</i> ", "tag_0": 4, "tag_1": 7, "tag_2": 9, @@ -488,11 +791,44 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/35-Lewis/35-Lewis-P01.jpg", + "caption": "", + "height": 2423, + "width": 1500, + "type": "jpg" + }, + { + "uri": "assets/data_store/35-Lewis/35-Lewis-P02.jpg", + "caption": "", + "height": 2423, + "width": 1500, + "type": "jpg" + }, + { + "uri": "assets/data_store/35-Lewis/35-Lewis-P03.jpg", + "caption": "", + "height": 2423, + "width": 1500, + "type": "jpg" + } + ], + "author": "LESLEY LEWIS ", + "description": "<p>\nLewis’s book <i>Connoisseurs and Secret Agents</i> was one of the first academic texts to examine the connection between historical figures that conducted in parallel both art sales and secret diplomatic missions. Lewis produced original archival research on Cardinal Alessandro Albani for the book, and it was a novel contribution in its own right to a period that lacked primary research. Despite encouraging peer reviews at the time of publication, after Anthony Blunt’s exposure as a traitor to his country as a Soviet spy, Lewis expressed her opinion that Blunt purposefully suppressed the success of the book because it hit too close to home. Blunt was Lewis’s advisor when she was conducting the research for her book as a student at the Courtauld Institute where he was the Director for twenty-seven years.\n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/35-Lewis/35-Lewis-thumb.jpg", + "caption": "", + "height": 323, + "width": 200, + "type": "jpg" + }, + "citation": "1961<br>\nLondon: Chatto & Windus<br>\nBook <br>\n14 x 22.5 cm <br>\n" }, { "__index": 35, - "id": "post_35", + "id": "page_35", "title": "BBC Panorama: The Queen's Gallery ", "tag_0": 4, "tag_1": 9, @@ -502,12 +838,23 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [], + "author": "ANTHONY BLUNT", + "description": "<p>\nIn this rare footage we see Surveyor of the Queen’s Pictures, Sir Anthony Blunt, giving a tour of the Queen’s Gallery at Buckingham Palace in 1962. At this time Blunt was at the peak of his intellectual career and not yet unmasked for his double intelligence activities for both MI5 and the Soviets. What emerges here, in the heart of the British Empire, as casual banter about a portrait of King Charles
I and a clock that “keeps perfect time,” takes on a certain duplicity when seen in the rear view mirror of archival footage. The curatorial tour ends with a particularly ironic twist as Blunt discusses the Royal Family’s Fabergé eggs, which were gifts from the Russian royal family and were famous not only for their exquisite craftsmanship, but also because each egg opens to reveal a secret surprise. \n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/36-BBC/36-BBC-thumb.jpg", + "caption": "", + "height": 225, + "width": 300, + "type": "jpg" + }, + "citation": "1962<br>\nTelevision broadcast transferred to video <br>\n5:21 minutes <br>\n" }, { "__index": 36, - "id": "post_36", - "title": "RUIZ: L'Hypothèse du tableau volé ", + "id": "page_36", + "title": "<i>L'Hypoth</i><i>è</i><i>se du tableau vol</i><i>é</i><i> </i>", "tag_0": 3, "tag_1": 9, "tag_2": 10, @@ -516,12 +863,31 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "type": "video", + "caption": "", + "uri": "https://vimeo.com/590025784", + "token": "590025784" + } + ], + "type": "video", + "author": "RAUL RUIZ ", + "description": "<p>\nA collaboration between theorist and erotic writer Pierre Klossowski and filmmaker Raúl Ruiz, <i>The Hypothesis of the Stolen Painting</i> presents a debate between an art collector and a disembodied narrator, set in a ghostly mansion where the scenes shift between paintings and recreations of paintings as <i>tableaux vivants</i>. On the surface, the film is a meditation on the symbols of secret societies but further reflection reveals the epistemological problematics of historic iconography, when the image is split between symbolic exchange and secret initiation. Six paintings are presented and lectured upon throughout the film, but the narrator’s theories can only be explained by postulating a secret, stolen seventh painting that would provide the key to unlocking the meaning of the series and thus the sex magick rite to which the images allude. Cinematographer Sacha Vierny, who also shot seminal works for Alain Renais, Luis Buñuel, and Peter Greenaway, uses carefully angled mirrors to follow a ray of light from one <i>mise en scene</i> to the next, tracking the narrative continuity through the light in each scene, by way of cinematic chiaroscuro. Literally bookending the exhibition opposite the National Gallery of Canada’s nº6092 the film is, as Raúl Ruiz claims, “a fiction about theory.”\n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/37-Hypothesis/37-Hypothesis-thumb.jpg", + "caption": "", + "height": 225, + "width": 300, + "type": "jpg" + }, + "citation": "1978 <br>\nFilm <br>\n63 minutes <br>\nDirector: Raúl Ruiz <br>\nWriter: Pierre Klossowski <br>\nCinematographer: Sasha Vierny <br>\nL’Institut national de l’audiovisuel (INA), France <br>\n" }, { "__index": 37, - "id": "post_37", - "title": "BENJAMINL Mondrian 63-96 ", + "id": "page_37", + "title": "Mondrian 63-96 ", "tag_0": 3, "tag_1": 9, "tag_2": 10, @@ -530,12 +896,31 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "type": "video", + "caption": "", + "uri": "https://vimeo.com/583964503/0a8a28aa23", + "token": "583964503" + } + ], + "author": "WALTER BENJAMIN ", + "description": "<p>\nThe lecture by the alias “Walter Benjamin” titled <i>Mondrian 63-96</i> parodies the discourse around objects that are not what they appear to be, and subjects who are not who they say they are. The exhuming of the persona “Walter Benjamin” as a pseudonym, by an eastern European artist/theorist in the 1980s, was a strategic move to question the hierarchy of original and copy while providing a novel position for the art critic. In this short video, an actor articulates an argument, trying to comprehend the paradoxes of duplicate paintings alongside paintings from the future that mysteriously hang in the current lecture hall. Taking the arguments to an extreme, the undead Walter Benjamin exclaims: “a copy is a meta-original.”\n</p>\n\n", + "type": "video", + "thumbnail": { + "uri": "assets/data_store/38-Benjamin/38-Benjamin-thumb.jpg", + "caption": "", + "height": 257, + "width": 300, + "type": "jpg" + }, + "citation": "1986 <br>\nVideo <br>\n23 minutes <br>\nCourtesy the Artist <br>\n" }, { "__index": 38, - "id": "post_38", - "title": "BROODTHAERS:The conquest of space, ", + "id": "page_38", + "title": "<i>The conquest of space, Atlas for the use of artists and the military </i>", "tag_0": 9, "tag_1": 10, "tag_2": 0, @@ -544,12 +929,24 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "type": "video", + "caption": "", + "uri": "https://vimeo.com/590339061", + "token": "590339061" + } + ], + "type": "video", + "author": "MARCEL BROODTHAERS ", + "description": "<p>\nMarcel Broodthaers was perhaps the first artist to colonize the role of the curator as an artwork, in his project <i>Museum of Eagles</i>. While maintaining his obsessions with surrealism, his work, over time, took on a role more critical of the history of European colonialism. The last artist book he made was the ridiculously small<i> The conquest of space, Atlas for the use of artists and the military</i>. \n</p>\n\n", + "citation": "1975 <br>\nArtist Book <br>\n4.2 x 2.9 x 1 cm <br>\nPrivate Collection <br>\n" }, { "__index": 39, - "id": "post_39", - "title": "WARBURG: Der Bildatlas Mnemosyne ", + "id": "page_39", + "title": "<i>Der Bildatlas Mnemosyne (Taflen No79)</i>", "tag_0": 7, "tag_1": 9, "tag_2": 10, @@ -558,12 +955,31 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/40-Warbug/40-Warbug.jpg", + "caption": "", + "height": 2005, + "width": 1500, + "type": "jpg" + } + ], + "author": "ABY WARBURG", + "description": "<p>\nHeir of a successful Hamburg banking family, Aby Warburg devoted his life to scholarship. He is most famous for his library, which grew from a personal obsession and hovers somewhere between an idiosyncratic private library and a specialist research institution. Resistant to a Linnaeus taxonomy of knowledge that separates thinking into arborescent categories, Warburg continually rearranged his library pending a research problem. The result was a paranoid association of information across radically different disciplines: medieval astrology, 20th century technology, Renaissance gambling cards, Hopi Native Americans, etcetera. In the 1920s, Aby Warburg started his last project, the <i>Mnemosyne Atlas [</i><i>Der Bildatlas Mnemosyne]</i>. It was a new way of organizing art history—less along lines of traditional disciplines—and instead offered a path across disciplinary borders based on his concept <i>Ikonologie</i> (icon + logic). The Atlas was Warburg’s final project that collected images from all time periods, arranged on large black screens. With this technique he attempted a new methodology for thinking about images, as they migrated across time, space and function to further shed the reliance on words for analysis and instead compose their own grammar. Comparisons have been made between Warburg’s Atlas screens and the “evidence boards” that populate police stations and cinema screens, based purely on the similarity of their formal characteristics. But the connection is not as remote as it first seems. While rarely known, the screens were actually not Warburg’s idea, although he did incorporate them into his unique methodology; they were first created and proposed to Warburg by his colleague Fritz Saxl after his time in the military, where he worked in the education unit and gleaned the idea of using the screens for didactic purposes.\n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/40-Warbug/40-Warbug-thumb.jpg", + "caption": "", + "height": 300, + "width": 224, + "type": "jpg" + }, + "citation": "1925-29 <br>\nPhotographs<br>\n150 x 200 cm (originals) <br>\n" }, { "__index": 40, - "id": "post_40", - "title": "MANCINI: Considerazioni sulla pittura", + "id": "page_40", + "title": "Considerazioni sulla pittura ", "tag_0": 2, "tag_1": 3, "tag_2": 9, @@ -572,17 +988,36 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/41-Mancini/41-Mancini-P01.png", + "caption": "", + "height": 2084, + "width": 1500, + "type": "png" + } + ], + "author": "GIULIO MANCINI", + "description": "<p>\nFrom 1550-1590, a considerable amount of literature was written about the lives of artists—Vasari being a classic example. But by the 17th century the genre had almost completely ceased, with the masters Carracci and Caravaggio concern- ing themselves with observational strategies rather than speculation and theory. A radically new type of art criticism emerged in the ebb
and flow of history, one which incorporated the empirical demands not only of a new art but also of a burgeoning field in the sciences, as developed through Galileo’s experiments that required repeatable results for verification. It took an amateur, meaning the first writer on art who was not an artist, by the name of Giulio Mancini to forge such a new field. It is no coincidence Mancini was, by vocation, a doctor for Pope Urban VIII and friend to Galileo in Rome. He also made a living as an antiquities dealer and thus was more concerned with the authenticity of the original than with artistic expression. Bringing together medical diagnosis with his concern for the art market, Mancini spawned the first theory of connoisseurship and art forensics. At the end of the 19th century, his theories again surfaced as the “Morelli Method,” which became the standard in the modern area for museum directors and art historians investigating questionable attributions. Mancini combined his observational skills as a doctor with the newly developed practice of analyzing the flow of handwriting to date a manuscript’s origin. In this new field of paleography, authorial uniqueness is revealed in the curve of each character, in the folds of each letter. For philosopher Gilles Delueze, writing in his book <i>The Fold: Leibniz and the Baroque</i>, “The Baroque refers not to an essence but rather to an operative function, to a trait.” Mancini understood how to look for traits that signalled individuality based on the distinctiveness of “curls and waves” in hair and the “folds and glint of drapes.” A close look at the historical survey of Nicolas Poussin’s critical literature finds the first text cited in the bibliography of Anthony Blunt’s <i>Critical Catalogue </i>is this writing by Mancini. If we believe Blunt’s attribution of painting <i>no6092 </i>to the early stage of Poussin’s career, it means the painting was com- posed at the exact same time as Mancini’s text, in the 1620s in Rome. The polyphonic voices of the Baroque fugue fold in on each other. \n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/41-Mancini/41-Mancini-Thumb.png", + "caption": "", + "height": 279, + "width": 200, + "type": "png" + }, + "citation": "Roma, Accademia nazionale dei Lincei, 1956 1620-1630<br>\nBook with manuscript facsimile<br>\nCollection University of Toronto Libraries <br>\n" }, { "__index": 41, - "id": "post_41", - "title": "STANKIEVECH: Mancini's Caratteri / Warburg’s Atlas", + "id": "page_41", + "title": "42 Stankievech: Mancini / Warburg", "tag_0": 2, "tag_1": 8, "tag_2": 9, "tag_3": 11, - "tag_4": 0, + "tag_4": 13, "tag_5": 0, "tag_6": 0, "tag_7": 0, @@ -590,8 +1025,8 @@ }, { "__index": 42, - "id": "post_42", - "title": "RUBENS: Letter to Nicolas-Claude ", + "id": "page_42", + "title": "Letter to Nicolas-Claude Fabri De Peiresc", "tag_0": 2, "tag_1": 3, "tag_2": 10, @@ -600,12 +1035,38 @@ "tag_5": 0, "tag_6": 0, "tag_7": 0, - "tag_8": 0 + "tag_8": 0, + "images": [ + { + "uri": "assets/data_store/43-Rubens/Rubens-P01.png", + "caption": "", + "height": 2604, + "width": 1663, + "type": "png" + }, + { + "uri": "assets/data_store/43-Rubens/Rubens-P02.png", + "caption": "", + "height": 2605, + "width": 1679, + "type": "png" + } + ], + "author": "PETER PAUL RUBENS", + "description": "<p>\nWe know, from at least a 1702 report, that before the <i>en plein air</i> fashion of painting, spies under- took their gaze not only from under the cover of a tree’s shadow but furthermore under the cover of the personalities of landscape artists. The famous Mata Hari demonstrated that artists were a class that travelled internationally and often had access to an elite military and political class—without necessarily being part of such a class. Peter Paul Rubens could be considered an early example of the double persona of spy/artist. During the seventeenth century, his discretion as a famous artist proved essential to his undercover missions to England, to negotiate in secret instead of sending the official Spanish ambassador. Sitting alone for a portrait with a painter was not a strange scenario, and yet strategically it provided a discrete cover, where sensitive information could be discussed \n</p>\n\n<p>\nin private without suspicion. There is little documentation (compared to his paintings) of this aspect of Rubens’ life—his correspondence being one of the only traces that remains. Note in this letter from 1630, his marginal sketches for the design of a tripod—seen here as a metaphor for his important conceptualization and execution of the tripartite peace negotiations between Spain, England, and Holland in 1629-30. \n</p>\n\n", + "thumbnail": { + "uri": "assets/data_store/43-Rubens/Rubens-Thumb.png", + "caption": "", + "height": 313, + "width": 200, + "type": "png" + }, + "citation": "1630<br>\nDocument, 2 pages <br>\n20.3 x 31.8 cm, 20.5 x 31.8 cm<br>\nThe Pierpont Morgan Library, New York. MA 2908. Gift of Miss Julia P. Wightman, 1971 <br>\n" }, { "__index": 43, - "id": "post_43", - "title": "POE: The Purloined Letter", + "id": "page_43", + "title": "44 Poe: Purloined Letter", "tag_0": 10, "tag_1": 11, "tag_2": 12, @@ -618,8 +1079,8 @@ }, { "__index": 44, - "id": "post_44", - "title": "LACAN: Seminar on The Purloined Letter", + "id": "page_44", + "title": "45 Lacan: Purloined Letter", "tag_0": 1, "tag_1": 4, "tag_2": 10, @@ -632,8 +1093,8 @@ }, { "__index": 45, - "id": "post_45", - "title": "MI6: Zinoviev Letter", + "id": "page_45", + "title": "46 MI6: Zinoviev Letter", "tag_0": 10, "tag_1": 12, "tag_2": 0, @@ -646,8 +1107,8 @@ }, { "__index": 46, - "id": "post_46", - "title": "UN: Vienna Convention On Diplomatic Relations", + "id": "page_46", + "title": "47 UN: Vienna Convention", "tag_0": 2, "tag_1": 4, "tag_2": 12, @@ -660,8 +1121,8 @@ }, { "__index": 47, - "id": "post_47", - "title": "Key to Wittgensteinhaus", + "id": "page_47", + "title": "48 Wittgenstein Key", "tag_0": 10, "tag_1": 12, "tag_2": 0, @@ -674,12 +1135,12 @@ }, { "__index": 48, - "id": "post_48", - "title": "STANKIEVECH: no6092: The Purloined Letter", + "id": "page_48", + "title": "49 Stankievech: Purloined Letter", "tag_0": 1, "tag_1": 8, "tag_2": 12, - "tag_3": 0, + "tag_3": 13, "tag_4": 0, "tag_5": 0, "tag_6": 0, @@ -688,8 +1149,8 @@ }, { "__index": 49, - "id": "post_49", - "title": "The Luxembourg Freeport: ", + "id": "page_49", + "title": "50 Arendt: Freeport ", "tag_0": 12, "tag_1": 0, "tag_2": 0, @@ -18,10 +18,11 @@ var tagTypes = [ "AGO", "courtauld", "intervensions", - "connosieurship", + "connsoeurship", "double agent", "forensics", "black box", + "Stankievech", ].map((type, index) => [index, type]); var app = okcms @@ -42,6 +43,8 @@ var app = okcms id: { type: "string", hidden: true }, title: { type: "string" }, author: { type: "string" }, + type: { type: "enum", options: ["image", "video", "3d"] }, + citation: { type: "text" }, description: { type: "text" }, thumbnail: { type: "image" }, images: { type: "gallery" }, @@ -74,6 +77,10 @@ var app = okcms { type: "ui", query: "*" }, ], }, + "/review": { + template: "review", + data: [{ type: "page", query: "*" }], + }, }, services: { diff --git a/load_spreadsheet.js b/load_spreadsheet.js index 347c6eb..3bada97 100644 --- a/load_spreadsheet.js +++ b/load_spreadsheet.js @@ -3,30 +3,24 @@ */ import { loadJSON, loadCSV, writeJSON } from "./file_utils.js"; +import { readdir } from "fs/promises"; +import parseRTF from "rtf-parser"; +import fs from "fs"; +import sizeOf from "image-size"; const datasheetFile = "./data_store/tags.csv"; const dbFile = "./db.json"; -var tagTypes = [ - "No6092", - "1620s", - "painting", - "blunt", - "National Gallery of Canada", - "AGO", - "courtauld", - "intervensions", - "connosieurship", - "double agent", - "forensics", - "black box", -]; +var tagTypes = "No6092,1620s,painting,blunt,National Gallery of Canada,AGO,courtauld,intervensions,connsoeurship,double agent,forensics,black box,Stankievech".split( + "," +); async function main() { // basically this script exists to assign the X'd fields from the spreadsheet // to the okcms json :) const data = await loadCSV(datasheetFile); const db = await loadJSON(dbFile); + const dataStore = await loadDataStoreIndex("./data_store"); db.page = db.page || []; db.ui = db.ui || []; @@ -39,30 +33,187 @@ async function main() { }, {}); // loop over the CSV data :) - data.forEach((row, index) => { - const cell = pageById[index] || { + let index = -1; + for (let row of data) { + index += 1; + const record = pageById[index] || { __index: index, - id: "post_" + index, + id: "page_" + index, title: row.Title, }; // loop over the tags... let tagIndex = 0; tagTypes.forEach((type, tagId) => { if (row[type] === "x") { - cell["tag_" + tagIndex] = tagId + 1; + record["tag_" + tagIndex] = tagId + 1; tagIndex += 1; } }); // make sure all other tags are cleared out for (; tagIndex < 9; tagIndex++) { - cell["tag_" + tagIndex] = 0; + record["tag_" + tagIndex] = 0; } + // if there is a corresponding record in the data store, accumulate it + if (String(index + 1) in dataStore) { + await loadFiles(dataStore[index + 1], record); + } + // if we haven't seen this ID before, append it if (!pageById[index]) { - db.page.push(cell); + db.page.push(record); } - }); + } await writeJSON(dbFile, db); } +async function loadDataStoreIndex(path) { + const files = await readdir(path); + let parts, index; + let folders = {}; + for (const file of files) { + if (file.match(".csv")) continue; + if (file.match(".DS_Store")) continue; + parts = file.split("-"); + index = parts[0].trim().replace(/^0/, ""); + folders[index] = file; + } + return folders; +} + +async function loadFiles(folder, record) { + const path = `./data_store/${folder}/`; + const files = await readdir(path); + const images = (record.images = []); + let dimensions; + for (const file of files) { + if (file.match(".DS_Store")) continue; + if (file.match(/-URL.rtf/i)) { + await loadLink(path + file, record); + } else if (file.match(/.rtf/i)) { + await loadText(path + file, record); + } else if (file.match(/.txt/i)) { + console.error("+ fix text file", path + file); + } else if (file.match(/-thumb/i)) { + dimensions = sizeOf(path + file); + record.thumbnail = { + uri: `assets/data_store/${folder}/${file}`, + caption: "", + ...dimensions, + }; + } else { + dimensions = sizeOf(path + file); + images.push({ + uri: `assets/data_store/${folder}/${file}`, + caption: "", + ...dimensions, + }); + } + } +} + +async function loadText(path, record) { + return new Promise((resolve, reject) => { + parseRTF.stream(fs.createReadStream(path), (err, doc) => { + const paragraphs = doc.content.filter((para) => para.content); + const finalParagraph = doc.content.filter((para) => !para.content); + record.citation = ""; + record.description = ""; + let groupCount = 0; + let content = ""; + record.author = ""; + record.title = ""; + paragraphs.forEach((para, paragraphIndex) => { + const paragraph = []; + para.content.forEach((clip) => { + switch (paragraphIndex) { + case 0: // number + // console.log(clip.value); + return; + case 1: // author + // console.log(clip.value); + record.author += getClipValue(clip); + return; + case 2: // title + // console.log(clip.value); + record.title += getClipValue(clip); + return; + default: + appendClip(paragraph, clip); + } + }); + if (paragraph.length) { + if (groupCount < 3) { + record.citation += paragraph.join("") + "<br>\n"; + } else { + content += "<p>\n" + paragraph.join("") + "\n</p>\n\n"; + } + } + if (!para.content.length) { + groupCount += 1; + } + }); + const finalParagraphExtract = []; + finalParagraph.forEach((clip) => { + appendClip(finalParagraphExtract, clip); + }); + if (finalParagraphExtract.length) { + content += "<p>\n" + finalParagraphExtract.join("") + "\n</p>\n\n"; + } + + record.description = content; + resolve(); + }); + }); +} + +function appendClip(paragraph, clip) { + paragraph.push(getClipValue(clip)); +} +function getClipValue(clip) { + if (clip.style.italic) { + return "<i>" + clip.value + "</i>"; + } else if (clip.style.underline) { + return "<u>" + clip.value + "</u>"; + } else { + return clip.value; + } +} + +async function loadLink(path, record) { + return new Promise((resolve, reject) => { + parseRTF.stream(fs.createReadStream(path), (err, doc) => { + const paragraphs = doc.content; + let uri; + paragraphs.forEach((para, paragraphIndex) => { + const paragraph = []; + para.content?.forEach((clip) => { + if (clip.value.match(/^http/)) { + uri = clip.value.trim(); + } + }); + if (para.value?.match(/^http/)) { + uri = para.value.trim(); + } + }); + let match = uri.match(/\d+/); + let token = ""; + if (match) { + token = match[0]; + } else { + console.error("No token:", uri); + } + record.type = "video"; + record.images = [ + { + type: "video", + caption: "", + uri, + token, + }, + ]; + resolve(); + }); + }); +} + main().then(() => process.exit(0)); diff --git a/package.json b/package.json index 34aaa90..9250acf 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@babel/preset-env": "^7.15.0", "@babel/preset-react": "^7.14.5", "@babel/runtime": "^7.15.3", + "@bacali/rtf-parser": "^1.0.1", "@u-wave/react-vimeo": "^0.9.5", "babel-eslint": "^10.1.0", "babel-loader": "^8.2.2", @@ -41,6 +42,7 @@ "eslint-plugin-import": "^2.24.0", "fontfaceobserver": "^2.1.0", "history": "^5.0.1", + "image-size": "^1.0.0", "node-fetch": "^2.6.1", "okcms": "git+ssh://git@ghghgh.us/~/okcms.git", "prop-types": "^15.7.2", @@ -52,6 +54,7 @@ "react-router-dom": "^5.2.0", "redux": "^4.1.1", "redux-thunk": "^2.3.0", + "rtf-parser": "^1.3.3", "store2": "^2.12.0", "terser-webpack-plugin": "^5.1.4", "three-spritetext": "^1.6.2", diff --git a/public/assets/css/css.css b/public/assets/css/css.css new file mode 100644 index 0000000..3d4f9e0 --- /dev/null +++ b/public/assets/css/css.css @@ -0,0 +1,19 @@ +html, +body { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + overflow: hidden; + background: black; +} +.scene-tooltip { + background: black; + color: white !important; + padding: 4px; + max-width: 250px; + text-align: center; + font-size: 18px !important; + line-height: 1.3; + font-family: serif !important; +} diff --git a/src/graph.js b/src/graph.js new file mode 100644 index 0000000..fdac979 --- /dev/null +++ b/src/graph.js @@ -0,0 +1,120 @@ +import * as THREE from "three"; +import ForceGraph3D from "3d-force-graph"; +import SpriteText from "three-spritetext"; +import { union } from "./utils/set_utils.js"; + +const IMG_SCALE = 20; + +export default function buildGraph(db, handlers) { + const linkable = {}; + const groups = {}; + const data = { nodes: [], links: [] }; + + // console.log(db); + + /** + * load nodes and links + */ + + db.page.forEach((item, index) => { + const node = { + title: item.title, + id: index, + data: item, + groups: [], + }; + data.nodes.push(node); + for (let tagIndex = 0; tagIndex < 8; tagIndex += 1) { + const group = item["tag_" + tagIndex]; + if (!group) continue; + group -= 1; + node.groups.push(group); + if (group in groups) { + groups[group].push(index); + } else { + groups[group] = [index]; + } + if (group in linkable) { + data.links.push({ + source: choice(linkable[group]), + // source: linkable[group][0], + target: index, + }); + // option: don't link to the root node more than once + // if (window.location.hash === "#dense" && linkable[group][0]) { + if (linkable[group][0]) { + linkable[group].push(index); + } else { + linkable[group] = [index]; + } + } else { + linkable[group] = [index]; + } + } + }); + + /** + * find common links + */ + + data.links.forEach((link) => { + const a = data.nodes[link.source]; + const b = data.nodes[link.target]; + + !a.links && (a.links = []); + !b.links && (b.links = []); + a.links.push(link); + b.links.push(link); + }); + + const highlightNodes = new Set(); + const highlightLinks = new Set(); + let selectedNode = null; + + /** build group */ + + let graph = ForceGraph3D(); + graph(document.querySelector("#graph")) + .graphData(data) + .showNavInfo(false) + .nodeLabel((node) => node.title) + .nodeThreeObject((node) => { + let sprite; + if (node.data.thumbnail?.uri) { + const imgTexture = new THREE.TextureLoader().load( + node.data.thumbnail.uri + ); + // console.log(imgTexture); + const aspect = node.data.thumbnail.width / node.data.thumbnail.height; + const material = new THREE.SpriteMaterial({ map: imgTexture }); + sprite = new THREE.Sprite(material); + sprite.scale.set(IMG_SCALE, IMG_SCALE / aspect); + return sprite; + } else { + sprite = new SpriteText( + node.title.split(/[ :]+/).slice(0, 3).join(" ") + ); + sprite.material.depthWrite = false; // make sprite background transparent + sprite.color = "#888888"; // colors[node.groups[0]]; // node.groups.length - 1]]; + sprite.textHeight = 4; + return sprite; + } + }) + .onNodeClick(handlers.click); + + // graph.d3Force("charge").strength(-150); + + // camera orbit + const distance = 250; + let angle = 0; + graph.cameraPosition({ + x: distance * Math.sin(angle), + z: distance * Math.cos(angle), + }); + + // stars(); +} + +const randint = (limit) => Math.floor(Math.random() * limit); +const choice = (list) => list[randint(list.length)]; +const commonGroups = (a, b) => union(a.groups, b.groups); diff --git a/src/index.js b/src/index.js index e23db17..c51ecd1 100644 --- a/src/index.js +++ b/src/index.js @@ -1,161 +1,21 @@ /** * No.6092 site for Charles Stankievech - * - load db.json - * - map the nodes to a graph - * - click the nodes to open them - * - some of the nodes are images, others are 3D */ -import ForceGraph3D from "3d-force-graph"; -import SpriteText from "three-spritetext"; -import { union } from "./utils/set_utils.js"; -import stars from "./utils/stars.js"; - -const colors = [ - "rgba(111,53,158,1.0)", - "rgba(220,188,253,1.0)", - "rgba(30,177,237,1.0)", - "rgba(148,206,88,1.0)", - "rgba(252,42,28,1.0)", - "rgba(255,253,56,1.0)", - "rgba(43,253,183,1.0)", - "rgba(252,76,252,1.0)", - "rgba(205,254,170,1.0)", - "rgba(254,205,195,1.0)", - "rgba(199,227,254,1.0)", - "rgba(253,191,45,1.0)", - "rgba(253,191,45,1.0)", -]; +import buildGraph from "./graph.js"; async function main() { const db = await loadDB(); - const groups = {}; - const linkable = {}; - const data = { nodes: [], links: [] }; - - console.log(db); - - /** - * load nodes and links - */ - - db.page.forEach((item, index) => { - const node = { - title: item.title, - id: index, - groups: [], - }; - data.nodes.push(node); - for (let tagIndex = 0; tagIndex < 8; tagIndex += 1) { - const group = item["tag_" + tagIndex]; - if (!group) continue; - group -= 1; - node.groups.push(group); - if (group in groups) { - groups[group].push(index); - } else { - groups[group] = [index]; - } - if (group in linkable) { - data.links.push({ - // source: choice(linkable[group]), - source: linkable[group][0], - target: index, - }); - // option: don't link to the root node more than once - // if (window.location.hash === "#dense" && linkable[group][0]) { - if (linkable[group][0]) { - linkable[group].push(index); - } else { - linkable[group] = [index]; - } - } else { - linkable[group] = [index]; - } - } - }); - - /** - * find common links - */ - - data.links.forEach((link) => { - const a = data.nodes[link.source]; - const b = data.nodes[link.target]; - - !a.links && (a.links = []); - !b.links && (b.links = []); - a.links.push(link); - b.links.push(link); - }); - - const highlightNodes = new Set(); - const highlightLinks = new Set(); - let selectedNode = null; - - /** build group */ - - let graph = ForceGraph3D(); - graph(document.querySelector("#graph")) - .graphData(data) - .nodeLabel((node) => node.title) - .nodeThreeObject((node) => { - const sprite = new SpriteText( - node.title.split(/[ :]+/).slice(0, 3).join(" ") - ); - sprite.material.depthWrite = false; // make sprite background transparent - sprite.color = colors[node.groups[0]]; // node.groups.length - 1]]; - sprite.textHeight = 4; - return sprite; - }) - // .nodeColor((node) => - // highlightNodes.has(node.id) - // ? node === selectedNode - // ? colors[commonGroups(selectedNode, node)[0]] - // : colors[commonGroups(selectedNode, node)[0]].replace("1.0", "0.8") - // : colors[commonGroups(selectedNode, node)[0]].replace("1.0", "0.6") - // ) - .linkWidth((link) => (highlightLinks.has(link) ? 4 : 1)) - .onNodeClick((node) => { - // no state change - if (!node && !highlightNodes.size) return; - - selectedNode = selectedNode === node ? null : node; - - highlightNodes.clear(); - highlightLinks.clear(); - if (node) { - node.groups.forEach((group) => - groups[group].forEach((neighbor) => highlightNodes.add(neighbor)) - ); - node.links.forEach((link) => highlightLinks.add(link)); - } - - updateHighlight(); - }); - - function updateHighlight() { - graph.nodeColor(graph.nodeColor()).linkWidth(graph.linkWidth()); + function handleClick(node) { + console.log(node); } - graph.d3Force("charge").strength(-150); - - // camera orbit - const distance = 250; - let angle = 0; - graph.cameraPosition({ - x: distance * Math.sin(angle), - z: distance * Math.cos(angle), + buildGraph(db, { + click: handleClick, }); - - stars(); } -const randint = (limit) => Math.floor(Math.random() * limit); -const choice = (list) => list[randint(list.length)]; -const commonGroups = (a, b) => union(a.groups, b.groups); - async function loadDB() { const request = await fetch("/assets/db.json"); return await request.json(); diff --git a/src/views/Detail.js b/src/views/Detail.js new file mode 100644 index 0000000..51598c1 --- /dev/null +++ b/src/views/Detail.js @@ -0,0 +1,31 @@ +/** + * Detail view, displaying text plus media + */ + +export default function Detail({ node }) { + const index = id + 1; + const { id, data } = node; + return ( + <div className="detail"> + <div className="content"> + <div className="title"> + {index} + <br /> + {data.author} + <br /> + {data.title} + <br /> + </div> + <div + className="caption" + dangerouslySetInnerHTML={{ __html: data.caption }} + /> + <div + className="description" + dangerouslySetInnerHTML={{ __html: data.description }} + /> + </div> + <div className="media"></div> + </div> + ); +} diff --git a/templates/_header.liquid b/templates/_header.liquid index 372299b..349ab58 100644 --- a/templates/_header.liquid +++ b/templates/_header.liquid @@ -31,6 +31,7 @@ <link rel="stylesheet" href="/assets/css/flickity.css"> <link rel="stylesheet" href="/assets/css/ionicons.css"> <link rel="stylesheet" href="/assets/css/fonts.css"> + <link rel="stylesheet" href="/assets/css/css.css"> </head> diff --git a/templates/home.liquid b/templates/home.liquid index b61dfb5..084ca6e 100644 --- a/templates/home.liquid +++ b/templates/home.liquid @@ -2,4 +2,6 @@ <div id="graph"></div> +<div id="app"></div> + {% include "_footer" %} diff --git a/templates/review.liquid b/templates/review.liquid new file mode 100644 index 0000000..acbb62f --- /dev/null +++ b/templates/review.liquid @@ -0,0 +1,15 @@ +{% include "_header" %} + +{% for p in pages %} + <div style="border: 1px solid #ddd; margin: 10px; padding: 0 10px"> + <h2>[{{forloop.index}}] {{p.title}}</h2> + <h3>{{p.author}}</h3> + <p> + <tt>{{p.citation}}</tt> + </p> + {{p.description}} + </div> +{% endfor %} + + +{% include "_footer" %} @@ -982,6 +982,14 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" +"@bacali/rtf-parser@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@bacali/rtf-parser/-/rtf-parser-1.0.1.tgz#fb3b6e3b0c3c03ed0c0de47478b472907253e009" + integrity sha512-cjz4+5HVgar4Rw0y2I3/hoa/GLsCDft9YDUD6crsA3/zkhMK3OMHhzTYs++yZf/FJFUBrLq3Mr7a0Q/7/byuWg== + dependencies: + iconv-lite "^0.6.2" + readable-stream "^3.6.0" + "@discoveryjs/json-ext@^0.5.0": version "0.5.3" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" @@ -4013,18 +4021,32 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.15, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= +image-size@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.0.tgz#58b31fe4743b1cec0a0ac26f5c914d3c5b2f0750" + integrity sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw== + dependencies: + queue "6.0.2" + import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -5917,6 +5939,13 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -6083,6 +6112,15 @@ readable-stream@^2.0.2, readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -6396,12 +6434,20 @@ rimraf@~3.0.2: dependencies: glob "^7.1.3" +rtf-parser@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rtf-parser/-/rtf-parser-1.3.3.tgz#41a10484fd3837c85c9e83d8da2b16829db6f2a9" + integrity sha512-sz2eb4tcCFtwVfs5Ei/l3JnSQGqpDv+drFuNz/zwn2tA24cL2WTuk2VMo2bA4IcRgkn38juAOri2hB9nv85u2Q== + dependencies: + iconv-lite "^0.4.15" + readable-stream "^2.2.2" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -6413,7 +6459,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -6758,6 +6804,13 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -7318,7 +7371,7 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= |
