<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <%@ page import="org.crosswire.utils.Sessions" %> <%@ page import="org.crosswire.utils.Utils" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Document" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Page" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Document.SearchFilter" %> <%@ page import="org.crosswire.community.projects.ntmss.data.ProjectManagement" %> <%@ page import="org.crosswire.community.projects.ntmss.data.ProjectManagement.Project" %> <%@ page import="org.crosswire.utils.HTTPUtils" %> <%@ page import="java.util.HashMap" %> <%@ page import="java.util.HashSet" %> <%@ page import="java.util.StringTokenizer" %> <%@ page import="java.util.Date" %> <%@ page import="java.util.Vector" %> <%@ page import="java.util.PriorityQueue" %> <%@ page import="java.text.SimpleDateFormat" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Transcription.Convert" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Transcription" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Transcription.WitnessReading" %> <%@ page import="org.crosswire.community.projects.ntmss.data.DocumentGroup" %> <%@ page import="org.crosswire.sword.keys.SWKey" %> <%@ page import="org.crosswire.sword.keys.VerseKey" %> <%@ page import="org.crosswire.sword.keys.ListKey" %> <%@ page import="org.crosswire.sword.modules.filters.SWFilter" %> <%@ page import="org.crosswire.sword.modules.filters.GreekAccents" %> <%@ page import="org.crosswire.repo.VersionedRepo" %> <%@ page import="org.json.JSONObject" %> <%@ page import="org.json.JSONArray" %> <%@ page import="org.apache.log4j.Logger" %> <% Logger logger = Logger.getLogger("transcript/get"); // who we are String userName = Sessions.getSessionStringValue(request, "userName"); // who we want to pull transcription for String targetUser=request.getParameter("userName"); String preferUser=request.getParameter("preferUser"); int stage = 1; try {stage = Integer.parseInt(request.getParameter("stage"));} catch (Exception e){} SimpleDateFormat df = new SimpleDateFormat("yyyy"); String docID=request.getParameter("docID"); String gaNum=request.getParameter("gaNum"); if (docID == null) docID=request.getParameter("docid"); String pageID=request.getParameter("pageID"); if (pageID == null) pageID=request.getParameter("pageid"); String indexContent = request.getParameter("indexContent"); if (indexContent == null) indexContent = request.getParameter("biblicalContent"); if (indexContent == null) indexContent = request.getParameter("verse"); boolean fullPage="true".equals(request.getParameter("fullPage")); boolean joinParts="true".equals(request.getParameter("joinParts")); String versionHash=request.getParameter("versionHash"); boolean history="true".equals(request.getParameter("history")); boolean allUsers="true".equals(request.getParameter("allUsers")); boolean briefTEIHeader="true".equals(request.getParameter("briefTEIHeader")); String formats[]=request.getParameterValues("format"); String format=(formats != null && formats.length > 0)?formats[formats.length-1]:null; boolean supplied = (format != null && format.indexOf("nosupplied") < 0); boolean unclear = (format != null && format.indexOf("nounclear") < 0); boolean accents = (format != null && format.indexOf("noaccents") < 0) && !"true".equals(request.getParameter("ignoreAccents")); boolean punct = (format != null && format.indexOf("nopunct") < 0); boolean hyphen = (format != null && format.indexOf("nohyphen") < 0); String bookName = null; String baseText = request.getParameter("baseText"); int documentGroupID = -2; try {documentGroupID = Integer.parseInt(request.getParameter("documentGroupID"));} catch (Exception e){} int testament = 2; String v11n = null; String transcriptionAttribution = Utils.getSysConfig(session).getProperty("TranscriptionAttributionDefault", ""); String transcriptionUsage = Utils.getSysConfig(session).getProperty("TranscriptionUsageSitewide", ""); if (!history && "PUBLISHED".equals(targetUser)) targetUser = null; if (targetUser != null) { Project p = ProjectManagement.getProject(targetUser); if (p != null) { String attribution = p.getTranscriptionAttribution(); if (attribution != null && attribution.length() > 0) transcriptionAttribution = attribution; } } String lang = ""; Document lastDoc = null; SWFilter removeAccents = new GreekAccents(); if ((docID != null || gaNum != null || documentGroupID > -2) && (pageID != null || indexContent != null)) { StringBuffer retVal = new StringBuffer(); Vector docIDs = new Vector(); if (docID != null) { StringTokenizer docIDTokens = new StringTokenizer(docID, "|"); while (docIDTokens.hasMoreTokens()) { int did = Integer.parseInt(docIDTokens.nextToken()); docIDs.add(did); } } else if (gaNum != null) { Document d = Document.getDocumentByGANumber(gaNum); if (d != null) docIDs.add(d.getDocumentID()); else { response.setContentType("text/xml"); %> <% return; } } Vector pageIDs = new Vector(); if (pageID != null && !"ALL".equals(pageID) && pageID.indexOf("-") == -1) { StringTokenizer pageIDTokens = new StringTokenizer(pageID, "|"); while (pageIDTokens.hasMoreTokens()) { int pid = Integer.parseInt(pageIDTokens.nextToken()); pageIDs.add(pid); } } // lookup pages for single doc based on biblicalContent; kindof a kludge but we need it if ((pageID != null && pageID.indexOf("-") > 0) || "ALL".equals(pageID) || (fullPage && docIDs.size() == 1 && indexContent != null)) { Document.SearchFilter searchFilter = new Document.SearchFilter(); if (indexContent != null) searchFilter.biblicalContent = indexContent; searchFilter.docID = docIDs.get(0); if (searchFilter.biblicalContent != null && searchFilter.biblicalContent.length() < 1) searchFilter.biblicalContent = null; Document docs[] = Document.searchDocuments(true, searchFilter); int minPage = -1; int maxPage = -1; if (pageID != null && pageID.indexOf("-") > 0) { try { minPage = Integer.parseInt(pageID.substring(0, pageID.indexOf("-"))); } catch (Exception e) {} try { maxPage = Integer.parseInt(pageID.substring(pageID.indexOf("-")+1)); } catch (Exception e) {} } if (docs != null && docs.length == 1) { for (Page p : docs[0].getPages()) { if (minPage > -1 && p.getPageID() < minPage) continue; if (maxPage > -1 && p.getPageID() > maxPage) continue; pageIDs.add(p.getPageID()); } } } if (documentGroupID > -2) { if (documentGroupID > -1) { DocumentGroup dg = DocumentGroup.getDocumentGroup(documentGroupID); if (dg == null) { response.setContentType("text/xml"); %> <% return; } for (Document d : dg.getDocuments()) { docIDs.add(d.getDocumentID()); } } else { // -1 is pseudo-document group for all extant witnesses for (WitnessReading wr : Transcription.getWitnessReadings(-1, indexContent, false, false, false, null)) { docIDs.add(wr.getDocumentID()); } } } for (int did : docIDs) { Document doc = Document.getDocument(did); if (doc != null) { v11n = doc.getV11n(); lastDoc = doc; lang = doc.getLanguage(); if (lang != null && lang.indexOf("g") > -1) lang = "grc"; String t = ""; if (pageID != null || fullPage) { if (!history) { for (int pid : pageIDs) { String tp = null; if (preferUser != null) tp = doc.getTranscriptionPage(pid, preferUser, versionHash); if (tp == null) tp = doc.getTranscriptionPage(pid, targetUser, versionHash); Page p = Page.getPage(doc.getDocumentID(), pid); if (p != null) { if (p.getVerses().length > 0) testament = p.getVerses()[0]/1000000000; v11n = p.getV11n(); } if (tp != null) { // if we're requesting full page, or we have more than one page, let's strip any headers // added by the editor if (fullPage || pageIDs.size() > 1) { int start = tp.indexOf(""); int end = tp.indexOf(""); if (start > -1 && end > -1) tp = tp.substring(start+6, end); } t += tp; } } if (joinParts) t = Transcription.joinParts(t); } else { response.setContentType("text/xml"); %> <% for (VersionedRepo.History h : doc.getTranscriptionPageHistory(Integer.parseInt(pageID), targetUser, allUsers)) { out.print(h.toFormattedXML()); } %> <% return; } } else { VerseKey vk = new VerseKey(); vk.setIntros(true); if (v11n != null) vk.setVersificationSystem(v11n); logger.info("v11n: " + v11n); String savedIndexContent = null; int targetVerse = 0; if ("chapter".equals(format)) { vk.setText(indexContent); savedIndexContent = indexContent; indexContent = vk.getBookName() + "." + vk.getChapter(); targetVerse = vk.getVerse(); } ListKey verses = vk.ParseVerseList(indexContent, "Mat.1.1", true); if ("chapter".equals(format)) { indexContent = savedIndexContent; } int book = ((VerseKey)verses.getElement()).getBook(); int chapter = ((VerseKey)verses.getElement()).getChapter(); String subscriptio = ""; t += "
"; if (chapter == 0) { t += "
"; } else { t += "
"; } for (verses.setPosition(VerseKey.TOP); verses.popError() == 0; verses.increment()) { VerseKey verseKey = (VerseKey)verses.getElement(); if (verseKey.getChapter() == 1 && verseKey.getVerse() == 0) { subscriptio = "
"; String vt = null; if (preferUser != null) vt = doc.getTranscriptionVerse(verseKey.getHashNumber(), preferUser, false); if (vt == null) vt = doc.getTranscriptionVerse(verseKey.getHashNumber(), targetUser, true); if ((verseKey.getVerse() == 0 || verseKey.getChapter() == 0 || verseKey.getBook() == 0) && "".equals(vt)) {} else subscriptio += vt; subscriptio += "
"; continue; } if (book != verseKey.getBook()) { t += "
"; t += subscriptio; subscriptio = ""; } if (book != verseKey.getBook() || chapter != verseKey.getChapter()) { t += "
"; } if (book != verseKey.getBook()) { book = verseKey.getBook(); t += "
"; } if (book != verseKey.getBook() || chapter != verseKey.getChapter()) { chapter = verseKey.getChapter(); if (chapter == 0) { t += "
"; } else { t += "
"; } } String vt = null; if (preferUser != null) vt = doc.getTranscriptionVerse(verseKey.getHashNumber(), preferUser, false); logger.debug("preferUser Transcription: " + vt); if (vt == null) vt = doc.getTranscriptionVerse(verseKey.getHashNumber(), targetUser, true); logger.debug("targetUser Transcription: " + vt); if (vt != null) { vt = vt.replaceAll("]*>", ""); vt = vt.replaceAll("
", ""); } if ((verseKey.getVerse() == 0 || verseKey.getChapter() == 0 || verseKey.getBook() == 0) && "".equals(vt)) {} else { if (vt != null && vt.trim().length() > 0) t += vt; } if ("chapter".equals(format)) { retVal.append("
" + verseKey.getVerse() + " " + Convert.getTEIDisplayHTML(vt, testament, v11n) + "
\n"); } } t+= "
"; t += subscriptio; subscriptio = ""; t+= "
"; } if (t == null) t = ""; if ("html".equals(format) || "htmlfragment".equals(format) || "xhtml".equals(format)) { retVal.append(t != null && t.length() > 0 ? Convert.getTEIDisplayHTML(t, testament, v11n) : ("No Transcription Available for GA: "+ doc.getGANumber() + ((pageID!=null)?(" page: "+pageID) : (" indexContent: "+indexContent)))); } else if (format != null && format.startsWith("transtext")) { retVal.append(""); if (t != null && t.length() > 0) { boolean first = true; for (WitnessReading wr : Convert.getTEITranscriptionText(t, supplied, unclear, punct, accents)) { if (!first) retVal.append("|"); retVal.append(wr.getHand() + "|" + HTTPUtils.canonize(wr.getText())); first = false; } } else { retVal.append(""); } retVal.append(""); } else if (format != null && format.startsWith("wce")) { String l = doc.getLanguage(); if (l.indexOf("g") > -1) l = "grc"; JSONObject o = new JSONObject(); JSONArray witnesses = new JSONArray(); StringBuffer allABs = new StringBuffer(t); t = Transcription.popElement(allABs, "ab"); if (t == null) t = allABs.toString(); boolean multiInstance = false; while (t != null) { String nextT = Transcription.popElement(allABs, "ab"); if (nextT != null) multiInstance = true; if (t != null && t.length() > 0) { o = new JSONObject(); witnesses = new JSONArray(); o.put("_model", "verse"); o.put("tei", t); o.put("transcription_id", Integer.toString(doc.getDocumentID())); o.put("language", l); String siglum = doc.getGANumber(); if (multiInstance) siglum += ("+" + Transcription.getAttribute(t, "id")); o.put("siglum", siglum); PriorityQueue wits = new PriorityQueue(); for (WitnessReading wr : Convert.getTEIWCEText(t, true, true, true, accents)) { // TODO: why are we doing this? wr.setDocumentName(lastDoc.getGANumber()); wr.setDocumentName(siglum); wr.setDocumentID(lastDoc.getDocumentID()); JSONObject w = new JSONObject(); JSONArray tokens = new JSONArray(); int index = 2; // {om} means we want-- tokens : [] if (!"{lac}".equals(wr.getText()) && (!"{om}".equals(wr.getText()))) { String gapDetails = null; JSONObject lastToken = null; for (String tokenText : wr.getTokens()) { if (tokenText.startsWith("{gap")) { int end = tokenText.indexOf('}'); String tag = tokenText.substring(0, end); String extent = Transcription.getAttribute(tag, "extent"); String unit = Transcription.getAttribute(tag, "unit"); String reason = Transcription.getAttribute(tag, "reason"); // if we're entirely a gap if (end == (tokenText.length()-1)) { String gDetails = (reason == null|| reason.trim().length() == 0)?"gap":reason; gDetails += (extent == null || extent.trim().length() == 0)?"":(" " + extent); gDetails += (unit == null || unit.trim().length() == 0)?"":(" " + unit); // are we first? save our gap details for first available token if (lastToken == null) { gapDetails = gDetails; continue; } else { lastToken.put("gap_after", true); lastToken.put("gap_details", gDetails); } } if ("char".equals(unit)) { tokenText = "["+extent+"]"+tokenText.substring(end+1); } } JSONObject token = new JSONObject(); token.put("index", Integer.toString(index)); if (gapDetails != null) { token.put("gap_before", true); token.put("gap_before_details", gapDetails); gapDetails = null; } if (tokenText.startsWith("|ns")) { tokenText = tokenText.substring(3); tokenText = tokenText.replace("\u0305", ""); token.put("nomSac", true); } if (tokenText.indexOf("_") > -1) token.put("unclear", true); if ((tokenText.indexOf("[") > -1) || (tokenText.indexOf("]") > -1)) token.put("supplied", true); if (tokenText.length() > 0 && ":;,·.\u0302\u0304\u0305\u0307\u0308\u1dcd\u2014\u2027\u2cff\ufe24\ufe25".indexOf(tokenText.charAt(tokenText.length()-1)) > 0) { token.put("pc_after", "" + tokenText.charAt(tokenText.length()-1)); tokenText = tokenText.substring(0, tokenText.length()-1); } token.put("siglum", siglum); token.put("verse", indexContent); // remove []_ from our token for collation String unaccented = tokenText; if (!accents) { StringBuffer trans = new StringBuffer(unaccented); removeAccents.processText(trans, null, null); unaccented = trans.toString(); } String cleanedToken = unaccented.replaceAll("[\\[\\]_]", ""); token.put("t", cleanedToken); JSONArray ruleMatch = new JSONArray(); ruleMatch.put(unaccented); token.put("rule_match", ruleMatch); token.put("reading", wr.getLabel()); token.put("original", unaccented); tokens.put(token); lastToken = token; index += 2; } } w.put("tokens", tokens); w.put("id", wr.getLabel()); // {lac} means we want-- nothing for the entire witness // here no witnesses, and below if !witnesses.length, no output if (!"{lac}".equals(wr.getText())) witnesses.put(w); } } o.put("witnesses", witnesses); o.put("context", indexContent); o.put("transcription_siglum", doc.getGANumber()); o.put("_id", Integer.toString(doc.getDocumentID())); o.put("document_id", Integer.toString(doc.getDocumentID())); // if we have no witnesses then we are completely {lac} // and should not output anything if (witnesses.length() > 0) { if (retVal.length() > 0) retVal.append(", "); retVal.append(o.toString()); } t = nextT; } } else if ("plaintext".equals(format)) { if (t != null && t.length() > 0) { retVal.append(Convert.getTEIPlainText(t)); } else { retVal.append("No Transcription Available for GA: "+ doc.getGANumber() + ((pageID!=null)?(" page: "+pageID) : (" indexContent: "+indexContent))); } } // TEI and wce else if (!"chapter".equals(format)) { if (t.length() > 5) { retVal.append(t); } else { retVal.append(""); } } } else { retVal.append(""); } } if (baseText != null) { String t = loadModuleReading(baseText, indexContent).getText(); String l = "grc"; retVal.append(""); retVal.append("|" + HTTPUtils.canonize(t)); retVal.append(""); } if (retVal.toString().startsWith(" <% } else { response.setContentType("text/plain"); } %> <% if (!"htmlfragment".equals(format)) { %> <% } %>
dir="rtl" <% } %> > <%= retVal %>


<%=transcriptionAttribution%>
<%=transcriptionUsage%>
<% if (!"htmlfragment".equals(format)) { %> <% } } else if ("chapter".equals(format)) { response.setContentType("text/plain"); VerseKey vk = new VerseKey(); vk.setIntros(true); if (v11n != null) vk.setVersificationSystem(v11n); vk.setText(indexContent); out.print(vk.getShortText()+"%%%"); out.print(retVal); } else if (format != null && format.startsWith("wce")) { response.setContentType("application/json"); out.print("["); out.print(retVal); out.print("]"); } else if (format != null && format.startsWith("transtext")) { response.setContentType("text/xml"); String vtext = ""; if (indexContent != null) { VerseKey vk = new VerseKey(); vk.setIntros(true); if (v11n != null) vk.setVersificationSystem(v11n); vk.setText(indexContent); vtext = " indexContent=\""+vk.getBKVText()+"\""; } %><%=baseText!=null?" baseText=\""+baseText+"\"":""%>><%= retVal %><% } else if ("plaintext".equals(format)) { response.setContentType("text/plain"); %><%= retVal %><% } else { response.setContentType("text/xml"); boolean headerPresent = (retVal.indexOf(" -1); // if (briefTEIHeader && headerPresent) { // always get rid of header if (headerPresent) { int endHeaderOffset = retVal.indexOf(""); if (endHeaderOffset > -1) retVal = new StringBuffer(retVal.substring(endHeaderOffset+6)); endHeaderOffset = retVal.lastIndexOf(""); if (endHeaderOffset > -1) retVal = new StringBuffer(retVal.substring(0, endHeaderOffset)); headerPresent = false; } if (!retVal.toString().trim().startsWith(" <% if (!"teiraw".equals(format)) { %> <% } if (!headerPresent) { Vector wits= new Vector(); for (WitnessReading wr : Convert.getTEITranscriptionText(retVal.toString(), true, true, true, true)) { wr.setDocumentName(lastDoc.getGANumber()); wr.setDocumentID(lastDoc.getDocumentID()); wits.add(wr.getHand()); } %> <% if (!briefTEIHeader) { %> <%=lastDoc.getGANumber()%> The Institut für neutestamentliche Textforschung

<%=transcriptionAttribution%>

<%=transcriptionUsage%>

<% for (Document.ShelfInstance si : lastDoc.getShelfInstances()) { %> <%=si.getInstitutionCountry()%> <%=si.getInstitutionPlace()%> <%=si.getInstitutionName()%> <%=si.getShelfNumber()%> <% } String l = lastDoc.getLanguage(); if ("g".equals(l)) l = "grc"; %>
<% PriorityQueue wits2 = new PriorityQueue(wits); while (!wits2.isEmpty()) { String w = wits2.poll(); if ("firsthand".equals(w) || w.length() < 1) continue; %> <% } %>
<% } %> > <% } %> <% } %> <%= retVal %> <% if (!retVal.toString().trim().startsWith("
<% } } } } else { %>

transcript/get

Retrieve transcription of a manuscript

Parameters

docIDmanuscript id for which to retrieve a transcript. Can include multiple docIDs separated by a pipe, e.g., 10006 or 20001|20003 for both
pageIDmanscript page id for which to retrieve a transcript. Can include multiple pageIDs separated by a pipe, ALL for all, or a range, e.g., 10, 10|20, 1-99999
indexContentindexContent (osisRef) for which to retrieve a transcript, e.g., Matt.1.1, Matt.1, Matt, Matt-John
ignoreAccentstrue|(false) Apply a general regularization to witnesses, ignoring Greek accent marks
formatone of (tei), teiraw, htmlfragment, html[_nohyphen], plaintext, transtext[_nounclear][_nosupplied][_nopunct][_noaccents], wce, chapter
userName(default: "PUBLISHED") retrieve a user's staged transcription
preferUserdifferent from userName in that if preferUser doesn't have a transcription, then the PUBLISHED transcription will still be returned
versionHashretrieve a previous version of the transcription
historyif set to true, retrieve version history for the object, instead of the actual object
allUsersused with 'history'. if set to true, retrieve also latest versions for all users
documentGroupIDlist of witnesses which are members of a document group (-1 : all extant)
baseTextBase text module name to include in the transcription list, e.g., NA28
fullPage<true|(false)> if retrieving by biblicalContent, whether or not to return full pages
joinParts<true|(false)> if retrieving TEI and part="I" and part="F" exist unnecessarily, join them.
briefTEIHeader<true|(false)> if retrieving TEI, don't include full details in the header.
splitPunct<true|(false)> if retrieving WCE, split punctuation as separate words
stage<(1 - initial); 2 - submitted; 3 - reconciled; 4 - published
<% } %> <%! static HashMap specialFonts = new HashMap(); static HashSet rightJustify = new HashSet(); static { specialFonts.put("bo", "Antinoou, AntinoouWeb"); specialFonts.put("sa", "Antinoou, AntinoouWeb"); specialFonts.put("fa", "Antinoou, AntinoouWeb"); specialFonts.put("mae", "Antinoou, AntinoouWeb"); specialFonts.put("ly", "Antinoou, AntinoouWeb"); specialFonts.put("cw", "Antinoou, AntinoouWeb"); specialFonts.put("syc", "Estrangelo Edessa, EstreWeb"); specialFonts.put("chu", "BukyvedeWeb"); rightJustify.add("syc"); rightJustify.add("he"); rightJustify.add("arb"); } public static WitnessReading loadModuleReading(String moduleName, String key) { String moduleServiceURL = "http://crosswire.org/study/fetchdata.jsp"; String params = "mod="+moduleName + "&key="+java.net.URLEncoder.encode(key) + "&format=strip"; StringBuffer result = HTTPUtils.postURL(moduleServiceURL, params); WitnessReading retVal = new WitnessReading("", result.toString()); retVal.setDocumentName(moduleName); return retVal; } %>